mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-07 06:53:13 -06:00
Compare commits
28 Commits
v3.4.0-dev
...
v3.5.0-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ee8cdfa4b8 | ||
|
|
6f7d1447ea | ||
|
|
3e6120e0fa | ||
|
|
61565bffd7 | ||
|
|
0bac6f32ea | ||
|
|
462545bfe7 | ||
|
|
cc4ad0d4b9 | ||
|
|
458b04404e | ||
|
|
4143cfa4cf | ||
|
|
438e59a05e | ||
|
|
7385d07b9a | ||
|
|
5bea1f400e | ||
|
|
1a9701e51d | ||
|
|
23e0b82112 | ||
|
|
b4b5ef19fc | ||
|
|
4dd46c3df6 | ||
|
|
17e3a95768 | ||
|
|
3529cdaa2f | ||
|
|
556b7074ae | ||
|
|
952489eac4 | ||
|
|
8f326fb081 | ||
|
|
2925ab3d42 | ||
|
|
cdb9f9b40a | ||
|
|
def84eded9 | ||
|
|
d89e055f18 | ||
|
|
62f9330de8 | ||
|
|
374ed7ab97 | ||
|
|
c7bee46f60 |
2
.github/pull_request_template.md
vendored
2
.github/pull_request_template.md
vendored
@@ -1,7 +1,7 @@
|
||||
<!--
|
||||
BEFORE YOU CREATE A PULL REQUEST:
|
||||
|
||||
- Please base all pull requests against the dev branch
|
||||
- Please base all pull requests against the master branch
|
||||
- Include a clear description of your change
|
||||
- Reference related Issue(s) (e.g., "Resolves Issue #123")
|
||||
|
||||
|
||||
42
CONTRIBUTING.md
Normal file
42
CONTRIBUTING.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# Contributing to RomWBW
|
||||
|
||||
> **WARNING**: The `dev` branch of RomWBW has been deprecated as of v3.4. All Pull Requests should now target the `master` branch.
|
||||
|
||||
Contributions of all kinds to RomWBW are welcomed and greatly appreciated.
|
||||
|
||||
- Reporting bug(s) and suggesting new feature(s)
|
||||
- Discussing the current state of the code
|
||||
- Submitting a fixes and enhancements
|
||||
|
||||
## RomWBW GitHub Repository
|
||||
|
||||
The [RomWBW GitHub Repository](https://github.com/wwarthen/RomWBW) is the primary location for developing, supporting, and distributing RomWBW. Although input is gladly accepted from almost any channel, the GitHub Repository is preferred.
|
||||
|
||||
- Use **Issues** to report bugs, request enhancements, or ask usage questions.
|
||||
- Use **Discussions** to interact with others
|
||||
- Use **Pull Requests** to submit content (code, documentation, etc.)
|
||||
|
||||
## Submitting Content
|
||||
|
||||
This RomWBW Project uses the standard [GitHub Flow](https://docs.github.com/en/get-started/quickstart/github-flow). Submission of content changes (including code) are ideally done via Pull Requests.
|
||||
|
||||
- Submitters are advised to contact [Wayne Warthen](mailto:wwarthen@gmail.com) or start a GitHub Discussion prior to starting any significant work. This is simply to ensure that submissions are consistent
|
||||
with the overall goals and intentions of RomWBW.
|
||||
- All submissions should be based on the `master` branch. To create your submission, fork the RomWBW repository and create your branch from `master`. Make (and test) your changes in your personal fork.
|
||||
- Please update relevant documentation and the `ChangeLog` found in the `Doc` folder.
|
||||
- You are encouraged to comment your submissions to ensure your work is properly attributed.
|
||||
- When ready, submit a Pull Request to merge your forked branch into the RomWBW master branch.
|
||||
|
||||
## Coding Style
|
||||
|
||||
Due to the nature of the project, you will find a variety of coding styles. When making changes to existing code, please try to be consistent with the existing coding style. You may not like the current style, but no one likes mixed styles
|
||||
in one file/module.
|
||||
|
||||
Be careful with white space. RomWBW is primarily assembly langauge code. The use of tab stops at every 8 characters is pretty standard for assembler. If you use something else, then your code will look odd when viewed by others.
|
||||
|
||||
In most cases, the use of `<cr><lf>` line endings is preferred. This is standard for the operating systems of the era that RomWBW provides. Also note that CP/M text files should end with a ctrl-Z (0x1A). This is not magically added by the
|
||||
tools that generate the disk images.
|
||||
|
||||
## License
|
||||
|
||||
RomWBW is licensed under GPLv3. When you submit code changes, your submissions are understood to be under the same [GPLv3 License](https://www.gnu.org/licenses/gpl-3.0.html) that covers the project.
|
||||
@@ -1,3 +1,11 @@
|
||||
Version 3.5
|
||||
-----------
|
||||
- M?F: Fix for hours display in HBRTC application
|
||||
- M?F: Fix for assembly error in DS1501RTC driver
|
||||
- WBW: Add VT-100 graphics char selection to Propeller firmware
|
||||
- WBW: Allow all lines of VGA display to be used on Propeller firmware
|
||||
- WBW: Allow front panel LED/Switch bits to be inverted in config
|
||||
|
||||
Version 3.4
|
||||
-----------
|
||||
NOTE: Changes require HBIOS/CBIOS/Apps sync, version bump to 3.4 to ensure integrity
|
||||
@@ -5,10 +13,39 @@ NOTE: Changes require HBIOS/CBIOS/Apps sync, version bump to 3.4 to ensure integ
|
||||
- A?C: Support for EP ITX-Mini Z180 Platform
|
||||
- M?R: Significant improvement in User Guide document
|
||||
- J?P: Preliminary support for Monsputer (MON)
|
||||
|
||||
- JLC: Standardize TMS driver memory map for compatibility
|
||||
- WBW: Improved IDE device detection
|
||||
- WBW: Fixed decompression when run on Z280
|
||||
- K?B: WDATE generic HBIOS date/time utility
|
||||
- WBW: Create new DSKY framework with simple driver style interface
|
||||
- JBL: Added ColecoVision config in TMS driver
|
||||
- WBW: Added support for interrupt mode 1 on Z180
|
||||
- WBW: Added S100 platform
|
||||
- WBW: Added Duodyne platform
|
||||
- WBW: Incorporated John Monahan's S100 Monitor in S100 platform build
|
||||
- WBW: Support ESP32 on Duodyne
|
||||
- M?C: Fixed port specification when using XM.COM send transfers
|
||||
- PMS: Support for Duodyne DMA
|
||||
- WBW: Added Serial ROM (SROM.COM) utility
|
||||
- WBW: Support S100 Propeller Console
|
||||
- SCC: Added support for SC700
|
||||
- WBW: Added Heath H8 platform
|
||||
- D?J: Enhanced build to run on Raspberry Pi 4
|
||||
- WBW: Complete overhaul of ROMless boot operation
|
||||
- WBW: Prevent access to slices outside of partition
|
||||
- T?P: Contributed the HTALK utility
|
||||
- WBW: CTS stall detection
|
||||
- W?S: Updated FLASH utility to v1.3.7
|
||||
- L?N: Updated UNARC to new OS universal version
|
||||
- B?C: Added support for Z1RCC
|
||||
- M?R: User Guide enhancements and corrections
|
||||
- D?H: Added support for specification of secondary console
|
||||
- WBW: Added platform for Monsputer
|
||||
- WBW: Added FAT.COM to standard ROM Disk (removed RMAC.COM & LINK.COM)
|
||||
|
||||
Version 3.3
|
||||
-----------
|
||||
NOTE: v3.3 was never released
|
||||
- WBW: Support Front Panel switches
|
||||
- A?C: Preliminary support for Z80-Retro
|
||||
- A?C: Support for SD PIO
|
||||
@@ -16,7 +53,7 @@ Version 3.3
|
||||
- WBW: Support per-drive floppy configuration
|
||||
- WBW: Support for Bill Shen's VGARC
|
||||
- WBW: Support for MG014 Parallel Port module + printer
|
||||
- WBW: Support for EMM Zip Drive on PPI interface (much inspiration from Alan Cox)
|
||||
- WBW: Support for IMM Zip Drive on PPI interface (much inspiration from Alan Cox)
|
||||
- WBW: Support for PPA Zip Drive on PPI interface (much inspiration from Alan Cox)
|
||||
- WBW: Support for SyQuest SparQ Drive on PPI interface (much inspiration from Alan Cox)
|
||||
- WBW: Support for ATAPI Disk Drives (not CD-ROMs) on IDE and PPIDE interfaces
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
30
ReadMe.md
30
ReadMe.md
@@ -1,9 +1,9 @@
|
||||
|
||||
|
||||
**RomWBW ReadMe** \
|
||||
Version 3.4 \
|
||||
Version 3.5 \
|
||||
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
|
||||
18 Dec 2023
|
||||
21 Jan 2024
|
||||
|
||||
# Overview
|
||||
|
||||
@@ -197,6 +197,32 @@ let me know if I missed you!
|
||||
Aztec C, HiTech C, SLR Z80ASM, Turbo Pascal, Microsoft BASIC Compiler,
|
||||
Microsoft Fortran Compiler, and a Games compendium.
|
||||
|
||||
- Martin R has provided substantial help reviewing and improving the
|
||||
User Guide.
|
||||
|
||||
- Jacques Pelletier has contributed the DS1501 RTC driver code.
|
||||
|
||||
- Jose Collado has contributed enhancements to the TMS driver including
|
||||
compatibility with standard TMS register configuration.
|
||||
|
||||
- Kevin Boone has contributed a generic HBIOS date/time utility (WDATE).
|
||||
|
||||
- Matt Carroll has contributed a fix to XM.COM that corrects the port
|
||||
specification when doing a send.
|
||||
|
||||
- Dean Jenkins enhanced the build process to accommodate the Raspberry
|
||||
Pi 4.
|
||||
|
||||
- Tom Plano has contributed a new utility (HTALK) to allow talking
|
||||
directly to HBIOS COM ports.
|
||||
|
||||
- Lars Nelson has contributed several generic utilities such as a
|
||||
universal (OS agnostic) UNARC application.
|
||||
|
||||
- Dylan Hall added support for specifying a secondary console.
|
||||
|
||||
- Bill Shen has contributed boot loaders for several of his systems.
|
||||
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
# Licensing
|
||||
|
||||
29
ReadMe.txt
29
ReadMe.txt
@@ -1,6 +1,6 @@
|
||||
RomWBW ReadMe
|
||||
Wayne Warthen (wwarthen@gmail.com)
|
||||
18 Dec 2023
|
||||
21 Jan 2024
|
||||
|
||||
|
||||
|
||||
@@ -197,6 +197,33 @@ let me know if I missed you!
|
||||
including Aztec C, HiTech C, SLR Z80ASM, Turbo Pascal, Microsoft
|
||||
BASIC Compiler, Microsoft Fortran Compiler, and a Games compendium.
|
||||
|
||||
- Martin R has provided substantial help reviewing and improving the
|
||||
User Guide.
|
||||
|
||||
- Jacques Pelletier has contributed the DS1501 RTC driver code.
|
||||
|
||||
- Jose Collado has contributed enhancements to the TMS driver
|
||||
including compatibility with standard TMS register configuration.
|
||||
|
||||
- Kevin Boone has contributed a generic HBIOS date/time utility
|
||||
(WDATE).
|
||||
|
||||
- Matt Carroll has contributed a fix to XM.COM that corrects the port
|
||||
specification when doing a send.
|
||||
|
||||
- Dean Jenkins enhanced the build process to accommodate the Raspberry
|
||||
Pi 4.
|
||||
|
||||
- Tom Plano has contributed a new utility (HTALK) to allow talking
|
||||
directly to HBIOS COM ports.
|
||||
|
||||
- Lars Nelson has contributed several generic utilities such as a
|
||||
universal (OS agnostic) UNARC application.
|
||||
|
||||
- Dylan Hall added support for specifying a secondary console.
|
||||
|
||||
- Bill Shen has contributed boot loaders for several of his systems.
|
||||
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
|
||||
|
||||
125
Source/Apps/FAT/ReadMe.md
Normal file
125
Source/Apps/FAT/ReadMe.md
Normal file
@@ -0,0 +1,125 @@
|
||||
# RomWBW HBIOS CP/M FAT Utility ("FAT.COM")
|
||||
|
||||
Author: Wayne Warthen \
|
||||
Updated: 6-Jan-2024
|
||||
|
||||
This application allows copying files between CP/M filesystems and FAT
|
||||
filesystems (DOS, Windows, Mac, Linux, etc.). The application runs on
|
||||
RomWBW hosted CP/M (and compatible) operating systems. The application
|
||||
also has limited file management capabilities on FAT filesystems
|
||||
including directory listing, renaming, deleting, and sub-directory
|
||||
creation.
|
||||
|
||||
### Usage:
|
||||
|
||||
```
|
||||
FAT DIR <path>
|
||||
FAT COPY <src> <dst>
|
||||
FAT REN <from> <to>
|
||||
FAT DEL <path>[<file>|<dir>]
|
||||
FAT MD <path>
|
||||
FAT FORMAT <drv>
|
||||
```
|
||||
|
||||
CP/M filespec: \<d\>:FILENAME.EXT (\<d\> is CP/M drive letter A-P) \
|
||||
FAT filespec: \<u\>:/DIR/FILENAME.EXT (\<u\> is disk unit #)
|
||||
|
||||
### Notes:
|
||||
|
||||
- Partitioned or non-partitioned media is handled automatically.
|
||||
A floppy drive is a good example of a non-partitioned FAT
|
||||
filesystem and will be recognized. Larger media will typically
|
||||
have a partition table which will be recognized by the
|
||||
application to find the FAT filesystem.
|
||||
|
||||
- Although RomWBW-style CP/M media does not know anything about
|
||||
partition tables, it is entirely possible to have media that
|
||||
has both CP/M and FAT file systems on it. This is accomplished
|
||||
by creating a FAT filesystem on the media that starts on a track
|
||||
beyond the last track used by CP/M. Each CP/M slice can occupy
|
||||
up to 8MB. So, make sure to start your FAT partition beyond
|
||||
(slice count) * 9MB.
|
||||
|
||||
- The application infers whether you are attempting to reference
|
||||
a FAT or CP/M filesystem via the drive specifier (char before ':').
|
||||
A numeric drive character specifies the HBIOS disk unit number
|
||||
for FAT access. An alpha (A-P) character indicates a CP/M
|
||||
file system access targeting the specified drive letter. If there
|
||||
is no drive character specified, the current CP/M filesystem and
|
||||
current CP/M drive is assumed. For example:
|
||||
|
||||
`2:README.TXT` refers to FAT file README.TXT on disk unit #2 \
|
||||
`C:README.TXT` refers to CP/M file README.TXT on CP/M drive C: \
|
||||
`README.TXT` refers to CP/M file README.TXT on current CP/M drive
|
||||
|
||||
- FAT files with SYS, HIDDEN, or R/O attributes are not given
|
||||
any special treatment. Such files are found and processed
|
||||
like any other file. However, any attempt to write to a
|
||||
read-only file will fail and the application will abort.
|
||||
|
||||
- It is not currently possible to reference CP/M user areas other
|
||||
than the current user. To copy files to alternate user areas,
|
||||
you must switch to the desired user number first or use an
|
||||
additional step to copy the file to the desired user area.
|
||||
|
||||
- Accessing FAT filesystems on a floppy requires the use of
|
||||
RomWBW HBIOS v2.9.1-pre.13 or greater.
|
||||
|
||||
- Only the first 8 RomWBW disk units (0-7) can be referenced.
|
||||
|
||||
- Files written are not verified.
|
||||
|
||||
- Wildcard matching in FAT filesystems is a bit unusual as
|
||||
implemented by FatFs. See FatFs documentation.
|
||||
|
||||
### License:
|
||||
|
||||
GNU GPLv3 (see file LICENSE.txt)
|
||||
|
||||
### Build Notes:
|
||||
|
||||
- Source is maintained on GitHub at <https://github.com/wwarthen/FAT>.
|
||||
|
||||
- Application is based on FatFs. FatFs source is included. See
|
||||
<http://elm-chan.org/fsw/ff/>.
|
||||
|
||||
- SDCC compiler v4.3 or greater is required to build. New calling
|
||||
conventions introduced in v4.3 are assumed.
|
||||
|
||||
- See Build.cmd for sample build script under Windows. References
|
||||
to SDCC must be updated for your environment.
|
||||
|
||||
- Note that ff.c (core FatFs code) generates quite a few compiler
|
||||
warnings (all appear to be benign).
|
||||
|
||||
### To Do:
|
||||
|
||||
- Allow ^C to abort any operation in progress.
|
||||
|
||||
- Allow referencing more than the first 8 RomWBW disk units.
|
||||
|
||||
- Handle wildcards in destination, e.g.:
|
||||
|
||||
`FAT REN 2:/*.TXT 2:/*.BAK`
|
||||
|
||||
- Do something intelligent with R/O and SYS file attributes
|
||||
|
||||
- Support UNA
|
||||
|
||||
### History:
|
||||
|
||||
| Date | Version | Notes |
|
||||
|------------:|-------- |-------------------------------------------------------------|
|
||||
| 2-May-2019 | v0.9 | (beta) initial release |
|
||||
| 7-May-2019 | v0.9.1 | (beta) added REN and DEL |
|
||||
| 8-May-2019 | v0.9.2 | (beta) handle file collisions w/ user prompt |
|
||||
| 8-Oct-2019 | v0.9.3 | (beta) fixed incorrect filename buffer size (MAX_FN) |
|
||||
| 10-Oct-2019 | v0.9.4 | (beta) upgraded to FatFs R0.13c |
|
||||
| 10-Oct-2019 | v0.9.5 | (beta) added MD (make directory) |
|
||||
| 10-Oct-2019 | v0.9.6 | (beta) added FORMAT |
|
||||
| 11-Oct-2019 | v0.9.7 | (beta) fix FORMAT to use existing partition table entries |
|
||||
| | | add attributes to directory listing |
|
||||
| 12-Apr-2021 | v0.9.8 | (beta) support CP/NET drives |
|
||||
| 12-Oct-2023 | v0.9.9 | (beta) handle updated HBIOS Disk Device call |
|
||||
| 6-Jan-2024 | v1.0.0 | updated to latest FsFat (v0.15) |
|
||||
| | | updated to latest SDCC (v4.3) |
|
||||
@@ -1,105 +0,0 @@
|
||||
RomWBW HBIOS CP/M FAT Utility ("FAT.COM")
|
||||
|
||||
Author: Wayne Warthen
|
||||
Updated: 12-Oct-2023
|
||||
|
||||
Application to manipulate and exchange files with a FAT (DOS)
|
||||
filesystem. Runs on any HBIOS hosted CP/M implementation.
|
||||
|
||||
USAGE:
|
||||
FAT DIR <path>
|
||||
FAT COPY <src> <dst>
|
||||
FAT REN <from> <to>
|
||||
FAT DEL <path>[<file>|<dir>]
|
||||
FAT MD <path>
|
||||
FAT FORMAT <drv>
|
||||
|
||||
CP/M filespec: <d>:FILENAME.EXT (<d> is CP/M drive letter A-P)
|
||||
FAT filespec: <u>:/DIR/FILENAME.EXT (<u> is disk unit #)
|
||||
|
||||
LICENSE:
|
||||
GNU GPLv3 (see file LICENSE.txt)
|
||||
|
||||
NOTES:
|
||||
- Partitioned or non-partitioned media is handled automatically.
|
||||
A floppy drive is a good example of a non-partitioned FAT
|
||||
filesystem and will be recognized. Larger media will typically
|
||||
have a partition table which will be recognized by the
|
||||
application to find the FAT filesystem.
|
||||
|
||||
- Although RomWBW-style CP/M media does not know anything about
|
||||
partition tables, it is entirely possible to have media that
|
||||
has both CP/M and FAT file systems on it. This is accomplished
|
||||
by creating a FAT filesystem on the media that starts on a track
|
||||
beyond the last track used by CP/M. Each CP/M slice on a
|
||||
media will occupy a little over 8MB. So, make sure to start
|
||||
your FAT partition beyond (slice count) * 8MB.
|
||||
|
||||
- The application infers whether you are attempting to reference
|
||||
a FAT or CP/M filesystem via the drive specifier (char before ':').
|
||||
A numeric drive character specifies the HBIOS disk unit number
|
||||
for FAT access. An alpha (A-P) character indicates a CP/M
|
||||
file system access targeting the specified drive letter. If there
|
||||
is no drive character specified, the current CP/M filesystem and
|
||||
current CP/M drive is assumed. For example:
|
||||
|
||||
"2:README.TXT" refers to FAT file README.TXT on disk unit #2
|
||||
"C:README.TXT" refers to CP/M file README.TXT on CP/M drive C
|
||||
"README.TXT" refers to CP/M file README.TXT on current CP/M drive
|
||||
|
||||
- FAT files with SYS, HIDDEN, or R/O only attributes are not given
|
||||
any special treatment. Such files are found and processed
|
||||
like any other file. However, any attempt to write to a
|
||||
read-only file will fail and the application will abort.
|
||||
|
||||
- It is not currently possible to reference CP/M user areas other
|
||||
than the current user. To copy files to alternate user areas,
|
||||
you must switch to the desired user number first or use an
|
||||
additional step to copy the file to the desired user area.
|
||||
|
||||
- Accessing FAT filesystems on a floppy requires the use of
|
||||
RomWBW HBIOS v2.9.1-pre.13 or greater.
|
||||
|
||||
- Files written are not verified.
|
||||
|
||||
- Wildcard matching in FAT filesystems is a bit unusual as
|
||||
implemented by FatFs. See FatFs documentation.
|
||||
|
||||
BUILD NOTES:
|
||||
- Source is maintained on GitHub at https://github.com/wwarthen/FAT
|
||||
|
||||
- Application is based on FatFs. FatFs source is included.
|
||||
|
||||
- SDCC compiler is required to build (v4.0.0 known working).
|
||||
|
||||
- ZX CP/M emulator is required to build (from RomWBW distribution).
|
||||
|
||||
- See Build.cmd for sample build script under Windows. References
|
||||
to SDCC and ZX must be updated for your environment.
|
||||
|
||||
- Note that ff.c (core FatFs code) generates quite a few compiler
|
||||
warnings (all appear to be benign).
|
||||
|
||||
TO DO:
|
||||
- Allow ^C to abort any operation in progress.
|
||||
|
||||
- Handle wildcards in destination, e.g.:
|
||||
"FAT REN 2:/*.TXT 2:/*.BAK"
|
||||
|
||||
- Do something intelligent with R/O and SYS files on FAT
|
||||
|
||||
- Support UNA
|
||||
|
||||
HISTORY:
|
||||
2-May-2019: v0.9 (beta) initial release
|
||||
7-May-2019: v0.9.1 (beta) added REN and DEL
|
||||
8-May-2019: v0.9.2 (beta) handle file collisions w/ user prompt
|
||||
8-Oct-2019: v0.9.3 (beta) fixed incorrect filename buffer size (MAX_FN)
|
||||
10-Oct-2019: v0.9.4 (beta) upgraded to FatFs R0.13c
|
||||
10-Oct-2019: v0.9.5 (beta) added MD (make directory)
|
||||
10-Oct-2019: v0.9.6 (beta) added FORMAT
|
||||
11-Oct-2019: v0.9.7 (beta) fix FORMAT to use existing partition table entries
|
||||
add attributes to directory listing
|
||||
12-Apr-2021: v0.9.8 (beta) support CP/NET drives
|
||||
12-Oct-2023: v0.9.9 (beta) handle updated HBIOS Disk Device call
|
||||
|
||||
Binary file not shown.
@@ -189,9 +189,9 @@ show_spd:
|
||||
ld b,BF_SYSGET
|
||||
ld c,BF_SYSGET_CPUINFO
|
||||
rst 08
|
||||
jp nz,err_not_sup
|
||||
jp nz,err_api
|
||||
call crlf2
|
||||
ld (cpu_spd),de ; save CPU speed for now
|
||||
push de ; save CPU speed for now
|
||||
push bc ; Oscillator speed to HL
|
||||
pop hl
|
||||
ld de,str_spacer
|
||||
@@ -199,10 +199,18 @@ show_spd:
|
||||
call prtd3m ; print it
|
||||
ld de,str_oscspd
|
||||
call prtstr
|
||||
call crlf
|
||||
ld de,str_cpuspd
|
||||
call prtstr
|
||||
pop hl ; recover CPU speed
|
||||
call prtd3m ; print it
|
||||
ld de,str_mhz
|
||||
call prtstr
|
||||
;
|
||||
ld b,BF_SYSGET
|
||||
ld c,BF_SYSGET_CPUSPD
|
||||
rst 08
|
||||
jp nz,err_not_sup
|
||||
ret nz ; no CPU speed info, done
|
||||
push de ; save wait states for now
|
||||
ld a,l
|
||||
ld de,str_slow
|
||||
@@ -216,11 +224,6 @@ show_spd:
|
||||
jr z,show_spd1
|
||||
jp err_invalid
|
||||
show_spd1:
|
||||
call crlf
|
||||
call prtstr
|
||||
ld hl,(cpu_spd) ; recover CPU speed
|
||||
call prtd3m
|
||||
ld de,str_cpuspd
|
||||
call prtstr
|
||||
pop hl
|
||||
ld a,h ; memory wait states
|
||||
@@ -284,6 +287,9 @@ err_not_sup:
|
||||
err_invalid:
|
||||
ld de,str_err_invalid
|
||||
jr err_ret
|
||||
err_api:
|
||||
ld de,str_err_api
|
||||
jr err_ret
|
||||
;
|
||||
err_ret:
|
||||
call crlf2
|
||||
@@ -659,21 +665,24 @@ delay1:
|
||||
; Constants
|
||||
;=======================================================================
|
||||
;
|
||||
str_banner .db "RomWBW CPU Speed Selector v0.5, 2-Feb-2022",0
|
||||
str_banner .db "RomWBW CPU Speed Selector v0.6, 29-Dec-2023",0
|
||||
str_spacer .db " ",0
|
||||
str_oscspd .db " MHz Oscillator",0
|
||||
str_slow .db " CPU speed is HALF (",0
|
||||
str_full .db " CPU speed is FULL (",0
|
||||
str_dbl .db " CPU speed is DOUBLE (",0
|
||||
str_cpuspd .db " MHz)",0
|
||||
str_cpuspd .db " CPU speed is ",0
|
||||
str_mhz .db " MHz",0
|
||||
|
||||
str_slow .db " (Half)",0
|
||||
str_full .db " (Full)",0
|
||||
str_dbl .db " (Double)",0
|
||||
str_memws .db " Memory Wait State(s)",0
|
||||
str_iows .db " I/O Wait State(s)",0
|
||||
str_err_una .db " ERROR: UNA not supported by application",0
|
||||
str_err_inv .db " ERROR: Invalid BIOS (signature missing)",0
|
||||
str_err_ver .db " ERROR: Unexpected HBIOS version",0
|
||||
str_err_parm .db " ERROR: Parameter error (CPUSPD /? for usage)",0
|
||||
str_err_not_sup .db " ERROR: Platform or configuration not supported!",0
|
||||
str_err_not_sup .db " ERROR: Platform or configuration does not support CPU speed configuration!",0
|
||||
str_err_invalid .db " ERROR: Invalid configuration!",0
|
||||
str_err_api .db " ERROR: HBIOS API error!",0
|
||||
str_usage .db " Usage: CPUSPD <cpuspd>,<memws>,<iows>\r\n"
|
||||
.db "\r\n"
|
||||
.db " <cpuspd>: \"Half\", \"Full\", or \"Double\"\r\n"
|
||||
@@ -693,7 +702,6 @@ stack .equ $ ; stack top
|
||||
;
|
||||
;
|
||||
tmpstr .fill 9,0 ; temp string (8 chars, 0 term)
|
||||
cpu_spd .dw 0 ; current cpu speed
|
||||
new_cpu_spd .db $FF ; new CPU speed
|
||||
new_ws_mem .db $FF ; new memory wait states
|
||||
new_ws_io .db $FF ; new I/O wait states
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
; 1) Actually implement this
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
#include "../ver.inc"
|
||||
;
|
||||
;===============================================================================
|
||||
; Definitions
|
||||
;===============================================================================
|
||||
@@ -30,9 +32,6 @@ bdos .equ $0005 ; BDOS invocation vector
|
||||
;;
|
||||
;stamp .equ $40 ; loc of RomWBW CBIOS zero page stamp
|
||||
;
|
||||
rmj .equ 3 ; CBIOS version - major
|
||||
rmn .equ 0 ; CBIOS version - minor
|
||||
;
|
||||
;===============================================================================
|
||||
; Code Section
|
||||
;===============================================================================
|
||||
|
||||
@@ -58,7 +58,7 @@ HBC_CLKTBL:
|
||||
.DB 02H, 00111111B, '/'
|
||||
.DB 01H, 00011111B, '/'
|
||||
.DB 00H, 11111111B, ' '
|
||||
.DB 03H, 00011111B, ':'
|
||||
.DB 03H, 00111111B, ':'
|
||||
.DB 04H, 01111111B, ':'
|
||||
.DB 05H, 01111111B, 00H
|
||||
;
|
||||
|
||||
@@ -12,7 +12,7 @@ Operating System (DOS), and Basic I/O System (BIOS). The CCP and DOS components
|
||||
are pre-built, relocatable binaries. The BIOS (BPBIOS) is assembled into a relocatable
|
||||
binary by the build, then the build links together all three components to form the
|
||||
final loadable image (.IMG) file. The linking process is performed by the custom BPBIOS
|
||||
linker (BPBUILD.COM). In addition to linking the 3 components, BPBUILD also sets
|
||||
linker (BPBUILD.COM). In addition to linking the 3 components, BPBUILD also
|
||||
adjusts the ZCPR environment configuration.
|
||||
|
||||
BPBUILD is designed to be run interactively. However, it can be started with an
|
||||
@@ -24,8 +24,8 @@ running of BPBUILD.
|
||||
|
||||
The CCP can be ZCPR 3.3 (ZCPR33?.REL), ZCPR 3.4 (Z34.REL), or ZCPR 4.1 (Z41.ZRL). ZCPR 3.3
|
||||
uses static references to the ZCPR segments, so a custom version of it must be assembled.
|
||||
The ZCPR33 subdirectory provides a build process for doing this. It produces a specific
|
||||
version for each of the memory segment configurations (ZCPR33T.REL & ZCPR33N.REL).
|
||||
The ZCPR33 subdirectory provides a build process for doing this. It produces a custom
|
||||
version of ZCPR33.REL with the correct static references to the ZCPR segments.
|
||||
|
||||
The DOS can be ZSDOS 1.1 (ZSDOS.ZRL) or ZSDOS 2.03 (ZS203.ZRL). These are both pre-built
|
||||
relocatable binaries. Note that only certain version combinations of ZSDOS and ZCPR are
|
||||
|
||||
@@ -421,6 +421,12 @@ DRVTBL: LD HL,DPHTBL ; Point to DPH table
|
||||
PAGE
|
||||
ENDIF ;HARDDSK
|
||||
|
||||
IF RAMDSK ; << ****** Hardware Specific ****** >>
|
||||
INCLUDE RAMD-WW.Z80 ; << This Driver is for HBIOS >>
|
||||
|
||||
PAGE
|
||||
ENDIF ;RAMDSK
|
||||
|
||||
|
||||
; << ****** Hardware Specific ****** >>
|
||||
; << Enter Warm Boot routines in >>
|
||||
|
||||
@@ -120,14 +120,14 @@ DYNLP: LD E,(HL)
|
||||
DEC DE ; Else back up Ptr to Driver
|
||||
DEC DE
|
||||
LD A,(DE) ; Get driver #
|
||||
; IF RAMDSK
|
||||
; DEC A
|
||||
; DEC A ; Hard Disk (Driver 2)?
|
||||
; JR Z,ADDSIZ ; ..jump if so
|
||||
; DEC A ; RAM Disk (Driver 3)?
|
||||
; ELSE
|
||||
IF RAMDSK
|
||||
DEC A
|
||||
DEC A ; Hard Disk (Driver 2)?
|
||||
JR Z,ADDSIZ ; ..jump if so
|
||||
DEC A ; RAM Disk (Driver 3)?
|
||||
ELSE
|
||||
CP 2 ; Hard Disk (Driver 2)?
|
||||
; ENDIF ; Ramdsk
|
||||
ENDIF ; Ramdsk
|
||||
JR NZ,DYNCHK ; ..jump to end if Not
|
||||
ADDSIZ: PUSH BC ; Save loop counter
|
||||
PUSH HL ; and ptr to DPH
|
||||
|
||||
@@ -74,7 +74,7 @@ MORDPB EQU NO ; Include additional Floppy DPB Formats?
|
||||
|
||||
;;--- RAM Disk Section ---
|
||||
;
|
||||
;RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made
|
||||
RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made
|
||||
|
||||
;--- Hard Disk Section ---
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ MORDPB EQU NO ; Include additional Floppy DPB Formats?
|
||||
|
||||
;;--- RAM Disk Section ---
|
||||
;
|
||||
;RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made
|
||||
RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made
|
||||
|
||||
;--- Hard Disk Section ---
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ MORDPB EQU NO ; Include additional Floppy DPB Formats?
|
||||
|
||||
;;--- RAM Disk Section ---
|
||||
;
|
||||
;RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made
|
||||
RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made
|
||||
|
||||
;--- Hard Disk Section ---
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ MORDPB EQU NO ; Include additional Floppy DPB Formats?
|
||||
|
||||
;;--- RAM Disk Section ---
|
||||
;
|
||||
;RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made
|
||||
RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made
|
||||
|
||||
;--- Hard Disk Section ---
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ MORDPB EQU NO ; Include additional Floppy DPB Formats?
|
||||
|
||||
;;--- RAM Disk Section ---
|
||||
;
|
||||
;RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made
|
||||
RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made
|
||||
|
||||
;--- Hard Disk Section ---
|
||||
|
||||
|
||||
@@ -9,10 +9,11 @@
|
||||
; 1.0 - 31 Aug 92 - General Release. HFB
|
||||
; 0.1 - 3 Jan 92 - Initial release. HFB
|
||||
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||
; The Physical Drive Number byte (XDPH+3) is simply an index to the Physical
|
||||
; Drive as specified in the ICFG-xx.Z80 file. Up to three physical drives
|
||||
; may be defined in that section, the first byte of which defines the
|
||||
; Physical/Logical Unit Address (Device & LUN for SCSI, Master/Slave for IDE),
|
||||
; The Logical Drive Number byte (XDPH+3) is simply an index into the
|
||||
; BPBIOS physical drive table as specified in the ICFG-xx.Z80 file.
|
||||
; BPBIOS supports exactly three logical drives which
|
||||
; are defined in that section, the first byte of which defines the
|
||||
; Physical Unit (HBIOS Disk Unit)
|
||||
; and a flag bit to specify whether or not the drive is physically present.
|
||||
; See ICFG-xx.Z80 for a definition of the data.
|
||||
|
||||
@@ -21,7 +22,7 @@
|
||||
|
||||
XDPH90: DEFB TRUE ; Format lock flag (Lock RAM Drive)
|
||||
DEFB FIXDSK ; Disk Drive Type
|
||||
DEFB 2 ; Driver ID = Treat as Hard Drive
|
||||
DEFB 3 ; Driver ID = Treat as Hard Drive
|
||||
DEFB HB_MDRAM ; Physical Drive Number
|
||||
DPH$90: DEFW 0 ; Skew Table pointer
|
||||
DEFW 0,0,0 ; Scratch area
|
||||
@@ -34,7 +35,7 @@ DPH$90: DEFW 0 ; Skew Table pointer
|
||||
|
||||
XDPH91: DEFB TRUE ; Format lock flag (Lock ROM Drive)
|
||||
DEFB FIXDSK ; Disk Drive Type
|
||||
DEFB 2 ; Driver ID = Treat as Hard Drive
|
||||
DEFB 3 ; Driver ID = Treat as Hard Drive
|
||||
DEFB HB_MDROM ; Physical Drive Number
|
||||
DPH$91: DEFW 0 ; Skew Table pointer
|
||||
DEFW 0,0,0 ; Scratch area
|
||||
@@ -48,7 +49,7 @@ DPH$91: DEFW 0 ; Skew Table pointer
|
||||
XDPH50: DEFB TRUE ; Format lock flag (Lock First Hard Drive)
|
||||
DEFB FIXDSK ; Disk drive type
|
||||
DEFB 2 ; Driver ID - 2=hard drive
|
||||
DEFB HB_HDDEV0 ; Physical drive [0..6] for this Partition
|
||||
DEFB 0 ; Logical drive [0..2] for this Partition
|
||||
DPH$50: DEFW 0 ; Skew table pointer
|
||||
DEFW 0,0,0 ; Scratch area
|
||||
DEFW DIRBUF ; Directory buffer pointer
|
||||
@@ -61,7 +62,7 @@ DPH$50: DEFW 0 ; Skew table pointer
|
||||
XDPH51: DEFB TRUE ; --- Second Hard Drive/Partition
|
||||
DEFB FIXDSK ; Disk drive type
|
||||
DEFB 2 ; Driver ID - 2=hard drive
|
||||
DEFB HB_HDDEV0 ; Physical drive [0..6] for this Partition
|
||||
DEFB 0 ; Logical drive [0..2] for this Partition
|
||||
DPH$51: DEFW 0
|
||||
DEFW 0,0,0
|
||||
DEFW DIRBUF
|
||||
@@ -74,7 +75,7 @@ DPH$51: DEFW 0
|
||||
XDPH52: DEFB TRUE ; --- Third Hard Drive/Partition
|
||||
DEFB FIXDSK ; Disk drive type
|
||||
DEFB 2 ; Driver ID - 2=hard drive
|
||||
DEFB HB_HDDEV0 ; Physical drive [0..2] for this Partition
|
||||
DEFB 0 ; Physical drive [0..2] for this Partition
|
||||
DPH$52: DEFW 0
|
||||
DEFW 0,0,0
|
||||
DEFW DIRBUF
|
||||
@@ -87,7 +88,7 @@ DPH$52: DEFW 0
|
||||
XDPH53: DEFB TRUE ; --- Fourth Hard Drive/Partition
|
||||
DEFB FIXDSK ; Disk drive type
|
||||
DEFB 2 ; Driver ID - 2=hard drive
|
||||
DEFB HB_HDDEV0 ; Physical drive [0..6] for this Partition
|
||||
DEFB 0 ; Logical drive [0..2] for this Partition
|
||||
DPH$53: DEFW 0
|
||||
DEFW 0,0,0
|
||||
DEFW DIRBUF
|
||||
@@ -100,7 +101,7 @@ DPH$53: DEFW 0
|
||||
XDPH54: DEFB TRUE ; --- Fifth Hard Drive/Partition
|
||||
DEFB FIXDSK ; Disk drive type
|
||||
DEFB 2 ; Driver ID - 2=hard drive
|
||||
DEFB HB_HDDEV0 ; Physical drive [0..6] for this Partition
|
||||
DEFB 0 ; Logical drive [0..2] for this Partition
|
||||
DPH$54: DEFW 0
|
||||
DEFW 0,0,0
|
||||
DEFW DIRBUF
|
||||
@@ -113,7 +114,7 @@ DPH$54: DEFW 0
|
||||
XDPH55: DEFB TRUE ; --- Sixth Hard Drive/Partition
|
||||
DEFB FIXDSK ; Disk drive type
|
||||
DEFB 2 ; Driver ID - 2=hard drive
|
||||
DEFB HB_HDDEV0 ; Physical drive [0..6] for this Partition
|
||||
DEFB 0 ; Logical drive [0..2] for this Partition
|
||||
DPH$55: DEFW 0
|
||||
DEFW 0,0,0
|
||||
DEFW DIRBUF
|
||||
@@ -126,7 +127,7 @@ DPH$55: DEFW 0
|
||||
XDPH56: DEFB TRUE ; --- Seventh Hard Drive/Partition
|
||||
DEFB FIXDSK ; Disk drive type
|
||||
DEFB 2 ; Driver ID - 2=hard drive
|
||||
DEFB HB_HDDEV0 ; Physical drive [0..6] for this Partition
|
||||
DEFB 0 ; Logical drive [0..2] for this Partition
|
||||
DPH$56: DEFW 0
|
||||
DEFW 0,0,0
|
||||
DEFW DIRBUF
|
||||
@@ -139,7 +140,7 @@ DPH$56: DEFW 0
|
||||
XDPH57: DEFB TRUE ; --- Eighth Hard Drive/Partition
|
||||
DEFB FIXDSK ; Disk drive type
|
||||
DEFB 2 ; Driver ID - 2=hard drive
|
||||
DEFB HB_HDDEV0 ; Physical drive [0..6] for this Partition
|
||||
DEFB 0 ; Logical drive [0..2] for this Partition
|
||||
DPH$57: DEFW 0
|
||||
DEFW 0,0,0
|
||||
DEFW DIRBUF
|
||||
@@ -152,7 +153,7 @@ DPH$57: DEFW 0
|
||||
XDPH58: DEFB TRUE ; --- Ninth Hard Drive/Partition
|
||||
DEFB FIXDSK ; Disk drive type
|
||||
DEFB 2 ; Driver ID - 2=hard drive
|
||||
DEFB HB_HDDEV1 ; Physical drive [0..6] for this Partition
|
||||
DEFB 1 ; Logical drive [0..2] for this Partition
|
||||
DPH$58: DEFW 0
|
||||
DEFW 0,0,0
|
||||
DEFW DIRBUF
|
||||
@@ -165,7 +166,7 @@ DPH$58: DEFW 0
|
||||
XDPH59: DEFB TRUE ; --- Tenth Hard Drive/Partition
|
||||
DEFB FIXDSK ; Disk drive type
|
||||
DEFB 2 ; Driver ID - 2=hard drive
|
||||
DEFB HB_HDDEV1 ; Physical drive [0..6] for this Partition
|
||||
DEFB 1 ; Logical drive [0..2] for this Partition
|
||||
DPH$59: DEFW 0
|
||||
DEFW 0,0,0
|
||||
DEFW DIRBUF
|
||||
@@ -178,7 +179,7 @@ DPH$59: DEFW 0
|
||||
XDPH60: DEFB TRUE ; --- Eleventh Hard Drive/Partition
|
||||
DEFB FIXDSK ; Disk drive type
|
||||
DEFB 2 ; Driver ID - 2=hard drive
|
||||
DEFB HB_HDDEV1 ; Physical drive [0..6] for this Partition
|
||||
DEFB 1 ; Logical drive [0..2] for this Partition
|
||||
DPH$60: DEFW 0
|
||||
DEFW 0,0,0
|
||||
DEFW DIRBUF
|
||||
@@ -191,7 +192,7 @@ DPH$60: DEFW 0
|
||||
XDPH61: DEFB TRUE ; --- Twelveth Hard Drive/Partition
|
||||
DEFB FIXDSK ; Disk drive type
|
||||
DEFB 2 ; Driver ID - 2=hard drive
|
||||
DEFB HB_HDDEV1 ; Physical drive [0..6] for this Partition
|
||||
DEFB 1 ; Logical drive [0..2] for this Partition
|
||||
DPH$61: DEFW 0
|
||||
DEFW 0,0,0
|
||||
DEFW DIRBUF
|
||||
|
||||
@@ -104,15 +104,69 @@ SELHD: ; SET DEVICE
|
||||
; Writes from HSTBUF using HSTTRK and HSTSEC to build Block Number.
|
||||
; NOTE: This routine uses physical drive characteristics from ICFG-xx.
|
||||
|
||||
HDWRIT:
|
||||
HDWRIT:
|
||||
; CALL PRTSTRD
|
||||
; DEFB '[HD WRITE]$'
|
||||
|
||||
XOR A
|
||||
LD (HSTWRT),A ; Show no active writes pending
|
||||
JP HDSK_WRITE ; ..continue
|
||||
|
||||
LD B,HB_DIOWRITE ; HBIOS WRITE
|
||||
JR HDIO ; ..continue
|
||||
|
||||
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||
; Read from Hard Disk Drive < Internal BIOS Routine >
|
||||
; Reads to HSTBUF using HSTTRK and HSTSEC to build Block Number.
|
||||
|
||||
HDREAD:
|
||||
; CALL PRTSTRD ; DEBUG
|
||||
; DEFB '[HD READ]$' ; DEBUG
|
||||
|
||||
LD B,HB_DIOREAD ; HBIOS READ
|
||||
JR HDIO ; ..continue
|
||||
|
||||
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||
; Common read/write code for hard disk
|
||||
|
||||
HDIO:
|
||||
LD HL,(HSTDPH) ; GET ACTIVE DPH POINTER
|
||||
DEC HL ; ADJUST TO POINT TO BPBIOS LOGICAL UNIT NUMBER
|
||||
LD A,(HL) ; LOAD IT IN A
|
||||
;
|
||||
; Convert logical -> physical
|
||||
; Code below is ugly brute force approach, but since there are
|
||||
; always exactly 3 logical drives in BPBIOS and the first one
|
||||
; is the most commonly used, this turns out to be reasonably
|
||||
; efficient.
|
||||
LD HL,HDRV0 ; PERHAPS HDRV0
|
||||
OR A ; A == 0?
|
||||
JR Z,HDSK_HDIO1 ; HANDLE IF SO
|
||||
LD HL,HDRV1 ; PERHAPS HDRV1
|
||||
DEC A ; A == 1?
|
||||
JR Z,HDSK_HDIO1 ; HANDLE IF SO
|
||||
LD HL,HDRV2 ; PERHAPS HDRV2
|
||||
DEC A ; A == 2?
|
||||
JR Z,HDSK_HDIO1 ; HANDLE IF SO
|
||||
CALL PANIC ; INVALID LOGICAL UNIT NUMBER
|
||||
HDSK_HDIO1:
|
||||
LD A,(HL) ; LOAD PHYS UNIT NUM (HBIOS DISK UNIT)
|
||||
AND 0FH ; REMOVE EXTRANEOUS BITS
|
||||
LD C,A ; PUT IN C FOR BELOW
|
||||
JR HB_DSKIO
|
||||
|
||||
IF BANKED
|
||||
COMMON /BANK2/
|
||||
ELSE
|
||||
CSEG
|
||||
ENDIF
|
||||
;
|
||||
;==================================================================================================
|
||||
; HBIOS Disk Driver Interface
|
||||
;==================================================================================================
|
||||
;
|
||||
; Enter with B=HBIOS disk function code (read/write)
|
||||
; C=HBIOS disk unit number
|
||||
;
|
||||
; NOTE: This routine uses physical drive characteristics from ICFG-xx.
|
||||
; The routine computes a sequential block number with the algorithm;
|
||||
; Trk * 16 + Sector, HBIOS uses LBA addressing for hard drive like
|
||||
@@ -127,43 +181,8 @@ HDWRIT:
|
||||
; Sector := (Block# MOD hdSPT)+1 (* Quotient1 := Block# DIV hdSPT *)
|
||||
; Head := Quotient1 MOD hdHds (* Quotient2 := Quotient1 DIV hdHds *)
|
||||
; Track := Quotient2
|
||||
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||
|
||||
HDREAD:
|
||||
JP HDSK_READ
|
||||
|
||||
IF BANKED
|
||||
COMMON /BANK2/
|
||||
ELSE
|
||||
CSEG
|
||||
ENDIF
|
||||
;
|
||||
;==================================================================================================
|
||||
; HBIOS Disk Driver Interface
|
||||
;==================================================================================================
|
||||
;
|
||||
; HBIOS disk commands
|
||||
;
|
||||
HB_DSKRD EQU 13H
|
||||
HB_DSKWR EQU 14H
|
||||
;
|
||||
HDSK_READ:
|
||||
; CALL PRTSTRD ; DEBUG
|
||||
; DEFB '[HDSK READ]$' ; DEBUG
|
||||
|
||||
LD B,HB_DSKRD ; HBIOS DISK READ (13H)
|
||||
JR HDSK_RW
|
||||
;
|
||||
HDSK_WRITE:
|
||||
; CALL PRTSTRD
|
||||
; DEFB '[HDSK WRITE]$'
|
||||
|
||||
LD B,HB_DSKWR ; HBIOS DISK WRITE (14H)
|
||||
;
|
||||
HDSK_RW:
|
||||
LD HL,(HSTDPH) ; GET ACTIVE DPH POINTER
|
||||
DEC HL ; ADJUST TO POINT TO UNIT NUMBER
|
||||
LD C,(HL) ; LOAD IT IN C FOR HBIOS CALL LATER
|
||||
HB_DSKIO:
|
||||
PUSH BC ; SAVE FUNCTION AND DEVICE FOR LATER
|
||||
LD HL,(HSTTRK) ; GET TRACK VALUE
|
||||
LD A,L ; LSB OF TRACK TO A
|
||||
@@ -172,10 +191,10 @@ HDSK_RW:
|
||||
LD A,(HSTSEC) ; GET SECTOR
|
||||
LD E,A ; STUFF IT IN E
|
||||
LD B,4 ; PREPARE TO SHIFT OUT 4 BIT HEAD VALUE
|
||||
HDSK_RW1:
|
||||
HB_DSKIO1:
|
||||
SRL H ; SHIFT ONE BIT OUT
|
||||
RR L ; ... OF HL
|
||||
DJNZ HDSK_RW1 ; DO ALL 4 BITS
|
||||
DJNZ HB_DSKIO1 ; DO ALL 4 BITS
|
||||
POP BC ; RECOVER FUNCTION AND DEVICE
|
||||
PUSH BC ; SAVE INCOMING FUNCTION, DEVICE/UNIT
|
||||
LD B,12H ; SETUP FOR NEW SEEK CALL
|
||||
@@ -192,17 +211,3 @@ HDSK_RW1:
|
||||
|
||||
OR 0FFH ; A=$FF TO SIGNAL ERROR
|
||||
RET ; AND DONE W/ ERROR
|
||||
;
|
||||
;==================================================================================================
|
||||
; HDSK DISK DRIVER - DATA
|
||||
;==================================================================================================
|
||||
;
|
||||
IF BANKED
|
||||
COMMON /B2RAM/
|
||||
ELSE
|
||||
DSEG
|
||||
ENDIF
|
||||
|
||||
HDSK_PDN DEFS 1 ; PHYSICAL DEVICE
|
||||
|
||||
|
||||
@@ -27,6 +27,11 @@ HBX_SRCBNK EQU 0FFE4H
|
||||
HBX_DSTADR EQU 0FFE5H
|
||||
HBX_DSTBNK EQU 0FFE7H
|
||||
HBX_CPYLEN EQU 0FFE8H
|
||||
;
|
||||
; HBIOS disk commands
|
||||
;
|
||||
HB_DIOREAD EQU 13H
|
||||
HB_DIOWRITE EQU 14H
|
||||
|
||||
CSEG
|
||||
|
||||
|
||||
@@ -11,9 +11,8 @@
|
||||
COMMON /BANK2/
|
||||
ENDIF
|
||||
|
||||
; This module creates a RAM Drive using the available memory (if available)
|
||||
; above the TPA and possible System banks. For a banked system, the minimum
|
||||
; needed is a 64k Main TPA and a 32k System Bank.
|
||||
; This module implements the HBIOS RAM disk driver by using the
|
||||
; RomWBW disk interface.
|
||||
|
||||
;.....
|
||||
; Select the RAM Drive. This routine performs any setup required in a select.
|
||||
@@ -22,70 +21,28 @@ SELRAM: JP SETPARMS ; No action locally.
|
||||
|
||||
;.....
|
||||
; Read a 128-byte logical sector from the RAM Drive to main memory.
|
||||
; This routine uses the HSTxxx values from the base BIOS routines.
|
||||
|
||||
RAMRD: OR 0FFH ; Set Read flag (non-0)
|
||||
JR RamRW ; ..go to common code
|
||||
RAMRD:
|
||||
LD B,HB_DIOREAD ; HBIOS READ
|
||||
JR RAMIO ; READ/WRITE COMMON CODE
|
||||
|
||||
;.....
|
||||
; Write a 128-byte logical sector from main memory to the RAM Drive.
|
||||
; This routine uses the HSTxxx values from the base BIOS routines.
|
||||
|
||||
RAMWR: XOR A ; Set Write flag with 0, Read w/AFH
|
||||
RAMWR:
|
||||
XOR A ; Set Write flag with 0, Read w/AFH
|
||||
LD (HSTWRT),A ; clear pending write flag
|
||||
;..fall thru to common code..
|
||||
;
|
||||
LD B,HB_DIOWRITE ; HBIOS WRITE
|
||||
JR RAMIO ; READ/WRITE COMMON CODE
|
||||
|
||||
; The following performs calculations for the proper address and bank, sets
|
||||
; the DMA block and executes the Move to/from the Host Buffer.
|
||||
|
||||
RamRW:
|
||||
PUSH AF ; Save R/W flag for later
|
||||
; BUILD TOTAL BYTE OFFSET INTO A:HL
|
||||
XOR A,A ; A STARTS OUT ZERO
|
||||
LD HL,(HSTTRK) ; HL STARTS WITH TRACK NUM
|
||||
LD H,0 ; ONLY LSB IS NEEDED (INIRAMD PASSES INVALID MSB)
|
||||
LD B,5 ; MULT BY 32 SECTORS PER TRACK
|
||||
RAMWR1:
|
||||
ADD HL,HL ; DOUBLE VALUE
|
||||
ADC A,A ; ... INCLUDING A WITH CARRY
|
||||
DJNZ RAMWR1 ; LOOP 5 TIMES FOR MULT BY 32
|
||||
LD DE,(HSTSEC) ; SECTOR VALUE TO 3 (ONE BYTE)
|
||||
LD D,0 ; CLEAR MSB SINCE HSTSEC IS JUST ONE BYTE
|
||||
ADD HL,DE ; ADD TO WORKING VALUE
|
||||
ADC A,0 ; HANDLE POSSIBLE CARRY
|
||||
LD B,7 ; MULT BY 128 BYTES PER SECTOR
|
||||
RAMWR2:
|
||||
ADD HL,HL ; DOUBLE VALUE
|
||||
ADC A,A ; ... INCLUDING A WITH CARRY
|
||||
DJNZ RAMWR2 ; LOOP 7 TIME FOR MULT BY 128
|
||||
; CONVERT BYTE OFFSET IN A:HL TO BANK(A):OFFSET(HL)
|
||||
SLA H ; ROTATE HIGH BIT OF H INTO CF
|
||||
RL A ; ROTATE CF INTO LOW BIT OF A
|
||||
SRL H ; FIX H (ROTATE BACK W/ ZERO INTO HIGH BIT)
|
||||
; ADJUST FOR STARTING RAM BANK
|
||||
LD C,A ; BANK TO C
|
||||
LD A,(RAMBNK) ; GET STARTING RAM BANK NUM
|
||||
ADD A,C ; COMBINE TO GET ACTUAL SOURCE BANK NUM
|
||||
; SETUP FOR INTERBANK COPY
|
||||
LD C,A ; SOURCE BANK TO C
|
||||
LD B,BID_HB ; DEST BANK TO B (HSTBUF IN HBIOS)
|
||||
;LD A,(HB_BNKBIOS) ; DEST BANK (HSTBUF IN HBIOS)
|
||||
;LD B,A ; PUT IN B
|
||||
LD DE,(HB_DSKBUF) ; DEST ADDRESS TO DE; HL ALREADY HAS SOURCE ADDRESS
|
||||
; REVERSE VALUES IF WRITE
|
||||
POP AF ; Read or Write?
|
||||
JR NZ,RAMWR3 ; ..jump if Read
|
||||
EX DE,HL ; Else swap things around
|
||||
LD A,C
|
||||
LD C,B
|
||||
LD B,A
|
||||
RAMWR3:
|
||||
; PERFORM THE COPY
|
||||
CALL XMOVE ; SET BANKS FOR COPY
|
||||
LD BC,128 ; SET LENGTH OF COPY (ONE SECTOR)
|
||||
CALL MOVE ; DO THE COPY
|
||||
; CLEAN UP AND RETURN
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND RETURN
|
||||
;.....
|
||||
; Common code to setup RomWBW disk access
|
||||
;
|
||||
RAMIO:
|
||||
LD HL,(HSTDPH) ; GET ACTIVE DPH PTR
|
||||
DEC HL ; ADJUST TO POINT TO BPBIOS LOGICAL UNIT
|
||||
LD C,(HL) ; USE AS HBIOS DISK UNIT NUMBER
|
||||
JP HB_DSKIO ; DO THE REST IN HARD DISK DRIVER
|
||||
|
||||
;================== End of RAM Disk Code ====================
|
||||
|
||||
@@ -27,7 +27,11 @@ HB_IODEV EQU 80H ; 0x80 is current HBIOS console
|
||||
HB_MDRAM EQU 0 ; HBIOS Disk Unit #0 is usually the RAM Disk
|
||||
HB_MDROM EQU 1 ; HBIOS Disk Unit #1 is usually the ROM Disk
|
||||
;
|
||||
; Set HB_HDDEVN to appropriate HBIOS disk device numbers
|
||||
; Map BPBIOS logical drive numbers (0-2) to HBIOS physical disk units
|
||||
; HB_HDDEVn values map to HDRVn (see icfg-ww).
|
||||
;
|
||||
; The values below will be the default mapping. They can be changed
|
||||
; using BPCNFG *Physical Drive* configuration.
|
||||
;
|
||||
; If the RomWBW system has no floppy drives, then the hard disk units
|
||||
; will start right after the memory disk units. So, the first hard disk
|
||||
|
||||
@@ -115,17 +115,17 @@ DVRVCT: DEFW SELERR ; Driver 0 Select
|
||||
DEFW HDREAD ; Driver 2 Read
|
||||
DEFW HDWRIT ; Driver 2 Write
|
||||
ENDIF ; harddsk
|
||||
; IF [RAMDSK AND NOT HARDDSK]
|
||||
; DEFW SELERR ; Driver 2 Select (Dummy if No Hard Drive)
|
||||
; DEFW ISTRUE ; Driver 2 Read
|
||||
; DEFW ISTRUE ; Driver 2 Write
|
||||
; ENDIF ;ramdsk & not harddsk
|
||||
IF [RAMDSK AND NOT HARDDSK]
|
||||
DEFW SELERR ; Driver 2 Select (Dummy if No Hard Drive)
|
||||
DEFW ISTRUE ; Driver 2 Read
|
||||
DEFW ISTRUE ; Driver 2 Write
|
||||
ENDIF ;ramdsk & not harddsk
|
||||
|
||||
; IF RAMDSK
|
||||
; DEFW SELHD ; Driver 3 Select (RAM Drive)
|
||||
; DEFW HDREAD ; Driver 3 Read
|
||||
; DEFW HDWRIT ; Driver 3 Write
|
||||
; ENDIF ;ramdsk
|
||||
IF RAMDSK
|
||||
DEFW SELRAM ; Driver 3 Select (RAM Drive)
|
||||
DEFW RAMRD ; Driver 3 Read
|
||||
DEFW RAMWR ; Driver 3 Write
|
||||
ENDIF ;ramdsk
|
||||
|
||||
SELERR: LD HL,0 ; Send null DPH pointer back to caller
|
||||
RET
|
||||
|
||||
@@ -882,12 +882,12 @@ table which will be recognized by the application to find the FAT
|
||||
filesystem.
|
||||
|
||||
Although RomWBW-style CP/M media does not know anything about
|
||||
partition tables, it is entirely possible to have media that has both
|
||||
CP/M and FAT file systems on it. This is accomplished by creating a
|
||||
FAT filesystem on the media that starts on a track beyond the last
|
||||
track used by CP/M. Each CP/M slice on a media will occupy 8,320K
|
||||
(16,640 sectors). So, make sure to start your FAT partition beyond (<
|
||||
slice count> * 8,320K) or (<slice count * 16,640 sectors).
|
||||
partition tables, it is entirely possible to have media that
|
||||
has both CP/M and FAT file systems on it. This is accomplished
|
||||
by creating a FAT filesystem on the media that starts on a track
|
||||
beyond the last track used by CP/M. Each CP/M slice can occupy
|
||||
up to 8MB. So, make sure to start your FAT partition beyond
|
||||
(slice count) * 9MB.
|
||||
|
||||
The application infers whether you are attempting to reference a FAT
|
||||
or CP/M filesystem via the drive specifier (char before ':'). A
|
||||
@@ -899,8 +899,7 @@ assumed. For example:
|
||||
|
||||
| `2:README.TXT` refers to FAT file "README.TXT" on disk unit #2
|
||||
| `C:README.TXT` refers to CP/M file "README.TXT" on CP/M drive C
|
||||
| `README.TXT` refers to CP/M file "README.TXT" on the current CP/M
|
||||
drive
|
||||
| `README.TXT` refers to CP/M file "README.TXT" on the current CP/M drive
|
||||
|
||||
Files with SYS, HIDDEN, or R/O only attributes are not given any
|
||||
special treatment. Such files are found and processed like any other
|
||||
@@ -915,6 +914,8 @@ copy the file to the desired user area.
|
||||
Accessing FAT filesystems on a floppy requires the use of RomWBW HBIOS
|
||||
v2.9.1-pre.13 or greater.
|
||||
|
||||
Only the first 8 RomWBW disk units (0-7) can be referenced.
|
||||
|
||||
Files written are not verified.
|
||||
|
||||
Wildcard matching in FAT filesystems is a bit unusual as implemented by
|
||||
@@ -935,7 +936,7 @@ characters. The FAT application will block any attempt to create a
|
||||
file on the CP/M filesystem containing any of these prohibited
|
||||
characters:
|
||||
|
||||
| `< > . , ; : = ? * [ ] _ % | ( ) / \`
|
||||
| `< > . , ; : ? * [ ] |/ \`
|
||||
|
||||
The operation will be aborted with "`Error: Invalid Path Name`" if such
|
||||
a filename character is encountered.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
$define{doc_ver}{Version 3.4}$
|
||||
$define{doc_ver}{Version 3.5}$
|
||||
$define{doc_product}{RomWBW}$
|
||||
$define{doc_root}{https://github.com/wwarthen/RomWBW/raw/dev/Doc}$
|
||||
$ifndef{doc_title}$ $define{doc_title}{Document Title}$ $endif$
|
||||
|
||||
@@ -187,6 +187,33 @@ please let me know if I missed you!
|
||||
BASIC Compiler, Microsoft Fortran Compiler, and a Games
|
||||
compendium.
|
||||
|
||||
* Martin R has provided substantial help reviewing and improving the
|
||||
User Guide.
|
||||
|
||||
* Jacques Pelletier has contributed the DS1501 RTC driver code.
|
||||
|
||||
* Jose Collado has contributed enhancements to the TMS driver
|
||||
including compatibility with standard TMS register configuration.
|
||||
|
||||
* Kevin Boone has contributed a generic HBIOS date/time utility (WDATE).
|
||||
|
||||
* Matt Carroll has contributed a fix to XM.COM that corrects the
|
||||
port specification when doing a send.
|
||||
|
||||
* Dean Jenkins enhanced the build process to accommodate the
|
||||
Raspberry Pi 4.
|
||||
|
||||
* Tom Plano has contributed a new utility (HTALK) to allow talking
|
||||
directly to HBIOS COM ports.
|
||||
|
||||
* Lars Nelson has contributed several generic utilities such as
|
||||
a universal (OS agnostic) UNARC application.
|
||||
|
||||
* Dylan Hall added support for specifying a secondary console.
|
||||
|
||||
* Bill Shen has contributed boot loaders for several of his
|
||||
systems.
|
||||
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
# Licensing
|
||||
|
||||
@@ -1460,14 +1460,17 @@ standard HBIOS result code.
|
||||
|----------------------------------------|----------------------------------------|
|
||||
| B: 0x47 | A: Status |
|
||||
| C: Video Unit | |
|
||||
| D: Scope | |
|
||||
| E: Color | |
|
||||
|
||||
Assign the specified Color (E) code to be used for all subsequent
|
||||
character writes/fills. This color is also used to fill new lines
|
||||
generated by scroll operations. Refer to the color code table above for
|
||||
a list of the available color codes. Note that a given video display may
|
||||
or may not support any/all colors. The Status (A) is a standard HBIOS
|
||||
result code.
|
||||
Assign the specified Color (E) code for character foreground/background.
|
||||
If Scope (D) is 0, the specified color will be used for all
|
||||
subsequent character writes/fills. This color is also used to fill new
|
||||
lines generated by scroll operations. If Scope (D) is 1, then the
|
||||
specified foreground/background color will be applied immediately to the
|
||||
entire screen. Refer to the color code table above for a list of the
|
||||
available color codes. Note that a given video display may or may not
|
||||
support any/all colors. The Status (A) is a standard HBIOS result code.
|
||||
|
||||
### Function 0x48 -- Video Write Character (VDAWRC)
|
||||
|
||||
|
||||
@@ -1749,10 +1749,84 @@ with 6 slices containing 5 ready-to-run OSes and a slice with
|
||||
the WordStar application files. Alternatively, you can create your own
|
||||
hard disk image with the specific slice contents you choose.
|
||||
|
||||
#### Standard Hard Disk Physical Layout
|
||||
|
||||
As previously described in [Hard Disk Layouts], the exact placement of
|
||||
slices and optional FAT partition will vary depending on which disk
|
||||
layout (hd512 or hd1k) you are using and your partition table entries.
|
||||
To simplify the use of hard disk images, RomWBW has adopted standard
|
||||
partition table entries for disk image files provided.
|
||||
|
||||
These partition sizes and locations were chosen to:
|
||||
|
||||
- Fit entirely on 1GB media
|
||||
- Allow for 64 CP/M filesystem slices
|
||||
- Allow for a 384KB FAT filesystem
|
||||
|
||||
**NOTE:** RomWBW is not limited to these partition table entries. You
|
||||
can change the size and location of the RomWBW and/or FAT partitions to
|
||||
increase/decrease the number of slices or FAT filesystem size.
|
||||
|
||||
+---------------------------------+-------------------------------+-------------------------------+
|
||||
| | **--- Legacy (hd512) ---** | **--- Modern (hd1k) ---** |
|
||||
| +---------------+---------------+---------------+---------------+
|
||||
| | Byte(s) | Sector(s) | Byte(s) | Sector(s) |
|
||||
+=================================+==============:+==============:+==============:+==============:+
|
||||
| RomWBW (slices) Start | 0 | 0 | 1,048,576 | 2,048 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| RomWBW (slices) Size | 545,259,520 | 1,064,960 | 536,870,912 | 1,048,576 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| FAT Filesystem Start | 545,259,520 | 1,064,960 | 537,919,488 | 1,050,624 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| FAT Filesystem Size | 402,653,184 | 786,432 | 402,653,184 | 786,432 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| \<end\> | 947,912,704 | 1,851,392 | 940,572,672 | 1,837,056 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
|
||||
The above partition table entries will result in the following locations and sizes of
|
||||
filesystems on the RomWBW disk images.
|
||||
|
||||
|
||||
+---------------------------------+-------------------------------+-------------------------------+
|
||||
| | **--- Legacy (hd512) ---** | **--- Modern (hd1k) ---** |
|
||||
| +---------------+---------------+---------------+---------------+
|
||||
| | Byte(s) | Sector(s) | Byte(s) | Sector(s) |
|
||||
+=================================+==============:+==============:+==============:+==============:+
|
||||
| Prefix Start | -- | -- | 0 | 0 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| Prefix Size | -- | -- | 1,048,576 | 2,048 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| Slice Size | 8,519,680 | 16,640 | 8,388,608 | 16,384 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| Slice 0 Start | 0 | 0 | 1,048,576 | 2,048 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| Slice 1 Start | 8,519,680 | 16,640 | 9,437,184 | 18,432 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| Slice 2 Start | 17,039,360 | 33,280 | 17,825,792 | 34,816 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| Slice 3 Start | 25,559,040 | 49,920 | 26,214,400 | 51,200 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| Slice 4 Start | 34,078,720 | 66,560 | 34,603,008 | 67,584 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| Slice 5 Start | 42,598,400 | 83,200 | 42,991,616 | 83,968 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| Slice 6 Start | 51,118,080 | 99,840 | 51,380,224 | 100,352 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| Slice 7 Start | 59,637,760 | 116,480 | 59,768,832 | 116,736 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| Slice 63 Start | 536,739,840 | 1,048,320 | 529,530,880 | 1,034,240 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| FAT Filesystem Start | 545,259,520 | 1,064,960 | 537,919,488 | 1,050,624 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| FAT Filesystem Size | 402,653,184 | 786,432 | 402,653,184 | 786,432 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
| \<end\> | 947,912,704 | 1,851,392 | 940,572,672 | 1,837,056 |
|
||||
+---------------------------------+---------------+---------------+---------------+---------------+
|
||||
|
||||
#### Combo Hard Disk Image
|
||||
|
||||
The combo disk image is essentially just a single image that has several
|
||||
of the individual filesystem images (slices) already concatenated
|
||||
of the individual filesystem images (slices) already concatenated
|
||||
together. The combo disk image contains the following 6 slices in the
|
||||
positions indicated:
|
||||
|
||||
@@ -2640,6 +2714,7 @@ therefore, globally available.
|
||||
| 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. |
|
||||
| FAT | Access MS-DOS FAT filesystems from RomWBW (based on FatFs). |
|
||||
| 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. |
|
||||
@@ -2647,12 +2722,12 @@ therefore, globally available.
|
||||
|
||||
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
|
||||
directory of the distribution.
|
||||
directory of the distribution. They are also included on the
|
||||
floppy disk and hard disk images.
|
||||
|
||||
| **Application** | **Description** |
|
||||
|-----------------|--------------------------------------------------------------------|
|
||||
| TUNE | Play .PT2, .PT3, .MYM audio files. |
|
||||
| FAT | Access MS-DOS FAT filesystems from RomWBW (based on FatFs). |
|
||||
| INTTEST | Test interrupt vector hooking. |
|
||||
|
||||
# FAT Filesystem
|
||||
@@ -3624,8 +3699,8 @@ update your ROM. The following is a typical example of transferring
|
||||
ROM image using XModem and flashing the chip in-situ.
|
||||
|
||||
**NOTE**: The FLASH utility **can not** determine the type of your
|
||||
ROM chip if it is write protected. Additionally, it has not way to
|
||||
even determine if it is write protected. If the FLASH utility
|
||||
ROM chip if it is write protected. Additionally, it has no way to
|
||||
determine if it is write protected. If the FLASH utility
|
||||
indicates it does not recognize your ROM chip, check to ensure the
|
||||
chip is not write protected.
|
||||
|
||||
@@ -3713,6 +3788,7 @@ them over any older versions of the app on your disk:
|
||||
* TALK.COM
|
||||
* RTC.COM
|
||||
* TIMER.COM
|
||||
* FAT.COM
|
||||
|
||||
For example: `B>COPY ASSIGN.COM C:`
|
||||
|
||||
@@ -3722,9 +3798,13 @@ 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
|
||||
|
||||
The files normally contained on the standard ROM Disk is based on a 512K
|
||||
ROM. If your system has a smaller size ROM, then not all of these
|
||||
files will be included on your ROM Disk. You will need to copy them to
|
||||
your system from the /Binary/Apps folder of the RomWBW distribution.
|
||||
|
||||
**WARNING**: If you run a RomWBW-specific application that is not
|
||||
the appropriate for the version of RomWBW you are running, the
|
||||
application will generate an error message and abort.
|
||||
@@ -3889,6 +3969,28 @@ please let me know if I missed you!
|
||||
|
||||
* Jacques Pelletier has contributed the DS1501 RTC driver code.
|
||||
|
||||
* Jose Collado has contributed enhancements to the TMS driver
|
||||
including compatibility with standard TMS register configuration.
|
||||
|
||||
* Kevin Boone has contributed a generic HBIOS date/time utility (WDATE).
|
||||
|
||||
* Matt Carroll has contributed a fix to XM.COM that corrects the
|
||||
port specification when doing a send.
|
||||
|
||||
* Dean Jenkins enhanced the build process to accommodate the
|
||||
Raspberry Pi 4.
|
||||
|
||||
* Tom Plano has contributed a new utility (HTALK) to allow talking
|
||||
directly to HBIOS COM ports.
|
||||
|
||||
* Lars Nelson has contributed several generic utilities such as
|
||||
a universal (OS agnostic) UNARC application.
|
||||
|
||||
* Dylan Hall added support for specifying a secondary console.
|
||||
|
||||
* Bill Shen has contributed boot loaders for several of his
|
||||
systems.
|
||||
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
# Licensing
|
||||
|
||||
@@ -139,7 +139,7 @@ if %ROMSize% gtr 0 (
|
||||
copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin %ROMName%.upd || exit /b
|
||||
copy /b hbios_app.bin + osimg_small.bin %ROMName%.com || exit /b
|
||||
) else (
|
||||
copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin + ..\RomDsk\ram%ROMSize%_wbw.dat %ROMName%.rom || exit /b
|
||||
copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin + ..\RomDsk\ram%RAMSize%_wbw.dat %ROMName%.rom || exit /b
|
||||
copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin %ROMName%.upd || exit /b
|
||||
copy /b hbios_app.bin + osimg_small.bin %ROMName%.com || exit /b
|
||||
)
|
||||
|
||||
@@ -6,6 +6,7 @@ set -e
|
||||
export ROM_PLATFORM
|
||||
export ROM_CONFIG
|
||||
export ROMSIZE
|
||||
export RAMSIZE
|
||||
export CPUFAM
|
||||
|
||||
if [ "${ROM_PLATFORM}" == "dist" ] ; then
|
||||
@@ -114,4 +115,4 @@ fi
|
||||
|
||||
#echo OBJECTS=${OBJECTS}
|
||||
|
||||
make ROM_PLATFORM=${ROM_PLATFORM} ROM_CONFIG=${ROM_CONFIG} ROMSIZE=${ROMSIZE}
|
||||
make ROM_PLATFORM=${ROM_PLATFORM} ROM_CONFIG=${ROM_CONFIG} ROMSIZE=${ROMSIZE} RAMSIZE=${RAMSIZE}
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
;
|
||||
#include "cfg_rcz280.asm"
|
||||
;
|
||||
CPUOSC .SET 12000000 ; CPU OSC FREQ IN MHZ
|
||||
CPUOSC .SET 24000000 ; CPU OSC FREQ IN MHZ
|
||||
INTMODE .SET 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
|
||||
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
|
||||
;
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
;
|
||||
#include "cfg_rcz280.asm"
|
||||
;
|
||||
CPUOSC .SET 12000000 ; CPU OSC FREQ IN MHZ
|
||||
CPUOSC .SET 24000000 ; CPU OSC FREQ IN MHZ
|
||||
INTMODE .SET 3 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
|
||||
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
|
||||
;
|
||||
|
||||
@@ -50,7 +50,7 @@ MDROM .SET TRUE ; MD: ENABLE ROM DISK
|
||||
MDRAM .SET TRUE ; MD: ENABLE RAM DISK
|
||||
;
|
||||
Z2UENABLE .SET TRUE ; Z2U: ENABLE Z280 UART SERIAL DRIVER (Z2U.ASM)
|
||||
Z2UOSC .SET (CPUOSC / 8) ; Z2U: OSC FREQUENCY IN MHZ
|
||||
Z2UOSC .SET (CPUOSC / 16) ; Z2U: OSC FREQUENCY IN MHZ
|
||||
Z2U0HFC .SET TRUE ; Z2U0: ENABLE HARDWARE FLOW CONTROL
|
||||
UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM)
|
||||
ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM)
|
||||
|
||||
@@ -50,7 +50,7 @@ MDROM .SET FALSE ; MD: ENABLE ROM DISK
|
||||
MDRAM .SET TRUE ; MD: ENABLE RAM DISK
|
||||
;
|
||||
Z2UENABLE .SET TRUE ; Z2U: ENABLE Z280 UART SERIAL DRIVER (Z2U.ASM)
|
||||
Z2UOSC .SET (CPUOSC / 8) ; Z2U: OSC FREQUENCY IN MHZ
|
||||
Z2UOSC .SET (CPUOSC / 16) ; Z2U: OSC FREQUENCY IN MHZ
|
||||
Z2U0HFC .SET TRUE ; Z2U0: ENABLE HARDWARE FLOW CONTROL
|
||||
UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM)
|
||||
ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM)
|
||||
|
||||
@@ -34,8 +34,8 @@ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
|
||||
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
;
|
||||
RAMSIZE .SET 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
|
||||
ROMSIZE .SET 256 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
|
||||
RAMSIZE .SET 1536 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
|
||||
ROMSIZE .SET 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
|
||||
MEMMGR .SET MM_ZRC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180]
|
||||
;
|
||||
UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM)
|
||||
|
||||
@@ -53,6 +53,7 @@ ROMNAME=${ROM_PLATFORM}_${ROM_CONFIG}
|
||||
# $(info ROM_PLATFORM=$(ROM_PLATFORM))
|
||||
# $(info ROM_CONFIG=$(ROM_CONFIG))
|
||||
# $(info ROMSIZE=$(ROMSIZE))
|
||||
# $(info RAMSIZE=$(RAMSIZE))
|
||||
# $(info ROMNAME=$(ROMNAME))
|
||||
# $(info CPUFAM=$(CPUFAM))
|
||||
# $(info TASM=$(TASM))
|
||||
@@ -81,7 +82,7 @@ $(OBJECTS) : $(ROMDEPS)
|
||||
cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$(ROMNAME).upd ; \
|
||||
cat hbios_app.bin osimg_small.bin > $(ROMNAME).com ; \
|
||||
else \
|
||||
cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$(ROMNAME).rom ; \
|
||||
cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin ../RomDsk/ram$(RAMSIZE)_wbw.dat >$(ROMNAME).rom ; \
|
||||
cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$(ROMNAME).upd ; \
|
||||
cat hbios_app.bin osimg_small.bin > $(ROMNAME).com ; \
|
||||
fi \
|
||||
|
||||
132
Source/HBIOS/Makefile.new
Normal file
132
Source/HBIOS/Makefile.new
Normal file
@@ -0,0 +1,132 @@
|
||||
DIST_OBJECTS := \
|
||||
DYNO_std MK4_std N8_std RCZ180_ext RCZ180_nat RCZ180_z1rcc \
|
||||
RCZ280_ext RCZ280_nat RCZ280_zz80mb RCZ280_zzrcc RCZ280_zzrcc_ram \
|
||||
RCZ80_std RCZ80_kio RCZ80_easy RCZ80_tiny RCZ80_skz RCZ80_zrc \
|
||||
RCZ80_zrc_ram RCZ80_zrc512 RPH_std SBC_std SBC_simh MBC_std \
|
||||
DUO_std SCZ180_sc126 SCZ180_sc130 SCZ180_sc131 SCZ180_sc140 \
|
||||
SCZ180_sc503 SCZ180_sc700 S100_std UNA_std Z80RETRO_std \
|
||||
ZETA_std ZETA2_std HEATH_std EPITX_std
|
||||
# RCZ80_mt RCZ80_duart MON_std
|
||||
|
||||
OBJECTS := $(DIST_OBJECTS)
|
||||
OBJECTS := SBC_std MK4_std UNA_std S100_std
|
||||
OBJECTS := $(OBJECTS:=.rom) $(OBJECTS:=.com) $(OBJECTS:=.upd)
|
||||
OBJECTS := $(filter-out UNA_%.com UNA_%.upd,$(OBJECTS))
|
||||
|
||||
DEST = ../../Binary
|
||||
TOOLS = ../../Tools
|
||||
OTHERS := *.img *.rom *.com *.upd *.bin *.hex cpm.sys zsys.sys build.inc
|
||||
OTHERS += *.build.inc font*.asm *.dat hbios_env.sh
|
||||
|
||||
FONTS := font8x11c.asm font8x11u.asm font8x16c.asm font8x16u.asm
|
||||
FONTS += font8x8c.asm font8x8u.asm fontcgac.asm fontcgau.asm
|
||||
FONTS += fontvgarcc.asm fontvgarcu.asm
|
||||
|
||||
BUILD_COMPONENT = \
|
||||
cp $(*F).build.inc build.inc ; \
|
||||
$(TASM) $(TASMFLAGS) $< $@ $(@:.bin=.lst) ; \
|
||||
rm build.inc
|
||||
|
||||
SHELL=/bin/bash
|
||||
|
||||
include $(TOOLS)/Makefile.inc
|
||||
|
||||
font%.asm:
|
||||
cp ../Fonts/$@ .
|
||||
|
||||
camel80.bin:
|
||||
cp ../Forth/$@ .
|
||||
|
||||
tastybasic.bin:
|
||||
cp ../TastyBasic/src/$@ .
|
||||
|
||||
s100mon.bin:
|
||||
$(ZXCC) $(CPM)/SLR180 -s100mon/FH
|
||||
$(ZXCC) $(CPM)/MLOAD25 -s100mon.bin=s100mon
|
||||
|
||||
%.build.inc:
|
||||
echo $@
|
||||
echo "; RomWBW Configured for $(*F) at $$(date +%Y-%m-%d)" >>$@
|
||||
echo ";" >>$@
|
||||
echo "#DEFINE TIMESTAMP \"$$(date +%Y-%m-%d)\"" >>$@
|
||||
echo "#DEFINE CONFIG \"$(*F)\"" >>$@
|
||||
echo ";" >>$@
|
||||
echo "#INCLUDE \"Config/$(*F).asm\"" >>$@
|
||||
echo ";" >>$@
|
||||
cat $@
|
||||
|
||||
%.usrrom.bin: usrrom.asm %.build.inc ; $(BUILD_COMPONENT)
|
||||
%.updater.bin: updater.asm %.build.inc ; $(BUILD_COMPONENT)
|
||||
%.eastaegg.bin: eastaegg.asm %.build.inc ; $(BUILD_COMPONENT)
|
||||
%.game.bin: game.asm %.build.inc ; $(BUILD_COMPONENT)
|
||||
%.nascom.bin: nascom.asm %.build.inc ; $(BUILD_COMPONENT)
|
||||
%.romldr.bin: romldr.asm %.build.inc ; $(BUILD_COMPONENT)
|
||||
%.dbgmon.bin: dbgmon.asm %.build.inc ; $(BUILD_COMPONENT)
|
||||
|
||||
%.hbios_env.com: hbios_env.asm %.build.inc
|
||||
cp $(*F).build.inc build.inc
|
||||
$(TASM) $(TASMFLAGS) -dBASH $< $@ $(@:.com=.lst)
|
||||
rm build.inc
|
||||
|
||||
%.hbios_env.sh: %.hbios_env.com
|
||||
$(ZXCC) $< >$@
|
||||
|
||||
%.hbios_rom.bin: hbios.asm %.build.inc %.hbios_env.sh $(FONTS)
|
||||
. ./$(*F).hbios_env.sh ; \
|
||||
TARGETS=("" "z80" "hd64180" "z280") ; \
|
||||
CPU=$${TARGETS[$$CPUFAM]} ; \
|
||||
cp $(*F).build.inc build.inc ; \
|
||||
$(BINDIR)/uz80as -t $$CPU -dROMBOOT $< $@ $(@:.bin=.lst) ; \
|
||||
srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary ; \
|
||||
rm build.inc
|
||||
|
||||
%.hbios_app.bin: hbios.asm %.build.inc %.hbios_env.sh $(FONTS)
|
||||
. ./$(*F).hbios_env.sh ; \
|
||||
TARGETS=("" "z80" "hd64180" "z280") ; \
|
||||
CPU=$${TARGETS[$$CPUFAM]} ; \
|
||||
cp $(*F).build.inc build.inc ; \
|
||||
$(BINDIR)/uz80as -t $$CPU -dAPPBOOT $< $@ $(@:.bin=.lst) ; \
|
||||
rm build.inc
|
||||
|
||||
UNA_%.osimg.bin: UNA_%.romldr.bin UNA_%.dbgmon.bin
|
||||
cat UNA_$(*F).romldr.bin UNA_$(*F).dbgmon.bin ../ZSDOS/zsys_una.bin ../CPM22/cpm_una.bin >$@
|
||||
srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary
|
||||
|
||||
%.osimg.bin: %.romldr.bin %.dbgmon.bin
|
||||
cat $(*F).romldr.bin $(*F).dbgmon.bin ../ZSDOS/zsys_wbw.bin ../CPM22/cpm_wbw.bin >$@
|
||||
srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary
|
||||
|
||||
%.osimg_small.bin: %.romldr.bin %.dbgmon.bin
|
||||
cat $(*F).romldr.bin $(*F).dbgmon.bin ../ZSDOS/zsys_wbw.bin >$@
|
||||
|
||||
%.osimg1.bin: camel80.bin %.nascom.bin tastybasic.bin %.game.bin %.eastaegg.bin netboot.mod %.updater.bin %.usrrom.bin
|
||||
cat camel80.bin $(*F).nascom.bin tastybasic.bin $(*F).game.bin $(*F).eastaegg.bin netboot.mod $(*F).updater.bin $(*F).usrrom.bin >$@
|
||||
srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary
|
||||
|
||||
S100_%.imgpad2.bin: s100mon.bin
|
||||
cp $< $@
|
||||
srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary
|
||||
|
||||
%.imgpad2.bin: imgpad2.asm %.build.inc
|
||||
cp $(*F).build.inc build.inc
|
||||
$(TASM) $(TASMFLAGS) $< $@ $(@:.bin=.lst)
|
||||
srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary
|
||||
rm build.inc
|
||||
|
||||
UNA_%.rom: UNA_%.osimg.bin UNA_%.hbios_env.sh
|
||||
. ./UNA_$(*F).hbios_env.sh ; \
|
||||
cat ../UBIOS/UNA-BIOS.BIN UNA_$(*F).osimg.bin ../UBIOS/FSFAT.BIN ../RomDsk/rom$${ROMSIZE}_una.dat >$@ ; \
|
||||
cp UNA_$(*F).osimg.bin $(DEST)/UNA_WBW_SYS.bin ; \
|
||||
cp ../RomDsk/rom$${ROMSIZE}_una.dat $(DEST)/UNA_WBW_ROM$${ROMSIZE}.bin
|
||||
|
||||
%.rom: %.hbios_rom.bin %.osimg.bin %.osimg1.bin %.imgpad2.bin %.hbios_env.sh
|
||||
. ./$(*F).hbios_env.sh ; \
|
||||
if [ $$ROMSIZE -gt 0 ] ; then RD="rom$$ROMSIZE" ; else RD="ram$$RAMSIZE" ; fi ; \
|
||||
cat $(*F).hbios_rom.bin $(*F).osimg.bin $(*F).osimg1.bin $(*F).imgpad2.bin ../RomDsk/$${RD}_wbw.dat >$@
|
||||
|
||||
%.com: %.hbios_app.bin %.osimg_small.bin
|
||||
cat $(*F).hbios_app.bin $(*F).osimg_small.bin >$@
|
||||
|
||||
%.upd: %.hbios_rom.bin %.osimg.bin %.osimg1.bin %.imgpad2.bin
|
||||
cat $(*F).hbios_rom.bin $(*F).osimg.bin $(*F).osimg1.bin $(*F).imgpad2.bin >$@
|
||||
|
||||
@@ -178,26 +178,13 @@ ACIA1_INT:
|
||||
;
|
||||
ACIA_INTRCV:
|
||||
; CHECK TO SEE IF SOMETHING IS ACTUALLY THERE
|
||||
CALL DELAY
|
||||
LD C,(IY+3) ; CMD/STAT PORT TO C
|
||||
IN A,(C) ; GET STATUS
|
||||
LD B,A
|
||||
AND $01 ; ISOLATE READY BIT
|
||||
JR NZ,ACIA_INTRCV1
|
||||
;
|
||||
#IF FALSE
|
||||
CALL PC_LT
|
||||
LD A,B
|
||||
CALL PRTHEXBYTE
|
||||
INC C
|
||||
IN A,(C)
|
||||
CALL PRTHEXBYTE
|
||||
CALL PC_GT
|
||||
OR $FF
|
||||
#ENDIF
|
||||
;
|
||||
RET
|
||||
|
||||
RRA ; READY BIT TO CF
|
||||
JR C,ACIA_INTRCV1 ; RECEIVE CHAR
|
||||
XOR A ; INT NOT HANDLED, CLEAR ZF
|
||||
RET ; ... AND RETURN
|
||||
|
||||
;
|
||||
ACIA_INTRCV1:
|
||||
; RECEIVE CHARACTER INTO BUFFER
|
||||
@@ -285,9 +272,9 @@ ACIA_IN:
|
||||
ACIA_IN:
|
||||
CALL ACIA_IST ; SEE IF CHAR AVAILABLE
|
||||
JR Z,ACIA_IN ; LOOP UNTIL SO
|
||||
HB_DI ; AVOID COLLISION WITH INT HANDLER
|
||||
LD L,(IY+6) ; SET HL TO
|
||||
LD H,(IY+7) ; ... START OF BUFFER STRUCT
|
||||
HB_DI ; AVOID COLLISION WITH INT HANDLER
|
||||
LD A,(HL) ; GET COUNT
|
||||
DEC A ; DECREMENT COUNT
|
||||
LD (HL),A ; SAVE UPDATED COUNT
|
||||
@@ -322,8 +309,8 @@ ACIA_IN2:
|
||||
LD (HL),E ; SAVE UPDATED TAIL PTR
|
||||
INC HL
|
||||
LD (HL),D
|
||||
LD E,C ; MOVE CHAR TO RETURN TO E
|
||||
HB_EI ; INTERRUPTS OK AGAIN
|
||||
LD E,C ; MOVE CHAR TO RETURN TO E
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND DONE
|
||||
;
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
; ANSI EMULATION MODULE
|
||||
;==================================================================================================
|
||||
;
|
||||
; ENHANCED BY: JOSE L. COLLADO -- 12/21/2023 -
|
||||
; NEW ANSI PRIVATE SEQUENCE TO INIT VDU AND CHANGE DEFAULT COLORS
|
||||
; (SEE ANSI CONTROL SEQUENCE DISPATCHING SECTION BELOW FOR DETAILS)
|
||||
;
|
||||
; TODO:
|
||||
; 1) INSERT/DELETE CHARACTERS CTL SEQUENCES
|
||||
; 2) OTHER CTL SEQUENCES?
|
||||
@@ -61,6 +65,7 @@ ANSI_RESET:
|
||||
LD (ANSI_ATTR),A ; CLEAR ATTRIBUTES
|
||||
LD A,ANSI_DEFCOLOR ; DEFAULT COLOR
|
||||
LD (ANSI_COLOR),A ; RESET COLOR
|
||||
LD (ANSI_SCOLOR),A ; RESET SCREEN COLOR
|
||||
XOR A ; ZERO ACCUM
|
||||
LD (ANSI_WRAP),A ; CLEAR WRAP FLAG
|
||||
LD (ANSI_LNM),A ; SET LINE FEED NEW LINE MODE
|
||||
@@ -385,6 +390,17 @@ ANSI_ESCDISP2: ; ESC DISPATCHING FOR '#' INT CHAR
|
||||
; ANSI CONTROL SEQUENCE DISPATCHING
|
||||
;==================================================================================================
|
||||
;
|
||||
;--------------------------------------------------------------------------------------------------
|
||||
; ### JLC Mod - NEW ANSI PRIVATE SEQUENCE TO INIT VDU AND CHANGE DEFAULT COLORS ###
|
||||
;--------------------------------------------------------------------------------------------------
|
||||
; Follows ANSI Standards described in VT100.net for Private Sequences.
|
||||
; Implements the ESC Seq.: \ESC[{Num1};{Num2}'{' where '{' is the final char of new Private Sequence.
|
||||
; Initializes the VDU and Changes Default Colors according to the following table:
|
||||
; {Num1}: 30..37 - Foreground color (black, red, green, yellow, blue, magenta, cyan, white)
|
||||
; {Num2}: 40..47 - Background color (black, red, green, yellow, blue, magenta, cyan, white)
|
||||
;
|
||||
; Example: \ESC[37;44{ sets text to white on blue background, \ESC[0{ returns to default colors.
|
||||
;
|
||||
ANSI_CTLDISP:
|
||||
LD (ANSI_FINAL),A ; RECORD THE FINAL CHARACTER
|
||||
#IF (ANSITRACE >= 2)
|
||||
@@ -453,6 +469,11 @@ ANSI_STD1: ; DISPATCH FOR FINAL CHAR W/ NO INTERMEDIATE CHAR AND NO PRIVATE CHAR
|
||||
CP 'm' ; SGR: SELECT GRAPHIC RENDITION
|
||||
JP Z,ANSI_SGR
|
||||
; CHECK FOR ANY OTHERS HERE
|
||||
; ### JLC Mod - New Private Sequence with Parameters checked here...
|
||||
CP '{' ; SSC: SET SCREEN COLORS
|
||||
JP Z,ANSI_SSC
|
||||
;
|
||||
; ANY OTHERS ARE IGNORED
|
||||
JR ANSI_UNK ; UNKNOWN, ABORT
|
||||
;
|
||||
ANSI_DEC: ; DISPATCH ON INTERMEDIATE CHAR W/ PRIVATE CHAR = '?' (DEC)
|
||||
@@ -1147,14 +1168,15 @@ ANSI_SGR1: ; PROCESSING LOOP
|
||||
INC HL ; POINT TO NEXT PARM
|
||||
DJNZ ANSI_SGR1 ; LOOP TILL DONE
|
||||
;
|
||||
; NOW IMPLEMENT ALL CHANGES
|
||||
; NOW IMPLEMENT ALL CHANGES FOR SGR
|
||||
LD A,(ANSI_ATTR) ; GET THE ATTRIBUTE VALUE
|
||||
LD E,A ; MOVE TO E
|
||||
LD B,BF_VDASAT ; SET ATTRIBUTE FUNCTION
|
||||
CALL ANSI_VDADISP ; CALL THE FUNCTION
|
||||
LD A,(ANSI_COLOR) ; GET THE COLOR VALUE
|
||||
LD E,A ; MOVE TO E
|
||||
LD B,BF_VDASCO ; SET ATTRIBUTE FUNCTION
|
||||
LD D,0 ; SET INDIVIDUAL CHAR COLORS
|
||||
LD B,BF_VDASCO ; SET COLOR FUNCTION
|
||||
CALL ANSI_VDADISP ; CALL THE FUNCTION
|
||||
RET ; RETURN
|
||||
;
|
||||
@@ -1234,6 +1256,81 @@ ANSI_SGR_BG:
|
||||
;
|
||||
;
|
||||
;
|
||||
;......................................................................................
|
||||
; ### JLC Mod - Implement new Private Sequence to call VDASCO and Change Default Colors
|
||||
;
|
||||
ANSI_SSC: ; SET SCREEN COLOR (CUSTOM EXTENSION)
|
||||
LD A,(ANSI_PARIDX) ; GET CURRENT PARM INDEX
|
||||
INC A ; INC TO MAKE IT THE COUNT
|
||||
LD B,A ; B IS NOW LOOP COUNTER
|
||||
LD HL,ANSI_PARLST ; HL POINTS TO START OF PARM LIST
|
||||
;
|
||||
ANSI_SSC1: ; PROCESSING LOOP
|
||||
PUSH BC ; PRESERVE BC
|
||||
PUSH HL ; PRESERVE HL
|
||||
LD A,(HL)
|
||||
CALL ANSI_SSC2 ; HANDLE PARM
|
||||
POP HL ; RESTORE HL
|
||||
POP BC ; RESTORE BC
|
||||
INC HL ; POINT TO NEXT PARM
|
||||
DJNZ ANSI_SSC1 ; LOOP TILL DONE
|
||||
;
|
||||
; NOW IMPLEMENT ALL CHANGES FOR SSC
|
||||
LD A,(ANSI_SCOLOR) ; GET THE COLOR VALUE
|
||||
LD E,A ; MOVE TO E
|
||||
LD D,1 ; SET SCREEN COLORS
|
||||
LD B,BF_VDASCO ; SET COLOR FUNCTION
|
||||
CALL ANSI_VDADISP ; CALL THE FUNCTION
|
||||
RET ; RETURN
|
||||
;
|
||||
ANSI_SSC2: ; HANDLE THE REQUEST CODE
|
||||
CP 0 ; ALL OFF
|
||||
JR Z,ANSI_SSC_OFF ; DO IT
|
||||
CP 30 ; START OF FOREGROUND
|
||||
RET C ; OUT OF RANGE
|
||||
CP 38 ; END OF RANGE
|
||||
JR C,ANSI_SSC_FG ; SET FOREGROUND
|
||||
CP 40 ; START OF BACKGROUND
|
||||
RET C ; OUT OF RANGE
|
||||
CP 48 ; END OF RANGE
|
||||
JR C,ANSI_SSC_BG ; SET BACKGROUND
|
||||
RET ; OTHERWISE OUT OF RANGE
|
||||
;
|
||||
ANSI_SSC_OFF:
|
||||
LD A,ANSI_DEFCOLOR ; DEFAULT COLOR
|
||||
LD (ANSI_SCOLOR),A ; RESET COLOR
|
||||
RET
|
||||
;
|
||||
ANSI_SSC_BOLD:
|
||||
LD A,(ANSI_SCOLOR) ; LOAD CURRENT COLOR
|
||||
OR %00001000 ; SET BOLD BIT
|
||||
LD (ANSI_SCOLOR),A ; SAVE IT
|
||||
RET
|
||||
;
|
||||
ANSI_SSC_FG:
|
||||
SUB 30
|
||||
LD E,A
|
||||
LD A,(ANSI_SCOLOR)
|
||||
AND %11111000
|
||||
OR E
|
||||
LD (ANSI_SCOLOR),A
|
||||
RET
|
||||
;
|
||||
ANSI_SSC_BG:
|
||||
SUB 40
|
||||
RLCA
|
||||
RLCA
|
||||
RLCA
|
||||
RLCA
|
||||
LD E,A
|
||||
LD A,(ANSI_SCOLOR)
|
||||
AND %10001111
|
||||
OR E
|
||||
LD (ANSI_SCOLOR),A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
ANSI_DECALN: ; DEC SCREEN ALIGNMENT TEST
|
||||
LD DE,0 ; PREPARE TO HOME CURSOR
|
||||
LD (ANSI_POS),DE ; SAVE NEW CURSOR POSITION
|
||||
@@ -1394,7 +1491,8 @@ ANSI_ROWS .DB 24 ; NUMBER OF ROWS ON SCREEN
|
||||
;
|
||||
ANSI_STATE .DW PANIC ; CURRENT FUNCTION FOR STATE MACHINE
|
||||
ANSI_ATTR .DB ANSI_DEFATTR ; CURRENT CHARACTER ATTRIBUTE
|
||||
ANSI_COLOR .DB ANSI_DEFCOLOR ; CURRENT CHARACTER COLOR;
|
||||
ANSI_COLOR .DB ANSI_DEFCOLOR ; CURRENT CHARACTER FG/BG COLOR
|
||||
ANSI_SCOLOR .DB ANSI_DEFCOLOR ; CURRENT SCREEN FG/BG COLOR
|
||||
ANSI_WRAP .DB 0 ; WRAP PENDING FLAG
|
||||
ANSI_TABS .FILL 32,0 ; TAB STOP BIT MAP (256 BITS)
|
||||
ANSI_LNM .DB 0 ; LINE FEED NEW LINE MODE FLAG
|
||||
@@ -1415,3 +1513,25 @@ ANSI_VARLEN .EQU $ - ANSI_VARS
|
||||
;
|
||||
ANSI_VDAUNIT .DB $FF ; VIDEO UNIT NUM OF ATTACHED VDA DEVICE
|
||||
ANSI_DEVNUM .DB $FF ; TERMINAL DEVICE NUMBER
|
||||
;
|
||||
;=============================================================
|
||||
; BASIC ANSI COLOR TABLE (NIBBLES FOR FOREGROUND & BACKGROUND)
|
||||
; ------------------------------------------------------------
|
||||
; 0 Black
|
||||
; 1 Red
|
||||
; 2 Green
|
||||
; 3 Brown
|
||||
; 4 Blue
|
||||
; 5 Magenta
|
||||
; 6 Cyan
|
||||
; 7 White
|
||||
; 8 Gray
|
||||
; 9 Light Red
|
||||
; A Light Green
|
||||
; B Yellow
|
||||
; C Light Blue
|
||||
; D Light Magenta
|
||||
; E Light Cyan
|
||||
; F Bright White
|
||||
;=============================================================
|
||||
;
|
||||
@@ -67,9 +67,11 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
|
||||
;
|
||||
FPLED_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $42 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $42 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
@@ -78,12 +80,12 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC]
|
||||
LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS
|
||||
LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED
|
||||
;
|
||||
DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY
|
||||
DSKYENABLE .EQU TRUE ; ENABLES DSKY FUNCTIONALITY
|
||||
DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY
|
||||
ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
|
||||
ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI
|
||||
PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259)
|
||||
PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI
|
||||
ICMPPIBASE .EQU $88 ; BASE I/O ADDRESS OF ICM PPI
|
||||
PKDENABLE .EQU TRUE ; ENABLES DSKY NG PKD DRIVER (8259)
|
||||
PKDPPIBASE .EQU $88 ; BASE I/O ADDRESS OF PKD PPI
|
||||
PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ)
|
||||
H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL
|
||||
;
|
||||
|
||||
@@ -69,9 +69,11 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
|
||||
;
|
||||
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -70,9 +70,11 @@ DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
|
||||
;
|
||||
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU FALSE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -69,9 +69,11 @@ WDOGIO .EQU $6E ; WATCHDOG REGISTER ADR
|
||||
;
|
||||
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -98,9 +98,11 @@ WDOGIO .EQU $6F ; WATCHDOG REGISTER ADR
|
||||
;
|
||||
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -64,9 +64,11 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
|
||||
;
|
||||
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -69,9 +69,11 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
|
||||
;
|
||||
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -64,9 +64,11 @@ WDOGIO .EQU $6E ; WATCHDOG REGISTER ADR
|
||||
;
|
||||
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -71,9 +71,11 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
|
||||
;
|
||||
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -75,9 +75,11 @@ DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS
|
||||
;
|
||||
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -28,7 +28,7 @@ BOOT_DELAY .EQU 0 ; FIXED BOOT DELAY IN SECONDS PRIOR TO CONSOLE OUTPUT
|
||||
;
|
||||
CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO
|
||||
CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW
|
||||
CPUOSC .EQU 12000000 ; CPU OSC FREQ IN MHZ
|
||||
CPUOSC .EQU 24000000 ; CPU OSC FREQ IN MHZ
|
||||
INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280)
|
||||
DEFSERCFG .EQU SER_115200_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
|
||||
;
|
||||
@@ -69,9 +69,11 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
|
||||
;
|
||||
FPLED_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -69,9 +69,11 @@ WDOGIO .EQU $6E ; WATCHDOG REGISTER ADR
|
||||
;
|
||||
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -69,9 +69,11 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
|
||||
;
|
||||
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -69,9 +69,11 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
|
||||
;
|
||||
FPLED_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -64,9 +64,11 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
|
||||
;
|
||||
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -69,9 +69,11 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
|
||||
;
|
||||
FPLED_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -67,9 +67,11 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
|
||||
;
|
||||
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -56,9 +56,11 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
|
||||
;
|
||||
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
@@ -67,9 +67,11 @@ WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
|
||||
;
|
||||
FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED
|
||||
;
|
||||
DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING
|
||||
;
|
||||
|
||||
1505
Source/HBIOS/ch.asm
1505
Source/HBIOS/ch.asm
File diff suppressed because it is too large
Load Diff
685
Source/HBIOS/chsd.asm
Normal file
685
Source/HBIOS/chsd.asm
Normal file
@@ -0,0 +1,685 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; CH376 SD CARD SUB-DRIVER
|
||||
;==================================================================================================
|
||||
;
|
||||
; Thanks and credit to Alan Cox. Much of this driver is based on
|
||||
; his code in FUZIX (https://github.com/EtchedPixels/FUZIX).
|
||||
;
|
||||
; This file contains the SD Card specific support for the CH37x
|
||||
; driver. This file is included by the core driver file (ch.asm) as
|
||||
; needed. Note that only the CH376 actually supports SD Card access.
|
||||
;
|
||||
; The SD Card support is implemented using the CH376 file-level
|
||||
; support. It is *not* possible to access SD Cards using raw
|
||||
; sector I/O.
|
||||
;
|
||||
; TODO:
|
||||
; - Implement auto-recovery on error status?
|
||||
;
|
||||
#DEFINE CHSD_IMGFILE "DISK.IMG"
|
||||
;
|
||||
CHSD_FASTIO .EQU TRUE ; USE INIR/OTIR?
|
||||
;
|
||||
; CHUSB DEVICE STATUS
|
||||
;
|
||||
CHSD_STOK .EQU 0
|
||||
CHSD_STNOMEDIA .EQU -1
|
||||
CHSD_STCMDERR .EQU -2
|
||||
CHSD_STIOERR .EQU -3
|
||||
CHSD_STTO .EQU -4
|
||||
CHSD_STNOTSUP .EQU -5
|
||||
CHSD_STNOFILE .EQU -6
|
||||
;
|
||||
; CHSD DEVICE CONFIGURATION
|
||||
;
|
||||
CHSD_CFGSIZ .EQU 14 ; SIZE OF USB CFG TBL ENTRIES
|
||||
;
|
||||
; CONFIG ENTRY DATA OFFSETS
|
||||
;
|
||||
; THE LOCATION OF CHSD_MODE IS SHARED BY ALL SUB-DRIVERS AND THE
|
||||
; CH_SETMODE FUNCTION IN THE MAIN DRIVER (CH.ASM). IF YOU CHANGE
|
||||
; IT, YOU MUST SYNC UP THE MAIN DRIVER AND ALL SUB-DRIVERS!
|
||||
;
|
||||
; FIRST 3 BYTES SAME AS CH CONFIG
|
||||
CHSD_STAT .EQU 3 ; LAST STATUS (BYTE)
|
||||
CHSD_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD)
|
||||
CHSD_LBA .EQU 8 ; CURRENT LBA (DWORD)
|
||||
CHSD_MODE .EQU 12 ; PTR TO MODE BYTE (WORD)
|
||||
;
|
||||
CHSD_CFGTBL:
|
||||
;
|
||||
#IF (CHCNT >= 1)
|
||||
CHSD_CFG0:
|
||||
.DB 0 ; DEV NUM, FILLED DYNAMICALLY
|
||||
.DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY
|
||||
.DB CH0BASE ; IO BASE ADDRESS
|
||||
.DB 0 ; DEVICE STATUS
|
||||
.DW 0,0 ; DEVICE CAPACITY
|
||||
.DW 0,0 ; CURRENT LBA
|
||||
.DW CH0_MODE ; POINTER TO MODE BYTE
|
||||
;
|
||||
#IF (CH0SDENABLE)
|
||||
.ECHO "CHSD: IO="
|
||||
.ECHO CH0BASE
|
||||
.ECHO "\n"
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
#IF (CHCNT >= 2)
|
||||
CHSD_CFG1:
|
||||
.DB 0 ; DEV NUM
|
||||
.DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY
|
||||
.DB CH1BASE ; IO BASE ADDRESS
|
||||
.DB 0 ; DEVICE STATUS
|
||||
.DW 0,0 ; DEVICE CAPACITY
|
||||
.DW 0,0 ; CURRENT LBA
|
||||
.DW CH1_MODE ; POINTER TO MODE BYTE
|
||||
;
|
||||
#IF (CH1SDENABLE)
|
||||
.ECHO "CHSD: IO="
|
||||
.ECHO CH1BASE
|
||||
.ECHO "\n"
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
#IF ($ - CHSD_CFGTBL) != (CHCNT * CHSD_CFGSIZ)
|
||||
.ECHO "*** INVALID CHSD CONFIG TABLE ***\n"
|
||||
#ENDIF
|
||||
;
|
||||
.DB $FF ; END OF TABLE MARKER
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_INIT:
|
||||
LD A,(IY+CH_TYPE) ; GET DEVICE TYPE
|
||||
PUSH HL ; COPY INCOMING HL
|
||||
POP IY ; ... TO IY
|
||||
LD (IY+CH_TYPE),A ; SAVE DEVICE TYPE
|
||||
;
|
||||
; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE
|
||||
LD A,(CHSD_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN
|
||||
LD (IY+CH_DEV),A ; UPDATE IT
|
||||
INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN
|
||||
LD (CHSD_DEVNUM),A ; SAVE IT
|
||||
;
|
||||
; ADD UNIT TO GLOBAL DISK UNIT TABLE
|
||||
LD BC,CHSD_FNTBL ; BC := FUNC TABLE ADR
|
||||
PUSH IY ; CFG ENTRY POINTER
|
||||
POP DE ; COPY TO DE
|
||||
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE
|
||||
;
|
||||
CALL CHSD_RESET ; RESET & DISCOVER MEDIA
|
||||
#IF (CHSDTRACE <= 1)
|
||||
CALL NZ,CHSD_PRTSTAT
|
||||
#ENDIF
|
||||
RET NZ ; ABORT ON FAILURE
|
||||
;
|
||||
; START PRINTING DEVICE INFO
|
||||
CALL CHSD_PRTPREFIX ; PRINT DEVICE PREFIX
|
||||
;
|
||||
; PRINT STORAGE CAPACITY (BLOCK COUNT)
|
||||
PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL
|
||||
LD A,CHSD_MEDCAP ; OFFSET TO CAPACITY FIELD
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL LD32 ; GET THE CAPACITY VALUE
|
||||
CALL PRTHEX32 ; PRINT HEX VALUE
|
||||
;
|
||||
; PRINT STORAGE SIZE IN MB
|
||||
PRTS(" SIZE=$") ; PRINT FIELD LABEL
|
||||
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
|
||||
CALL SRL32 ; RIGHT SHIFT
|
||||
CALL PRTDEC32 ; PRINT DWORD IN DECIMAL
|
||||
PRTS("MB$") ; PRINT SUFFIX
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
; DRIVER FUNCTION TABLE
|
||||
;
|
||||
CHSD_FNTBL:
|
||||
.DW CHSD_STATUS
|
||||
.DW CHSD_RESET
|
||||
.DW CHSD_SEEK
|
||||
.DW CHSD_READ
|
||||
.DW CHSD_WRITE
|
||||
.DW CHSD_VERIFY
|
||||
.DW CHSD_FORMAT
|
||||
.DW CHSD_DEVICE
|
||||
.DW CHSD_MEDIA
|
||||
.DW CHSD_DEFMED
|
||||
.DW CHSD_CAP
|
||||
.DW CHSD_GEOM
|
||||
#IF (($ - CHSD_FNTBL) != (DIO_FNCNT * 2))
|
||||
.ECHO "*** INVALID CHSD FUNCTION TABLE ***\n"
|
||||
#ENDIF
|
||||
;
|
||||
CHSD_VERIFY:
|
||||
CHSD_FORMAT:
|
||||
CHSD_DEFMED:
|
||||
SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_READ:
|
||||
LD A,CH_MODE_SD ; REQUEST SD MODE
|
||||
CALL CH_SETMODE ; DO IT
|
||||
JP NZ,CHSD_CMDERR ; HANDLE ERROR
|
||||
;
|
||||
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
|
||||
LD (CHSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
CALL CHSD_RWSTART ; SET LBA OFFSET
|
||||
RET NZ
|
||||
;
|
||||
;PRTS("\n\rREAD:$") ; *DEBUG*
|
||||
LD A,CH_CMD_BYTERD ; BYTE READ
|
||||
CALL CH_CMD ; SEND COMMAND
|
||||
CALL CH_NAP
|
||||
LD A,0 ; LSB
|
||||
CALL CH_WR ; SEND IT
|
||||
LD A,2 ; MSB
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_POLL ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $1D ; DATA READY TO READ?
|
||||
JP NZ,CHSD_IOERR ; HANDLE I/O ERROR
|
||||
;
|
||||
LD HL,(CHSD_DSKBUF)
|
||||
CHSD_READ1:
|
||||
CALL CH_CMD_RD ; SEND READ USB DATA CMD
|
||||
CALL CH_RD ; GET DATA LENGTH
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
;
|
||||
#IF (CHSD_FASTIO)
|
||||
LD B,A ; BYTE COUNT TO READ
|
||||
LD C,(IY+CH_IOBASE) ; BASE PORT
|
||||
INIR ; DO IT FAST
|
||||
#ELSE
|
||||
LD B,A ; SAVE IT
|
||||
CHSD_READ2:
|
||||
CALL CH_RD ; GET DATA BYTE
|
||||
LD (HL),A ; SAVE IN BUFFER
|
||||
INC HL ; INC BUF PTR
|
||||
DJNZ CHSD_READ2 ; LOOP TILL DONE W/ ALL BYTES
|
||||
#ENDIF
|
||||
;
|
||||
LD A,CH_CMD_BYTERDGO ; BYTE READ GO COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
CALL CH_NAP
|
||||
CALL CH_POLL ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $1D ; MORE?
|
||||
JR Z,CHSD_READ1 ; IF SO, GET MORE
|
||||
CP $14 ; GOOD FINISH?
|
||||
JP NZ,CHSD_IOERR ; HANDLE ERROR
|
||||
;
|
||||
; INCREMENT LBA
|
||||
PUSH HL ; SAVE HL
|
||||
LD A,CHSD_LBA ; LBA OFFSET
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL INC32HL ; INCREMENT THE VALUE
|
||||
POP HL ; RESTORE HL
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_WRITE:
|
||||
LD A,CH_MODE_SD ; REQUEST SD MODE
|
||||
CALL CH_SETMODE ; DO IT
|
||||
JP NZ,CHSD_CMDERR ; HANDLE ERROR
|
||||
;
|
||||
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
|
||||
LD (CHSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
CALL CHSD_RWSTART ; SET LBA OFFSET'
|
||||
RET NZ
|
||||
;
|
||||
;PRTS("\n\rWRITE:$") ; *DEBUG*
|
||||
LD A,CH_CMD_BYTEWR ; BYTE WRITE
|
||||
CALL CH_CMD ; SEND COMMAND
|
||||
LD A,0 ; LSB
|
||||
CALL CH_WR ; SEND IT
|
||||
LD A,2 ; MSB
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_POLL ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $1E ; DATA READY TO GO?
|
||||
JP NZ,CHSD_IOERR ; HANDLE I/O ERROR
|
||||
;
|
||||
LD HL,(CHSD_DSKBUF)
|
||||
CHSD_WRITE1:
|
||||
LD A,CH_CMD_WRREQDAT ; WRITE REQUESTED DATA CMD
|
||||
CALL CH_CMD ; SEND IT
|
||||
CALL CH_RD ; GET DATA LENGTH
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
;
|
||||
#IF (CHSD_FASTIO)
|
||||
LD B,A ; BYTE COUNT TO WRITE
|
||||
LD C,(IY+CH_IOBASE) ; BASE PORT
|
||||
OTIR ; DO IT FAST
|
||||
#ELSE
|
||||
LD B,A ; SAVE IT
|
||||
CHSD_WRITE2:
|
||||
CALL CH_WR ; WRITE DATA BYTE
|
||||
LD (HL),A ; SAVE IN BUFFER
|
||||
INC HL ; INC BUF PTR
|
||||
DJNZ CHSD_WRITE2 ; LOOP TILL DONE W/ ALL BYTES
|
||||
#ENDIF
|
||||
;
|
||||
LD A,CH_CMD_BYTEWRGO ; BYTE WRITE GO COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
CALL CH_NAP
|
||||
CALL CH_POLL ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $1E ; MORE?
|
||||
JR Z,CHSD_WRITE1 ; IF SO, SEND MORE
|
||||
CP $14 ; GOOD FINISH?
|
||||
JP NZ,CHSD_IOERR ; HANDLE ERROR
|
||||
;
|
||||
; INCREMENT LBA
|
||||
PUSH HL ; SAVE HL
|
||||
LD A,CHSD_LBA ; LBA OFFSET
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL INC32HL ; INCREMENT THE VALUE
|
||||
POP HL ; RESTORE HL
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
; SEEK TO CURRENT LBA
|
||||
;
|
||||
CHSD_RWSTART:
|
||||
;PRTS("\n\rRWST:$") ; *DEBUG*
|
||||
LD A,CH_CMD_BYTE_LOC ; BYTE LOCATE COMMAND (SEEK)
|
||||
CALL CH_CMD ; SEND IT
|
||||
;
|
||||
; GET CURRENT LBA OFFSET
|
||||
LD A,CHSD_LBA ; OFFSET TO CAPACITY FIELD
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL LD32 ; OFFSET = DE:HL
|
||||
;
|
||||
; CONVERT OFFSET FROM LBA TO BYTE
|
||||
LD B,9
|
||||
CHSD_RWSTART1:
|
||||
SLA L
|
||||
RL H
|
||||
RL E
|
||||
RL D
|
||||
DJNZ CHSD_RWSTART1
|
||||
;CALL PRTHEX32 ; *DEBUG*
|
||||
;
|
||||
; SEND THE BYTE OFFSET (LSB FIRST)
|
||||
LD A,L
|
||||
CALL CH_WR
|
||||
LD A,H
|
||||
CALL CH_WR
|
||||
LD A,E
|
||||
CALL CH_WR
|
||||
LD A,D
|
||||
CALL CH_WR
|
||||
;
|
||||
CALL CH_POLL ; WAIT FOR RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $14 ; CHECK RESULT
|
||||
JP NZ,CHSD_CMDERR ; HANDLE CMD ERROR
|
||||
;
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_STATUS:
|
||||
; RETURN UNIT STATUS
|
||||
LD A,(IY+CHSD_STAT) ; GET STATUS OF SELECTED DEVICE
|
||||
OR A ; SET FLAGS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
; RESET THE INTERFACE AND REDISCOVER MEDIA
|
||||
;
|
||||
CHSD_RESET:
|
||||
;PRTS("\n\rRES SD:$") ; *DEBUG*
|
||||
;
|
||||
; ACTIVATE SD MODE
|
||||
LD A,CH_CMD_MODE ; SET MODE COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
LD A,3 ; SD MODE
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_NAP ; SMALL WAIT
|
||||
CALL CH_RD ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CALL CH_NAP ; SMALL WAIT
|
||||
;
|
||||
LD A,CH_MODE_SD ; WE ARE NOW IN SD MODE
|
||||
LD L,(IY+CHSD_MODE+0) ; GET MODE PTR (LSB)
|
||||
LD H,(IY+CHSD_MODE+1) ; GET MODE PTR (MSB)
|
||||
LD (HL),A ; SAVE IT
|
||||
;
|
||||
CALL CHSD_DSKMNT ; MOUNT DISK
|
||||
RET NZ
|
||||
;
|
||||
; OPEN DISK IMAGE FILE
|
||||
LD DE,CHSD_FNAME
|
||||
CALL CHSD_FOPEN
|
||||
RET NZ
|
||||
;
|
||||
; GET FILESIZE
|
||||
CALL CHSD_FILESIZE
|
||||
RET NZ
|
||||
;
|
||||
; SET STATUS AND RETURN
|
||||
XOR A ; CLEAR STATUS
|
||||
LD (IY+CHSD_STAT),A ; RECORD STATUS
|
||||
OR A ; SET FLAGS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_DEVICE:
|
||||
LD D,DIODEV_CHSD ; D := DEVICE TYPE
|
||||
LD E,(IY+CH_DEV) ; E := PHYSICAL DEVICE NUMBER
|
||||
LD C,%00110010 ; SD HARD DISK ATTRIBUTES
|
||||
LD H,(IY+CH_TYPE) ; H := MODE
|
||||
LD L,(IY+CH_IOBASE) ; L := BASE I/O ADDRESS
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
; CHSD_GETMED
|
||||
;
|
||||
CHSD_MEDIA:
|
||||
LD A,E ; GET FLAGS
|
||||
OR A ; SET FLAGS
|
||||
JR Z,CHSD_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA
|
||||
CALL CHSD_RESET ; RESET CHSD INTERFACE
|
||||
;
|
||||
CHSD_MEDIA1:
|
||||
LD A,(IY+CHSD_STAT) ; GET STATUS
|
||||
OR A ; SET FLAGS
|
||||
LD D,0 ; NO MEDIA CHANGE DETECTED
|
||||
LD E,MID_HD ; ASSUME WE ARE OK
|
||||
RET Z ; RETURN IF GOOD INIT
|
||||
LD E,MID_NONE ; SIGNAL NO MEDIA
|
||||
LD A,ERR_NOMEDIA ; NO MEDIA ERROR
|
||||
OR A ; SET FLAGS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_SEEK:
|
||||
BIT 7,D ; CHECK FOR LBA FLAG
|
||||
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
|
||||
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA)
|
||||
LD (IY+CHSD_LBA+0),L ; SAVE NEW LBA
|
||||
LD (IY+CHSD_LBA+1),H ; ...
|
||||
LD (IY+CHSD_LBA+2),E ; ...
|
||||
LD (IY+CHSD_LBA+3),D ; ...
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_CAP:
|
||||
LD A,(IY+CHSD_STAT) ; GET STATUS
|
||||
PUSH AF ; SAVE IT
|
||||
LD A,CHSD_MEDCAP ; OFFSET TO CAPACITY FIELD
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL LD32 ; GET THE CURRENT CAPACITY INTO DE:HL
|
||||
LD BC,512 ; 512 BYTES PER BLOCK
|
||||
POP AF ; RECOVER STATUS
|
||||
OR A ; SET FLAGS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_GEOM:
|
||||
; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS
|
||||
; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE
|
||||
CALL CHSD_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC
|
||||
LD L,H ; DIVIDE BY 256 FOR # TRACKS
|
||||
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
|
||||
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
|
||||
LD E,16 ; SECTORS / TRACK = 16
|
||||
RET ; DONE, A STILL HAS CHSD_CAP STATUS
|
||||
;
|
||||
; CH37X HELPER ROUTINES
|
||||
;
|
||||
;
|
||||
; PERFORM DISK MOUNT
|
||||
;
|
||||
CHSD_DSKMNT:
|
||||
;PRTS("\n\rMOUNT:$") ; *DEBUG*
|
||||
LD A,CH_CMD_DSKMNT ; DISK QUERY
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_POLL ; WAIT FOR RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $82 ; NO DISK?
|
||||
JP Z,CHSD_NOMEDIA ; HANDLE NO MEDIA ERROR
|
||||
CP $14 ; SUCCESS?
|
||||
JP NZ,CHSD_CMDERR ; HANDLE ERROR
|
||||
;
|
||||
#IF FALSE
|
||||
CALL CH_CMD_RD ; SEND READ COMMAND
|
||||
CALL CH_RD ; GET LENGTH
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
LD B,A ; LOOP COUNTER
|
||||
LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA
|
||||
CHSD_DSKMNT1:
|
||||
CALL CH_RD ; GET A BYTE
|
||||
LD (HL),A ; SAVE IT
|
||||
INC HL ; BUMP BUF PTR
|
||||
DJNZ CHSD_DSKMNT1 ; LOOP FOR ALL DATA
|
||||
;
|
||||
;LD DE,HB_WRKBUF ; *DEBUG*
|
||||
;CALL DUMP_BUFFER ; *DEBUG*
|
||||
;
|
||||
CALL CHSD_PRTPREFIX ; PRINT DEVICE PREFIX
|
||||
LD HL,HB_WRKBUF + 8
|
||||
LD B,28
|
||||
CHSD_DSKMNT2:
|
||||
LD A,(HL)
|
||||
INC HL
|
||||
CALL COUT
|
||||
DJNZ CHSD_DSKMNT2
|
||||
#ENDIF
|
||||
;
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
; SET FILE NAME
|
||||
;
|
||||
CHSD_SETFNAME:
|
||||
;PRTS("\n\rSETFNAME:$") ; *DEBUG*
|
||||
LD A,CH_CMD_SET_FN ; SET FILE NAME COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
CALL CH_NAP
|
||||
;CALL DELAY ; MAY NOT BE NEEDED
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
CHSD_SETFNAME1:
|
||||
;CALL DELAY
|
||||
LD A,(DE) ; GET NEXT BYTE
|
||||
INC DE ; BUMP POINTER
|
||||
CALL CH_WR ; SEND IT
|
||||
;CALL COUT ; *DEBUG*
|
||||
OR A ; CHECK FOR NUL (EOS)
|
||||
RET Z ; IF NUL, DONE
|
||||
JR CHSD_SETFNAME1 ; SEND MORE CHARACTERS
|
||||
;
|
||||
; OPEN FILE
|
||||
;
|
||||
CHSD_FOPEN:
|
||||
CALL CHSD_SETFNAME
|
||||
;PRTS("\n\rFOPEN:$") ; *DEBUG*
|
||||
LD A,CH_CMD_FOPEN ; FILE OPEN COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
CALL CH_POLL ; WAIT FOR RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $42 ; MISSING FILE?
|
||||
JP Z,CHSD_NOFILE ; HANDLE ERROR
|
||||
CP $14 ; SUCCESS?
|
||||
JP NZ,CHSD_IOERR ; HANDLE ERROR
|
||||
RET ; RETURN WITH ZF SET APPROPRIATELY
|
||||
;
|
||||
; GET FILE SIZE
|
||||
;
|
||||
CHSD_FILESIZE:
|
||||
;PRTS("\n\rFSIZE:$")
|
||||
LD A,CH_CMD_FILESIZE ; FILE SIZE COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
LD A,$68 ; REQUIRED CMD PARAMETER
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_NAP
|
||||
LD A,CHSD_MEDCAP ; MEDIA CAPACITY OFFSET
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
PUSH HL ; SAVE ADDRESS
|
||||
CALL CH_RD
|
||||
LD L,A
|
||||
CALL CH_RD
|
||||
LD H,A
|
||||
CALL CH_RD
|
||||
LD E,A
|
||||
CALL CH_RD
|
||||
LD D,A
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEX32 ; *DEBUG*
|
||||
LD B,9 ; ROTATE 9 BITS FOR DIV 512
|
||||
CHSD_FILESIZE1:
|
||||
SRL D
|
||||
RR E
|
||||
RR H
|
||||
RR L
|
||||
DJNZ CHSD_FILESIZE1 ; LOOP TILL DONE
|
||||
POP BC ; RECOVER ADDRESS TO BC
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEX32 ; *DEBUG*
|
||||
CALL ST32 ; STORE IT
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND DONE
|
||||
;
|
||||
; ERROR HANDLERS
|
||||
;
|
||||
;
|
||||
CHSD_NOFILE:
|
||||
LD A,CHSD_STNOFILE
|
||||
JR CHSD_ERR
|
||||
;
|
||||
CHSD_NOMEDIA:
|
||||
LD A,CHSD_STNOMEDIA
|
||||
JR CHSD_ERR
|
||||
;
|
||||
CHSD_CMDERR:
|
||||
LD A,CHSD_STCMDERR
|
||||
JR CHSD_ERR
|
||||
;
|
||||
CHSD_IOERR:
|
||||
LD A,CHSD_STIOERR
|
||||
JR CHSD_ERR
|
||||
;
|
||||
CHSD_TO:
|
||||
LD A,CHSD_STTO
|
||||
JR CHSD_ERR
|
||||
;
|
||||
CHSD_NOTSUP:
|
||||
LD A,CHSD_STNOTSUP
|
||||
JR CHSD_ERR
|
||||
;
|
||||
CHSD_ERR:
|
||||
LD (IY+CHSD_STAT),A ; SAVE NEW STATUS
|
||||
;
|
||||
CHSD_ERR2:
|
||||
#IF (CHSDTRACE >= 2)
|
||||
CALL CHSD_PRTSTAT
|
||||
#ENDIF
|
||||
OR A ; SET FLAGS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_PRTERR:
|
||||
RET Z ; DONE IF NO ERRORS
|
||||
; FALL THRU TO CHSD_PRTSTAT
|
||||
;
|
||||
; PRINT FULL DEVICE STATUS LINE
|
||||
;
|
||||
CHSD_PRTSTAT:
|
||||
PUSH AF
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD A,(IY+CHSD_STAT)
|
||||
CALL CHSD_PRTPREFIX ; PRINT UNIT PREFIX
|
||||
CALL PC_SPACE ; FORMATTING
|
||||
CALL CHSD_PRTSTATSTR
|
||||
POP HL
|
||||
POP DE
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; PRINT STATUS STRING
|
||||
;
|
||||
CHSD_PRTSTATSTR:
|
||||
PUSH AF
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD A,(IY+CHSD_STAT)
|
||||
NEG
|
||||
LD HL,CHSD_STR_ST_MAP
|
||||
ADD A,A
|
||||
CALL ADDHLA
|
||||
LD E,(HL)
|
||||
INC HL
|
||||
LD D,(HL)
|
||||
CALL WRITESTR
|
||||
POP HL
|
||||
POP DE
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; PRINT DIAGNONSTIC PREFIX
|
||||
;
|
||||
CHSD_PRTPREFIX:
|
||||
PUSH AF
|
||||
CALL NEWLINE
|
||||
PRTS("CHSD$")
|
||||
LD A,(IY+CH_DEV) ; GET CURRENT DEVICE NUM
|
||||
CALL PRTDECB
|
||||
CALL PC_COLON
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; DATA STORAGE
|
||||
;
|
||||
CHSD_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT
|
||||
CHSD_DSKBUF .DW 0
|
||||
;
|
||||
CHSD_FNAME .DB "/", CHSD_IMGFILE, 0
|
||||
;
|
||||
CHSD_STR_ST_MAP:
|
||||
.DW CHSD_STR_STOK
|
||||
.DW CHSD_STR_STNOMEDIA
|
||||
.DW CHSD_STR_STCMDERR
|
||||
.DW CHSD_STR_STIOERR
|
||||
.DW CHSD_STR_STTO
|
||||
.DW CHSD_STR_STNOTSUP
|
||||
.DW CHSD_STR_STNOFILE
|
||||
;
|
||||
CHSD_STR_STOK .TEXT "OK$"
|
||||
CHSD_STR_STNOMEDIA .TEXT "NO MEDIA$"
|
||||
CHSD_STR_STCMDERR .TEXT "COMMAND ERROR$"
|
||||
CHSD_STR_STIOERR .TEXT "IO ERROR$"
|
||||
CHSD_STR_STTO .TEXT "TIMEOUT$"
|
||||
CHSD_STR_STNOTSUP .TEXT "NOT SUPPORTED$"
|
||||
CHSD_STR_STNOFILE .TEXT "MISSING "
|
||||
.TEXT CHSD_IMGFILE
|
||||
.TEXT " FILE$"
|
||||
CHSD_STR_STUNK .TEXT "UNKNOWN ERROR$"
|
||||
792
Source/HBIOS/chusb.asm
Normal file
792
Source/HBIOS/chusb.asm
Normal file
@@ -0,0 +1,792 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; CH375/376 USB SUB-DRIVER
|
||||
;==================================================================================================
|
||||
;
|
||||
; Thanks and credit to Alan Cox. Much of this driver is based on
|
||||
; his code in FUZIX (https://github.com/EtchedPixels/FUZIX).
|
||||
;
|
||||
; This file contains the USB Drive specific support for the CH37x
|
||||
; driver. This file is included by the core driver file (ch.asm) as
|
||||
; needed.
|
||||
;
|
||||
; The USB support is implemented as pure raw sector I/O. The CH376
|
||||
; file-level support is not utilized.
|
||||
;
|
||||
; NOTES:
|
||||
; - There seem to be compatibility issues with older USB thumb drives.
|
||||
; Such drives will complete DISK_INIT successfully, but then return
|
||||
; an error attempting to do any I/O. The error is $17 indicating
|
||||
; the CH37x encountered an overflow during communication with the
|
||||
; device. I found that adding a DISK_MOUNT command (only possible
|
||||
; on CH376) resolved the issue for some devices, so that has been
|
||||
; added to the RESET routine when using CH376.
|
||||
;
|
||||
; TODO:
|
||||
; - Implement auto-recovery on error status?
|
||||
;
|
||||
CHUSB_FASTIO .EQU TRUE ; USE INIR/OTIR?
|
||||
;
|
||||
; CHUSB DEVICE STATUS
|
||||
;
|
||||
CHUSB_STOK .EQU 0
|
||||
CHUSB_STNOMEDIA .EQU -1
|
||||
CHUSB_STCMDERR .EQU -2
|
||||
CHUSB_STIOERR .EQU -3
|
||||
CHUSB_STTO .EQU -4
|
||||
CHUSB_STNOTSUP .EQU -5
|
||||
;
|
||||
; CHUSB DEVICE CONFIGURATION
|
||||
;
|
||||
CHUSB_CFGSIZ .EQU 14 ; SIZE OF USB CFG TBL ENTRIES
|
||||
;
|
||||
; CONFIG ENTRY DATA OFFSETS
|
||||
;
|
||||
; THE LOCATION OF CHSD_MODE IS SHARED BY ALL SUB-DRIVERS AND THE
|
||||
; CH_SETMODE FUNCTION IN THE MAIN DRIVER (CH.ASM). IF YOU CHANGE
|
||||
; IT, YOU MUST SYNC UP THE MAIN DRIVER AND ALL SUB-DRIVERS!
|
||||
;
|
||||
; FIRST 3 BYTES SAME AS CH CONFIG
|
||||
CHUSB_STAT .EQU 3 ; LAST STATUS (BYTE)
|
||||
CHUSB_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD)
|
||||
CHUSB_LBA .EQU 8 ; CURRENT LBA (DWORD)
|
||||
CHUSB_MODE .EQU 12 ; PTR TO MODE BYTE (WORD)
|
||||
;
|
||||
CHUSB_CFGTBL:
|
||||
;
|
||||
#IF (CHCNT >= 1)
|
||||
CHUSB_CFG0:
|
||||
.DB 0 ; DEV NUM, FILLED DYNAMICALLY
|
||||
.DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY
|
||||
.DB CH0BASE ; IO BASE ADDRESS
|
||||
.DB 0 ; DEVICE STATUS
|
||||
.DW 0,0 ; DEVICE CAPACITY
|
||||
.DW 0,0 ; CURRENT LBA
|
||||
.DW CH0_MODE ; POINTER TO MODE BYTE
|
||||
;
|
||||
#IF (CH0USBENABLE)
|
||||
.ECHO "CHUSB: IO="
|
||||
.ECHO CH0BASE
|
||||
.ECHO "\n"
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
#IF (CHCNT >= 2)
|
||||
CHUSB_CFG1:
|
||||
.DB 0 ; DEV NUM
|
||||
.DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY
|
||||
.DB CH1BASE ; IO BASE ADDRESS
|
||||
.DB 0 ; DEVICE STATUS
|
||||
.DW 0,0 ; DEVICE CAPACITY
|
||||
.DW 0,0 ; CURRENT LBA
|
||||
.DW CH1_MODE ; POINTER TO MODE BYTE
|
||||
;
|
||||
#IF (CH1USBENABLE)
|
||||
.ECHO "CHUSB: IO="
|
||||
.ECHO CH1BASE
|
||||
.ECHO "\n"
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
#IF ($ - CHUSB_CFGTBL) != (CHCNT * CHUSB_CFGSIZ)
|
||||
.ECHO "*** INVALID CHUSB CONFIG TABLE ***\n"
|
||||
#ENDIF
|
||||
;
|
||||
.DB $FF ; END OF TABLE MARKER
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_INIT:
|
||||
LD A,(IY+CH_TYPE) ; GET DEVICE TYPE
|
||||
PUSH HL ; COPY INCOMING HL
|
||||
POP IY ; ... TO IY
|
||||
LD (IY+CH_TYPE),A ; SAVE DEVICE TYPE
|
||||
;
|
||||
; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE
|
||||
LD A,(CHUSB_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN
|
||||
LD (IY+CH_DEV),A ; UPDATE IT
|
||||
INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN
|
||||
LD (CHUSB_DEVNUM),A ; SAVE IT
|
||||
;
|
||||
; ADD UNIT TO GLOBAL DISK UNIT TABLE
|
||||
LD BC,CHUSB_FNTBL ; BC := FUNC TABLE ADR
|
||||
PUSH IY ; CFG ENTRY POINTER
|
||||
POP DE ; COPY TO DE
|
||||
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE
|
||||
;
|
||||
CALL CHUSB_RESET ; RESET & DISCOVER MEDIA
|
||||
#IF (CHUSBTRACE <= 1)
|
||||
CALL NZ,CHUSB_PRTSTAT
|
||||
#ENDIF
|
||||
RET NZ ; ABORT ON FAILURE
|
||||
;
|
||||
; START PRINTING DEVICE INFO
|
||||
CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX
|
||||
;
|
||||
; PRINT STORAGE CAPACITY (BLOCK COUNT)
|
||||
PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL
|
||||
LD A,CHUSB_MEDCAP ; OFFSET TO CAPACITY FIELD
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL LD32 ; GET THE CAPACITY VALUE
|
||||
CALL PRTHEX32 ; PRINT HEX VALUE
|
||||
;
|
||||
; PRINT STORAGE SIZE IN MB
|
||||
PRTS(" SIZE=$") ; PRINT FIELD LABEL
|
||||
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
|
||||
CALL SRL32 ; RIGHT SHIFT
|
||||
CALL PRTDEC32 ; PRINT DWORD IN DECIMAL
|
||||
PRTS("MB$") ; PRINT SUFFIX
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
; DRIVER FUNCTION TABLE
|
||||
;
|
||||
CHUSB_FNTBL:
|
||||
.DW CHUSB_STATUS
|
||||
.DW CHUSB_RESET
|
||||
.DW CHUSB_SEEK
|
||||
.DW CHUSB_READ
|
||||
.DW CHUSB_WRITE
|
||||
.DW CHUSB_VERIFY
|
||||
.DW CHUSB_FORMAT
|
||||
.DW CHUSB_DEVICE
|
||||
.DW CHUSB_MEDIA
|
||||
.DW CHUSB_DEFMED
|
||||
.DW CHUSB_CAP
|
||||
.DW CHUSB_GEOM
|
||||
#IF (($ - CHUSB_FNTBL) != (DIO_FNCNT * 2))
|
||||
.ECHO "*** INVALID CHUSB FUNCTION TABLE ***\n"
|
||||
#ENDIF
|
||||
;
|
||||
CHUSB_VERIFY:
|
||||
CHUSB_FORMAT:
|
||||
CHUSB_DEFMED:
|
||||
SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_READ:
|
||||
LD A,CH_MODE_USB ; REQUEST USB MODE
|
||||
CALL CH_SETMODE ; DO IT
|
||||
JP NZ,CHUSB_CMDERR ; HANDLE ERROR
|
||||
;
|
||||
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
|
||||
LD (CHUSB_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD A,CH_CMD_DSKRD ; DISK READ COMMAND
|
||||
CALL CHUSB_RWSTART ; SEND CMD AND LBA
|
||||
;
|
||||
; READ THE SECTOR IN 64 BYTE CHUNKS
|
||||
LD B,8 ; 8 CHUNKS OF 64 FOR 512 BYTE SECTOR
|
||||
LD HL,(CHUSB_DSKBUF) ; GET DISK BUF ADR
|
||||
CHUSB_READ1:
|
||||
CALL CH_POLL ; WAIT FOR DATA READY
|
||||
CP $1D ; DATA READY TO READ?
|
||||
;CALL PC_LT ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
JP NZ,CHUSB_IOERR ; HANDLE IO ERROR
|
||||
CALL CH_CMD_RD ; SEND READ USB DATA CMD
|
||||
CALL CH_RD ; READ DATA BLOCK LENGTH
|
||||
CP 64 ; AS EXPECTED?
|
||||
JP NZ,CHUSB_IOERR ; IF NOT, HANDLE ERROR
|
||||
;
|
||||
#IF (CHUSB_FASTIO)
|
||||
; READ 64 BYTE CHUNK
|
||||
PUSH BC ; SAVE LOOP CONTROL
|
||||
LD B,64 ; READ 64 BYTES
|
||||
LD C,(IY+CH_IOBASE) ; BASE PORT
|
||||
INIR ; DO IT FAST
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
#ELSE
|
||||
; BYTE READ LOOP
|
||||
PUSH BC ; SAVE LOOP CONTROL
|
||||
LD B,64 ; READ 64 BYTES
|
||||
CHUSB_READ2:
|
||||
CALL CH_RD ; GET NEXT BYTE
|
||||
LD (HL),A ; SAVE IT
|
||||
INC HL ; INC BUF PTR
|
||||
DJNZ CHUSB_READ2 ; LOOP AS NEEDED
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
#ENDIF
|
||||
;
|
||||
; PREPARE FOR NEXT CHUNK
|
||||
LD A,CH_CMD_DSKRDGO ; CONTINUE DISK READ
|
||||
CALL CH_CMD ; SEND IT
|
||||
DJNZ CHUSB_READ1 ; LOOP TILL DONE
|
||||
;
|
||||
; FINAL CHECK FOR COMPLETION & SUCCESS
|
||||
CALL CH_POLL ; WAIT FOR COMPLETION
|
||||
CP $14 ; SUCCESS?
|
||||
JP NZ,CHUSB_IOERR ; IF NOT, HANDLE ERROR
|
||||
;
|
||||
; INCREMENT LBA
|
||||
PUSH HL ; SAVE HL
|
||||
LD A,CHUSB_LBA ; LBA OFFSET
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL INC32HL ; INCREMENT THE VALUE
|
||||
POP HL ; RESTORE HL
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_WRITE:
|
||||
LD A,CH_MODE_USB ; REQUEST USB MODE
|
||||
CALL CH_SETMODE ; DO IT
|
||||
JP NZ,CHUSB_CMDERR ; HANDLE ERROR
|
||||
;
|
||||
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
|
||||
LD (CHUSB_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD A,CH_CMD_DSKWR ; DISK READ COMMAND
|
||||
CALL CHUSB_RWSTART ; SEND CMD AND LBA
|
||||
;
|
||||
; WRITE THE SECTOR IN 64 BYTE CHUNKS
|
||||
LD B,8 ; 8 CHUNKS OF 64 FOR 512 BYTE SECTOR
|
||||
LD HL,(CHUSB_DSKBUF) ; GET DISK BUF ADR
|
||||
CHUSB_WRITE1:
|
||||
CALL CH_POLL ; WAIT FOR DATA READY
|
||||
CP $1E ; DATA READY TO WRITE
|
||||
;CALL PC_GT ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
JP NZ,CHUSB_IOERR ; HANDLE IO ERROR
|
||||
CALL CH_CMD_WR ; SEND WRITE USB DATA CMD
|
||||
LD A,64 ; 64 BYTE CHUNK
|
||||
CALL CH_WR ; SEND DATA BLOCK LENGTH
|
||||
;
|
||||
#IF (CHUSB_FASTIO)
|
||||
; WRITE 64 BYTE CHUNK
|
||||
PUSH BC ; SAVE LOOP CONTROL
|
||||
LD B,64 ; WRITE 64 BYTES
|
||||
LD C,(IY+CH_IOBASE) ; BASE PORT
|
||||
OTIR ; DO IT FAST
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
#ELSE
|
||||
; BYTE WRITE LOOP
|
||||
PUSH BC ; SAVE LOOP CONTROL
|
||||
LD B,64 ; WRITE 64 BYTES
|
||||
CHUSB_WRITE2:
|
||||
LD A,(HL) ; GET NEXT BYTE
|
||||
INC HL ; INC BUF PTR
|
||||
CALL CH_WR ; WRITE NEXT BYTE
|
||||
DJNZ CHUSB_WRITE2 ; LOOP AS NEEDED
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
#ENDIF
|
||||
;
|
||||
; PREPARE FOR NEXT CHUNK
|
||||
LD A,CH_CMD_DSKWRGO ; CONTINUE DISK READ
|
||||
CALL CH_CMD ; SEND IT
|
||||
DJNZ CHUSB_WRITE1 ; LOOP TILL DONE
|
||||
;
|
||||
; FINAL CHECK FOR COMPLETION & SUCCESS
|
||||
CALL CH_POLL ; WAIT FOR COMPLETION
|
||||
CP $14 ; SUCCESS?
|
||||
JP NZ,CHUSB_IOERR ; IF NOT, HANDLE ERROR
|
||||
;
|
||||
; INCREMENT LBA
|
||||
PUSH HL ; SAVE HL
|
||||
LD A,CHUSB_LBA ; LBA OFFSET
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL INC32HL ; INCREMENT THE VALUE
|
||||
POP HL ; RESTORE HL
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
; INITIATE A DISK SECTOR READ/WRITE OPERATION
|
||||
; A: READ OR WRITE OPCODE
|
||||
;
|
||||
CHUSB_RWSTART:
|
||||
CALL CH_CMD ; SEND R/W COMMAND
|
||||
;
|
||||
; SEND LBA, 4 BYTES, LITTLE ENDIAN
|
||||
LD A,CHUSB_LBA ; OFFSET TO CAPACITY FIELD
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
LD B,4 ; SEND 4 BYTES
|
||||
CHUSB_RWSTART1:
|
||||
LD A,(HL) ; GET BYTE
|
||||
INC HL ; BUMP PTR
|
||||
CALL CH_WR ; SEND BYTE
|
||||
DJNZ CHUSB_RWSTART1 ; LOOP AS NEEDED
|
||||
;
|
||||
; REQUEST 1 SECTOR
|
||||
LD A,1 ; 1 SECTOR
|
||||
CALL CH_WR ; SEND IT
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_STATUS:
|
||||
; RETURN UNIT STATUS
|
||||
LD A,(IY+CHUSB_STAT) ; GET STATUS OF SELECTED DEVICE
|
||||
OR A ; SET FLAGS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
; RESET THE INTERFACE AND REDISCOVER MEDIA
|
||||
;
|
||||
CHUSB_RESET:
|
||||
;PRTS("\n\rRES USB:$") ; *DEBUG*
|
||||
;CALL CH_FLUSH ; DISCARD ANY GARBAGE
|
||||
;CALL CH_RESET ; FULL CH37X RESET
|
||||
;
|
||||
; RESET THE BUS
|
||||
LD A,CH_CMD_MODE ; SET MODE COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
LD A,7 ; RESET BUS
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_NAP ; SMALL WAIT
|
||||
CALL CH_RD ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CALL CH_NAP ; SMALL WAIT
|
||||
;
|
||||
; ACTIVATE USB MODE
|
||||
LD A,CH_CMD_MODE ; SET MODE COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
LD A,6 ; USB ENABLED, SEND SOF
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_NAP ; SMALL WAIT
|
||||
CALL CH_RD ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CALL CH_NAP ; SMALL WAIT
|
||||
;
|
||||
LD A,CH_MODE_USB ; WE ARE NOW IN USB MODE
|
||||
LD L,(IY+CHUSB_MODE+0) ; GET MODE PTR (LSB)
|
||||
LD H,(IY+CHUSB_MODE+1) ; GET MODE PTR (MSB)
|
||||
LD (HL),A ; SAVE IT
|
||||
;
|
||||
; INITIALIZE DISK
|
||||
LD B,24 ; TRY A FEW TIMES
|
||||
CHUSB_RESET1:
|
||||
;PRTS("\n\rDSKINIT:$") ; *DEBUG*
|
||||
LD A,CH_CMD_DSKINIT ; DISK INIT COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
LD DE,10000 ; 10000 * 16 = 160US ???
|
||||
LD DE,20000 ; 10000 * 16 = 160US ???
|
||||
LD DE,12500 ; 1250 * 16 = 200US ???
|
||||
CALL VDELAY ; DELAY
|
||||
CALL CH_POLL ; WAIT FOR RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $14 ; SUCCESS?
|
||||
JR Z,CHUSB_RESET1A ; IF SO, CHECK READY
|
||||
CP $16 ; NO MEDIA
|
||||
JP Z,CHUSB_NOMEDIA ; HANDLE IT
|
||||
CALL CH_NAP ; SMALL DELAY
|
||||
DJNZ CHUSB_RESET1 ; LOOP AS NEEDED
|
||||
JP CHUSB_TO ; HANDLE TIMEOUT
|
||||
;
|
||||
CHUSB_RESET1A:
|
||||
;CALL CHUSB_DSKRES ; DISK RESET
|
||||
;CP $14 ; GOOD?
|
||||
;JR Z,CHUSB_RESET2
|
||||
;CALL CHUSB_DSKRDY ; CHECK IF DISK READY
|
||||
;CP $14 ; GOOD?
|
||||
;JR Z,CHUSB_RESET2 ; IF SO, MOVE ON
|
||||
;DJNZ CHUSB_RESET1 ; KEEP TRYING
|
||||
;
|
||||
CHUSB_RESET2:
|
||||
; USE OF CH376 DISK_MOUNT COMMAND SEEMS TO IMPROVE
|
||||
; COMPATIBILITY WITH SOME OLDER USB THUMBDRIVES.
|
||||
LD A,(IY+CH_TYPE) ; CH37X TYPE?
|
||||
CP CHTYP_376 ; IS CH376?
|
||||
CALL Z,CHUSB_DSKMNT ; IF SO, TRY MOUNT, IGNORE ERRS
|
||||
;CALL CHUSB_AUTOSET ; *DEBUG*
|
||||
;CALL CHUSB_TSTCON ; *DEBUG*
|
||||
;CALL CHUSB_MAXLUN ; *DEBUG*
|
||||
;CALL CHUSB_DSKRDY ; *DEBUG*
|
||||
;CALL CHUSB_DSKINQ ; *DEBUG*
|
||||
;;
|
||||
CALL CHUSB_DSKSIZ ; GET AND RECORD DISK SIZE
|
||||
RET NZ ; ABORT ON ERROR
|
||||
;
|
||||
; SET STATUS AND RETURN
|
||||
XOR A ; CLEAR STATUS
|
||||
LD (IY+CHUSB_STAT),A ; RECORD STATUS
|
||||
OR A ; SET FLAGS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_DEVICE:
|
||||
LD D,DIODEV_CHUSB ; D := DEVICE TYPE
|
||||
LD E,(IY+CH_DEV) ; E := PHYSICAL DEVICE NUMBER
|
||||
LD C,%00110011 ; USB HARD DISK ATTRIBUTES
|
||||
LD H,(IY+CH_TYPE) ; H := MODE
|
||||
LD L,(IY+CH_IOBASE) ; L := BASE I/O ADDRESS
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
; CHUSB_GETMED
|
||||
;
|
||||
CHUSB_MEDIA:
|
||||
LD A,E ; GET FLAGS
|
||||
OR A ; SET FLAGS
|
||||
JR Z,CHUSB_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA
|
||||
CALL CHUSB_RESET ; RESET CHUSB INTERFACE
|
||||
;
|
||||
CHUSB_MEDIA1:
|
||||
LD A,(IY+CHUSB_STAT) ; GET STATUS
|
||||
OR A ; SET FLAGS
|
||||
LD D,0 ; NO MEDIA CHANGE DETECTED
|
||||
LD E,MID_HD ; ASSUME WE ARE OK
|
||||
RET Z ; RETURN IF GOOD INIT
|
||||
LD E,MID_NONE ; SIGNAL NO MEDIA
|
||||
LD A,ERR_NOMEDIA ; NO MEDIA ERROR
|
||||
OR A ; SET FLAGS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_SEEK:
|
||||
BIT 7,D ; CHECK FOR LBA FLAG
|
||||
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
|
||||
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA)
|
||||
LD (IY+CHUSB_LBA+0),L ; SAVE NEW LBA
|
||||
LD (IY+CHUSB_LBA+1),H ; ...
|
||||
LD (IY+CHUSB_LBA+2),E ; ...
|
||||
LD (IY+CHUSB_LBA+3),D ; ...
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_CAP:
|
||||
LD A,(IY+CHUSB_STAT) ; GET STATUS
|
||||
PUSH AF ; SAVE IT
|
||||
LD A,CHUSB_MEDCAP ; OFFSET TO CAPACITY FIELD
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL LD32 ; GET THE CURRENT CAPACITY INTO DE:HL
|
||||
LD BC,512 ; 512 BYTES PER BLOCK
|
||||
POP AF ; RECOVER STATUS
|
||||
OR A ; SET FLAGS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_GEOM:
|
||||
; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS
|
||||
; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE
|
||||
CALL CHUSB_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC
|
||||
LD L,H ; DIVIDE BY 256 FOR # TRACKS
|
||||
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
|
||||
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
|
||||
LD E,16 ; SECTORS / TRACK = 16
|
||||
RET ; DONE, A STILL HAS CHUSB_CAP STATUS
|
||||
;
|
||||
; CH37X HELPER ROUTINES
|
||||
;
|
||||
;
|
||||
; PERFORM DISK MOUNT
|
||||
;
|
||||
CHUSB_DSKMNT:
|
||||
;PRTS("\n\rMOUNT:$") ; *DEBUG*
|
||||
LD A,CH_CMD_DSKMNT ; DISK QUERY
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_POLL ; WAIT FOR RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $14 ; SUCCESS?
|
||||
RET NZ ; ABORT IF NOT
|
||||
;
|
||||
#IF FALSE
|
||||
CALL CH_CMD_RD ; SEND READ COMMAND
|
||||
CALL CH_RD ; GET LENGTH
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
LD B,A ; LOOP COUNTER
|
||||
LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA
|
||||
CHUSB_DSKMNT1:
|
||||
CALL CH_RD ; GET A BYTE
|
||||
LD (HL),A ; SAVE IT
|
||||
INC HL ; BUMP BUF PTR
|
||||
DJNZ CHUSB_DSKMNT1 ; LOOP FOR ALL DATA
|
||||
;
|
||||
;LD DE,HB_WRKBUF ; *DEBUG*
|
||||
;CALL DUMP_BUFFER ; *DEBUG*
|
||||
;
|
||||
CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX
|
||||
LD HL,HB_WRKBUF + 8
|
||||
LD B,28
|
||||
CHUSB_DSKMNT2:
|
||||
LD A,(HL)
|
||||
INC HL
|
||||
CALL COUT
|
||||
DJNZ CHUSB_DSKMNT2
|
||||
#ENDIF
|
||||
;
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
; PERFORM DISK SIZE
|
||||
;
|
||||
CHUSB_DSKSIZ:
|
||||
;PRTS("\n\rDSKSIZ:$") ; *DEBUG*
|
||||
LD A,CH_CMD_DSKSIZ ; DISK SIZE COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
CALL CH_POLL ; WAIT FOR RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $14 ; SUCCESS?
|
||||
JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR
|
||||
CALL CH_CMD_RD ; SEND READ USB DATA CMD
|
||||
CALL CH_RD ; GET RD DATA LEN
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $08 ; MAKE SURE IT IS 8
|
||||
JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR
|
||||
LD A,CHUSB_MEDCAP ; MEDIA CAPACITY OFFSET
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
PUSH HL ; SAVE ADDRESS
|
||||
CALL CH_RD
|
||||
LD D,A
|
||||
CALL CH_RD
|
||||
LD E,A
|
||||
CALL CH_RD
|
||||
LD H,A
|
||||
CALL CH_RD
|
||||
LD L,A
|
||||
CALL CH_RD
|
||||
CALL CH_RD
|
||||
CALL CH_RD
|
||||
CALL CH_RD
|
||||
POP BC ; RECOVER ADDRESS TO BC
|
||||
CALL ST32 ; STORE IT
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND DONE
|
||||
;
|
||||
#IF FALSE
|
||||
;
|
||||
; PERFORM DISK INQUIRY
|
||||
; BASICALLY THE SCSI INQUIRY COMMAND
|
||||
;
|
||||
CHUSB_DSKINQ:
|
||||
;PRTS("\n\rINQUIRY:$") ; *DEBUG*
|
||||
LD A,CH_CMD_DSKINQ ; DISK QUERY
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_POLL ; WAIT FOR RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $14 ; SUCCESS?
|
||||
RET NZ ; ABORT IF NOT
|
||||
CALL CH_CMD_RD ; SEND READ COMMAND
|
||||
CALL CH_RD ; GET LENGTH
|
||||
LD B,A ; LOOP COUNTER
|
||||
LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA
|
||||
DSKINQ1:
|
||||
CALL CH_RD ; GET A BYTE
|
||||
LD (HL),A ; SAVE IT
|
||||
INC HL ; BUMP BUF PTR
|
||||
DJNZ DSKINQ1 ; LOOP FOR ALL DATA
|
||||
;
|
||||
;LD DE,HB_WRKBUF ; *DEBUG*
|
||||
;CALL DUMP_BUFFER ; *DEBUG*
|
||||
;
|
||||
;CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX
|
||||
;LD HL,HB_WRKBUF + 8
|
||||
;LD B,28
|
||||
DSKINQ2:
|
||||
;LD A,(HL)
|
||||
;INC HL
|
||||
;CALL COUT
|
||||
;DJNZ DSKINQ2
|
||||
;
|
||||
RET
|
||||
;
|
||||
; PERFORM SET RETRIES
|
||||
;
|
||||
CHUSB_SETRETRY:
|
||||
;PRTS("\n\rSETRETRY:$") ; *DEBUG*
|
||||
LD A,CH_CMD_SETRETRY ; DISK READY
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_NAP
|
||||
LD A,$25 ; CONSTANT
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_NAP
|
||||
LD A,$BF ; MAX
|
||||
CALL CH_WR
|
||||
CALL CH_NAP
|
||||
CALL CH_RD ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
;
|
||||
RET
|
||||
;
|
||||
; PERFORM DISK RESET
|
||||
;
|
||||
CHUSB_DSKRES:
|
||||
;PRTS("\n\rDSKRES:$") ; *DEBUG*
|
||||
LD A,CH_CMD_DSKRES ; DISK READY
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_POLL ; WAIT FOR RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
;
|
||||
RET
|
||||
;
|
||||
; PERFORM DISK READY
|
||||
;
|
||||
CHUSB_DSKRDY:
|
||||
;PRTS("\n\rDSKRDY:$") ; *DEBUG*
|
||||
LD A,CH_CMD_DSKRDY ; DISK READY
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_POLL ; WAIT FOR RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $14 ; *DEBUG*
|
||||
JR NZ,CHUSB_DSKRDY ; *DEBUG*
|
||||
;
|
||||
RET
|
||||
;
|
||||
; PERFORM AUTO SETUP
|
||||
;
|
||||
CHUSB_AUTOSET:
|
||||
;PRTS("\n\rAUTOSET:$") ; *DEBUG*
|
||||
LD A,CH_CMD_AUTOSET ; AUTOMATIC SETUP FOR USB
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL LDELAY ; *DEBUG*
|
||||
CALL CH_POLL ; WAIT FOR RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
;
|
||||
RET
|
||||
;
|
||||
; PERFORM TEST CONNECT
|
||||
;
|
||||
CHUSB_TSTCON:
|
||||
;PRTS("\n\rTSTCON:$") ; *DEBUG*
|
||||
LD A,CH_CMD_TSTCON ; TEST USB DEVICE CONNECT
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_NAP ; WAIT A BIT
|
||||
CALL CH_RD ; GET RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
;
|
||||
RET
|
||||
;
|
||||
; PERFORM GET MAX LUN
|
||||
;
|
||||
CHUSB_MAXLUN:
|
||||
;PRTS("\n\rMAXLUN:$") ; *DEBUG*
|
||||
LD A,CH_CMD_MAXLUN ; TEST USB DEVICE CONNECT
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_NAP ; WAIT A BIT
|
||||
LD A,$38 ; CONSTANT
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_NAP
|
||||
CALL CH_RD ; GET RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
;
|
||||
RET
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
; ERROR HANDLERS
|
||||
;
|
||||
;
|
||||
CHUSB_NOMEDIA:
|
||||
LD A,CHUSB_STNOMEDIA
|
||||
JR CHUSB_ERR
|
||||
;
|
||||
CHUSB_CMDERR:
|
||||
LD A,CHUSB_STCMDERR
|
||||
JR CHUSB_ERR
|
||||
;
|
||||
CHUSB_IOERR:
|
||||
LD A,CHUSB_STIOERR
|
||||
JR CHUSB_ERR
|
||||
;
|
||||
CHUSB_TO:
|
||||
LD A,CHUSB_STTO
|
||||
JR CHUSB_ERR
|
||||
;
|
||||
CHUSB_NOTSUP:
|
||||
LD A,CHUSB_STNOTSUP
|
||||
JR CHUSB_ERR
|
||||
;
|
||||
CHUSB_ERR:
|
||||
LD (IY+CHUSB_STAT),A ; SAVE NEW STATUS
|
||||
;
|
||||
CHUSB_ERR2:
|
||||
#IF (CHUSBTRACE >= 2)
|
||||
CALL CHUSB_PRTSTAT
|
||||
#ENDIF
|
||||
OR A ; SET FLAGS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_PRTERR:
|
||||
RET Z ; DONE IF NO ERRORS
|
||||
; FALL THRU TO CHUSB_PRTSTAT
|
||||
;
|
||||
; PRINT FULL DEVICE STATUS LINE
|
||||
;
|
||||
CHUSB_PRTSTAT:
|
||||
PUSH AF
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD A,(IY+CHUSB_STAT)
|
||||
CALL CHUSB_PRTPREFIX ; PRINT UNIT PREFIX
|
||||
CALL PC_SPACE ; FORMATTING
|
||||
CALL CHUSB_PRTSTATSTR
|
||||
POP HL
|
||||
POP DE
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; PRINT STATUS STRING
|
||||
;
|
||||
CHUSB_PRTSTATSTR:
|
||||
PUSH AF
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD A,(IY+CHUSB_STAT)
|
||||
NEG
|
||||
LD HL,CHUSB_STR_ST_MAP
|
||||
ADD A,A
|
||||
CALL ADDHLA
|
||||
LD E,(HL)
|
||||
INC HL
|
||||
LD D,(HL)
|
||||
CALL WRITESTR
|
||||
POP HL
|
||||
POP DE
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; PRINT DIAGNONSTIC PREFIX
|
||||
;
|
||||
CHUSB_PRTPREFIX:
|
||||
PUSH AF
|
||||
CALL NEWLINE
|
||||
PRTS("CHUSB$")
|
||||
LD A,(IY+CH_DEV) ; GET CURRENT DEVICE NUM
|
||||
CALL PRTDECB
|
||||
CALL PC_COLON
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; DATA STORAGE
|
||||
;
|
||||
CHUSB_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT
|
||||
CHUSB_DSKBUF .DW 0
|
||||
;
|
||||
CHUSB_STR_ST_MAP:
|
||||
.DW CHUSB_STR_STOK
|
||||
.DW CHUSB_STR_STNOMEDIA
|
||||
.DW CHUSB_STR_STCMDERR
|
||||
.DW CHUSB_STR_STIOERR
|
||||
.DW CHUSB_STR_STTO
|
||||
.DW CHUSB_STR_STNOTSUP
|
||||
;
|
||||
CHUSB_STR_STOK .TEXT "OK$"
|
||||
CHUSB_STR_STNOMEDIA .TEXT "NO MEDIA$"
|
||||
CHUSB_STR_STCMDERR .TEXT "COMMAND ERROR$"
|
||||
CHUSB_STR_STIOERR .TEXT "IO ERROR$"
|
||||
CHUSB_STR_STTO .TEXT "TIMEOUT$"
|
||||
CHUSB_STR_STNOTSUP .TEXT "NOT SUPPORTED$"
|
||||
CHUSB_STR_STUNK .TEXT "UNKNOWN ERROR$"
|
||||
@@ -162,7 +162,9 @@ CTCTIVT .EQU INT_CTC0A + CTCTIMCH
|
||||
;==================================================================================================
|
||||
;
|
||||
CTC_PREINIT:
|
||||
; BLINDLY RESET THE CTC ASSUMING IT IS THERE
|
||||
; BLINDLY RESET THE CTC ASSUMING IT IS THERE. PER ALAN COX
|
||||
; THE CTC CONFIGURATION IS UNDEFINED AT STARTUP. THIS SHOULD
|
||||
; PRECLUDE POSSIBLE EXTRANEOUS INTERRUPTS.
|
||||
LD A,CTC_DEFCFG
|
||||
OUT (CTCBASE),A
|
||||
OUT (CTCBASE+1),A
|
||||
|
||||
@@ -208,6 +208,11 @@ CVDU_VDASAT:
|
||||
RET
|
||||
|
||||
CVDU_VDASCO:
|
||||
; WE HANDLE ONLY PER-CHARACTER COLORS (D=0)
|
||||
LD A,D ; GET CHAR/SCREEN SCOPE
|
||||
OR A ; CHARACTER?
|
||||
JR NZ,CVDU_VDASCO_Z ; IF NOT, JUST RETURN
|
||||
|
||||
; INCOMING IS: IBGRIBGR (I=INTENSITY, B=BLUE, G=GREEN, R=RED)
|
||||
; TRANSFORM TO: ----RGBI (DISCARD BACKGROUND COLOR IN HIGH NIBBLE)
|
||||
XOR A ; CLEAR A
|
||||
@@ -221,6 +226,7 @@ CVDU_VDASCO1:
|
||||
AND %11110000 ; CLEAR OUT OLD COLOR BITS
|
||||
OR E ; STUFF IN THE NEW ONES
|
||||
LD (CVDU_ATTR),A ; AND SAVE THE RESULT
|
||||
CVDU_VDASCO_Z:
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
|
||||
@@ -1729,20 +1729,27 @@ DSKY_PUTLED:
|
||||
RET
|
||||
;
|
||||
DSKY_HIGHLIGHTFWDKEYS:
|
||||
LD HL,DSKY_HIGHLIGHTFWDKEYLEDS
|
||||
JR DSKY_PUTLED
|
||||
LD DE,DSKY_HIGHLIGHTFWDKEYLEDS
|
||||
JR DSKY_HIGHLIGHT
|
||||
;
|
||||
DSKY_HIGHLIGHTCMDKEYS:
|
||||
LD HL,DSKY_HIGHLIGHTCMDKEYLEDS
|
||||
JR DSKY_PUTLED
|
||||
LD DE,DSKY_HIGHLIGHTCMDKEYLEDS
|
||||
JR DSKY_HIGHLIGHT
|
||||
;
|
||||
DSKY_HIGHLIGHTNUMKEYS:
|
||||
LD HL,DSKY_HIGHLIGHTNUMKEYLEDS
|
||||
JR DSKY_PUTLED
|
||||
LD DE,DSKY_HIGHLIGHTNUMKEYLEDS
|
||||
JR DSKY_HIGHLIGHT
|
||||
;
|
||||
DSKY_HIGHLIGHTKEYSOFF:
|
||||
LD HL,DSKY_HIGHLIGHTKEYLEDSOFF
|
||||
JR DSKY_PUTLED
|
||||
LD DE,DSKY_HIGHLIGHTKEYLEDSOFF
|
||||
JR DSKY_HIGHLIGHT
|
||||
;
|
||||
DSKY_HIGHLIGHT:
|
||||
PUSH HL
|
||||
EX DE,HL
|
||||
CALL DSKY_PUTLED
|
||||
POP HL
|
||||
RET
|
||||
;
|
||||
DSKY_HIGHLIGHTFWDKEYLEDS .DB $00,$00,$00,$30,$00,$00,$00,$00
|
||||
DSKY_HIGHLIGHTCMDKEYLEDS .DB $20,$00,$20,$3F,$00,$00,$00,$00
|
||||
|
||||
@@ -279,8 +279,7 @@ DS1501RTC_GETBYT:
|
||||
LD E,A
|
||||
;
|
||||
; Return success
|
||||
XOR
|
||||
;
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
; RTC Set Byte
|
||||
|
||||
@@ -189,8 +189,13 @@ GDC_VDASAT: ; SET ATTRIBUTES
|
||||
RET
|
||||
|
||||
GDC_VDASCO: ; SET COLOR
|
||||
; WE HANDLE ONLY PER-CHARACTER COLORS (D=0)
|
||||
LD A,D ; GET CHAR/SCREEN SCOPE
|
||||
OR A ; CHARACTER?
|
||||
JR NZ,GDC_VDASCO_Z ; IF NOT, JUST RETURN
|
||||
LD A,E ; GET THE INCOMING COLOR
|
||||
LD (GDC_COLOR),A ; AND SAVE FOR LATER
|
||||
GDC_VDASCO_Z:
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
|
||||
@@ -92,12 +92,13 @@ MODCNT .SET MODCNT + 1
|
||||
;
|
||||
;
|
||||
;
|
||||
#DEFINE ALIGN(N) .FILL ((($+(N-1)) & ~(N-1)) - $)
|
||||
;
|
||||
#IF (FPLED_ENABLE)
|
||||
#DEFINE DIAG(N) PUSH AF
|
||||
#DEFCONT \ LD A,N
|
||||
; #DEFCONT \ OUT (DIAGPORT),A
|
||||
#DEFINE DIAG(N) PUSH AF
|
||||
#DEFCONT \ LD A,N
|
||||
#DEFCONT \ CALL FP_SETLEDS
|
||||
#DEFCONT \ POP AF
|
||||
#DEFCONT \ POP AF
|
||||
#ELSE
|
||||
#DEFINE DIAG(N) \;
|
||||
#ENDIF
|
||||
@@ -130,30 +131,30 @@ MODCNT .SET MODCNT + 1
|
||||
#ENDIF
|
||||
;
|
||||
#DEFINE SYSCHKERR(HB_ERR) \
|
||||
#DEFCONT \ CALL SYSCHKA
|
||||
#DEFCONT \ LD A,HB_ERR
|
||||
#DEFCONT \ OR A
|
||||
#DEFCONT \ CALL SYSCHKA
|
||||
#DEFCONT \ LD A,HB_ERR
|
||||
#DEFCONT \ OR A
|
||||
;
|
||||
;
|
||||
;
|
||||
#IF (INTMODE == 0)
|
||||
; NO INTERRUPT HANDLING
|
||||
#DEFINE HB_DI ;
|
||||
#DEFINE HB_EI ;
|
||||
; NO INTERRUPT HANDLING
|
||||
#DEFINE HB_DI ;
|
||||
#DEFINE HB_EI ;
|
||||
#ELSE
|
||||
#IF (CPUFAM == CPU_Z280)
|
||||
#IF (INTMODE == 3)
|
||||
; Z280 MODE 3 INTERRUPT HANDLING (INTA, C/T 0, & UART RCVR ENABLED)
|
||||
#DEFINE HB_DI DI
|
||||
#DEFINE HB_EI EI $0B
|
||||
; Z280 MODE 3 INTERRUPT HANDLING (INTA, C/T 0, & UART RCVR ENABLED)
|
||||
#DEFINE HB_DI DI
|
||||
#DEFINE HB_EI EI $0B
|
||||
#ELSE
|
||||
; Z280 MODE 1/2 INTERRUPT HANDLING
|
||||
#DEFINE HB_DI DI
|
||||
#DEFINE HB_EI EI
|
||||
; Z280 MODE 1/2 INTERRUPT HANDLING
|
||||
#DEFINE HB_DI DI
|
||||
#DEFINE HB_EI EI
|
||||
#ENDIF
|
||||
#ELSE
|
||||
#DEFINE HB_DI DI
|
||||
#DEFINE HB_EI EI
|
||||
#DEFINE HB_DI DI
|
||||
#DEFINE HB_EI EI
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
@@ -1179,6 +1180,9 @@ BOOTWAIT:
|
||||
#IF (FPLED_ENABLE)
|
||||
; NO STACK YET, SO CAN'T USE DIAG() MACRO
|
||||
LD A,DIAG_01
|
||||
#IF (FPLED_INV)
|
||||
XOR $FF ; INVERT BITS IF NEEDED
|
||||
#ENDIF
|
||||
OUT (FPLED_IO),A
|
||||
#ENDIF
|
||||
#IF (LEDENABLE)
|
||||
@@ -1245,10 +1249,8 @@ BOOTWAIT:
|
||||
;
|
||||
JR Z280_INITZ ; JUMP TO CODE CONTINUATION
|
||||
;
|
||||
#IF (($ % 2) == 1)
|
||||
; WORD ALIGN THE TABLE
|
||||
.DB 0
|
||||
#ENDIF
|
||||
; WORD ALIGN THE PDR TABLE
|
||||
ALIGN(2)
|
||||
;
|
||||
Z280_BOOTPDRTBL:
|
||||
; LOWER 32 K (BANKED)
|
||||
@@ -1391,6 +1393,9 @@ Z280_INITZ:
|
||||
#IF (FPLED_ENABLE)
|
||||
; NO STACK YET, SO CAN'T USE DIAG() MACRO
|
||||
LD A,DIAG_02
|
||||
#IF (FPLED_INV)
|
||||
XOR $FF ; INVERT BITS IF NEEDED
|
||||
#ENDIF
|
||||
OUT (FPLED_IO),A
|
||||
#ENDIF
|
||||
|
||||
@@ -2094,6 +2099,15 @@ HB_CPU2:
|
||||
HB_CPU3:
|
||||
#ENDIF
|
||||
;
|
||||
#IF (CPUFAM == CPU_Z280)
|
||||
;
|
||||
; Z280 ALWAYS HALVES THE INPUT OSCILLATOR TO DERIVE
|
||||
; ACTUAL CPU SPEED.
|
||||
; ADJUST HL TO REFLECT HALF SPEED OPERATION
|
||||
SRL H ; ADJUST HL ASSUMING
|
||||
RR L ; HALF SPEED OPERATION
|
||||
#ENDIF
|
||||
;
|
||||
; HL SHOULD NOW HAVE FINAL CPU RUNNING SPEED IN KHZ.
|
||||
; UPDATE CB_CPUMHZ/CB_CPUKHZ WITH THIS VALUE.
|
||||
;
|
||||
@@ -5223,12 +5237,12 @@ SYS_INTSET1:
|
||||
; HERE IN AN EFFORT TO MINIMIZE WASTED SPACE. THERE SHOULD BE
|
||||
; A LITTLE LESS THAN 4K OF CODE ABOVE.
|
||||
;
|
||||
Z280_IVT_SLACK .EQU $1000 - ($ & $FFF)
|
||||
.ECHO "Z280 IVT SLACK occupies "
|
||||
.ECHO Z280_IVT_SLACK
|
||||
.ECHO " bytes.\n"
|
||||
;.FILL $1000 - ($ & $FFF) ; MUST BE 4K ALIGNED!
|
||||
.FILL Z280_IVT_SLACK ; MUST BE 4K ALIGNED!
|
||||
Z280_IVT_SLACK_ORG .EQU $
|
||||
ALIGN($1000)
|
||||
Z280_IVT_SLACK .EQU $ - Z280_IVT_SLACK_ORG
|
||||
.ECHO "Z280 IVT SLACK occupies "
|
||||
.ECHO Z280_IVT_SLACK
|
||||
.ECHO " bytes.\n"
|
||||
;
|
||||
Z280_IVT:
|
||||
.DW 0, 0 ; RESERVED
|
||||
@@ -6817,6 +6831,9 @@ FP_SETLEDS:
|
||||
OR A ; SET FLAGS
|
||||
LD A,L ; RESTORE REG A
|
||||
JR Z,FP_SETLEDS1 ; BAIL OUT IF NOT ACTIVE
|
||||
#IF (FPLED_INV)
|
||||
XOR $FF ; INVERT BITS IF NEEDED
|
||||
#ENDIF
|
||||
OUT (FPLED_IO),A ; WRITE
|
||||
FP_SETLEDS1:
|
||||
POP HL ; RESTORE HL
|
||||
@@ -6834,6 +6851,9 @@ FP_GETSWITCHES:
|
||||
OR A ; SET FLAGS
|
||||
RET Z ; BAIL OUT IF NOT ACTIVE
|
||||
IN A,(FPSW_IO) ; READ SWITCHES
|
||||
#IF (FPSW_INV)
|
||||
XOR $FF ; INVERT BITS IF NEEDED
|
||||
#ENDIF
|
||||
RET ; DONE
|
||||
;
|
||||
;
|
||||
@@ -7865,8 +7885,9 @@ HB_WRKBUF .FILL 512,0 ; INTERNAL DISK BUFFER
|
||||
;
|
||||
#IFDEF MG014_MAP
|
||||
;
|
||||
.FILL 32 - ($ & (32 - 1)) ; ALIGN TO 32 BYTE BOUNDARY
|
||||
|
||||
; ALIGN TO 32 BYTE BOUNDARY
|
||||
ALIGN($20)
|
||||
;
|
||||
MG014_STATMAPLO:
|
||||
; LOWER NIBBLE
|
||||
.DB $08 ; 00
|
||||
|
||||
@@ -24,12 +24,9 @@
|
||||
;
|
||||
; Print all desired config values...
|
||||
;
|
||||
#if (ROMSIZE > 0)
|
||||
prtval("ROMSIZE$", ROMSIZE)
|
||||
#else
|
||||
prtval("ROMSIZE$", RAMSIZE)
|
||||
#endif
|
||||
prtval("CPUFAM$", CPUFAM)
|
||||
prtval("ROMSIZE$", ROMSIZE)
|
||||
prtval("RAMSIZE$", RAMSIZE)
|
||||
;
|
||||
ret
|
||||
;
|
||||
|
||||
@@ -140,7 +140,7 @@ PKD_INIT:
|
||||
LD A,PKDPPIBASE ; GET BASE PORT
|
||||
CALL PRTHEXBYTE ; PRINT BASE PORT
|
||||
;
|
||||
LD A,(PKD_PRESENT) ; PRESENT?
|
||||
LD A,(PKD_PRESENT) ; PRESENT?
|
||||
OR A ; SET FLAGS
|
||||
RET NZ ; YES, ALL DONE
|
||||
PRTS(" NOT PRESENT$") ; NOT PRESENT
|
||||
|
||||
@@ -250,7 +250,7 @@ PPP_FWVER .DB $00, $00, $00, $00 ; MMNNBBB (M=MAJOR, N=MINOR, B=BUILD)
|
||||
; PARPORTPROP CONSOLE DRIVER
|
||||
;==================================================================================================
|
||||
;
|
||||
PPPCON_ROWS .EQU 37 ; PROPELLER VGA DISPLAY ROWS (40 - 3 STATUS LINES)
|
||||
PPPCON_ROWS .EQU 29 ; PROPELLER VGA DISPLAY ROWS (30 - 1 STATUS LINES)
|
||||
PPPCON_COLS .EQU 80 ; PROPELLER VGA DISPLAY COLS
|
||||
;
|
||||
.ECHO "PPPCON: ENABLED\n"
|
||||
|
||||
@@ -121,7 +121,7 @@ PRPCON_ERR .EQU $40 ; BIT SET WHEN PROPIO CONSOLE ERROR HAS OCCURRED
|
||||
PRPCON_KBDRDY .EQU $20 ; BIT SET WHEN KEYBOARD BUF HAS A BYTE READY (BUF FULL)
|
||||
PRPCON_DSPRDY .EQU $10 ; BIT SET WHEN DISPLAY BUF IS READY FOR A BYTE (BUF EMPTY)
|
||||
;
|
||||
PRPCON_ROWS .EQU 37 ; PROPELLER VGA DISPLAY ROWS (40 - 3 STATUS LINES)
|
||||
PRPCON_ROWS .EQU 29 ; PROPELLER VGA DISPLAY ROWS (30 - 1 STATUS LINES)
|
||||
PRPCON_COLS .EQU 80 ; PROPELLER VGA DISPLAY COLS
|
||||
;
|
||||
.ECHO "PRPCON: ENABLED\n"
|
||||
|
||||
@@ -1383,8 +1383,6 @@ str_s100con .db "\r\n\r\nConsole on S100 Bus",0
|
||||
clrled:
|
||||
#if (BIOS == BIOS_WBW)
|
||||
#if (FPLED_ENABLE)
|
||||
;xor a ; zero accum
|
||||
;out (FPLED_IO),a ; clear diag leds
|
||||
ld b,BF_SYSSET ; HBIOS SysGet
|
||||
ld c,BF_SYSSET_PANEL ; ... Panel swiches value
|
||||
ld l,$00 ; all LEDs off
|
||||
|
||||
@@ -422,6 +422,39 @@ SER_1843200_8N1 .EQU SER_BAUD1843200 | SER_DATA8 | SER_PARNONE | SER_STOP1
|
||||
SER_3686400_8N1 .EQU SER_BAUD3686400 | SER_DATA8 | SER_PARNONE | SER_STOP1
|
||||
SER_7372800_8N1 .EQU SER_BAUD7372800 | SER_DATA8 | SER_PARNONE | SER_STOP1
|
||||
;
|
||||
SER_75_8N2 .EQU SER_BAUD75 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_150_8N2 .EQU SER_BAUD150 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_300_8N2 .EQU SER_BAUD300 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_600_8N2 .EQU SER_BAUD600 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_1200_8N2 .EQU SER_BAUD1200 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_2400_8N2 .EQU SER_BAUD2400 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_4800_8N2 .EQU SER_BAUD4800 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_9600_8N2 .EQU SER_BAUD9600 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_19200_8N2 .EQU SER_BAUD19200 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_38400_8N2 .EQU SER_BAUD38400 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_76800_8N2 .EQU SER_BAUD76800 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_153600_8N2 .EQU SER_BAUD153600 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_307200_8N2 .EQU SER_BAUD307200 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_614400_8N2 .EQU SER_BAUD614400 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_1228800_8N2 .EQU SER_BAUD1228800 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_2457600_8N2 .EQU SER_BAUD2457600 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_225_8N2 .EQU SER_BAUD225 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_450_8N2 .EQU SER_BAUD450 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_900_8N2 .EQU SER_BAUD900 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_1800_8N2 .EQU SER_BAUD1800 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_3600_8N2 .EQU SER_BAUD3600 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_7200_8N2 .EQU SER_BAUD7200 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_14400_8N2 .EQU SER_BAUD14400 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_28800_8N2 .EQU SER_BAUD28800 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_57600_8N2 .EQU SER_BAUD57600 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_115200_8N2 .EQU SER_BAUD115200 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_230400_8N2 .EQU SER_BAUD230400 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_460800_8N2 .EQU SER_BAUD460800 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_921600_8N2 .EQU SER_BAUD921600 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_1843200_8N2 .EQU SER_BAUD1843200 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_3686400_8N2 .EQU SER_BAUD3686400 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
SER_7372800_8N2 .EQU SER_BAUD7372800 | SER_DATA8 | SER_PARNONE | SER_STOP2
|
||||
;
|
||||
; TERMENABLE CONTROLS INCLUSION OF TERMINAL PSEUDO-DEVICE DRIVER
|
||||
; IT IS SET TO TRUE BY THE INCLUSION OF ANY VDA DRIVER.
|
||||
;
|
||||
|
||||
@@ -201,7 +201,7 @@ TMS_INIT:
|
||||
#IF (TMSMODE == TMSMODE_MSX)
|
||||
PRTS("MSX$")
|
||||
#ENDIF
|
||||
#IF (TMSMODE == TMSMODE_COLECO) ; ### JLC Mod for completeness ###
|
||||
#IF (TMSMODE == TMSMODE_COLECO)
|
||||
PRTS("COLECO$")
|
||||
#ENDIF
|
||||
#IF (TMSMODE == TMSMODE_MSXKBD)
|
||||
@@ -215,7 +215,6 @@ TMS_INIT:
|
||||
LD A,TMS_DATREG
|
||||
CALL PRTHEXBYTE
|
||||
CALL TMS_PROBE ; CHECK FOR HW EXISTENCE
|
||||
;JP TMS_INIT1 ; ### JLC DEBUG: ALLWAYS CONTINUE ###
|
||||
JR Z,TMS_INIT1 ; CONTINUE IF PRESENT
|
||||
;
|
||||
; *** HARDWARE NOT PRESENT ***
|
||||
@@ -370,7 +369,40 @@ TMS_VDASAT:
|
||||
RET
|
||||
|
||||
TMS_VDASCO:
|
||||
XOR A ; NOT POSSIBLE, JUST SIGNAL SUCCESS
|
||||
; ### JLC Mod - Implement Default Text Mode Colors via ANSI_VDASCO or direct HBIOS Call
|
||||
;
|
||||
; Color setting is in reg D in ANSI Format as described in RomWBW System Guide
|
||||
; Convert Color Format from ANSI to TMS shuffling bits arround and using
|
||||
; Color Conversion Table at TMS_COLOR_TBL (approximated equivalences)
|
||||
; Save converted value to (TMS_TMSCOLOR)
|
||||
;
|
||||
; TMS hardware only allows setting a global (screen) foreground/background color. So, we
|
||||
; only process this command if E is 1.
|
||||
;
|
||||
LD A,D ; GET CHAR/SCREEN SCOPE
|
||||
CP 1 ; SCREEN?
|
||||
JR NZ,TMS_VDASCO_Z ; IF NOT, JUST RETURN
|
||||
;
|
||||
LD A,E ; GET COLOR BYTE
|
||||
AND $F0 ; ISOLATE BACKGROUND
|
||||
RRCA \ RRCA \ RRCA \ RRCA ; MOVE TO LOWER NIBBLE
|
||||
LD HL,TMS_COLOR_TBL ; POINT TO COLOR CONVERSION TABLE
|
||||
CALL ADDHLA ; OFFSET TO DESIRED COLOR
|
||||
LD B,(HL) ; PUT NEW BG IN B
|
||||
;
|
||||
LD A,E ; GET COLOR BYTE
|
||||
AND $0F ; ISOLATE FOREGROUND
|
||||
LD HL,TMS_COLOR_TBL ; POINT TO COLOR CONVERSION TABLE
|
||||
CALL ADDHLA ; OFFSET TO DESIRED COLOR
|
||||
LD A,(HL) ; PUT NEW FG IN A
|
||||
RLCA \ RLCA \ RLCA \ RLCA ; MOVE TO UPPER NIBBLE
|
||||
;
|
||||
OR B ; COMBINE WITH FG
|
||||
LD C, 7 ; C = Color Register, A = Desired new Color in TMS Format
|
||||
CALL TMS_SET ; Write to specific TMS Register, Change Default Text Color
|
||||
;
|
||||
TMS_VDASCO_Z:
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
TMS_VDAWRC:
|
||||
@@ -558,7 +590,7 @@ TMS_CRTINIT:
|
||||
LD HL,0
|
||||
CALL TMS_WR
|
||||
;
|
||||
; FILL ENTIRE 16KB VRAM CONTENTS with $00 ### JLC Comment fix ###
|
||||
; FILL ENTIRE 16KB VRAM CONTENTS with $00
|
||||
LD DE,$4000 ; 16KB
|
||||
TMS_CRTINIT1:
|
||||
XOR A
|
||||
@@ -614,7 +646,7 @@ TMS_LOADFONT:
|
||||
#ENDIF
|
||||
;
|
||||
; FILL TMS_FNTVADDR BYTES FROM FONTDATA
|
||||
LD DE,TMS_FNTSIZE ; ### JLC Mod for JBL compatibility ###
|
||||
LD DE,TMS_FNTSIZE
|
||||
TMS_LOADFONT1:
|
||||
LD A,(HL)
|
||||
OUT (TMS_DATREG),A
|
||||
@@ -738,7 +770,6 @@ TMS_XY2IDX:
|
||||
CALL MULT8 ; MULTIPLY TO GET ROW OFFSET
|
||||
LD E,A ; GET COLUMN BACK
|
||||
ADD HL,DE ; ADD IT IN
|
||||
; ### JLC Fix to allow Name Table Addresses other than $0000 and JBL Compatibility ###
|
||||
LD DE,TMS_CHRVADDR ; Add offset Address to start of Name Table (Char)
|
||||
ADD HL,DE
|
||||
RET ; RETURN
|
||||
@@ -787,7 +818,6 @@ TMS_FILL1:
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
TMS_SCROLL:
|
||||
; ### JLC Fix to allow Name Table Addresses other than $0000 and JBL Compatibility ###
|
||||
LD HL,TMS_CHRVADDR ; SOURCE ADDRESS OF CHARACTER BUFFER
|
||||
LD C,TMS_ROWS - 1 ; SET UP LOOP COUNTER FOR ROWS - 1
|
||||
;
|
||||
@@ -839,7 +869,6 @@ TMS_SCROLL3:
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
TMS_RSCROLL:
|
||||
; ### JLC Fix to allow Name Table Addresses other than $0000 and JBL Compatibility ###
|
||||
LD HL,TMS_COLS * (TMS_ROWS - 1)
|
||||
LD DE,TMS_CHRVADDR ; Add offset Address to start of Name Table (Char)
|
||||
ADD HL,DE
|
||||
@@ -980,10 +1009,13 @@ TMS_INTHNDL:
|
||||
; TMS DRIVER - DATA
|
||||
;==================================================================================================
|
||||
;
|
||||
TMS_POS .DW 0 ; CURRENT DISPLAY POSITION
|
||||
TMS_POS .DW 0 ; CURRENT DISPLAY POSITION
|
||||
TMS_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR
|
||||
TMS_BUF .FILL 256,0 ; COPY BUFFER
|
||||
|
||||
;
|
||||
; ### JLC Mod
|
||||
; ANSI-->TMS Color Conversion Table
|
||||
TMS_COLOR_TBL .DB $01,$08,$02,$0A,$04,$06,$0C,$0F,$0E,$09,$03,$0B,$05,$0D,$07,$0F
|
||||
;
|
||||
;==================================================================================================
|
||||
; TMS DRIVER - INSTANCE DATA
|
||||
@@ -1055,6 +1087,10 @@ TMS_IDAT:
|
||||
; https://www.msx.org/wiki/Screen_Modes_Description#SCREEN_0_in_80-column_.28Text_mode_2.29
|
||||
; BITS 1-0 SHOULD BE 1. BITS 8-2 SHOULD BE (ADR >> 8).
|
||||
;
|
||||
; ### JLC Mod
|
||||
; TEXT MODE DEFAULT COLOR (REG 7) CAN BE CHANGED INVOKING VDASCO
|
||||
; OR VIA ANSI PRIVATE ESC SEQ. (SEE ANSI.ASM FOR DETAILS)
|
||||
;
|
||||
TMS_INITVDU: ; V9958 REGISTER SET
|
||||
.DB $04 ; REG 0 - NO EXTERNAL VID, SET M4 = 1 FOR 80 COLS
|
||||
TMS_INITVDU_REG_1:
|
||||
@@ -1069,7 +1105,7 @@ TMS_INITVDU_REG_1:
|
||||
.DB $00 ; REG 9
|
||||
.DB $00 ; REG 10 - COLOUR TABLE A14-A16 (TMS_FNTVADDR - $1000)
|
||||
;
|
||||
#ELSE ; _______TMS9918 REGISTER SET ### JLC Mod for JBL compatibility & MODE II Readiness ###_______
|
||||
#ELSE ; _______TMS9918 REGISTER SET_______
|
||||
;
|
||||
TMS_INITVDU: ; V9918 REGISTER SET
|
||||
.DB $00 ; REG 0 - SET TEXT MODE, NO EXTERNAL VID
|
||||
@@ -1080,18 +1116,7 @@ TMS_INITVDU_REG_1:
|
||||
.DB $00 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $0000)
|
||||
.DB $76 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT, SET TO MODE II DEFAULT VALUE
|
||||
.DB $03 ; REG 6 - NO SPRITE GENERATOR TABLE, SET TO MODE II DEFAULT VALUE
|
||||
.DB $E1 ; REG 7 - GREY ON BLACK ### JLC Mod Change default text color for better readability YMMV ###
|
||||
;
|
||||
;TMS_INITVDU:
|
||||
; .DB $00 ; REG 0 - NO EXTERNAL VID
|
||||
;TMS_INITVDU_REG_1:
|
||||
; .DB $50 ; REG 1 - ENABLE SCREEN, SET TEXT MODE & BLANK SCREEN ### JLC comment fix (NOT MODE 1) ###
|
||||
; .DB $00 ; REG 2 - PATTERN NAME TABLE := 0
|
||||
; .DB $00 ; REG 3 - NO COLOR TABLE
|
||||
; .DB $01 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $0800)
|
||||
; .DB $00 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT
|
||||
; .DB $00 ; REG 6 - NO SPRITE GENERATOR TABLE
|
||||
; .DB $F0 ; REG 7 - WHITE ON TRANSPARENT
|
||||
.DB $E1 ; REG 7 - TEXT COLOR
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
@@ -1101,3 +1126,29 @@ TMS_INITVDULEN .EQU $ - TMS_INITVDU
|
||||
#IF (CPUFAM == CPU_Z180)
|
||||
TMS_DCNTL .DB $00 ; SAVE Z180 DCNTL AS NEEDED
|
||||
#ENDIF
|
||||
;
|
||||
; ### JLC Mod
|
||||
;===============================================================================
|
||||
; BASIC ANSI to TMS COLOR CONVERSION TABLE (NIBBLES FOR FOREGROUND & BACKGROUND)
|
||||
; Follows RomWBW System Guide Chapter 8, HBIOS Reference
|
||||
;-------------------------------------------------------------------------------
|
||||
; ANSI Color TMS Equivalent
|
||||
;-------------------------------------------------------------------------------
|
||||
; 0 Black 1
|
||||
; 1 Red 8
|
||||
; 2 Green 2
|
||||
; 3 Brown A
|
||||
; 4 Blue 4
|
||||
; 5 Magenta 6
|
||||
; 6 Cyan C
|
||||
; 7 White F
|
||||
; 8 Gray E
|
||||
; 9 Light Red 9
|
||||
; A Light Green 3
|
||||
; B Yellow B
|
||||
; C Light Blue 5
|
||||
; D Light Magenta D
|
||||
; E Light Cyan 7
|
||||
; F Bright White F
|
||||
;===============================================================================
|
||||
;
|
||||
|
||||
@@ -216,19 +216,8 @@ UART_INIT1:
|
||||
LD A,(IY+1) ; GET UART TYPE
|
||||
OR A ; SET FLAGS
|
||||
JR Z,UART_INIT2 ; SKIP IF ZERO (NOT DETECTED)
|
||||
PUSH AF ; SAVE TYPE VALUE
|
||||
CALL UART_PRTCFG ; PRINT IF NOT ZERO
|
||||
POP AF ; RESTORE TYPE VALUE
|
||||
BIT UART_CTSBAD,A ; CTS STALL?
|
||||
JR Z,UART_INIT2 ; IF NOT, SKIP AHEAD
|
||||
CALL NEWLINE ; FORMATTING
|
||||
PRTS("UART$") ; FORMATTING
|
||||
LD A,(IY) ; DEVICE NUM
|
||||
CALL PRTDECB ; PRINT DEVICE NUM
|
||||
PRTS(": $") ; FORMATTING
|
||||
LD DE,UART_STR_BADCTS ; LOAD WARNING MESSAGE
|
||||
CALL WRITESTR ; ... AND PRINT IT
|
||||
;
|
||||
;
|
||||
UART_INIT2:
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
INC C ; NEXT UNIT
|
||||
@@ -963,6 +952,11 @@ UART_PRTCFG2:
|
||||
PRTS(" AFC$")
|
||||
;
|
||||
UART_PRTCFG3:
|
||||
BIT UART_CTSBAD,(IY+1) ; GET BADCTS BIT
|
||||
JR Z,UART_PRTCFG4
|
||||
PRTS(" NO_CTS!$")
|
||||
;
|
||||
UART_PRTCFG4:
|
||||
;
|
||||
XOR A
|
||||
RET
|
||||
@@ -1023,8 +1017,6 @@ UART_STR_16850 .DB "16850$"
|
||||
;
|
||||
UART_PAR_MAP .DB "NONENMNS"
|
||||
;
|
||||
UART_STR_BADCTS .DB "CTS STALL, HARDWARE FLOW CONTROL SUSPENDED$"
|
||||
;
|
||||
; WORKING VARIABLES
|
||||
;
|
||||
UART_DEV .DB 0 ; DEVICE NUM USED DURING INIT
|
||||
|
||||
@@ -237,6 +237,10 @@ VGA_VDASAT:
|
||||
JR VGA_VDASCO2 ; IMPLEMENT SETTING
|
||||
|
||||
VGA_VDASCO:
|
||||
; WE HANDLE ONLY PER-CHARACTER COLORS (D=0)
|
||||
LD A,D ; GET CHAR/SCREEN SCOPE
|
||||
OR A ; CHARACTER?
|
||||
JR NZ,VGA_VDASCO3 ; IF NOT, JUST RETURN
|
||||
; INCOMING IS: IBGRIBGR (I=INTENSITY, B=BLUE, G=GREEN, R=RED)
|
||||
; TRANSFORM TO: -RGBIRGB (DISCARD INTENSITY BIT IN HIGH NIBBLE)
|
||||
;
|
||||
|
||||
@@ -66,7 +66,7 @@ call BuildDisk.cmd bascomp hd wbw_hd1k || exit /b
|
||||
call BuildDisk.cmd fortran hd wbw_hd1k || exit /b
|
||||
call BuildDisk.cmd games hd wbw_hd1k || exit /b
|
||||
|
||||
if exist ..\BPBIOS\bp*.rel call BuildDisk.cmd bp hd wbw_hd1k || exit /b
|
||||
if exist ..\BPBIOS\bp*.rel call BuildDisk.cmd bp hd wbw_hd1k ..\zsdos\zsys_wbw.sys || exit /b
|
||||
|
||||
copy hd1k_prefix.dat ..\..\Binary\ || exit /b
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ blankhd1k:
|
||||
case $@ in \
|
||||
(*cpm22*) sys=../CPM22/cpm_wbw.sys;; \
|
||||
(*qpm*) sys=../QPM/qpm_wbw.sys;; \
|
||||
(*zsdos* | *nzcom* | *dos65*) sys=../ZSDOS/zsys_wbw.sys;; \
|
||||
(*zsdos* | *nzcom* | *dos65* | *bp*) sys=../ZSDOS/zsys_wbw.sys;; \
|
||||
(*cpm3*) sys=../CPM3/cpmldr.sys;; \
|
||||
(*zpm3*) sys=../ZPM3/zpmldr.sys;; \
|
||||
esac ; \
|
||||
|
||||
@@ -51,8 +51,10 @@ done to create a minimal ready-to-run setup for RomWBW:
|
||||
- Extract VT100 TCAP from Z3TCAP.LBR and saved it as TCAP.Z3T.
|
||||
- Created PROFILE.SUB to launch NZCOM at startup.
|
||||
- Created empty STARTZCM.COM.
|
||||
- TCSELECT.COM was removed because a later version is provided
|
||||
- Original TCSELECT.COM was removed and replaced with a newer version
|
||||
from the Z3 files.
|
||||
- TCAP.LBR and Z3TCAP.TCP were removed and replaced with
|
||||
Z3TCAP.LBR from new TCSELECT distribution.
|
||||
- Z3LOC.COM and LBREXT.COM were removed because more recent
|
||||
versions are provided from Common files.
|
||||
- Replaced ZRDOS with ZSDOS in NZCOM.LBR. The standalone
|
||||
@@ -318,4 +320,4 @@ in this user area for more information.
|
||||
N.B., at a minimum, some of the files in this user area must be copied
|
||||
to user area 0 for CP/NET to work properly.
|
||||
|
||||
-- WBW 3:20 PM 8/27/2021
|
||||
-- WBW 11:19 AM 1/22/2024
|
||||
Binary file not shown.
Binary file not shown.
@@ -15,11 +15,11 @@ CON
|
||||
cols = 80 ' screen columns
|
||||
rows = 30 ' screen rows
|
||||
chars = rows * cols ' screen characters
|
||||
termRows = 25 ' rows in terminal area
|
||||
termRows = rows - 1 ' rows in terminal area
|
||||
termChars = termRows * cols ' characters in terminal area
|
||||
termLastRow = termChars - cols ' buffer pos of first char in last term row
|
||||
statArea = termChars ' starting position of status area
|
||||
statRows = rows - TermRows ' status area rows
|
||||
statRows = 1 ' status area rows
|
||||
blank = $20
|
||||
|
||||
spkVol = 75
|
||||
@@ -46,6 +46,7 @@ VAR
|
||||
long vgaBasePin
|
||||
word curAttr ' active attribute value
|
||||
word bold, underscore, blink, reverse, fg, bg
|
||||
word alt ' alt char set active
|
||||
|
||||
|
||||
DAT
|
||||
@@ -81,6 +82,7 @@ PUB start(BasePin) | i, char
|
||||
reverse := 0
|
||||
fg := 0
|
||||
bg := 0
|
||||
alt := 0
|
||||
setMode(0) ' reset attributes
|
||||
|
||||
PUB vidOn
|
||||
@@ -174,6 +176,10 @@ PRI clsTerm
|
||||
|
||||
PRI outc(c)
|
||||
|
||||
if (alt == 1)
|
||||
if ((c => $5F) and (c < $7F))
|
||||
c := c - $5F
|
||||
|
||||
screen[pos++] := (curAttr | c)
|
||||
lastc := c
|
||||
|
||||
@@ -400,11 +406,11 @@ PRI ansi(c) | x, defVal
|
||||
x += cols
|
||||
|
||||
"K":
|
||||
if arg0 == -1
|
||||
if ((arg0 == -1) or (arg0 == 0))
|
||||
clEOL(pos)
|
||||
elseif arg0 == 1
|
||||
elseif (arg0 == 1)
|
||||
clBOL(pos)
|
||||
else
|
||||
elseif (arg0 == 2)
|
||||
clEOL(pos - (pos // cols))
|
||||
|
||||
"L":
|
||||
@@ -563,6 +569,11 @@ PUB processChar(c)
|
||||
return
|
||||
|
||||
5: ' Set character set (not implemented)
|
||||
if (c == "0")
|
||||
alt := 1
|
||||
if (c == "B")
|
||||
alt := 0
|
||||
|
||||
state := 0
|
||||
return
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
************************************
|
||||
* ParPortProp for RomWBW *
|
||||
* Interface to RBC ParPortProp *
|
||||
* Version 0.97 *
|
||||
* May 9, 2020 *
|
||||
* Version 0.98 *
|
||||
* January 20, 2024 *
|
||||
************************************
|
||||
|
||||
Wayne Warthen
|
||||
@@ -30,24 +30,24 @@
|
||||
|
||||
2018-03-11 WBW: Implement character attributes
|
||||
2020-05-09 WBW: Switch monitor refresh to 60Hz
|
||||
2024-01-20 WBW: Add graphics char selection to AnsiTerm
|
||||
|
||||
}}
|
||||
|
||||
CON
|
||||
VERSION = (((0 << 8) + 97) << 16) + 0
|
||||
VERSION = (((0 << 8) + 98) << 16) + 0
|
||||
|
||||
_CLKMODE = XTAL1 + PLL16X
|
||||
_XINFREQ = 5_000_000
|
||||
|
||||
|
||||
'SLEEP = 60 * 5 ' Screen saver timeout in seconds
|
||||
SLEEP = 0 ' Zero for no screen saver
|
||||
|
||||
VGA_BASE = 16 ' VGA Video pins 16-23 (??)
|
||||
KBD_BASE = 14 ' PS/2 Keyboard pins 14-15 (DATA, CLK)
|
||||
SD_BASE = 24 ' SD Card pins 24-27 (DO, CLK, DI, CS)
|
||||
|
||||
STAT_ATTR1 = %00110000_00000000 ' Status area screen attribute (first line)
|
||||
STAT_ATTR = %01110000_00000000 ' Status area screen attribute
|
||||
|
||||
STAT_ATTR = %00110000_00000000 ' Status area screen attribute (first line)
|
||||
|
||||
PPI_CMD = $0100 ' pin 8, PC0, active ???
|
||||
PPI_STB = $0200 ' pin 9, PC4, active low
|
||||
@@ -143,19 +143,16 @@ PUB main | tmp
|
||||
dsp.cls
|
||||
MsgNewLine
|
||||
|
||||
dsp.VidOn
|
||||
dsp.vidOn
|
||||
|
||||
statRows := (dsp.statInfo >> 8) & $FF
|
||||
statCols := dsp.statInfo & $FF
|
||||
|
||||
dsp.statFill(0, 0, STAT_ATTR, $20, statRows * statCols)
|
||||
dsp.statFill(0, 0, STAT_ATTR1, $20, statCols)
|
||||
|
||||
dsp.statStr(0, 1, STAT_ATTR1, @strROM)
|
||||
dsp.statStr(0, (statCols - strsize(@strHW)) / 2, STAT_ATTR1, @strHW)
|
||||
dsp.statStr(0, (statCols - strsize(@strVer) - 1), STAT_ATTR1, @strVer)
|
||||
|
||||
'dsp.statStr(2, (statCols - 20) / 2, STAT_ATTR, string("<<< Message Area >>>"))
|
||||
dsp.statStr(0, 1, STAT_ATTR, @strROM)
|
||||
dsp.statStr(0, (statCols - strsize(@strHW)) / 2, STAT_ATTR, @strHW)
|
||||
dsp.statStr(0, (statCols - strsize(@strVer) - 1), STAT_ATTR, @strVer)
|
||||
|
||||
MsgStr(string("Initializing ParPortProp..."))
|
||||
|
||||
@@ -221,7 +218,7 @@ PUB main | tmp
|
||||
else
|
||||
MsgStr(string(" OK"))
|
||||
MsgNewLine
|
||||
|
||||
|
||||
dsp.beep
|
||||
|
||||
MsgStr(string("ParPortProp Ready!"))
|
||||
@@ -610,7 +607,7 @@ PRI Activity
|
||||
|
||||
DAT
|
||||
|
||||
strVer byte "F/W v0.97",0
|
||||
strVer byte "F/W v0.98",0
|
||||
strHW byte "ParPortProp",0
|
||||
strROM byte "RomWBW",0
|
||||
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
*******************************
|
||||
* PropIO for RomWBW *
|
||||
* Interface to RBC PropIO *
|
||||
* Version 0.97 *
|
||||
* May 9, 2020 *
|
||||
*******************************
|
||||
* Version 0.98 *
|
||||
* January 20, 2024 *
|
||||
*********************************
|
||||
|
||||
Wayne Warthen
|
||||
wwarthen@gmail.com
|
||||
@@ -35,11 +35,12 @@
|
||||
2015-11-15 WBW: Added SD card capacity reporting
|
||||
2018-03-11 WBW: Implement character attributes
|
||||
2020-05-09 WBW: Switch monitor refresh to 60Hz
|
||||
2024-01-20 WBW: Add graphics char selection to AnsiTerm
|
||||
|
||||
}}
|
||||
|
||||
CON
|
||||
VERSION = (((0 << 8) + 97) << 16) + 0
|
||||
VERSION = (((0 << 8) + 98) << 16) + 0
|
||||
|
||||
_CLKMODE = XTAL1 + PLL16X
|
||||
_XINFREQ = 5_000_000
|
||||
@@ -50,9 +51,8 @@ CON
|
||||
VGA_BASE = 16 ' VGA Video pins 16-23 (??)
|
||||
KBD_BASE = 14 ' PS/2 Keyboard pins 14-15 (DATA, CLK)
|
||||
SD_BASE = 24 ' SD Card pins 24-27 (DO, CLK, DI, CS)
|
||||
|
||||
STAT_ATTR1 = %00110000_00000000 ' Status area screen attribute (first line)
|
||||
STAT_ATTR = %01110000_00000000 ' Status area screen attribute
|
||||
|
||||
STAT_ATTR = %00110000_00000000 ' Status area screen attribute (first line)
|
||||
|
||||
DSKCMD_NOP = $00
|
||||
DSKCMD_STATUS = $01
|
||||
@@ -78,10 +78,7 @@ CON
|
||||
|
||||
TRMST_ACTMASK = (TRMST_KBDACT | TRMST_DSPACT) ' bit mask for kbd or dsp active
|
||||
|
||||
|
||||
|
||||
OBJ
|
||||
'dsp : "VGA_1024" ' VGA Terminal Driver
|
||||
dsp : "AnsiTerm" ' VGA Terminal Driver
|
||||
kbd : "Keyboard" ' PS/2 Keyboard Driver
|
||||
sdc : "safe_spi" ' SD Card Driver
|
||||
@@ -101,7 +98,7 @@ VAR
|
||||
long TimerCount
|
||||
long DiskResult
|
||||
long CardType
|
||||
|
||||
|
||||
byte statRows
|
||||
byte statCols
|
||||
|
||||
@@ -122,20 +119,17 @@ PUB main
|
||||
dsp.cls
|
||||
MsgNewLine
|
||||
|
||||
dsp.VidOn
|
||||
dsp.vidOn
|
||||
|
||||
statRows := (dsp.statInfo >> 8) & $FF
|
||||
statCols := dsp.statInfo & $FF
|
||||
|
||||
dsp.statFill(0, 0, STAT_ATTR, $20, statRows * statCols)
|
||||
dsp.statFill(0, 0, STAT_ATTR1, $20, statCols)
|
||||
|
||||
dsp.statStr(0, 1, STAT_ATTR1, @strROM)
|
||||
dsp.statStr(0, (statCols - strsize(@strHW)) / 2, STAT_ATTR1, @strHW)
|
||||
dsp.statStr(0, (statCols - strsize(@strVer) - 1), STAT_ATTR1, @strVer)
|
||||
dsp.statStr(0, 1, STAT_ATTR, @strROM)
|
||||
dsp.statStr(0, (statCols - strsize(@strHW)) / 2, STAT_ATTR, @strHW)
|
||||
dsp.statStr(0, (statCols - strsize(@strVer) - 1), STAT_ATTR, @strVer)
|
||||
|
||||
'dsp.statStr(2, (statCols - 20) / 2, STAT_ATTR, string("<<< Message Area >>>"))
|
||||
|
||||
MsgStr(string("Initializing PropIO..."))
|
||||
|
||||
TermStatKbdAdr := @TermStatKbd
|
||||
@@ -185,10 +179,12 @@ PUB main
|
||||
else
|
||||
MsgStr(string(" OK"))
|
||||
MsgNewLine
|
||||
|
||||
dsp.beep
|
||||
|
||||
MsgStr(string("PropIO Ready!"))
|
||||
MsgNewLine
|
||||
|
||||
|
||||
repeat
|
||||
if (DiskStat & DSKST_ACT)
|
||||
ProcessDiskCmd
|
||||
@@ -315,13 +311,13 @@ PRI Timer
|
||||
waitcnt(clkfreq * 1 + cnt)
|
||||
if (TimerCount > 0)
|
||||
if (TimerCount == 1)
|
||||
dsp.VidOff
|
||||
dsp.vidOff
|
||||
TimerCount--
|
||||
|
||||
PRI Activity
|
||||
if (SLEEP > 0)
|
||||
if (TimerCount == 0)
|
||||
dsp.VidOn
|
||||
dsp.vidOn
|
||||
TimerCount := SLEEP
|
||||
|
||||
{
|
||||
@@ -338,18 +334,18 @@ PRI DumpBuffer(Buffer) | i, j
|
||||
|
||||
DAT
|
||||
|
||||
strVer byte "F/W v0.97",0
|
||||
strVer byte "F/W v0.98",0
|
||||
strHW byte "PropIO",0
|
||||
strROM byte "RomWBW",0
|
||||
|
||||
{{ Ports
|
||||
|
||||
|
||||
+------/WAIT
|
||||
|+-----/RD
|
||||
+------ CLR
|
||||
|+----- /RD
|
||||
||+---- A1
|
||||
|||+--- A0
|
||||
||||+--/CS
|
||||
||||+-- /CS
|
||||
|||||
|
||||
|||||
|
||||
P15..P0 --> xxxxxxxx_xxxxxxxx
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
*********************************
|
||||
* PropIO 2 for RomWBW *
|
||||
* Interface to RBC PropIO 2 *
|
||||
* Version 0.97 *
|
||||
* May 9, 2020 *
|
||||
* Version 0.98 *
|
||||
* January 20, 2024 *
|
||||
*********************************
|
||||
|
||||
Wayne Warthen
|
||||
@@ -35,11 +35,12 @@
|
||||
2015-11-15 WBW: Added SD card capacity reporting
|
||||
2018-03-11 WBW: Implement character attributes
|
||||
2020-05-09 WBW: Switch monitor refresh to 60Hz
|
||||
2024-01-20 WBW: Add graphics char selection to AnsiTerm
|
||||
|
||||
}}
|
||||
|
||||
CON
|
||||
VERSION = (((0 << 8) + 97) << 16) + 0
|
||||
VERSION = (((0 << 8) + 98) << 16) + 0
|
||||
|
||||
_CLKMODE = XTAL1 + PLL16X
|
||||
_XINFREQ = 5_000_000
|
||||
@@ -51,8 +52,7 @@ CON
|
||||
KBD_BASE = 14 ' PS/2 Keyboard pins 14-15 (DATA, CLK)
|
||||
SD_BASE = 24 ' SD Card pins 24-27 (DO, CLK, DI, CS)
|
||||
|
||||
STAT_ATTR1 = %00110000_00000000 ' Status area screen attribute (first line)
|
||||
STAT_ATTR = %01110000_00000000 ' Status area screen attribute
|
||||
STAT_ATTR = %00110000_00000000 ' Status area screen attribute (first line)
|
||||
|
||||
DSKCMD_NOP = $00
|
||||
DSKCMD_STATUS = $01
|
||||
@@ -79,7 +79,6 @@ CON
|
||||
TRMST_ACTMASK = (TRMST_KBDACT | TRMST_DSPACT) ' bit mask for kbd or dsp active
|
||||
|
||||
OBJ
|
||||
'dsp : "VGA_1024" ' VGA Terminal Driver
|
||||
dsp : "AnsiTerm" ' VGA Terminal Driver
|
||||
kbd : "Keyboard" ' PS/2 Keyboard Driver
|
||||
sdc : "safe_spi" ' SD Card Driver
|
||||
@@ -126,14 +125,11 @@ PUB main
|
||||
statCols := dsp.statInfo & $FF
|
||||
|
||||
dsp.statFill(0, 0, STAT_ATTR, $20, statRows * statCols)
|
||||
dsp.statFill(0, 0, STAT_ATTR1, $20, statCols)
|
||||
|
||||
dsp.statStr(0, 1, STAT_ATTR1, @strROM)
|
||||
dsp.statStr(0, (statCols - strsize(@strHW)) / 2, STAT_ATTR1, @strHW)
|
||||
dsp.statStr(0, (statCols - strsize(@strVer) - 1), STAT_ATTR1, @strVer)
|
||||
dsp.statStr(0, 1, STAT_ATTR, @strROM)
|
||||
dsp.statStr(0, (statCols - strsize(@strHW)) / 2, STAT_ATTR, @strHW)
|
||||
dsp.statStr(0, (statCols - strsize(@strVer) - 1), STAT_ATTR, @strVer)
|
||||
|
||||
'dsp.statStr(2, (statCols - 20) / 2, STAT_ATTR, string("<<< Message Area >>>"))
|
||||
|
||||
MsgStr(string("Initializing PropIO..."))
|
||||
|
||||
TermStatKbdAdr := @TermStatKbd
|
||||
@@ -188,7 +184,7 @@ PUB main
|
||||
|
||||
MsgStr(string("PropIO Ready!"))
|
||||
MsgNewLine
|
||||
|
||||
|
||||
repeat
|
||||
if (DiskStat & DSKST_ACT)
|
||||
ProcessDiskCmd
|
||||
@@ -338,7 +334,7 @@ PRI DumpBuffer(Buffer) | i, j
|
||||
|
||||
DAT
|
||||
|
||||
strVer byte "F/W v0.97",0
|
||||
strVer byte "F/W v0.98",0
|
||||
strHW byte "PropIO v2",0
|
||||
strROM byte "RomWBW",0
|
||||
|
||||
|
||||
@@ -1,702 +0,0 @@
|
||||
'' VGA_1024.spin
|
||||
''
|
||||
'' MODIFIED BY VINCE BRIEL FOR POCKETERM FEATURES
|
||||
'' MODIIFED BY JEFF LEDGER / AKA OLDBITCOLLECTOR
|
||||
''
|
||||
|
||||
CON
|
||||
cols = 80 '128 ' number of screen columns
|
||||
lcols = cols / 4 ' number of long in columns
|
||||
rows = 40 '64 ' number of screen rows
|
||||
chars = rows*cols ' number of screen characters
|
||||
esc = $CB ' keyboard esc char
|
||||
rowsnow = 36 ' adjusted for split screen effect
|
||||
maxChars = rowsnow*cols ' adjusted value for split screen effect
|
||||
lastChar = maxChars / 4 ' last screen position in longs adjusted for split
|
||||
lastLine = (rowsnow - 1) * cols ' character position of last row
|
||||
cols1 = 81 ' adjusted value for 80th character
|
||||
TURQUOISE = $29
|
||||
|
||||
OBJ
|
||||
vga : "vga_Hires_Text"
|
||||
|
||||
VAR
|
||||
byte screen[chars] ' screen character buffer
|
||||
byte tmpl[cols] ' temporary line buffer
|
||||
word colors[rows] ' color specs for each screen row (see ColorPtr description above)
|
||||
byte cursor[6] ' cursor info array (see CursorPtr description above)
|
||||
long sync, loc, xloc, yloc ' sync used by VGA routine, others are local screen pointers
|
||||
long kbdreq ' global val of kbdflag
|
||||
long BR[8]
|
||||
long Brate
|
||||
byte inverse
|
||||
byte invs
|
||||
byte state ' Current state of state machine
|
||||
word pos ' Current Position on the screen
|
||||
word oldpos ' Previous location of cursor before update
|
||||
word regionTop, regionBot ' Scroll region top/bottom
|
||||
long arg0 ' First argument of escape sequence
|
||||
long arg1 ' Second argument of escape sequence
|
||||
byte lastc ' Last displayed char
|
||||
word statpos
|
||||
long vgabasepin
|
||||
|
||||
PUB start(BasePin) | i, char
|
||||
vgabasepin := BasePin
|
||||
|
||||
''init screen colors to gold on blue
|
||||
repeat i from 0 to rows - 1
|
||||
colors[i] := $08F0 '$2804 (if you want cyan on blue)
|
||||
|
||||
''init cursor attributes
|
||||
cursor[2] := %110 ' init cursor to underscore with slow blink
|
||||
BR[0]:=300
|
||||
BR[1]:=1200
|
||||
BR[2]:=2400
|
||||
BR[3]:=4800
|
||||
BR[4]:=9600
|
||||
BR[5]:=19200
|
||||
BR[6]:=38400
|
||||
BR[7]:=57600
|
||||
BR[8]:=115200
|
||||
xloc := cursor[0] := 0
|
||||
yloc := cursor[1] := 0
|
||||
loc := xloc + yloc*cols
|
||||
|
||||
pos := 0
|
||||
regionTop := 0
|
||||
regionBot := 35 * cols
|
||||
state := 0
|
||||
statpos := 37 * cols
|
||||
|
||||
PUB vidon
|
||||
if (!vga.start(vgabasepin, @screen, @colors, @cursor, @sync))
|
||||
return false
|
||||
|
||||
'waitcnt(clkfreq * 1 + cnt) 'wait 1 second for cogs to start
|
||||
|
||||
|
||||
PUB vidoff
|
||||
vga.stop
|
||||
|
||||
PUB inv(c)
|
||||
inverse:=c
|
||||
|
||||
PUB color(colorVal) | i
|
||||
repeat i from 0 to rows - 1
|
||||
colors[i] := $0000 | colorVal
|
||||
|
||||
PUB cursorset(c) | i
|
||||
i:=%000
|
||||
if c == 1
|
||||
i:= %001
|
||||
if c == 2
|
||||
i:= %010
|
||||
if c == 3
|
||||
i:= %011
|
||||
if c == 4
|
||||
i:= %101
|
||||
if c == 5
|
||||
i:= %110
|
||||
if c == 6
|
||||
i:= %111
|
||||
if c == 7
|
||||
i:= %000
|
||||
cursor[2] := i
|
||||
|
||||
PUB bin(value, digits)
|
||||
|
||||
'' Print a binary number, specify number of digits
|
||||
|
||||
repeat while digits > 32
|
||||
outc("0")
|
||||
digits--
|
||||
|
||||
value <<= 32 - digits
|
||||
|
||||
repeat digits
|
||||
outc((value <-= 1) & 1 + "0")
|
||||
|
||||
|
||||
PUB clrbtm(ColorVal) | i
|
||||
repeat i from 36 to rows - 1 'was 35
|
||||
colors[i] := $0000 + ColorVal
|
||||
|
||||
PUB cls1(VerStr) | i
|
||||
|
||||
longfill(@screen[0], $20202020, chars / 4)
|
||||
|
||||
clrbtm(TURQUOISE)
|
||||
|
||||
inverse := 1
|
||||
statprint(36, 0, VerStr)
|
||||
inverse := 0
|
||||
|
||||
repeat i from 37 to (rows - 1)
|
||||
statprint(i,0, string(" "))
|
||||
|
||||
|
||||
{{
|
||||
x :=xloc
|
||||
y := yloc
|
||||
invs := inverse
|
||||
''clrbtm(TURQUOISE)
|
||||
longfill(@screen, $20202020, chars/4)
|
||||
xloc := 0
|
||||
yloc :=0
|
||||
loc := xloc + yloc*cols
|
||||
repeat 80
|
||||
outc(32)
|
||||
xloc := 0
|
||||
yloc :=36
|
||||
loc := xloc + yloc*cols
|
||||
inverse := 1
|
||||
str(string(" "))
|
||||
inverse := 0
|
||||
str(string("Baud Rate: "))
|
||||
i:= BR[6]
|
||||
dec(i)
|
||||
str(string(" "))
|
||||
xloc := 18
|
||||
loc := xloc + yloc*cols
|
||||
str(string("Color "))
|
||||
str(string("PC Port: "))
|
||||
if pcport == 1
|
||||
str(string("OFF "))
|
||||
if pcport == 0
|
||||
str(string("ON "))
|
||||
str(string(" Force 7 bit: "))
|
||||
if ascii == 0
|
||||
str(string("NO "))
|
||||
if ascii == 1
|
||||
str(string("YES "))
|
||||
str(string(" Cursor CR W/LF: "))
|
||||
if CR == 1
|
||||
str(string("YES"))
|
||||
if CR == 0
|
||||
str(string("NO "))
|
||||
outc(13)
|
||||
outc(10)
|
||||
|
||||
inverse:=1
|
||||
xloc := 6
|
||||
loc := xloc + yloc*cols
|
||||
str(string("F1"))
|
||||
xloc := 19
|
||||
loc := xloc + yloc*cols
|
||||
str(string("F2"))
|
||||
xloc := 30
|
||||
loc := xloc + yloc*cols
|
||||
str(string("F3"))
|
||||
xloc := 46
|
||||
loc := xloc + yloc*cols
|
||||
str(string("F4"))
|
||||
xloc := 58
|
||||
loc := xloc + yloc*cols
|
||||
str(string("F5"))
|
||||
xloc := 70
|
||||
loc := xloc + yloc*cols
|
||||
str(string("F6"))
|
||||
inverse := invs
|
||||
xloc := cursor[0] := x 'right & left was 0
|
||||
yloc := cursor[1] := y 'from top was 1
|
||||
loc := xloc + yloc*cols
|
||||
}}
|
||||
|
||||
PUB clsupdate(c,screencolor,PCPORT,ascii,CR) | i,x,y,locold
|
||||
|
||||
invs := inverse
|
||||
locold := loc
|
||||
x := xloc
|
||||
y := yloc
|
||||
''(TURQUOISE)
|
||||
xloc := 0
|
||||
yloc :=36
|
||||
loc := xloc + yloc*cols
|
||||
inverse := 1
|
||||
str(string(" "))
|
||||
inverse := 0
|
||||
xloc := 0
|
||||
yloc :=37
|
||||
loc := xloc + yloc*cols
|
||||
str(string("Baud Rate: "))
|
||||
i:= BR[6]
|
||||
dec(i)
|
||||
str(string(" "))
|
||||
xloc := 18
|
||||
loc := xloc + yloc*cols
|
||||
|
||||
str(string("Color "))
|
||||
str(string("PC Port: "))
|
||||
if pcport == 1
|
||||
str(string("OFF "))
|
||||
if pcport == 0
|
||||
str(string("ON "))
|
||||
str(string(" Force 7 bit: "))
|
||||
if ascii == 0
|
||||
str(string("NO "))
|
||||
if ascii == 1
|
||||
str(string("YES "))
|
||||
str(string(" Cursor CR W/LF: "))
|
||||
if CR == 1
|
||||
str(string("YES"))
|
||||
if CR == 0
|
||||
str(string("NO "))
|
||||
xloc := 0
|
||||
yloc :=38
|
||||
loc := xloc + yloc*cols
|
||||
inverse:=1
|
||||
xloc := 6
|
||||
loc := xloc + yloc*cols
|
||||
str(string("F1"))
|
||||
xloc := 19
|
||||
loc := xloc + yloc*cols
|
||||
str(string("F2"))
|
||||
xloc := 30
|
||||
loc := xloc + yloc*cols
|
||||
str(string("F3"))
|
||||
xloc := 46
|
||||
loc := xloc + yloc*cols
|
||||
str(string("F4"))
|
||||
xloc := 58
|
||||
loc := xloc + yloc*cols
|
||||
str(string("F5"))
|
||||
xloc := 70
|
||||
loc := xloc + yloc*cols
|
||||
str(string("F6"))
|
||||
inverse := invs
|
||||
xloc := cursor[0] := x
|
||||
yloc := cursor[1] := y
|
||||
' loc := xloc + yloc*cols
|
||||
loc := locold
|
||||
|
||||
PUB dec(value) | i
|
||||
|
||||
'' Print a decimal number
|
||||
|
||||
if value < 0
|
||||
-value
|
||||
outc("-")
|
||||
|
||||
i := 1_000_000_000
|
||||
|
||||
repeat 10
|
||||
if value => i
|
||||
outc(value/i + "0")
|
||||
value //= i
|
||||
result~~
|
||||
elseif result or i == 1
|
||||
outc("0")
|
||||
i /= 10
|
||||
|
||||
PUB hex(value, digits)
|
||||
|
||||
'' Print a hexadecimal number, specify number of digits
|
||||
|
||||
repeat while digits > 8
|
||||
outc("0")
|
||||
digits--
|
||||
|
||||
value <<= (8 - digits) << 2
|
||||
|
||||
repeat digits
|
||||
outc(lookupz((value <-= 4) & $f : "0".."9", "A".."F"))
|
||||
|
||||
|
||||
PUB str(string_ptr)
|
||||
|
||||
'' Print a zero terminated string
|
||||
|
||||
repeat strsize(string_ptr)
|
||||
process_char(byte[string_ptr++])
|
||||
|
||||
PUB statprint(r, c, str1) | x, ptr
|
||||
|
||||
ptr := r * cols + c
|
||||
repeat x from 0 to STRSIZE(str1) - 1
|
||||
putc(ptr++, BYTE[str1 + x])
|
||||
|
||||
PUB statnum(r, c, num1) | i, ptr
|
||||
|
||||
ptr := r * cols + c
|
||||
|
||||
if num1 < 0
|
||||
-num1
|
||||
putc(ptr++,"-")
|
||||
|
||||
i := 1_000_000_000
|
||||
|
||||
repeat 10
|
||||
if num1 => i
|
||||
putc(ptr++, (num1/i +"0"))
|
||||
num1 //= i
|
||||
result~~
|
||||
elseif result or i == 1
|
||||
putc(ptr++, "0")
|
||||
i /= 10
|
||||
|
||||
PUB putc(position, c)
|
||||
if inverse
|
||||
c |= $80
|
||||
screen[position] := c
|
||||
|
||||
PUB cls
|
||||
longfill (@screen, $20202020, lastChar)
|
||||
|
||||
PUB fullcls
|
||||
longfill(@screen, $20202020, 800)
|
||||
|
||||
PUB setInverse(val)
|
||||
inverse := val
|
||||
|
||||
PUB setInv(c)
|
||||
if c == 7
|
||||
setInverse(1)
|
||||
else
|
||||
setInverse(0)
|
||||
|
||||
PUB clEOL(position) | count
|
||||
count := cols - (position // cols)
|
||||
bytefill(@screen + position, $20, count)
|
||||
|
||||
PUB clBOL(position) | count
|
||||
count := position // cols
|
||||
bytefill(@screen + position - count, $20, count)
|
||||
|
||||
PUB delLine(position) | src, count
|
||||
position -= position // cols
|
||||
|
||||
src := position + cols
|
||||
|
||||
count := (maxChars - src) / 4
|
||||
|
||||
if count > 0
|
||||
longmove(@screen + position, @screen + src, count)
|
||||
|
||||
longfill(@screen + lastLine, $20202020, lcols)
|
||||
|
||||
PUB clEOS(position)
|
||||
cleol(position)
|
||||
position += cols - (position // cols)
|
||||
repeat while position < maxChars
|
||||
longfill(@screen + position, $20202020, lcols)
|
||||
pos += cols
|
||||
|
||||
PUB setCursorPos(position)
|
||||
cursor[0] := position // cols
|
||||
cursor[1] := position / cols
|
||||
|
||||
PUB insLine(position) | base, nxt
|
||||
base := position - (position // cols)
|
||||
position := lastLine
|
||||
repeat while position > base
|
||||
nxt := position - cols
|
||||
longmove(@screen + position, @screen + nxt, lcols)
|
||||
position := nxt
|
||||
clEOL(base)
|
||||
|
||||
PUB insChar(position) | count
|
||||
count := (cols - (position // cols)) - 1
|
||||
bytemove(@tmpl, @screen + position, count)
|
||||
screen[position] := " "
|
||||
bytemove(@screen + position + 1, @tmpl, count)
|
||||
|
||||
PUB delChar(position) | count
|
||||
count := (cols - (position // cols)) - 1
|
||||
bytemove(@screen + position, @screen + position + 1, count)
|
||||
screen[position + count] := " "
|
||||
|
||||
PRI inRegion : answer
|
||||
answer := (pos => regionTop) AND (pos < regionBot)
|
||||
|
||||
PRI scrollUp
|
||||
delLine(regionTop)
|
||||
if regionBot < maxChars
|
||||
insLine(regionBot)
|
||||
|
||||
PRI scrollDown
|
||||
if regionBot < maxChars
|
||||
delLine(regionBot)
|
||||
insLine(regionTop)
|
||||
|
||||
PRI ansi(c) | x, defVal
|
||||
|
||||
state := 0
|
||||
|
||||
if (c <> "r") AND (c <> "J") AND (c <> "m") AND (c <> "K")
|
||||
if arg0 == -1
|
||||
arg0 := 1
|
||||
if arg1 == -1
|
||||
arg1 := 1
|
||||
|
||||
case c
|
||||
"@":
|
||||
repeat while arg0-- > 0
|
||||
insChar(pos)
|
||||
|
||||
"b":
|
||||
repeat while arg0-- > 0
|
||||
outc(lastc)
|
||||
|
||||
"d":
|
||||
if (arg0 < 1) OR (arg0 > rows)
|
||||
arg0 := rows
|
||||
pos := ((arg0 - 1) * cols) + (pos // cols)
|
||||
|
||||
"m":
|
||||
setInv(arg0)
|
||||
if arg1 <> -1
|
||||
setInv(arg1)
|
||||
|
||||
"r":
|
||||
if arg0 < 1
|
||||
arg0 := 1
|
||||
elseif arg0 > cols
|
||||
arg0 := cols
|
||||
if arg1 < 1
|
||||
arg1 := 1
|
||||
elseif arg1 > cols
|
||||
arg1 := cols
|
||||
if arg1 < arg0
|
||||
arg1 := arg0
|
||||
|
||||
regionTop := (arg0 - 1) * cols
|
||||
regionBot := arg1 * cols
|
||||
pos := 0
|
||||
|
||||
"A":
|
||||
repeat while arg0-- > 0
|
||||
pos -= cols
|
||||
if pos < 0
|
||||
pos += cols
|
||||
return
|
||||
|
||||
"B":
|
||||
repeat while arg0-- > 0
|
||||
pos += cols
|
||||
if pos => maxChars
|
||||
pos -= cols
|
||||
return
|
||||
|
||||
"C":
|
||||
repeat while arg0-- > 0
|
||||
pos += 1
|
||||
if pos => maxChars
|
||||
pos -= 1
|
||||
return
|
||||
|
||||
"D":
|
||||
repeat while arg0-- > 0
|
||||
pos -= 1
|
||||
if pos < 0
|
||||
pos := 0
|
||||
return
|
||||
|
||||
"G":
|
||||
if (arg0 < 1) OR (arg0 > cols)
|
||||
arg0 := cols
|
||||
pos := (pos - (pos // cols)) + (arg0 - 1)
|
||||
|
||||
"H", "f":
|
||||
if arg0 =< 0
|
||||
arg0 := 1
|
||||
if arg1 =< 0
|
||||
arg1 := 1
|
||||
pos := (cols * (arg0 - 1)) + (arg1 - 1)
|
||||
if pos < 0
|
||||
pos := 0
|
||||
if pos => maxChars
|
||||
pos := maxChars - 1
|
||||
|
||||
"J":
|
||||
if arg0 == 1
|
||||
clBOL(pos)
|
||||
x := pos - cols
|
||||
x -= x // cols
|
||||
repeat while x => 0
|
||||
clEOL(x)
|
||||
x -= cols
|
||||
return
|
||||
|
||||
if arg0 == 2
|
||||
pos := 0
|
||||
|
||||
clEOL(pos)
|
||||
x := pos + cols
|
||||
x -= (x // cols)
|
||||
repeat while x < maxChars
|
||||
clEOL(x)
|
||||
x += cols
|
||||
|
||||
"K":
|
||||
if arg0 == -1
|
||||
clEOL(pos)
|
||||
elseif arg0 == 1
|
||||
clBOL(pos)
|
||||
else
|
||||
clEOL(pos - (pos // cols))
|
||||
|
||||
"L":
|
||||
if inRegion
|
||||
repeat while arg0-- > 0
|
||||
if regionBot < maxChars
|
||||
delLine(regionBot)
|
||||
insLine(pos)
|
||||
|
||||
"M":
|
||||
if inRegion
|
||||
repeat while arg0-- > 0
|
||||
delLine(pos)
|
||||
if regionBot < maxChars
|
||||
insLine(regionBot)
|
||||
|
||||
"P":
|
||||
repeat while arg0--
|
||||
delChar(pos)
|
||||
|
||||
PRI outc(c)
|
||||
|
||||
putc(pos++, lastc := c)
|
||||
if pos == regionBot
|
||||
scrollUp
|
||||
pos -= cols
|
||||
elseif pos == maxChars
|
||||
pos := lastLine
|
||||
|
||||
PUB process_char(c)
|
||||
|
||||
case state
|
||||
|
||||
0:
|
||||
if c > 127
|
||||
c := $20
|
||||
|
||||
if c => $20
|
||||
outc(c)
|
||||
setCursorPos(pos)
|
||||
return
|
||||
|
||||
if c == $1B
|
||||
state := 1
|
||||
return
|
||||
|
||||
if c == $0D
|
||||
pos := pos - (pos // cols)
|
||||
setCursorPos(pos)
|
||||
return
|
||||
|
||||
if c == $0A
|
||||
if inRegion
|
||||
pos += cols
|
||||
if pos => regionBot
|
||||
scrollUp
|
||||
pos -= cols
|
||||
else
|
||||
pos += cols
|
||||
if pos => maxChars
|
||||
pos -= cols
|
||||
setCursorPos(pos)
|
||||
return
|
||||
|
||||
if c == 9
|
||||
pos += (8 - (pos // 8))
|
||||
|
||||
if pos => maxChars
|
||||
pos := lastLine
|
||||
delLine(0)
|
||||
|
||||
setCursorPos(pos)
|
||||
return
|
||||
|
||||
if c == 8
|
||||
if pos > 0
|
||||
pos -= 1
|
||||
setCursorPos(pos)
|
||||
return
|
||||
|
||||
1:
|
||||
case c
|
||||
"[":
|
||||
arg0 := arg1 := -1
|
||||
state := 2
|
||||
return
|
||||
|
||||
"P":
|
||||
pos += cols
|
||||
if pos => maxChars
|
||||
pos -= cols
|
||||
|
||||
"K":
|
||||
if pos > 0
|
||||
pos -= 1
|
||||
|
||||
"H":
|
||||
pos -= cols
|
||||
if pos < 0
|
||||
pos += cols
|
||||
|
||||
"D":
|
||||
if inRegion
|
||||
scrollUp
|
||||
|
||||
"M":
|
||||
if inRegion
|
||||
scrollDown
|
||||
|
||||
"G":
|
||||
pos := 0
|
||||
|
||||
"(":
|
||||
state := 5
|
||||
return
|
||||
|
||||
state := 0
|
||||
return
|
||||
|
||||
2:
|
||||
if (c => "0") AND (c =< "9")
|
||||
if arg0 == -1
|
||||
arg0 := c - "0"
|
||||
else
|
||||
arg0 := (arg0 * 10) + (c - "0")
|
||||
return
|
||||
|
||||
if c == ";"
|
||||
state := 3
|
||||
return
|
||||
|
||||
ansi(c)
|
||||
setCursorPos(pos)
|
||||
return
|
||||
|
||||
3:
|
||||
if (c => "0") AND (c =< "9")
|
||||
if arg1 == -1
|
||||
arg1 := c - "0"
|
||||
else
|
||||
arg1 := (arg1 * 10) + (c - "0")
|
||||
return
|
||||
|
||||
if c == ";"
|
||||
state := 4
|
||||
return
|
||||
|
||||
ansi(c)
|
||||
setCursorPos(pos)
|
||||
return
|
||||
|
||||
4:
|
||||
if (c => "0") AND (c =< "9")
|
||||
return
|
||||
|
||||
if c == ";"
|
||||
return
|
||||
ansi(c)
|
||||
setCursorPos(pos)
|
||||
return
|
||||
|
||||
5:
|
||||
state := 0
|
||||
return
|
||||
|
||||
return
|
||||
@@ -304,7 +304,7 @@ associated config file.
|
||||
|
||||
At this point, the build should continue and you will see output
|
||||
related to the assembler runs and some utility invocations. Just
|
||||
review the output for any obvioius errors. Normally, all errors
|
||||
review the output for any obvious errors. Normally, all errors
|
||||
will cause the build to stop immediately and display an error
|
||||
message in red.
|
||||
|
||||
@@ -3781,4 +3781,4 @@ osimg_small.bin
|
||||
1 file(s) copied.
|
||||
1 file(s) copied.
|
||||
|
||||
C:\Users\Wayne\Projects\RomWBW>
|
||||
C:\Users\Wayne\Projects\RomWBW>
|
||||
|
||||
@@ -24,27 +24,27 @@ set RomApps2=fdu format survey sysgen talk timer cpuspd
|
||||
|
||||
set RomApps=
|
||||
|
||||
copy NUL rom128_wbw.dat
|
||||
copy NUL rom128_una.dat
|
||||
copy NUL rom128_wbw.dat || exit /b
|
||||
copy NUL rom128_una.dat || exit /b
|
||||
|
||||
:: MakeDisk <OutputFile> <ImageSize> <Format> <Directory> <Bios>
|
||||
|
||||
set RomApps=%RomApps1%
|
||||
|
||||
call :MakeDisk rom256_wbw wbw_rom256 ROM_256KB 0x20000 wbw
|
||||
call :MakeDisk rom256_una wbw_rom256 ROM_256KB 0x20000 una
|
||||
call :MakeDisk rom256_wbw wbw_rom256 ROM_256KB 0x20000 wbw || exit /b
|
||||
call :MakeDisk rom256_una wbw_rom256 ROM_256KB 0x20000 una || exit /b
|
||||
|
||||
set RomApps=%RomApps1% %RomApps2%
|
||||
|
||||
call :MakeDisk rom512_wbw wbw_rom512 ROM_512KB 0x60000 wbw
|
||||
call :MakeDisk rom512_una wbw_rom512 ROM_512KB 0x60000 una
|
||||
call :MakeDisk rom512_wbw wbw_rom512 ROM_512KB 0x60000 wbw || exit /b
|
||||
call :MakeDisk rom512_una wbw_rom512 ROM_512KB 0x60000 una || exit /b
|
||||
|
||||
call :MakeDisk rom1024_wbw wbw_rom1024 ROM_1024KB 0xE0000 wbw
|
||||
call :MakeDisk rom1024_una wbw_rom1024 ROM_1024KB 0xE0000 una
|
||||
call :MakeDisk rom1024_wbw wbw_rom1024 ROM_1024KB 0xE0000 wbw || exit /b
|
||||
call :MakeDisk rom1024_una wbw_rom1024 ROM_1024KB 0xE0000 una || exit /b
|
||||
|
||||
call :MakeDisk ram512_wbw wbw_ram512 RAM_512KB 0x40000 wbw
|
||||
call :MakeDisk ram512_wbw wbw_ram512 RAM_512KB 0x40000 wbw || exit /b
|
||||
|
||||
call :MakeDisk ram1024_wbw wbw_ram1024 RAM_1024KB 0xC0000 wbw
|
||||
call :MakeDisk ram1024_wbw wbw_ram1024 RAM_1024KB 0xC0000 wbw || exit /b
|
||||
|
||||
goto :eof
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
BIN
Source/RomDsk/ROM_512KB/FAT.COM
Normal file
BIN
Source/RomDsk/ROM_512KB/FAT.COM
Normal file
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user