Compare commits

...

108 Commits

Author SHA1 Message Date
Wayne Warthen
cd161067db Update CF Card Detection
In the IDE and PPIDE drivers, a CF Card is differentiated from a Hard Disk using the first word of the result of the IDENTIFY DEVICE command.  The value 0x045A was recently added because it was seen from a CF<->SD Card adapter.  However, the value has now been seen from a spinning hard disk.  Since the value is ambiguous and not defined in the CF Card specs, I am removing it from the list of CF Card signatures.

Credit to Mark Elkin for identifying this and helping me track it down.
2023-01-21 14:56:12 -08:00
Wayne Warthen
4d9c93734f Support Serial Keyboard with Video Displays
Added configuration setting VDAEMU_SERKBD which can be used to specify any serial unit # to be used as the keyboard for the video terminal.  Default value is $FF which means to use the default hardware keyboard.  All other values mean that terminal input is to come from corresponding serial unit #.

Also a couple more tweaks to the p-System boot volume.
2023-01-18 14:29:19 -08:00
Wayne Warthen
71a8b2b177 Finalize p-System Implementation
- Implemented Extended BIOS functions
- p-System slices moved into partition
2023-01-16 15:41:21 -08:00
Wayne Warthen
979e763739 Introducing p-System IV.0 for RomWBW
A full implementation of UCSD p-System IV.0 for RomWBW.  Derived from the official Z80 Adaptable p-System.

My first real programming was on this system.  So many memories...
2023-01-13 16:58:52 -08:00
Wayne Warthen
16475fe408 Audio Driver Cleanup
Resolved some consistency issues between the AY-3-8910 and SN76489 audio drivers.
2023-01-09 16:08:42 -08:00
Wayne Warthen
d2e1e5be4b Enable WAIT Signal for 9958 Video
Credit to Alan Cox.  This seems to allow a 9958 video chip to run with a Z180 without added wait states.
2023-01-08 18:41:49 -08:00
Wayne Warthen
2271c086b5 Minor IDE/CF/SD Disk Handling Updates
As suggested by Laszlo Szolnoki, I have added an additional CF Card signature to the IDE and PPIDE drivers.  He also pointed out a deficiency in the disk size printing which has been addressed.
2023-01-04 16:24:31 -08:00
Wayne Warthen
2b4631195a Misc Updates Based on Input from Eluan Miranda
I got a very nice email from Eluan Miranda.  He pointed out a few inconsistencies in the video and audio driver configurations.  I made a few adjustments to clean things up.
2023-01-01 15:26:42 -08:00
Wayne Warthen
d5f0699fc3 Regen Docs and Bump Version 2023-01-01 11:06:39 -08:00
Wayne Warthen
5c84fc6213 Merge pull request #313 from b1ackmai1er/dev
Change romldr to accept a baud rate
2023-01-01 11:02:10 -08:00
b1ackmai1er
d9f11b9f5e ym2612 minors 2022-12-31 21:30:01 +08:00
b1ackmai1er
bb2a68e066 Update romldr.asm 2022-12-31 11:22:34 +08:00
b1ackmai1er
cd426ba6ca Update GettingStarted.md 2022-12-31 10:43:29 +08:00
b1ackmai1er
491bbb68a6 Update romldr.asm 2022-12-31 01:00:06 +08:00
b1ackmai1er
b3bf3e27ee Update romldr.asm 2022-12-30 20:08:28 +08:00
b1ackmai1er
523ce60093 Update GettingStarted.md 2022-12-30 16:38:43 +08:00
b1ackmai1er
3f00cfbfb8 Merge pull request #31 from wwarthen/dev
Dev
2022-12-30 05:08:01 +08:00
Wayne Warthen
2dd9edd8ca Regenerate Docs and Bump Version 2022-12-29 10:14:02 -08:00
Wayne Warthen
6145383a65 Make VGM Names Lowercase (part 2) 2022-12-29 10:07:02 -08:00
Wayne Warthen
c0721a3f85 Make VGM Names Lowercase (part 1) 2022-12-29 10:05:58 -08:00
Wayne Warthen
c10497bd03 Merge pull request #312 from b1ackmai1er/dev
ym2612 driver updates
2022-12-29 09:15:09 -08:00
b1ackmai1er
5b1542e49b Update ym2612.asm 2022-12-29 18:57:50 +08:00
b1ackmai1er
96269a7f45 Update ym2612.asm 2022-12-21 22:53:47 +08:00
b1ackmai1er
bd03277bfe Update ym2612.asm 2022-12-21 05:31:38 +08:00
b1ackmai1er
c072027b87 Preserve registers 2022-12-20 17:19:12 +08:00
b1ackmai1er
e409391f14 Update Scales.asm 2022-12-19 21:54:17 +08:00
b1ackmai1er
030228e9b8 Update ym2612.asm 2022-12-18 22:44:05 +08:00
b1ackmai1er
d584d3d553 rename fm demo program 2022-12-18 21:03:10 +08:00
b1ackmai1er
2049b35ee2 Update ym2612.asm 2022-12-18 20:56:12 +08:00
b1ackmai1er
285bc6611f Update Scales.asm 2022-12-18 20:44:55 +08:00
b1ackmai1er
be8177b8a4 ym26112 driver 2022-12-18 20:41:29 +08:00
Wayne Warthen
9c80db786e Merge pull request #311 from b1ackmai1er/dev
Some vgmplayer updates
2022-12-16 19:29:43 -08:00
b1ackmai1er
d062b4345d Update YM2612.ASM
Tidy up
2022-12-16 22:31:25 +08:00
b1ackmai1er
03bf1527cc Adjust to fit on disk images 2022-12-15 22:02:58 +08:00
b1ackmai1er
38318262e9 reset defaults 2022-12-15 21:36:45 +08:00
b1ackmai1er
eefad65904 Remove tunes
They get copied over in build process. I think this is the right behaviour ?
2022-12-15 21:31:02 +08:00
b1ackmai1er
4d6a922402 Merge pull request #30 from wwarthen/dev
Dev
2022-12-15 21:26:46 +08:00
b1ackmai1er
e32d6e2d5d vgmplay updates
Still not in a terrific state but better
2022-12-15 21:25:56 +08:00
Wayne Warthen
9ea462ef7a Fix ZDE Default Config
Re-enable use of control-K to access menus.
2022-12-14 17:05:35 -08:00
Wayne Warthen
1681e159bd CP/NET update from Douglas Miller
Minor rev, but includes a fix for CPNBOOT.
2022-12-14 15:55:11 -08:00
Wayne Warthen
3b8973fa12 ZDE Updates from Lars Nelson
Lars has corrected some time stamp deficiencies in ZDE 1.6.  It is now v1.8.
2022-12-12 15:27:28 -08:00
b1ackmai1er
ef1989f600 vgm ym2612 updates 2022-12-12 21:41:18 +08:00
b1ackmai1er
023e54a9a8 Merge pull request #29 from wwarthen/dev
User Defined SD Interface
2022-12-12 17:13:16 +08:00
Wayne Warthen
73b0a3d941 User Defined SD Interface
Integrated code from Lanea to allow for an easy way to define a custom SD Card interface.  CSMODE_USR is not yet complete or tested!
2022-12-10 16:58:37 -08:00
b1ackmai1er
f86019a628 Merge pull request #28 from wwarthen/dev
Dev
2022-12-09 20:19:44 +08:00
Wayne Warthen
1839120e9d Update commit.yml 2022-12-06 15:03:01 -08:00
Wayne Warthen
8e110221a3 Update commit.yml 2022-12-06 13:51:45 -08:00
Wayne Warthen
8df7712633 Update commit.yml 2022-12-06 13:39:22 -08:00
b1ackmai1er
149ffb899b Merge pull request #27 from wwarthen/dev
Dev
2022-12-07 05:30:20 +08:00
Wayne Warthen
4f60cd4e57 Update commit.yml 2022-12-06 12:44:11 -08:00
Wayne Warthen
e83e26b6db Merge pull request #310 from b1ackmai1er/dev
ym2612 stub and minors
2022-12-06 11:49:29 -08:00
b1ackmai1er
4cd533117f ym2612 updates 2022-12-06 20:18:19 +08:00
b1ackmai1er
20cab617c7 Update SBC_std.asm 2022-12-06 13:40:36 +08:00
b1ackmai1er
323cfec931 Update hbios.asm 2022-12-06 13:38:11 +08:00
b1ackmai1er
ced09b2b95 Update ctc.asm 2022-12-06 13:15:29 +08:00
b1ackmai1er
93f8c67f9f Missing part 2022-12-03 07:10:51 +08:00
b1ackmai1er
999849c62b Alternate debug standardization method 2022-12-02 21:36:36 +08:00
b1ackmai1er
4babc51588 minors 2022-12-01 20:28:35 +08:00
b1ackmai1er
44ccc167ff Revert debug 2022-12-01 20:24:24 +08:00
b1ackmai1er
eae8295811 revert debug 2022-12-01 20:12:41 +08:00
b1ackmai1er
c76cb6737e revert debug_drv 2022-12-01 19:47:03 +08:00
b1ackmai1er
af723c5370 Update ym2612.asm 2022-11-26 21:40:22 +08:00
b1ackmai1er
57e4ed476c ym2612 fixups 2022-11-26 20:57:21 +08:00
b1ackmai1er
167c10fafc ctc debug updated 2022-11-26 19:43:40 +08:00
b1ackmai1er
6d1a9f5b7c Driver debug standardization 2022-11-26 16:03:09 +08:00
b1ackmai1er
bd0bb94c52 fixup incorrect commit 2022-11-26 14:34:24 +08:00
b1ackmai1er
e1a833b1a8 fixup incorrect commit 2022-11-26 14:32:33 +08:00
b1ackmai1er
7bd6df1e99 ym2612 config changes 2022-11-26 14:27:47 +08:00
b1ackmai1er
d3fcf8cea2 Update dsky.asm 2022-11-26 14:07:51 +08:00
b1ackmai1er
c7eb82e4dd Update hbios.asm 2022-11-26 14:04:45 +08:00
b1ackmai1er
20d07ded7b minor 2022-11-26 13:57:53 +08:00
b1ackmai1er
fc57ca4a68 ym2612 stub and hbios driver loading code cosmetics 2022-11-26 13:26:04 +08:00
b1ackmai1er
444c57fdfb Update ctc.asm 2022-11-12 22:13:46 +08:00
b1ackmai1er
ca61f340db Merge pull request #25 from wwarthen/dev
Dev
2022-11-09 17:32:56 +08:00
Wayne Warthen
601ac66762 Update commit.yml
Add also github-slug-action.
2022-11-08 16:29:11 -08:00
Wayne Warthen
c204110a6f Update commit.yml
Also explicit version for actions/upload-artifact.
2022-11-08 16:25:16 -08:00
Wayne Warthen
e8d0eedc2b Update commit.yml
Need to use explicit version for actions/checkout apparently.
2022-11-08 16:22:49 -08:00
Wayne Warthen
7b55b8ba86 Update commit.yml
Use "latest" version of all actions.
2022-11-08 16:16:19 -08:00
Wayne Warthen
069aa2b5be Merge pull request #306 from b1ackmai1er/dev
SYSCHK changes
2022-11-08 15:40:13 -08:00
b1ackmai1er
eeff03c7aa diag led fixups 2022-11-08 02:35:55 +08:00
b1ackmai1er
791fcea466 Different diag progress bar options 2022-11-07 20:56:09 +08:00
b1ackmai1er
f56c9007bb Update simrtc.asm 2022-11-07 17:32:04 +08:00
b1ackmai1er
360ba5ca95 Update Architecture.md 2022-11-06 20:25:49 +08:00
b1ackmai1er
7adf2038f1 Update hbios.asm 2022-11-06 20:21:53 +08:00
b1ackmai1er
a77744d8e6 Move diaglvl to config files 2022-11-06 19:57:02 +08:00
b1ackmai1er
dd47283fda minors 2022-11-06 18:24:32 +08:00
b1ackmai1er
5cc85e0444 Update Architecture.md
To reflect changes to syschk routine
2022-11-06 17:44:26 +08:00
b1ackmai1er
6e51070590 SYSCHK driver syncing 2022-11-06 11:18:05 +08:00
b1ackmai1er
a7853fe6d0 SYSCHK driver syncing 2022-11-06 11:12:14 +08:00
b1ackmai1er
590dcd0b4f SYSCHK driver syncing 2022-11-06 10:46:46 +08:00
b1ackmai1er
e25107309b SYSCHK changes
Display the error code of syschk enabled
2022-11-06 10:17:28 +08:00
b1ackmai1er
def29c7668 Merge pull request #24 from wwarthen/dev
Dev
2022-11-06 07:54:25 +08:00
Wayne Warthen
0c92c69ed8 Regenerate Documentation
Regenerated documentation to pick up Phil's updates.
2022-11-05 16:47:11 -07:00
Wayne Warthen
54ce18bb75 Merge pull request #305 from b1ackmai1er/dev
Notes about flash file system
2022-11-05 16:41:32 -07:00
b1ackmai1er
0ebde397fa Description of DIAG options 2022-11-05 21:45:33 +08:00
b1ackmai1er
8bf93619a0 Update Architecture.md
Errors and diagnostics - is this something you would be interested in including and expanding on?
2022-11-05 09:11:37 +08:00
b1ackmai1er
2727c02c56 Merge pull request #23 from wwarthen/dev
Merge pull request #304 from b1ackmai1er/dev
2022-11-05 08:08:58 +08:00
b1ackmai1er
d6ac15df40 Notes about flash file system 2022-11-05 08:04:38 +08:00
Wayne Warthen
c2a6c7fa22 Merge pull request #304 from b1ackmai1er/dev
Minors
2022-11-04 16:45:27 -07:00
b1ackmai1er
a742e5016e Attempt fix overlapping header 2022-11-05 07:42:05 +08:00
b1ackmai1er
248ef0e1b4 forth doc updates 2022-11-05 07:27:08 +08:00
b1ackmai1er
19101fda39 Minors 2022-11-05 07:17:31 +08:00
b1ackmai1er
9d1cfd4a22 Merge pull request #22 from wwarthen/dev
Sync DOS65
2022-11-02 22:19:22 +08:00
Wayne Warthen
cb20784685 Sync DOS65
- Update DOS65 disk image with latest binaries from Dan Werner
2022-09-13 19:36:45 -07:00
b1ackmai1er
66d524c096 Merge pull request #21 from wwarthen/dev
Dev
2022-07-27 17:20:26 +08:00
b1ackmai1er
b2b070232d Merge pull request #20 from wwarthen/dev
Minor Tweaks to Build Process
2022-07-14 08:21:32 +08:00
b1ackmai1er
d40c6be60d Merge pull request #19 from wwarthen/dev
Dev
2022-07-11 20:59:47 +08:00
b1ackmai1er
d9a3a5086c Merge pull request #18 from wwarthen/dev
Dev
2022-07-04 19:39:16 +08:00
138 changed files with 5668 additions and 1008 deletions

View File

@@ -14,9 +14,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: rlespinasse/github-slug-action@v3.x
- uses: rlespinasse/github-slug-action@v4.4.0
- uses: actions/checkout@v2
- uses: actions/checkout@v3.1.0
- name: Build
run: |
@@ -33,7 +33,7 @@ jobs:
find -type f -exec md5sum '{}' \;
- name: Upload Artifact
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3.1.1
with:
name: RomWBW_Linux-${{env.GITHUB_REF_SLUG}}-${{env.GITHUB_SHA_SHORT}}
path: .
@@ -43,7 +43,7 @@ jobs:
zip -r RomWBW-SnapShot-Package.zip .
- name: Post SnapShot
uses: "marvinpinto/action-automatic-releases@latest"
uses: wwarthen/actions/packages/automatic-releases@built-packages
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "SnapShot"
@@ -53,10 +53,10 @@ jobs:
RomWBW-SnapShot-Package.zip
buildMacOS:
runs-on: macos-latest
runs-on: macOS-12
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3.1.0
- name: Build
run: |
@@ -72,7 +72,7 @@ jobs:
find . -type f -exec md5 -r -- '{}' +;
- name: Upload Artifact
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3.1.1
with:
name: RomWBW_MacOS
path: .

View File

@@ -7,4 +7,4 @@
***********************************************************************
This directory contains some sample ProTracker and MYM sound
files that can be played by the TUNE application.
files that can be played by the TUNE or VGMPLAY application.

View File

@@ -75,8 +75,8 @@ The VDU video board requires a dedicated onboard ROM containing the
font data. The "vdu.rom" file contains the binary data to program
onto that chip.
Disk Images (fd_*.img, hd_*.img)
------------------------------
Disk Images (fd_*.img, hd_*.img, psys.img)
------------------------------------------
RomWBW includes a mechanism for generating floppy disk and hard disk
binary images that are ready to copy directly to a floppy, hard disk,
@@ -96,16 +96,18 @@ RawWriteWin (as long as you have access to a floppy drive on your
Windows computer). The resulting floppy disks will be usable on any
RomWBW-based system with floppy drive(s).
Likewise, the hd_*.img files are hard disk images. Each file is
intended to be copied to the start of any type of hard disk media
(typically a CF Card or SD Card). The resulting media will be usable
on any RomWBW-based system that accepts the corresponding media type.
Likewise, the hd512_*.img and hd1024_*.img files are hard disk images.
Each file is intended to be copied to the start of any type of hard
disk media (typically a CF Card or SD Card). The resulting media will
be usable on any RomWBW-based system that accepts the corresponding
media type.
WARNING: The hdnew_*.img disk images are part of a new disk
format that is a work in progress. Do not use these disk
images without knowing exactly what you are doing! The
hd_*.img disk images continue to be the images you should
be using under normal circumstances.
NOTE: The hd512_*.img files are equivalent to the hd_*.img
files in previous distributions. The hd1024_*.img files
contained a revised file system format that increases the
maximum number of CP/M directory entries from 512 to 1024.
Refer to the ReadMe.txt in the Source/Images directory
for details.
Documentation of the pre-built disk images is contained in the
DiskList.txt file in this directory.
@@ -115,6 +117,12 @@ the BuildImages.cmd script in the Source directory. Additional
information on how to generate custom disk images is found in the
Source\Images ReadMe.txt file.
The psys.img file contains a full implementation of the UCSD p-System
for the Z80 running under RomWBW. This image file must be placed on
disk media by itself (not appended or concatenated with hd*.img files.
Refer to the Source/pSys/ReadMe.txt file for more information on the
p-System implementation.
Propeller ROM Images (*.eeprom)
-------------------------------

View File

@@ -64,6 +64,10 @@ Version 3.1.1
- WBW: Add support for "romless" booting
- L?N: Fixes for ZCPR-D&J (buffer overflow, default drive/user)
- J?P: Add support for DS1501 RTC
- LLS: Added a user defined mode for SD Card interfaces (not complete)
- L?N: Updated ZDE to v1.8 including time stamp preservation fixes
- D?M: Minor update to CP/NET client files, fix to CPNBOOT
- WBW: Added p-System IV.0 Z80 implementation
Version 3.1
-----------

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
Doc/qcp27.pdf Normal file

Binary file not shown.

BIN
Doc/qdos27.pdf Normal file

Binary file not shown.

BIN
Doc/qpm27.pdf Normal file

Binary file not shown.

409
ReadMe.md
View File

@@ -3,23 +3,23 @@
## Z80/Z180 System Software
Version 3.1 Pre-release
09 Jul 2022
15 Jan 2023
Wayne Warthen <wwarthen@gmail.com>
### Download
- [RomWBW Distribution
Package](https://github.com/wwarthen/RomWBW/releases)
- [RomWBW Distribution
Package](https://github.com/wwarthen/RomWBW/releases)
### Related Pages
- [RomWBW Architecture
Document](https://www.retrobrewcomputers.org/lib/exe/fetch.php?media=software:firmwareos:romwbw:romwbw_architecture.pdf)
- [RomWBW
Applications](https://www.retrobrewcomputers.org/doku.php?id=software:firmwareos:romwbw:apps)
- [RomWBW
Errata](https://www.retrobrewcomputers.org/doku.php?id=software:firmwareos:romwbw:errata)
- [RomWBW Architecture
Document](https://www.retrobrewcomputers.org/lib/exe/fetch.php?media=software:firmwareos:romwbw:romwbw_architecture.pdf)
- [RomWBW
Applications](https://www.retrobrewcomputers.org/doku.php?id=software:firmwareos:romwbw:apps)
- [RomWBW
Errata](https://www.retrobrewcomputers.org/doku.php?id=software:firmwareos:romwbw:errata)
# Overview
@@ -27,28 +27,28 @@ RomWBW provides a complete software system for a wide variety of
hobbyist Z80/Z180 CPU-based systems produced by these developer
communities:
- [RetroBrew Computers](https://www.retrobrewcomputers.org)
- [RC2014](https://rc2014.co.uk)
- [retro-comp](https://groups.google.com/forum/#!forum/retro-comp)
- [RetroBrew Computers](https://www.retrobrewcomputers.org)
- [RC2014](https://rc2014.co.uk)
- [retro-comp](https://groups.google.com/forum/#!forum/retro-comp)
General features include:
- Banked memory services for several banking designs
- Disk drivers for RAM, ROM, Floppy, IDE, CF, and SD
- Serial drivers including UART (16550-like), ASCI, ACIA, SIO
- Video drivers including TMS9918, SY6545, MOS8563, HD6445
- Real time clock drivers including DS1302, BQ4845
- Multiple OS support including CP/M 2.2, ZSDOS, CP/M 3, ZPM3
- Built-in VT-100 terminal emulation support
- Banked memory services for several banking designs
- Disk drivers for RAM, ROM, Floppy, IDE, CF, and SD
- Serial drivers including UART (16550-like), ASCI, ACIA, SIO
- Video drivers including TMS9918, SY6545, MOS8563, HD6445
- Real time clock drivers including DS1302, BQ4845
- Multiple OS support including CP/M 2.2, ZSDOS, CP/M 3, ZPM3
- Built-in VT-100 terminal emulation support
RomWBW is distributed as both source code and pre-built ROM and disk
images. Some of the provided software can be launched directly from the
ROM firmware itself:
- System Monitor
- Operating Systems (CP/M 2.2, ZSDOS)
- ROM BASIC (Nascom BASIC and Tasty BASIC)
- ROM Forth
- System Monitor
- Operating Systems (CP/M 2.2, ZSDOS)
- ROM BASIC (Nascom BASIC and Tasty BASIC)
- ROM Forth
A dynamic disk drive letter assignment mechanism allows mapping
operating system drive letters to any available disk media.
@@ -209,10 +209,10 @@ modular approach to implementing device drivers and presenting devices
to the operating system. In general, all devices are classified as one
of the following:
- Disk (Hard Disk, CF Card, SD Card, RAM/ROM Disk, etc.)
- Character (Serial Ports, Parallel Ports, etc.)
- Video (Video Display/Keyboard Interfaces)
- RTC/NVRAM (Real Time Clock, Non-volatile RAM)
- Disk (Hard Disk, CF Card, SD Card, RAM/ROM Disk, etc.)
- Character (Serial Ports, Parallel Ports, etc.)
- Video (Video Display/Keyboard Interfaces)
- RTC/NVRAM (Real Time Clock, Non-volatile RAM)
HBIOS uses the concept of unit numbers to present a complex set of
hardware devices to the operating system. As an example, a typical
@@ -270,26 +270,20 @@ VDU type devices or serial devices. If you want to change which device
is the console, the ***I*** menu option can be used to choose the unit
and its speed.
The command format is `I <u> [<c>]`
The command format is `I <u> [<b>]`
where ***u*** is unit to select and ***c*** is the optional baud rate
code as listed below.
where ***u*** is unit to select and ***b*** is the optional baud rate.
Code | Rate | Code | Rate | Code | Rate | Code | Rate |
------|----------|------|----------|------|----------|------|----------|
0 | 75 | 8 | 1800 | 16 | 28880 | 24 | 460800 |
1 | 150 | 9 | 2400 | 17 | 38400 | 25 | 614400 |
2 | 225 | 10 | 3600 | 18 | 57600 | 26 | 921600 |
3 | 300 | 11 | 4800 | 19 | 76800 | 27 | 1228822 |
4 | 450 | 12 | 7200 | 20 | 115200 | 28 | 1843200 |
5 | 600 | 13 | 9600 | 21 | 153600 | 29 | 2457600 |
6 | 900 | 14 | 14400 | 22 | 230400 | 30 | 3686400 |
7 | 1200 | 15 | 19200 | 23 | 307200 | 31 | 7372800 |
------------------------------------------------------------------------
Supported baud rates are:
75 450 1800 7200 38400 115200 460800 1843200
150 600 2400 9600 28800 153600 614400 2457600
225 900 3600 14400 57600 230400 921600 3686400
300 1200 4800 19200 76800 307200 1228800 7372800
Example: To change current console to 9600 baud
I 0 13
I 0 9600
## Drive Letter Assignment
@@ -452,6 +446,15 @@ well. However, you will find some files on the ROM disk that will work
with ZSDOS, but will not work on CP/M 2.2. For example, `LDDS`, which
loads the ZSDOS date/time stamper will only run on ZSDOS.
## Flash ROM Disks
The limitation of ROM disks being read only can be overcome on some
platforms with the appropriate selection of Flash ROM chip and system
configuration. In this case the flash-file system can be enabled which
will allow the ROM disk to be read and written to. Flash devices have a
limited write lifespan and continual usage will eventually wear out the
device. It is not suited for high usage applications.
## Disk Devices
While the RAM/ROM disks provide a functional system, they are not useful
@@ -661,6 +664,11 @@ boot from disk as is. You do not need to run `SYSCOPY` on them to make
them bootable. However, if you upgrade your ROM, you should use
`SYSCOPY` to update the system tracks.
A full implementation of the UCSD p-System for Z80 under RomWBW is also
provided. This is a completely separate and standalone disk image called
psys.img. It contains 6 p-System filesystem slices, but these are not
interoperable with the CP/M slices described above.
## Booting Disks
When starting your system, following the hardware initialization, you
@@ -738,17 +746,17 @@ most stable and you are less likely to encounter problems.
### Notes
- You can change media, but it must be done while at the OS command
prompt and you **must** warm start CP/M by pressing ctrl-c. This is
a CP/M 2.2 constraint and is well documented in the DRI manuals.
- You can change media, but it must be done while at the OS command
prompt and you **must** warm start CP/M by pressing ctrl-c. This is a
CP/M 2.2 constraint and is well documented in the DRI manuals.
- The original versions of DDT, DDTZ, and ZSID used the RST 38 vector
which conflicts with interrupt mode 1 use of this vector. The DDT,
DDTZ, and ZSID applications in RomWBW have been modified to use RST
30 to avoid this issue.
- The original versions of DDT, DDTZ, and ZSID used the RST 38 vector
which conflicts with interrupt mode 1 use of this vector. The DDT,
DDTZ, and ZSID applications in RomWBW have been modified to use RST 30
to avoid this issue.
- Z-System applications will not run under CP/M 2.2. For example, the
`LDDS` date stamper will not run.
- Z-System applications will not run under CP/M 2.2. For example, the
`LDDS` date stamper will not run.
## ZSDOS 1.1
@@ -766,14 +774,13 @@ Manual.pdf”).
### Notes
- Although most CP/M 2.2 applications will run under Z-System, some
may not work as expected. The best example is PIP which is not aware
of the ZSDOS paths and will fail in some scenarios (use `COPY`
instead).
- Although most CP/M 2.2 applications will run under Z-System, some may
not work as expected. The best example is PIP which is not aware of
the ZSDOS paths and will fail in some scenarios (use `COPY` instead).
- Although ZSDOS can recognize a media change in some cases, it will
not always work. You should only change media at a command prompt
and be sure to warm start the OS with a ctrl-c.
- Although ZSDOS can recognize a media change in some cases, it will not
always work. You should only change media at a command prompt and be
sure to warm start the OS with a ctrl-c.
## NZCOM Automatic Z-System
@@ -794,8 +801,8 @@ RomWBW Doc directory.
### Notes
- There is no `DIR` command, you must use `SDZ` instead. If you dont
like this, look into the ALIAS facility.
- There is no `DIR` command, you must use `SDZ` instead. If you dont
like this, look into the ALIAS facility.
## Digital Research CP/M 3
@@ -811,19 +818,18 @@ tracks. `CPMLDR.SYS` chain loads `CPM3.SYS`.
### Notes
- The `DATE` command cannot yet be used to **set** the RTC. The RTC is
used to read the current date/time for file stamping, etc. You can
use the `RTC` app to set the RTC clock.
- The `DATE` command cannot yet be used to **set** the RTC. The RTC is
used to read the current date/time for file stamping, etc. You can use
the `RTC` app to set the RTC clock.
- The `COPYSYS` command described in the DRI CP/M 3 documentation is
not provided with RomWBW. The RomWBW `SYSCOPY` command is used
instead.
- The `COPYSYS` command described in the DRI CP/M 3 documentation is not
provided with RomWBW. The RomWBW `SYSCOPY` command is used instead.
- Although CP/M 3 is generally able to run CP/M 2.2 programs, this is
not universally true. This is especially true of the utility
programs included with the operating system. For example, the
`SUBMIT` program of CP/M 3 is completely different from the `SUBMIT`
program of CP/M 2.2.
- Although CP/M 3 is generally able to run CP/M 2.2 programs, this is
not universally true. This is especially true of the utility programs
included with the operating system. For example, the `SUBMIT` program
of CP/M 3 is completely different from the `SUBMIT` program of CP/M
2.2.
## Simeon Crans ZPM3
@@ -835,14 +841,77 @@ tracks of the disk.
### Notes
- `ZPMLDR` is equivalent to CPMLDR. Both are included. Previously,
ZPMLDR had issues that prevented it from properly booting RomWBW
ZPM3. However, those issues have been resolved.
- `ZPMLDR` is equivalent to CPMLDR. Both are included. Previously,
ZPMLDR had issues that prevented it from properly booting RomWBW ZPM3.
However, those issues have been resolved.
- The ZPM operating system is contained in the file called CPM3.SYS
which is confusing, but this is as intended by the ZPM3
distribution. I believe it was done this way to make it easier for
users to transition from CP/M 3 to ZPM3.
- The ZPM operating system is contained in the file called CPM3.SYS
which is confusing, but this is as intended by the ZPM3 distribution.
I believe it was done this way to make it easier for users to
transition from CP/M 3 to ZPM3.
## QPM
QPM is another OS providing compatibility with and enhancements to CP/M
2.2. It is provided as bootable disk images for RomWBW.
The following documentation files from the original QPM distribution are
included in the RomWBW Doc directory:
- QP/M 2.7 Features and Facilities (qcp27.pdf)
- QP/M 2.7 Interface Guide (qdos27.pdf)
- QP/M 2.7 Installation Guide and Supplements (qpm27.pdf)
Refer to the ReadMe.txt file in Source/Images/d_qpm for more details
regarding the RomWBW adaptation and customizations.
### Notes
- QPM is not available as source. This implementation was based on the
QPM binary distribution and has been minimally customized for RomWBW.
- QINSTALL is used to customize QPM. It is included on the disk image.
You should review the notes in the ReadMe.txt file in
Source/Image/d_qpm before making changes.
## UCSD p-System
This is a full implementation of the UCSD p-System IV.0 for Z80 running
under RomWBW. Unlike the OSes above, p-System uses its own unique
filesystem and is not interoperable with other OSes.
It was derived from the p-System Adaptable Z80 System. Unlike some other
distributions, this implements a native p-System Z80 Extended BIOS, it
does not rely on a CP/M BIOS layer.
The p-System is provided on a hard disk image file called psys.img. This
must be copied to its own dedicated hard disk media (CF Card, SD Card,
etc.). It is booted by selecting slices 0 of the corresponding hard disk
unit at the RomWBW Boot Loader prompt.
The p-System Users Manual is included in the Doc directory of the
distribution as “UCSD p-System Users Manual.pdf”.
Refer to the ReadMe.txt file in Source/pSys for more details.
### Notes
- There is no floppy support at this time.
- The hard disk image contains 6 p-System slices which are assigned to
p-System unit numbers 4, 5, 9, 10, 11 which is standard for p-System.
Slices 0-5 are assigned sequentially to these p-System unit numbers
and it is not possible to reassign them.
- p-System relies heavily on the use of a full screen terminal. This
implementation has been setup to expect an ANSI or DEC VT-100 terminal
or emulator. The screen output will be garbled if no such terminal or
emulator is used for console output.
- There is no straightforward mechanism to move files in and out of
p-System. However, the .vol files in Source/pSys can be read and
modified by CiderPress. CiderPress is able to add and remove
individual files.
## FreeRTOS
@@ -1027,10 +1096,10 @@ images.
While John is likely to enhance UNA over time, there are currently a few
things that UNA does not support:
- Floppy Drives
- Terminal Emulation
- Zeta 1, N8, RC2014, Easy Z80, and Dyno Systems
- Some older support boards
- Floppy Drives
- Terminal Emulation
- Zeta 1, N8, RC2014, Easy Z80, and Dyno Systems
- Some older support boards
The UNA version embedded in RomWBW is the latest production release of
UNA. RomWBW will be updated with Johns upcoming UNA release with
@@ -1136,89 +1205,86 @@ If the disk is bootable, you need to update the system image on the disk
using the procedure described below corresponsing to the operating
system on your disk.
- **CP/M 2.2**
- **CP/M 2.2**
Boot to CP/M 2.2 from ROM, then use `SYSCOPY` to update the system
image on **all** CP/M 2.2 boot disks/slices. The CP/M 2.2 system
image is called CPM.SYS and is found on the ROM disk. For example:
Boot to CP/M 2.2 from ROM, then use `SYSCOPY` to update the system
image on **all** CP/M 2.2 boot disks/slices. The CP/M 2.2 system image
is called CPM.SYS and is found on the ROM disk. For example:
`B>SYSCOPY C:=CPM.SYS`
`B>SYSCOPY C:=CPM.SYS`
- **ZSDOS**
- **ZSDOS**
Boot to Z-System from ROM, then use `SYSCOPY` to update the system
image on **all** ZSDOS boot disks/slices. The ZSDOS system image is
called ZSYS.SYS and is found on the ROM disk. For example:
Boot to Z-System from ROM, then use `SYSCOPY` to update the system
image on **all** ZSDOS boot disks/slices. The ZSDOS system image is
called ZSYS.SYS and is found on the ROM disk. For example:
`B>SYSCOPY C:=ZSYS.SYS`
`B>SYSCOPY C:=ZSYS.SYS`
- **NZCOM**
- **NZCOM**
NZCOM runs on top of either CP/M 2.2 or ZSDOS. By default, the
RomWBW disk image for NZCOM uses ZSDOS. Follow the corresponding
procedure above to update the system image on the NZCOM boot
disks/slices.
NZCOM runs on top of either CP/M 2.2 or ZSDOS. By default, the RomWBW
disk image for NZCOM uses ZSDOS. Follow the corresponding procedure
above to update the system image on the NZCOM boot disks/slices.
- **CP/M 3**
- **CP/M 3**
CP/M 3 uses a multi-step boot process involving multiple files. The
CP/M 3 boot files are not included on the ROM disk due to space
constraints. You will need to transfer the files to your system from
the RomWBW distribution directory Binary\CPM3.
CP/M 3 uses a multi-step boot process involving multiple files. The
CP/M 3 boot files are not included on the ROM disk due to space
constraints. You will need to transfer the files to your system from
the RomWBW distribution directory Binary\CPM3.
After this is done, you will need to use `SYSCOPY` to place the CP/M
3 loader image on the boot tracks of all CP/M 3 boot disks/slices.
The loader image is called `CPMLDR.SYS`. You must then copy (at a
minimum) `CPM3.SYS` and `CCP.COM` onto the disk/slice. Assuming you
copied the CP/M 3 boot files onto your RAM disk at A:, you would
use:
After this is done, you will need to use `SYSCOPY` to place the CP/M 3
loader image on the boot tracks of all CP/M 3 boot disks/slices. The
loader image is called `CPMLDR.SYS`. You must then copy (at a minimum)
`CPM3.SYS` and `CCP.COM` onto the disk/slice. Assuming you copied the
CP/M 3 boot files onto your RAM disk at A:, you would use:
A>B:SYSCOPY C:=CPMLDR.SYS
A>B:COPY CPM3.SYS C:
A>B:COPY CCP.COM C:
A>B:SYSCOPY C:=CPMLDR.SYS
A>B:COPY CPM3.SYS C:
A>B:COPY CCP.COM C:
- **ZPM3**
- **ZPM3**
ZPM3 uses a multi-step boot process involving multiple files. The
ZPM3 boot files are not included on the ROM disk due to space
constraints. You will need to transfer the files to your system from
the RomWBW distribution directory Binary\ZPM3.
ZPM3 uses a multi-step boot process involving multiple files. The ZPM3
boot files are not included on the ROM disk due to space constraints.
You will need to transfer the files to your system from the RomWBW
distribution directory Binary\ZPM3.
After this is done, you will need to use `SYSCOPY` to place the ZPM3
loader image on the boot tracks of all ZPM3 boot disks/slices. The
loader image is called `ZPMLDR.SYS`. You must then copy (at a
minimum) `CPM3.SYS`, `ZCCP.COM`, `ZINSTAL.ZPM`, and `STARTZPM.COM`
onto the disk/slice. Assuming you copied the ZPM3 boot files onto
your RAM disk at A:, you would use:
After this is done, you will need to use `SYSCOPY` to place the ZPM3
loader image on the boot tracks of all ZPM3 boot disks/slices. The
loader image is called `ZPMLDR.SYS`. You must then copy (at a minimum)
`CPM3.SYS`, `ZCCP.COM`, `ZINSTAL.ZPM`, and `STARTZPM.COM` onto the
disk/slice. Assuming you copied the ZPM3 boot files onto your RAM disk
at A:, you would use:
A>B:SYSCOPY C:=ZPMLDR.SYS
A>B:COPY CPM3.SYS C:
A>B:COPY ZCCP.COM C:
A>B:COPY ZINSTAL.ZPM C:
A>B:COPY STARTZPM.COM C:
A>B:SYSCOPY C:=ZPMLDR.SYS
A>B:COPY CPM3.SYS C:
A>B:COPY ZCCP.COM C:
A>B:COPY ZINSTAL.ZPM C:
A>B:COPY STARTZPM.COM C:
You may be wondering if the reference to `CPM3.SYS` is a typo. It is
not. The ZPM3 main system code file is called `CPM3.SYS` which is
the same name as CP/M 3 uses, but the file contents are not the
same.
You may be wondering if the reference to `CPM3.SYS` is a typo. It is
not. The ZPM3 main system code file is called `CPM3.SYS` which is the
same name as CP/M 3 uses, but the file contents are not the same.
Finally, if you have copies of any of the RomWBW custom applications on
your hard disk, you need to update them with the latest copies. The
following applications are found on your ROM disk. Use COPY to copy them
over any older versions of the app on your disk:
- ASSIGN.COM
- SYSCOPY.COM
- MODE.COM
- FDU.COM (was FDTST.COM)
- FORMAT.COM
- XM.COM
- FLASH.COM
- FDISK80.COM
- TALK.COM
- RTC.COM
- TIMER.COM
- INTTEST.COM
- ASSIGN.COM
- SYSCOPY.COM
- MODE.COM
- FDU.COM (was FDTST.COM)
- FORMAT.COM
- XM.COM
- FLASH.COM
- FDISK80.COM
- TALK.COM
- RTC.COM
- TIMER.COM
- INTTEST.COM
For example: `B>COPY ASSIGN.COM C:`
@@ -1227,8 +1293,8 @@ you are using any of these you will need to transfer them to your system
and then update all copies. These applications are found in the
Binary\Apps directory of the distribution and in all of the disk images.
- FAT.COM
- TUNE.COM
- FAT.COM
- TUNE.COM
## System Update
@@ -1242,11 +1308,11 @@ and CP/M system.
A System Update may be more favorable than a System Upgrade in cases
such as:
- Overwriting of the ROM drive is not desired.
- Space is unavailable to hold a full ROMWBW ROM.
- To mimimize time taken to transfer and flash a full ROM.
- Configuration changes are only minor and do not impact disk
applications.
- Overwriting of the ROM drive is not desired.
- Space is unavailable to hold a full ROMWBW ROM.
- To mimimize time taken to transfer and flash a full ROM.
- Configuration changes are only minor and do not impact disk
applications.
The ROMWBW build process generates a system upgrade file along with the
normal ROM image and can be identified by the extension “.upd”. It will
@@ -1297,22 +1363,22 @@ continue the maintenance of these applications and they have become
unusable due to changes within RomWBW. As of RomWBW 2.6, these
applications are no longer provided.
- David Giles contributed support for the CSIO support in the SD Card
driver.
- Ed Brindley contributed some of the code that supports the RC2014
platform.
- Phil Summers contributed the Forth and BASIC adaptations in ROM, the
AY-3-8910 sound driver as well as a long list of general code
enhancements.
- Phillip Stevens contributed support for FreeRTOS.
- Curt Mayer contributed the original Linux / MacOS build process.
- UNA BIOS and FDISK80 are the products of John Coffman.
- FLASH4 is a product of Will Sowerbutts.
- CLRDIR is a product of Max Scane.
- Tasty Basic is a product of Dimitri Theulings.
- Dean Netherton contributed the sound driver interface and the
SN76489 sound driver.
- The RomWBW Disk Catalog document was produced by Mykl Orders.
- David Giles contributed support for the CSIO support in the SD Card
driver.
- Ed Brindley contributed some of the code that supports the RC2014
platform.
- Phil Summers contributed the Forth and BASIC adaptations in ROM, the
AY-3-8910 sound driver as well as a long list of general code
enhancements.
- Phillip Stevens contributed support for FreeRTOS.
- Curt Mayer contributed the original Linux / MacOS build process.
- UNA BIOS and FDISK80 are the products of John Coffman.
- FLASH4 is a product of Will Sowerbutts.
- CLRDIR is a product of Max Scane.
- Tasty Basic is a product of Dimitri Theulings.
- Dean Netherton contributed the sound driver interface and the SN76489
sound driver.
- The RomWBW Disk Catalog document was produced by Mykl Orders.
Contributions of all kinds to RomWBW are very welcome.
@@ -1363,12 +1429,11 @@ All contributions to RomWBW are subject to this license.
The best way to get assistance with RomWBW or any aspect of the
RetroBrew Computers projects is via the community forums:
- [RetroBrew Computers
Forum](https://www.retrobrewcomputers.org/forum/)
- [RC2014 Google
Group](https://groups.google.com/forum/#!forum/rc2014-z80)
- [retro-comp Google
Group](https://groups.google.com/forum/#!forum/retro-comp)
- [RetroBrew Computers Forum](https://www.retrobrewcomputers.org/forum/)
- [RC2014 Google
Group](https://groups.google.com/forum/#!forum/rc2014-z80)
- [retro-comp Google
Group](https://groups.google.com/forum/#!forum/retro-comp)
Submission of issues and bugs are welcome at the [RomWBW GitHub
Repository](https://github.com/wwarthen/RomWBW).

View File

@@ -1,6 +1,6 @@
RomWBW Getting Started
Wayne Warthen (mailto:wwarthen@gmail.com)
09 Jul 2022
15 Jan 2023
@@ -17,7 +17,7 @@ RomWBW
Z80/Z180 System Software
Version 3.1 Pre-release
09 Jul 2022
15 Jan 2023
Wayne Warthen wwarthen@gmail.com
@@ -307,26 +307,20 @@ VDU type devices or serial devices. If you want to change which device
is the console, the I menu option can be used to choose the unit and
its speed.
The command format is I <u> [<c>]
The command format is I <u> [<b>]
where u is unit to select and c is the optional baud rate code as listed
below.
where u is unit to select and b is the optional baud rate.
Code | Rate | Code | Rate | Code | Rate | Code | Rate |
------|----------|------|----------|------|----------|------|----------|
0 | 75 | 8 | 1800 | 16 | 28880 | 24 | 460800 |
1 | 150 | 9 | 2400 | 17 | 38400 | 25 | 614400 |
2 | 225 | 10 | 3600 | 18 | 57600 | 26 | 921600 |
3 | 300 | 11 | 4800 | 19 | 76800 | 27 | 1228822 |
4 | 450 | 12 | 7200 | 20 | 115200 | 28 | 1843200 |
5 | 600 | 13 | 9600 | 21 | 153600 | 29 | 2457600 |
6 | 900 | 14 | 14400 | 22 | 230400 | 30 | 3686400 |
7 | 1200 | 15 | 19200 | 23 | 307200 | 31 | 7372800 |
------------------------------------------------------------------------
Supported baud rates are:
75 450 1800 7200 38400 115200 460800 1843200
150 600 2400 9600 28800 153600 614400 2457600
225 900 3600 14400 57600 230400 921600 3686400
300 1200 4800 19200 76800 307200 1228800 7372800
Example: To change current console to 9600 baud
I 0 13
I 0 9600
Drive Letter Assignment
@@ -438,11 +432,11 @@ the OS variants included with RomWBW.
The following custom applications are found on the ROM disk and are,
therefore, globally available.
-----------------------------------------------------------------------------
----------------------------------------------------------------------------
Application Description
------------- ---------------------------------------------------------------
ASSIGN Add, change, and delete drive letter assignments. Use ASSIGN /?
for usage instructions.
------------- --------------------------------------------------------------
ASSIGN Add, change, and delete drive letter assignments. Use ASSIGN
/? for usage instructions.
SYSCOPY Copy system image to a device to make it bootable. Use SYSCOPY
with no parms for usage instructions.
@@ -454,8 +448,8 @@ therefore, globally available.
FORMAT Will someday be a command line tool to format floppy disks.
Currently does nothing!
XM XModem file transfer program adapted to hardware. Automatically
uses primary serial port on system.
XM XModem file transfer program adapted to hardware.
Automatically uses primary serial port on system.
FLASH Will Sowerbutts in-situ ROM programming utility.
@@ -469,7 +463,7 @@ therefore, globally available.
TIMER Display value of running periodic system timer.
CPUSPD Change the running CPU speed and wait states of the system.
-----------------------------------------------------------------------------
----------------------------------------------------------------------------
Some custom applications do not fit on the ROM disk. They are found on
the disk image files or the individual files can be found in the
@@ -511,6 +505,15 @@ well. However, you will find some files on the ROM disk that will work
with ZSDOS, but will not work on CP/M 2.2. For example, LDDS, which
loads the ZSDOS date/time stamper will only run on ZSDOS.
Flash ROM Disks
The limitation of ROM disks being read only can be overcome on some
platforms with the appropriate selection of Flash ROM chip and system
configuration. In this case the flash-file system can be enabled which
will allow the ROM disk to be read and written to. Flash devices have a
limited write lifespan and continual usage will eventually wear out the
device. It is not suited for high usage applications.
Disk Devices
While the RAM/ROM disks provide a functional system, they are not useful
@@ -733,6 +736,11 @@ boot from disk as is. You do not need to run SYSCOPY on them to make
them bootable. However, if you upgrade your ROM, you should use SYSCOPY
to update the system tracks.
A full implementation of the UCSD p-System for Z80 under RomWBW is also
provided. This is a completely separate and standalone disk image called
psys.img. It contains 6 p-System filesystem slices, but these are not
interoperable with the CP/M slices described above.
Booting Disks
When starting your system, following the hardware initialization, you
@@ -913,6 +921,70 @@ Notes
distribution. I believe it was done this way to make it easier for
users to transition from CP/M 3 to ZPM3.
QPM
QPM is another OS providing compatibility with and enhancements to CP/M
2.2. It is provided as bootable disk images for RomWBW.
The following documentation files from the original QPM distribution are
included in the RomWBW Doc directory:
- QP/M 2.7 Features and Facilities (qcp27.pdf)
- QP/M 2.7 Interface Guide (qdos27.pdf)
- QP/M 2.7 Installation Guide and Supplements (qpm27.pdf)
Refer to the ReadMe.txt file in Source/Images/d_qpm for more details
regarding the RomWBW adaptation and customizations.
Notes
- QPM is not available as source. This implementation was based on the
QPM binary distribution and has been minimally customized for
RomWBW.
- QINSTALL is used to customize QPM. It is included on the disk image.
You should review the notes in the ReadMe.txt file in
Source/Image/d_qpm before making changes.
UCSD p-System
This is a full implementation of the UCSD p-System IV.0 for Z80 running
under RomWBW. Unlike the OSes above, p-System uses its own unique
filesystem and is not interoperable with other OSes.
It was derived from the p-System Adaptable Z80 System. Unlike some other
distributions, this implements a native p-System Z80 Extended BIOS, it
does not rely on a CP/M BIOS layer.
The p-System is provided on a hard disk image file called psys.img. This
must be copied to its own dedicated hard disk media (CF Card, SD Card,
etc.). It is booted by selecting slices 0 of the corresponding hard disk
unit at the RomWBW Boot Loader prompt.
The p-System Users Manual is included in the Doc directory of the
distribution as “UCSD p-System Users Manual.pdf”.
Refer to the ReadMe.txt file in Source/pSys for more details.
Notes
- There is no floppy support at this time.
- The hard disk image contains 6 p-System slices which are assigned to
p-System unit numbers 4, 5, 9, 10, 11 which is standard for
p-System. Slices 0-5 are assigned sequentially to these p-System
unit numbers and it is not possible to reassign them.
- p-System relies heavily on the use of a full screen terminal. This
implementation has been setup to expect an ANSI or DEC VT-100
terminal or emulator. The screen output will be garbled if no such
terminal or emulator is used for console output.
- There is no straightforward mechanism to move files in and out of
p-System. However, the .vol files in Source/pSys can be read and
modified by CiderPress. CiderPress is able to add and remove
individual files.
FreeRTOS
Phillip Stevens has ported FreeRTOS to run under RomWBW. FreeRTOS is not

View File

@@ -0,0 +1,329 @@
;
;------------------------------------------------------------------------------
; PLAY SCALES USING HBIOS
;------------------------------------------------------------------------------
;
FCB .EQU $5C ; Location of default FCB
BDOS .EQU $0005
;
.ORG $0100
;
LD (OLDSTACK),SP ; save old stack pointer
LD SP,STACK ; set new stack pointer
;
;------------------------------------------------------------------------------
; GET DEVICE # FROM COMMAND LINE
;------------------------------------------------------------------------------
;
LD A,(FCB+1) ; GET FIRST CHAR
SUB ' '
JR Z,NO_ARG
SUB '0'-' '
JP C,EXIT
;
;------------------------------------------------------------------------------
; DISPLAY DEVICE AND NUMBER OF CHANNELS
;------------------------------------------------------------------------------
;
NO_ARG: LD (DEVICE),A ;
LD DE,TXT_DEV ; DEVICE:
CALL PRTSTR
CALL PRTDECB
LD C,A ; GET DEVICE ID
LD A,':'
CALL PRTCHR
LD B,$55
PUSH BC
LD E,4
RST 08
LD DE,TXT_NAME
LD A,B
RRCA \ RRCA \ RRCA \ RRCA
CALL PRTIDXDEA ; SHOW NAME
LD DE,TXT_CH
CALL PRTSTR
;
POP BC ; GET & DISPLAY # CHANNELS
LD E,1
RST 08
LD A,B
CALL PRTDECB
CALL CRLF ; NUMBER OF CHANNELS IS IN B
;
;------------------------------------------------------------------------------
; LOOP THROUGH EACH CHANNEL
;------------------------------------------------------------------------------
CH__TONE: LD A,(DEVICE) ; C CONTAINS DEVICE
LD C,A ; THROUGH THIS LOOP
;
PUSH BC
LD B,50H ; RESET DEVICE
RST 08
POP BC
;
PUSH BC
LD B,51H ; VOLUME FULL
LD L,0FFH
RST 08
POP BC
;
LD A,B
TST_TONE_LP: DEC A
LD (CHANNEL),A ; SAVE CURRENT CHANNEL
CALL TST_SCALES ; SCALES TEST
; CALL TST_VOLUME ; VOLUME TEST
CALL CRLF
DJNZ TST_TONE_LP
;
PUSH BC
LD B,50H ; RESET DEVICE
RST 08
POP BC
;
;------------------------------------------------------------------------------
; RESTORE STACK & EXIT
;------------------------------------------------------------------------------
;
EXIT: LD SP, (OLDSTACK) ; Exit to CP/M
RST 00H
DI
HALT
;
;------------------------------------------------------------------------------
; PLAY SCALES FROM HIGHEST HBIOS NOTE TO LOWEST
;------------------------------------------------------------------------------
;
TST_SCALES: PUSH BC
PUSH AF
;
LD HL,380 ; START NOTE
LD (NOTE),HL ; Top of Octave 7 is 343
LD B,51H ; VOLUME HIGH
LD L,0FFH
PUSH BC
RST 08
POP BC
;
NEXT0: PUSH BC
;
LD DE,TXT_TSTCH ; DISPLAY CHANNEL
CALL PRTSTR
LD A,(CHANNEL)
CALL PRTDECB
;
LD DE,TXT_NOTE ; DISPLAY NOTE
CALL PRTSTR
LD HL,(NOTE)
CALL PRTDECW
POP BC
;
LD B,53H ; SET NOTE
LD HL,(NOTE)
PUSH BC
RST 08
POP BC
OR A ; DID DRIVER FAIL
JR Z,NEXT4 ; THIS NOTE ?
LD DE,TXT_BAD_N
CALL FAILMSG
JR SKIP
;
NEXT4: LD B,57H ; DURATION
LD HL,1000
PUSH BC
RST 08
POP BC
LD B,54H ; PLAY
LD A,(CHANNEL)
LD D,A
PUSH BC
RST 08
POP BC
;
OR A ; DID DRIVER FAIL
JR Z,NEXT2 ; TO PLAY ?
LD DE,TXT_BAD_N
CALL FAILMSG
JR SKIP
;
NEXT2: CALL DELAY
CALL CRLF
;
SKIP: LD HL,(NOTE)
DEC HL
LD (NOTE),HL
INC HL
LD A,H
OR L
DEC HL
JR NZ,NEXT0
;
LD B,51H ; VOLUME
LD L,00H ; OFF
PUSH BC
RST 08
POP BC
;
LD B,54H ; PLAY
LD A,(CHANNEL)
LD D,A
PUSH BC
RST 08
POP BC
PUSH BC
LD C, 6 ; check for keypress
LD E,0FFH
CALL BDOS
POP BC
OR A
JP NZ,EXIT
POP AF
POP BC
;
RET
;
FAILMSG: PUSH AF
PUSH BC
CALL PRTSTR
CALL CRLF
POP BC
POP AF
RET
;
;------------------------------------------------------------------------------
; CONSTANT TONE ON ALL CHANNELS, SCALE VOLUME
;------------------------------------------------------------------------------
;
TST_VOLUME:
LD HL,332+48 ; TONE
LD (NOTE),HL
;
LD B,3
NEXTCH1 LD A,B
DEC A
LD (CHANNEL),A
PUSH BC ; ACROSS
CALL TONE ; ALL
LD C, 6 ; KEYPRESS
LD E, 0FFH
CALL BDOS
POP BC ; CHANNELS
OR A
JP NZ,EXIT
DJNZ NEXTCH1
RET
TONE: LD A,(DEVICE)
LD C,A
LD B,50H ; RESET
PUSH BC
RST 08
POP BC
;
NEXT1: LD B,51H ; VOLUME
LD A,(VOLUME)
LD L,A
PUSH BC
RST 08
POP BC
;
LD B,53H ; NOTE
LD HL,(NOTE)
PUSH BC
RST 08
POP BC
;
LD B,54H ; PLAY
LD A,(CHANNEL)
LD D,A
PUSH BC
RST 08
POP BC
;
CALL DELAY
;
LD A,(VOLUME)
DEC A
LD (VOLUME),A
JR NZ,NEXT1
;
LD B,51H ; VOLUME
LD L,00H
PUSH BC
RST 08
POP BC
;
LD B,54H ; PLAY
PUSH BC
LD A,(CHANNEL)
LD D,A
POP BC
RST 08
;
RET
;;
;------------------------------------------------------------------------------
; LONG DELAY
;------------------------------------------------------------------------------
;
DELAY: LD HL,-1
DELAY1: DEC HL
LD A,H
OR L
JR NZ,DELAY1
RET
;
;------------------------------------------------------------------------------
; PRINT THE nTH STRING IN A LIST OF STRINGS WHERE EACH IS TERMINATED BY 0
; A REGISTER DEFINES THE nTH STRING IN THE LIST TO PRINT AND DE POINTS
; TO THE START OF THE STRING LIST.
;------------------------------------------------------------------------------
;
PRTIDXDEA: LD C,A
OR A
PRTIDXDEA1: JR Z,PRTIDXDEA3 ; FOUND TARGET SO EXIT
PRTIDXDEA2: LD A,(DE) ; LOOP UNIT
INC DE ; WE REACH
OR A ; END OF STRING
JR NZ,PRTIDXDEA2
DEC C ; AT STRING END. SO GO
JR PRTIDXDEA1 ; CHECK FOR INDEX MATCH
PRTIDXDEA3: CALL PRTSTR ; DISPLAY THE STRING
RET
;
#INCLUDE "printing.inc"
;
TXT_CH .DB "CHANNELS: ",0
TXT_TSTCH .DB "CHANNEL: ",0
TXT_BAD_N .DB " BAD NOTE",0
TXT_BAD_P .DB " PLAY ERROR",0
TXT_NOTE .DB " NOTE: ",0
TXT_DEV .DB "DEVICE: ",0
TXT_NAME .DB "SN76489 ",0
.DB "AY-3-8910 ",0
.DB "I/O PORT ",0
.DB "YM2612 ",0
MODE .DB 0 ; scales mode or volume mode
DEVICE .DB 0
NOTE .DW 128
VOLUME .DB 0
CHANNEL .DB 0
OLDSTACK .DW 0 ; original stack pointer
.DS 40H ; space for stack
STACK ; top of stack
;
.END

View File

@@ -34,6 +34,7 @@ PRTCR:
; Print a zero terminated string at (DE) without destroying any registers
;
PRTSTR:
PUSH AF
PUSH DE
;
PRTSTR1:
@@ -46,6 +47,7 @@ PRTSTR1:
;
PRTSTR2:
POP DE ; restore registers
POP AF
RET
;
; Print the value in A in hex without destroying any registers

View File

@@ -6,6 +6,7 @@ set PATH=%TOOLS%\tasm32;%PATH%
set TASMTABS=%TOOLS%\tasm32
tasm -t180 -g3 -fFF -dWBW vgmplay.asm vgmplay.com vgmplay.lst || exit /b
tasm -t180 -g3 -fFF -dWBW ymfmdemo.asm ymfmdemo.com ymfmdemo.lst || exit /b
copy /Y vgmplay.com ..\..\..\Binary\Apps\ || exit /b
copy /Y Tunes\*.* ..\..\..\Binary\Apps\Tunes\ || exit /b
copy /Y Tunes\*.vgm ..\..\..\Binary\Apps\Tunes\ || exit /b

View File

@@ -10,6 +10,9 @@ DEPS := vgmplay.asm $(shell find . -name '*.inc')
vgmplay.com: $(DEPS)
$(TASM) -dWBW vgmplay.asm vgmplay.com vgmplay.lst
ym2612.com:
$(TASM) -dWBW ymfmdemo.asm ymfmdemo.com ymfmdemo.lst
all::
mkdir -p $(DEST)/Tunes
cp Tunes/* $(DEST)/Tunes
cp Tunes/*.vgm $(DEST)/Tunes

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -34,6 +34,7 @@ PRTCR:
; Print a zero terminated string at (DE) without destroying any registers
;
PRTSTR:
PUSH AF
PUSH DE
;
PRTSTR1:
@@ -46,6 +47,7 @@ PRTSTR1:
;
PRTSTR2:
POP DE ; restore registers
POP AF
RET
;
; Print the value in A in hex without destroying any registers

View File

@@ -9,122 +9,173 @@
; YM2151 support from Ed Brindley
;
; YM2162/YM3484, GD3 support, VGM Chip identification,
; default file type, basic file size checking added by Phil Summers
; default file type, basic file size checking, polled CTC mode
; added by Phil Summers
;
; Bugs: YM2151 playback untested & no mute.
; CTC polled timing - predicted 44100 divider is too slow
;
; Assemble with:
;
; TASM -80 -b VGMPLAY.ASM VGMPLAY.COM
;
;
; A VGM file can play 44100 samples a second. This may be sound chip
; register commands or PCM data. This player does not support PCM playback
; due to the high processor speed and file size required. Typical VGM files
; available use a much lower sample rate and are playable. Where the processor
; speed is low and the sample rate is high, the playback overhead will cause
; playback speed to be inaccurate.
;------------------------------------------------------------------------------
; Device and system specific definitions
;------------------------------------------------------------------------------
;
P8X180 .EQU 0 ; System configuration
RC2014 .EQU 0
SBCECB .EQU 1
MBC .EQU 0
custom .equ 0 ; System configurations
P8X180 .equ 1
RC2014 .equ 2
sbcecb .equ 3
MBC .equ 4
;
.IF P8X180
RSEL .EQU 82H ; Primary AY-3-8910 Register selection
RDAT .EQU 83H ; Primary AY-3-8910 Register data
RSEL2 .EQU 88H ; Secondary AY-3-8910 Register selection
RDAT2 .EQU 89H ; Secondary AY-3-8910 Register data
PSG1REG .EQU 84H ; Primary SN76489
PSG2REG .EQU 8AH ; Secondary SN76489
YM2151_SEL1 .EQU 0B0H ; Primary YM2151 register selection
YM2151_DAT1 .EQU 0B1H ; Primary YM2151 register data
YM2151_SEL2 .EQU 0B2H ; Secondary YM2151 register selection
YM2151_DAT2 .EQU 0B3H ; Secondary YM2151 register data
FRAME_DLY .EQU 48 ; Frame delay (~ 1/44100)
.ENDIF
plt_romwbw .equ 1 ; Build for ROMWBW?
plt_type .equ sbcecb ; Select build configuration
debug .equ 0 ; Display port, register, config info
;
.IF RC2014
RSEL .EQU 0D8H ; Primary AY-3-8910 Register selection
RDAT .EQU 0D0H ; Primary AY-3-8910 Register data
RSEL2 .EQU 0A0H ; Secondary AY-3-8910 Register selection
RDAT2 .EQU 0A1H ; Secondary AY-3-8910 Register data
PSG1REG .EQU 0FFH ; Primary SN76489
PSG2REG .EQU 0FBH ; Secondary SN76489
YM2151_SEL1 .EQU 0FEH ; Primary YM2151 register selection
YM2151_DAT1 .EQU 0FFH ; Primary YM2151 register data
YM2151_SEL2 .EQU 0D0H ; Secondary YM2151 register selection
YM2151_DAT2 .EQU 0D1H ; Secondary YM2151 register data
FRAME_DLY .EQU 15 ; Frame delay (~ 1/44100)
.ENDIF
#IF (plt_type=custom)
RSEL .equ 09AH ; Primary AY-3-8910 Register selection
RDAT .equ 09BH ; Primary AY-3-8910 Register data
RSEL2 .equ 88H ; Secondary AY-3-8910 Register selection
RDAT2 .equ 89H ; Secondary AY-3-8910 Register data
VGMBASE .equ $C0
YMSEL .equ VGMBASE+00H ; Primary YM2162 11000000 a1=0 a0=0
YMDAT .equ VGMBASE+01H ; Primary YM2162 11000001 a1=0 a0=1
YM2SEL .equ VGMBASE+02H ; Secondary YM2162 11000010 a1=1 a0=0
YM2DAT .equ VGMBASE+03H ; Secondary YM2162 11000011 a1=1 a0=1
PSG1REG .equ VGMBASE+08H ; Primary SN76489
PSG2REG .equ VGMBASE+09H ; Secondary SN76489
ctcbase .equ VGMBASE+0CH ; CTC base address
YM2151_SEL1 .equ 0FEH ; Primary YM2151 register selection
YM2151_DAT1 .equ 0FFH ; Primary YM2151 register data
YM2151_SEL2 .equ 0FEH ; Secondary YM2151 register selection
YM2151_DAT2 .equ 0FFH ; Secondary YM2151 register data
FRAME_DLY .equ 10 ; Frame delay (~ 1/44100)
plt_cpuspd .equ 6 ; Non ROMWBW cpu speed default
#ENDIF
;
.IF SBCECB
RSEL .EQU 0D8H ; Primary AY-3-8910 Register selection
RDAT .EQU 0D0H ; Primary AY-3-8910 Register data
RSEL2 .EQU 0A0H ; Secondary AY-3-8910 Register selection
RDAT2 .EQU 0A1H ; Secondary AY-3-8910 Register data
YMSEL .EQU 0C0H ; Primary YM2162 11000000 a1=0 a0=0
YMDAT .EQU 0C1H ; Primary YM2162 11000001 a1=0 a0=1
YM2SEL .EQU 0C2H ; Secondary YM2162 11000010 a1=1 a0=0
YM2DAT .EQU 0C3H ; Secondary YM2162 11000011 a1=1 a0=1
PSG1REG .EQU 0C6H ; Primary SN76489
PSG2REG .EQU 0C7H ; Secondary SN76489
YM2151_SEL1 .EQU 0FEH ; Primary YM2151 register selection
YM2151_DAT1 .EQU 0FFH ; Primary YM2151 register data
YM2151_SEL2 .EQU 0FEH ; Secondary YM2151 register selection
YM2151_DAT2 .EQU 0FFH ; Secondary YM2151 register data
FRAME_DLY .EQU 8 ; Frame delay (~ 1/44100)
.ENDIF
#IF (plt_type=P8X180)
RSEL .equ 82H ; Primary AY-3-8910 Register selection
RDAT .equ 83H ; Primary AY-3-8910 Register data
RSEL2 .equ 88H ; Secondary AY-3-8910 Register selection
RDAT2 .equ 89H ; Secondary AY-3-8910 Register data
PSG1REG .equ 84H ; Primary SN76489
PSG2REG .equ 8AH ; Secondary SN76489
YM2151_SEL1 .equ 0B0H ; Primary YM2151 register selection
YM2151_DAT1 .equ 0B1H ; Primary YM2151 register data
YM2151_SEL2 .equ 0B2H ; Secondary YM2151 register selection
YM2151_DAT2 .equ 0B3H ; Secondary YM2151 register data
ctcbase .equ 000H ; CTC base address
YMSEL .equ 000H ; Primary YM2162 11000000 a1=0 a0=0
YMDAT .equ 000H ; Primary YM2162 11000001 a1=0 a0=1
YM2SEL .equ 000H ; Secondary YM2162 11000010 a1=1 a0=0
YM2DAT .equ 000H ; Secondary YM2162 11000011 a1=1 a0=1
FRAME_DLY .equ 48 ; Frame delay (~ 1/44100)
plt_cpuspd .equ 20 ; Non ROMWBW cpu speed default
#ENDIF
;
.IF MBC
RSEL .EQU 0A0H ; Primary AY-3-8910 Register selection
RDAT .EQU 0A1H ; Primary AY-3-8910 Register data
RSEL .EQU 0D8H ; Secondary AY-3-8910 Register selection
RDAT .EQU 0D0H ; Secondary AY-3-8910 Register data
YMSEL .EQU 0C0H ; 11000000 a1=0 a0=0
YMDAT .EQU 0C1H ; 11000001 a1=0 a0=1
YM2SEL .EQU 0C2H ; 11000010 a1=1 a0=0
YM2DAT .EQU 0C3H ; 11000011 a1=1 a0=1
PSGREG .EQU 0C6H ; Primary SN76489
PSG2REG .EQU 0C7H ; Secondary SN76489
YM2151_SEL1 .EQU 0FEH ; Primary YM2151 register selection
YM2151_DAT1 .EQU 0FFH ; Primary YM2151 register data
YM2151_SEL2 .EQU 0FEH ; Secondary YM2151 register selection
YM2151_DAT2 .EQU 0FFH ; Secondary YM2151 register data
FRAME_DLY .EQU 10 ; Frame delay (~ 1/44100)
.ENDIF
#IF (plt_type=RC2014)
RSEL .equ 0D8H ; Primary AY-3-8910 Register selection
RDAT .equ 0D0H ; Primary AY-3-8910 Register data
RSEL2 .equ 0A0H ; Secondary AY-3-8910 Register selection
RDAT2 .equ 0A1H ; Secondary AY-3-8910 Register data
PSG1REG .equ 0FFH ; Primary SN76489
PSG2REG .equ 0FBH ; Secondary SN76489
YM2151_SEL1 .equ 0FEH ; Primary YM2151 register selection
YM2151_DAT1 .equ 0FFH ; Primary YM2151 register data
YM2151_SEL2 .equ 0D0H ; Secondary YM2151 register selection
YM2151_DAT2 .equ 0D1H ; Secondary YM2151 register data
ctcbase .equ 000H ; CTC base address
YMSEL .equ 000H ; Primary YM2162 11000000 a1=0 a0=0
YMDAT .equ 000H ; Primary YM2162 11000001 a1=0 a0=1
YM2SEL .equ 000H ; Secondary YM2162 11000010 a1=1 a0=0
YM2DAT .equ 000H ; Secondary YM2162 11000011 a1=1 a0=1
FRAME_DLY .equ 12 ; Frame delay (~ 1/44100)
plt_cpuspd .equ 7 ; Non ROMWBW cpu speed default
#ENDIF
;
#IF (plt_type=sbcecb)
RSEL .equ 09AH ; Primary AY-3-8910 Register selection
RDAT .equ 09BH ; Primary AY-3-8910 Register data
RSEL2 .equ 0A0H ; Secondary AY-3-8910 Register selection
RDAT2 .equ 0A1H ; Secondary AY-3-8910 Register data
VGMBASE .equ $C0
YMSEL .equ VGMBASE+00H ; Primary YM2162 11000000 a1=0 a0=0
YMDAT .equ VGMBASE+01H ; Primary YM2162 11000001 a1=0 a0=1
YM2SEL .equ VGMBASE+02H ; Secondary YM2162 11000010 a1=1 a0=0
YM2DAT .equ VGMBASE+03H ; Secondary YM2162 11000011 a1=1 a0=1
PSG1REG .equ VGMBASE+06H ; Primary SN76489
PSG2REG .equ VGMBASE+07H ; Secondary SN76489
ctcbase .equ VGMBASE+0CH ; CTC base address
YM2151_SEL1 .equ 0FEH ; Primary YM2151 register selection
YM2151_DAT1 .equ 0FFH ; Primary YM2151 register data
YM2151_SEL2 .equ 0FEH ; Secondary YM2151 register selection
YM2151_DAT2 .equ 0FFH ; Secondary YM2151 register data
FRAME_DLY .equ 13 ; Frame delay (~ 1/44100)
plt_cpuspd .equ 8 ; Non ROMWBW cpu speed default
#ENDIF
;
#IF (plt_type=MBC)
RSEL .equ 0A0H ; Primary AY-3-8910 Register selection
RDAT .equ 0A1H ; Primary AY-3-8910 Register data
RSEL2 .equ 0D8H ; Secondary AY-3-8910 Register selection
RDAT2 .equ 0D0H ; Secondary AY-3-8910 Register data
YMSEL .equ 0C0H ; 11000000 a1=0 a0=0
YMDAT .equ 0C1H ; 11000001 a1=0 a0=1
YM2SEL .equ 0C2H ; 11000010 a1=1 a0=0
YM2DAT .equ 0C3H ; 11000011 a1=1 a0=1
PSG1REG .equ 0C6H ; Primary SN76489
PSG2REG .equ 0C7H ; Secondary SN76489
ctcbase .equ 000H ; CTC base address
YM2151_SEL1 .equ 0FEH ; Primary YM2151 register selection
YM2151_DAT1 .equ 0FFH ; Primary YM2151 register data
YM2151_SEL2 .equ 0FEH ; Secondary YM2151 register selection
YM2151_DAT2 .equ 0FFH ; Secondary YM2151 register data
FRAME_DLY .equ 13 ; Frame delay (~ 1/44100)
plt_cpuspd .equ 8 ; Non ROMWBW cpu speed default
#ENDIF
;
;------------------------------------------------------------------------------
; Your customer overrides can go in here i.e. ports
; Configure timing loop
;------------------------------------------------------------------------------
;
;RSEL .SET 09AH ; Primary AY-3-8910 Register selection
;RDAT .SET 09BH ; Primary AY-3-8910 Register data
cpu_loop: .equ 0
ctc_poll: .equ 1
ctc_int: .equ 2 ; not implemented
;
delay_type: .equ cpu_loop ; cpu timed loop or utilize ctc
delay_wait .equ 0 ; funny wait mode for ctc
;
D60 .equ 735 ; 735x60=44100 Frame delay values for ntsc
D50 .equ 882 ; 882x50=44100 Frame delay values for pal
;
;------------------------------------------------------------------------------
; Frame delay overide values for different processor speeds.
; CTC Defaults
;------------------------------------------------------------------------------
;
;FRAME_DLY .SET 10 ; 1Mhz ; not
;FRAME_DLY .SET 10 ; 2Mhz ; implemented
;FRAME_DLY .SET 10 ; 4Mhz ; yet
;FRAME_DLY .SET 15 ; 8Mhz
;FRAME_DLY .SET 10 ; 10Mhz
;FRAME_DLY .SET 20 ; 12Mhz
;
;------------------------------------------------------------------------------
; Frame delay values for pal/ntsc
;------------------------------------------------------------------------------
;
D60 .EQU 735
D50 .EQU 882
ctcdiv0 .equ 1 ; Divider chain for 3.579545MHz input
ctcdiv1 .equ 1 ; Ctc with 3 step divider base address
ctcdiv2 .equ 16
ctcdiv3 .equ 3 ; 3579545 / 1 / 2 / 41 = 43653 = 1% error
;
;------------------------------------------------------------------------------
; Processor speed control for SBCV2004+
;------------------------------------------------------------------------------
;
;#DEFINE SBCV2004 ; My SBC board at 12Mhz needs this to switch to
HB_RTCVAL .EQU 0FFEEH ; 6MHz for it to work with the ECB-VGM reliably.
RTCIO .EQU 070H
HB_RTCVAL .equ 0FFEEH ; 6MHz for it to work with the ECB-VGM reliably.
RTCIO .equ 070H
;
;------------------------------------------------------------------------------
; YM2162 Register write macros
; YM2162 Register write macros - with wait and timeout
;------------------------------------------------------------------------------
;
#DEFINE setreg(reg,val) \
@@ -132,53 +183,57 @@ RTCIO .EQU 070H
#DEFCONT \ out (YMSEL),a
#DEFCONT \ ld a,val
#DEFCONT \ out (YMDAT),a
#DEFCONT \ ld b,0
#DEFCONT \ in a,(YMSEL)
#DEFCONT \ rlca
#DEFCONT \ jp c,$-3
#DEFCONT \ jp nc,$+5
#DEFCONT \ djnz $-6
;
#DEFINE setreg2(reg,val) \
#DEFCONT \ ld a,reg
#DEFCONT \ out (YM2SEL),a
#DEFCONT \ ld a,val
#DEFCONT \ out (YM2DAT),a
#DEFCONT \ ld b,0
#DEFCONT \ in a,(YMSEL)
#DEFCONT \ rlca
#DEFCONT \ jp c,$-3
#DEFCONT \ jp nc,$+5
#DEFCONT \ djnz $-6
;------------------------------------------------------------------------------
; VGM Codes
; VGM Codes - see vgmrips.net/wiki/VGM_specification
;------------------------------------------------------------------------------
VGM_GG_W .EQU 04FH ; GAME GEAR PSG STEREO. WRITE DD TO PORT 0X06
VGM_PSG1_W .EQU 050H ; PSG (SN76489/SN76496) #1 WRITE VALUE DD
VGM_PSG2_W .EQU 030H ; PSG (SN76489/SN76496) #2 WRITE VALUE DD
VGM_YM26121_W .EQU 052H ; YM2612 #1 WRITE VALUE DD
VGM_YM26122_W .EQU 053H ; YM2612 #2 WRITE VALUE DD
VGM_WNS .EQU 061H ; WAIT N SAMPLES
VGM_W735 .EQU 062H ; WAIT 735 SAMPLES (1/60TH SECOND)
VGM_W882 .EQU 063H ; WAIT 882 SAMPLES (1/50TH SECOND)
VGM_ESD .EQU 066H ; END OF SOUND DATA
VGM_YM21511_W .EQU 054H ; YM2612 #1 WRITE VALUE DD
VGM_YM21512_W .EQU 0A4H ; YM2612 #2WRITE VALUE DD
VGM_GG_W .equ 04FH ; GAME GEAR PSG STEREO. WRITE DD TO PORT 0X06
VGM_PSG1_W .equ 050H ; PSG (SN76489/SN76496) #1 WRITE VALUE DD
VGM_PSG2_W .equ 030H ; PSG (SN76489/SN76496) #2 WRITE VALUE DD
VGM_YM26121_W .equ 052H ; YM2612 #1 WRITE VALUE DD
VGM_YM26122_W .equ 053H ; YM2612 #2 WRITE VALUE DD
VGM_WNS .equ 061H ; WAIT N SAMPLES
VGM_W735 .equ 062H ; WAIT 735 SAMPLES (1/60TH SECOND)
VGM_W882 .equ 063H ; WAIT 882 SAMPLES (1/50TH SECOND)
VGM_ESD .equ 066H ; END OF SOUND DATA
VGM_YM21511_W .equ 054H ; YM2612 #1 WRITE VALUE DD
VGM_YM21512_W .equ 0A4H ; YM2612 #2 WRITE VALUE DD
;------------------------------------------------------------------------------
; Generic CP/M definitions
;------------------------------------------------------------------------------
BOOT .EQU 0000H ; boot location
BDOS .EQU 0005H ; bdos entry point
FCB .EQU 005CH ; file control block
FCBCR .EQU FCB + 20H ; fcb current record
BUFF .EQU 0080H ; DMA buffer
TOPM .EQU 0002H ; Top of memory
BOOT .equ 0000H ; boot location
BDOS .equ 0005H ; bdos entry point
FCB .equ 005CH ; file control block
FCBCR .equ FCB + 20H ; fcb current record
BUFF .equ 0080H ; DMA buffer
TOPM .equ 0002H ; Top of memory
PRINTF .EQU 9 ; BDOS print string function
OPENF .EQU 15 ; BDOS open file function
CLOSEF .EQU 16 ; BDOS close file function
READF .EQU 20 ; BDOS sequential read function
PRINTF .equ 9 ; BDOS print string function
OPENF .equ 15 ; BDOS open file function
CLOSEF .equ 16 ; BDOS close file function
READF .equ 20 ; BDOS sequential read function
CR .EQU 0DH ; carriage return
LF .EQU 0AH ; line feed
CR .equ 0DH ; carriage return
LF .equ 0AH ; line feed
;------------------------------------------------------------------------------
; Program Start
@@ -188,12 +243,29 @@ LF .EQU 0AH ; line feed
LD (OLDSTACK),SP ; save old stack pointer
LD SP,STACK ; set new stack pointer
LD DE,MSG_WELC ; Welcome Message
CALL PRTSTR
;
#IF (delay_type==cpu_loop)
call setfdelay ; Setup the frame delay based on cpu speed
#ENDIF
;
#IF (delay_type==ctc_poll)
call cfgctc_poll ; If building for polled ctc, initialize it
#ENDIF
;
#IF (delay_type==ctc_int) ; If building for interrupt driven ctc, initialize it
call cfgctc_int
#ENDIF
;
#IF (debug)
; LD A,0 ; tone to validate presence
;TST: LD C,PSG1REG
; OUT (C),A
; LD C,PSG2REG
; OUT (C),A
; JR TST
#ENDIF
call welcome ; Welcome message and build debug info
CALL READVGM ; Read in the VGM file
CALL VGMINFO ; Check and display VGM Information
LD HL, (VGMDATA + 34H) ; Determine start of VGM
@@ -206,25 +278,63 @@ _S1 LD DE, VGMDATA + 34H
LD (VGMPOS), HL
LD HL,D60 ; VGM delay (60hz)
LD (VGMDLY), HL
LD (vdelay), HL
;
LD IX,VGM_DEV ; IX points to device mask
;
;------------------------------------------------------------------------------
; Play loop
;------------------------------------------------------------------------------
;
MAINLOOP CALL PLAY ; Play one frame
LD C,6 ; Check for keypress
LD E,0FFH
CALL BDOS
;
LD HL,KEYCHK ; Check for keypress
DEC (HL)
JR NZ,NO_CHK
;
LD C,6 ; Every 256 commands
LD E,0FFH ; because HBIOS calls
CALL BDOS ; take a long time
OR A
JR NZ,EXIT
NO_CHK:
#IF (delay_type==cpu_loop)
vdelay: .equ $+1
ld hl,vdelay
fdelay: .equ $+1
lp1: LD B,FRAME_DLY ; 44100 one frame = 0.0000226757 seconds
DJNZ $
DEC HL
LD A,H
OR L
JP NZ,lp1 ; Normally NZ so jp is faster
#ENDIF
;
#IF (delay_type==ctc_poll)
vdelay: .equ $+1
ld hl,vdelay ; Frame delay
lp1: in a,(ctcch3) ; wait for counter to reach zero
dec a
jr nz,lp1
#IF (delay_wait)
lp2: in a,(ctcch3) ; wait for counter to pass zero
dec a
jr z,lp2
LD HL,(VGMDLY) ; Frame delay
L1 LD B,FRAME_DLY
DJNZ $
DEC HL
LD A,H
OR L
JR NZ,L1
JR MAINLOOP
lp3: in a,(ctcch3) ; wait for counter to reach zero
dec a
jr nz,lp3
#ENDIF
DEC HL
LD A,H
OR L
JP NZ,lp1 ; Normally NZ so jp is faster
#ENDIF
;
#IF (delay_type==ctc_int)
#ENDIF
;
JP MAINLOOP
;
;------------------------------------------------------------------------------
; Program Exit
@@ -240,6 +350,194 @@ EXIT: CALL VGMDEVICES ; Display devices used
EXIT_ERR: CALL PRTSTR ; Generic message or error
LD SP, (OLDSTACK) ; Exit to CP/M
RST 00H
DI
HALT
;
;------------------------------------------------------------------------------
; Welcome
;------------------------------------------------------------------------------
;
welcome: LD DE,MSG_WELC ; Welcome Message
CALL PRTSTR
;
#IF (plt_romwbw)
LD DE,MSG_ROMWBW ; display system type
CALL PRTSTR
#ENDIF
;
LD A,delay_type ; display build type
LD DE,MSG_CPU
CALL PRTIDXDEA
;
LD A,plt_type ; display system type
LD DE,MSG_CUSTOM
CALL PRTIDXDEA
call CRLF
;
#IF (debug)
#IF (delay_type==cpu_loop)
ld a,'f' ; Display frame rate delay
call PRTCHR
call PRTDOT
ld a,(fdelay)
call PRTDECB
LD A,' '
#ENDIF
CALL PRTCHR
ld a,'c'
call PRTCHR
call PRTDOT
ld a,ctcdiv0 ; Display ctc divider values
call PRTDECB
CALL PRTDOT
ld a,ctcdiv1
call PRTDECB
CALL PRTDOT
ld a,ctcdiv2
call PRTDECB
CALL PRTDOT
ld a,ctcdiv3
call PRTDECB
;
#IF (delay_wait)
ld a,' '
CALL PRTCHR
LD A,'w' ; Display if using double wait
CALL PRTCHR
#ENDIF
#ENDIF
CALL CRLF
ret
;
;------------------------------------------------------------------------------
; Setup frame delay value - Loop count for DJNZ $ loop
;------------------------------------------------------------------------------
;
setfdelay:
#IF (delay_type==cpu_loop)
#IF (plt_romwbw)
LD BC,$F8F0 ; GET CPU SPEED
RST 08 ; FROM HBIOS
LD A,L ;
#ELSE
ld a,plt_cpuspd ; USE STANDALONE CPU SPEED
#ENDIF
LD HL,CLKTBL-1 ; CPU SPEED
ADD A,L ; INDEXES
LD L,A ; INTO
ADC A,H ; TABLE
SUB L
LD H,A ; LOOK IT UP IN THE
LD A,(HL) ; CLOCK TABLE
LD (fdelay),A ; SAVE LOOP COUNTER FOR CPU SPEED
RET
;------------------------------------------------------------------------------
; Frame delay values for different processor speeds.
;------------------------------------------------------------------------------
;
; 1/44100hz = 22676ns
; 16Mhz = 62.5ns : DJNZ $ = 1 frame delay= 22676ns/13*62.5ns = 27.91
; 12Mhz = 83.3ns : DJNZ $ = 1 frame delay= 22676ns/13*83.3ns = 20.94
; 10Mhz = 100ns : DJNZ $ = 1 frame delay= 22676ns/13*100ns = 17.44
; 8Mhz = 125ns : DJNZ $ = 1 frame delay= 22676ns/13*125ns = 13.95
; 7.3728Mhz = 135.6ns : DJNZ $ = 1 frame delay= 22676ns/13*135.6ns = 12.86
; 6Mhz = 166.6s : DJNZ $ = 1 frame delay= 22676ns/13*166.6ns = 10.47
; 4Mhz = 250ns : DJNZ $ = 1 frame delay= 22676ns/13*250ns = 6.98
; 2Mhz = 500ns : DJNZ $ = 1 frame delay= 22676ns/13*500ns = 3.49
; 1Mhz = 1000ns : DJNZ $ = 1 frame delay= 22676ns/13*1000ns = 1.74
;
CLKTBL: .DB 1 ; 1Mhz ; none of these
.DB 3 ; 2Mhz ; have been
.DB 0 ; 3Mhz ; validated
.DB 6 ; 4Mhz
.DB 0 ; 5Mhz
.DB 10 ; 6Mhz
.DB 12 ; 7Mhz 7.3728Mhz
.DB 13 ; 8Mhz
.DB 0 ; 9Mhz
.DB 17 ; 10Mhz
.DB 0 ; 11Mhz
.DB 20 ; 12Mhz
.DB 0 ; 13Mhz
.DB 0 ; 14Mhz
.DB 0 ; 15Mhz
.DB 27 ; 16Mhz
.DB 0 ; 17Mhz
.DB 0 ; 18Mhz
.DB 0 ; 19Mhz
.DB 0 ; 20Mhz
#ENDIF
;
;------------------------------------------------------------------------------
; Initialize CTC
;------------------------------------------------------------------------------
;
; %01010011 ; CTC DEFAULT CONFIG
; %01010111 ; CTC COUNTER MODE CONFIG
; %11010111 ; CTC COUNTER INTERRUPT MODE CONFIG
; |||||||+-- CONTROL WORD FLAG
; ||||||+--- SOFTWARE RESET
; |||||+---- TIME CONSTANT FOLLOWS
; ||||+----- AUTO TRIGGER WHEN TIME CONST LOADED
; |||+------ RISING EDGE TRIGGER
; ||+------- TIMER MODE PRESCALER (0=16, 1=256)
; |+-------- COUNTER MODE
; +--------- INTERRUPT ENABLE
;
cfgctc_poll:
;
ctcch0 .equ ctcbase
ctcch1 .equ ctcbase+1
ctcch2 .equ ctcbase+2
ctcch3 .equ ctcbase+3
;
ctccfg0 .equ %01010011
ctccfg1 .equ %01010111
ctccfg2 .equ %01010111
ctccfg3 .equ %01010111
;
ld a,ctccfg0 & $7f ; ; Channel 0
out (ctcch0),a
;
ld a,ctccfg1 & $7f ; Channel 1
out (ctcch1),a ;
ld a,ctcdiv1 & $ff ;
out (ctcch1),a ;
;
ld a,ctccfg2 & $7f ; Channel 2
out (ctcch2),a ;
ld a,ctcdiv2 & $ff ;
out (ctcch2),a ;
;
ld a,ctccfg3 & $7f ; Channel 3
out (ctcch3),a ;
ld a,ctcdiv3 & $ff ;
out (ctcch3),a ;
;
ret
;
#IF (debug)
ctctest:
ld b,0
ctclp1: in a,(ctcch3) ; wait for counter to reach zero
dec a
jr nz,ctclp1
ctclp2: in a,(ctcch3) ; wait for counter to pass zero
dec a
jr z,ctclp2
call PRTDOT
;
djnz ctclp1
#ENDIF
ret
;
cfgctc_int:
ret
;
;------------------------------------------------------------------------------
; Read VGM file into memory
@@ -396,7 +694,6 @@ PLAY
#IFDEF SBCV2004
CALL SLOWIO
#ENDIF
LD IX,VGM_DEV
LD HL, (VGMPOS) ; Start processing VGM commands
NEXT LD A, (HL)
INC HL
@@ -406,19 +703,14 @@ NEXT LD A, (HL)
LD HL, (VGMDATA + 1CH) ; Loop offset
LD A, H
OR L
JP Z, EXIT
JP Z, EXIT
LD DE, VGMDATA + 1CH
ADD HL, DE
LD (VGMPOS), HL
JR NEXT
NEXT1 CP VGM_GG_W ; Game Gear SN76489 stereo. Ignored
JR NZ, PSG
LD IX,VGM_DEV
SET 0,(IX+1)
INC HL
JR NEXT
NEXT1:
;
; SN76489 SECTION
PSG CP VGM_PSG1_W ; Write byte to SN76489.
@@ -426,7 +718,6 @@ PSG CP VGM_PSG1_W ; Write byte to SN76489.
LD A, (HL)
INC HL
OUT (PSG1REG), A
LD IX,VGM_DEV
SET 0,(IX+0)
JR NEXT
@@ -435,7 +726,6 @@ PSG2 CP VGM_PSG2_W ; Write byte to second SN76489.
LD A, (HL)
INC HL
OUT (PSG2REG), A
LD IX,VGM_DEV
SET 1,(IX+0)
JR NEXT
@@ -452,19 +742,17 @@ AY CP 0A0H
LD A, (HL)
INC HL
OUT (RDAT2), A
LD IX,VGM_DEV
SET 2,(IX+0)
JR NEXT
AY1 OUT (RSEL), A
LD A, (HL)
INC HL
OUT (RDAT), A
LD IX,VGM_DEV
SET 3,(IX+0)
JR NEXT
;
; YM2612 SECTION
;
YM2162_1 CP VGM_YM26121_W
JR NZ, YM2162_2
LD A,(HL)
@@ -473,7 +761,6 @@ YM2162_1 CP VGM_YM26121_W
LD A,(HL)
OUT (YMDAT),A
INC HL
LD IX,VGM_DEV
SET 4,(IX+0)
JP NEXT
;
@@ -485,12 +772,11 @@ YM2162_2 CP VGM_YM26122_W
LD A,(HL)
OUT (YM2DAT),A
INC HL
LD IX,VGM_DEV
SET 4,(IX+0) ; 2nd channel
JP NEXT
;
; YM2151 SECTION
;
YM2151_1 CP VGM_YM21511_W
JR NZ,YM2151_2
LD A,(HL)
@@ -499,21 +785,27 @@ YM2151_1 CP VGM_YM21511_W
LD A,(HL)
OUT (YM2151_DAT1),A
INC HL
LD IX,VGM_DEV
SET 6,(IX+0)
JP NEXT
;
YM2151_2 CP VGM_YM21512_W
JR NZ,WAITNN
JR NZ,GG
LD A,(HL)
OUT (YM2151_SEL2),A
INC HL
LD A,(HL)
OUT (YM2151_DAT2),A
INC HL
LD IX,VGM_DEV
SET 7,(IX+0)
JP NEXT
;
; GAME GEAR SN76489 STEREO SECTION
;
GG: CP VGM_GG_W ; Stereo steering port value
JR NZ, WAITNN
; SET 0,(IX+1)
INC HL
JP NEXT
;
WAITNN CP VGM_WNS ; Wait nn samples
JR NZ, WAIT60
@@ -524,36 +816,43 @@ WAITNN CP VGM_WNS ; Wait nn samples
LD (VGMPOS), HL
LD L, A
LD H, D
LD (VGMDLY), HL
LD (vdelay), HL
RET
;
WAIT60 CP VGM_W735 ; Wait 735 samples (60Hz)
JR NZ, WAIT50
LD (VGMPOS), HL
LD HL, D60
LD (VGMDLY), HL
LD (vdelay), HL
RET
;
WAIT50 CP VGM_W882 ; Wait 882 samples (50Hz)
JR NZ, WAIT1
LD (VGMPOS), HL
LD HL, D50
LD (VGMDLY), HL
WAIT50: CP VGM_W882 ; Wait 882 samples (50Hz)
JR NZ, WAIT1
LD (VGMPOS), HL
LD HL, D50
LD (vdelay), HL
RET
;
WAIT1 CP 70H ; WAIT 0-15 SAMPLES
WAIT1: CP 70H ; WAIT 0-15 SAMPLES
JR C, UNK ; CODES 70-7FH
CP 80H
JP NC, UNK
SUB 6FH
LD L, A
LD H, 0
LD (VGMDLY), HL
LD (vdelay), HL
RET
;
UNK LD IX,VGM_DEV ; Set flag for
SET 0,(IX+1) ; unknown device
UNK: SET 0,(IX+1) ; unknown device
INC HL ; Try and skip
#IF (debug)
ld a,'u' ; Display unknow command
call PRTCHR
call PRTDOT
call PRTHEX
ld a,' '
call PRTCHR
#ENDIF
JP NEXT
;
;------------------------------------------------------------------------------
@@ -609,12 +908,6 @@ CHKDEV: AND %00000011 ; Display
CALL PRTCHR ; Skip if not
CALL PRTSTR ; used.
RET
DEBUG: PUSH AF
LD A,'*'
CALL PRTCHR
POP AF
RET
;
;------------------------------------------------------------------------------
; Mute Devices.
@@ -939,6 +1232,28 @@ FASTIO:
RET
;
;------------------------------------------------------------------------------
; PRINT THE nTH STRING IN A LIST OF STRINGS WHERE EACH IS TERMINATED BY 0
; A REGISTER DEFINES THE nTH STRING IN THE LIST TO PRINT AND DE POINTS
; TO THE START OF THE STRING LIST.
;------------------------------------------------------------------------------
;
PRTIDXDEA:
LD C,A
OR A
PRTIDXDEA1:
JR Z,PRTIDXDEA3 ; FOUND TARGET SO EXIT
PRTIDXDEA2:
LD A,(DE) ; LOOP UNIT
INC DE ; WE REACH
OR A ; END OF STRING
JR NZ,PRTIDXDEA2
DEC C ; AT STRING END. SO GO
JR PRTIDXDEA1 ; CHECK FOR INDEX MATCH
PRTIDXDEA3:
CALL PRTSTR ; DISPLAY THE STRING
RET
;
;------------------------------------------------------------------------------
; External routines.
;------------------------------------------------------------------------------
;
@@ -948,8 +1263,8 @@ FASTIO:
; Strings and constants.
;------------------------------------------------------------------------------
;
MSG_WELC: .DB "VGM Player for RomWBW v0.3, 2-Jul-2022",CR,LF
; .DB "J.B. Langston/Marco Maccaferri/Phil Summers",CR,LF
MSG_WELC: .DB "VGM Player v0.4, 11-Dec-2022"
; .DB CR,LF, "J.B. Langston/Marco Maccaferri/Ed Brindley/Phil Summers",CR,LF
.DB 0
MSG_BADF: .DB "Not a VGM file",CR,LF,0
MSG_PO .DB "Played on : ",0
@@ -963,17 +1278,33 @@ MSG_NOFILE: .DB "File not found", CR, LF, 0
MSG_MEM: .DB "File to big", CR, LF, 0
MSG_TITLE: .DB " from: ",0
MSG_TRACK .DB "Playing: ",0
MSG_CPU .DB "[cpu]",0
MSG_CTCPOLL .DB "[ctc polled]",0
MSG_CTCINT .DB "[ctc interrupts]",0
MSG_ROMWBW .DB " [romwbw] ",0
MSG_CUSTOM .DB " [custom] ",0
MSG_P8X180 .DB " [p8x180] ",0
MSG_RC2014 .DB " [rc2014] ",0
MSG_SBCECB .DB " [sbc] ",0
MSG_MBC .DB " [mbc] ",0
;
;------------------------------------------------------------------------------
; Variables
;------------------------------------------------------------------------------
;
VGMPOS .DW 0
VGMDLY .DW 0
VGMUNK_F .DB 0 ; Flag for unknown device
VGM_DEV .DB %00000000 ; yyYYAASS
.DB %00000000 ; Unimplemented device flags
;VGMDLY .DW 0 ; Saves number of frames to delay
KEYCHK .DB 0 ; Counter for keypress checks
;
VGM_DEV .DB %00000000 ; IX+0 Flags for devices
; xx...... ym2151 1 & 2
; ..x..... ym2612 2 (not supported)
; ...x.... ym2612 1
; ....xx.. ay-3-8910 1 & 2
; ......xx sn76489 1 & 2
.DB %00000000 ; IX+1 Unimplemented device flags & future devices
;
OLDSTACK .DW 0 ; original stack pointer
.DS 40H ; space for stack
STACK ; top of stack

View File

@@ -5,39 +5,70 @@ Simple player for VGM (Video Game Music) files.
Usage:
VGMPLAY MUSIC.VGM
VGMPLAY MUSIC[.VGM]
Default Ports:
Press a key to exit the program.
D8H-D0H - First AY-3-8910 (RSEL/RDAT)
A0H-A1H - Second AY-3-8910
FFH - First SN76489
FBH - Second SN76489
C6H-C7H - YM2612/YM3484
Supported devices
=================
If your system uses different ports you need to recompile the source.
SN76489
AY-3-89810
YM2612/YM3484
YM2151
Note: The player should be compatible with VGM files up to version 1.51
but there are very few controls (if any) in the code, be sure to have
a good VGM file that doesn't contain much extra data. These files can be
very big, the player is limited to the available TPA space which is
typically around 54-55k, bigger files will overwrite the CP/M code and/or
wrap around the 64k limit.
Supported platforms
===================
The played is designed to run on a standard RC2014 with a 7.3728 MHz clock,
if your system uses a different clock you need to adjust the frame delay accordingly.
VGM Player is currently being developed on the ROMWBW platform using the Retrobrew computers
EBC-SBC-V2 (Z80), ECB-SCG (AY-3-8910) and ECB-VGM (YM2612 and 2xSN76489) board.
It can be configured to run with other hardware such as RC2014, P8X180 and nhyodyne MBC.
VGM files can be very big and are limited in size by the available TPA space, which is typically 52k.
Processor speed affects the playback speed. Under ROMWBW the player will detect the cpu speed configuration
and adjust timing loops. For other platforms, default speeds are configured but may need to be changed
to suit your hardware. Counter/Timer hardware may be supported in future.
Example Music Files
===================
LEMMIN01.VGM - SN76489 - Lemmings: Title Screen
PENGUI03.VGM - AY-3-8910 - Penguin Adventure: Forest Path
PITFAL02.VGM - 2xSN76489 - Pitfall II: Scene 1
TIGER02.VGM - 2xAY-3-8910 - Tiger Hely: First Mission
WONDER01.VGM - 2xSN76489 - Wonder Boy in Monster Land
FILTHY01.VGM - YM3484 - Columns : Filthy
ITSGAMOV.VGM - YM3484+SN76489 - Puyo Puyo Tsuu : It's Game Over!
ENDING.VGM - AY-3-8910 * Puyo Puyo: Ending (Unused) : 24K
QIX.VGM - AY-3-8910 - Super Qix: Main BGM 2 : 28K
AGGRESS.VGM - AY-3-8910 - Rastan Saga: Aggressive World : 32K
PENGUI03.VGM - AY-3-8910 - Penguin Adventure: Forest Path : 44K
TIGER02.VGM - 2xAY-3-8910 - Tiger Hely: First Mission : 28K
BGM.VGM - 2xAY-3-8910 * SHM: BGM : 8K
LEMMIN01.VGM - SN76489 - Lemmings: Title Screen : 44K
TEDDY.VGM - 2xSN76489 - TeddyBoy Blues: Title ~ Main Theme : 52K
PITFAL02.VGM - 2xSN76489 - Pitfall II: Scene 1 : 16K
WONDER01.VGM - 2xSN76489 * Wonder Boy in Monster Land: Monster Land : 40K
DESCENT.VGM - SN76489+YM2612 - Flashback: The Quest for Identity: Descent into the Tunnels : 40K
SHIRAKAW.VGM - SN76489+YM2612 * Jantei Monogatari: St. Shirakawa University : 32K
ANNA.VGM - SN76489+YM2612 - Jantei Monogatari: Anna : 32K
FIELDMAP.VGM - SN76489+YM2612 - Taikou Risshiden: Field Map: Summer : 8K
ITSGAMOV.VGM - SN76489+YM2612 - Puyo Puyo Tsuu: It's Game Over! : 16K
STARTDEM.VGN - 2xSN76489+AY-3-8910 * Exed Exes / Savage Bees: Start Demo ~Main BGM : 32K
INCHINA.VGM - YM2612 * Double Dragon 3: The Rosetta Stone: In China : 44K
Original Source by J.B Langston, Marco Maccaferri
ROMWBW + YM2612/YM3484 version by Phil Summers
* Included in disk images
VGM sources
===========
https://www.smspower.org/forums/15359-VGMPacksGameGearMegaCollection
https://vgmrips.net/packs/chip/ym2612
https://project2612.org/
VGM Tools
=========
https://vgmrips.net/wiki/VGMTool
https://github.com/vgmrips/vgmtools
References
==========
http://www.primrosebank.net/computers/mtx/tools/PD/vgmplayer.zip - Paul Daniels MTX SN76489 interrupt version with embedded VGM tune.
https://github.com/jblang/SN76489/blob/master/examples/vgmplayer.asm - J.B. Langston RC2014 polled version with file loading.
https://groups.google.com/g/rc2014-z80/c/9nHnETJzGKU - Marco Maccaferri P8X180 & AY-3-8910 support
https://github.com/electrified/rc2014-ym2151/tree/main/software/vgmplay - Ed Brindly RC2014 & YM2151 support
ROMWBW version by Phil Summers. VGM Player is still in development. The ECB-VGM is also still under development.

View File

@@ -0,0 +1,779 @@
;
;------------------------------------------------------------------------------
; Simple Z80 FM Music Driver.
; Adapted from https://github.com/michaelcmartin/bumbershoot/genesis/fm_mus.asm
;------------------------------------------------------------------------------
;
; A song in this system is a series of records, where each record
; begins with a byte for the number of frames this record lasts,
; followed by a byte for the number of register writes to the first
; block of FM registers, followed by that many pairs of (register,
; value) bytes.
; When a zero byte is reached for a record length, the playback
; loops back to the "segno" label.
;
; Song data is created from a Music Macro Language score (mml)
; by the makebach.py script
;
;------------------------------------------------------------------------------
; Device and system specific definitions
;------------------------------------------------------------------------------
;
custom .equ 0 ; System configurations
sbcecb .equ 1
MBC .equ 2
;
plt_romwbw .equ 1 ; Build for ROMWBW?
plt_type .equ sbcecb ; Select build configuration
plt_cpuspd .equ 6 ; Non ROMWBW cpu speed default
debug .equ 0
ctc_delay .equ 0
;
.org 100H
;
BDOS .equ 0005h
;
YMSEL .equ $c0
YMDAT .equ $c1
ctcbase .equ $cc
;
;------------------------------------------------------------------------------
; Initialize sound chip and ctc etc
;------------------------------------------------------------------------------
;
init:
#IF (debug)
call ym_init
#ENDIF
#IF (ctc_delay)
call ctc_config
#ENDIF
;
;------------------------------------------------------------------------------
; Main loop
;------------------------------------------------------------------------------
;
mloop: LD C, 6 ; check for keypress
LD E, 0FFH
CALL 5
OR A
JP NZ,0
;
call ploop ; PLAY
jp z,0
;
ld hl,$1000 ; DELAY
dlp: dec hl
ld a,h
or l
jr nz,dlp
;
jr mloop
;
;------------------------------------------------------------------------------
; Play loop
;------------------------------------------------------------------------------
;
ploop: ld hl, wait ; HAVE WE REACHED THE
dec (hl) ; LAST FRAME
ret nz
ld hl, (ptr) ; POINT TO START OF SONG
ld a, (hl) ; GET NO OF FRAMES
and a ;
ret z
; jr nz, nolp
;
; ld a,'@'
; call PRTCHR
;
; ld hl, segno ; POINT TO CURRENT SEGMENT
; ld a, (hl) ; GET FRAME COUNT
nolp: ld (wait), a ; AND SAVE IT
inc hl
call PRTHEX
call PRTDOT
ld b, (hl) ; GET NUMBER OF REGISTER PAIRS TO WRITE
inc hl ; POINT TO REGISTER
ld a,b
call PRTHEX
call PRTDOT
rlp: ld a, (hl) ; SELECT REGISTER
out (YMSEL),a
call PRTHEX
inc hl ; GET VALUE
ld a, (hl)
call PRTHEX
inc hl
out (YMDAT),a ; WRITE THE VALUE
djnz rlp ; DO ALL THE PAIRS IN THIS SEGMENT
ld (ptr), hl ; SAVE WHERE WE ARE AT
call CRLF
ret
;
;------------------------------------------------------------------------------
; CTC initialization
;------------------------------------------------------------------------------
;
ctc_config:
; ld b,4 ; 4 channels
; ld c,ctcbase ; first channel port
;ctc_lp: ld a,ctc_defcfg ; ctc default config
; out (c),a ; ctc command
; inc c ; next channel port
; djnz ctc_lp
; ld hl,hb_timint ; TIMER INT HANDLER ADR
; ld (ivt(ctctivt)),hl
;
; ld a,int_ctc0a * 2
out (ctcbase),a ; SETUP CTC BASE INT VECTOR
;
ctcch0 .equ ctcbase
ctcch1 .equ ctcbase+1
ctcch2 .equ ctcbase+2
ctcch3 .equ ctcbase+3
ctccfg0 .equ %01010011
ctccfg1 .equ %01010111
ctccfg2 .equ %01010111
ctccfg3 .equ %01010111
ctcdiv0 .equ 1 ; 3.579545MHz input 60Hz timer tick
ctcdiv1 .equ 8
ctcdiv2 .equ 0
ctcdiv3 .equ 29
;ctcdiv0 .equ 1 ; 3.579545MHz input 50Hz timer tick
;ctcdiv1 .equ 8
;ctcdiv2 .equ 0
;ctcdiv3 .equ 34
;ctcdiv0 .equ 1 ; 3.579545MHz input 44100z timer tick
;ctcdiv1 .equ 1
;ctcdiv2 .equ 1
;ctcdiv3 .equ 81
ld a,ctccfg0 & $7f ; ; Channel 0
out (ctcch0),a
;
ld a,ctccfg1 & $7f ; Channel 1
out (ctcch1),a ;
ld a,ctcdiv1 & $ff ;
out (ctcch1),a ;
;
ld a,ctccfg2 & $7f ; Channel 2
out (ctcch2),a ;
ld a,ctcdiv2 & $ff ;
out (ctcch2),a ;
;
ld a,ctccfg3 & $7f ; Channel 3
out (ctcch3),a ;
ld a,ctcdiv3 & $ff ;
out (ctcch3),a ;
;
ret
;
ptr: .dw song
wait: .db $01
;
;------------------------------------------------------------------------------
; YM2612 initialization - not required if included in song data
;------------------------------------------------------------------------------
;
#DEFINE setreg(reg,val) \
#DEFCONT \ ld a,reg
#DEFCONT \ out (YMSEL),a
#DEFCONT \ ld a,val
#DEFCONT \ out (YMDAT),a
#DEFCONT \ ld b,0
#DEFCONT \ in a,(YMSEL)
#DEFCONT \ rlca
#DEFCONT \ jp nc,$+5
#DEFCONT \ djnz $-6
;
ym_init:
setreg($22,$00) ; lfo off
setreg($27,$00) ; note off ch 0
setreg($28,$01) ; note off ch 1
setreg($28,$02) ; note off ch 2
setreg($28,$03) ; note off ch 3
setreg($28,$04) ; note off ch 4
setreg($28,$05) ; note off ch 5
setreg($28,$06) ; note off ch 6
setreg($28,$01) ; note off ch 1
setreg($2b,$00) ; dac off
setreg($30,$71)
setreg($34,$0d)
setreg($38,$33)
setreg($3c,$01) ; dt1/mul
setreg($40,$23)
setreg($44,$2d)
setreg($48,$26)
setreg($4c,$00) ; total level
setreg($50,$5f)
setreg($54,$99)
setreg($58,$5f)
setreg($5c,$94) ; rs/ar
setreg($60,$05)
setreg($64,$05)
setreg($68,$05)
setreg($6c,$07) ; am/dir
setreg($70,$02)
setreg($74,$02)
setreg($78,$02)
setreg($7c,$02) ; d2r
setreg($80,$11)
setreg($84,$11)
setreg($88,$11)
setreg($8c,$a6) ; d1l/rr
setreg($90,$00)
setreg($94,$00)
setreg($98,$00)
setreg($9c,$00) ; proprietary
setreg($b0,$32) ; feedback/algorithm
setreg($b4,$c0) ; both speakers on
setreg($28,$00) ; key off
setreg($a4,$22)
setreg($a0,$69) ; set frequency
;
ret
;
;------------------------------------------------------------------------------
; Example breakdown of first section, which is initialization
;------------------------------------------------------------------------------
;
; BYTE NUMBER OF FRAMES
; BYTE NUMBER OF REGISTER WRITES
; BYTE REGISTER
; BYTE VALUE
;
; CNT $0D 13 frames
; $42 66 register writes (132 BYTES)
; 2 $30,$71 dac
; 4 $34,$0D dac
; 6 $38,$33 dac
; 8 $3C,$01 dt1/mul
; 10 $40,$23 dt1/mul
; 12 $44,$2D dt1/mul
; 14 $48,$26 dt1/mul
; 16 $4C,$00 total level
; 18 $50,$5F total level
; 20 $54,$99 total level
; 22 $58,$5F total level
; 24 $5C,$94 rs/ar
; 26 $60,$05 rs/ar
; 28 $64,$05 rs/ar
; 30 $68,$05 rs/ar
; 32 $6C,$07 am/dir
; 34 $70,$02 am/dir
; 36 $74,$02 am/dir
; 38 $78,$02 am/dir
; 40 $7c,$02 d2r
; 42 $80,$11 d2r
; 44 $84,$11 d2r
; 46 $88,$11 d2r
; 48 $8C,$A6
; 50 $90,$00
; 52 $94,$00
; 54 $98,$00
; 56 $9C,$00
; 58 $B0,$32
; 60 $B4,$C0
; 62 $31,$71
; 64 $35,$0D
; 66 $39,$33
; 68 $3D,$01
; 70 $41,$23
; 72 $45,$2D
; 74 $49,$26
; 76 $4D,$00
; 78 $51,$5F
; 80 $55,$99
; 82 $59,$5F
; 84 $5D,$94
; 86 $61,$05
; 88 $65,$05
; 90 $69,$05
; 92 $6D,$07
; 94 $71,$02
; 96 $75,$02
; 98 $79,$02
; 100 $7D,$02
; 102 $81,$11
; 104 $85,$11
; 106 $89,$11
; 108 $8D,$A6
; 110 $91,$00
; 112 $95,$00
; 114 $99,$00
; 116 $9D,$00
; 118 $B0,$32
; 120 $B4,$C0
; 122 $A4,$17
; 124 $A0,$89
; 126 $28,$F0
; 128 $A5,$0F
; 130 $A1,$89
; 132 $28,$F1
;
;------------------------------------------------------------------------------
; Song data created from Music Macro Language (mml) by makebach
;------------------------------------------------------------------------------
;
song:
segno: .db $0D,$42,$30,$71,$34,$0D,$38,$33,$3C,$01,$40,$23,$44,$2D,$48,$26
.db $4C,$00,$50,$5F,$54,$99,$58,$5F,$5C,$94,$60,$05,$64,$05,$68,$05
.db $6C,$07,$70,$02,$74,$02,$78,$02,$7C,$02,$80,$11,$84,$11,$88,$11
.db $8C,$A6,$90,$00,$94,$00,$98,$00,$9C,$00,$B0,$32,$B4,$C0,$31,$71
.db $35,$0D,$39,$33,$3D,$01,$41,$23,$45,$2D,$49,$26,$4D,$00,$51,$5F
.db $55,$99,$59,$5F,$5D,$94,$61,$05,$65,$05,$69,$05,$6D,$07,$71,$02
.db $75,$02,$79,$02,$7D,$02,$81,$11,$85,$11,$89,$11,$8D,$A6,$91,$00
.db $95,$00,$99,$00,$9D,$00,$B0,$32,$B4,$C0,$A4,$17,$A0,$89,$28,$F0
.db $A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00,$0D,$03,$A4,$1C,$A0,$BF
.db $28,$F0,$02,$01,$28,$00,$0D,$03,$A4,$1D,$A0,$A5,$28,$F0,$02,$01
.db $28,$00,$07,$03,$A4,$1F,$A0,$89,$28,$F0,$06,$01,$28,$01,$02,$01
.db $28,$00,$0D,$06,$A4,$1C,$A0,$3B,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1
.db $02,$01,$28,$00,$0B,$03,$A4,$1F,$A0,$1D,$28,$F0,$02,$01,$28,$01
.db $02,$01,$28,$00,$0D,$06,$A4,$1F,$A0,$89,$28,$F0,$A5,$07,$A1,$89
.db $28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1,$02,$01
.db $28,$00,$02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D
.db $A1,$A5,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0F,$A1,$89,$28,$F1
.db $02,$01,$28,$00,$02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0
.db $A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0C,$A1,$BF
.db $28,$F1,$02,$01,$28,$00,$02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89
.db $28,$F0,$A5,$07,$A1,$89,$28,$F1,$02,$01,$28,$00,$0D,$03,$A4,$1C
.db $A0,$BF,$28,$F0,$02,$01,$28,$00,$0D,$03,$A4,$1D,$A0,$A5,$28,$F0
.db $02,$01,$28,$00,$07,$03,$A4,$1F,$A0,$89,$28,$F0,$06,$01,$28,$01
.db $02,$01,$28,$00,$0D,$06,$A4,$1C,$A0,$3B,$28,$F0,$A5,$0D,$A1,$A5
.db $28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1F,$A0,$1D,$28,$F0,$02,$01
.db $28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1F,$A0,$89,$28,$F0,$A5,$07
.db $A1,$89,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1
.db $02,$01,$28,$00,$02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0
.db $A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0F,$A1,$89
.db $28,$F1,$02,$01,$28,$00,$02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89
.db $28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0C
.db $A1,$BF,$28,$F1,$02,$01,$28,$00,$02,$01,$28,$01,$1A,$06,$A4,$1E
.db $A0,$56,$28,$F0,$A5,$0D,$A1,$08,$28,$F1,$04,$02,$28,$00,$28,$01
.db $1A,$06,$A4,$1E,$A0,$56,$28,$F0,$A5,$0F,$A1,$89,$28,$F1,$04,$02
.db $28,$00,$28,$01,$0D,$06,$A4,$1E,$A0,$56,$28,$F0,$A5,$0D,$A1,$08
.db $28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1F,$A0,$89,$28,$F0,$02,$01
.db $28,$01,$02,$01,$28,$00,$1A,$06,$A4,$1D,$A0,$A5,$28,$F0,$A5,$0C
.db $A1,$BF,$28,$F1,$04,$02,$28,$00,$28,$01,$1A,$06,$A4,$1D,$A0,$A5
.db $28,$F0,$A5,$0F,$A1,$89,$28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06
.db $A4,$1D,$A0,$A5,$28,$F0,$A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00
.db $0B,$03,$A4,$1F,$A0,$89,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00
.db $1A,$06,$A4,$1D,$A0,$08,$28,$F0,$A5,$0C,$A1,$3B,$28,$F1,$04,$02
.db $28,$00,$28,$01,$0D,$06,$A4,$1D,$A0,$A5,$28,$F0,$A5,$0F,$A1,$1D
.db $28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1D,$A0,$08,$28,$F0,$02,$01
.db $28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1C,$A0,$BF,$28,$F0,$A5,$0F
.db $A1,$89,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1D,$A0,$08,$28,$F0
.db $02,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1C,$A0,$3B,$28,$F0
.db $A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$01,$0D,$03,$A5,$0E,$A1,$56
.db $28,$F1,$02,$01,$28,$01,$0D,$03,$A5,$0F,$A1,$1D,$28,$F1,$02,$01
.db $28,$01,$0D,$03,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$01,$0D,$03
.db $A5,$0E,$A1,$56,$28,$F1,$02,$01,$28,$01,$03,$03,$A5,$0F,$A1,$1D
.db $28,$F1,$0A,$01,$28,$00,$02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89
.db $28,$F0,$A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00,$0D,$03,$A4,$1C
.db $A0,$BF,$28,$F0,$02,$01,$28,$00,$0D,$03,$A4,$1D,$A0,$A5,$28,$F0
.db $02,$01,$28,$00,$07,$03,$A4,$1F,$A0,$89,$28,$F0,$06,$01,$28,$01
.db $02,$01,$28,$00,$0D,$06,$A4,$1C,$A0,$3B,$28,$F0,$A5,$0D,$A1,$A5
.db $28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1F,$A0,$1D,$28,$F0,$02,$01
.db $28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1F,$A0,$89,$28,$F0,$A5,$07
.db $A1,$89,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1
.db $02,$01,$28,$00,$02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0
.db $A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0F,$A1,$89
.db $28,$F1,$02,$01,$28,$00,$02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89
.db $28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0C
.db $A1,$BF,$28,$F1,$02,$01,$28,$00,$02,$01,$28,$01,$0D,$06,$A4,$17
.db $A0,$89,$28,$F0,$A5,$07,$A1,$89,$28,$F1,$02,$01,$28,$00,$0D,$03
.db $A4,$1C,$A0,$BF,$28,$F0,$02,$01,$28,$00,$0D,$03,$A4,$1D,$A0,$A5
.db $28,$F0,$02,$01,$28,$00,$07,$03,$A4,$1F,$A0,$89,$28,$F0,$06,$01
.db $28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1C,$A0,$3B,$28,$F0,$A5,$0D
.db $A1,$A5,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1F,$A0,$1D,$28,$F0
.db $02,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1F,$A0,$89,$28,$F0
.db $A5,$07,$A1,$89,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0C,$A1,$BF
.db $28,$F1,$02,$01,$28,$00,$02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89
.db $28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0F
.db $A1,$89,$28,$F1,$02,$01,$28,$00,$02,$01,$28,$01,$0D,$06,$A4,$17
.db $A0,$89,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$01,$0B,$03
.db $A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00,$02,$01,$28,$01,$1A,$06
.db $A4,$1E,$A0,$56,$28,$F0,$A5,$0D,$A1,$08,$28,$F1,$04,$02,$28,$00
.db $28,$01,$0D,$06,$A4,$1D,$A0,$A5,$28,$F0,$A5,$0E,$A1,$56,$28,$F1
.db $02,$01,$28,$00,$0B,$03,$A4,$1D,$A0,$08,$28,$F0,$02,$01,$28,$01
.db $02,$01,$28,$00,$0D,$06,$A4,$1C,$A0,$BF,$28,$F0,$A5,$0F,$A1,$89
.db $28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1C,$A0,$3B,$28,$F0,$02,$01
.db $28,$01,$02,$01,$28,$00,$1A,$06,$A4,$1D,$A0,$A5,$28,$F0,$A5,$0C
.db $A1,$BF,$28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06,$A4,$1D,$A0,$08
.db $28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1C
.db $A0,$BF,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1C
.db $A0,$3B,$28,$F0,$A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00,$0B,$03
.db $A4,$17,$A0,$89,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$08,$06
.db $A4,$1C,$A0,$3B,$28,$F0,$A5,$0D,$A1,$08,$28,$F1,$02,$01,$28,$00
.db $08,$03,$A4,$1C,$A0,$BF,$28,$F0,$02,$01,$28,$00,$06,$03,$A4,$1D
.db $A0,$08,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$1A,$06,$A4,$15
.db $A0,$A5,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$04,$02,$28,$00,$28,$01
.db $1A,$06,$A4,$17,$A0,$1D,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$04,$02
.db $28,$00,$28,$01,$1A,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0F,$A1,$89
.db $28,$F1,$04,$01,$28,$01,$1A,$03,$A5,$0D,$A1,$A5,$28,$F1,$04,$01
.db $28,$01,$12,$03,$A5,$07,$A1,$89,$28,$F1,$08,$01,$28,$00,$04,$01
.db $28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0F,$A1,$89,$28,$F1
.db $02,$01,$28,$00,$0D,$03,$A4,$1C,$A0,$BF,$28,$F0,$02,$01,$28,$00
.db $0D,$03,$A4,$1D,$A0,$A5,$28,$F0,$02,$01,$28,$00,$07,$03,$A4,$1F
.db $A0,$89,$28,$F0,$06,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1C
.db $A0,$3B,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00,$0B,$03
.db $A4,$1F,$A0,$1D,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06
.db $A4,$1F,$A0,$89,$28,$F0,$A5,$07,$A1,$89,$28,$F1,$02,$01,$28,$01
.db $0B,$03,$A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00,$02,$01,$28,$01
.db $0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01
.db $28,$01,$0B,$03,$A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00,$02,$01
.db $28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1
.db $02,$01,$28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00
.db $02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$07,$A1,$89
.db $28,$F1,$02,$01,$28,$00,$0D,$03,$A4,$1C,$A0,$BF,$28,$F0,$02,$01
.db $28,$00,$0D,$03,$A4,$1D,$A0,$A5,$28,$F0,$02,$01,$28,$00,$07,$03
.db $A4,$1F,$A0,$89,$28,$F0,$06,$01,$28,$01,$02,$01,$28,$00,$0D,$06
.db $A4,$1C,$A0,$3B,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00
.db $0B,$03,$A4,$1F,$A0,$1D,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00
.db $0D,$06,$A4,$1F,$A0,$89,$28,$F0,$A5,$07,$A1,$89,$28,$F1,$02,$01
.db $28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00,$02,$01
.db $28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1
.db $02,$01,$28,$01,$0B,$03,$A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00
.db $02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D,$A1,$A5
.db $28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1,$02,$01
.db $28,$00,$02,$01,$28,$01,$1A,$06,$A4,$1E,$A0,$56,$28,$F0,$A5,$0D
.db $A1,$08,$28,$F1,$04,$02,$28,$00,$28,$01,$1A,$06,$A4,$1E,$A0,$56
.db $28,$F0,$A5,$0F,$A1,$89,$28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06
.db $A4,$1E,$A0,$56,$28,$F0,$A5,$0D,$A1,$08,$28,$F1,$02,$01,$28,$00
.db $0B,$03,$A4,$1F,$A0,$89,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00
.db $1A,$06,$A4,$1D,$A0,$A5,$28,$F0,$A5,$0C,$A1,$BF,$28,$F1,$04,$02
.db $28,$00,$28,$01,$1A,$06,$A4,$1D,$A0,$A5,$28,$F0,$A5,$0F,$A1,$89
.db $28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06,$A4,$1D,$A0,$A5,$28,$F0
.db $A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1F,$A0,$89
.db $28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$1A,$06,$A4,$1D,$A0,$08
.db $28,$F0,$A5,$0C,$A1,$3B,$28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06
.db $A4,$1D,$A0,$A5,$28,$F0,$A5,$0F,$A1,$1D,$28,$F1,$02,$01,$28,$00
.db $0B,$03,$A4,$1D,$A0,$08,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00
.db $0D,$06,$A4,$1C,$A0,$BF,$28,$F0,$A5,$0F,$A1,$89,$28,$F1,$02,$01
.db $28,$00,$0B,$03,$A4,$1D,$A0,$08,$28,$F0,$02,$01,$28,$01,$02,$01
.db $28,$00,$0D,$06,$A4,$1C,$A0,$3B,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1
.db $02,$01,$28,$01,$0D,$03,$A5,$0E,$A1,$56,$28,$F1,$02,$01,$28,$01
.db $0D,$03,$A5,$0F,$A1,$1D,$28,$F1,$02,$01,$28,$01,$0D,$03,$A5,$0D
.db $A1,$A5,$28,$F1,$02,$01,$28,$01,$0D,$03,$A5,$0E,$A1,$56,$28,$F1
.db $02,$01,$28,$01,$03,$03,$A5,$0F,$A1,$1D,$28,$F1,$0A,$01,$28,$00
.db $02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0F,$A1,$89
.db $28,$F1,$02,$01,$28,$00,$0D,$03,$A4,$1C,$A0,$BF,$28,$F0,$02,$01
.db $28,$00,$0D,$03,$A4,$1D,$A0,$A5,$28,$F0,$02,$01,$28,$00,$07,$03
.db $A4,$1F,$A0,$89,$28,$F0,$06,$01,$28,$01,$02,$01,$28,$00,$0D,$06
.db $A4,$1C,$A0,$3B,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00
.db $0B,$03,$A4,$1F,$A0,$1D,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00
.db $0D,$06,$A4,$1F,$A0,$89,$28,$F0,$A5,$07,$A1,$89,$28,$F1,$02,$01
.db $28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00,$02,$01
.db $28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1
.db $02,$01,$28,$01,$0B,$03,$A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00
.db $02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D,$A1,$A5
.db $28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1,$02,$01
.db $28,$00,$02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$07
.db $A1,$89,$28,$F1,$02,$01,$28,$00,$0D,$03,$A4,$1C,$A0,$BF,$28,$F0
.db $02,$01,$28,$00,$0D,$03,$A4,$1D,$A0,$A5,$28,$F0,$02,$01,$28,$00
.db $07,$03,$A4,$1F,$A0,$89,$28,$F0,$06,$01,$28,$01,$02,$01,$28,$00
.db $0D,$06,$A4,$1C,$A0,$3B,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01
.db $28,$00,$0B,$03,$A4,$1F,$A0,$1D,$28,$F0,$02,$01,$28,$01,$02,$01
.db $28,$00,$0D,$06,$A4,$1F,$A0,$89,$28,$F0,$A5,$07,$A1,$89,$28,$F1
.db $02,$01,$28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00
.db $02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D,$A1,$A5
.db $28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0F,$A1,$89,$28,$F1,$02,$01
.db $28,$00,$02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D
.db $A1,$A5,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1
.db $02,$01,$28,$00,$02,$01,$28,$01,$1A,$06,$A4,$1E,$A0,$56,$28,$F0
.db $A5,$0D,$A1,$08,$28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06,$A4,$1D
.db $A0,$A5,$28,$F0,$A5,$0E,$A1,$56,$28,$F1,$02,$01,$28,$00,$0B,$03
.db $A4,$1D,$A0,$08,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06
.db $A4,$1C,$A0,$BF,$28,$F0,$A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00
.db $0B,$03,$A4,$1C,$A0,$3B,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00
.db $1A,$06,$A4,$1D,$A0,$A5,$28,$F0,$A5,$0C,$A1,$BF,$28,$F1,$04,$02
.db $28,$00,$28,$01,$0D,$06,$A4,$1D,$A0,$08,$28,$F0,$A5,$0D,$A1,$A5
.db $28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1C,$A0,$BF,$28,$F0,$02,$01
.db $28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1C,$A0,$3B,$28,$F0,$A5,$0F
.db $A1,$89,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$17,$A0,$89,$28,$F0
.db $02,$01,$28,$01,$02,$01,$28,$00,$08,$06,$A4,$1C,$A0,$3B,$28,$F0
.db $A5,$0D,$A1,$08,$28,$F1,$02,$01,$28,$00,$08,$03,$A4,$1C,$A0,$BF
.db $28,$F0,$02,$01,$28,$00,$06,$03,$A4,$1D,$A0,$08,$28,$F0,$02,$01
.db $28,$01,$02,$01,$28,$00,$1A,$06,$A4,$15,$A0,$A5,$28,$F0,$A5,$0D
.db $A1,$A5,$28,$F1,$04,$02,$28,$00,$28,$01,$1A,$06,$A4,$17,$A0,$1D
.db $28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$04,$02,$28,$00,$28,$01,$1A,$06
.db $A4,$17,$A0,$89,$28,$F0,$A5,$0F,$A1,$89,$28,$F1,$04,$01,$28,$01
.db $1A,$03,$A5,$0D,$A1,$A5,$28,$F1,$04,$01,$28,$01,$12,$03,$A5,$07
.db $A1,$89,$28,$F1,$08,$01,$28,$00,$04,$01,$28,$01,$0D,$06,$A4,$17
.db $A0,$89,$28,$F0,$A5,$0E,$A1,$56,$28,$F1,$02,$01,$28,$00,$0B,$03
.db $A4,$1C,$A0,$3B,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06
.db $A4,$1C,$A0,$BF,$28,$F0,$A5,$0D,$A1,$FB,$28,$F1,$02,$01,$28,$00
.db $0B,$03,$A4,$1C,$A0,$3B,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00
.db $0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0C,$A1,$BF,$28,$F1,$02,$01
.db $28,$00,$0B,$03,$A4,$17,$A0,$1D,$28,$F0,$02,$01,$28,$01,$02,$01
.db $28,$00,$1A,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0E,$A1,$56,$28,$F1
.db $04,$02,$28,$00,$28,$01,$1A,$06,$A4,$16,$A0,$56,$28,$F0,$A5,$0C
.db $A1,$BF,$28,$F1,$04,$02,$28,$00,$28,$01,$1A,$06,$A4,$16,$A0,$56
.db $28,$F0,$A5,$06,$A1,$56,$28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06
.db $A4,$1F,$A0,$89,$28,$F0,$A5,$0E,$A1,$56,$28,$F1,$02,$01,$28,$00
.db $0B,$03,$A4,$1F,$A0,$1D,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00
.db $0D,$06,$A4,$1E,$A0,$56,$28,$F0,$A5,$0F,$A1,$89,$28,$F1,$02,$01
.db $28,$00,$0B,$03,$A4,$1F,$A0,$89,$28,$F0,$02,$01,$28,$01,$02,$01
.db $28,$00,$0D,$06,$A4,$1F,$A0,$1D,$28,$F0,$A5,$14,$A1,$BF,$28,$F1
.db $02,$01,$28,$00,$0B,$03,$A4,$1E,$A0,$56,$28,$F0,$02,$01,$28,$01
.db $02,$01,$28,$00,$0D,$06,$A4,$1F,$A0,$1D,$28,$F0,$A5,$0C,$A1,$BF
.db $28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0D,$A1,$FB,$28,$F1,$02,$01
.db $28,$00,$02,$01,$28,$01,$0D,$06,$A4,$1C,$A0,$BF,$28,$F0,$A5,$0F
.db $A1,$1D,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$14,$A1,$BF,$28,$F1
.db $02,$01,$28,$00,$02,$01,$28,$01,$0D,$06,$A4,$1C,$A0,$BF,$28,$F0
.db $A5,$0F,$A1,$1D,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0D,$A1,$FB
.db $28,$F1,$02,$01,$28,$00,$02,$01,$28,$01,$0D,$06,$A4,$1F,$A0,$89
.db $28,$F0,$A5,$0E,$A1,$56,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1F
.db $A0,$1D,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1E
.db $A0,$56,$28,$F0,$A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00,$0B,$03
.db $A4,$1F,$A0,$89,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06
.db $A4,$1F,$A0,$1D,$28,$F0,$A5,$14,$A1,$BF,$28,$F1,$02,$01,$28,$00
.db $0B,$03,$A4,$1E,$A0,$56,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00
.db $1A,$06,$A4,$1F,$A0,$1D,$28,$F0,$A5,$0C,$A1,$BF,$28,$F1,$04,$02
.db $28,$00,$28,$01,$1A,$06,$A4,$1C,$A0,$BF,$28,$F0,$A5,$14,$A1,$3B
.db $28,$F1,$04,$02,$28,$00,$28,$01,$1A,$06,$A4,$1E,$A0,$56,$28,$F0
.db $A5,$0F,$A1,$89,$28,$F1,$04,$02,$28,$00,$28,$01,$08,$06,$A4,$1F
.db $A0,$1D,$28,$F0,$A5,$14,$A1,$3B,$28,$F1,$02,$01,$28,$00,$08,$03
.db $A4,$1F,$A0,$89,$28,$F0,$02,$01,$28,$00,$06,$03,$A4,$24,$A0,$3B
.db $28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$1A,$06,$A4,$1C,$A0,$BF
.db $28,$F0,$A5,$14,$A1,$BF,$28,$F1,$04,$02,$28,$00,$28,$01,$1A,$06
.db $A4,$1D,$A0,$FB,$28,$F0,$A5,$0C,$A1,$BF,$28,$F1,$04,$02,$28,$00
.db $28,$01,$1A,$06,$A4,$1E,$A0,$56,$28,$F0,$A5,$0E,$A1,$56,$28,$F1
.db $04,$01,$28,$00,$0D,$03,$A4,$1D,$A0,$FB,$28,$F0,$02,$01,$28,$00
.db $0D,$03,$A4,$1E,$A0,$56,$28,$F0,$02,$01,$28,$00,$12,$03,$A4,$1F
.db $A0,$1D,$28,$F0,$08,$01,$28,$01,$04,$01,$28,$00,$1A,$06,$A4,$1F
.db $A0,$89,$28,$F0,$A5,$0C,$A1,$BF,$28,$F1,$04,$02,$28,$00,$28,$01
.db $0D,$06,$A4,$1F,$A0,$89,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01
.db $28,$00,$0B,$03,$A4,$1F,$A0,$1D,$28,$F0,$02,$01,$28,$01,$02,$01
.db $28,$00,$0D,$06,$A4,$1E,$A0,$56,$28,$F0,$A5,$0F,$A1,$89,$28,$F1
.db $02,$01,$28,$00,$0B,$03,$A4,$1D,$A0,$A5,$28,$F0,$02,$01,$28,$01
.db $02,$01,$28,$00,$1A,$06,$A4,$1E,$A0,$56,$28,$F0,$A5,$0D,$A1,$08
.db $28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06,$A4,$1E,$A0,$56,$28,$F0
.db $A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1D,$A0,$A5
.db $28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1D,$A0,$08
.db $28,$F0,$A5,$0E,$A1,$56,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1C
.db $A0,$BF,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$1A,$06,$A4,$1D
.db $A0,$08,$28,$F0,$A5,$0C,$A1,$3B,$28,$F1,$04,$02,$28,$00,$28,$01
.db $0D,$06,$A4,$1D,$A0,$08,$28,$F0,$A5,$0C,$A1,$BF,$28,$F1,$02,$01
.db $28,$00,$0B,$03,$A4,$1C,$A0,$BF,$28,$F0,$02,$01,$28,$01,$02,$01
.db $28,$00,$0D,$06,$A4,$1C,$A0,$3B,$28,$F0,$A5,$0D,$A1,$08,$28,$F1
.db $02,$01,$28,$00,$0B,$03,$A4,$17,$A0,$89,$28,$F0,$02,$01,$28,$01
.db $02,$01,$28,$00,$1A,$06,$A4,$17,$A0,$1D,$28,$F0,$A5,$0D,$A1,$A5
.db $28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06,$A4,$16,$A0,$56,$28,$F0
.db $A5,$0C,$A1,$3B,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$17,$A0,$1D
.db $28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$1A,$06,$A4,$15,$A0,$A5
.db $28,$F0,$A5,$05,$A1,$A5,$28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06
.db $A4,$1C,$A0,$3B,$28,$F0,$A5,$0F,$A1,$1D,$28,$F1,$02,$01,$28,$01
.db $0B,$03,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00,$02,$01,$28,$01
.db $0D,$06,$A4,$15,$A0,$A5,$28,$F0,$A5,$0F,$A1,$1D,$28,$F1,$02,$01
.db $28,$01,$0B,$03,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00,$02,$01
.db $28,$01,$0D,$06,$A4,$15,$A0,$A5,$28,$F0,$A5,$0F,$A1,$1D,$28,$F1
.db $02,$01,$28,$01,$0B,$03,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00
.db $02,$01,$28,$01,$0D,$06,$A4,$1C,$A0,$BF,$28,$F0,$A5,$0F,$A1,$89
.db $28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0D,$A1,$A5,$28,$F1,$02,$01
.db $28,$00,$02,$01,$28,$01,$0D,$06,$A4,$15,$A0,$A5,$28,$F0,$A5,$0F
.db $A1,$89,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0D,$A1,$A5,$28,$F1
.db $02,$01,$28,$00,$02,$01,$28,$01,$0D,$06,$A4,$15,$A0,$A5,$28,$F0
.db $A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0D,$A1,$A5
.db $28,$F1,$02,$01,$28,$00,$02,$01,$28,$01,$1A,$06,$A4,$1D,$A0,$08
.db $28,$F0,$A5,$0F,$A1,$1D,$28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06
.db $A4,$1D,$A0,$A5,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00
.db $0B,$03,$A4,$1D,$A0,$08,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00
.db $0D,$06,$A4,$1C,$A0,$BF,$28,$F0,$A5,$0F,$A1,$89,$28,$F1,$02,$01
.db $28,$00,$0B,$03,$A4,$1D,$A0,$08,$28,$F0,$02,$01,$28,$01,$02,$01
.db $28,$00,$0D,$06,$A4,$1C,$A0,$3B,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1
.db $02,$01,$28,$01,$0D,$03,$A5,$0E,$A1,$56,$28,$F1,$02,$01,$28,$01
.db $0D,$03,$A5,$0F,$A1,$1D,$28,$F1,$02,$01,$28,$01,$0D,$03,$A5,$0D
.db $A1,$A5,$28,$F1,$02,$01,$28,$01,$0D,$03,$A5,$0E,$A1,$56,$28,$F1
.db $02,$01,$28,$01,$03,$03,$A5,$0F,$A1,$1D,$28,$F1,$0A,$01,$28,$00
.db $02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0F,$A1,$89
.db $28,$F1,$02,$01,$28,$00,$0D,$03,$A4,$1C,$A0,$BF,$28,$F0,$02,$01
.db $28,$00,$0D,$03,$A4,$1D,$A0,$A5,$28,$F0,$02,$01,$28,$00,$07,$03
.db $A4,$1F,$A0,$89,$28,$F0,$06,$01,$28,$01,$02,$01,$28,$00,$0D,$06
.db $A4,$1C,$A0,$3B,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00
.db $0B,$03,$A4,$1F,$A0,$1D,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00
.db $0D,$06,$A4,$1F,$A0,$89,$28,$F0,$A5,$07,$A1,$89,$28,$F1,$02,$01
.db $28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00,$02,$01
.db $28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1
.db $02,$01,$28,$01,$0B,$03,$A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00
.db $02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D,$A1,$A5
.db $28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1,$02,$01
.db $28,$00,$02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$07
.db $A1,$89,$28,$F1,$02,$01,$28,$00,$0D,$03,$A4,$1C,$A0,$BF,$28,$F0
.db $02,$01,$28,$00,$0D,$03,$A4,$1D,$A0,$A5,$28,$F0,$02,$01,$28,$00
.db $07,$03,$A4,$1F,$A0,$89,$28,$F0,$06,$01,$28,$01,$02,$01,$28,$00
.db $0D,$06,$A4,$1C,$A0,$3B,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01
.db $28,$00,$0B,$03,$A4,$1F,$A0,$1D,$28,$F0,$02,$01,$28,$01,$02,$01
.db $28,$00,$0D,$06,$A4,$1F,$A0,$89,$28,$F0,$A5,$07,$A1,$89,$28,$F1
.db $02,$01,$28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00
.db $02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D,$A1,$A5
.db $28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0F,$A1,$89,$28,$F1,$02,$01
.db $28,$00,$02,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D
.db $A1,$A5,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1
.db $02,$01,$28,$00,$02,$01,$28,$01,$1A,$06,$A4,$1E,$A0,$56,$28,$F0
.db $A5,$0D,$A1,$08,$28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06,$A4,$1D
.db $A0,$A5,$28,$F0,$A5,$0E,$A1,$56,$28,$F1,$02,$01,$28,$00,$0B,$03
.db $A4,$1D,$A0,$08,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06
.db $A4,$1C,$A0,$BF,$28,$F0,$A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00
.db $0B,$03,$A4,$1C,$A0,$3B,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00
.db $1A,$06,$A4,$1D,$A0,$A5,$28,$F0,$A5,$0C,$A1,$BF,$28,$F1,$04,$02
.db $28,$00,$28,$01,$0D,$06,$A4,$1D,$A0,$08,$28,$F0,$A5,$0D,$A1,$A5
.db $28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1C,$A0,$BF,$28,$F0,$02,$01
.db $28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1C,$A0,$3B,$28,$F0,$A5,$0F
.db $A1,$89,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$17,$A0,$89,$28,$F0
.db $02,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1C,$A0,$3B,$28,$F0
.db $A5,$0D,$A1,$08,$28,$F1,$02,$01,$28,$00,$0D,$03,$A4,$1C,$A0,$BF
.db $28,$F0,$02,$01,$28,$00,$16,$03,$A4,$15,$A0,$A5,$28,$F0,$04,$01
.db $28,$01,$04,$01,$28,$00,$1A,$06,$A4,$17,$A0,$1D,$28,$F0,$A5,$0D
.db $A1,$A5,$28,$F1,$04,$02,$28,$00,$28,$01,$1A,$06,$A4,$17,$A0,$89
.db $28,$F0,$A5,$0F,$A1,$89,$28,$F1,$04,$01,$28,$01,$1A,$03,$A5,$0D
.db $A1,$A5,$28,$F1,$04,$01,$28,$01,$12,$03,$A5,$07,$A1,$89,$28,$F1
.db $08,$01,$28,$00,$04,$01,$28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0
.db $A5,$0E,$A1,$56,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1C,$A0,$3B
.db $28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1C,$A0,$BF
.db $28,$F0,$A5,$0D,$A1,$FB,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1C
.db $A0,$3B,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$17
.db $A0,$89,$28,$F0,$A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00,$0B,$03
.db $A4,$17,$A0,$1D,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$1A,$06
.db $A4,$17,$A0,$89,$28,$F0,$A5,$0E,$A1,$56,$28,$F1,$04,$02,$28,$00
.db $28,$01,$1A,$06,$A4,$16,$A0,$56,$28,$F0,$A5,$0C,$A1,$BF,$28,$F1
.db $04,$02,$28,$00,$28,$01,$1A,$06,$A4,$16,$A0,$56,$28,$F0,$A5,$06
.db $A1,$56,$28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06,$A4,$1F,$A0,$89
.db $28,$F0,$A5,$0E,$A1,$56,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1F
.db $A0,$1D,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1E
.db $A0,$56,$28,$F0,$A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00,$0B,$03
.db $A4,$1F,$A0,$89,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06
.db $A4,$1F,$A0,$1D,$28,$F0,$A5,$14,$A1,$BF,$28,$F1,$02,$01,$28,$00
.db $0B,$03,$A4,$1E,$A0,$56,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00
.db $0D,$06,$A4,$1F,$A0,$1D,$28,$F0,$A5,$0C,$A1,$BF,$28,$F1,$02,$01
.db $28,$01,$0B,$03,$A5,$0D,$A1,$FB,$28,$F1,$02,$01,$28,$00,$02,$01
.db $28,$01,$0D,$06,$A4,$1C,$A0,$BF,$28,$F0,$A5,$0F,$A1,$1D,$28,$F1
.db $02,$01,$28,$01,$0B,$03,$A5,$14,$A1,$BF,$28,$F1,$02,$01,$28,$00
.db $02,$01,$28,$01,$0D,$06,$A4,$1C,$A0,$BF,$28,$F0,$A5,$0F,$A1,$1D
.db $28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0D,$A1,$FB,$28,$F1,$02,$01
.db $28,$00,$02,$01,$28,$01,$0D,$06,$A4,$1F,$A0,$89,$28,$F0,$A5,$0E
.db $A1,$56,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1F,$A0,$1D,$28,$F0
.db $02,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1E,$A0,$56,$28,$F0
.db $A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1F,$A0,$89
.db $28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1F,$A0,$1D
.db $28,$F0,$A5,$14,$A1,$BF,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1E
.db $A0,$56,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$1A,$06,$A4,$1F
.db $A0,$1D,$28,$F0,$A5,$0C,$A1,$BF,$28,$F1,$04,$02,$28,$00,$28,$01
.db $1A,$06,$A4,$1C,$A0,$BF,$28,$F0,$A5,$14,$A1,$3B,$28,$F1,$04,$02
.db $28,$00,$28,$01,$1A,$06,$A4,$1E,$A0,$56,$28,$F0,$A5,$0F,$A1,$89
.db $28,$F1,$04,$02,$28,$00,$28,$01,$08,$06,$A4,$1F,$A0,$1D,$28,$F0
.db $A5,$14,$A1,$3B,$28,$F1,$02,$01,$28,$00,$08,$03,$A4,$1F,$A0,$89
.db $28,$F0,$02,$01,$28,$00,$06,$03,$A4,$24,$A0,$3B,$28,$F0,$02,$01
.db $28,$01,$02,$01,$28,$00,$1A,$06,$A4,$1C,$A0,$BF,$28,$F0,$A5,$14
.db $A1,$BF,$28,$F1,$04,$02,$28,$00,$28,$01,$1A,$06,$A4,$1D,$A0,$FB
.db $28,$F0,$A5,$0C,$A1,$BF,$28,$F1,$04,$02,$28,$00,$28,$01,$1A,$06
.db $A4,$1E,$A0,$56,$28,$F0,$A5,$0E,$A1,$56,$28,$F1,$04,$01,$28,$00
.db $0D,$03,$A4,$1D,$A0,$FB,$28,$F0,$02,$01,$28,$00,$0D,$03,$A4,$1E
.db $A0,$56,$28,$F0,$02,$01,$28,$00,$12,$03,$A4,$1F,$A0,$1D,$28,$F0
.db $08,$01,$28,$01,$04,$01,$28,$00,$1A,$06,$A4,$1F,$A0,$89,$28,$F0
.db $A5,$0C,$A1,$BF,$28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06,$A4,$1F
.db $A0,$89,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00,$0B,$03
.db $A4,$1F,$A0,$1D,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06
.db $A4,$1E,$A0,$56,$28,$F0,$A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00
.db $0B,$03,$A4,$1D,$A0,$A5,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00
.db $1A,$06,$A4,$1E,$A0,$56,$28,$F0,$A5,$0D,$A1,$08,$28,$F1,$04,$02
.db $28,$00,$28,$01,$0D,$06,$A4,$1E,$A0,$56,$28,$F0,$A5,$0D,$A1,$A5
.db $28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1D,$A0,$A5,$28,$F0,$02,$01
.db $28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1D,$A0,$08,$28,$F0,$A5,$0E
.db $A1,$56,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1C,$A0,$BF,$28,$F0
.db $02,$01,$28,$01,$02,$01,$28,$00,$1A,$06,$A4,$1D,$A0,$08,$28,$F0
.db $A5,$0C,$A1,$3B,$28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06,$A4,$1D
.db $A0,$08,$28,$F0,$A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00,$0B,$03
.db $A4,$1C,$A0,$BF,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06
.db $A4,$1C,$A0,$3B,$28,$F0,$A5,$0D,$A1,$08,$28,$F1,$02,$01,$28,$00
.db $0B,$03,$A4,$17,$A0,$89,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00
.db $1A,$06,$A4,$17,$A0,$1D,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$04,$02
.db $28,$00,$28,$01,$0D,$06,$A4,$16,$A0,$56,$28,$F0,$A5,$0C,$A1,$3B
.db $28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$17,$A0,$1D,$28,$F0,$02,$01
.db $28,$01,$02,$01,$28,$00,$1A,$06,$A4,$15,$A0,$A5,$28,$F0,$A5,$05
.db $A1,$A5,$28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06,$A4,$1C,$A0,$3B
.db $28,$F0,$A5,$0F,$A1,$1D,$28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0D
.db $A1,$A5,$28,$F1,$02,$01,$28,$00,$02,$01,$28,$01,$0D,$06,$A4,$15
.db $A0,$A5,$28,$F0,$A5,$0F,$A1,$1D,$28,$F1,$02,$01,$28,$01,$0B,$03
.db $A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00,$02,$01,$28,$01,$0D,$06
.db $A4,$15,$A0,$A5,$28,$F0,$A5,$0F,$A1,$1D,$28,$F1,$02,$01,$28,$01
.db $0B,$03,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00,$02,$01,$28,$01
.db $0D,$06,$A4,$1C,$A0,$BF,$28,$F0,$A5,$0F,$A1,$89,$28,$F1,$02,$01
.db $28,$01,$0B,$03,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00,$02,$01
.db $28,$01,$0D,$06,$A4,$15,$A0,$A5,$28,$F0,$A5,$0F,$A1,$89,$28,$F1
.db $02,$01,$28,$01,$0B,$03,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00
.db $02,$01,$28,$01,$0D,$06,$A4,$15,$A0,$A5,$28,$F0,$A5,$0F,$A1,$89
.db $28,$F1,$02,$01,$28,$01,$0B,$03,$A5,$0D,$A1,$A5,$28,$F1,$02,$01
.db $28,$00,$02,$01,$28,$01,$1A,$06,$A4,$1D,$A0,$08,$28,$F0,$A5,$0F
.db $A1,$1D,$28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06,$A4,$1D,$A0,$A5
.db $28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1D
.db $A0,$08,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1C
.db $A0,$BF,$28,$F0,$A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00,$0B,$03
.db $A4,$1D,$A0,$08,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06
.db $A4,$1C,$A0,$3B,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$01
.db $0D,$03,$A5,$0E,$A1,$56,$28,$F1,$02,$01,$28,$01,$0D,$03,$A5,$0F
.db $A1,$1D,$28,$F1,$02,$01,$28,$01,$0D,$03,$A5,$0D,$A1,$A5,$28,$F1
.db $02,$01,$28,$01,$0D,$03,$A5,$0E,$A1,$56,$28,$F1,$02,$01,$28,$01
.db $03,$03,$A5,$0F,$A1,$1D,$28,$F1,$0A,$01,$28,$00,$02,$01,$28,$01
.db $0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0F,$A1,$89,$28,$F1,$02,$01
.db $28,$00,$0D,$03,$A4,$1C,$A0,$BF,$28,$F0,$02,$01,$28,$00,$0D,$03
.db $A4,$1D,$A0,$A5,$28,$F0,$02,$01,$28,$00,$07,$03,$A4,$1F,$A0,$89
.db $28,$F0,$06,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1C,$A0,$3B
.db $28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1F
.db $A0,$1D,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1F
.db $A0,$89,$28,$F0,$A5,$07,$A1,$89,$28,$F1,$02,$01,$28,$01,$0B,$03
.db $A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00,$02,$01,$28,$01,$0D,$06
.db $A4,$17,$A0,$89,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$01
.db $0B,$03,$A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00,$02,$01,$28,$01
.db $0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01
.db $28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00,$02,$01
.db $28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$07,$A1,$89,$28,$F1
.db $02,$01,$28,$00,$0D,$03,$A4,$1C,$A0,$BF,$28,$F0,$02,$01,$28,$00
.db $0D,$03,$A4,$1D,$A0,$A5,$28,$F0,$02,$01,$28,$00,$07,$03,$A4,$1F
.db $A0,$89,$28,$F0,$06,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1C
.db $A0,$3B,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01,$28,$00,$0B,$03
.db $A4,$1F,$A0,$1D,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06
.db $A4,$1F,$A0,$89,$28,$F0,$A5,$07,$A1,$89,$28,$F1,$02,$01,$28,$01
.db $0B,$03,$A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00,$02,$01,$28,$01
.db $0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01
.db $28,$01,$0B,$03,$A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00,$02,$01
.db $28,$01,$0D,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1
.db $02,$01,$28,$01,$0B,$03,$A5,$0C,$A1,$BF,$28,$F1,$02,$01,$28,$00
.db $02,$01,$28,$01,$1A,$06,$A4,$1E,$A0,$56,$28,$F0,$A5,$0D,$A1,$08
.db $28,$F1,$04,$02,$28,$00,$28,$01,$0D,$06,$A4,$1D,$A0,$A5,$28,$F0
.db $A5,$0E,$A1,$56,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1D,$A0,$08
.db $28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$0D,$06,$A4,$1C,$A0,$BF
.db $28,$F0,$A5,$0F,$A1,$89,$28,$F1,$02,$01,$28,$00,$0B,$03,$A4,$1C
.db $A0,$3B,$28,$F0,$02,$01,$28,$01,$02,$01,$28,$00,$1A,$06,$A4,$1D
.db $A0,$A5,$28,$F0,$A5,$0C,$A1,$BF,$28,$F1,$04,$02,$28,$00,$28,$01
.db $0D,$06,$A4,$1D,$A0,$08,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1,$02,$01
.db $28,$00,$0B,$03,$A4,$1C,$A0,$BF,$28,$F0,$02,$01,$28,$01,$02,$01
.db $28,$00,$0D,$06,$A4,$1C,$A0,$3B,$28,$F0,$A5,$0F,$A1,$89,$28,$F1
.db $02,$01,$28,$00,$0B,$03,$A4,$17,$A0,$89,$28,$F0,$02,$01,$28,$01
.db $02,$01,$28,$00,$0D,$06,$A4,$1C,$A0,$3B,$28,$F0,$A5,$0D,$A1,$08
.db $28,$F1,$02,$01,$28,$00,$0D,$03,$A4,$1C,$A0,$BF,$28,$F0,$02,$01
.db $28,$00,$16,$03,$A4,$15,$A0,$A5,$28,$F0,$04,$01,$28,$01,$04,$01
.db $28,$00,$1A,$06,$A4,$17,$A0,$1D,$28,$F0,$A5,$0D,$A1,$A5,$28,$F1
.db $04,$02,$28,$00,$28,$01,$1A,$06,$A4,$17,$A0,$89,$28,$F0,$A5,$0F
.db $A1,$89,$28,$F1,$04,$01,$28,$01,$1A,$03,$A5,$0D,$A1,$A5,$28,$F1
.db $04,$01,$28,$01,$12,$03,$A5,$07,$A1,$89,$28,$F1,$08,$01,$28,$00
.db $04,$01,$28,$01,$00
;; 7045 bytes in song
#include "printing.inc"
.end

View File

@@ -9,6 +9,7 @@ pushd ZCPR-DJ && call Build || exit /b & popd
pushd ZSDOS && call Build || exit /b & popd
pushd CPM3 && call Build || exit /b & popd
pushd ZPM3 && call Build || exit /b & popd
pushd pSys && call Build || exit /b & popd
pushd Apps && call Build || exit /b & popd
pushd Forth && call Build || exit /b & popd
pushd TastyBasic && call Build || exit /b & popd

View File

@@ -10,6 +10,7 @@ pushd ZSDOS && call Clean.cmd & popd
pushd CBIOS && call Clean.cmd & popd
pushd CPM3 && call Clean.cmd & popd
pushd ZPM3 && call Clean.cmd & popd
pushd pSys && call Clean.cmd & popd
pushd Forth && call Clean.cmd & popd
pushd TastyBasic && call Clean & popd
pushd Fonts && call Clean.cmd & popd

View File

@@ -30,6 +30,8 @@ RomWBW firmware includes:
* HBIOS (Hardware BIOS) providing support for the vast majority of
RetroBrew Computers I/O components
* Diagnostics and customizable debugging information.
* A complete operating system (either CP/M 2.2 or ZSDOS 1.1)
* A built-in CP/M filesystem containing the basic applications and
@@ -919,7 +921,7 @@ device number assigned by the driver.
Each RTC device is handled by an appropriate driver (DSRTC, BQRTC,
etc.) which is identified by a device type id from the table below.
**Type ID** | **Disk Device Type**
**Type ID** | **RTC Device Type**
----------- | --------------------
0x00 | DS1302
0x10 | BQ4845P
@@ -1396,7 +1398,7 @@ Increase by steps of 4 to select the next corresponding note.
Increase by steps of 48 to select the same note in next octave.
If the driver is able to generate the requested note, a success (0) is
returned, otherwise a non-zero error state will be returned.
returned, otherwise a non-zero error value will be returned.
The sound chip resolution and its oscillator limit the range and
accuracy of the notes played. The typical range of the AY-3-8910
@@ -1441,7 +1443,7 @@ the following HBIOS calls would need to be made:
```
HBIOS B=51 C=00 L=80 ; Set volume to half level
HBIOS B=53 C=00 L=69 ; Select Middle C (C4) assuming SN76489
HBIOS B=53 C=00 HL=152 ; Select Middle C (C4)
HBIOS B=54 C=00 D=01 ; Play note on Channel 1
```
@@ -1516,6 +1518,8 @@ AUDIO ID | Value | Device | Returned registers
SND_SN76489 | 0x01 | SN76489 | E: Left channel port, L: Right channel port
SND_AY38910 | 0x02 | AY-3-8910 | D: Address port, E: Data port
SND_BITMODE | 0x03 | I/O PORT | D: Address port, E: Bit mask
SND_YM2612 | 0x04 | YM2612 | D: Part 0 Address port, E: Part 0 Data port
| | | H: Part 1 Address port, L: Part 1 Data port
### Function 0x56 -- Sound Duration (SNDDUR)
@@ -1545,10 +1549,10 @@ and then return.
| _Exit Results_
| A: Status (0=OK, else error)
| D: Serial Device Type
| E: Serial Device Number
| H: Serial Device Unit Mode
| L: Serial Device Unit I/O Base Address
| D: Sound Device Type
| E: Sound Device Number
| H: Sound Device Unit Mode
| L: Sound Device Unit I/O Base Address
Reports information about the sound device unit specified. Register D
indicates the device type (driver) and register E indicates the physical
@@ -1563,6 +1567,7 @@ _Id_ | _Device Type / Driver_
0x00 | SN76489
0x10 | AY38910
0x20 | BITMODE
0x30 | YM2612
`\clearpage`{=latex}
@@ -2166,7 +2171,7 @@ IM1, the size of the table is the number of vectors chained together.
For IM2, the size of the table is the number of slots in the vector
table.
#### SYSINT Subfunction 0x10) -- Get Interrupt (INTGET)
#### SYSINT Subfunction 0x10 -- Get Interrupt (INTGET)
| _Entry Parameters_
| BC: 0xFC10
@@ -2180,7 +2185,7 @@ On entry, register E must contain an index into the interrupt vector
table. On return, HL will contain the address of the current interrupt
vector at the specified index.
#### SYSINT Subfunction 0x20) -- Set Interrupt (INTSET)
#### SYSINT Subfunction 0x20 -- Set Interrupt (INTSET)
| _Entry Parameters_
| BC: 0xFC20
@@ -2198,6 +2203,173 @@ be inserted in the table at the index. On return, HL will contain the
previous address in the table at the index.
`\clearpage`{=latex}
Errors and diagnostics
========
ROMWBW tries to provide useful information when a run time or build time
error occurs. Many sections of the code also have code blocks that can be
enable to aid in debugging and in some cases the level of reporting detail
can be customized.
Run time errors
--------
### PANIC
A panic error indicates a non-recoverable error. The processor status is displayed on the console
and interrupts are disabled and execution is halted. A cold boot or reset is required to restart.
Example error message:
\>>> PANIC: @06C4[DFA3:DFC3:0100:F103:04FC:0000:2B5E]
\*** System Halted ***
The format of the information provided is
@XXXX [-AF-:-BC-:-DE-:-HL-:-SP-:-IX-:-IY-]
Where @XXXX is the address the panic was called from. The other information
is the CPU register contents.
Possible reasons a PANIC may occur are:
- RAM Bank range error when attempting a read or write to a RAM disk.
- Sector read function has not been setup but a read was attempted.
- An interrupt vector has not been set up when an interrupt was received.
- There was an attempt to add more devices than the device table had room for.
- An illegal SD card command was encountered.
The @XXXX memory address can be cross referenced with the build source code to identify
which section of the software or hardware caused the fault.
### SYSCHK
A syschk error is identified when an internal error is detected. When this
occurs an error code is returned to the calling program in the A register.
A non-zero result indicates an error.
Syschk errors may be reported to the console. Whether this occurs depends on
the value of the diagnosis level equate DIAGLVL. By default syschk errors
are not reported to the console.
If the diagnosis level is set to display the diagnosis information, then
memory address, register dump and error code is displayed.
A key differance with the PANIC error is that execution may be continued.
Example error message:
\>>> SYSCHK: @06C4[DFA3:DFC3:0100:F103:04FC:0000:2B5E] FD
Continue (Y/N)
The format of the information provided is similar the PANIC report.
@XXXX [-AF-:-BC-:-DE-:-HL-:-SP-:-IX-:-IY-] YY
The syschk error codes YY is returned in the A register.
| Error | Code YY |
| ----------------------------------- | -------- |
| Success | 0x00 |
| Undefined Error | 0xFF |
| Function Not Implemented | 0xFE |
| Invalid Function | 0xFD |
| Invalid Unit Number | 0xFC |
| Out Of Memory | 0xFB |
| Parameter Out Of Range | 0xFA |
| Media Not Present | 0xF9 |
| Hardware Not Present | 0xF8 |
| I/O Error | 0xF7 |
| Write Request To Read-Only Media | 0xF6 |
| Device Timeout | 0xF5 |
| Invalid Configuration | 0xF4 |
| Internal Error | 0xF3 |
### Error Level reporting
placeholder
Build time errors
--------
### Build chain tool errors
place holder
### Assembly time check errors
placeholder
Diagnostics
--------
### DIAG
Progress through the boot and initialization process can be difficult to monitor
due to the lack of console or video output. Access to these output devices does
not become available until late the in the boot process. If these output devices
are also involved with the issue trying to be resolved then trouble shooting is
even more difficult.
ROMWBW can be configured to display boot progress with the assistance of additional
hardware. This take the form of an LED breakout debugging board connected to an
8-bit output port. As the boot code executes, the LED output display is updated.
To use a LED breakout board, it must be connected the computers data, reset and port
select lines.
To enable the DIAG option the following settings must be made in the systems .ini
configuration file, where 0xnn is the port address.
DIAGENABLE .SET TRUE
DIAGPORT .SET 0xnn
The following table shows the ROMWBW process steps in relation to the LED display.
| LED | ROMWBW Processes |
| -------- |:---------------------------------------------- |
| `........` | Initial boot |
| | Jump to start address |
| | Disable interrupts |
| | Set interrupt mode 1 |
| | Initialize critical ports and initial speed |
| `.......O` | Setup initial stack |
| | Memory manager and CPU configuration |
| | Set top bank to be RAM |
| `......OO` | Get and save battery condition |
| | Install HBIOS proxy in upper memory |
| | If platform is MBC reconfigure memory manager |
| | Setup "ROMLESS" HBIOS image or ... |
| | Copy HBIOS from ROM to RAM if RAM flag not set |
| | Jump to HBIOS in RAM |
| | Set running in RAM flag |
| `.....OOO` | Finalize configuration for running in RAM |
| | Check battery condition |
| | Check for recovery mode boot |
| `....OOOO` | Identify CPU type |
| `...OOOOO` | Set cpu oscillator speed |
| | Setup counter-timers |
| | Setup heap |
| `..OOOOOO` | Preconsole initialization |
| `.OOOOOOO` | Boot delay |
| | Set boot console device |
| | Bios announcement |
| `OOOOOOOO` | Display platform information |
| | Display memory configuration |
| | Display CPU family |
| | Verify ROM checksum |
| | Report battery condition |
| | Perform device driver initialization |
| | Report watchdog status |
| | Mark HBIOS heap so it is preserved |
| | Switch from boot console to CRT if active |
| | Display device summary |
| | Execute boot loader |
`\clearpage`{=latex}
### Appendix A Driver Instance Data fields
@@ -2229,3 +2401,5 @@ The following section outlines the read only data referenced by the
| DCNTL* | 14 | 1 | Z180 DMA/WAIT CONTROL |
* ONLY PRESENT FOR Z180 BUILDS

View File

@@ -272,28 +272,22 @@ be VDU type devices or serial devices. If you want to change which
device is the console, the ***I*** menu option can be used to choose
the unit and it's speed.
The command format is ```I <u> [<c>]```
The command format is ```I <u> [<b>]```
where ***u*** is unit to select and ***c*** is the optional baud rate code as listed below.
where ***u*** is unit to select and ***b*** is the optional baud rate.
Supported baud rates are:
```
Code | Rate | Code | Rate | Code | Rate | Code | Rate |
------|----------|------|----------|------|----------|------|----------|
0 | 75 | 8 | 1800 | 16 | 28880 | 24 | 460800 |
1 | 150 | 9 | 2400 | 17 | 38400 | 25 | 614400 |
2 | 225 | 10 | 3600 | 18 | 57600 | 26 | 921600 |
3 | 300 | 11 | 4800 | 19 | 76800 | 27 | 1228822 |
4 | 450 | 12 | 7200 | 20 | 115200 | 28 | 1843200 |
5 | 600 | 13 | 9600 | 21 | 153600 | 29 | 2457600 |
6 | 900 | 14 | 14400 | 22 | 230400 | 30 | 3686400 |
7 | 1200 | 15 | 19200 | 23 | 307200 | 31 | 7372800 |
------------------------------------------------------------------------
75 450 1800 7200 38400 115200 460800 1843200
150 600 2400 9600 28800 153600 614400 2457600
225 900 3600 14400 57600 230400 921600 3686400
300 1200 4800 19200 76800 307200 1228800 7372800
```
Example: To change current console to 9600 baud
```
I 0 13
I 0 9600
```
@@ -411,20 +405,20 @@ functional on all of the OS variants included with RomWBW.
The following custom applications are found on the ROM disk and are,
therefore, globally available.
| Application | Description |
| ----------- | ---------------------------------------------------------------------------------------------------- |
| ASSIGN | Add, change, and delete drive letter assignments. Use ASSIGN /? for usage instructions. |
| SYSCOPY | Copy system image to a device to make it bootable. Use SYSCOPY with no parms for usage instructions. |
| MODE | Reconfigures serial ports dynamically. |
| FDU | Format and test floppy disks. Menu driven interface. |
| FORMAT | Will someday be a command line tool to format floppy disks. Currently does nothing! |
| XM | XModem file transfer program adapted to hardware. Automatically uses primary serial port on system. |
| FLASH | Will Sowerbutts' in-situ ROM programming utility. |
| FDISK80 | John Coffman's Z80 hard disk partitioning tool. See documentation in Doc directory. |
| TALK | Direct console I/O to a specified character device. |
| RTC | Manage and test the Real Time Clock hardware. |
| TIMER | Display value of running periodic system timer. |
| CPUSPD | Change the running CPU speed and wait states of the system. |
| Application | Description |
| ------------- | ---------------------------------------------------------------------------------------------------- |
| ASSIGN | Add, change, and delete drive letter assignments. Use ASSIGN /? for usage instructions. |
| SYSCOPY | Copy system image to a device to make it bootable. Use SYSCOPY with no parms for usage instructions. |
| MODE | Reconfigures serial ports dynamically. |
| FDU | Format and test floppy disks. Menu driven interface. |
| FORMAT | Will someday be a command line tool to format floppy disks. Currently does nothing! |
| XM | XModem file transfer program adapted to hardware. Automatically uses primary serial port on system. |
| FLASH | Will Sowerbutts' in-situ ROM programming utility. |
| FDISK80 | John Coffman's Z80 hard disk partitioning tool. See documentation in Doc directory. |
| TALK | Direct console I/O to a specified character device. |
| RTC | Manage and test the Real Time Clock hardware. |
| TIMER | Display value of running periodic system timer. |
| CPUSPD | Change the running CPU speed and wait states of the system. |
Some custom applications do not fit on the ROM disk. They are found on the
disk image files or the individual files can be found in the Binary\\Apps
@@ -434,7 +428,7 @@ directory of the distribution.
| ----------- | -------------------------------------------------------------- |
| TUNE | Play .PT2, .PT3, .MYM audio files. |
| FAT | Access MS-DOS FAT filesystems from RomWBW (based on FatFs). |
| INTTEST | Test interrupt vector hooking. |
| INTTEST | Test interrupt vector hooking. |
Additional documentation on all of these applications can be found in
"RomWBW Applications.pdf" in the Doc directory of the distribution.
@@ -463,6 +457,16 @@ will find some files on the ROM disk that will work with ZSDOS, but
will not work on CP/M 2.2. For example, `LDDS`, which loads the
ZSDOS date/time stamper will only run on ZSDOS.
## Flash ROM Disks
The limitation of ROM disks being read only can be overcome on some
platforms with the appropriate selection of Flash ROM chip and
system configuration. In this case the flash-file system can be
enabled which will allow the ROM disk to be read and written to.
Flash devices have a limited write lifespan and continual usage will
eventually wear out the device. It is not suited for high usage
applications.
## Disk Devices
While the RAM/ROM disks provide a functional system, they are not
@@ -680,6 +684,11 @@ boot from disk as is. You do not need to run `SYSCOPY` on them to make
them bootable. However, if you upgrade your ROM, you should use `SYSCOPY`
to update the system tracks.
A full implementation of the UCSD p-System for Z80 under RomWBW is also
provided. This is a completely separate and standalone disk image
called psys.img. It contains 6 p-System filesystem slices, but these
are not interoperable with the CP/M slices described above.
## Booting Disks
When starting your system, following the hardware initialization, you
@@ -865,6 +874,73 @@ which is confusing, but this is as intended by the ZPM3 distribution.
I believe it was done this way to make it easier for users to transition
from CP/M 3 to ZPM3.
## QPM
QPM is another OS providing compatibility with and enhancements
to CP/M 2.2. It is provided as bootable disk images for RomWBW.
The following documentation files from the original QPM distribution
are included in the RomWBW Doc directory:
- QP/M 2.7 Features and Facilities (qcp27.pdf)
- QP/M 2.7 Interface Guide (qdos27.pdf)
- QP/M 2.7 Installation Guide and Supplements (qpm27.pdf)
Refer to the ReadMe.txt file in Source/Images/d_qpm for more details
regarding the RomWBW adaptation and customizations.
### Notes
- QPM is not available as source. This implementation was based
on the QPM binary distribution and has been minimally customized
for RomWBW.
- QINSTALL is used to customize QPM. It is included on the
disk image. You should review the notes in the ReadMe.txt
file in Source/Image/d_qpm before making changes.
## UCSD p-System
This is a full implementation of the UCSD p-System IV.0 for Z80
running under RomWBW. Unlike the OSes above, p-System uses it's
own unique filesystem and is not interoperable with other OSes.
It was derived from the p-System Adaptable Z80 System. Unlike
some other distributions, this implements a native p-System
Z80 Extended BIOS, it does not rely on a CP/M BIOS layer.
The p-System is provided on a hard disk image file called
psys.img. This must be copied to it's own dedicated hard
disk media (CF Card, SD Card, etc.). It is booted by
selecting slices 0 of the corresponding hard disk unit at
the RomWBW Boot Loader prompt.
The p-System Users Manual is included in the Doc directory
of the distribution as "UCSD p-System Users Manual.pdf".
Refer to the ReadMe.txt file in Source/pSys for more details.
### Notes
- There is no floppy support at this time.
- The hard disk image contains 6 p-System slices which are
assigned to p-System unit numbers 4, 5, 9, 10, 11 which
is standard for p-System. Slices 0-5 are assigned
sequentially to these p-System unit numbers and it is
not possible to reassign them.
- p-System relies heavily on the use of a full screen
terminal. This implementation has been setup to expect
an ANSI or DEC VT-100 terminal or emulator. The screen
output will be garbled if no such terminal or emulator
is used for console output.
- There is no straightforward mechanism to move files in
and out of p-System. However, the .vol files in Source/pSys
can be read and modified by CiderPress. CiderPress is able
to add and remove individual files.
## FreeRTOS
Phillip Stevens has ported FreeRTOS to run under RomWBW. FreeRTOS is

View File

@@ -316,7 +316,9 @@ D+ | d1 d2 -- d1+d2 | Add double numbers
2>R | d -- | 2 to R
2R> | d -- | fetch 2 from R
M*/ | d1 n2 u3 -- d=(d1*n2)/u3 | double precision mult. div
SVC | hl de bc n -- hl de bc af | Execute a ROMWBW function
P! | n p -- | Write a byte to a I/O port
P@ | p -- n | Read a byte from and I/O port
# BASIC

View File

@@ -36,8 +36,9 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
;
TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
TMSMODE .SET TMSMODE_RCV9958 ; TMS: DRIVER MODE: TMSMODE_[RC/RCV9958]
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|RC|RCV9958|RCKBD]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
AY38910ENABLE .SET TRUE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
;

View File

@@ -62,6 +62,8 @@ SDENABLE .SET TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
;
PRPENABLE .SET TRUE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM)
;
AY38910ENABLE .SET TRUE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY38910ENABLE .SET TRUE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER (AY38910.ASM)
;
SN7ENABLE .SET TRUE ; SN : SN76489 DRIVER
SN76489ENABLE .SET TRUE ; SN: ENABLE SN76489 SOUND DRIVER (SN76489.ASM)
;
YM2612ENABLE .SET TRUE ; YM2612: ENABLE ECB VGM YM2612 SOUND DRIVER (YM2612.ASM)

View File

@@ -114,6 +114,10 @@ ANSI_FNTBL:
;
ANSI_IN: ; HANDLE INPUT REQUEST
;
#IF (VDAEMU_SERKBD != $FF)
LD C,VDAEMU_SERKBD
JP CIO_DISPATCH
#ELSE
; RETURN QUEUED DATA IF WE HAVE ANY
LD A,(ANSI_QLEN) ; GET THE CURRENT QUEUE LENGTH
OR A ; SET FLAGS
@@ -140,6 +144,7 @@ ANSI_IN1: ; PERFORM ACTUAL KEYBOARD INPUT
ANSI_IN2: ; HANDLE SPECIAL KEY
CALL ANSI_KDISP ; IF $80 OR HIGHER, DISPATCH
JR ANSI_IN ; AND LOOP
#ENDIF
;
; WRITE A CHARACTER W/ EMULATION
;
@@ -166,6 +171,11 @@ ANSI_OUT2: ; SET RESULT AND RETURN
; CHECK INPUT STATUS
;
ANSI_IST: ; CHECK QUEUE FIRST
;
#IF (VDAEMU_SERKBD != $FF)
LD C,VDAEMU_SERKBD
JP CIO_DISPATCH
#ELSE
LD A,(ANSI_QLEN) ; GET CURRENT QUEUE LENGTH
OR A ; SET FLAGS
RET NZ ; RETURN IF CHAR(S) WAITING
@@ -196,6 +206,7 @@ ANSI_IST: ; CHECK QUEUE FIRST
ANSI_IST1: ; HANDLE SPECIAL KEY
CALL ANSI_KDISP ; DO SPECIAL KEY HANDLING
JR ANSI_IST ; REPEAT
#ENDIF
;
; CHECK OUTPUT STATUS
;

View File

@@ -1,4 +1,5 @@
#IF AUDIOTRACE
;
#DEFINE AUDTRACE(STR) PUSH DE \ LD DE, STR \ CALL WRITESTR \ POP DE
#DEFINE AUDTRACE_A CALL PRTHEXBYTE
#DEFINE AUDTRACE_B PUSH AF \ LD A, B \ CALL PRTHEXBYTE \ POP AF
@@ -9,12 +10,13 @@
#DEFINE AUDTRACE_BC PUSH HL \ PUSH BC \ POP HL \ CALL PRTHEXWORDHL \ POP HL
#DEFINE AUDTRACE_DE PUSH HL \ PUSH DE \ POP HL \ CALL PRTHEXWORDHL \ POP HL
#DEFINE AUDTRACE_IY PUSH HL \ PUSH IY \ POP HL \ CALL PRTHEXWORDHL \ POP HL
;
#DEFINE AUDDEBUG(S) push hl \ CALL PRTSTRD \ .TEXT S \ .TEXT "$" \ pop hl ; $$$$$$ PRINT STRING S TO CONSOLE - PRTD("HELLO") - NO TRAILING $ REQUIRED
;
#DEFINE AUDTRACE_CR AUDDEBUG("\r\n$")
;
#ELSE
;
#DEFINE AUDTRACE(S)
#DEFINE AUDTRACE_A
#DEFINE AUDTRACE_B
@@ -25,51 +27,76 @@
#DEFINE AUDTRACE_HL
#DEFINE AUDTRACE_DE
#DEFINE AUDTRACE_IY
;
#DEFINE AUDDEBUG(STR)
;
#DEFINE AUDTRACE_CR
;
#ENDIF
#IFNDEF AUDIOUTILS
#DEFINE AUDIOUTILS
;
#IFNDEF AUDIO_INC
#DEFINE AUDIO_INC
;
; NOTE TABLE VALUES ARE SHIFTED A FEW EXTRA BITS TO MAKE THE
; DIVISION AS ACCURATE AS POSSIBLE.
;
AUD_SCALE .EQU 3
;
; ON ENTRY, DE IS ADDRESS OF NOTE TABLE, HL IS NOTE TO PLAY
; NOTE VALUE 0 MEANS B0b/A0# IN OCTAVE 0 WHICH IS THE FIRST ENTRY
; OF THE NOTE TABLE. THE NOTE TABLE REPRESENTS THE FREQUENCIES
; FOR 1 FULL OCTAVE IN QUARTER NOTES. SINCE THERE ARE 12 NOTES
; IN AN OCTAVE, THE TABLE HAS 48 ENTRIES FOR ALL QUARTER NOTES.
;
; ON EXIT, HL CONTAINS THE PERIOD VALUE TO PROGRAM INTO THE PSG
; DERIVED FROM THE NOTE TABLE SCALED TO THE REQUESTED OCTAVE.
;
AUD_NOTE:
AUDDEBUG("AUDNOTE ")
AUDTRACE_HL
AUDTRACE_CR
AUDTRACE_DE
AUDTRACE_CR
push de
LD DE, 48
CALL DIV16
; BC IS OCTAVE COUNT
; HL is NOTE WITIN OCTAVE
ADD HL, HL
pop de
ADD HL, DE
LD A, (HL) ; RETRIEVE PERIOD COUNT FROM SN7NOTETBL
INC HL
LD H, (HL)
LD L, A
INC C
;
; START BY SEPARATING THE NOTE AND OCTAVE PORTION
; OF THE INCOMING TONE VALUE IN HL
PUSH DE ; SAVE NOTE TABLE ADR
LD DE,48 ; 48 QUARTERNOTES PER OCTAVE
CALL DIV16 ; SEPARATE OCTAVE AND NOTE
;
; THE QUOTIENT (BC) IS THE OCTAVE NUMBER REQUESTED
; THE REMAINDER (HL) IS THE QUARTER NOTE WITHIN THE OCTAVE.
;
; NOW USE THE QUARTER NOTE VALUE TO LOOKUP THE CORRESPONDING
; PSG PERIOD VALUE IN THE NOTE TABLE.
ADD HL,HL ; SCALE FOR 2 BYTE TABLE ENTRY SIZE
POP DE ; RECOVER THE TABLE ADR
ADD HL,DE ; HL := DESIRED TABLE ENTRY ADR
LD A,(HL) ; GET LOW BYTE OF PERIOD TO A
INC HL ; POINT TO HIGH BYTE VALUE
LD H,(HL) ; GET HIGH BYTE OF PERIOD TO H
LD L,A ; PUT LOW BYTE INTO L
;
; NOW WE SCALE THE PERIOD VALUE DOWN BASED ON THE OCTAVE VALUE IN C
; AND BY THE AUD_SCALE VALUE THAT WAS USED IN THE NOTE TABLE.
; FOR EACH OCTAVE, THE PERIOD IS HALVED WHICH DOUBLES THE FREQUENCY
; THAT WILL BE PRODUCED BY THE PSG. SINCE MOVING UP AN OCTAVE
; SHOULD PRODUCE A FREQUENCY THAT IS TWICE THE LOWER OCTIAVE, THIS
; WORKS NICELY, ALTHOUGH SOME ERROR MAY BE INTRODUCED.
;
LD A,AUD_SCALE ; SHIFT BY AUD_SCALE BITS
ADD A,C ; ... AND OCTAVE
LD B,A ; USE AS LOOP COUNTER
AUD_NOTE1:
DEC C
JR Z, AUD_NOTE2
SRL H
RR L
JR AUD_NOTE1
AUD_NOTE2:
LD A, L ; IF NOT ZERO
OR H
RET NZ ; RETURN THE CALCULATED PERIOD
LD H, $FF ; OTHERWISE RETURN -1 PERIOD (ERROR)
LD L, $FF
SRL H ; RIGHT SHIFT HL
RR L ; ... BY ONE BIT
DJNZ AUD_NOTE1 ; LOOP UNTIL DONE
;
; IF THE RESULTANT PERIOD IS ZERO, IT MEANS THAT THE REQUESTED
; PERIOD IS TOO LOW (FREQUENCY TOO HIGH) FOR THE PSG TO PRODUCE.
LD A, L ; CHECK FOR ZERO
OR H ; ... MEANING PSG CAN'T DO IT
RET NZ ; IF NOT ZERO, RETURN THE CALCULATED PERIOD
DEC HL ; OTHERWISE RETURN -1 PERIOD (ERROR)
RET
#ENDIF

View File

@@ -4,8 +4,12 @@
;
;======================================================================
;
; @3.579545 OCTAVE RANGE IS 2 - 7 (Bb2/A#2 .. A7)
; @4.000000 OCTAVE RANGE IS 2 - 7 (B2 .. A7)
; AY-3-8910 & YM2149 PSG CHIPS NEED AN INPUT CLOCK FREQUENCY OF
; NO MORE THAN 2 MHZ. THE CLOSEST THING THERE IS TO A STANDARD
; IS THE MSX FREQ OF 1.7897725 MHZ.
;
; @1.7897725 OCTAVE RANGE IS 2 - 7 (Bb2/A#2 .. A7)
; @2.0000000 OCTAVE RANGE IS 2 - 7 (B2 .. A7)
;
AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE
;
@@ -14,7 +18,6 @@ AY_RSEL .EQU $9A
AY_RDAT .EQU $9B
AY_RIN .EQU AY_RSEL
AY_ACR .EQU $9C
AY_CLK .SET 3579545 ; MSX NTSC COLOUR BURST FREQ = 315/88
#ENDIF
;
#IF (AYMODE == AYMODE_N8)
@@ -53,7 +56,6 @@ AY_RSEL .EQU $A0
AY_RDAT .EQU $A1
AY_RIN .EQU AY_RSEL
AY_ACR .EQU $A2
AY_CLK .SET 3579545 ; MSX NTSC COLOUR BURST FREQ = 315/88
#ENDIF
;
;======================================================================
@@ -92,14 +94,16 @@ AY_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE
;
AY_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS
AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS
;;
;#IF (AY_CLK > 3579545) ; DEPENDING ON THE
;AY_SCALE .EQU 2 ; INPUT CLOCK FREQUENCY
;#ELSE ; PRESCALE THE TONE PERIOD
;AY_SCALE .EQU 3 ; DATA TO MAINTAIN MAXIMUM
;#ENDIF ; RANGE AND ACCURACY
;
#IF (AY_CLK > 3579545) ; DEPENDING ON THE
AY_SCALE .EQU 2 ; INPUT CLOCK FREQUENCY
#ELSE ; PRESCALE THE TONE PERIOD
AY_SCALE .EQU 3 ; DATA TO MAINTAIN MAXIMUM
#ENDIF ; RANGE AND ACCURACY
;
AY_RATIO .EQU (AY_CLK * 100) / (16 >> AY_SCALE)
.ECHO "SN76489 CLOCK: "
.ECHO SN7CLK
.ECHO "\n"
;
#INCLUDE "audio.inc"
;
@@ -306,38 +310,8 @@ AY_VOLUME:
;======================================================================
;
AY_NOTE:
AUDTRACE(AYT_NOTE)
AUDTRACE_HL
AUDTRACE_CR
;
; CALL PRTHEXWORDHL
; CALL PC_COLON
;
LD DE, AY3NOTETBL ; ON ENTRY HL IS THE NOTE TO PLAY
PUSH DE ; AND DE IS THE START OF NOTE TABLE
LD DE, 48 ; LOAD DE WITH NOTE TABLE SIZE
CALL DIV16 ; AND CALCULATE OCTAVE COUNT IN BC
;
ADD HL, HL ; HL IS THE REMAINDER FROM ABOVE DIVISION (0-47) AND THE NOTE
POP DE ; TO PLAY IN THE OCTAVE. ADD IT TO THE START OF THE NOTE TABLE
ADD HL, DE ; TO POINT TO THE PERIOD FOR THE NOTE WE WANT TO PLAY.
;
LD A, (HL) ; HL POINT TO CURRENT PERIOD COUNT WE WANT TO PLAY
INC HL ; SO LOAD PERIOD COUNT FROM NOTE TABLE INTO HL
LD H, (HL) ; SO WE CAN UPDATE IT FOR THE REQUIRED OCTAVE
LD L, A
;
;LD A,AY_SCALE - 1 ; THE NOTE TABLE PERIOD DATA HAS BEEN
LD A,AY_SCALE ; THE NOTE TABLE PERIOD DATA HAS BEEN
ADD A,C ; PRESCALED TO MAINTAIN RANGE SO ALLOW
LD B,A ; FOR THIS WHEN CHANGING OCTAVE
AY_NOTE1:
SRL H ; ADJUST THE PERIOD DATA
RR L ; FOR THE DESIRED OCTAVE
DJNZ AY_NOTE1 ; FALL THROUGH TO SET PERIOD AND RANGE CHECK
;
; CALL PRTHEXWORDHL
; CALL NEWLINE
LD DE, AY3NOTETBL
CALL AUD_NOTE ; RETURNS PERIOD IN HL, FALL THRU
;
;======================================================================
; SOUND DRIVER FUNCTION - PERIOD
@@ -347,21 +321,22 @@ AY_PERIOD:
AUDTRACE(AYT_PERIOD)
AUDTRACE_HL
AUDTRACE_CR
LD A, H ; IF ZERO - ERROR
OR L
JR Z, AY_PERIOD1
;
LD A, H ; MAXIMUM TONE PERIOD IS 12-BITS
LD A,H ; IF ZERO - ERROR
OR L
JR Z,AY_PERIOD1
;
LD A,H ; MAXIMUM TONE PERIOD IS 12-BITS
AND 11110000B ; ALLOWED RANGE IS 0001-0FFF (4095)
JR NZ, AY_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE
LD (AY_PENDING_PERIOD), HL ; SAVE AND RETURN SUCCESSFUL
JR NZ,AY_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE
LD (AY_PENDING_PERIOD),HL ; SAVE AND RETURN SUCCESSFUL
XOR A ; SET SUCCESS
RET
;
AY_PERIOD1:
LD A, $FF ; REQUESTED PERIOD IS LARGER
LD (AY_PENDING_PERIOD), A ; THAN THE DEVICE CAN SUPPORT
LD (AY_PENDING_PERIOD+1), A; SO SET PERIOD TO FFFF
LD HL,$FFFF ; REQUESTED PERIOD IS LARGER
LD (AY_PENDING_PERIOD),HL ; THAN PSG CAN SUPPORT, SO
OR $FF ; SET PERIOD TO $FFFF
RET ; AND RETURN FAILURE
;
;======================================================================
@@ -612,10 +587,32 @@ AYT_REGWR .DB "\r\nOUT AY-3-8910 $"
; QUARTER TONE FREQUENCY TABLE
;======================================================================
;
; THE FREQUENCY BY QUARTER TONE STARTING AT A0# OCTAVE 0
; USED TO MAP EACH OCTAVE (DIV BY 2 TO JUMP AN OCTAVE UP)
; FIRST PLAYABLE NOTE WILL BE 0
; ASSUMING A CLOCK OF 1843200 THIS MAPS TO A0#
; THE FOLLOWING TABLE MAPS A FULL OCTAVE OF QUARTER-NOTES
; STARTING AT A# IN OCTAVE 0 TO THE CORRESPONDING PERIOD
; VALUE TO USE ON THE PSG TO ACHIEVE THE DESIRED NOTE FREQUENCY.
;
; THE FREQUENCY PRODUCED BY THE AY-3-8910 IS:
; FREQ = CLOCK / 16 / PERIOD
;
; SO, TO MAP A DESIRED FREQUENCY TO A PERIOD, WE USE:
; PERIOD = CLOCK / 16 / FREQ
;
; IN ORDER TO IMPROVE THE RESOLUTION OF THE FREQUENCY
; VALUE USED, WE ALSO MULTPLY BOTH SIDES OF THE EQUATION
; BY 100:
; PERIOD * 100 = (CLOCK / 16 / FREQ) * 100
;
; THE RESULTING PERIOD VALUE CAN BE REPEATEDLY HALVED
; TO TO JUMP UP AS MANY OCTAVES AS DESIRED.
;
; THE FINAL VALUE IS SHIFTED BY AUD_SCALE BITS
; IN ORDER TO IMPROVE THE RESOLUTION. THIS FINAL SHIFT
; IS REMOVED WHEN IN THE AY_NOTE ROUTINE.
;
; ASSUMING A CLOCK OF 1.7897725 MHZ, THE FIRST PLAYABLE
; NOTE WILL BE A0#/B0b (HBIOS NOTE CODE 0).
;
AY_RATIO .EQU (AY_CLK * 100) / (16 >> AUD_SCALE)
;
AY3NOTETBL:
.DW AY_RATIO / 2913 ; A0#/B0b 178977250 / 2913 = 61440; PROOF: 61440 >> 3 = 7680, 3579545 / 7680 / 16 = 29.13

View File

@@ -161,9 +161,7 @@ BQRTC_DISPATCH:
JP Z, BQRTC_SETALM ; Set Alarm
DEC A
JP Z, BQRTC_DEVICE ; Report RTC device info
CALL SYSCHK
LD A,ERR_NOFUNC
OR A
SYSCHKERR(ERR_NOFUNC)
RET
;
@@ -173,9 +171,7 @@ BQRTC_GETBYT:
BQRTC_SETBYT:
BQRTC_GETBLK:
BQRTC_SETBLK:
CALL SYSCHK
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL)
RET
; RTC Get Time

View File

@@ -34,7 +34,7 @@ DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VEREIFICATION (0=DISABLED)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED)
MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH]
RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE
RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE
@@ -66,6 +66,7 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED)
LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC]
@@ -77,6 +78,7 @@ DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE)
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI]
VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
;
@@ -123,7 +125,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM)
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|RC|RCV9958|RCKBD]
TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|RCV9958|RCKBD]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
@@ -173,7 +175,7 @@ PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER
PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER
;
SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT]
SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR]
SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE
SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY
SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -195,13 +197,13 @@ PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
;
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC2014|VGM]
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
SNMODE .EQU SNMODE_NONE ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
;
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
@@ -209,3 +211,6 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM)
DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC)
;
YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB)
VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC)

View File

@@ -34,7 +34,7 @@ DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VEREIFICATION (0=DISABLED)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED)
MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH]
MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY)
MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY)
@@ -67,6 +67,7 @@ WDOGIO .EQU $6F ; WATCHDOG REGISTER ADR
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED)
LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC]
@@ -78,6 +79,7 @@ DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE)
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI]
VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -160,7 +162,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM)
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|RC|RCV9958|RCKBD]
TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|RCV9958|RCKBD]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
@@ -210,7 +212,7 @@ PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER
PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER
;
SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT]
SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR]
SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE
SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY
SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -239,13 +241,13 @@ PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
;
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC2014|VGM]
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
;
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
@@ -253,3 +255,6 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM)
DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC)
;
YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB)
VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC)

View File

@@ -31,7 +31,7 @@ DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VEREIFICATION (0=DISABLED)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED)
MEMMGR .EQU MM_NONE ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH]
RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE
RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE
@@ -98,6 +98,7 @@ WDOGIO .EQU $6F ; WATCHDOG REGISTER ADR
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED)
LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC]
@@ -112,6 +113,7 @@ DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI]
VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -220,7 +222,7 @@ GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM)
GDCMODE .EQU GDCMODE_RPH ; GDC: GDC MODE: GDCMODE_[NONE|ECB|RPH]
GDCMON .EQU GDCMON_EGA ; GDC: GDC MONITOR SETUP: GDCMON_[NONE|CGA|EGA]
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|RC|RCV9958|RCKBD]
TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|RCV9958|RCKBD]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
@@ -278,7 +280,7 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER
PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER
;
SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE .EQU SDMODE_NONE ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT]
SDMODE .EQU SDMODE_NONE ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR]
SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE
SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY
SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -319,13 +321,13 @@ PIOSBASE .EQU $60 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
UFBASE .EQU $0C ; UF: REGISTERS BASE ADR
;
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC2014|VGM]
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
SNMODE .EQU SNMODE_NONE ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
;
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
@@ -333,3 +335,6 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM)
DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC)
;
YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB)
VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC)

View File

@@ -34,7 +34,7 @@ DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VEREIFICATION (0=DISABLED)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED)
MEMMGR .EQU MM_MBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH]
MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY)
MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY)
@@ -63,6 +63,7 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU TRUE ; ENABLES STATUS LED
LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC]
@@ -77,6 +78,7 @@ DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI]
VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -148,7 +150,7 @@ CVDUMODE .EQU CVDUMODE_MBC ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC]
CVDUMON .EQU CVDUMON_CGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA]
GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM)
TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_MBC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|RC|RCV9958|RCKBD]
TMSMODE .EQU TMSMODE_MBC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|RCV9958|RCKBD]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
@@ -207,7 +209,7 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER
PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER
;
SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE .EQU SDMODE_JUHA ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT]
SDMODE .EQU SDMODE_JUHA ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR]
SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE
SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY
SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -243,13 +245,13 @@ PIOSBASE .EQU $60 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
UFBASE .EQU $0C ; UF: REGISTERS BASE ADR
;
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC2014|VGM]
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
SNMODE .EQU SNMODE_NONE ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
;
AY38910ENABLE .EQU TRUE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU 3579545 / 2 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
AYMODE .EQU AYMODE_MBC ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
;
SPKENABLE .EQU TRUE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
@@ -257,3 +259,7 @@ SPKENABLE .EQU TRUE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM)
DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_MBC ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC)
;
YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB)
VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC)

View File

@@ -34,7 +34,7 @@ DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VEREIFICATION (0=DISABLED)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED)
MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH]
RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE
RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE
@@ -69,6 +69,7 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED)
LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC]
@@ -83,6 +84,7 @@ DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI]
VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -148,7 +150,7 @@ CVDUMODE .EQU CVDUMODE_ECB ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC]
CVDUMON .EQU CVDUMON_EGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA]
GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|RC|RCV9958|RCKBD]
TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|RCV9958|RCKBD]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
@@ -206,7 +208,7 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER
PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER
;
SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE .EQU SDMODE_MK4 ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT]
SDMODE .EQU SDMODE_MK4 ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR]
SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE
SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY
SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -245,13 +247,13 @@ PIOSBASE .EQU $60 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
UFBASE .EQU $0C ; UF: REGISTERS BASE ADR
;
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC2014|VGM]
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
SNMODE .EQU SNMODE_VGM ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
;
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
@@ -259,3 +261,6 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM)
DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_ECB ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC)
;
YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB)
VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC)

View File

@@ -34,7 +34,7 @@ DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VEREIFICATION (0=DISABLED)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED)
MEMMGR .EQU MM_N8 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH]
RAMBIAS .EQU 0 ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE
RAMLOC .EQU 0 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE
@@ -71,6 +71,7 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED
LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC]
@@ -85,6 +86,7 @@ DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI]
VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -150,7 +152,7 @@ CVDUMODE .EQU CVDUMODE_ECB ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC]
CVDUMON .EQU CVDUMON_EGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA]
GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM)
TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|RC|RCV9958|RCKBD]
TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|RCV9958|RCKBD]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
@@ -240,13 +242,13 @@ PIOSBASE .EQU N8_PPI0 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
FIFO_BASE .EQU $0C ; UF: REGISTERS BASE ADR
;
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC2014|VGM]
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
SNMODE .EQU SNMODE_VGM ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
;
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
AYMODE .EQU AYMODE_N8 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
@@ -254,3 +256,6 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM)
DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC)
;
YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB)
VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC)

View File

@@ -34,7 +34,7 @@ DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VEREIFICATION (0=DISABLED)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED)
MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH]
RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE
RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE
@@ -69,6 +69,7 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED)
LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC]
@@ -80,6 +81,7 @@ DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE)
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI]
VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -167,7 +169,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM)
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|RC|RCV9958|RCKBD]
TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|RCV9958|RCKBD]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
@@ -223,7 +225,7 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER
PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER
;
SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT]
SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR]
SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE
SDCNT .EQU 2 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY
SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -252,13 +254,13 @@ PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
;
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC2014|VGM]
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
;
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
@@ -266,3 +268,6 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM)
DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC)
;
YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB)
VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC)

View File

@@ -34,7 +34,7 @@ DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VEREIFICATION (0=DISABLED)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED)
MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH]
RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE
RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE
@@ -74,6 +74,7 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED)
LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC]
@@ -85,6 +86,7 @@ DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE)
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI]
VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -182,7 +184,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM)
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|RC|RCV9958|RCKBD]
TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|RCV9958|RCKBD]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
@@ -238,7 +240,7 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER
PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER
;
SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT]
SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR]
SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE
SDCNT .EQU 2 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY
SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -267,13 +269,13 @@ PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
;
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC2014|VGM]
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
;
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
@@ -281,3 +283,6 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM)
DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_Z280 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC)
;
YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB)
VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC)

View File

@@ -34,7 +34,7 @@ DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VEREIFICATION (0=DISABLED)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED)
MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH]
MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY)
MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY)
@@ -68,6 +68,7 @@ WDOGIO .EQU $6E ; WATCHDOG REGISTER ADR
DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED)
LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC]
@@ -79,6 +80,7 @@ DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE)
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI]
VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -171,7 +173,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM)
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|RC|RCV9958|RCKBD]
TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|RCV9958|RCKBD]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
@@ -227,7 +229,7 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER
PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER
;
SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT]
SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR]
SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE
SDCNT .EQU 2 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY
SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -259,13 +261,13 @@ PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
;
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
SNMODE .EQU SNMODE_RCZ80 ; DRIVER MODE: SNMODE_[NONE|RC2014|VGM]
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
;
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
@@ -273,3 +275,6 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM)
DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_RC ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC)
;
YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB)
VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC)

View File

@@ -34,7 +34,7 @@ DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VEREIFICATION (0=DISABLED)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED)
MEMMGR .EQU MM_RPH ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH]
RAMBIAS .EQU 0 ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE
RAMLOC .EQU 0 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE
@@ -69,6 +69,7 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED
LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC]
@@ -83,6 +84,7 @@ DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI]
VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -150,7 +152,7 @@ GDCENABLE .EQU TRUE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM)
GDCMODE .EQU GDCMODE_RPH ; GDC: GDC MODE: GDCMODE_[NONE|ECB|RPH]
GDCMON .EQU GDCMON_EGA ; GDC: GDC MONITOR SETUP: GDCMON_[NONE|CGA|EGA]
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|RC|RCV9958|RCKBD]
TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|RCV9958|RCKBD]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
@@ -208,7 +210,7 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER
PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER
;
SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE .EQU SDMODE_CSIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT]
SDMODE .EQU SDMODE_CSIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR]
SDPPIBASE .EQU RPH_PPI0 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE
SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY
SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -240,13 +242,13 @@ PIOSBASE .EQU RPH_PPI0 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
FIFO_BASE .EQU $0C ; UF: REGISTERS BASE ADR
;
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC2014|VGM]
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
SNMODE .EQU SNMODE_NONE ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
;
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
AYMODE .EQU AYMODE_N8 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
@@ -254,3 +256,6 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM)
DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC)
;
YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB)
VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC)

View File

@@ -34,7 +34,7 @@ DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VEREIFICATION (0=DISABLED)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED)
MEMMGR .EQU MM_SBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH]
MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY)
MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY)
@@ -63,6 +63,7 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED
LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC]
@@ -77,6 +78,7 @@ DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI]
VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -148,7 +150,7 @@ CVDUMODE .EQU CVDUMODE_ECB ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC]
CVDUMON .EQU CVDUMON_EGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA]
GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|RC|RCV9958|RCKBD]
TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|RCV9958|RCKBD]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
@@ -207,7 +209,7 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER
PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER
;
SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE .EQU SDMODE_JUHA ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT]
SDMODE .EQU SDMODE_JUHA ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR]
SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE
SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY
SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -243,13 +245,13 @@ PIOSBASE .EQU $60 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
UFBASE .EQU $0C ; UF: REGISTERS BASE ADR
;
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN7CLK .EQU 3575950 ; DEFAULT OSCILLATOR
SNMODE .EQU SNMODE_VGM ; DRIVER MODE: SNMODE_[NONE|RC2014|VGM]
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
SNMODE .EQU SNMODE_VGM ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
;
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
@@ -257,3 +259,6 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM)
DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_ECB ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC)
;
YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB)
VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC)

View File

@@ -34,7 +34,7 @@ DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VEREIFICATION (0=DISABLED)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED)
MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH]
RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE
RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE
@@ -64,6 +64,7 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $0D ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED)
LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC]
@@ -75,6 +76,7 @@ DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE)
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI]
VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -162,7 +164,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM)
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|RC|RCV9958|RCKBD]
TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|RCV9958|RCKBD]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
@@ -218,7 +220,7 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER
PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER
;
SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE .EQU SDMODE_SC ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT]
SDMODE .EQU SDMODE_SC ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR]
SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE
SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY
SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -247,13 +249,13 @@ PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
;
UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM)
;
SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
SNMODE .EQU SNMODE_NONE ; DRIVER MODE: SNMODE_[NONE|RC2014|VGM]
SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD
SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM]
;
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4
AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER
AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD
AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC]
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
@@ -261,3 +263,6 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM)
DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC)
;
YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB)
VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC)

View File

@@ -32,3 +32,5 @@ ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
RTCIO .EQU $70 ; RTC LATCH REGISTER ADR
;
DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE)
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING

View File

@@ -34,7 +34,7 @@ DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VEREIFICATION (0=DISABLED)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED)
MEMMGR .EQU MM_SBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH]
MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY)
MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY)
@@ -55,6 +55,7 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED
LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC]
@@ -69,6 +70,7 @@ DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI]
VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
;
@@ -121,7 +123,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM)
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|RC|RCV9958|RCKBD]
TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|RCV9958|RCKBD]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
@@ -151,7 +153,7 @@ PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER
PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER
;
SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT]
SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR]
SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE
SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY
SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -185,3 +187,6 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM)
DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC)
;
YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB)
VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC)

View File

@@ -34,7 +34,7 @@ DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VEREIFICATION (0=DISABLED)
ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED)
MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH]
MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY)
MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY)
@@ -66,6 +66,7 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
;
LEDENABLE .EQU FALSE ; ENABLES STATUS LED
LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC]
@@ -80,6 +81,7 @@ DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ)
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI]
VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
;
@@ -132,7 +134,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM)
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|RC|RCV9958|RCKBD]
TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|RCV9958|RCKBD]
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
@@ -162,7 +164,7 @@ PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER
PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER
;
SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT]
SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR]
SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE
SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY
SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
@@ -193,7 +195,9 @@ SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)
;
;
DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM)
DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC)
;
YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB)
VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC)

View File

@@ -112,7 +112,7 @@ CTC_PREINIT1:
;
; CTC USES 4 CONSECUTIVE VECTOR POSITIONS, ONE FOR
; EACH CHANNEL. BELOW WE SET THE BASE VECTOR TO THE
; START OF THE IVT, SO THE FIRST FOUR ENTIRES OF THE
; START OF THE IVT, SO THE FIRST FOUR ENTRIES OF THE
; IVT CORRESPOND TO CTC CHANNELS A-D.
LD A,INT_CTC0A * 2
OUT (CTCBASE),A ; SETUP CTC BASE INT VECTOR

View File

@@ -171,9 +171,7 @@ CVDU_VDADEV:
RET
CVDU_VDASCS:
CALL SYSCHK ; NOT IMPLEMENTED (YET)
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED (YET)
RET
CVDU_VDASCP:

View File

@@ -100,9 +100,7 @@ DS7_DISPATCH:
JP Z, DS7_SETALM ; SET ALARM
DEC A
JP Z, DS7_DEVICE ; REPORT RTC DEVICE INFO
CALL SYSCHK
LD A,ERR_NOFUNC
OR A
SYSCHKERR(ERR_NOFUNC)
RET
;
;-----------------------------------------------------------------------------
@@ -269,9 +267,7 @@ DS7_GETBLK:
DS7_SETBLK:
DS7_SETALM
DS7_GETALM
CALL SYSCHK
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL)
RET
;-----------------------------------------------------------------------------
; REPORT RTC DEVICE INFO
@@ -329,7 +325,7 @@ DS7_RL1:CALL PCF_READI2C
;
#IF (0)
LD A,8
LD DE,DS7_BUF ; DISLAY DATA READ
LD DE,DS7_BUF ; DISPLAY DATA READ
CALL PRTHEXBUF ;
CALL NEWLINE
#ENDIF

View File

@@ -3,7 +3,7 @@
; DSKY (DISPLAY AND KEYBOARD) ROUTINES
;==================================================================================================
;
; THE DSKY MAY COSESIDE ON THE SAME PPI BUS AS A PPISD. IT MAY NOT
; THE DSKY MAY COINCIDE ON THE SAME PPI BUS AS A PPISD. IT MAY NOT
; SHARE A PPI BUS WITH A PPIDE. SEE PPI_BUS.TXT FOR MORE INFORMATION.
;
; LED SEGMENTS (BIT VALUES)

View File

@@ -247,9 +247,7 @@ DSRTC_DISPATCH:
JP Z,DSRTC_SETALM ; SET ALARM
DEC A
JP Z,DSRTC_DEVICE ; REPORT RTC DEVICE INFO
CALL SYSCHK
LD A,ERR_NOFUNC
OR A
SYSCHKERR(ERR_NOFUNC)
RET
;
; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR
@@ -258,9 +256,7 @@ DSRTC_GETBLK:
DSRTC_SETBLK:
DSRTC_GETALM:
DSRTC_SETALM:
CALL SYSCHK
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL)
RET
;
; RTC GET TIME

View File

@@ -490,9 +490,7 @@ FD_FNTBL:
FD_VERIFY:
FD_FORMAT:
FD_DEFMED:
CALL SYSCHK ; INVALID SUB-FUNCTION
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL) ; INVALID SUB-FUNCTION
RET
;
;
@@ -1149,9 +1147,7 @@ FD_RUN1:
JR Z,FC_WRITE
CP DOP_READID
JR Z,FC_READID
CALL SYSCHK
LD A,ERR_NOFUNC
OR A
SYSCHKERR(ERR_NOFUNC)
RET
FD_RUNCHK:

View File

@@ -157,9 +157,7 @@ GDC_VDADEV: ; VIDEO DEVICE INFORMATION
RET
;
GDC_VDASCS: ; SET CURSOR STYLE
CALL SYSCHK ; NOT IMPLEMENTED (YET)
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL)
RET
GDC_VDASCP: ; SET CURSOR POSITION

View File

@@ -53,6 +53,8 @@
; - build.inc
; - config/<plt>_<cfg>.asm
; - cfg_<plt>.asm
; - [z180.inc|z280.inc]
; - [eipc.inc]
; - <drivers>.asm
; - <fonts>.asm
; - util.asm
@@ -61,7 +63,7 @@
; - decode.asm
; - encode.asm
; - [xio|mio].asm
; - dsky.asm
; - [dsky.asm|dskyng.asm]
; - unlzsa2s.asm
;
; INCLUDE GENERIC STUFF
@@ -90,7 +92,7 @@ MODCNT .SET MODCNT + 1
; SOME HARDWARE REQUIRES A SPECIFIC ROMSIZE (NOTABLY ZZRCC) OR THE
; RESULTING BUILD IMAGES WILL BE CORRUPT. ROMSIZE_CHK IS SPECIFIED
; IN THE CONFIG FILE AND IS VERIFIED AGAINST THE ROMSIZE BEING USED
; BY THE BUILD. A ROMSIZE_CHK VALUE OF 0 INDICATES THE VERFICATION
; BY THE BUILD. A ROMSIZE_CHK VALUE OF 0 INDICATES THE VERIFICATION
; IS DISABLED (WHICH IT USUALLY IS).
;
#IF (ROMSIZE_CHK != 0) & (ROMSIZE != ROMSIZE_CHK)
@@ -132,6 +134,11 @@ MODCNT .SET MODCNT + 1
#DEFINE LED(N) \;
#ENDIF
;
#DEFINE SYSCHKERR(HB_ERR) \
#DEFCONT \ CALL SYSCHKA
#DEFCONT \ LD A,HB_ERR
#DEFCONT \ OR A
;
;
;
#IF (INTMODE == 0)
@@ -1094,14 +1101,14 @@ HB_START:
;
#IFDEF APPBOOT
#IF (MEMMGR == MM_Z280)
LD A,%00000001
LD A,DIAG_01
OUT (DIAGPORT),A
LD DE,Z280_BOOTERR
LD C,9
LD A,%00000010
LD A,DIAG_02
OUT (DIAGPORT),A
CALL $0005
LD A,%00001000
LD A,DIAG_04
OUT (DIAGPORT),A
RET
;
@@ -1130,7 +1137,7 @@ Z280_BOOTERR .TEXT "\r\n\r\n*** Application mode boot not supported under Z280 n
#ENDIF
;
#IF (DIAGENABLE)
LD A,%00000001
LD A,DIAG_01
OUT (DIAGPORT),A
#ENDIF
#IF (LEDENABLE)
@@ -1240,7 +1247,7 @@ Z280_INITZ:
LD A,Z180_BASE
OUT0 ($3F),A ; AT RESET, ICR IS AT $3F
DIAG(%00000010)
DIAG(DIAG_02)
; DISABLE REFRESH
XOR A
@@ -1334,8 +1341,10 @@ Z280_INITZ:
; NOT WANT TO EFFECT RAM UNTIL AFTER THE BACKUP BATTERY STATUS CHECK
; IS PERFORMED NEXT.
;
LD A,%00000011
#IF (DIAGENABLE)
LD A,DIAG_02
OUT (DIAGPORT),A
#ENDIF
;
; WE USE THE TWO BYTES IMMEDIATELY BELOW THE PROXY TO STORE A COUPLE
; VALUES TEMPORARILY BECAUSE WE MAY BE OPERATING IN ROM AT THIS POINT.
@@ -1354,7 +1363,7 @@ Z280_INITZ:
; WILL NOT START CORRECTLY WHEN THEY CHECK THE ROM ID VERSION BYTES.
; THE BATTERY CONDITION VALUE IS TEMPORARILY STORED AT HBX_LOC - 1
; BECAUSE WE ARE CURRENTLY RUNNING IN ROM. AFTER WE TRANSITION HBIOS
; TO RAM, THE VALUE IS MOVED TO IT'S REAL LCOATION AT HB_BATCOND.
; TO RAM, THE VALUE IS MOVED TO IT'S REAL LOCATION AT HB_BATCOND.
; IF THERE IS NO DS1210 IN THE SYSTEM, THE CODE BELOW DOES NO HARM.
;
LD HL,HBX_LOC - 1 ; POINT TO BYTE
@@ -1660,8 +1669,8 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK
; THAT.
LD SP,HBX_LOC - 2 ; RESET STACK
;
; NOTIFY THAT WE MADE THE TRANSTION!
DIAG(%00000111)
; NOTIFY THAT WE MADE THE TRANSITION!
DIAG(DIAG_03)
LED(%00000010)
;
; SET THE IN-RAM FLAG
@@ -1788,7 +1797,7 @@ SAVE_REC_M:
#ENDIF
#ENDIF
;
DIAG(%00001111)
DIAG(DIAG_04)
;
#IF (WBWDEBUG == USEMIO) ; BUFFER OUTPUT UNTIL
CALL MIO_INIT ; WE GET TO BOOT MESSAGE
@@ -1877,7 +1886,7 @@ HB_CPU1:
;
#ENDIF
;
DIAG(%00011111)
DIAG(DIAG_05)
;
; INIT OSCILLATOR SPEED FROM CONFIG
;
@@ -2169,7 +2178,7 @@ Z280_TC .EQU CPUOSC / 4 / 50 / 2 ; TIME CONSTANT
LD A,$FF ; FILL WITH $FF
CALL FILL ; DO IT
;
DIAG(%00111111)
DIAG(DIAG_06)
;
#IF FALSE
;
@@ -2225,7 +2234,7 @@ NOT_REC_M0:
;
#ENDIF
;
DIAG(%01111111)
DIAG(DIAG_07)
LED(%00000011)
;
;
@@ -2313,7 +2322,7 @@ NXTMIO: LD A,(HL)
#ENDIF
NOT_REC_M2:
;
DIAG(%11111111)
DIAG(DIAG_08)
;
; IO PORT SCAN
;
@@ -2803,6 +2812,43 @@ INITSYS3:
;
#ENDIF
;
#IF 0
;
LD HL,0
CALL DBG_NOTE
LD HL,48
CALL DBG_NOTE
LD HL,204
CALL DBG_NOTE
LD HL,268
CALL DBG_NOTE
LD HL,436
CALL DBG_NOTE
;
JP INITSYS4
;
DBG_NOTE:
PUSH HL
CALL NEWLINE
PRTS("AY: $")
CALL PRTDEC16
PRTS("=$")
CALL AY_NOTE
LD HL,(AY_PENDING_PERIOD)
CALL PRTDEC16
POP HL
;
PRTS(" SN: $")
CALL PRTDEC16
PRTS("=$")
CALL SN7_NOTE
LD HL,(SN7_PENDING_PERIOD)
CALL PRTDEC16
;
RET
;
#ENDIF
;
INITSYS4:
;
#IF (MEMMGR == MM_Z280)
@@ -2970,6 +3016,9 @@ HB_INITTBL:
#IF (SN76489ENABLE)
.DW SN76489_INIT
#ENDIF
#IF (YM2612ENABLE)
.DW YM2612_INIT
#ENDIF
#IF (SPKENABLE)
.DW SP_INIT ; AUDIBLE INDICATOR OF BOOT START
#ENDIF
@@ -3073,7 +3122,6 @@ HB_INITTBL:
#IF (PPPENABLE)
.DW PPP_INIT
#ENDIF
;
HB_INITTBLLEN .EQU (($ - HB_INITTBL) / 2)
;
@@ -3126,7 +3174,7 @@ HB_DISPATCH:
PUSH AF
LD A,(HB_STACK - HB_STKSIZ + $08)
CP $FF
CALL SYSCHK
SYSCHKERR(ERR_INTERNAL)
LD A,$FF
LD (HB_STACK - HB_STKSIZ + $08),A
POP AF
@@ -3154,9 +3202,7 @@ HB_DISPATCH1:
; FALL THRU
;
HB_DISPERR:
CALL SYSCHK
LD A,ERR_NOFUNC
OR A
SYSCHKERR(ERR_NOFUNC)
RET
;
;==================================================================================================
@@ -3497,7 +3543,7 @@ HB_DSKFN:
HB_DSKFNADR .EQU $+1
CALL PANIC ; READ ONE SECTOR
#IF (DIAGENABLE & DIAGDISKIO)
DIAG(0) ; CLEAR DIAG LEDS
DIAG(DIAG_00) ; CLEAR DIAG LEDS
#ENDIF
#IF (LEDENABLE & LEDDISKIO)
LED($00)
@@ -3618,9 +3664,7 @@ RTC_DISPATCH:
RET
;
RTC_DISPERR:
CALL SYSCHK
LD A,ERR_NOHW
OR A
SYSCHKERR(ERR_NOHW)
RET
;
; SET RTC DISPATCH ADDRESS, USED BY RTC DRIVERS DURING INIT
@@ -3718,7 +3762,7 @@ SND_ADDENT:
; WORD UNIT SPECIFIC DATA (TYPICALLY A DEVICE INSTANCE DATA ADDRESS)
;
SND_FNCNT .EQU 8 ; NUMBER OF SND FUNCS (FOR RANGE CHECK)
SND_MAX .EQU 4 ; UP TO 4 UNITS
SND_MAX .EQU 5 ; UP TO 5 UNITS
SND_SIZ .EQU SND_MAX * 4 ; EACH ENTRY IS 4 BYTES
;
.DB SND_FNCNT ; SND FUNCTION COUNT (FOR RANGE CHECK)
@@ -3730,7 +3774,7 @@ SND_TBL .FILL SND_SIZ,0 ; SPACE FOR ENTRIES
; SPEAKER BEEP ROUTINE
;==================================================================================================
;
; ROUTINE TO BEEP THE DEAULT SOUND UNIT
; ROUTINE TO BEEP THE DEFAULT SOUND UNIT
; NEED TO CHECK FOR EXISTENCE OF SOUND UNIT
; WHICH CHANNEL SHOULD BE USED? IS THERE A GOOD DEFAULT CHANNEL?
;
@@ -3818,9 +3862,7 @@ SYS_RESET:
JR Z,SYS_RESCOLD
CP BF_SYSRES_USER
JR Z,SYS_RESUSER
CALL SYSCHK
LD A,ERR_NOFUNC
OR A ; SIGNAL ERROR
SYSCHKERR(ERR_NOFUNC)
RET
;
; SOFT RESET HBIOS, RELEASE HEAP MEMORY NOT USED BY HBIOS
@@ -4024,9 +4066,7 @@ SYS_ALLOC:
; ALL OTHER REGISTERS PRESERVED
;
SYS_FREE:
CALL SYSCHK ; NOT YET IMPLEMENTED
LD A,ERR_NOTIMPL ; NOT YET INMPLEMENTED
OR A ; SET FLAGS
SYSCHKERR(ERR_NOTIMPL) ; NOT YET INMPLEMENTED
RET
;
; GET SYSTEM INFORMATION
@@ -4066,9 +4106,7 @@ SYS_GET:
JP Z,SYS_GETBNKINFO
CP BF_SYSGET_CPUSPD
JP Z,SYS_GETCPUSPD
CALL SYSCHK
LD A,ERR_NOFUNC ; SIGNAL ERROR
OR A ; SET FLAGS
SYSCHKERR(ERR_NOFUNC) ; SIGNAL ERROR
RET
;
; GET TIMER
@@ -4155,7 +4193,7 @@ SYS_GETBNKINFO:
XOR A
RET
;
; GET SYSTEM CPU SPEED ORMANCE ATTRIBUTES
; GET SYSTEM CPU SPEED PERFORMANCE ATTRIBUTES
; RETURNS:
; L: CLOCK MULT (0:HALF, 1:FULL, 2: DOUBLE)
; D: MEMORY WAIT STATES
@@ -4360,9 +4398,7 @@ SYS_SET:
JR Z,SYS_SETBOOTINFO
CP BF_SYSSET_CPUSPD
JR Z,SYS_SETCPUSPD
CALL SYSCHK
LD A,ERR_NOFUNC ; SIGNAL ERROR
OR A ; SET FLAGS
SYSCHKERR(ERR_NOFUNC) ; SIGNAL ERROR
RET
;
; SET BOOT INFORMATION
@@ -4723,9 +4759,7 @@ SYS_INT:
JR Z,SYS_INTGET
CP BF_SYSINT_SET
JR Z,SYS_INTSET
CALL SYSCHK
LD A,ERR_NOFUNC ; SIGNAL ERROR
OR A ; SET FLAGS
SYSCHKERR(ERR_NOFUNC) ; SIGNAL ERROR
RET
;
; GET INTERRUPT SYSTEM INFORMATION
@@ -4751,9 +4785,7 @@ SYS_INTINFO:
;
SYS_INTVECADR:
#IF (INTMODE == 0)
CALL SYSCHK ; INVALID FOR INT MODE 0
LD A,ERR_BADCFG ; SIGNAL ERROR
OR A ; SET FLAGS
SYSCHKERR(ERR_BADCFG) ; SIGNAL ERROR. INVALID FOR INT MODE 0
RET
#ENDIF
#IF (INTMODE == 1)
@@ -4767,9 +4799,7 @@ SYS_INTVECADR:
LD A,E ; INCOMING INDEX POSITION TO A
CP C ; COMPARE TO VECTOR COUNT
JR C,SYS_INTGET1 ; CONTINUE IF POSITION IN RANGE
CALL SYSCHK ; ELSE ERROR
LD A,ERR_RANGE ; SIGNAL ERROR
OR A ; SET FLAGS
SYSCHKERR(ERR_RANGE) ; ELSE ERROR
RET
SYS_INTGET1:
OR A ; CLEAR CARRY
@@ -5250,15 +5280,11 @@ HB_DISPCALC:
RET ; JUMP TO DRIVER FUNC ADR ON TOS
;
HB_FUNCERR:
CALL SYSCHK
LD A,ERR_NOFUNC ; SIGNAL ERROR
OR A ; SET FLAGS
SYSCHKERR(ERR_NOFUNC) ; SIGNAL ERROR
RET
;
HB_UNITERR:
CALL SYSCHK
LD A,ERR_NOUNIT ; SIGNAL ERROR
OR A ; SET FLAGS
SYSCHKERR(ERR_NOUNIT) ; SIGNAL ERROR
RET
;
; ADD AN ENTRY TO THE UNIT TABLE AT ADDRESS IN HL
@@ -5345,9 +5371,7 @@ HB_ALLOC:
HB_ALLOC1:
; ERROR RETURN
POP DE ; RESTORE INCOMING DE
CALL SYSCHK
LD A,ERR_NOMEM ; SIGNAL ERROR
OR A ; SET FLAGS
SYSCHKERR(ERR_NOMEM) ; SIGNAL ERROR
RET
;
HB_TMPSZ .DW 0
@@ -6031,7 +6055,7 @@ SIZ_FONTS .EQU $ - ORG_FONTS
.ECHO SIZ_FONTS
.ECHO " bytes.\n"
;
#IF (CVDUENABLE | VGAENABLE) | GDCENABLE | (TMSENABLE & ((TMSMODE == TMSMODE_RCKBD) | (TMSMODE == TMSMODE_MBC)))
#IF (CVDUENABLE | VGAENABLE) | GDCENABLE | (TMSENABLE & ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC)))
ORG_KBD .EQU $
#INCLUDE "kbd.asm"
SIZ_KBD .EQU $ - ORG_KBD
@@ -6189,6 +6213,14 @@ SIZ_AY38910 .EQU $ - ORG_AY38910
.ECHO SIZ_AY38910
.ECHO " bytes.\n"
#ENDIF
#IF (YM2612ENABLE)
ORG_YM2612 .EQU $
#INCLUDE "ym2612.asm"
SIZ_YM2612 .EQU $ - ORG_YM2612
.ECHO "YM2612 occupies "
.ECHO SIZ_YM2612
.ECHO " bytes.\n"
#ENDIF
;
.ECHO "RTCDEF="
.ECHO RTCDEF
@@ -6335,7 +6367,7 @@ HB_RDSEC:
;
; SYSTEM CHECK: DUMP MACHINE STATE AND CONTINUE?
;
SYSCHK:
SYSCHKA:
; CHECK DIAG LEVEL TO SEE IF WE SHOULD DISPLAY
PUSH AF ; PRESERVE INCOMING AF VALUE
LD A,(CB_DIAGLVL) ; GET DIAGNOSTIC LEVEL
@@ -6349,6 +6381,17 @@ SYSCHK:
CALL WRITESTR ; PRINT IT
POP DE ; RESTORE DE VALUE
CALL XREGDMP ; DUMP REGISTERS
; DISPLAY ERROR CODE. IT IS AT RETURN ADDRESS+1 .. LD A,XX
EX (SP),HL ; GET RETURN ADDRESS
INC HL ; POINT TO THE ERROR CODE
PUSH AF
LD A,(HL) ; DISPLAY
CALL PRTHEXBYTE
POP AF
DEC HL ; RESTORE RETURN ADDRESS
EX (SP),HL
;
JR CONTINUE ; CHECK W/ USER
;
SYSCHK1:
@@ -6558,7 +6601,8 @@ PS_PRTDC:
RES 7,D ; CLEAR LBA BIT
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
CALL SRL32 ; RIGHT SHIFT
CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
;CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
CALL PRTDEC32 ; PRINT DWORD IN DECIMAL
PRTS("MB$") ; PRINT SUFFIX
CALL PC_COMMA
PRTS("LBA$") ; FOR NOW, WE ASSUME HARD DISK DOES LBA
@@ -6572,7 +6616,8 @@ PS_PRTDC1:
RES 7,D ; CLEAR LBA BIT
LD B,1 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
CALL SRL32 ; RIGHT SHIFT
CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
;CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
CALL PRTDEC32 ; PRINT DWORD IN DECIMAL
PRTS("KB$") ; PRINT SUFFIX
CALL PC_COMMA
PRTS("LBA$") ; FOR NOW, WE ASSUME HARD DISK DOES LBA
@@ -6815,7 +6860,7 @@ PS_SOUND:
; DEVICE COLUMN
PUSH BC ;
PUSH BC
LD E,C
XOR A
LD DE,PS_SDSND ; POINT TO DEVICE TYPE NAME TABLE
@@ -6823,12 +6868,10 @@ PS_SOUND:
LD A,C ; MOVE UNIT NUM TO A
CALL PRTDECB ; PRINT IT
CALL PC_COLON
CP 10 ; CHECK FOR MULTIPLE DIGITS
CALL C,PC_SPACE ; EXTRA SPACE IF NEEDED
LD A,(PRTIDXCNT)
SUB 9+1
CPL
CALL PS_PAD
SUB 12-1 ; SUBTRACT FIELD WIDTH (LESS THE COLON)
NEG ; MAKE IT A POSITIVE NUMBER
CALL PS_PAD ; PAD AS NEEDED
POP BC
; DEVICE TYPE
@@ -6845,9 +6888,9 @@ PS_SOUND:
LD DE,PS_SDSN76489
CALL PRTIDXDEA
LD A,(PRTIDXCNT)
SUB 18+1
CPL
CALL PS_PAD ; PAD N SPACES (SPECIFIED IN A)
SUB 18 ; SUBTRACT FIELD WIDTH
NEG ; MAKE IT A POSITIVE NUMBER
CALL PS_PAD ; PAD AS NEEDED
; DEVICE CHARACTERISTICS
;
@@ -6889,7 +6932,7 @@ PS_PRTDEV:
CALL PS_PAD ; PAD N SPACES (SPECIFIED IN A)
RET
;
; PRINT DEVICE NMEMONIC, DEVTYP/NUM SPECIFIED IN DE
; PRINT DEVICE MNEMONIC, DEVTYP/NUM SPECIFIED IN DE
;
PS_PRTNUL:
LD HL,PS_STRNUL
@@ -7035,6 +7078,7 @@ PS_SDSND .TEXT "SND$"
PS_SDSN76489 .TEXT "SN76489$"
PS_SDAY38910 .TEXT "AY-3-8910$"
PS_SDBITMODE .TEXT "I/O PORT$"
PS_SDYM2612 .TEXT "YM2612$"
;
; 0 1 2 3 4 5 6 7
; 01234567890123456789012345678901234567890123456789012345678901234567890123456789

View File

@@ -156,6 +156,111 @@ ERR_TIMEOUT .EQU -11 ; DEVICE TIMEOUT
ERR_BADCFG .EQU -12 ; INVALID CONFIGURATION
ERR_INTERNAL .EQU -13 ; INTERNAL ERROR
;
; HBIOS DIAG OPTIONS
;
DIAG_PROG .EQU 0 ; PROGRESS BAR
DIAG_STEP .EQU 1 ; STEP BAR
DIAG_ASCII .EQU 2 ; 8-BIT ASCII 30H - 39H
DIAG_BINARY .EQU 3 ; BINARY 00H - 09H
DIAG_7SEG .EQU 4 ; 7-SEGMENT
DIAG_FLASH .EQU 5 ; FLASH
DIAG_TRIG .EQU 6 ; TRIGGER
;
DIAG_DISP .EQU DIAG_PROG ; DEFAULT
;
#IF (DIAG_DISP == DIAG_PROG)
DIAG_00 .EQU 00000000B
DIAG_01 .EQU 00000001B
DIAG_02 .EQU 00000011B
DIAG_03 .EQU 00000111B
DIAG_04 .EQU 00001111B
DIAG_05 .EQU 00011111B
DIAG_06 .EQU 00111111B
DIAG_07 .EQU 01111111B
DIAG_08 .EQU 11111111B
DIAG_09 .EQU 11111111B
#ENDIF
;
#IF (DIAG_DISP == DIAG_STEP)
DIAG_00 .EQU 00000000B
DIAG_01 .EQU 00000001B
DIAG_02 .EQU 00000010B
DIAG_03 .EQU 00000100B
DIAG_04 .EQU 00001000B
DIAG_05 .EQU 00010000B
DIAG_06 .EQU 00100000B
DIAG_07 .EQU 01000000B
DIAG_08 .EQU 10000000B
DIAG_09 .EQU 11111111B
#ENDIF
;
#IF (DIAG_DISP == DIAG_ASCII)
DIAG_00 .EQU '0'
DIAG_01 .EQU '1'
DIAG_02 .EQU '2'
DIAG_03 .EQU '3'
DIAG_04 .EQU '4'
DIAG_05 .EQU '5'
DIAG_06 .EQU '6'
DIAG_07 .EQU '7'
DIAG_08 .EQU '8'
DIAG_09 .EQU '9'
#ENDIF
;
#IF (DIAG_DISP == DIAG_BINARY)
DIAG_00 .EQU 0
DIAG_01 .EQU 1
DIAG_02 .EQU 2
DIAG_03 .EQU 3
DIAG_04 .EQU 4
DIAG_05 .EQU 5
DIAG_06 .EQU 6
DIAG_07 .EQU 7
DIAG_08 .EQU 8
DIAG_09 .EQU 9
#ENDIF
;
#IF (DIAG_DISP == DIAG_7SEG)
; abcdefg
DIAG_00 .EQU 00000000B ; BLANK
DIAG_01 .EQU 01111110B ; 0
DIAG_02 .EQU 00110000B ; 1
DIAG_03 .EQU 01101101B ; 2
DIAG_04 .EQU 01111001B ; 3
DIAG_05 .EQU 00110011B ; 4
DIAG_06 .EQU 01011011B ; 5
DIAG_07 .EQU 00011111B ; 6
DIAG_08 .EQU 01110000B ; 7
DIAG_09 .EQU 01111111B ; 8
DIAG_10 .EQU 01110011B ; 9
#ENDIF
;
#IF (DIAG_DISP == DIAG_FLASH)
DIAG_00 .EQU 00000000B ; OFF
DIAG_01 .EQU 11111111B ; ON
DIAG_02 .EQU 00000000B ; OFF
DIAG_03 .EQU 11111111B ; ON
DIAG_04 .EQU 00000000B ; OFF
DIAG_05 .EQU 11111111B ; ON
DIAG_06 .EQU 00000000B ; OFF
DIAG_07 .EQU 11111111B ; ON
DIAG_08 .EQU 00000000B ; OFF
DIAG_09 .EQU 11111111B ; ON
#ENDIF
;
#IF (DIAG_DISP == DIAG_TRIG)
DIAG_00 .EQU 11111111B ; ON
DIAG_01 .EQU 11111111B ; ON
DIAG_02 .EQU 11111111B ; ON
DIAG_03 .EQU 11111111B ; ON
DIAG_04 .EQU 11111111B ; ON
DIAG_05 .EQU 11111111B ; ON
DIAG_06 .EQU 11111111B ; ON
DIAG_07 .EQU 11111111B ; ON
DIAG_08 .EQU 11111111B ; ON
DIAG_09 .EQU 11111111B ; ON
#ENDIF
;
; MEDIA ID VALUES
;
MID_NONE .EQU 0
@@ -228,6 +333,7 @@ VDADEV_VGA .EQU $40 ; ECB VGA3 - HITACHI HD6445
SNDDEV_SN76489 .EQU $00
SNDDEV_AY38910 .EQU $10
SNDDEV_BITMODE .EQU $20
SNDDEV_YM2612 .EQU $30
;
; HBIOS CONTROL BLOCK OFFSETS
; WARNING: THESE OFFSETS WILL CHANGE SIGNIFICANTLY BETWEEN RELEASES

View File

@@ -121,9 +121,7 @@ HDSK_FNTBL:
HDSK_VERIFY:
HDSK_FORMAT:
HDSK_DEFMED:
CALL SYSCHK ; INVALID SUB-FUNCTION
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL) ; INVALID SUB-FUNCTION
RET
;
;

View File

@@ -192,7 +192,7 @@ IDE_CFGTBL:
#IF (IDECNT >= 1)
;
IDE_DEV0M: ; DEVICE 0, MASTER
.DB 0 ; DRIVER DEVICE NUMBER
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB IDE0MODE ; DRIVER DEVICE MODE
.DB 0 ; DEVICE STATUS
.DB 0 ; DEVICE TYPE
@@ -206,7 +206,7 @@ IDE_DEV0M: ; DEVICE 0, MASTER
.DW IDE_DEV0S ; PARTNER
;
IDE_DEV0S: ; DEVICE 0, SLAVE
.DB 0 ; DRIVER DEVICE NUMBER
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB IDE0MODE ; DRIVER DEVICE MODE
.DB 0 ; DEVICE STATUS
.DB 0 ; DEVICE TYPE
@@ -223,7 +223,7 @@ IDE_DEV0S: ; DEVICE 0, SLAVE
#IF (IDECNT >= 2)
;
IDE_DEV1M: ; DEVICE 1, MASTER
.DB 0 ; DRIVER DEVICE NUMBER
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB IDE1MODE ; DRIVER DEVICE MODE
.DB 0 ; DEVICE STATUS
.DB 0 ; DEVICE TYPE
@@ -237,7 +237,7 @@ IDE_DEV1M: ; DEVICE 1, MASTER
.DW IDE_DEV1S ; PARTNER
;
IDE_DEV1S: ; DEVICE 1, SLAVE
.DB 0 ; DRIVER DEVICE NUMBER
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB IDE1MODE ; DRIVER DEVICE MODE
.DB 0 ; DEVICE STATUS
.DB 0 ; DEVICE TYPE
@@ -254,7 +254,7 @@ IDE_DEV1S: ; DEVICE 1, SLAVE
#IF (IDECNT >= 3)
;
IDE_DEV2M: ; DEVICE 2, MASTER
.DB 0 ; DRIVER DEVICE NUMBER
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB IDE2MODE ; DRIVER DEVICE MODE
.DB 0 ; DEVICE STATUS
.DB 0 ; DEVICE TYPE
@@ -268,7 +268,7 @@ IDE_DEV2M: ; DEVICE 2, MASTER
.DW IDE_DEV2S ; PARTNER
;
IDE_DEV2S: ; DEVICE 2, SLAVE
.DB 0 ; DRIVER DEVICE NUMBER
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB IDE2MODE ; DRIVER DEVICE MODE
.DB 0 ; DEVICE STATUS
.DB 0 ; DEVICE TYPE
@@ -415,7 +415,8 @@ IDE_INIT5:
PRTS(" SIZE=$") ; PRINT FIELD LABEL
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
CALL SRL32 ; RIGHT SHIFT
CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
;CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
CALL PRTDEC32 ; PRINT DWORD IN DECIMAL
PRTS("MB$") ; PRINT SUFFIX
;
RET
@@ -461,9 +462,7 @@ IDE_FNTBL:
IDE_VERIFY:
IDE_FORMAT:
IDE_DEFMED:
CALL SYSCHK ; NOT IMPLEMENTED
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED
RET
;
;
@@ -1253,12 +1252,31 @@ IDE_INITDEV00:
; THEY ARE NOT RECOMMENDED BY THE CF CARD SPEC AND MIGHT
; OVERLAP WITH "REAL" HARD DISK SIGNATURES. I HAVE NEVER
; SEEN A CF CARD THAT DID NOT USE ONE OF THE BELOW.
; CREDIT TO LASZLO SZOLNOKI
LD BC,$848A ; STANDARD CF CARD SIGNATURE
; CREDIT TO LASZLO SZOLNOKI
;
#IF (IDETRACE >= 3)
CALL IDE_PRTPREFIX
PRTS(" SIG=0x$")
LD BC,(HB_WRKBUF)
CALL PRTHEXWORD
#ENDIF
;
; SEE PAGE 114 OF CF+ & CF SPECIFICATION REV. 3.0 FOR CF CARD
; SIGNATURE VALUES. ALL OF THE BELOW ARE DOCUMENTED THERE EXCEPT
; $045A WHICH IS A VALUE DISCOVERED ON A CF<->SD CARD ADAPTER.
;
; SIGNATURE $045A IS NOT LISTED IN THE CF SPEC. IT WAS ADDED BECAUSE
; IT WAS SEEN IN THE WILD ON A CF-SD ADAPTER. HOWEVER IT HAS NOW
; ALSO BEEN SEEN ON A SPINNING HARD DISK. SINCE IT IS AMBIGUOUS, I
; WILL CONSIDER IT TO BE A HARD DISK.
;
LD BC,$848A ; STANDARD CF CARD SIGNATURE %1000 1111 1000 1010
CALL IDE_INITDEV000 ; TEST & SET
LD BC,$044A ; ALT SIG FOR NON-REMOVABLE
LD BC,$044A ; ALT SIG FOR CF NON-REMOVABLE %0000 0100 0100 1010
CALL IDE_INITDEV000 ; TEST & SET
LD BC,$0040 ; ALT SIG FOR NON-REMOVABLE
;LD BC,$045A ; ?ALT SIG FOR CF NON-REMOVABLE %0000 0100 0101 1010
;CALL IDE_INITDEV000 ; TEST & SET
LD BC,$0040 ; ALT SIG FOR CF NON-REMOVABLE %0000 0000 0100 0000
CALL IDE_INITDEV000 ; TEST & SET
JR IDE_INITDEV1 ; CONTINUE INIT
;
@@ -1543,8 +1561,10 @@ IDE_PRTPREFIX:
CALL NEWLINE
PRTS("IDE$")
LD A,(IY+IDE_DEV) ; GET CURRENT DEVICE NUM
ADD A,'0'
CALL COUT
CP $FE ; NOT YET ASSIGNED?
JR Z,IDE_PRTPREFIX1 ; SKIP DEV NUM IF SO
CALL PRTDECB
IDE_PRTPREFIX1:
CALL PC_COLON
POP AF
RET

View File

@@ -56,9 +56,7 @@ INTRTC_DISPATCH:
JP Z,INTRTC_SETALM ; SET ALARM
DEC A
JP Z,INTRTC_DEVICE ; REPORT RTC DEVICE INFO
CALL SYSCHK
LD A,ERR_NOFUNC
OR A
SYSCHKERR(ERR_NOFUNC)
RET
;
; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR
@@ -69,9 +67,7 @@ INTRTC_GETBLK:
INTRTC_SETBLK:
INTRTC_GETALM:
INTRTC_SETALM:
CALL SYSCHK
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL)
RET
;
; RTC GET TIME
@@ -205,7 +201,7 @@ INTRTC_INT2:
JR NZ,INTRTC_INTX ; NOPE, DONE
LD (HL),0 ; BACK TO YEAR ZERO
INTRTC_INTX:
JP SYSCHK
JP PANIC
INTRTC_VEC .EQU $-2
;
; CONVERT FROM BINARY BUF (HL) TO BCD BUF (DE)

View File

@@ -157,9 +157,7 @@ MD_FNTBL:
MD_VERIFY:
MD_FORMAT:
MD_DEFMED:
CALL SYSCHK ; INVALID SUB-FUNCTION
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL) ; INVALID SUB-FUNCTION
RET
;
;
@@ -182,9 +180,7 @@ MD_CAP: ; ASSUMES THAT UNIT 0 IS RAM, UNIT 1 IS ROM
JR Z,MD_CAP0 ; UNIT 0
DEC A ; TRY UNIT 1
JR Z,MD_CAP1 ; UNIT 1
CALL SYSCHK ; INVALID UNIT
LD A,ERR_NOUNIT
OR A
SYSCHKERR(ERR_NOUNIT) ; INVALID UNIT
RET
MD_CAP0:
LD A,(HCB + HCB_RAMBANKS) ; POINT TO RAM BANK COUNT

View File

@@ -605,7 +605,7 @@ PIOMIVT(PIO3IN,PI3_IST,PRTTAB+3)
#DEFCONT ;\
#DEFCONT ; WAIT FOR SPACE FOR THE CHARACTER\
#DEFCONT ; IF WE ARE WAITING FOR A \
#DEFCONT ; CHARACTRE THEN OUTPUT IT NOW \
#DEFCONT ; CHARACTER THEN OUTPUT IT NOW \
#DEFCONT ; OTHERWISE STORE IT UNTIL THE \
#DEFCONT ; INTERRUPT CALLS FOR IT \
#DEFCONT ;\

View File

@@ -209,7 +209,7 @@ PPIDE_CFGTBL:
#IF (PPIDECNT >= 1)
;
PPIDE_DEV0M: ; DEVICE 0, MASTER
.DB 0 ; DRIVER RELATIVE DEVICE NUMBER (ASSIGNED DURING INIT)
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB 0 ; DEVICE STATUS
.DB 0 ; DEVICE TYPE
.DB PPIDE_ACC_MAS | (PPIDE0A8BIT & PPIDE_ACC_8BIT) ; UNIT ACCESS FLAGS
@@ -222,7 +222,7 @@ PPIDE_DEV0M: ; DEVICE 0, MASTER
.DW PPIDE_DEV0S ; PARTNER
;
PPIDE_DEV0S: ; DEVICE 0, SLAVE
.DB 0 ; DRIVER RELATIVE DEVICE NUMBER (ASSIGNED DURING INIT)
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB 0 ; DEVICE STATUS
.DB 0 ; DEVICE TYPE
.DB (PPIDE0B8BIT & PPIDE_ACC_8BIT) ; UNIT ACCESS FLAGS
@@ -239,7 +239,7 @@ PPIDE_DEV0S: ; DEVICE 0, SLAVE
#IF (PPIDECNT >= 2)
;
PPIDE_DEV1M: ; DEVICE 1, MASTER
.DB 0 ; DRIVER RELATIVE DEVICE NUMBER (ASSIGNED DURING INIT)
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB 0 ; DEVICE STATUS
.DB 0 ; DEVICE TYPE
.DB PPIDE_ACC_MAS | (PPIDE1A8BIT & PPIDE_ACC_8BIT) ; UNIT ACCESS FLAGS
@@ -252,7 +252,7 @@ PPIDE_DEV1M: ; DEVICE 1, MASTER
.DW PPIDE_DEV1S ; PARTNER
;
PPIDE_DEV1S: ; DEVICE 1, SLAVE
.DB 0 ; DRIVER RELATIVE DEVICE NUMBER (ASSIGNED DURING INIT)
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB 0 ; DEVICE STATUS
.DB 0 ; DEVICE TYPE
.DB (PPIDE1B8BIT & PPIDE_ACC_8BIT) ; UNIT ACCESS FLAGS
@@ -269,7 +269,7 @@ PPIDE_DEV1S: ; DEVICE 1, SLAVE
#IF (PPIDECNT >= 3)
;
PPIDE_DEV2M: ; DEVICE 2, MASTER
.DB 0 ; DRIVER RELATIVE DEVICE NUMBER (ASSIGNED DURING INIT)
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB 0 ; DEVICE STATUS
.DB 0 ; DEVICE TYPE
.DB PPIDE_ACC_MAS | (PPIDE2A8BIT & PPIDE_ACC_8BIT) ; UNIT ACCESS FLAGS
@@ -282,7 +282,7 @@ PPIDE_DEV2M: ; DEVICE 2, MASTER
.DW PPIDE_DEV2S ; PARTNER
;
PPIDE_DEV2S: ; DEVICE 2, SLAVE
.DB 0 ; DRIVER RELATIVE DEVICE NUMBER (ASSIGNED DURING INIT)
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB 0 ; DEVICE STATUS
.DB 0 ; DEVICE TYPE
.DB (PPIDE2B8BIT & PPIDE_ACC_8BIT) ; UNIT ACCESS FLAGS
@@ -411,7 +411,8 @@ PPIDE_INIT5:
PRTS(" SIZE=$") ; PRINT FIELD LABEL
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
CALL SRL32 ; RIGHT SHIFT
CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
; CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
CALL PRTDEC32 ; PRINT DWORD IN DECIMAL
PRTS("MB$") ; PRINT SUFFIX
;
RET
@@ -470,9 +471,7 @@ PPIDE_FNTBL:
PPIDE_VERIFY:
PPIDE_FORMAT:
PPIDE_DEFMED:
CALL SYSCHK ; NOT IMPLEMENTED
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED
RET
;
;
@@ -1278,12 +1277,31 @@ PPIDE_INITDEV00:
; THEY ARE NOT RECOMMENDED BY THE CF CARD SPEC AND MIGHT
; OVERLAP WITH "REAL" HARD DISK SIGNATURES. I HAVE NEVER
; SEEN A CF CARD THAT DID NOT USE ONE OF THE BELOW.
; CREDIT TO LASZLO SZOLNOKI
LD BC,$848A ; STANDARD CF CARD SIGNATURE
; CREDIT TO LASZLO SZOLNOKI
;
#IF (PPIDETRACE >= 3)
CALL PPIDE_PRTPREFIX
PRTS(" SIG=0x$")
LD BC,(HB_WRKBUF)
CALL PRTHEXWORD
#ENDIF
;
; SEE PAGE 114 OF CF+ & CF SPECIFICATION REV. 3.0 FOR CF CARD
; SIGNATURE VALUES. ALL OF THE BELOW ARE DOCUMENTED THERE EXCEPT
; $045A WHICH IS A VALUE DISCOVERED ON A CF<->SD CARD ADAPTER.
;
; SIGNATURE $045A IS NOT LISTED IN THE CF SPEC. IT WAS ADDED BECAUSE
; IT WAS SEEN IN THE WILD ON A CF-SD ADAPTER. HOWEVER IT HAS NOW
; ALSO BEEN SEEN ON A SPINNING HARD DISK. SINCE IT IS AMBIGUOUS, I
; WILL CONSIDER IT TO BE A HARD DISK.
;
LD BC,$848A ; STANDARD CF CARD SIGNATURE %1000 1111 1000 1010
CALL PPIDE_INITDEV000 ; TEST & SET
LD BC,$044A ; ALT SIG FOR NON-REMOVABLE
LD BC,$044A ; ALT SIG FOR CF NON-REMOVABLE %0000 0100 0100 1010
CALL PPIDE_INITDEV000 ; TEST & SET
LD BC,$0040 ; ALT SIG FOR NON-REMOVABLE
;LD BC,$045A ; ?ALT SIG FOR CF NON-REMOVABLE %0000 0100 0101 1010
;CALL PPIDE_INITDEV000 ; TEST & SET
LD BC,$0040 ; ALT SIG FOR CF NON-REMOVABLE %0000 0000 0100 0000
CALL PPIDE_INITDEV000 ; TEST & SET
JR PPIDE_INITDEV1 ; CONTINUE INIT
;
@@ -1622,8 +1640,10 @@ PPIDE_PRTPREFIX:
CALL NEWLINE
PRTS("PPIDE$")
LD A,(IY+PPIDE_DEV) ; GET CURRENT DEVICE NUM
ADD A,'0'
CALL COUT
CP $FE ; NOT YET ASSIGNED?
JR Z,PPIDE_PRTPREFIX1 ; SKIP DEV NUM IF SO
CALL PRTDECB
PPIDE_PRTPREFIX1:
CALL PC_COLON
POP AF
RET

View File

@@ -338,9 +338,7 @@ PPPCON_OST:
;
;
PPPCON_INITDEV:
CALL SYSCHK
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL)
RET
;
;
@@ -476,7 +474,8 @@ PPPSD_INITUNIT:
PRTS(" SIZE=$") ; PRINT FIELD LABEL
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
CALL SRL32 ; RIGHT SHIFT
CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
;CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
CALL PRTDEC32 ; PRINT DWORD IN DECIMAL
PRTS("MB$") ; PRINT SUFFIX
;
XOR A ; SIGNAL SUCCESS
@@ -504,9 +503,7 @@ PPPSD_FNTBL:
PPPSD_VERIFY:
PPPSD_FORMAT:
PPPSD_DEFMED:
CALL SYSCHK ; INVALID SUB-FUNCTION
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL) ; INVALID SUB-FUNCTION
RET
;
;

View File

@@ -211,9 +211,7 @@ PRPCON_OST1:
;
;
PRPCON_INITDEV:
CALL SYSCHK
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL)
RET
;
;
@@ -373,7 +371,8 @@ PRPSD_INITUNIT:
PRTS(" SIZE=$") ; PRINT FIELD LABEL
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
CALL SRL32 ; RIGHT SHIFT
CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
;CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
CALL PRTDEC32 ; PRINT DWORD IN DECIMAL
PRTS("MB$") ; PRINT SUFFIX
;
XOR A ; SIGNAL SUCCESS
@@ -401,9 +400,7 @@ PRPSD_FNTBL:
PRPSD_VERIFY:
PRPSD_FORMAT:
PRPSD_DEFMED:
CALL SYSCHK ; INVALID SUB-FUNCTION
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL) ; INVALID SUB-FUNCTION
RET
;
;

View File

@@ -138,9 +138,7 @@ RF_FNTBL:
RF_VERIFY:
RF_FORMAT:
RF_DEFMED:
CALL SYSCHK ; INVALID SUB-FUNCTION
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL) ; INVALID SUB-FUNCTION
RET
;
;

View File

@@ -499,10 +499,50 @@ setcon:
call skipws ; skip whitespace
call isnum ; do we have a number?
jp nz,docon ; if no we don't change baudrate
call getnum ; parse a number
jp c,err_invcmd ; handle overflow error
call getbnum ; return in HL:BC
;
cp 32 ; handle invalid
ld e,32 ; search baud rate table
push de ; for a matching entry
ld de,tbl_baud
nextbaud:
ex de,hl ; hl = tbl_baud, de = msw
ld a,d ; check all four bytes
cp (hl) ; against HL:BC
inc hl ; exit to next table
jr nz,mm1 ; entry on mismatch
ld a,e
cp (hl)
inc hl
jr nz,mm2
ld a,b
cp (hl)
inc hl
jr nz,mm3
ld a,c
cp (hl)
inc hl
jr nz,mm4
;
; we have a match
pop de ; get our count value
ld a,32
sub e
jr s_exit
;
mm1: inc hl
mm2: inc hl
mm3: inc hl
mm4: ex (sp),hl ; hl = count value, stack = tbl_baud, de = msw
dec l
ex (sp),hl ; hl = tbl_baud, stack= count
ex de,hl ; hl = msw, de = tbl_baud
jr nz,nextbaud
;
; Failed to match
pop de
jp err_invcmd
;
s_exit: cp 32 ; handle invalid
jp nc,err_invcmd ; baud rate
bit 0,a
jr z,iseven ; convert sequential
@@ -512,6 +552,7 @@ setcon:
iseven: dec a ; 15=19200
srl a ; 17=38400
add a,16 ; 20=115200
;
setspd: ld (newspeed),a ; save validated baud rate
;
ld hl,str_chspeed ; notify user
@@ -554,7 +595,92 @@ docon: ld hl,str_newcon ; new console msg
call nl2 ; formatting
ld hl,str_banner ; display boot banner
call pstr ; do it
ret ; done
ret
;
;=======================================================================
; Get numeric chars at DE and convert to BCD number returned in HL:BC
;=======================================================================
;
getbnum:ld bc,0 ; lsw
ld hl,0 ; msw
getbnum1:
ld a,(de) ; get the active char
cp '0' ; compare to ascii '0'
jr c,getbnum2 ; abort if below
cp '9' + 1 ; compare to ascii '9'
jr nc,getbnum2 ; abort if above
;
sub '0' ; convert '0'-'9' to 0-9
;
push de ; save char posn
push hl ; save hl bcd
;
ld hl,tmpbcd ; rotate 1 nyble in A
ld (hl),c ; through HL:BC
rld
ld c,(hl)
ld (hl),b
rld
ld b,(hl)
pop de ; get hl bcd
ld (hl),e
rld
ld e,(hl)
ld (hl),d
rld
ld d,(hl)
ld h,d
ld l,e
;
pop de ; get char posn
inc de ; bump to next char
jr getbnum1 ; loop
;
getbnum2:
or a ; with flags set, CF is cleared
ret
;
tmpbcd: .db 0
;
#DEFINE PACK(a,b,c,d,e,f,g) \
#DEFCONT \ .db (16*('0'-'0'))+(a-'0'))
#DEFCONT \ .db (16*(b-'0'))+(c-'0'))
#DEFCONT \ .db (16*(d-'0'))+(e-'0'))
#DEFCONT \ .db (16*(f-'0'))+(g-'0'))
;
tbl_baud:
PACK('0','0','0','0','0','7','5') ; 75 0 > 0
PACK('0','0','0','0','1','5','0') ; 150 1 > 1
PACK('0','0','0','0','2','2','5') ; 225 2 > 16
PACK('0','0','0','0','3','0','0') ; 300 3 > 2
PACK('0','0','0','0','4','5','0') ; 450 4 > 17
PACK('0','0','0','0','6','0','0') ; 600 5 > 3
PACK('0','0','0','0','9','0','0') ; 900 6 > 18
PACK('0','0','0','1','2','0','0') ; 1200 7 > 4
PACK('0','0','0','1','8','0','0') ; 1800 8 > 19
PACK('0','0','0','2','4','0','0') ; 2400 9 > 5
PACK('0','0','0','3','6','0','0') ; 3600 10 > 20
PACK('0','0','0','4','8','0','0') ; 4800 11 > 6
PACK('0','0','0','7','2','0','0') ; 7200 12 > 21
PACK('0','0','0','9','6','0','0') ; 9600 13 > 7
PACK('0','0','1','4','4','0','0') ; 14400 14 > 22
PACK('0','0','1','9','2','0','0') ; 19200 15 > 8
PACK('0','0','2','8','8','0','0') ; 28800 16 > 23
PACK('0','0','3','8','4','0','0') ; 38400 17 > 9
PACK('0','0','5','7','6','0','0') ; 57600 18 > 24
PACK('0','0','7','6','8','0','0') ; 76800 19 > 10
PACK('0','1','1','5','2','0','0') ; 115200 20 > 25
PACK('0','1','5','3','6','0','0') ; 153600 21 > 11
PACK('0','2','3','0','4','0','0') ; 230400 22 > 26
PACK('0','3','0','7','2','0','0') ; 307200 23 > 12
PACK('0','4','6','0','8','0','0') ; 460800 24 > 27
PACK('0','6','1','4','4','0','0') ; 614400 25 > 13
PACK('0','9','2','1','6','0','0') ; 921600 26 > 28
PACK('1','2','2','8','8','0','0') ; 1228800 27 > 14
PACK('1','8','4','3','2','0','0') ; 1843200 28 > 29
PACK('2','4','5','7','6','0','0') ; 2457600 29 > 15
PACK('3','6','8','6','4','0','0') ; 3686400 30 > 30
PACK('7','3','7','2','8','0','0') ; 7372800 31 > 31
;
#endif
;

View File

@@ -159,9 +159,7 @@ RP5RTC_DISPATCH:
JP Z,RP5RTC_SETALM ; SET ALARM
DEC A
JP Z,RP5RTC_DEVICE ; REPORT RTC DEVICE INFO
CALL SYSCHK
LD A, ERR_NOFUNC
OR A
SYSCHKERR(ERR_NOFUNC)
RET
;
; RTC GET NVRAM BYTE
@@ -240,9 +238,7 @@ RP5RTC_GETBLK:
RP5RTC_SETBLK:
RP5RTC_GETALM:
RP5RTC_SETALM:
LD A, ERR_NOTIMPL
CALL SYSCHK
OR A
SYSCHKERR(ERR_NOTIMPL)
RET
;
; RTC GET TIME

View File

@@ -128,6 +128,7 @@ SD_CLK .EQU %00000010 ; RTC:1 IS CLOCK
SD_DI .EQU %00000001 ; RTC:0 IS DATA IN (CARD <- CPU)
SD_DO .EQU %10000000 ; RTC:7 IS DATA OUT (CARD -> CPU)
SD_IOBASE .EQU SD_OPRREG ; IOBASE
SD_INVCS .EQU FALSE ; INVERT CS
;
RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE
#ENDIF
@@ -143,6 +144,7 @@ SD_CLK .EQU %00000010 ; RTC:1 IS CLOCK
SD_DI .EQU %00000001 ; RTC:0 IS DATA IN (CARD <- CPU)
SD_DO .EQU %01000000 ; RTC:6 IS DATA OUT (CARD -> CPU)
SD_IOBASE .EQU SD_OPRREG ; IOBASE
SD_INVCS .EQU FALSE ; INVERT CS
;
RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE
#ENDIF
@@ -156,6 +158,7 @@ SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT
SD_CNTR .EQU Z180_CNTR
SD_TRDR .EQU Z180_TRDR
SD_IOBASE .EQU SD_OPRREG ; IOBASE
SD_INVCS .EQU FALSE ; INVERT CS
;
RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE
#ENDIF
@@ -174,6 +177,7 @@ SD_CLK .EQU %00000010 ; PPIC:1 IS CLOCK
SD_DI .EQU %00000001 ; PPIC:0 IS DATA IN (CARD <- CPU)
SD_DO .EQU %10000000 ; PPIB:7 IS DATA OUT (CARD -> CPU)
SD_IOBASE .EQU SD_PPIBASE ; IOBASE
SD_INVCS .EQU TRUE ; INVERT CS
#ENDIF
;
#IF (SDMODE == SDMODE_UART)
@@ -187,6 +191,7 @@ SD_CLK .EQU %00000100 ; UART MCR:2 IS CLOCK
SD_DI .EQU %00000001 ; UART MCR:0 IS DATA IN (CARD <- CPU)
SD_DO .EQU %00100000 ; UART MSR:5 IS DATA OUT (CARD -> CPU)
SD_IOBASE .EQU UARTIOB ; IOBASE
SD_INVCS .EQU TRUE ; INVERT CS
#ENDIF
;
#IF (SDMODE == SDMODE_DSD) ; DUAL SD
@@ -201,6 +206,7 @@ SD_CLK .EQU %00000010 ; RTC:1 IS CLOCK
SD_DI .EQU %00000001 ; RTC:6 IS DATA IN (CARD <- CPU)
SD_DO .EQU %00000001 ; RTC:0 IS DATA OUT (CARD -> CPU)
SD_IOBASE .EQU SD_OPRREG ; IOBASE
SD_INVCS .EQU FALSE ; INVERT CS
#ENDIF
;
#IF (SDMODE == SDMODE_MK4) ; MARK IV (CSIO STYLE INTERFACE)
@@ -211,6 +217,7 @@ SD_CS0 .EQU %00000100 ; SELECT ACTIVE
SD_CNTR .EQU Z180_CNTR
SD_TRDR .EQU Z180_TRDR
SD_IOBASE .EQU SD_OPRREG ; IOBASE
SD_INVCS .EQU FALSE ; INVERT CS
#ENDIF
;
#IF (SDMODE == SDMODE_SC) ; SC
@@ -223,6 +230,7 @@ SD_CS1 .EQU %00001000 ; RTC:3 IS SELECT FOR SECONDARY SPI CARD
SD_CNTR .EQU Z180_CNTR
SD_TRDR .EQU Z180_TRDR
SD_IOBASE .EQU SD_OPRREG ; IOBASE
SD_INVCS .EQU TRUE ; INVERT CS
;
RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE
#ENDIF
@@ -270,6 +278,30 @@ SD_CS0 .EQU %00100000 ; IN/OUT:SD_OPREG:5 = CS2, SDCARD2 CS, IN=1 Card present
SD_CS1 .EQU %00010000 ; IN/OUT:SD_OPREG:4 = CS1, SDCARD1 CS, IN=1 Card present
#ENDIF
SD_IOBASE .EQU SD_BASE ; IOBASE
SD_INVCS .EQU FALSE ; INVERT CS
#ENDIF
;
;
#IF (SDMODE == SDMODE_USR) ; USER DEFINED HARDWARE CONFIGURATION
;
; THIS MODE IS INTENDED TO ALLOW A USER TO EASILY CONFIGURE A CUSTOM
; SD CARD INTERFACE. IT IS NOT YET COMPLETE OR TESTED AND PROBABLY DOES
; NOT YET WORK.
;
SD_DEVMAX .EQU 2 ; NUMBER OF PHYSICAL UNITS (SOCKETS)
SD_IOBASE .EQU $01 ; IO BASE ADDRESS FOR SD INTERFACE
SD_OPRREG .EQU SD_IOBASE ; OUTPUT PORT (OUTPUT: CS, CLK, DIN)
SD_OPRDEF .EQU %00000101 ; OUTPUT PORT DEFAULT STATE
SD_OPRMSK .EQU %00001111 ; OUTPUT PORT MASK
SD_INPREG .EQU SD_IOBASE ; INPUT REGISTER
SD_CS0 .EQU %00001000 ; SELECT
SD_CLK .EQU %00000100 ; CLOCK
SD_DI .EQU %00000010 ; DATA IN (CARD <- CPU) MOSI
SD_DO .EQU %00000001 ; DATA OUT (CARD -> CPU) MISO
SD_CINIT .EQU TRUE ; INITIALIZE OUTPUT PORT
SD_DDR .EQU $03 ; DATA DIRECTION REGISTER
SD_DDRVAL .EQU %00001101 ; DATA DIRECTION REGISTER VALUE
SD_INVCS .EQU FALSE ; INVERT CS
#ENDIF
;
#IF (SD_DEVCNT > SD_DEVMAX)
@@ -477,6 +509,13 @@ SD_INIT:
LD A,SD_BASE
CALL PRTHEXBYTE
#ENDIF
;
#IF (SDMODE == SDMODE_USR)
PRTS(" MODE=USER$")
PRTS(" IO=0x$")
LD A,SD_IOBASE
CALL PRTHEXBYTE
#ENDIF
;
CALL SD_PROBE ; CHECK FOR HARDWARE
JR Z,SD_INIT00 ; CONTINUE IF PRESENT
@@ -600,7 +639,8 @@ SD_INITUNIT2:
PRTS(" SIZE=$") ; PRINT FIELD LABEL
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
CALL SRL32 ; RIGHT SHIFT
CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
;CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
CALL PRTDEC32 ; PRINT DWORD IN DECIMAL
PRTS("MB$") ; PRINT SUFFIX
;
; CHECK FOR WRITE PROTECT AND NOTIFY USER IF SO
@@ -710,9 +750,7 @@ SD_FNTBL:
SD_VERIFY:
SD_FORMAT:
SD_DEFMED:
CALL SYSCHK ; INVALID SUB-FUNCTION
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL) ; INVALID SUB-FUNCTION
RET
;
;
@@ -1131,7 +1169,9 @@ SD_INITCARD5:
JR SD_INITCARD6 ; HANDLE MMC OR SDSC
;
SD_INITCARD5A:
CALL SYSCHK
PUSH AF
SYSCHKERR(ERR_NOMEDIA)
POP AF
JP SD_NOMEDIA
;
; CAPACITY CALCULATION FOR MMC OR SDSC (V1) CARDS:
@@ -1682,7 +1722,7 @@ SD_SETUP:
OUT (SD_OPRREG),A
#ENDIF
;
#IF ((SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_DSD) | (SDMODE == SDMODE_PPI)| (SDMODE == SDMODE_MT))
#IF ((SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_DSD) | (SDMODE == SDMODE_PPI) | (SDMODE == SDMODE_MT))
LD A,SD_OPRDEF
LD (SD_OPRVAL),A
OUT (SD_OPRREG),A
@@ -1695,6 +1735,22 @@ SD_SETUP:
LD (SD_OPRVAL),A ; RECORD THE WORKING VALLUE
OUT (SD_OPRREG),A ; OPRREG == SIO_MCR
#ENDIF
;
#IF (SDMODE == SDMODE_USR)
#IF (SD_CINIT == TRUE)
LD A,(SD_OPRMSK) ; GET OUTPUT PORT MASK
CPL ; INVERT ACCUMULATOR
LD C,A ; SAVE IT FOR LATER
LD A,(SD_DDR) ; GET DATA DIRECTION REGISTER VALUE
AND C ; ZERO ALL INTERESTING BITS
OR (SD_DDRVAL) ; ADD OUR VALUE
LD (SD_DDR),A ; WRITE IT
#ENDIF
;
LD A,SD_OPRDEF
LD (SD_OPRVAL),A
OUT (SD_OPRREG),A
#ENDIF
;
XOR A
RET
@@ -1766,7 +1822,8 @@ SD_SELECT1:
;
SD_SELECT2:
; ADJUST BIT(S) FOR INTERFACES USING INVERTED CS BITS
#IF ((SDMODE == SDMODE_PPI) | (SDMODE == SDMODE_UART) | (SDMODE == SDMODE_SC))
;#IF ((SDMODE == SDMODE_PPI) | (SDMODE == SDMODE_UART) | (SDMODE == SDMODE_SC))
#IF (SD_INVCS)
#IF ((SDMODE == SDMODE_SC) & (SD_DEVCNT > 1))
XOR SD_CS0 | SD_CS1
#ELSE

View File

@@ -55,9 +55,7 @@ SIMRTC_DISPATCH:
JP Z,SIMRTC_SETALM ; SET ALARM
DEC A
JP Z,SIMRTC_DEVICE ; REPORT RTC DEVICE INFO
CALL SYSCHK
LD A,ERR_NOFUNC
OR A
SYSCHKERR(ERR_NOFUNC)
RET
;
; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR
@@ -68,9 +66,7 @@ SIMRTC_GETBLK:
SIMRTC_SETBLK:
SIMRTC_GETALM:
SIMRTC_SETALM:
CALL SYSCHK
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL)
RET
;
; RTC GET TIME

View File

@@ -843,9 +843,7 @@ SIO_INITGO:
LD L,SIO1_VEC ; ASSUME CHIP 1
DEC A ; CHIP 1?
JR Z,SIO_INITIVT ; IF SO, DO IT
CALL SYSCHK ; IMPOSSIBLE SITUATION
LD A,ERR_NOUNIT
OR A
SYSCHKERR(ERR_NOUNIT) ; IMPOSSIBLE SITUATION
RET
SIO_INITIVT:
LD A,L ; VALUE TO A

View File

@@ -1,9 +1,13 @@
;======================================================================
; SN76489 sound driver
; SN76489 SOUND DRIVER
;
; WRITTEN BY: DEAN NETHERTON
;======================================================================
;
; SN74489 PSG CHIP NEEDS AN INPUT CLOCK FREQUENCY OF
; NO MORE THAN 4 MHZ. THE CLOSEST THING THERE IS TO A STANDARD
; IS THE MSX FREQ OF 3.579545 MHZ.
;
; TODO:
; 1. PROVIDE SUPPORT FOR NOISE CHANNEL
; 2. DOES THIS WORK FOR FASTER CPUS? ONLY BEEN TESTED ON A Z80 7MHZ UNIT
@@ -12,18 +16,16 @@
; CONSTANTS
;======================================================================
;
#IF (PLATFORM == PLT_SBC) & (SNMODE == SNMODE_VGM)
#IF (SNMODE == SNMODE_VGM)
SN76489_PORT_LEFT .EQU $C6 ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT)
SN76489_PORT_RIGHT .EQU $C7 ; PORTS FOR ACCESSING THE SN76489 CHIP (RIGHT)
;SN7CLK .EQU 3575950 ; CLOCK SPEED DRIVING THE SN76489 CHIPS
#ENDIF
#IF (PLATFORM == PLT_RCZ80) & (SNMODE == SNMODE_RCZ80)
;
#IF (SNMODE == SNMODE_RC)
SN76489_PORT_LEFT .EQU $FF ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT)
SN76489_PORT_RIGHT .EQU $FB ; PORTS FOR ACCESSING THE SN76489 CHIP (RIGHT)
;SN7CLK .EQU CPUOSC/4; DEFAULT TO CPUOSC / 4
#ENDIF
;
SN7_IDAT .EQU 0
SN7_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS
SN7_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS
@@ -32,15 +34,13 @@ CHANNEL_0_SILENT .EQU $9F
CHANNEL_1_SILENT .EQU $BF
CHANNEL_2_SILENT .EQU $DF
CHANNEL_3_SILENT .EQU $FF
SN7RATIO .EQU SN7CLK * 100 / 32
;
.ECHO "SN76489 CLOCK: "
.ECHO SN7CLK
.ECHO "\n"
;
#INCLUDE "audio.inc"
;
SN76489_INIT:
LD IY, SN7_IDAT ; POINTER TO INSTANCE DATA
LD BC, SN7_FNTBL ; BC := FUNCTION TABLE ADDRESS
@@ -125,33 +125,29 @@ SN7_VOLUME:
SN7_NOTE:
LD DE, SN7NOTETBL
CALL AUD_NOTE ; RETURNS PERIOD IN HL, FALL THRU
; TO SET THIS PERIOD
;
SN7_PERIOD:
AUDTRACE(SNT_PERIOD)
AUDTRACE_HL
AUDTRACE_CR
LD A, H ; IF ZERO - ERROR
;
LD A,H ; IF ZERO - ERROR
OR L
JR Z, SN7_QUERY_PERIOD1
LD (SN7_PENDING_PERIOD), HL ;ASSUME SUCCESS
OR A ; IF >= 401 ERROR
LD DE, $401
SBC HL, DE
JR NC, SN7_QUERY_PERIOD1
XOR A ; SIGNAL SUCCESS
JR Z,SN7_PERIOD1
;
LD A,H ; MAXIMUM TONE PERIOD IS 10-BITS
AND 11111100B ; ALLOWED RANGE IS 0001-03FF (1023)
JR NZ,SN7_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE
LD (SN7_PENDING_PERIOD),HL ; SAVE AND RETURN SUCCESSFUL
XOR A ; SET SUCCESS
RET
SN7_QUERY_PERIOD1: ; REQUESTED PERIOD IS LARGER THAN THE SN76489 CAN SUPPORT
LD A, $FF
LD L, A
LD H, A
LD (SN7_PENDING_PERIOD), HL
RET
;
SN7_PERIOD1:
LD HL,$FFFF ; REQUESTED PERIOD IS LARGER
LD (SN7_PENDING_PERIOD),HL ; THAN PSG CAN SUPPORT, SO
OR $FF ; SET PERIOD TO $FFFF
RET ; AND RETURN FAILURE
;
SN7_PLAY:
AUDTRACE(SNT_PLAY)
AUDTRACE_D
@@ -408,12 +404,38 @@ SNT_PERIOD .DB "\r\nSN7_PERIOD: $"
SNT_PLAY .DB "\r\nSN7_PLAY CH: $"
SNT_REGWR .DB "\r\nOUT SN76489, $"
#ENDIF
; THE FREQUENCY BY QUARTER TONE STARTING AT A0#
; USED TO MAP EACH OCTAVE (DIV BY 2 TO JUMP AN OCTAVE UP)
; ASSUMING A CLOCK OF 3575950 HZ, THE FIRST PLAYABLE
;
;======================================================================
; QUARTER TONE FREQUENCY TABLE
;======================================================================
;
; THE FOLLOWING TABLE MAPS A FULL OCTAVE OF QUARTER-NOTES
; STARTING AT A# IN OCTAVE 0 TO THE CORRESPONDING PERIOD
; VALUE TO USE ON THE PSG TO ACHIEVE THE DESIRED NOTE FREQUENCY.
;
; THE FREQUENCY PRODUCED BY THE SN76489 IS:
; FREQ = CLOCK / 32 / PERIOD
;
; SO, TO MAP A DESIRED FREQUENCY TO A PERIOD, WE USE:
; PERIOD = CLOCK / 32 / FREQ
;
; IN ORDER TO IMPROVE THE RESOLUTION OF THE FREQUENCY
; VALUE USED, WE ALSO MULTPLY BOTH SIDES OF THE EQUATION
; BY 100:
; PERIOD * 100 = (CLOCK / 32 / FREQ) * 100
;
; THE RESULTING PERIOD VALUE CAN BE REPEATEDLY HALVED
; TO TO JUMP UP AS MANY OCTAVES AS DESIRED.
;
; THE FINAL VALUE IS SHIFTED BY AUD_SCALE BITS
; IN ORDER TO IMPROVE THE RESOLUTION. THIS FINAL SHIFT
; IS REMOVED WHEN IN THE AY_NOTE ROUTINE.
;
; ASSUMING A CLOCK OF 3.579545 MHZ, THE FIRST PLAYABLE
; NOTE WILL BE A2 (HBIOS NOTE CODE 92).
;
SN7RATIO .EQU (SN7CLK * 100) / (32 >> AUD_SCALE)
;
SN7NOTETBL:
.DW SN7RATIO / 2913 ; A0#/B0b
.DW SN7RATIO / 2956 ;

View File

@@ -56,11 +56,6 @@ BIOS_NONE .EQU 0 ; NO BIOS TYPE DEFINED
BIOS_WBW .EQU 1 ; ROMWBW HBIOS
BIOS_UNA .EQU 2 ; UNA UBIOS
;
; DEFAULT HBIOS DIAGNOSTIC LEVEL
; WILL ULTIMATELY BE MOVED TO CONFIG FILE
;
DIAGLVL .EQU DL_CRITICAL
;
; MEMORY MANAGERS
;
MM_NONE .EQU 0
@@ -186,6 +181,7 @@ SDMODE_DSD .EQU 6 ; DUAL SD
SDMODE_MK4 .EQU 7 ; MARK IV
SDMODE_SC .EQU 8 ; SC (Steve Cousins)
SDMODE_MT .EQU 9 ; MT (Shift register SPI WIZNET for RC2014)
SDMODE_USR .EQU 10 ; USER DEFINED (in sd.asm) (NOT COMPLETE)
;
; AY SOUND CHIP MODE SELECTIONS
;
@@ -201,7 +197,7 @@ AYMODE_MBC .EQU 7 ; MBC SOUND BOARD
; SN SOUND CHIP MODE SELECTIONS
;
SNMODE_NONE .EQU 0
SNMODE_RCZ80 .EQU 1 ; RC2014 SOUND MODULE
SNMODE_RC .EQU 1 ; RC2014 SOUND MODULE
SNMODE_VGM .EQU 2 ; VGM ECB BOARD
;
; TMS VIDEO MODE SELECTIONS
@@ -209,10 +205,11 @@ SNMODE_VGM .EQU 2 ; VGM ECB BOARD
TMSMODE_NONE .EQU 0
TMSMODE_SCG .EQU 1 ; SCG ECB BOARD
TMSMODE_N8 .EQU 2 ; N8 BUILT-IN VIDEO
TMSMODE_RC .EQU 3 ; RC2014 TMS9918 VIDEO BOARD
TMSMODE_RCV9958 .EQU 4 ; RC2014 V9958 VIDEO BOARD
TMSMODE_RCKBD .EQU 5 ; RC2014 TMS9918 + PS2 KEYBOARD
TMSMODE_MSX .EQU 3 ; MSX PORT MAPPING
TMSMODE_MSX9958 .EQU 4 ; MSX PORTS, V9958 CHIP
TMSMODE_MSXKBD .EQU 5 ; MSX PORTS + PS2 KEYBOARD
TMSMODE_MBC .EQU 6 ; MBC V9938/58 VIDEO BOARD
TMSMODE_COLECO .EQU 7 ; COLECOVISION PORT MAPPING
;
; CVDU VIDEO MODE SELECTIONS
;

View File

@@ -23,17 +23,25 @@ TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT
.ECHO "TMS INTERRUPTS ENABLED\n"
#ENDIF
#IF ((TMSMODE == TMSMODE_RC) | (TMSMODE == TMSMODE_RCV9958))
#IF ((TMSMODE == TMSMODE_MSX) | (TMSMODE == TMSMODE_MSX9958))
TMS_DATREG .EQU $98 ; READ/WRITE DATA
TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL
TMS_PPIA .EQU 0 ; PPI PORT A
TMS_PPIB .EQU 0 ; PPI PORT B
TMS_PPIC .EQU 0 ; PPI PORT C
TMS_PPIX .EQU 0 ; PPI CONTROL PORT
#ENDIF
#IF (TMSMODE == TMSMODE_RCKBD)
#IF (TMSMODE == TMSMODE_COLECO))
TMS_DATREG .EQU $BE ; READ/WRITE DATA
TMS_CMDREG .EQU $BF ; READ STATUS / WRITE REG SEL
TMS_PPIA .EQU 0 ; PPI PORT A
TMS_PPIB .EQU 0 ; PPI PORT B
TMS_PPIC .EQU 0 ; PPI PORT C
TMS_PPIX .EQU 0 ; PPI CONTROL PORT
#ENDIF
#IF (TMSMODE == TMSMODE_MSXKBD)
TMS_DATREG .EQU $98 ; READ/WRITE DATA
TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL
TMS_KBDDATA .EQU $E0 ; KBD CTLR DATA PORT
@@ -41,18 +49,15 @@ TMS_KBDST .EQU $E1 ; KBD CTLR STATUS/CMD PORT
#ENDIF
#IF (TMSMODE == TMSMODE_N8)
TMS_DATREG .EQU $98 ; READ/WRITE DATA
TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL
TMS_PPIA .EQU $84 ; PPI PORT A
TMS_PPIB .EQU $85 ; PPI PORT B
TMS_PPIC .EQU $86 ; PPI PORT C
TMS_PPIX .EQU $87 ; PPI CONTROL PORT
#ENDIF
#IF (TMSMODE == TMSMODE_SCG)
TMS_DATREG .EQU $98 ; READ/WRITE DATA
TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL
TMS_ACR .EQU $9C ; AUX CONTROL REGISTER
@@ -60,7 +65,6 @@ TMS_PPIA .EQU 0 ; PPI PORT A
TMS_PPIB .EQU 0 ; PPI PORT B
TMS_PPIC .EQU 0 ; PPI PORT C
TMS_PPIX .EQU 0 ; PPI CONTROL PORT
#ENDIF
;
#IF (TMSMODE == TMSMODE_MBC)
@@ -78,7 +82,7 @@ TMS_KBDST .EQU $E3 ; KBD CTLR STATUS/CMD PORT
TMS_ROWS .EQU 24
#IF ((TMSMODE == TMSMODE_RCV9958) | (TMSMODE == TMSMODE_MBC))
#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC))
TMS_FNTVADDR .EQU $1000 ; VRAM ADDRESS OF FONT DATA
TMS_COLS .EQU 80
#ELSE
@@ -99,7 +103,7 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER
#DEFINE TMS_IODELAY EX (SP),HL \ EX (SP),HL ; 38 W/S
#ELSE
; BELOW WAS TUNED FOR SBC AT 8MHZ
#IF ((TMSMODE == TMSMODE_RCV9958) | (TMSMODE == TMSMODE_MBC))
#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC))
#DEFINE TMS_IODELAY NOP \ NOP \ NOP \ NOP \ NOP \ NOP \ NOP ; V9958 NEEDS AT WORST CASE, APPROX 4us (28T) DELAY BETWEEN I/O (WHEN IN TEXT MODE)
#ELSE
#DEFINE TMS_IODELAY NOP \ NOP ; 8 W/S
@@ -148,13 +152,13 @@ TMS_INIT:
#IF (TMSMODE == TMSMODE_N8)
PRTS("N8$")
#ENDIF
#IF (TMSMODE == TMSMODE_RC)
PRTS("RC$")
#IF (TMSMODE == TMSMODE_MSX)
PRTS("MSX$")
#ENDIF
#IF (TMSMODE == TMSMODE_RCKBD)
#IF (TMSMODE == TMSMODE_MSXKBD)
PRTS("RCKBD$")
#ENDIF
#IF (TMSMODE == TMSMODE_RCV9958)
#IF (TMSMODE == TMSMODE_MSX9958)
PRTS("RC_V9958$")
#ENDIF
;
@@ -176,7 +180,7 @@ TMS_INIT1:
#IF (TMSMODE == TMSMODE_N8)
CALL PPK_INIT ; INITIALIZE PPI KEYBOARD DRIVER
#ENDIF
#IF ((TMSMODE == TMSMODE_RCKBD) | (TMSMODE == TMSMODE_MBC))
#IF ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC))
CALL KBD_INIT ; INITIALIZE 8242 KEYBOARD DRIVER
#ENDIF
#IF MKYENABLE
@@ -231,7 +235,7 @@ TMS_FNTBL:
.DW PPK_FLUSH
.DW PPK_READ
#ELSE
#IF ((TMSMODE == TMSMODE_RCKBD) | (TMSMODE == TMSMODE_MBC))
#IF ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC))
.DW KBD_STAT
.DW KBD_FLUSH
.DW KBD_READ
@@ -298,9 +302,7 @@ TMS_VDADEV:
RET
TMS_VDASCS:
CALL SYSCHK ; NOT IMPLEMENTED (YET)
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED (YET)
RET
TMS_VDASCP:
@@ -435,7 +437,7 @@ TMS_SET:
;----------------------------------------------------------------------
;
TMS_WR:
#IF ((TMSMODE == TMSMODE_RCV9958) | (TMSMODE == TMSMODE_MBC))
#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC))
; CLEAR R#14 FOR V9958
XOR A
OUT (TMS_CMDREG), A
@@ -473,21 +475,27 @@ TMS_PROBE:
; WRITE TEST PATTERN TO FIRST TWO BYTES
LD A,$A5 ; FIRST BYTE
OUT (TMS_DATREG),A ; OUTPUT
TMS_IODELAY ; DELAY
;TMS_IODELAY ; DELAY
CALL DLY64 ; DELAY
CPL ; COMPLEMENT ACCUM
OUT (TMS_DATREG),A ; SECOND BYTE
TMS_IODELAY ; DELAY
;TMS_IODELAY ; DELAY
CALL DLY64 ; DELAY
; SET READ ADDRESS TO $0
LD HL,0
CALL TMS_RD
; READ TEST PATTERN
LD C,$A5 ; VALUE TO EXPECT
IN A,(TMS_DATREG) ; READ FIRST BYTE
TMS_IODELAY ; DELAY
;CALL PRTHEXBYTE
;TMS_IODELAY ; DELAY
CALL DLY64 ; DELAY
CP C ; COMPARE
RET NZ ; RETURN ON MISCOMPARE
IN A,(TMS_DATREG) ; READ SECOND BYTE
TMS_IODELAY ; DELAY
;CALL PRTHEXBYTE
;TMS_IODELAY ; DELAY
CALL DLY64 ; DELAY
CPL ; COMPLEMENT IT
CP C ; COMPARE
RET ; RETURN WITH RESULT IN Z
@@ -522,6 +530,13 @@ TMS_CRTINIT2:
INC HL ; POINT TO NEXT VALUE
INC C ; POINT TO NEXT REGISTER
DJNZ TMS_CRTINIT2 ; LOOP
;
; ENABLE WAIT SIGNAL IF 9938/58
#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC))
LD C,25 ; REGISTER 25
LD A,%00000100 ; ONLY WTE BIT SET
CALL TMS_SET ; DO IT
#ENDIF
RET
;
;----------------------------------------------------------------------
@@ -920,13 +935,13 @@ TMS_BUF .FILL 256,0 ; COPY BUFFER
;
TMS_IDAT:
#IF ((TMSMODE == TMSMODE_RC) | (TMSMODE == TMSMODE_RCV9958) | (TMSMODE == TMSMODE_N8) | (TMSMODE == TMSMODE_SCG))
#IF ((TMSMODE == TMSMODE_MSX) | (TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_N8) | (TMSMODE == TMSMODE_SCG))
.DB TMS_PPIA ; PPI PORT A
.DB TMS_PPIB ; PPI PORT B
.DB TMS_PPIC ; PPI PORT C
.DB TMS_PPIX ; PPI CONTROL PORT
#ENDIF
#IF ((TMSMODE == TMSMODE_RCKBD) | (TMSMODE == TMSMODE_MBC))
#IF ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC))
.DB TMS_KBDST ; 8242 CMD/STATUS PORT
.DB TMS_KBDDATA ; 8242 DATA PORT
.DB 0 ; FILLER
@@ -978,7 +993,7 @@ TMS_IDAT:
; 5S Fifth sprite (not displayed) detected. Value in FS* is valid.
; INT Set at each screen update, used for interrupts.
;
#IF ((TMSMODE == TMSMODE_RCV9958) | (TMSMODE == TMSMODE_MBC))
#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC))
TMS_INITVDU:
.DB $04 ; REG 0 - NO EXTERNAL VID, SET M4 = 1
TMS_INITVDU_REG_1:

View File

@@ -73,8 +73,13 @@ TTY_FNTBL:
;
;
TTY_IN:
#IF (VDAEMU_SERKBD != $FF)
LD C,VDAEMU_SERKBD
JP CIO_DISPATCH
#ELSE
LD B,BF_VDAKRD ; SET FUNCTION TO KEYBOARD READ
JP TTY_VDADISP ; CHAIN TO VDA DISPATCHER
#ENDIF
;
;
;
@@ -86,8 +91,13 @@ TTY_OUT:
;
;
TTY_IST:
#IF (VDAEMU_SERKBD != $FF)
LD C,VDAEMU_SERKBD
JP CIO_DISPATCH
#ELSE
LD B,BF_VDAKST ; SET FUNCTION TO KEYBOARD STATUS
JP TTY_VDADISP ; CHAIN TO VDA DISPATCHER
#ENDIF
;
;
;

View File

@@ -486,13 +486,15 @@ STR_TSTPT .TEXT "\r\n+++ TSTPT: $"
;STR_PC .DB " PC=$"
;STR_SP .DB " SP=$"
;
; INDIRECT JUMP TO ADDRESS IN HL
; INDIRECT JUMP TO ADDRESS IN HL,IX, OR IY
;
; MOSTLY USEFUL TO PERFORM AN INDIRECT CALL LIKE:
; LD HL,xxxx
; CALL JPHL
;
JPHL: JP (HL)
JPIX: JP (IX)
JPIY: JP (IY)
;
; ADD HL,A
;
@@ -829,54 +831,155 @@ BITLOC1:
DJNZ BITLOC1 ; LOOP AS NEEDED
RET ; DONE
;
; PRINT VALUE OF A IN DECIMAL WITH LEADING ZERO SUPPRESSION
; DECIMAL NUMBER PRINTING ROUTINES
;
PRTDECB:
PUSH HL
PUSH AF
LD L,A
LD H,0
CALL PRTDEC
POP AF
POP HL
PRTDEC8: ; PRINT VALUE OF A REGISTER IN DECIMAL
PUSH IY
LD IY,B2D8
CALL PRTDECSTR
POP IY
RET
;
; PRINT VALUE OF HL IN DECIMAL WITH LEADING ZERO SUPPRESSION
PRTDEC16: ; PRINT VALUE OF HL REGISGTER IN DECIMAL
PUSH IY
LD IY,B2D16
CALL PRTDECSTR
POP IY
RET
;
PRTDEC:
PRTDEC32: ; PRINT VALUE OF DE:HL REGISTERS IN DECIMAL
PUSH IY
LD IY,B2D32
CALL PRTDECSTR
POP IY
RET
;
PRTDECSTR:
PUSH AF
PUSH BC
PUSH DE
PUSH HL
LD E,'0'
LD BC,-10000
CALL PRTDEC1
LD BC,-1000
CALL PRTDEC1
LD BC,-100
CALL PRTDEC1
LD C,-10
CALL PRTDEC1
LD E,0
LD C,-1
CALL PRTDEC1
PUSH IX
CALL JPIY ; CALL (IY)
EX DE,HL
LD A,'$'
LD (B2DEND),A
CALL WRITESTR
POP IX
POP HL
POP DE
POP BC
POP AF
RET
PRTDEC1:
LD A,'0' - 1
PRTDEC2:
INC A
ADD HL,BC
JR C,PRTDEC2
;
; Combined routine for conversion of different sized binary numbers into
; directly printable ASCII(Z)-string
; Input value in registers, number size and -related to that- registers to fill
; is selected by calling the correct entry:
;
; entry inputregister(s) decimal value 0 to:
; B2D8 A 255 (3 digits)
; B2D16 HL 65535 5 "
; B2D24 E:HL 16777215 8 "
; B2D32 DE:HL 4294967295 10 "
; B2D48 BC:DE:HL 281474976710655 15 "
; B2D64 IX:BC:DE:HL 18446744073709551615 20 "
;
; The resulting string is placed into a small buffer attached to this routine,
; this buffer needs no initialization and can be modified as desired.
; The number is aligned to the right, and leading 0's are replaced with spaces.
; On exit HL points to the first digit, (B)C = number of decimals
; This way any re-alignment / postprocessing is made easy.
; Changes: AF,BC,DE,HL,IX
; P.S. some examples below
;
; by Alwin Henseler
;
B2D8: LD H,0
LD L,A
B2D16: LD E,0
B2D24: LD D,0
B2D32: LD BC,0
B2D48: LD IX,0 ; zero all non-used bits
B2D64: LD (B2DINV),HL
LD (B2DINV+2),DE
LD (B2DINV+4),BC
LD (B2DINV+6),IX ; place full 64-bit input value in buffer
LD HL,B2DBUF
LD DE,B2DBUF+1
LD (HL),' '
B2DFILC .EQU $-1 ; address of fill-character
LD BC,18
LDIR ; fill 1st 19 bytes of buffer with spaces
LD (B2DEND-1),BC ;set BCD value to "0" & place terminating 0
LD E,1 ; no. of bytes in BCD value
LD HL,B2DINV+8 ; (address MSB input)+1
LD BC,$0909
XOR A
B2DSKP0:DEC B
JR Z,B2DSIZ ; all 0: continue with postprocessing
DEC HL
OR (HL) ; find first byte <>0
JR Z,B2DSKP0
B2DFND1:DEC C
RLA
JR NC,B2DFND1 ; determine no. of most significant 1-bit
RRA
LD D,A ; byte from binary input value
B2DLUS2:PUSH HL
PUSH BC
B2DLUS1:LD HL,B2DEND-1 ; address LSB of BCD value
LD B,E ; current length of BCD value in bytes
RL D ; highest bit from input value -> carry
B2DLUS0:LD A,(HL)
ADC A,A
DAA
LD (HL),A ; double 1 BCD byte from intermediate result
DEC HL
DJNZ B2DLUS0 ; and go on to double entire BCD value (+carry!)
JR NC,B2DNXT
INC E ; carry at MSB -> BCD value grew 1 byte larger
LD (HL),1 ; initialize new MSB of BCD value
B2DNXT: DEC C
JR NZ,B2DLUS1 ; repeat for remaining bits from 1 input byte
POP BC ; no. of remaining bytes in input value
LD C,8 ; reset bit-counter
POP HL ; pointer to byte from input value
DEC HL
LD D,(HL) ; get next group of 8 bits
DJNZ B2DLUS2 ; and repeat until last byte from input value
B2DSIZ: LD HL,B2DEND ; address of terminating 0
LD C,E ; size of BCD value in bytes
OR A
SBC HL,BC ; calculate address of MSB BCD
LD D,H
LD E,L
SBC HL,BC
CP E
JR Z,PRTDEC3
LD E,0
CALL COUT
PRTDEC3:
EX DE,HL ; HL=address BCD value, DE=start of decimal value
LD B,C ; no. of bytes BCD
SLA C ; no. of bytes decimal (possibly 1 too high)
LD A,'0'
RLD ; shift bits 4-7 of (HL) into bit 0-3 of A
CP '0' ; (HL) was > 9h?
JR NZ,B2DEXPH ; if yes, start with recording high digit
DEC C ; correct number of decimals
INC DE ; correct start address
JR B2DEXPL ; continue with converting low digit
B2DEXP: RLD ; shift high digit (HL) into low digit of A
B2DEXPH:LD (DE),A ; record resulting ASCII-code
INC DE
B2DEXPL:RLD
LD (DE),A
INC DE
INC HL ; next BCD-byte
DJNZ B2DEXP ; and go on to convert each BCD-byte into 2 ASCII
SBC HL,BC ; return with HL pointing to 1st decimal
RET
;
B2DINV .FILL 8 ; space for 64-bit input value (LSB first)
B2DBUF .FILL 20 ; space for 20 decimal digits
B2DEND .DB 1 ; space for terminating 0
;
; SHIFT HL:DE BY B BITS
;
SRL32:
@@ -897,6 +1000,57 @@ SLA32:
DJNZ SLA32
RET
;
; PRINT VALUE OF A IN DECIMAL WITH LEADING ZERO SUPPRESSION
; BELOW ARE NOW OBSOLETE AND MAPPED TO NEW ROUTINES
;
PRTDECB .EQU PRTDEC8
;;;PRTDECB:
;;; PUSH HL
;;; PUSH AF
;;; LD L,A
;;; LD H,0
;;; CALL PRTDEC
;;; POP AF
;;; POP HL
;;; RET
;
; PRINT VALUE OF HL IN DECIMAL WITH LEADING ZERO SUPPRESSION
;
PRTDEC .EQU PRTDEC16
;;;PRTDEC:
;;; PUSH BC
;;; PUSH DE
;;; PUSH HL
;;; LD E,'0'
;;; LD BC,-10000
;;; CALL PRTDEC1
;;; LD BC,-1000
;;; CALL PRTDEC1
;;; LD BC,-100
;;; CALL PRTDEC1
;;; LD C,-10
;;; CALL PRTDEC1
;;; LD E,0
;;; LD C,-1
;;; CALL PRTDEC1
;;; POP HL
;;; POP DE
;;; POP BC
;;; RET
;;;PRTDEC1:
;;; LD A,'0' - 1
;;;PRTDEC2:
;;; INC A
;;; ADD HL,BC
;;; JR C,PRTDEC2
;;; SBC HL,BC
;;; CP E
;;; JR Z,PRTDEC3
;;; LD E,0
;;; CALL COUT
;;;PRTDEC3:
;;; RET
;
; LOAD OR STORE DE:HL
;
LD32:

View File

@@ -211,9 +211,7 @@ VGA_VDADEV:
RET
VGA_VDASCS:
CALL SYSCHK ; NOT IMPLEMENTED (YET)
LD A,ERR_NOTIMPL
OR A
SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED (YET)
RET
VGA_VDASCP:

880
Source/HBIOS/ym2612.asm Normal file
View File

@@ -0,0 +1,880 @@
;------------------------------------------------------------------------------
; YM2612 sound driver
; Written by: Phil Summers (b1ackmailer) difficultylevelhigh@gmail.com
;
;------------------------------------------------------------------------------
; References:
; https://hiddenpalace.org/News/Sega_of_Japan_Sound_Documents_and_Source_Code
; https://www.smspower.org/maxim/Documents/YM2612
; https://plutiedev.com/blog/20200103
; https://www.plutiedev.com/ym2612-registers
; https://www.plutiedev.com/ym2612-operations
; https://en.wikipedia.org/wiki/Scientific_pitch_notation
; https://gendev.spritesmind.net/forum/viewtopic.php?t=2915 (1)
; http://nemesis.hacking-cult.org/MegaDrive/Documentation/YM2608J.PDF
;
;------------------------------------------------------------------------------
; Octave range is A#0-B7+3/4 HBIOS note 0..343
;------------------------------------------------------------------------------
;
YMSEL .EQU VGMBASE+00H ; Primary YM2162 11000000 a1=0 a0=0
YMDAT .EQU VGMBASE+01H ; Primary YM2162 11000001 a1=0 a0=1
YM2SEL .EQU VGMBASE+02H ; Secondary YM2162 11000010 a1=1 a0=0
YM2DAT .EQU VGMBASE+03H ; Secondary YM2162 11000011 a1=1 a0=1
;------------------------------------------------------------------------------
; Device capabilities and configuration
;------------------------------------------------------------------------------
;
YM_TONECNT .EQU 6 ; Count number of tone channels
YM_NOISECNT .EQU 0 ; Count number of noise channels
;
YM_PENDING_PERIOD .DW 0 ; PENDING PERIOD (12 BITS)
YM_PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS)
YM_PENDING_DURATION .DW 0 ; PENDING DURATION (16 BITS)
YM_READY .DB 0 ; BIT 0 -> NZ DRIVER IS READY TO RECEIVE PLAY COMMAND
; BIT 1 -> NZ EXECUTING WITHIN TIMER HANDLER = DO NOT DIS/ENABLE INT
YM_RDY_RST .DB 0 ; FLAG INDICATES IF DEVICE IS IN READY (NZ) OR RESET STATE (Z)
YM_DEBUG .EQU 0 ; CHANGE TO 1 TO ENABLE DEBUGGING
YM_RSTCFG .EQU 0 ; SET TO 1 FOR FULL REGISTER CLEAR
YM_FAST3438 .EQU 0 ; FAST CPU'S WITH A YM3438 MAY REQUIRE A DELAY
;
;------------------------------------------------------------------------------
; Driver function table and instance data
;------------------------------------------------------------------------------
;
YM_FNTBL: .DW YM_RESET
.DW ym_volume
.DW YM_PERIOD
.DW YM_NOTE
.DW YM_PLAY
.DW YM_QUERY
.DW YM_DURATION
.DW YM_DEVICE
;
#IF (($ - YM_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n"
!!!!!
#ENDIF
;
YM_IDAT .EQU 0 ; NO INSTANCE DATA FOR THIS DEVICE
;
;------------------------------------------------------------------------------
; YM2162 Initialization
; Announce device on console.
; Setup function tables. Setup the device.
; Set volume off.
; Return initialization status
;------------------------------------------------------------------------------
;
YM2612_INIT: CALL NEWLINE ; ANNOUNCE
PRTS("YM:$")
;
PRTS(" IO=0x$")
LD A,YMSEL
CALL PRTHEXBYTE
;
LD IY, YM_IDAT ; SETUP FUNCTION TABLE
LD BC, YM_FNTBL ; POINTER TO INSTANCE DATA
LD DE, YM_IDAT ; BC := FUNCTION TABLE ADDRESS
CALL SND_ADDENT ; DE := INSTANCE DATA PTR
;
YM_INIT: ld hl,ym_cfg
; call ym_prog
; ret
;
;------------------------------------------------------------------------------
; Program ym2612 with a list of register entries
;------------------------------------------------------------------------------
;
ym_prog: ld c,(hl) ; get port address
inc hl
ld d,(hl) ; count of pairs
inc hl
;
#IF (YM_DEBUG)
push af
ld a,c ; port
call PRTHEXBYTE
pop af
#ENDIF
;
t_loop: ld a,(hl) ; get register to write
out (c),a ; write reg to RSEL port
;
#IF (YM_DEBUG)
call PRTHEXBYTE ; register
#ENDIF
;
inc hl
inc c ; point to RDAT port
ld a,(hl) ; get value to write
out (c),a ; write value to RDAT port
;
#IF (YM_DEBUG)
call PRTHEXBYTE
call PC_SPACE
#ENDIF
;
dec c ; point back to RSEL port
ld b,0 ;
nready1:
#IF YM_FAST3438==1) \ cp (ix) \ #ENDIF \ ; ym3438 delay (1)
in a,(c) ; check device
rlca ; ready with timeout
jr nc,ready1 ; bits 7 = busy
djnz nready1
;
; timed out
;
ready1: inc hl ;
dec d ; decrease # left to do
jr nz,t_loop
;
#IF (YM_DEBUG)
call NEWLINE
#ENDIF
;
ld a,(hl) ; end flag?
or a
jr nz,ym_prog ; no? restart
ret
;
;------------------------------------------------------------------------------
; Sound driver function - QUERY and subfunctions
;------------------------------------------------------------------------------
;
YM_QUERY: LD A, E
CP BF_SNDQ_CHCNT ; SUB FUNCTION 01
JR Z, YM_QUERY_CHCNT
;
CP BF_SNDQ_VOLUME ; SUB FUNCTION 02
JR Z, YM_QUERY_VOLUME
;
CP BF_SNDQ_PERIOD ; SUB FUNCTION 03
JR Z, YM_QUERY_PERIOD
;
CP BF_SNDQ_DEV ; SUB FUNCTION 04
JR Z, YM_QUERY_DEV
;
OR $FF ; SIGNAL FAILURE
RET
;
YM_QUERY_CHCNT: LD BC,(YM_TONECNT*256)+YM_NOISECNT
XOR A ; RETURN NUMBER OF TONE AND NOISE
RET ; NOISE CHANNELS IN BC
;
YM_QUERY_PERIOD:LD HL, (YM_PENDING_PERIOD) ; RETURN 16-BIT PERIOD
XOR A ; IN HL REGISTER
RET
;
YM_QUERY_VOLUME:LD A, (YM_PENDING_VOLUME) ; RETURN 8-BIT VOLUME
LD L, A ; IN L REGISTER
XOR A
; LD H, A
RET
;
YM_QUERY_DEV: LD B, SNDDEV_YM2612 ; RETURN DEVICE IDENTIFIER
LD DE, +(YMSEL*256)+YMDAT ; AND ADDRESS AND DATA PORT
LD HL, +(YM2SEL*256)+YM2DAT
XOR A
RET
;
;------------------------------------------------------------------------------
; Sound driver function - DEVICE
;------------------------------------------------------------------------------
;
YM_DEVICE: LD D,SNDDEV_YM2612 ; D := DEVICE TYPE
LD E,0 ; E := PHYSICAL UNIT
LD C,$00 ; C := DEVICE TYPE
LD H,0 ; H := MODE
LD L,YMSEL ; L := BASE I/O ADDRESS
XOR A
RET
;
;------------------------------------------------------------------------------
; Sound driver function - RESET
; Initialize device. Set volume off. Reset volume and tone variables.
;------------------------------------------------------------------------------
;
YM_RESET: ;CALL AY_CHKREDY ; RETURNS TO OUR CALLER IF NOT READY
;
PUSH DE
PUSH HL
CALL YM_INIT ; SET DEFAULT CHIP CONFIGURATION
;
XOR A ; SIGNAL SUCCESS
LD (YM_RDY_RST),A ; IN RESET STATE
LD (YM_PENDING_VOLUME),A ; SET VOLUME TO ZERO
LD H,A
LD L,A
LD (YM_PENDING_PERIOD),HL ; SET TONE PERIOD TO ZERO
;
POP HL
POP DE
RET
;
;------------------------------------------------------------------------------
; Sound driver function - VOLUME
;------------------------------------------------------------------------------
;
ym_volume: LD A,L ; SAVE VOLUME
LD (YM_PENDING_VOLUME),A
XOR A ; SIGNAL SUCCESS
RET
;
;------------------------------------------------------------------------------
; Sound driver function - NOTE
;------------------------------------------------------------------------------
;
YM_NOTE: ;CALL PRTHEXWORDHL
;CALL PC_COLON
LD DE,40 ; Calculate the ym2612 block (octave)
ADD HL,DE ; This will go into b13-b11
LD DE,48 ; HL / DE
CALL DIV16 ; BC = block (octave) HL = quarter semitone note
;
ADD HL,HL
LD DE,ym_notetable ; point HL to frequency entry
ADD HL,DE ; for the quarter semitone note
;CALL PRTHEXWORDHL
;CALL PC_COLON
;CALL PRTHEXWORD
;CALL PC_COLON
;
LD A,C ; SHIFT OCTAVE INTO RIGHT POSITION
ADD A,A ; X2
ADD A,A ; X4
ADD A,A ; X8 -NEEDS TO BE OR'ED WITH HIGH BYTE
;
LD E,(HL) ; COMBINE FREQUENCY ENTRY
INC HL ; AND BLOCK (OCTAVE) IN HL
OR (HL)
LD H,A
LD L,E
;CALL PRTHEXWORDHL
;
;------------------------------------------------------------------------------
; Sound driver function - PERIOD
; The format for setting frequency on the ym2612 is 00xxxyyy-yyyyyyyy
; Where xxx us the octave and yyy-yyyyyyyy is the frequency
;------------------------------------------------------------------------------
;
YM_PERIOD: LD A, H ; IF ZERO - ERROR
OR L
JR Z, YM_PERIOD1
;
LD A, H ; MAXIMUM TONE PERIOD IS 11-BITS
AND 11000000B ; ALLOWED RANGE IS 0001-07FF (2047)
JR NZ,YM_PERIOD1 ; AND 3 BITS FOR OCTAVE (7)
LD (YM_PENDING_PERIOD),HL ; RETURN NZ IF NUMBER TOO LARGE
RET ; SAVE AND RETURN SUCCESSFUL
;
YM_PERIOD1: LD A, $FF ; REQUESTED PERIOD IS LARGER
LD (YM_PENDING_PERIOD),A ; THAN THE DEVICE CAN SUPPORT
LD (YM_PENDING_PERIOD+1),A ; SO SET PERIOD TO FFFF
RET ; AND RETURN FAILURE
;
;------------------------------------------------------------------------------
; Sound driver function - DURATION
;------------------------------------------------------------------------------
;
YM_DURATION: LD (YM_PENDING_DURATION),HL ; SET TONE DURATION
XOR A
RET
;
;------------------------------------------------------------------------------
; Sound driver function - PLAY
; D = CHANNEL
;------------------------------------------------------------------------------
;
YM_PLAY: ld a,d
cp YM_TONECNT ; error if bad channel
ret nc
cp 3 ; 000 > 000, 011 > 100
ld e,part1 ; 001 > 001, 100 > 101
jr c,ch012 ; 010 > 010, 101 > 110
sub 3
ld d,a ; d = 0..2
add a,4 ; a = 4..6
jr ch345
ch012: ld e,part0
ch345:
;
#IF (YM_DEBUG)
call PC_COLON
call PRTHEXBYTE ; a = 0..2 4..6
push af
ld a,d
call PRTHEXBYTE ; d = 00..05
ld a,e
call PRTHEXBYTE ; e = part0/part1 (c0/c2)
pop af
call NEWLINE
#ENDIF
;
ld hl,ym_playcmd01
ld (hl),e ; set the part
;
ld hl,ym_playcmd00 ; setup keyoff channel
ld (hl),a
ld hl,ym_playcmd09 ; setup keyon channel
or %10000000 ; operator 4 only
ld (hl),a
ld a,$a4 ; setup frequency register msb
add a,d ; $a4-$a6
ld hl,ym_playcmd02
ld (hl),a
ld a,$a0 ; setup frequency register lsb
add a,d ; $a0-$a2
ld hl,ym_playcmd04
ld (hl),a
ld a,$4c ; setup volume register
add a,d ; $4c-$4e
ld hl,ym_playcmd06
ld (hl),a
LD A,(YM_RDY_RST) ; IF STILL IN RESET
OR A ; STATE GO SETUP FOR
CALL Z,YM_MAKE_RDY ; PLAYING
;
ld hl,(YM_PENDING_PERIOD) ; GET THE PREVIOUSLY SETUP
ld de,ym_playcmd03 ; TONE DATA AND
ld a,h
ld (de),a ; PATCH IT INTO THE
ld de,ym_playcmd05 ; YM2612 PLAY COMMAND
ld a,l
ld (de),a
;
ld de,ym_playcmd07
ld A,(YM_PENDING_VOLUME) ; GET VOLUME
srl a
cpl
and %01111111 ; PATCH IT INTO THE
ld (de),a ; YM2612 PLAY COMMAND
#IF (YM_DEBUG)
ld b,16 ; debug
call NEWLINE ; dump
ld de,ym_playnote ; the
ym_dbgcmd: ld a,(de) ; command
call PRTHEXBYTE ; stream
call PC_SPACE
inc de
djnz ym_dbgcmd
call NEWLINE
#ENDIF
ld hl,ym_playnote ; NOW PLAY IT
jp ym_prog
;
;------------------------------------------------------------------------------
; Make ready for hbios play
;------------------------------------------------------------------------------
;
YM_MAKE_RDY: CPL
LD (YM_RDY_RST),A ; Invert the ready flag
ld hl,ym_cfg_ready ; Program ym2612 for playing
jp ym_prog
;
;------------------------------------------------------------------------------
; Command sequence to play a note
;------------------------------------------------------------------------------
;
ym_playnote: .db part0, 2/2
.db $28
ym_playcmd00: .db $00 ; [0] KEY OFF
;
ym_playcmd01: .db part0,6/2
ym_playcmd02: .db $A4
ym_playcmd03: .db $3F ; [X] Frequency MSB
ym_playcmd04: .db $A0
ym_playcmd05: .db $FF ; [X] Frequency LSB
ym_playcmd06: .db $4C
ym_playcmd07: .db $00 ; [X] Volume
;
.db part0, 2/2
ym_playcmd08: .db $28
ym_playcmd09: .db $F0 ; [0] KEY ON
.db $00 ; End flag
;
;------------------------------------------------------------------------------
; Quarter semitone F-Number values for frequency
;------------------------------------------------------------------------------
;
ym_notetable: .dw 644 ; C ; 152
.dw 653 ; approx
.dw 663 ; approx
.dw 672 ; approx
.dw 681 ; C# ; 156
.dw 691 ; approx
.dw 702 ; approx
.dw 712 ; approx
.dw 722 ; D ; 160
.dw 733 ; approx
.dw 744 ; approx
.dw 754 ; approx
.dw 765 ; D# ; 164
.dw 776 ; approx
.dw 788 ; approx
.dw 799 ; approx
.dw 810 ; E ; 168
.dw 822 ; approx
.dw 834 ; approx
.dw 846 ; approx
.dw 858 ; F ; 172
.dw 871 ; approx
.dw 884 ; approx
.dw 897 ; approx
.dw 910 ; F# ; 176
.dw 924 ; approx
.dw 937 ; approx
.dw 951 ; approx
.dw 964 ; G ; 180
.dw 978 ; approx
.dw 993 ; approx
.dw 1007 ; approx
.dw 1021 ; G# ; 184
.dw 1036 ; approx
.dw 1051 ; approx
.dw 1066 ; approx
.dw 1081 ; A ; 188
.dw 1097 ; approx
.dw 1114 ; approx
.dw 1130 ; approx
.dw 1146 ; A# ; 192
.dw 1163 ; approx
.dw 1180 ; approx
.dw 1197 ; approx
.dw 1214 ; B ; 196
.dw 1232 ; approx
.dw 1250 ; approx
.dw 1268 ; approx
;
;------------------------------------------------------------------------------
; Register configuration data for play
;------------------------------------------------------------------------------
;
ym_cfg_ready: .db part0, 2/2
.db $22, $00 ; Global: LFO disable
;
.db part0, 6/2
.db $B0,$30 ; Channel 1-3
.db $b1,$30 ; Algorithm 0 S1>S2>S3>S4
.db $b2,$30 ; Feedback pure sine wave
;
.db part1, 6/2
.db $B0,$30 ; Channel 4-6
.db $b1,$30 ; Algorithm 0 S1>S2>S3>S4
.db $b2,$30 ; Feedback pure sine wave
;
.db part0, 6/2
.db $3c, $01 ; Channel 1-3
.db $3d, $01 ; Operator 4.MUL = 1
.db $3e, $01
;
.db part1, 6/2
.db $3c, $01 ; Channel 4-6
.db $3d, $01 ; Operator 4.MUL = 1
.db $3e, $01
;
.db part0, 6/2
.db $b4,%01000000 ; Channel 1-3
.db $b5,%01000000 ; Left Channel
.db $b6,%01000000
;
.db part1, 6/2
.db $b4,%10000000 ; Channel 4-6
.db $b5,%10000000 ; Right Channel
.db $b6,%10000000
;
.db part0, 6/2
.db $44, $7F ; Channel 1-3
.db $45, $7F ; Mute operator 3 <- pure sine wave
.db $46, $7F
;
.db part1, 6/2
.db $44, $7F ; Channel 4-6
.db $45, $7F ; Mute operator 3 <- pure sine wave
.db $46, $7F
;
.db part0, 6/2
.db $4C, $00 ; Channel 1-3
.db $4d, $00 ; Max volume for operator 4
.db $4e, $00
;
.db part1, 6/2
.db $4C, $00 ; Channel 4-6
.db $4d, $00 ; Max volume for operator 4
.db $4e, $00
;
.db part0, 6/2
.db $5C, $1F ; Channel 1-3
.db $5d, $1F ; Operator 4.AR = shortest
.db $5e, $1F
;
.db part1, 6/2
.db $5C, $1F ; Channel 4-6
.db $5d, $1F ; Operator 4.AR = shortest
.db $5e, $1F
;
.db part0, 6/2
.db $6C, $06 ; Channel 1-3
.db $6d, $06 ; Operator 4.D1R= 6
.db $6e, $06
;
.db part1, 6/2
.db $6C, $06 ; Channel 4-6
.db $6d, $06 ; Operator 4.D1R= 6
.db $6e, $06
;
.db part0, 6/2
.db $7C, $1F ; Channel 1-3
.db $7d, $1F ; Operator 4.D2R= 31
.db $7e, $1F
;
.db part1, 6/2
.db $7C, $1F ; Channel 4-6
.db $7d, $1F ; Operator 4.D2R= 31
.db $7e, $1F
;
.db part0, 6/2
.db $8C, $FF ; Channel 1-3
.db $8d, $FF ; Operator 4.SL = 15 / Operator4. RR=15
.db $8e, $FF
;
.db part1, 6/2
.db $8C, $FF ; Channel 4-6
.db $8d, $FF ; Operator 4.SL = 15 / Operator4. RR=15
.db $8e, $FF
;
.db $00 ; End flag
;
;
;------------------------------------------------------------------------------
; Register configuration data for soft reset state
;------------------------------------------------------------------------------
;
part0: .equ YMSEL
part1: .equ YM2SEL
;
#IF (YM_RSTCFG==0)
ym_cfg: .db part0, 24/2
.db $22,$00 ; [0] lfo off
.db $27,$00 ; [0] Disable independant Channel 3
.db $28,$00 ; [0] note off ch 1
.db $28,$01 ; [0] note off ch 2
.db $28,$02 ; [0] note off ch 3
.db $28,$04 ; [0] note off ch 4
.db $28,$05 ; [0] note off ch 5
.db $28,$06 ; [0] note off ch 6
.db $2b,$00 ; [0] dac off
.db $b4,$00 ; [0] sound off ch 1-3
.db $b5,$00
.db $b6,$00
;
.db part1, 6/2
.db $b4,$00 ; [1] sound off ch 4-6
.db $b5,$00 ; [1]
.db $b6,$00 ; [1]
;
.db part0, 24/2
.db $40,$7f ; [0] ch 1-3 total level minimum
.db $41,$7f ; [0]
.db $42,$7f ; [0]
.db $44,$7f ; [0]
.db $45,$7f ; [0]
.db $46,$7f ; [0]
.db $48,$7f ; [0]
.db $49,$7f ; [0]
.db $4a,$7f ; [0]
.db $4c,$7f ; [0]
.db $4d,$7f ; [0]
.db $4e,$7f ; [0]
;
.db part1, 24/2
.db $40,$7f ; [1] ch 4-6 total level minimum
.db $41,$7f ; [1]
.db $42,$7f ; [1]
.db $44,$7f ; [1]
.db $45,$7f ; [1]
.db $46,$7f ; [1]
.db $48,$7f ; [1]
.db $49,$7f ; [1]
.db $4a,$7f ; [1]
.db $4c,$7f ; [1]
.db $4d,$7f ; [1]
.db $4e,$7f ; [1]
;
.db $00 ; End flag
;
;------------------------------------------------------------------------------
; Register configuration data for hard reset state
;------------------------------------------------------------------------------
;
#ELSE
ym_cfg: .db part0, 24/2
.db $22,$00 ; [0] lfo off
.db $27,$00 ; [0] Disable independant Channel 3
.db $28,$00 ; [0] note off ch 1
.db $28,$01 ; [0] note off ch 2
.db $28,$02 ; [0] note off ch 3
.db $28,$04 ; [0] note off ch 4
.db $28,$05 ; [0] note off ch 5
.db $28,$06 ; [0] note off ch 6
.db $2b,$00 ; [0] dac off
.db $b4,$00 ; [0] sound off ch 1-3
.db $b5,$00 ; [0]
.db $b6,$00 ; [0]
.db part1, 6/2
.db $b4,$00 ; [1] sound off ch 4-6
.db $b5,$00 ; [1]
.db $b6,$00 ; [1]
.db part0, 24/2
.db $40,$7f ; [0] ch 1-3 total level minimum
.db $41,$7f ; [0]
.db $42,$7f ; [0]
.db $44,$7f ; [0]
.db $45,$7f ; [0]
.db $46,$7f ; [0]
.db $48,$7f ; [0]
.db $49,$7f ; [0]
.db $4a,$7f ; [0]
.db $4c,$7f ; [0]
.db $4d,$7f ; [0]
.db $4e,$7f ; [0]
.db part1, 24/2
.db $40,$7f ; [1] ch 4-6 total level minimum
.db $41,$7f ; [1]
.db $42,$7f ; [1]
.db $44,$7f ; [1]
.db $45,$7f ; [1]
.db $46,$7f ; [1]
.db $48,$7f ; [1]
.db $49,$7f ; [1]
.db $4a,$7f ; [1]
.db $4c,$7f ; [1]
.db $4d,$7f ; [1]
.db $4e,$7f ; [1]
.db part0, 32/2
.db $2a,$00 ; [0] ; dac value
.db $24,$00 ; [0] ; timer A frequency
.db $25,$00 ; [0] ; timer A frequency
.db $26,$00 ; [0] ; time B frequency
.db $30,$00 ; [0] ; ch 1-3 multiply & detune
.db $31,$00 ; [0]
.db $32,$00 ; [0]
.db $34,$00 ; [0]
.db $35,$00 ; [0]
.db $36,$00 ; [0]
.db $38,$00 ; [0]
.db $39,$00 ; [0]
.db $3a,$00 ; [0]
.db $3c,$00 ; [0]
.db $3d,$00 ; [0]
.db $3e,$00 ; [0]
.db part1, 24/2
.db $30,$00 ; [1] ch 4-6 multiply & detune
.db $31,$00 ; [1]
.db $32,$00 ; [1]
.db $34,$00 ; [1]
.db $35,$00 ; [1]
.db $36,$00 ; [1]
.db $38,$00 ; [1]
.db $39,$00 ; [1]
.db $3a,$00 ; [1]
.db $3c,$00 ; [1]
.db $3d,$00 ; [1]
.db $3e,$00 ; [1]
.db part0, 24/2
.db $50,$00 ; [0] ch 1-3 attack rate and scaling
.db $51,$00 ; [0]
.db $52,$00 ; [0]
.db $54,$00 ; [0]
.db $55,$00 ; [0]
.db $56,$00 ; [0]
.db $58,$00 ; [0]
.db $59,$00 ; [0]
.db $5a,$00 ; [0]
.db $5c,$00 ; [0]
.db $5d,$00 ; [0]
.db $5e,$00 ; [0]
.db part1, 24/2
.db $50,$00 ; [1] ch 4-6 attack rate and scaling
.db $51,$00 ; [1]
.db $52,$00 ; [1]
.db $54,$00 ; [1]
.db $55,$00 ; [1]
.db $56,$00 ; [1]
.db $58,$00 ; [1]
.db $59,$00 ; [1]
.db $5a,$00 ; [1]
.db $5c,$00 ; [1]
.db $5d,$00 ; [1]
.db $5e,$00 ; [1]
.db part0, 24/2
.db $60,$00 ; [0] ch 1-3 decay rate and am enable
.db $61,$00 ; [0]
.db $62,$00 ; [0]
.db $64,$00 ; [0]
.db $65,$00 ; [0]
.db $66,$00 ; [0]
.db $68,$00 ; [0]
.db $69,$00 ; [0]
.db $6a,$00 ; [0]
.db $6c,$00 ; [0]
.db $6d,$00 ; [0]
.db $6e,$00 ; [0]
.db part1, 24/2
.db $60,$00 ; [1] ch 4-6 decay rate and am enable
.db $61,$00 ; [1]
.db $62,$00 ; [1]
.db $64,$00 ; [1]
.db $65,$00 ; [1]
.db $66,$00 ; [1]
.db $68,$00 ; [1]
.db $69,$00 ; [1]
.db $6a,$00 ; [1]
.db $6c,$00 ; [1]
.db $6d,$00 ; [1]
.db $6e,$00 ; [1]
.db part0, 24/2
.db $70,$00 ; [0] ch 1-3 sustain rate
.db $71,$00 ; [0]
.db $72,$00 ; [0]
.db $74,$00 ; [0]
.db $75,$00 ; [0]
.db $76,$00 ; [0]
.db $78,$00 ; [0]
.db $79,$00 ; [0]
.db $7a,$00 ; [0]
.db $7c,$00 ; [0]
.db $7d,$00 ; [0]
.db $7e,$00 ; [0]
.db part1, 24/2
.db $70,$00 ; [1] ch 4-6 sustain rate
.db $71,$00 ; [1]
.db $72,$00 ; [1]
.db $74,$00 ; [1]
.db $75,$00 ; [1]
.db $76,$00 ; [1]
.db $78,$00 ; [1]
.db $79,$00 ; [1]
.db $7a,$00 ; [1]
.db $7c,$00 ; [1]
.db $7d,$00 ; [1]
.db $7e,$00 ; [1]
.db part0, 24/2
.db $80,$00 ; [0] ch 1-3 release rate and sustain level
.db $81,$00 ; [0]
.db $82,$00 ; [0]
.db $84,$00 ; [0]
.db $85,$00 ; [0]
.db $86,$00 ; [0]
.db $88,$00 ; [0]
.db $89,$00 ; [0]
.db $8a,$00 ; [0]
.db $8c,$00 ; [0]
.db $8d,$00 ; [0]
.db $8e,$00 ; [0]
.db part1, 24/2
.db $80,$00 ; [1] ch 4-6 release rate and sustain level
.db $81,$00 ; [1]
.db $82,$00 ; [1]
.db $84,$00 ; [1]
.db $85,$00 ; [1]
.db $86,$00 ; [1]
.db $88,$00 ; [1]
.db $89,$00 ; [1]
.db $8a,$00 ; [1]
.db $8c,$00 ; [1]
.db $8d,$00 ; [1]
.db $8e,$00 ; [1]
.db part0, 24/2
.db $90,$00 ; [0] ch 1-3 ssg-eg
.db $91,$00 ; [0]
.db $92,$00 ; [0]
.db $94,$00 ; [0]
.db $95,$00 ; [0]
.db $96,$00 ; [0]
.db $98,$00 ; [0]
.db $99,$00 ; [0]
.db $9a,$00 ; [0]
.db $9c,$00 ; [0]
.db $9d,$00 ; [0]
.db $9e,$00 ; [0]
.db part1, 24/2
.db $90,$00 ; [1] ch 4-6 ssg-eg
.db $91,$00 ; [1]
.db $92,$00 ; [1]
.db $94,$00 ; [1]
.db $95,$00 ; [1]
.db $96,$00 ; [1]
.db $98,$00 ; [1]
.db $99,$00 ; [1]
.db $9a,$00 ; [1]
.db $9c,$00 ; [1]
.db $9d,$00 ; [1]
.db $9e,$00 ; [1]
.db part0, 12/2
.db $a0,$00 ; [0] ch 1-3 frequency
.db $a1,$00 ; [0]
.db $a2,$00 ; [0]
.db $a4,$00 ; [0]
.db $a5,$00 ; [0]
.db $a6,$00 ; [0]
; .db $a8,$00 ; [0] ch 3 special mode
; .db $a9,$00 ; [0]
; .db $aa,$00 ; [0]
; .db $ac,$00 ; [0]
; .db $ad,$00 ; [0]
; .db $ae,$00 ; [0]
.db part1, 12/2
.db $a0,$00 ; [1] ch 4-6 frequency
.db $a1,$00 ; [1]
.db $a2,$00 ; [1]
.db $a4,$00 ; [1]
.db $a5,$00 ; [1]
.db $a6,$00 ; [1]
; .db $a8,$00 ; [1] ch 3 special mode
; .db $a9,$00 ; [1]
; .db $aa,$00 ; [1]
; .db $ac,$00 ; [1]
; .db $ad,$00 ; [1]
; .db $ae,$00 ; [1]
.db part0, 6/2
.db $b0,$00 ; [0] ch 1-3 algorith + feedback
.db $b1,$00 ; [0]
.db $b2,$00 ; [0]
.db part1, 6/2
.db $b0,$00 ; [1] ch 4-6 algorith + feedback
.db $b1,$00 ; [1]
.db $b2,$00 ; [1]
;
.db $00 ; End flag
#ENDIF

Binary file not shown.

Binary file not shown.

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