From 53a74f78d710008fffa092bdac7e13863d8c3367 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 1 Feb 2016 14:50:58 -0800 Subject: [PATCH] HBIOS driver and BPBIOS refinements - Refined sd, ide, and ppide drivers to improve hardware compatibility - Improved BPBIOS build process --- Sim.cfg | 6 +- Sim.cmd | 12 + Source/BPBIOS/@WBW Z3ENV.txt | 324 +- Source/BPBIOS/Build.cmd | 276 +- Source/BPBIOS/Clean.cmd | 4 +- Source/BPBIOS/ZCPR33/@WBW.txt | 8 + Source/BPBIOS/ZCPR33/Build.cmd | 10 +- Source/BPBIOS/ZCPR33/z3base.lib | 308 +- Source/BPBIOS/ZCPR33/z3base.lib.sav | 226 - .../{z3base.lib.sav => ZCPR33/z3basen.lib} | 11 +- Source/BPBIOS/ZCPR33/z3baset.lib | 126 + Source/BPBIOS/ZCPR33/zcpr33.z80 | 6 +- .../ZCPR33/{zcpr33.z80.sav => zcpr33n.z80} | 8 +- Source/BPBIOS/ZCPR33/zcpr33t.z80 | 4042 +++++++++++++++++ Source/BPBIOS/bp33.dat | Bin 11008 -> 0 bytes Source/BPBIOS/bp33bnk.dat | Bin 11008 -> 0 bytes Source/BPBIOS/bp33bnkx.dat | Bin 12416 -> 0 bytes Source/BPBIOS/bp33n.dat | Bin 11904 -> 11392 bytes Source/BPBIOS/bp33nbnk.dat | Bin 12544 -> 11392 bytes Source/BPBIOS/bp33t.dat | Bin 11008 -> 11392 bytes Source/BPBIOS/bp33tbnk.dat | Bin 12416 -> 11392 bytes Source/BPBIOS/bp33x.dat | Bin 11904 -> 0 bytes Source/BPBIOS/bp33xbnk.dat | Bin 12416 -> 0 bytes Source/BPBIOS/bp34.dat | Bin 11904 -> 0 bytes Source/BPBIOS/bp34bnk.dat | Bin 12416 -> 0 bytes Source/BPBIOS/bp34n.dat | Bin 11904 -> 11136 bytes Source/BPBIOS/bp34nbnk.dat | Bin 12544 -> 11136 bytes Source/BPBIOS/bp34t.dat | Bin 11904 -> 11392 bytes Source/BPBIOS/bp34tbnk.dat | Bin 12416 -> 11392 bytes Source/BPBIOS/bp34x.dat | Bin 11008 -> 0 bytes Source/BPBIOS/bp34xbnk.dat | Bin 12416 -> 0 bytes Source/BPBIOS/bp41.dat | Bin 17792 -> 0 bytes Source/BPBIOS/bp41n.dat | Bin 17920 -> 0 bytes Source/BPBIOS/bp41nbnk.dat | Bin 0 -> 16512 bytes Source/BPBIOS/bp41t.dat | Bin 17792 -> 0 bytes Source/BPBIOS/bp41tbnk.dat | Bin 0 -> 16768 bytes Source/BPBIOS/bp41x.dat | Bin 19712 -> 0 bytes Source/BPBIOS/bpbio-ww.z80 | 8 +- Source/BPBIOS/cboot-ww.z80 | 4 +- Source/BPBIOS/def-ww-z33n.lib | 373 ++ Source/BPBIOS/def-ww-z33nbnk.lib | 373 ++ .../{def-ww-z33.lib => def-ww-z33t.lib} | 3 + .../{def-ww-z33bnk.lib => def-ww-z33tbnk.lib} | 5 +- Source/BPBIOS/def-ww-z34n.lib | 373 ++ Source/BPBIOS/def-ww-z34nbnk.lib | 373 ++ .../{def-ww-z34.lib => def-ww-z34t.lib} | 5 +- .../{def-ww-z34bnk.lib => def-ww-z34tbnk.lib} | 5 +- Source/BPBIOS/def-ww-z41nbnk.lib | 372 ++ .../{def-ww-z41.lib => def-ww-z41tbnk.lib} | 5 +- Source/BPBIOS/def-ww.lib | 5 +- Source/BPBIOS/hardhb.z80 | 37 +- Source/BPBIOS/romwbw.lib | 2 +- Source/BPBIOS/z3base.lib | 11 +- Source/BPBIOS/z3basen.lib | 128 + Source/BPBIOS/z3baset.lib | 126 + Source/BPBIOS/zcpr33.rel | Bin 2304 -> 2560 bytes Source/BPBIOS/zcpr33.rel.sav | Bin 2560 -> 0 bytes Source/BPBIOS/zcpr33n.rel | Bin 0 -> 2304 bytes Source/BPBIOS/zcpr33t.rel | Bin 0 -> 2304 bytes Source/HBIOS/ide.asm | 193 +- Source/HBIOS/ppide.asm | 172 +- Source/HBIOS/sd.asm | 4 +- Source/HBIOS/util.asm | 62 +- 63 files changed, 7096 insertions(+), 910 deletions(-) create mode 100644 Sim.cmd create mode 100644 Source/BPBIOS/ZCPR33/@WBW.txt delete mode 100644 Source/BPBIOS/ZCPR33/z3base.lib.sav rename Source/BPBIOS/{z3base.lib.sav => ZCPR33/z3basen.lib} (90%) create mode 100644 Source/BPBIOS/ZCPR33/z3baset.lib rename Source/BPBIOS/ZCPR33/{zcpr33.z80.sav => zcpr33n.z80} (96%) create mode 100644 Source/BPBIOS/ZCPR33/zcpr33t.z80 delete mode 100644 Source/BPBIOS/bp33.dat delete mode 100644 Source/BPBIOS/bp33bnk.dat delete mode 100644 Source/BPBIOS/bp33bnkx.dat delete mode 100644 Source/BPBIOS/bp33x.dat delete mode 100644 Source/BPBIOS/bp33xbnk.dat delete mode 100644 Source/BPBIOS/bp34.dat delete mode 100644 Source/BPBIOS/bp34bnk.dat delete mode 100644 Source/BPBIOS/bp34x.dat delete mode 100644 Source/BPBIOS/bp34xbnk.dat delete mode 100644 Source/BPBIOS/bp41.dat delete mode 100644 Source/BPBIOS/bp41n.dat create mode 100644 Source/BPBIOS/bp41nbnk.dat delete mode 100644 Source/BPBIOS/bp41t.dat create mode 100644 Source/BPBIOS/bp41tbnk.dat delete mode 100644 Source/BPBIOS/bp41x.dat create mode 100644 Source/BPBIOS/def-ww-z33n.lib create mode 100644 Source/BPBIOS/def-ww-z33nbnk.lib rename Source/BPBIOS/{def-ww-z33.lib => def-ww-z33t.lib} (96%) rename Source/BPBIOS/{def-ww-z33bnk.lib => def-ww-z33tbnk.lib} (95%) create mode 100644 Source/BPBIOS/def-ww-z34n.lib create mode 100644 Source/BPBIOS/def-ww-z34nbnk.lib rename Source/BPBIOS/{def-ww-z34.lib => def-ww-z34t.lib} (95%) rename Source/BPBIOS/{def-ww-z34bnk.lib => def-ww-z34tbnk.lib} (95%) create mode 100644 Source/BPBIOS/def-ww-z41nbnk.lib rename Source/BPBIOS/{def-ww-z41.lib => def-ww-z41tbnk.lib} (95%) create mode 100644 Source/BPBIOS/z3basen.lib create mode 100644 Source/BPBIOS/z3baset.lib delete mode 100644 Source/BPBIOS/zcpr33.rel.sav create mode 100644 Source/BPBIOS/zcpr33n.rel create mode 100644 Source/BPBIOS/zcpr33t.rel diff --git a/Sim.cfg b/Sim.cfg index 7d4d24f1..fc695e6e 100644 --- a/Sim.cfg +++ b/Sim.cfg @@ -1,11 +1,11 @@ set cpu z80 ;set throttle 4K set cpu noaltairrom -set n8vem enabled debug=verbose +;set n8vem enabled debug=verbose set debug debug.log ; Console -set console telnet=23 +; set console telnet=23 ; Configure Serial Port (Basic polled 16550 UART) set sio tty @@ -21,7 +21,7 @@ echo ROM Image: '%1' attach n8vem0 %1 ; hard disks -set hdsk debug=read;write;verbose +;set hdsk debug=read;write;verbose attach hdsk0 Output\hd0.img attach hdsk1 Output\hd1.img set hdsk0 format=HDSK diff --git a/Sim.cmd b/Sim.cmd new file mode 100644 index 00000000..00a706d3 --- /dev/null +++ b/Sim.cmd @@ -0,0 +1,12 @@ +@echo off +set ROM=Output\SBC_simh.rom +if not "%1"=="" set ROM=Output\%1.rom +if not exist %ROM% goto romerr +rem start C:\Users\WWarthen\Bin\putty.exe -load "SIMH Telnet" +start /w tools\altairz80.exe sim.cfg %ROM% +goto :eof + +:romerr +echo ROM Image %ROM% Not Found! +pause +goto :eof diff --git a/Source/BPBIOS/@WBW Z3ENV.txt b/Source/BPBIOS/@WBW Z3ENV.txt index ede61d20..0b8bb617 100644 --- a/Source/BPBIOS/@WBW Z3ENV.txt +++ b/Source/BPBIOS/@WBW Z3ENV.txt @@ -1,123 +1,229 @@ -============================================================================= -ORIGINAL DISTRIBUTION ENVIRONMENT ------------------------------------------------------------------------------ - A - Environment - FE00H F - Named Dirs - FC00H - Size (# recs)- 2 # of Entries - 14 - B - Flow Ctrl Pkg - FA00H G - External Path - FDF4H - Size (# recs)- 4 # of Entries - 5 - C - I/O Package - EC00H H - Shell Stack - FD00H - Size (# recs)- 12 # of Entries - 4 - D - Res Cmd Proc - F200H Entry Size - 32 - Size (# recs)- 16 I - Msg Buffer - FD80H - E - Command Line - FF00H J - Ext. FCB - FDD0H - Size (bytes) - 203 K - Ext. Stack - FFD0H -============================================================================= +BPBIOS for RomWBW / HBIOS +------------------------- + +The build process included in this directory constructs multiple BPBIOS OS images that +can be loaded dynamically on a running RomWBW CP/M-like system. Normally, you would +boot CP/M and then load the desired variant. On a running system, you would enter +something like "LDSYS BP34T". This document describes the specifics of the build +process and the image variations which are identified by naming convention. + +Each image is composed of three basic components: Command Processor (CCP), Disk +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 +adjusts the ZCPR environment configuration. + +BPBUILD is designed to be run interactively. However, it can be started with an +existing OS image to edit an existing image file. In order to achieve an automated +build process with no interaction, this directory contains several template image (.DAT) +files that have environment configurations defined below. The build process passes the desired +tempate file to BPBUILD on the command line and uses input redirection to automate the +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 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 +possible as indicated below. Additionally, ZSDOS 2.X requires a banked BIOS. + +ZCPR 3.X == ZSDOS 1.X +ZCPR 4.X == ZSDOS 2.X + +BPBIOS must be assembled for the target configuration. BPBIOS includes a DEF-WW-???????.LIB +file during assembly which sets various equates to contol the features and behavior of +BPBIOS. The most critical ones are: + + BANKED: If YES, BPBIOS implements memory banking features + ZSDOS2: If YES, BPBIOS is built to utilize ZSDOS 2.X specifics features + INTPXY: If YES, BPBIOS implements HBIOS proxy code internally w/ stub at FFE0H-FFFFH + +The table below illustrates the target build configurations along with the +.DAT and .LIB files which are utilized for the specific configuration. The "?" +is replaced with a letter that represents one of the ZCPR memory segment configurations +described later in this document. + +BP33?.DAT DEF-WW-Z33?.LIB Non-Banked BPBIOS w/ ZCPR 3.3 & ZSDOS 1.1 +BP33?BNK.DAT DEF-WW-Z33?BNK.LIB Banked BPBIOS w/ ZCPR 3.3 & ZSDOS 1.1 +BP34?.DAT DEF-WW-Z34?.LIB Non-Banked BPBIOS w/ ZCPR 3.4 & ZSDOS 1.1 +BP34?BNK.DAT DEF-WW-Z34?BNK.LIB Banked BPBIOS w/ ZCPR 3.4 & ZSDOS 1.1 +BP41?BNK.DAT DEF-WW-Z41?BNK.LIB Banked BPBIOS w/ ZCPR 4.1 & ZSDOS 2.03 + +The table below illustrates the BPBIOS equates used and the specific CCP/DOS/BIOS +components that are used to generate each configuration. As above, the "?" is +replaced with a letter that represents one of the ZCPR memory segment configurations +described later in this document. + + BP33? BP33?BNK BP34? BP34?BNK BP41?BNK +-------------- -------------- -------------- -------------- -------------- -------------- +BANKED NO YES NO YES YES +ZSDOS2 NO NO NO NO YES +-------------- -------------- -------------- -------------- -------------- -------------- +CCP ZCPR33?.REL ZCPR33?.REL Z34.REL Z34.REL Z41.ZRL +DOS ZSDOS.ZRL ZSDOS.ZRL ZSDOS.ZRL ZSDOS.ZRL ZS203.ZRL +BIOS BP33.REL BP33BNK.REL BP34.REL BP34BNK.REL BP41.REL +-------------- -------------- -------------- -------------- -------------- -------------- -============================================================================= -STANDARD ENVIRONMENT (HBIOS IMBEDDED IN BPBIOS) ------------------------------------------------------------------------------ - A - Environment - FE00H F - Named Dirs - FC00H - Size (# recs)- 2 # of Entries - 14 - B - Flow Ctrl Pkg - FA00H G - External Path - FDF4H - Size (# recs)- 4 # of Entries - 5 - C - I/O Package - EC00H H - Shell Stack - FD00H - Size (# recs)- 12 # of Entries - 4 - D - Res Cmd Proc - F200H Entry Size - 32 - Size (# recs)- 16 I - Msg Buffer - FD80H - E - Command Line - FF00H J - Ext. FCB - FDD0H - Size (bytes) - 203 K - Ext. Stack - FFD0H -============================================================================= +In addition to the configuration options above, ZCPR also utilizes a +defined set of memory segments in upper memory. The location and size of these +segments have many ramifications and general ZCPR / BPBIOS documents +should be consulted to understand these. The build process used here +produces several different configurations which can be loaded at runtime. +The original distributed memory segment configuration occupies the top +of memory which, unfortunately, conflicts with the RomWBW HBIOS need to +occupt this space. + +Although RomWBW HBIOS is implemented in it's own dedicated memory bank, it +requires a small proxy at the top of memory which acts as a mechansim to +route calls to HBIOS. There are two ways to implement this upper memory +proxy. The full proxy occupies FE00H-FFFFH and implements all of the +HBIOS routing code. Alternatively, a mini proxy can be utilized to +minimize the dedicated proxy space in upper memory. The mini proxy +requires just 20H bytes at the top of memory (FFE0H-FFFFH), but requires +that the bulk of the proxy code be implemented internally in BPBIOS. + +Taking the above into account, the build process implements a couple of +memory segment configurations that are compatible with RomWBW HBIOS. +Essentially, these configurations rearrange the ZCPR memory segments +to free up the area required by the HBIOS full or mini proxy. Note +that this is a bit complicated because there are some constraints on +the locations of certain segments. + +First, the RCP, FCP, and IOP segments contain executable code which is +pre-built and intended to run at specific locations. Specifically, the +SYS.RCP, SYS.FCP, and SYS.IOP files provided with the BPBIOS distribution +must be loaded at their original intended location. In theory, new +versions of these files could be created to load at different locations, +but that is not the approach taken here. Instead, the memory segment +configurations are designed to keep these 3 components at the same +location as the original distribution. + +BPBIOS is assembled as relocatable code. Subsequently, the BPBUILD tool +is used to link BPBIOS with the CCP and DOS relocatable code to produce +the absolute image (.IMG file). Note that BPBUILD does more than just +linking. As part of it's work, BPBUILD adjusts the built-in environment +segment to customize the final image for the desired location and size +of Z-System segments. + +The following table summarizes the original memory segment configuration and the +two new configurations utilized by this build process. As indicated above, the +original configuration is incompatible with RomWBW HBIOS because it occupies the +very top of memory. This configuration is shown below purely to document the +original distribued configuration. + +SEGMENT Original T Config N Config +-------------- -------------- -------------- -------------- +Environment FE00 EA00* FE00 + # Recs 2 2 2 +Flow Ctl Pkg FA00 FA00 FA00 + # Recs 4 4 4 +I/O Pkg EC00 EC00 EC00 + # Recs 12 12 12 +Res Cmd Pkg F200 F200 F200 + # Recs 16 16 16 +Cmd Line FF00 EB00* FF00 + # Bytes 203 203 171* +Named Dirs FC00 FC00 FC00 + # Ents 14 14 14 +Ext Path FDF4 FDF4 FDF4 + # Ents 5 5 5 +Shell Stack FD00 FD00 FD00 + # Ents 4 4 4 + Ent Size 32 32 32 +Msg Buffer FD80 FD80 FD80 +Ext FCB FDD0 FDD0 FDD0 +Ext Stack FFD0 EBD0* FFB0* + +User Space E900 E700* E900 + Size 300 300 300 + +Wheel Byte FDFF FDFF FDFF + +The sections below provide a more detailed description of the memory +segment configurations. ============================================================================= -X ENVIRONMENT (HBIOS @ FC00): ALL SEGMENTS SHIFTED DOWN BY $400 +ORIGINAL DISTRIBUTION CONFIGURATION (NO HBIOS): + This is the original distribution configuration of BPBIOS which + occupies all upper RAM (to FFFFH). So, there is no room for the + HBIOS proxy and, therefore, is not compatibile with RomWBW. This + configuration is documented only for reference. It is not built + by the build process and is not compatible with RomWBW HBIOS. ----------------------------------------------------------------------------- - A - Environment - FA00H F - Named Dirs - F800H - Size (# recs)- 2 # of Entries - 14 - B - Flow Ctrl Pkg - F600H G - External Path - F9F4H - Size (# recs)- 4 # of Entries - 5 - C - I/O Package - E800H H - Shell Stack - F900H - Size (# recs)- 12 # of Entries - 4 - D - Res Cmd Proc - EE00H Entry Size - 32 - Size (# recs)- 16 I - Msg Buffer - F980H - E - Command Line - FB00H J - Ext. FCB - F9D0H - Size (bytes) - 171 K - Ext. Stack - FBB0H + A - Environment - FE00H F - Named Dirs - FC00H + Size (# recs)- 2 # of Entries - 14 + B - Flow Ctrl Pkg - FA00H G - External Path - FDF4H + Size (# recs)- 4 # of Entries - 5 + C - I/O Package - EC00H H - Shell Stack - FD00H + Size (# recs)- 12 # of Entries - 4 + D - Res Cmd Proc - F200H Entry Size - 32 + Size (# recs)- 16 I - Msg Buffer - FD80H + E - Command Line - FF00H J - Ext. FCB - FDD0H + Size (bytes) - 203 K - Ext. Stack - FFD0H ============================================================================= ============================================================================= -T ENVIRONMENT (HBIOS @ FC00): ALL SEGMENTS REARRANGED +T CONFIGURATION (HBIOS FULL PROXY @ FC00-FFFF): + This configuration uses a modified layout of the ZSystem segments so + that critical segments can be located at the same address as the + "stock" configuration. Some segments are built with an assumed + memory location and will generally fail if they are not loaded in + that location. The Flow Control Package (FCP) and Resident + Command Processor (RCP) are very sensitive to this. This configuration + places them at their original locations, so they work well. ----------------------------------------------------------------------------- - A - Environment - EA00H F - Named Dirs - E800H - Size (# recs)- 2 # of Entries - 14 - B - Flow Ctrl Pkg - FA00H G - External Path - E9F4H - Size (# recs)- 4 # of Entries - 5 - C - I/O Package - EC00H H - Shell Stack - E900H - Size (# recs)- 12 # of Entries - 4 - D - Res Cmd Proc - F200H Entry Size - 32 - Size (# recs)- 16 I - Msg Buffer - E980H - E - Command Line - EB00H J - Ext. FCB - E9D0H - Size (bytes) - 171 K - Ext. Stack - EBB0H + A - Environment - EA00H F - Named Dirs - FC00H + Size (# recs)- 2 # of Entries - 14 + B - Flow Ctrl Pkg - FA00H G - External Path - FDF4H + Size (# recs)- 4 # of Entries - 5 + C - I/O Package - EC00H H - Shell Stack - FD00H + Size (# recs)- 12 # of Entries - 4 + D - Res Cmd Proc - F200H Entry Size - 32 + Size (# recs)- 16 I - Msg Buffer - FD80H + E - Command Line - EB00H J - Ext. FCB - FDD0H + Size (bytes) - 203 K - Ext. Stack - EBD0H ============================================================================= ============================================================================= -N ENVIRONMENT (HBIOS IMBEDDED IN BPBIOS): SMALL HBIOS STUB AT FFE0-FFFF +N CONFIGURATION (HBIOS MINI PROXY @ FFE0-FFFF): + This configuration frees up the top 20H bytes of memory to make space for the + HBIOS mini-proxy. It does this by shrinking Cmd Line and shifting the Ext Stack + down by 32 bytes. This configuration will only work if INTPXY=YES in HBIOS. ----------------------------------------------------------------------------- - A - Environment - FE00H F - Named Dirs - FC00H - Size (# recs)- 2 # of Entries - 14 - B - Flow Ctrl Pkg - FA00H G - External Path - FDF4H - Size (# recs)- 4 # of Entries - 5 - C - I/O Package - EC00H H - Shell Stack - FD00H - Size (# recs)- 12 # of Entries - 4 - D - Res Cmd Proc - F200H Entry Size - 32 - Size (# recs)- 16 I - Msg Buffer - FD80H - E - Command Line - FF00H J - Ext. FCB - FDD0H - Size (bytes) - 171 K - Ext. Stack - FFB0H + A - Environment - FE00H F - Named Dirs - FC00H + Size (# recs)- 2 # of Entries - 14 + B - Flow Ctrl Pkg - FA00H G - External Path - FDF4H + Size (# recs)- 4 # of Entries - 5 + C - I/O Package - EC00H H - Shell Stack - FD00H + Size (# recs)- 12 # of Entries - 4 + D - Res Cmd Proc - F200H Entry Size - 32 + Size (# recs)- 16 I - Msg Buffer - FD80H + E - Command Line - FF00H J - Ext. FCB - FDD0H + Size (bytes) - 171 K - Ext. Stack - FFB0H ============================================================================= - - -COMPONENT BP33 BP33BNK BP34 BP34BNK BP41 --------------- -------------- -------------- -------------- -------------- -------------- -CCP ZCPR33.REL ZCPR33.REL Z34.REL Z34.REL Z41.ZRL -DOS ZSDOS.ZRL ZSDOS.ZRL ZSDOS.ZRL ZSDOS.ZRL ZS203.ZRL -BIOS BP33.REL BP33BNK.REL BP34.REL BP34BNK.REL BP41.REL - -NOTE: Implementing the environment changes in ZCPR33 requires building a new ZCPR33 from source!!! - - -SEGMENT Original Std Type X Type T Type N --------------- -------------- -------------- -------------- -------------- -------------- - -Environment FE00 FE00 FA00 EA00 FE00 - # Recs 2 2 2 2 2 -Flow Ctl Pkg FA00 FA00 F600 FA00 FA00 - # Recs 4 4 4 4 4 -I/O Pkg EC00 EC00 E800 EC00 EC00 - # Recs 12 12 12 12 12 -Res Cmd Pkg F200 F200 EE00 F200 F200 - # Recs 16 16 16 16 16 -Cmd Line FF00 FF00 FB00 EB00 FF00 - # Bytes 203 203 171 171 171 -Named Dirs FC00 FC00 F800 E800 FC00 - # Ents 14 14 14 14 14 -Ext Path FDF4 FDF4 F9F4 E9F4 FDF4 - # Ents 5 5 5 5 5 -Shell Stack FD00 FD00 F900 E900 FD00 - # Ents 4 4 4 4 4 - Ent Size 32 32 32 32 32 -Msg Buffer FD80 FD80 F980 E980 FD80 -Ext FCB FDD0 FDD0 F9D0 E9D0 FDD0 -Ext Stack FFD0 FFD0 FBB0 EBB0 FFB0 - - -Type X: All segments shifted down by size of HBIOS Proxy (1024 bytes) -Type T: Segments rearranged to allow space for HBIOS Proxy - FC00-FFFF --> EA00-EBFF - Environment, Cmd Line, Named Dirs, Ext Path, Shell Stack, Msg Buffer, Ext FCB, Ext Stack -Type N: Frees up HBIOS interface area at FFE0-FFFF by shrinking Cmd Line and shifting - Ext Stack down by 32 bytes - - -If built with INTPXY=NO, then LDSYS BP34T, BP34TBNK, or BP41T -If built with INTPXY=YES, then LDSYS BP33N, BP33NBNK, BP34N, BP34NBNK, or BP41N - - +BPBIOS is designed to invoke a command at startup (autostart command). There +are 3 ZEX command files customized for this build. They are Z33.ZEX, Z34.ZEX, +and Z41.ZEX. BPBIOS is customized to launch the ZEX command file corresponding +to the version of ZCPR being linked with it. + +The table below summarizes the loadable image files created by the build +process: + +ZCPR ZSDOS BPBIOS STARTUP T (INTPXY=NO) N (INTPXY=YES) +------ ------ -------------- -------------- -------------- -------------- +v3.3 v1.1 NON-BANKED Z33.ZEX BP33T.IMG BP33N.IMG +v3.3 v1.1 BANKED Z33.ZEX BP33TBNK.IMG BP33NBNK.IMG +v3.4 v1.1 NON-BANKED Z34.ZEX BP34T.IMG BP34N.IMG +v3.4 v1.1 BANKED Z34.ZEX BP34TBNK.IMG BP34NBNK.IMG +v4.1 v2.03 BANKED Z41.ZEX BP41TBNK.IMG BP41NBNK.IMG + +WARNING: Once an N configuration image has been loaded, it is no longer +possible to load a T configuration without rebooting. This constraint +exists because the N configurations wipe out all but the top 20H bytes +of memory. The T configurations rely on the full 200H byte HBIOS +proxy. diff --git a/Source/BPBIOS/Build.cmd b/Source/BPBIOS/Build.cmd index 746c33e9..6437d2c5 100644 --- a/Source/BPBIOS/Build.cmd +++ b/Source/BPBIOS/Build.cmd @@ -8,266 +8,68 @@ set ZXBINDIR=../../tools/cpm/bin/ set ZXLIBDIR=../../tools/cpm/lib/ set ZXINCDIR=../../tools/cpm/include/ -rem -rem Z33 + ZSDOS11 w/ Non-banked BPBIOS -rem - -copy def-ww-z33.lib def-ww.lib -zx ZMAC -BPBIO-WW -/P -if exist bp33.prn del bp33.prn -ren bpbio-ww.prn bp33.prn +pushd ZCPR33 && call Build.cmd && popd pause -if exist bp33.rel del bp33.rel -ren bpbio-ww.rel bp33.rel - -if exist bpsys.img del bpsys.img -zx bpbuild -bp33.dat beginning of command line buffer + ld (nxtchr),hl ; Save as pointer to next character to process + ld (hl),0 ; Zero out command line (in case of warm boot) + push hl ; Save pointer to command line + call readbuf ; Input command line (ZEX, submit, shell, + ; ..or user) + pop hl ; Get back pointer to command line + ld a,(hl) ; Check for comment line + cp comment ; Begins with comment character? + jr z,restart ; If so, go back for another line + ; Otherwise, fall through + +;----------------------------------------------------------------------------- + +; COMMAND CONTINUATION PROCESSING ENTRY POINT + +; This is the entry point for continuing the processing of an existing command +; line. The current drive and user values as known to the CPR are combined +; and made into the user/drive byte that CP/M keeps at location 0004. If the +; HIGHUSER option is enabled, the user number for this byte is forced to be +; in the range 0..15. Next the command status flag is processed. The error +; and ECP bits in the actual flag are reset, and the original flag is checked +; for an ECP error return (both ECP bit and error bit set). In that case, +; control is transferred to the error handler. + +nextcmd: + ld hl,(curusr) ; Get currently logged drive and user + ld a,l ; Work on user number + if highuser + and 0fh ; Keep value modulo 16 + endif ;highuser + swap ; Get user into high nibble + or h ; ..and drive into low nibble + ld (udflag),a ; Set user/disk flag in page 0 + + ld a,2 ; Turn ZEX input redirection off + ld (zexinpfl),a + if subon + ld (xsubflag),a ; Turn off XSUB input redirection + endif ;subon + + ld hl,cmdstatfl ; Point to the command status flag (CSF) + ld a,(hl) ; Get a copy into register A + res 1,(hl) ; Reset the actual error bit + res 2,(hl) ; Reset the actual ECP bit + and 110b ; Select ECP and error bits in original flag + cp 110b ; Test for an ECP error + jp z,error ; Process ECP error with error handler + +nextcmd1: + ld sp,stack ; Reset stack + call logcurrent ; Return to default directory + ld hl,(nxtchr) ; Point to first character of next command + push hl ; Save pointer to next character to process + +; We have to capitalize the command line each time because an alias or other +; command line generator may have stuck some new text in. The code is shorter +; if we simply capitalize the entire command rather than trying to capitalize +; only the one command we are about to execute. + +capbuf: ; Capitalize the command line + ld a,(hl) ; Get character + call ucase ; Convert to upper case + ld (hl),a ; Put it back + inc hl ; Point to next one + or a ; See if end of line (marked with null) + jr nz,capbuf ; If not, loop back + + pop hl ; Restore pointer to next character to process + +nextcmd3: + +; ZCPR33 provides a convenience feature to make it easier to enter a leading +; colon to force the current directory to be scanned and to make the CPR skip +; resident commands. If ALTCOLON is active, an alternate character can be +; entered as the first character of a command. The default (and recommended) +; alternative character is the period (it could not have any other meaning +; here). If FASTECP (see below) is not enabled or if ALTONLY is enabled, +; leading spaces on the command line are skipped before looking for the +; alternate character for the colon + + if [ not fastecp ] or [ fastecp and altonly ] + call sksp + endif ;[ not fastecp ] or [ fastecp and altonly ] + + if altcolon ; If allowing alias character for leading colon + ; Set B = ':' and C = alias character ('.') + ld bc,':' shl 8 + altchar + ld a,(hl) ; Get first character in new command line + cp c ; If first character is ALTCHAR, treat as ':' + jr nz,nextcmd3a ; Branch if not '.' + ld (hl),b ; Else replace with colon +nextcmd3a: + endif ;altcolon + + +; ZCPR33 supports three new options that can speed up command processing. +; FASTECP allows commands with a leading space to bypass the search for +; resident commands or transient commands (COM files) along the path and go +; directly to the extended command processor. With SKIPPATH enabled, when +; a command is prefixed by an explicit directory specification (but not a +; lone colon), searching of the path and invocation of the ECP are disabled. +; If the command is not found in the specified directory, the error handler +; is invoked immediately. Finally, if BADDUECP is enabled, when an attempt +; is made to log into an invalid directory, the command is sent directly to +; the ECP, which can provide special handling. To implement these three +; features, the first actual character of the command line is saved as a +; flag in FIRSTCHAR. My apologies for the complexity of these nested +; conditionals. + + if fastecp or skippath or badduecp + + ; With FASTECP we store the first actual + ; ..character and then skip over spaces (unless ALTONLY is + ; ..enabled, in which case we skipped spaces above) + + if fastecp + + if altspace ; If allowing alias character for leading space + ; Set B = ' ' and C = alias character ('/') + ld bc,' ' shl 8 + ecpchar + ld a,(hl) ; Get first character in new command line + cp c ; If first character is ECPCHAR treat as ' ' + jr nz,nextcmd3b ; Branch if not '/' (alternate character) + ld (hl),b ; Else replace with space +nextcmd3b: + endif ;altspace + + ld a,(hl) ; Get first character in command line + ld (firstchar),a ; Save it in flag + call sksp ; Then skip leading spaces + endif ;fastecp + + ; With SKIPPATH but not FASTECP we store the first + ; ..character of the command (spaces were skipped above) + + if [ not fastecp ] and skippath + ld (firstchar),a ; Store first nonspace character + endif ;[ not fastecp ] and skippath + + ; With only BADDUECP (and neither SKIPPATH nor FASTECP) + ; ..we store a null in the FIRSTCHAR flag + + if [ not fastecp ] and [ not skippath ] + xor a + ld (firstchar),a + endif ;[ not fastecp ] and [ not skippath ] + + endif ;fastecp or skippath or badduecp + +; Resume processing of the command line + + or a ; Now at end of line? + jr z,restart ; If so, get a new command line + cp ctrlc ; Flush ^C to prevent error-handler + jr z,restart ; ..invocation on warm boots + + cp cmdsep ; Is it a command separator? + jr nz,nextcmd4 ; If not, skip ahead to process the command + inc hl ; If it is, skip over it + jr nextcmd3 ; ..and process next command + +nextcmd4: + +; Unless we are now running the external error handler, the following code +; saves the address of the current command in Z3MSG+4 for use by programs +; to determine the command line with which they were invoked. + + ld a,(cmdstatfl) ; Get command status flag + bit 1,a ; Test for error handler invocation + jr nz,nextcmd5 ; If so, skip over next instruction + ld (cmdptr),hl + +nextcmd5: + call parser ; Parse entire command line, then look for + ; ..the command + + +;============================================================================= + +; C O M M A N D S E A R C H C O D E + +;============================================================================= + +; CODE FOR FINDING AND RUNNING THE COMMAND + +; Here is the code for running a command. Commands are searched for and +; processed in the following order: +; +; 1) flow control package (FCP) commands and IF state testing +; 2) resident command package (RCP) +; 3) command processor (CPR) +; 4) transient (COM file or extended command processor) +; 5) external error handler +; 6) internal error message and processing +; +; Special notes: +; +; a) If the current command is a shell command, special handling of flow +; control is required. If SHELLIF is enabled so that flow commands are +; allowed in shell alias scripts, then we reset the flow state to its +; initial condition (none) with each shell invocation (and after each +; command is run, we reset the shell bit in the code after CALLPROG). +; In this case shells will run regardless of flow state, and residual +; conditionals from the last running of the shell are flushed. Each +; shell input sequence begins afresh. On the other hand, if SHELLIF is +; off, flow control commands inside a shell script must be flushed so +; that they do not interfere with user entered commands. +; b) Directory prefixes are ignored for flow commands, since all flow control +; processing must pass through the FCP (the command must run even when +; the current flow state is false). +; c) If the command is not found in the FCP, then the current flow state is +; tested. If it is false, the command is flushed and the code branches +; back to get the next command. +; d) If the command had a directory prefix (a colon alone is sufficient), +; then steps #2 and #3 are skipped over,and the command is processed +; immediately as a transient program. +; e) In ZCPR33, unlike ZCPR30, RCP commands are scanned before CPR commands. +; This has been done so that more powerful RCP commands can supercede +; CPR commands. +; f) If the SKIPPATH option is enabled, when an explicit directory is +; specified with a command (but not just a colon), searching of the path +; is bypassed. If the FASTECP option is enabled, commands with leading +; spaces are sent directly to the ECP for processing. +; g) If no external command can be found, ZCPR33 performs extensive error +; handling. If the command error occurred while looking for a shell +; program, then the shell stack is popped. Otherwise, ZCPR33 tries to +; invoke an external, user-specified error handling command line. If +; none was specified or if the error handler invoked by that command +; line cannot be found, the internal error message (step #6) is displayed. + + +;----------------------------------------------------------------------------- + +runcmd: + if shellif ; If shells reininitialize flow control... + ld a,(cmdstatfl) ; Get command status flag + bit 0,a ; Shell bit set? + jr z,fcpcmd ; If not a shell, process command + xor a ; Otherwise, shell is running, so + ld (ifptrfl),a ; ..reinitialize the IF system and continue + endif ;shellif + + +; ---------- Module <<1>>: Flow Control Processing + +; An option is supported here to allow the address of the FCP to be obtained +; from the environment descriptor. This is logically consistent with the +; pholosopy of the Z-System and is useful when one wants to have a single block +; of FCP/RCP memory that can be allocated dynamically between FCP and RCP +; functions. + +fcpcmd: + + if fcp ne 0 ; Omit code if FCP not implemented + + if fcpenv ; If getting FCP address from Z3ENV + + ld e,12h ; Offset in Z3ENV to FCP address + call pkgoff ; Set HL to FCP+5 + jr z,runcmd1 ; Skip if no FCP present + + else ; using fixed FCP address + + ld hl,fcp+5 ; Get address from Z3BASE.LIB + + endif ;fcpenv + + +; If flow control processing is not allowed in shell aliases (scripts running +; as shell commands), then we have to make sure that we flush any flow control +; commmands, otherwise the CPR will attempt to execute them as transients, +; with dire consequences. In the code below we check the shell bit. If it +; is not set, we proceed normally. If it is set, we scan for flow commands +; and then jump past the flow testing to RUNFCP2, where the code will flush +; the command if it was a flow command and execute it unconditionally if not. + + if not shellif + ld a,(cmdstatfl) ; Get command status flag + bit 0,a ; If shell bit not set, + jr z,runfcp1 ; ..we do normal processing + call cmdscan ; Otherwise, check for flow command + jr runfcp2 ; ..and flush if so using code below + endif ;not shellif + +runfcp1: + call cmdscan ; Scan command table in the module + jr z,callprog ; Run if found (with no leading CRLF) + +; This is where we test the current IF state. If it is false, we skip this +; command. + + call iftest ; Check current IF status + +runfcp2: ; If false, skip this command and go on to next + if drvprefix ; If DRVPREFIX we can use code below + jr z,jpnextcmd ; ..to save a byte + else ; Otherwise, we have to do an + jp z,nextcmd ; ..absolute jump + endif ;drvprefix + + endif ;fcp ne 0 + + +runcmd1: + if fastecp or badduecp + ld a,(firstchar) ; If FIRSTCHAR flag set for ECP invocation, + cp ' ' ; ..then go straight to transient processing + jr z,com + endif ;fastecp or badduecp + +colon equ $+1 ; Flag for in-the-code modification + ld a,0 ; If command had a directory prefix (even just + or a ; ..a colon) then skip over resident commands + jr nz,comdir + + +; ---------- Module <<2>>: RCP Processing + +; An option is supported here to allow the address of the RCP to be obtained +; from the environment descriptor. This is logically consistent with the +; pholosopy of the Z-System and is useful when one wants to have a single block +; of FCP/RCP memory that can be allocated dynamically between FCP and RCP +; functions. + + if rcp ne 0 ; Omit code if RCP not implemented + +rcpcmd: + + if rcpenv ; If getting address of rcp from Z3ENV + + ld e,0ch ; Offset in Z3ENV to RCP address + call pkgoff ; Set HL to address of RCP+5 + jr z,cprcmd ; Skip if no RCP + + else ; using fixed RCP address + + ld hl,rcp+5 ; Get address from Z3BASE.LIB + + endif ; rcpenv + + call cmdscan ; Check for command in RCP + jr z,callproglf ; If so, run it (with leading CRLF) + + endif ;rcp ne 0 + + +; ---------- Module <<3>>: CPR-Resident Command Processing + +cprcmd: + + ld hl,cmdtbl ; Point to CPR-resident command table + call cmdscan ; ..and scan for the command + jr z,callprog ; If found, run it (with no leading CRLF) + + + +; ---------- Module <<4>>: Transient Command Processing + +comdir: ; Test for DU: or DIR: only (directory change) + + if drvprefix + + ld a,(cmdfcb+1) ; Any command name? + cp ' ' + jr nz,com ; If so, must be transient or error + + ; Entry point for change of directory only + + if wdu ; If controlled by wheel.. + + ld a,(z3whl) ; Get wheel byte + or a ; If wheel on, go on ahead + jr nz,comdir1 + + if badduecp + ld (colon),a ; Pretend there is no colon + ld a,' ' ; Force invocation of ECP + ld (firstchar),a + jr com + else ;not badduecp + ld a,ecduchg + jr z,error + endif ;badduecp + + endif ; wdu + +comdir1: + ld hl,(tempusr) ; Get temporary drive and user bytes + + if not highuser ; If only users 0..15 can be logged + ld a,l ; Get user number and + cp 16 ; ..make sure not above 15 + jr nc,baddirerr ; If out of range, invoke error handling + endif ;not highuser + + dec h ; Shift drive to range 0..15 + ld (curusr),hl ; Make the temporary DU into the current DU + call logcurrent ; Log into the new current directory +jpnextcmd: + jp nextcmd ; Resume command line processing + + else ;not drvprefix + + if badduecp + xor a ; Pretend there is no colon + ld (colon),a + ld a,' ' ; Force invocation of ECP + ld (firstchar),a + else ;not badduecp + ld a,ecduchg + jr z,error + endif ;badduecp + + endif ;drvprefix + + +com: ; Process transient command + + ld a,(cmdstatfl) ; Check command status flag to see if + and 2 ; ..error handler is running + ld (zexinpfl),a ; Store result in ZEX control flag (2 will turn + ; ..ZEX input redirection off (0 = on) + if subon + ld (xsubflag),a ; Turn off XSUB input redirection also + endif ;subon + + ld hl,tpa ; Set default execution/load address + ld a,3 ; Dynamically load type-3 and above ENVs + call mload ; Load memory with file specified in cmd line + ld a,(cmdstatfl) ; Check command status flag to see if + and 100b ; ..ECP running (and suppress leading CRLF) + +; CALLPROG is the entry point for the execution of the loaded program. At +; alternate entry point CALLPROGLF if the zero flag is set, a CRLF is sent to +; the console before running the program. + +callproglf: + call z,crlf ; Leading new line + +callprog: + ; Copy command tail into TBUFF + +tailsv equ $+1 ; Pointer for in-the-code modification + ld hl,0 ; Address of first character of command tail + ld de,tbuff ; Point to TBUFF + push de ; Save pointer + ld bc,7e00h ; C=0 (byte counter) and B=7E (max bytes) + inc de ; Point to first char +tail: + ld a,(hl) ; Get character from tail + call tsteol ; Check for EOL + jr z,tail1 ; Jump if we are done + ld (de),a ; Put character into TBUFF + inc hl ; Advance pointers + inc de + inc c ; Increment character count + djnz tail ; If room for more characters, continue + call print ; Display overflow message + db bell ; ..ring bell + db 'Ovf','l'+80h ; ..then continue anyway +tail1: + xor a ; Store ending zero + ld (de),a + pop hl ; Get back pointer to character count byte + ld (hl),c ; Store the count + +; Run loaded transient program + + call defltdma ; Set DMA to 0080h standard value + +; Perform automatic installation of Z3 programs (unless type-2 environment) + + ld hl,(execadr) ; Get current execution address + call z3chk ; See if file is a Z3 program + jr nz,noinstall ; Branch if not + + cp 2 ; If type-2 (internal) environment + jr z,noinstall ; ..do not perform installation + + inc hl ; Advance to place for ENV address + ld (hl),low z3env ; Put in low byte of environment address + inc hl + ld (hl),high z3env ; Put in high byte + +noinstall: + +; Execution of the program occurs here by calling it as a subroutine + + ld hl,z3env ; Pass environment address to program in HL +execadr equ $+1 ; Pointer for in-line code modification + call 0 ; Call transient + +; Return from execution + + if shellif ; If flow processing allowed in shells... + ld hl,cmdstatfl ; Reset the shell bit in the command status + res 0,(hl) ; ..flag so multiple-command shells will work + endif ;shellif + + ; Continue command processing + if drvprefix ; If DRVPREFIX we can save a byte by + jr jpnextcmd ; ..doing a two-step relative jump + else ; Otherwise, we just have to do + jp nextcmd ; ..the absolute jump + endif ;drvprefix + + +; ---------- Module <<5>>: External Error Handler Processing + +baddirerr: + ld a,ecbaddir ; Error code for bad directory specification + +error: + +; If we are returning from an external command to process an error, we want +; to leave the error return code as it was set by the transient program. + + ld hl,cmdstatfl ; Point to command status flag + bit 3,(hl) ; Check transient error flag bit + jr nz,error1 ; If set, leave error code as set externally + ld (ecflag),a ; Otherwise, save error code from A register + +error1: + res 2,(hl) ; Reset the ECP bit to prevent recursion of + ; ..error handler by programs that don't + ; ..clear the bit + bit 0,(hl) ; Was error in attempting to run a shell? + jr nz,errsh ; If so, pop shell stack + +; The following code is included to avoid a catastrophic infinite loop when +; the external error handler cannot be found. After one unsuccessful try, +; the internal code is invoked. + + bit 1,(hl) ; Was an error handler already called? + jr nz,errintrnl ; If so, use internal error handler + +; If the current IF state is false, we would like to ignore the error and just +; go on with the next command. Unfortunately, for some errors (e.g., a bad +; command format such as a command with a wildcard character) the error handler +; is invoked before the pointer in the multiple command line buffer is set up +; to the next command. In that case, we fall into an infinite loop. We also +; must not allow the external error handler to run, since it will not run and +; we will again fall into an infinite loop. The present code is not so bad, of +; course, since even a command in a false part of a command sequence should not +; have a true error in it. We have already put in code to bypass password +; checking during a false IF state, since a command with a password is not an +; invalid command. + + if fcp ne 0 + call iftest ; If we are in a false IF state, external + jr z,errintrnl ; ..handler will not run, so use built-in + endif ;fcp ne 0 + + set 1,(hl) ; Set command status flag for error invocation + ld hl,errcmd ; Point to error handler command line + ld a,(hl) ; Check first byte for presence of an + or a ; ..error command line + jr z,errintrnl ; If no error handler, use built-in one + ld (nxtchr),hl ; Else, use error command line as next command + jp nextcmd1 ; Run command without resetting status flag + + +; ---------- Module <<6>>: Resident Error Handler Code + +; If the error is with the invocation of a shell command, we pop the bad shell +; command off the stack to prevent recursion of the error. We then use the +; the internal error handler to echo the bad shell command. + +errsh: + + ld de,shstk ; Point to current entry in shell stack + ld hl,shstk+shsize ; Point to next entry in stack + ld bc,[shstks-1]*shsize ; Bytes to move + ldir ; Pop the stack + xor a ; Clear the last entry position + ld (de),a + +errintrnl: + if subon + call subkil ; Terminate active submit file if any + endif ;subon + + call crlf ; New line + ld hl,(cmdptr) ; Point to beginning of bad command + call printhl ; Echo it to console + call print ; Print '?' + defb '?'+80h + jp restart ; Restart CPR + +; End ZCPR33-2.Z80 + + page + +; ZCPR33-3.Z80 + +;============================================================================= +; +; C O M M A N D L I N E P A R S I N G C O D E +; +;============================================================================= + +; This code parses the command line pointed to by HL. The command verb is +; parsed, placing the requested program name into the command file control +; block. The drive and user bytes are set. If an explicit DU or DIR was +; given, the COLON flag is set so that the processor knows about this later +; when the command search path is built. + +parser: + + ld de,cmdfcb ; Point to the command FCB + push de + call initfcb ; Initialize the FCB + pop de + ld (duerrflag),a ; Store zero (INITFCB ends with A=0) into flag + call scanner ; Parse first token on command line into FCB + jr nz,badcmd ; Invoke error handler if '?' in command + +duerrflag equ $+1 ; Pointer for in-the-code modification + ld a,0 ; See if bad DU/DIR specified with command verb + or a + + if badduecp + jr z,parser1 ; If DU/DIR is OK, skip ahead + ld a,(cmdstatfl) ; If ECP already running + bit 2,a ; ..skip ahead + jr nz,parser1 + ld a,(cmdfcb+1) ; If not a directory change command + sub ' ' ; ..invoke error handler + jr nz,baddirerr + ; If bad directory change attempt, + ld (tmpcolon),a ; ..pretend there is no colon (A=0) + ld a,' ' ; ..and force immediate ECP invocation + ld (firstchar),a ; ..when command is processed + else ; If errors not processed by ECP then + jr nz,baddirerr ; ..invoke error handler + endif ; badduecp + +parser1: + ld de,cmdfcb+9 ; Make sure no explicit file type was given + ld a,(de) ; Get first character of file type + cp ' ' ; Must be blank +badcmd: + ld a,ecbadcmd ; Error code for illegal command form + jr nz,error ; If not, invoke error handler + + push hl ; Save pointer to next byte of command + ld hl,commsg ; Place default file type (COM) into FCB + ld bc,3 + ldir + pop hl ; Get command line pointer back + +; The following block of code is arranged so that the COLON flag is set only +; when an explicit directory specification is detected in the command verb. +; Other parses also change the TMPCOLON flag, but only when passing here does +; the flag get transferred to COLON. + +tmpcolon equ $+1 ; Pointer for in-the-code modification + ld a,0 ; ..by SCANNER routine + ld (colon),a ; If explicit DU/DIR, set COLON flag + +; Find the end of this command and set up the pointer to the next command. + + push hl ; Save command line pointer + dec hl ; Adjust for preincrementing below +parser2: ; Find end of this command + inc hl ; Point to next character + ld a,(hl) ; ..and get it + call tsteol ; Test for end of command + jr nz,parser2 ; Keep looping if not + + ld (nxtchr),hl ; Set pointer to next command + pop hl ; Get back pointer to current command tail + +; This block of code parses two tokens in the command line into the two +; default FCBs at 5Ch and 6Ch. It also sets a pointer to the command tail +; for later copying into the command tail buffer at 80h. This code is used +; first when attempting to parse a normal command line and possibly again +; later when the entire user's command is treated as a tail to the extended +; command processor. The resident JUMP and SAVE commands use it also, and +; the entry point is available at location CCP+9 for use by other programs. + +parsetail: + ld (tailsv),hl ; Save pointer to command tail + + ; Process first token + + ld de,tfcb ; Point to first default FCB + push de ; Save pointer while initializing + call initfcb ; Initialize both default FCBs + pop de + call sksp ; Skip over spaces in command line + call nz,scanner ; If not end of line, parse the token + ; ..into first FCB + ld (parseptr),hl ; Save pointer to second token for reparsing + + ; Process second token + + call sksp ; Skip over spaces + ret z ; Done if end of line or end of command + ld de,tfcb2 ; Point to second default FCB + ; ..and fall through to SCANNER routine + +;----------------------------------------------------------------------------- + +; This routine processes a command line token pointed to by HL. It attempts +; to interpret the token according to the form [DU:|DIR:]NAME.TYP and places +; the corresponding values into the FCB pointed to by DE. On exit, HL points +; to the delimiter encountered at the end of the token. The Z flag is set if +; a wild card was detected in the token. + +scanner: + xor a ; Initialize various flags + ld (tmpcolon),a ; Set no colon + ld bc,(curusr) ; Get current drive and user into BC + inc b ; Shift drive range from 0..15 to 1..16 + ld (tempusr),bc ; Initialize temporary DU + + call scanfld8 ; Extract possible file name + cp ':' ; Was terminating character a colon? + jr nz,scantype ; If not, go on to extract file type + ld (tmpcolon),a ; Otherwise, set colon and process DU/DIR + inc hl ; Point to character after colon + +; Code for resolving directory specifications (macro RESOLVE is defined in +; Z33MAC.LIB). RESOLVE returns with a nonzero value and a NZ flag setting +; if the DU/DIR specification cannot be resolved. There are quite a few +; possibilities here. + + ; Case where both forms are accepted + + if accptdir and accptdu + if dufirst + resolve du,dir ; Check DU: form before DIR: form + else + resolve dir,du ; Check DIR: form before DU: form + endif ;dufirst + endif ;accptdir and accptdu + + ; Cases of only one form accepted + + if accptdu and not accptdir + resolve du, ; Check only DU: form + endif ;accptdu and not accptdir + + if accptdir and not accptdu + resolve dir, ; Check only DIR: form + endif ;accptdir and not accptdu + + ; Case of neither form accepted + + if not accptdir and not accptdu + push hl ; Save pointer to command string + inc de ; Point to first character of name + ld a,(de) ; Get it + dec de ; Restore the pointer + sub ' ' ; If no name is there, A=0 and Z flag set + endif ;not accptdir and not accptdu + + push de ; Save pointer to FCB again + push af ; Save bad directory flag + ld a,(tempdr) ; Set designated drive + ld (de),a ; ..into FCB + inc de ; Point to file name field + call ifcb ; Perform partial init (set user code) + pop af ; Get bad directory flag back + ld (duerrflag),a ; Save flag in parser code + jr z,scanner1 ; Branch if valid directory specified + dec de ; Back up to record count byte + dec de + ld (de),a ; Store error flag there (NZ if error) +scanner1: + pop de ; Get FCB pointer back + pop hl ; Restore pointer to command string + call scanfld8 ; Scan for file name + +; This code processes the file type specification in the token + +scantype: + ld a,(hl) ; Get ending character of file name field + ex de,hl ; Switch FCB pointer into HL + ld bc,8 ; Offset to file type field + add hl,bc + ex de,hl ; Switch pointers back + + ld b,3 ; Maximum characters in file type + cp '.' ; See if file type specified + jr nz,scantype2 ; If not, skip over file type parsing + + inc hl ; Point to character after '.' + push de ; Save pointer to FCB file type + call scanfield ; Parse file type into FCB + pop de + +scantype2: + ex de,hl ; Swap pointers again + ld bc,5 ; Offset from file type to S1 field in FCB + add hl,bc + ex de,hl ; Swap pointers back + ld a,(tempusr) ; Get specified user number + ld (de),a ; ..and store in S1 byte of FCB + +scan3: ; Skip to space character, character after an + ; ..equal sign, or to end of command + ld a,(hl) ; Get next character + cp ' '+1 ; Done if less than space + jr c,scan4 + call tsteol ; Done if end of line or end of command + jr z,scan4 + inc hl ; Skip on to next character + cp '=' ; If not equal sign + jr nz,scan3 ; ..keep scanning + +scan4: ; Set zero flag if '?' in filename.typ + +qmcnt equ $+1 ; Pointer for in-the-code modification + ld a,0 ; Number of question marks + or a ; Set zero flag + ret + +; This routine invokes SCANFIELD for a file name field. It initializes the +; question mark count and preserves the FCB pointer. + +scanfld8: + xor a ; Initialize question mark count + ld (qmcnt),a + push de ; Save pointer to FCB + ld b,8 ; Scan up to 8 characters + call scanfield + pop de ; Restore pointer to FCB + ret + +; This routine scans a command-line token pointed to by HL for a field whose +; maximum length is given by the contents of the B register. The result is +; placed into the FCB buffer pointed to by DE. The FCB must have had its name +; and type fields initialized before this routine is called. Wild cards of +; '?' and '*' are expanded. On exit, HL points to the terminating delimiter. + +scanfield: + call sdelm ; Done if delimiter encountered + ret z + inc de ; Point to next byte in FCB + cp '*' ; Is character a wild card? + jr nz,scanfld1 ; Continue if not + + ld a,'?' ; Process '*' by filling with '?'s + ld (de),a + call qcountinc ; Increment count of question marks + jr scanfld2 ; Skip so HL pointer left on '*' + +scanfld1: ; Not wildcard character '*' + ld (de),a ; Store character in FCB + inc hl ; Point to next character in command line + cp '?' ; Check for question mark (wild) + call z,qcountinc ; Increment question mark count +scanfld2: + djnz scanfield ; Decrement char count until limit reached +scanfld3: + call sdelm ; Skip until delimiter + ret z ; Zero flag set if delimiter found + inc hl ; Pt to next char in command line + jr scanfld3 + + +; Subroutine to increment the count of question mark characters in the +; parsed file name. + +qcountinc: + push hl + ld hl,qmcnt ; Point to count + inc (hl) ; Increment it + pop hl + ret + +;----------------------------------------------------------------------------- + +; Validate the password pointed to by HL. Prompt user for password entry +; and return zero if it is correct. + + if pwcheck + +passck: + push hl ; Save pointer to password + call print ; Prompt user + defb cr,lf,'PW?',' '+80h + ld hl,pwlin ; Set up buffer for user input + ld bc,90ah ; Set 0ah (BDOS readln function) in C + ld (hl),b ; ..and 9 (max character count) in B + ex de,hl ; Switch buffer pointer to DE + + if pwnoecho + ld a,0c9h ; Disable BIOS conout routine to + ld (bios+0ch),a ; ..suppress password echoing + call bdossave ; Get user input + ld a,0c3h ; Reenable BIOS conout routine + ld (bios+0ch),a + else ;not pwnoecho + call bdossave ; Get user input + endif ;pwnoecho + + ex de,hl ; Restore pointer to HL + inc hl ; Point to count of characters entered + ld a,(hl) ; Get character count + inc hl ; Point to first character + push hl ; Save pointer while marking end of input + call addah ; Advance HL to just past last character + ld (hl),' ' ; Place space there + pop de ; Restore pointer to beginning of user input + pop hl ; Restore pointer to password from NDR + ld b,8 ; Maximum characters to compare +pwck: + ld a,(de) ; Get next user character + call ucase ; Capitalize it + cp (hl) ; Compare to NDR + ret nz ; No match + cp ' ' ; If last user character matched space in + ret z ; ..NDR, then we have a complete match + inc hl ; If not done, point to next characters + inc de + djnz pwck ; (flags not affected by DJNZ) + xor a ; Set zero flag and + ret ; ..return Z to show success + + endif ; pwcheck + +;----------------------------------------------------------------------------- + +; This code attempts to interpret the token in the FCB pointed to by register +; pair DE as a DIR (named directory) prefix. If it is successful, the drive +; and user values are stored in TEMPDR and TEMPUSR, the zero flag is set, and +; a value of zero is returned in register A. +; +; If the named directory is found to be password restricted, then the user is +; asked for the password (unless the directory is the one currently logged or +; the current IF state is false). If an incorrect password is entered, the +; error handler is generally invoked directly. The exception to this is when +; the transient program bit is set in the command status flag (this bit would +; be set by a non-CPR program that calls REPARSE). In this case the default +; directory is returned, the zero flag is reset, and a nonzero value in +; returned in register A to show a bad directory. In addition, the code in +; SCANNER will set record-count byte in the FCB to a nonzero value so that +; the calling program can detect the error. [Note: if DU processing is also +; allowed and it follows DIR processing, DUSCAN will also be called. Unless +; there is a passworded directory with a DU form, this will cause no trouble.] + + if accptdir + +dirscan: + +; If the DU form is not allowed, we have to detect a colon-only condition here. +; Otherwise DUSCAN will take care of it. + + inc de ; Point to first byte of directory form + + if not accptdu + ld a,(de) ; Get first character of directory + sub ' ' ; If it is a blank space + ret z ; ..we have a successful directory resolution + endif ;not accptdu + + ex de,hl ; Switch pointer to FCB to HL + + if ndrenv ; If getting NDR address for Z3ENV + ld e,15h ; Offset to NDR address + push hl ; Preserve pointer to FCB + call pkgoff ; Get NDR address from ENV into DE + pop hl + jr z,direrr ; Branch if no NDR implemented + else ; using fixed address of NDR buffer + ld de,z3ndir ; Point to first entry in NDR + endif ; ndrenv + +dirscan1: + ld a,(de) ; Get next character + or a ; Zero if end of NDR + jr z,direrr + inc de ; Point to name of directory + inc de + push hl ; Save pointer to name we are looking for + push de ; Save pointer to NDR entry + ld b,8 ; Number of characters to compare + +dirscan2: + ld a,(de) + cp (hl) + jr nz,dirscan3 ; If no match, quit and go on to next DIR + inc hl ; Point to next characters to compare + inc de + djnz dirscan2 ; Count down + +dirscan3: + pop de ; Restore pointers + pop hl + jr z,dirscan4 ; Branch if we have good match + + ex de,hl ; Advance to next entry in NDR + ld bc,16 ; 8 bytes for name + 8 bytes for password + add hl,bc + ex de,hl + jr dirscan1 ; Continue comparing + +; If ACCPTDU is enabled, we can share similar code in DUSCAN and do not need +; the code here. + + if not accptdu +direrr: ; No match found + dec a + ret + endif ;not accptdu + +dirscan4: ; Match found + ex de,hl ; Switch pointer to NDR entry into HL + push hl ; ..and save it for later + dec hl ; Point to user corresponding to the DIR + ld c,(hl) ; Get user value into C + dec hl ; Point to drive + ld b,(hl) ; Get it into B + + if pwcheck + + ld hl,(curusr) ; Get current drive/user into HL + inc h ; Shift drive to range 1..16 + xor a ; Clear carry flag + sbc hl,bc ; Compare + pop hl ; Restore pointer to NDR entry + jr z,setdu ; If same, accept values without PW checking + +; If WPASS is set, then password checking is bypassed when the wheel byte is +; set. + + if wpass + ld a,(z3whl) ; Get wheel byte + or a ; If wheel byte set + jr nz,setdu ; ..skip checking passwords + endif ;wpass + +; This code is a bit tricky. We do not want to be asked for passwords for +; named directory references in commands when the current IF state is false. +; So, first we check to see if there is a password on the directory. If not, +; we proceed to set the temporary DU to the specified directory. If there is +; a password, we check the current IF state. If it is false, we do not check +; passwords and pretend there was no password. However, we leave the current +; directory in effect. This will work properly in all but one rare +; circumstance. When the command is an 'OR' command with a reference to a +; passworded named directory (e.g., "OR EXIST SECRET:FN.FT"), the password +; will not be requested and the current directory will be used instead of the +; specified one. + + push bc ; Save requested drive/user + ld bc,8 ; Point to password in NDR + add hl,bc + ld a,(hl) ; Get first character of password + cp ' ' ; Is there a password? + + if fcp eq 0 ; If FCP not implemented ... + + call nz,passck ; Perform password checking if pw present + + else ;fcp ne 0 ; FCP implemented ... + + jr z,dirscan5 ; If no pw, skip ahead + call iftest ; Otherwise, test current IF state + pop bc ; Restore BC in case we return now + ret z ; If false IF in effect, fake success without + ; ..checking password (but TEMPDR/TEMPUSR not + ; ..set) + push bc ; Otherwise, save BC again + call passck ; Perform password checking + + endif ;fcp eq 0 + +dirscan5: + pop bc ; Restore requested drive/user + jr z,setdu ; If not bad password, set it up + ld a,(cmdstatfl) ; See if external invocation (disable + bit 3,a ; ..error handling if so) + ret nz ; Return NZ to show bad directory + ld a,ecbadpass ; Error code for bad password + jp error + + else ;not pwcheck + + pop hl ; Clean up stack + if accptdu ; If we cannot fall through, branch + jr setdu + endif ;accptdu + + endif ;pwcheck + + if not accptdu ; If NOT ACCPTDU, we have to supply code here +setdu: + ld (tempusr),bc + xor a ; Set Z to flag success + ret + endif ;not accptdu + + endif ;accptdir + +;----------------------------------------------------------------------------- + +; This code attempts to interpret the token in the FCB pointed to by register +; pair DE as a DU (drive/user) prefix. If it is successful, the drive and +; user values are stored in TEMPDR and TEMPUSR, the zero flag is set, and a +; value of zero is returned in register A. Otherwise the zero flag is reset +; and a nonzero value is returned in register A. +; +; The ADUENV option allows acceptance of the DU form to be controlled by the +; DUOK flag in the environment descriptor. An additional feature of this code +; when the ADUENV option is enabled is that a DU value is always accepted, +; even if DUOK is off and even if it is outside the normally allowed range, +; if it corresponds to a named directory with no password. The currently +; logged directory is unconditionally acceptable (if you got there once, you +; can stay as long as you like without further hassles). + + if accptdu ; Allow DU: form + +direrr: ; This code may do double duty for DIRSCAN + ; ..above +duerr: + xor a ; Return NZ to show failure + dec a + ret + +duscan: + ex de,hl ; Switch FCB pointer to HL + inc hl ; Point to first byte of file name in FCB + + ld bc,(curusr) ; Preset C to current user, B to current drive + ld a,(hl) ; Get possible drive specification + sub 'A' ; Otherwise convert to number 0..15 + jr c,duscan1 ; If < 0, leave B as is + cp 16 + jr nc,duscan1 ; If > 15, leave B as is + ld b,a ; Otherwise use value given + inc hl ; ..and point to next character + +duscan1: + inc b ; Shift drive to range 1..16 + ld a,(hl) ; Get possible user specification + cp ' ' + jr z,duscan2 ; If none present, leave C as is + push bc ; Save DU values in BC + call decimal1 ; Get specified decimal user number into BC + pop hl ; Restore values to HL + jr c,duerr ; Return NZ if invalid decimal conversion + ld a,b ; Get high byte of result + or a ; Make sure it is zero + ret nz ; If not, return NZ to show bad user number + ld b,h ; DU value is now in BC + +; If the specified directory is the currently logged directory, accept it +; even if it is out of range and/or password protected. + +duscan2: + ld hl,(curusr) ; Get current drive/user into HL + inc h ; Shift drive to range 1..16 + xor a ; Clear carry flag + sbc hl,bc ; Compare values + jr z,setdu + +; If the specified DU corresponds to a named directory with no password, or +; if WPASS is enabled so that password checking is not performed when the +; wheel byte is set, then accept it. + + if z3ndir ne 0 + + call du2dir ; See if there is a matching named directory + jr z,duscan3 ; If not, skip on + + if pwcheck ; If passwords are being checked... + + if wpass + ld a,(z3whl) ; Get wheel byte + or a ; If wheel byte set, skip checking passwords + jr nz,setdu ; ..and accept the DU values + endif ;wpass + + ld de,9 ; Advance to password + add hl,de + ld a,(hl) ; Get first character of password + cp ' ' + jr z,setdu ; If none, we have a valid DU + + else ;not pwcheck + + jr setdu ; Set the DU + + endif ;pwcheck + + endif ;z3ndir ne 0 + +duscan3: + if aduenv ; Check DUOK flag in ENV + ld a,(duokfl) ; Get flag + or a ; If DU not accepted + jr z,duerr ; ..skip over the DU scan + endif ;aduenv + + if duenv ; If getting max drive and user from ENV + ld hl,(maxdrenv) ; Get max drive into L and max user into H + ld a,l ; Test drive value + cp b + jr c,duerr + ld a,h ; Test user value + cp c + jr c,duerr + else ; Using fixed values of max DU + ld a,maxdisk + cp b + jr c,duerr + ld a,maxusr + cp c + jr c,duerr + endif ;duenv + +setdu: + ld (tempusr),bc + xor a ; Set Z to flag success + ret + + endif ; accptdu + +; End ZCPR33-3.Z80 + + page + +; ZCPR33-4.Z80 + +;============================================================================= +; +; G E N E R A L S U B R O U T I N E S S E C T I O N +; +;============================================================================= + + +;----------------------------------------------------------------------------- +; +; CHARACTER I/O BDOS ROUTINES +; +;----------------------------------------------------------------------------- + +; Get uppercase character from console (with ^S processing). Registers B, +; D, H, and L are preserved. The character is returned in A. + +conin: + ld c,1 ; BDOS conin function + call bdossave + ; Fall through to UCASE + +;-------------------- + +; Convert character in A to upper case. All registers except A are preserved. + +ucase: + and 7fh ; Mask out msb + cp 61h ; Less than lower-case 'a'? + ret c ; If so, return + cp 7bh ; Greater than lower-case 'z'? + ret nc ; If so, return + and 5fh ; Otherwise capitalize + ret + +;---------------------------------------- + +; Output CRLF + +crlf: + call print + db cr + db lf or 80h + ret + +;---------------------------------------- + +; Output character in A to the console. All registers are preserved. + +conout: + push de + push bc + ld c,2 ; BDOS conout function +output: ; Entry point for LCOUT below + ld e,a + call bdossave + pop bc + pop de + ret + +;---------------------------------------- + +; Print the character string immediately following the call to this routine. +; The string terminates with a character whose high bit is set or with a null. +; At entry point PRINTC the string is automatically preceded by a +; carriage-return-linefeed sequence. All registers are preserved except A. + +printc: + call crlf ; New line + +print: + ex (sp),hl ; Get pointer to string + call printhl ; Print string + ex (sp),hl ; Restore HL and set return address + ret + +;---------------------------------------- + +; Print the character string pointed to by HL. Terminate on character with +; the high bit set or on a null character. On return HL points to the byte +; after the last character displayed. All other registers except A are +; preserved. + +printhl: + ld a,(hl) ; Get a character + inc hl ; Point to next byte + or a ; End of string null? + ret z + push af ; Save flags + and 7fh ; Mask out msb + call conout ; Print character + pop af ; Get flags + ret m ; String terminated by msb set + jr printhl + + +;----------------------------------------------------------------------------- +; +; FILE I/O BDOS ROUTINES +; +;----------------------------------------------------------------------------- + +; Read a record from a file to be listed or typed + + if lton ; Only needed for LIST and TYPE functions + +readf: + ld de,tfcb + jr read + + endif ; lton + +;---------------------------------------- + +; Read a record from the command file named in CMDFCB + +readcmd: + ld de,cmdfcb + +; Read a record from file whose FCB is pointed to by DE + +read: + ld c,14h ; Read-sequential function + ; Fall through to BDOSSAVE + +;-------------------- + +; Call BDOS for read and write operations. The flags are set appropriately. +; The BC, DE, and HL registers are preserved. + +bdossave: + putreg + call bdos + getreg + or a ; Set flags +note: ; This return is used for NOTE command, too + ret + + +;----------------------------------------------------------------------------- +; +; MISCELLANEOUS BDOS ROUTINES +; +;----------------------------------------------------------------------------- + +; Set DMA address. At the entry point DEFLTDMA the address is set to the +; default value of 80H. At the entry point DMASET it is set to the value +; passed in the DE registers. + +defltdma: + ld de,tbuff +dmaset: + ld c,1ah + jr bdossave + +;---------------------------------------- + +; Log in the drive value passed in the A register (A=0). + +setdrive: + ld e,a + ld c,0eh + jr bdossave + +;---------------------------------------- + +; Open a file. At entry point OPENCMD the file is the one specified in +; CMDFCB, and the current record is set to zero. At entry point OPEN +; the file whose FCB is pointed to by DE is used. + +opencmd: + xor a ; Set current record to 0 + ld (cmdfcb+32),a + ld de,cmdfcb ; Command file control block + ; Fall through to open + +open: + ld c,0fh ; BDOS open function + ; Fall through to BDOSTEST + +;-------------------- + +; Invoke BDOS for disk functions. This routine increments the return code in +; register A so that the zero flag is set if there was an error. Registers +; BC, DE, and HL are preserved. + +bdostest: + call bdossave + inc a ; Set zero flag for error return + ret + +;---------------------------------------- + +; Close file whose FCB is pointed to by DE. + + if saveon or subon +close: + ld c,10h + jr bdostest + endif ;saveon or subon + +;---------------------------------------- + +; Search for first matching file. At entry point SRCHFST1 the first default FCB +; is used. At entry point SRCHFST the FCB pointed to by DE is used. + + if diron or eraon or renon or saveon +srchfst1: + ld de,tfcb ; Use first default FCB + endif ;diron or eraon or renon or saveon + +srchfst: + ld c,11h + jr bdostest + +;----------------------------------------------------------------------------- + +; Search for next matching file whose FCB is pointed to by DE. + + if diron or eraon ; Only needed by DIR and ERA functions +srchnxt: + ld c,12h + jr bdostest + endif ; diron or eraon + +;----------------------------------------------------------------------------- + +; Kill any submit file that is executing. + + if subon + +subkil: + ld hl,subflag ; Check for submit file in execution + ld a,(hl) + or a ; 0=no + ret z ; If none executing, return now + ; Kill submit file + xor a + ld (hl),a ; Zero submit flag + call setuser ; Log in user 0 + ld de,subfcb ; Delete submit file + ; ..by falling through to delete routine + + endif ; subon + +;-------------------- + +; Delete file whose FCB is pointed to by DE. + + if eraon or renon or saveon or subon +delete: + ld c,13h + jr bdossave + endif ;eraon or renon or saveon or subon + +;----------------------------------------------------------------------------- + +; Get and set user number. Registers B, D, H, and L are preserved. Register +; E is also preserved at entry point SETUSER1. + +getuser: + ld a,0ffh ; Get current user number +setuser: + ld e,a ; User number in E +setuser1: + ld c,20h ; Get/Set BDOS function + jr bdossave + + +;----------------------------------------------------------------------------- +; +; GENERAL UTILITY ROUTINES +; +;----------------------------------------------------------------------------- + + +; This subroutine checks to see if a program loaded at an address given by HL +; has a Z3ENV header. If the header is not present, the zero flag is reset. +; If it is present, the zero flag is set, and on return HL points to the +; environment-type byte and A contains that byte. + +z3chk: + ld de,z3env+3 ; Point to 'Z3ENV' string in ENV + inc hl ; Advance three bytes to possible program + inc hl ; ..header + inc hl + ld b,5 ; Characters to compare +z3chk1: ; Check for Z3 ID header + ld a,(de) ; Get character from ENV descriptor + cp (hl) ; Compare it to loaded file + ret nz ; Quit now if mismatch + inc hl ; If same, advance to next characters + inc de ; ..and continue comparing + djnz z3chk1 ; (flags not affected by DJNZ) + ld a,(hl) ; Return the environment type in A + ret ; Return Z if all 5 characters match + +;---------------------------------------- + +; Subroutine to skip over spaces in the buffer pointed to by HL. On return, +; the zero flag is set if we encountered the end of the line or a command +; separator character. + +sksp: + ld a,(hl) ; Get next character + inc hl ; Point to the following character + cp ' ' ; Space? + jr z,sksp ; If so, keep skipping + dec hl ; Back up to non-space + ; ..and fall through + +;-------------------- + +; Subroutine to check if character is the command separator or marks the end +; of the line. + +tsteol: + or a ; End of command line? + ret z ; Return with zero flag set + cp cmdsep ; Command separator? + ret ; Return with flag set appropriately + +;---------------------------------------- + +; Initialize complete FCB pointed to by DE + +initfcb: + xor a + ld (de),a ; Set default disk (dn byte is 0) + inc de ; Point to file name field + call ifcb ; Fill 1st part of FCB + ; Fall through to IFCB to run again + +;-------------------- + +; Initialize part of FCB whose file name field is pointed to by DE on entry. +; The file name and type are set to space characters; the EX, S2, RC, and the +; following CR (current record ) or DN (disk number) fields are set to zero. +; The S1 byte is set to the current user number. On exit, DE points to the +; byte at offset 17 in the FCB (two bytes past the record count byte). + +ifcb: + ld b,11 ; Store 11 spaces for file name and type + ld a,' ' + call fill + xor a + ld (de),a ; Set extent byte to zero + inc de + ld a,(curusr) + ld (de),a ; Set S1 byte to current user + inc de + ld b,3 ; Store 3 zeroes + xor a ; Fall thru to fill + +;-------------------- + +; Fill memory pointed to by DE with character in A for B bytes + +fill: + ld (de),a ; Fill with byte in A + inc de ; Point to next + djnz fill + ret + +;---------------------------------------- + +; Subroutine to display the 'no file' error message for the built-in +; commands DIR, ERA, LIST, TYPE, and/or REN. + + if diron or eraon + +prnnf: + call printc ; No file message + defb 'No Fil','e'+80h + ret + endif ; diron or eraon + +;---------------------------------------- + +; Calculate address of command table in package from Z3ENV. On entry, E +; contains the offset to the address of the package in the environment. On +; exit, DE points to the beginning of the package and HL points to the fifth +; byte (where the command table starts in the RCP and FCP modules). The zero +; flag is set on return if the package is not supported. + + if fcpenv or rcpenv or ndrenv +pkgoff: + ld hl,z3env ; Point to beginning of ENV descriptor + ld d,0 ; Make DE have offset + add hl,de ; ..and add it + ld a,(hl) ; Get low byte of package address + inc hl ; Point to high byte + ld h,(hl) ; ..and get it + ld l,a ; Move full address into HL + or h ; Set zero flag if no package + ld de,5 ; Offset to start of table + ex de,hl ; Preserve start address of package in DE + add hl,de ; Pointer to 5th byte of package in HL + ret ; Return with zero flag set appropriately + + endif ;fcpenv or rcpenv or ndrenv + +;---------------------------------------- + +; This subroutine checks to see if we are in a false IF state. If that is +; the case, the routine returns with the zero flag set. If there is not active +; IF state or if it is true, then the zero flag is reset. + + if fcp ne 0 ; Omit code if FCP not implemented + +iftest: + ld bc,(ifptrfl) ; Current IF pointer into C, IF status into B + ld a,c ; See if any IF in effect + or a + jr z,iftest1 ; Branch if no IF state is active + and b ; Mask the current IF status + ret +iftest1: + dec a ; Reset the zero flag + ret + + endif ;fcp ne 0 + +;---------------------------------------- + +; Print the command prompt with DU and/or DIR (but without any trailing +; character). This is also the code in which the current drive and user +; will be stored. The conditional assemblies are somewhat involved because +; of the possibilities of either or both of the DU or DIR forms being omitted +; from the prompt. + +prompt: + call crlf + + if incldu ; If drive/user in prompt + + ld hl,(curusr) ; Get current drive/user into HL + +; If INCLENV is enabled, the drive and user (DU) will be included in the +; prompt based on the state of the DUOK flag in the environment. If INCLENV +; is disabled, the DU form will always be included if INCLDU is on. + + if inclenv + ld a,(duokfl) ; If ENV disallows DU, + or a ; ..then don't show it in + jr z,prompt2 ; ..the prompt, either + endif ;inclenv + + ld a,h ; Get current drive + add a,'A' ; Convert to ascii A-P + call conout + ld a,l ; Get current user + + if supres ; If suppressing user # report for user 0 + or a + jr z,prompt2 + endif + + cp 10 ; User < 10? + jr c,prompt1 + + if highuser ; If allowing users 16..31 + + ld c,'0'-1 +prompt0: + inc c + sub 10 + jr nc,prompt0 + add a,10 + ld b,a + ld a,c + call conout + ld a,b + + else ;using only standard user numbers 0..15 + + sub 10 ; Subtract 10 from user number + push af ; Save low digit + call print ; Display a '1' for tens digit + defb '1' or 80h + pop af + + endif ;highuser + +prompt1: + add a,'0' ; Output 1's digit (convert to ascii) + call conout +prompt2: + endif ; incldu + + ; Display named directory + + if incldir + + if incldu + ld b,h ; Copy drive/user from HL to BC + ld c,l ; ..(saves a byte) + else + ld bc,(curusr) ; Get current drive and user into BC + endif ;incldu + + inc b ; Switch drive to range 1..16 + call du2dir ; See if there is a corresponding DIR form + ret z ; If not, return now + + if incldu ; Separate DU and DIR with colon + + if inclenv + ld a,(duokfl) ; If not displaying DU, then + or a ; ..don't send separator, either + ld a,':' ; Make the separator + call nz,conout ; ..and send if permitted + else + call print ; Put in colon separator + defb ':' or 80h + endif ;inclenv + + endif ; incldu + + ld b,8 ; Max of 8 chars in DIR name +prompt3: + inc hl ; Point to next character in DIR name + ld a,(hl) ; ..and get it + cp ' ' ; Done if space + ret z + call conout ; Print character + djnz prompt3 ; Count down + + endif ; incldir + + ret + +;----------------------------------------------------------------------------- + +; Subroutine to convert DU value in BC into pointer to a matching entry in +; the NDR. If there is no match, the routine returns with the zero flag set. +; If a match is found, the zero flag is reset, and the code returns with HL +; pointing to the byte before the directory name. + + if z3ndir ne 0 + +du2dir: + + if ndrenv ; If getting NDR address from environment + ld e,15h ; Offset to NDR in Z3ENV + call pkgoff ; Get address of NDR into DE + ex de,hl ; ..and switch into HL + ret z ; If no NDR, return with zero flag set + jr du2dir2 + else + ld hl,z3ndir-17 ; Scan directory for match + endif ;ndrenv + +du2dir1: ; Advance to next entry in NDR + ld de,16+1 ; Skip user (1 byte) and name/pw (16 bytes) + add hl,de + +du2dir2: + ld a,(hl) ; End of NDR? + or a + ret z ; If so, return with zero flag set + + inc hl ; Point to user number in NDR entry + cp b ; Compare drive values + jr nz,du2dir1 ; If mismatch, back for another try + ld a,(hl) ; Get user number + sub c ; ..and compare + jr nz,du2dir1 ; If mismatch, back for another try + dec a ; Force NZ to show successful match + ret + + endif ;z3ndir ne 0 + +;----------------------------------------------------------------------------- + +; This routine gets the next line of input for the command buffer. The +; following order of priority is followed: +; If ZEX is active, the next line is obtained from ZEX +; If a submit file is running, its last record provides the input +; If there is a command line on the shell stack, use it +; Finally, if none of the above, the input is obtained from the user + +readbuf: + + ld a,(zexrunfl) ; Get ZEX-running flag + or a + jr nz,userinput ; If ZEX running, go directly to user input + + if subon ; If submit facility is enabled, check for it + + ld a,(subflag) ; Test for submit file running + or a + jr z,shellinput ; If not, go on to possible shell input + + xor a ; Log into user 0 + call setuser + call defltdma ; Initialize DMA pointer + ld de,subfcb ; Point to submit file FCB + call open ; Try to open file + jr z,readbuf1 ; Branch if open failed + + ld hl,subfrc ; Point to record count in submit FCB + ld a,(hl) ; Get the number of records in file + dec a ; Reduce to number of last record + ld (subfcr),a ; ..and put into current record field + call read ; Attempt to read submit file + jr nz,readbuf1 ; Branch if read failed + + dec (hl) ; Reduce file record cound + dec hl ; Point to S2 byte of FCB (yes, this is req'd!) + ld (hl),a ; Stuff a zero in there (A=0 from call to READ) + call close ; Close the submit file one record smaller + jr z,readbuf1 ; Branch if close failed + +; Now we copy the line read from the file into the multiple command line +; buffer + + ld de,chrcnt ; Point to command length byte in command buffer + ld hl,tbuff ; Point to sector read in from submit file + + if buflen gt 7fh ; If command line buffer is longer than record, + ld bc,80h ; ..then copy entire record from $$$.SUB file + else ;buflen le 7fh ; Otherwise copy only enough to fill + ld bc,buflen+1 ; ..the command line buffer + endif ;buflen gt 7fh + + ldir ; Transfer line from submit file to buffer + +; We now deal with various options that control the display of commands fed +; to the command processor from a submit file. + + if subnoise gt 0 ; If subnoise = 0 we omit all this display code + + if subnoise eq 1 ; If subnoise = 1 we follow the quiet flag + ld a,(quietfl) + or a + jr nz,readbuf0 ; If quiet, skip echoing the command + endif ;subnoise eq 1 + + call prompt ; Print prompt + call print ; Print submit prompt trailer + defb sprmpt or 80h + ld hl,cmdlin ; Print command line + call printhl + + endif ;subnoise gt 0 + +readbuf0: + call break ; Check for abort (any char) + ret nz ; If no ^C, return to caller and run + +readbuf1: + call subkil ; Kill submit file and abort + jp restart ; Restart CPR + + endif ; subon + +shellinput: + ld hl,shstk ; Point to shell stack + ld a,(hl) ; Check first byte + cp ' '+1 ; See if any entry + jr c,userinput ; Get user input if none + + ld de,cmdlin ; Point to first character of command line + ld bc,shsize ; Copy shell line into command line buffer + ldir ; Do copy + ex de,hl ; HL points to end of line + ld a,1 ; Set command status flag to show + ld (cmdstatfl),a ; ..that a shell has been invoked + jr readbuf3 ; Store ending zero and exit + +userinput: + call prompt ; Print prompt + call print ; Print prompt trailer + defb cprmpt or 80h + ld c,0ah ; Read command line from user + ld de,bufsiz ; Point to buffer size byte of command line + call bdos + + ; Store null at end of line + + ld hl,chrcnt ; Point to character count + ld a,(hl) ; ..and get its value + inc hl ; Point to first character of command line + call addah ; Make pointer to byte past end of command line +readbuf3: + ld (hl),0 ; Store ending zero + ret + +;----------------------------------------------------------------------------- + +; Check for any character from the user console. Return with the character +; in A. If the character is a control-C, then the zero flag will be set. + + if subon or diron or eraon or lton + +break: + ld c,0bh ; BDOS console status function + call bdossave ; Call BDOS and set flags + call nz,conin ; Get input character if there is one + cp 'C'-'@' ; Check for abort + ret + + endif ; subon or diron or eraon or lton + +;----------------------------------------------------------------------------- + +; Add A to HL (HL=HL+A) + +addah: + add a,l + ld l,a + ret nc + inc h + ret + +;----------------------------------------------------------------------------- + +; The routine NUMBER evaluates a string in the first FCB as either a decimal +; or, if terminated with the NUMBASE hexadecimal marker, a HEX number. If the +; conversion is successful, the value is returned as a 16-bit quantity in BC. +; If an invalid character is encountered in the string, the routine returns +; with the carry flag set and HL pointing to the offending character. + + if saveon + +number: + ld hl,tfcb+8 ; Set pointer to end of number string + ld bc,8 ; Number of characters to scan + ld a,numbase ; Scan for HEX identifier + cpdr ; Do the search + jr nz,decimal ; Branch if HEX identifier not found + + inc hl ; Point to HEX marker + ld (hl),' ' ; Replace HEX marker with valid terminator + ; ..and fall through to HEXNUM + + endif ;saveon + +;---------------------------------------- + +; At this entry point the character string in the first default FCB is +; converted as a hexadecimal number (there must NOT be a HEX marker). + +hexnum: + ld hl,tfcb+1 ; Point to string in first FCB + +; At this entry point the character string pointed to by HL is converted +; as a hexadecimal number (there must be NO HEX marker at the end). + +hexnum1: + ld de,16 ; HEX radix base + jr radbin ; Invoke the generalized conversion routine + +;---------------------------------------- + +; This entry point performs decimal conversion of the string in the first +; default FCB. + +decimal: + ld hl,tfcb+1 ; Set pointer to number string + +; This entry point performs decimal conversion of the string pointed to +; by HL. + +decimal1: + ld de,10 ; Decimal radix base + ; Fall through to generalized + ; ..radix conversion routine + +; This routine converts the string pointed to by HL using the radix passed in +; DE. If the conversion is successful, the value is returned in BC. HL points +; to the character that terminated the number, and A contains that character. +; If an invalid character is encountered, the routine returns with the carry +; flag set, and HL points to the offending character. + +radbin: + ld bc,0 ; Initialize result +radbin1: + or a ; Make sure carry is reset + call sdelm ; Test for delimiter (returns Z if delimiter) + ret z ; Return if delimiter encountered + + sub '0' ; See if less than '0' + ret c ; Return with carry set if so + cp 10 ; See if in range '0'..'9' + jr c,radbin2 ; Branch if it is valid + cp 'A'-'0' ; Bad character if < 'A' + ret c ; ..so we return with carry set + sub 7 ; Convert to range 10..15 +radbin2: + cp e ; Compare to radix in E + ccf ; Carry should be set; this will clear it + ret c ; If carry now set, we have an error + + inc hl ; Point to next character + push bc ; Push the result we are forming onto the stack + ex (sp),hl ; Now HL=result, (sp)=source pointer + call mpy16 ; HLBC = previous$result * radix + ld h,0 ; Discard high 16 bits and + ld l,a ; ..move current digit into HL + add hl,bc ; Form new result + ld c,l ; Move it into BC + ld b,h + pop hl ; Get string pointer back + jr radbin1 ; Loop until delimiter + +;----------------------------------------------------------------------------- + +; This routine multiplies the 16-bit values in DE and HL and returns the +; 32-bit result in HLBC (HL has high 16 bits; BC has low 16 bits). Register +; pair AF is preserved. + +mpy16: + ex af,af' ; Save AF + ld a,h ; Transfer factor in HL to A and C + ld c,l + ld hl,0 ; Initialize product + ld b,16 ; Set bit counter + rra ; Shift AC right so first multiplier bit + rr c ; ..is in carry flag +mp161: + jr nc,mp162 ; If carry not set, skip the addition + add hl,de ; Add multiplicand +mp162: + rr h ; Rotate HL right, low bit into carry + rr l + rra ; Continue rotating through AC, with + rr c ; ..next multiplier bit moving into carry + djnz mp161 ; Loop through 16 bits + + ld b,a ; Move A to B so result is in HLBC + ex af,af' ; Restore original AF registers + ret + +;----------------------------------------------------------------------------- + +; This routine checks for a delimiter character pointed to by HL. It returns +; with the character in A and the zero flag set if it is a delimiter. All +; registers are preserved except A. + +sdelm: + ld a,(hl) ; Get the character + exx ; Use alternate register set (shorter code) + ld hl,deldat ; Point to delimiter list + ld bc,delend-deldat; Length of delimiter list + cpir ; Scan for match + exx ; Restore registers + ret ; Returns Z if delimiter + +deldat: ; List of delimiter characters + db ' ' + db '=' + db '_' + db '.' + db ':' + db ';' + db '<' + db '>' + db ',' + db 0 + if cmdsep ne ';' + db cmdsep + endif ;cmdsep ne ';' +delend: + +;----------------------------------------------------------------------------- + +; Log into DU contained in FCB pointed to by DE. Registers DE are preserved; +; all others are changed. Explicit values for the temporary drive and user +; are extracted from the FCB. If the record-count byte has an FF in it, that +; is a signal that the directory specification was invalid. We then invoke +; the error handler. + + if diron or eraon or lton or renon or saveon + +fcblog: + push de ; Save pointer to FCB + ex de,hl + ld a,(hl) ; Get drive + ld bc,13 ; Offset to S1 field + add hl,bc + ld c,(hl) ; Get user into C + or a ; See if drive value was 0 + jr nz,fcblog1 ; If not, branch ahead + ld a,(curdr) ; Otherwise substitute current drive + inc a ; ..shifted to range 1..16 +fcblog1: + ld b,a ; Get drive into B + ld (tempusr),bc ; Set up temporary DU values + call logtemp ; ..and log into it + pop de ; Restore pointer to FCB + +; Now check to make sure that the directory specification was valid. + + inc hl ; Advance pointer to record-count byte + inc hl + ld a,(hl) ; See if it is nonzero + or a + jp nz,baddirerr ; If so, invoke error handler + + ret ; Otherwise return + + endif ;diron or eraon or lton or renon or saveon + +;----------------------------------------------------------------------------- + +; Log into the temporary directory. Registers B, H, and L are preserved. + +logtemp: + ld de,(tempusr) ; Set D = tempdr, E = tempusr + call setuser1 ; Register D is preserved during this call + ld a,d ; Move drive into A + dec a ; Adjust for drive range 0..15 + jp setdrive ; Log in new drive and return + +;----------------------------------------------------------------------------- + +; This routine scans the command table pointed to by HL for the command name +; stored in the command FCB. If the command is not found, the routine returns +; with the zero flag reset. If the command is found, the address vector is +; stored in EXECADR and the zero flag is set. + +cmdscan: + ld b,(hl) ; Get length of each command + inc hl ; Point to first command name + +scannext: + ld a,(hl) ; Check for end of table + or a + jr z,scanend ; Branch if end + + ld de,cmdfcb+1 ; Point to name of requested command + push bc ; Save size of commands in table + + if wheel + ; Ignore commands with high bit set in first + ; ..char of command name if wheel is false + ld a,(z3whl) ; Get the wheel byte + or a + ld c,0ffh ; Make a mask that passes all characters + jr z,scancmp ; Use this mask if wheel not set + + endif ; wheel + + ld c,7fh ; Use mask to block high bit if wheel set + ; ..or not in use + +scancmp: + ld a,(de) ; Compare against table entry + + xor (hl) + and c ; Mask high bit of comparison + jr nz,scanskip ; No match, so skip rest of command name + + inc de ; Advance to next characters to compare + inc hl + res 7,c ; Mask out high bit on characters after first + djnz scancmp ; Count down + + ld a,(de) ; See if next character in input command + cp ' ' ; ..is a space + jr nz,scanbad ; If not, user command is longer than commands + ; ..in the command table + + ; Matching command found + + pop bc ; Clear stack + ld a,(hl) ; Get address from table into HL + inc hl + ld h,(hl) + ld l,a + ld (execadr),hl ; Set execution address + xor a ; Set zero flag to show that command found + ret + +scanskip: + inc hl ; Skip to next command table entry + djnz scanskip + +scanbad: + pop bc ; Get back size of each command + inc hl ; Skip over address vector + inc hl + jr scannext ; Try scanning next entry in table + +scanend: + xor a ; Reset zero flag to show + dec a ; ..that command was not found + ret + +; End ZCPR33-4.Z80 + + page + +; ZCPR33-5.Z80 + +;============================================================================= +; +; R E S I D E N T C O M M A N D C O D E +; +;============================================================================= + +; Command: DIR +; Function: To display a directory of the files on disk +; Forms: +; DIR Displays the DIR-attribute files +; DIR Same as DIR *.* +; DIR S Displays the SYS-attribute files +; DIR /S Same as DIR *.* S +; DIR A Display both DIR and SYS files +; DIR /A Same as DIR *.* A + + if diron + +dir: + ld de,tfcb ; Point to target FCB + push de ; ..and save the pointer for later + inc de ; Point to file name + ld a,(de) ; Get first character + + if slashfl ; If allowing "DIR /S" and "DIR /A" formats + cp '/' ; If name does not start with '/' + jr nz,dir1 ; ..branch and process normally + inc de ; Point to second character + ld a,(de) ; Get option character after slash + ld (tfcb2+1),a ; ..and put it into second FCB + dec de ; Back to first character + ld a,' ' ; Simulate empty FCB + endif ;slashfl + +dir1: + cp ' ' ; If space, make all wild + jr nz,dir2 + ld b,11 + ld a,'?' + call fill + +dir2: + pop de ; Restore pointer to FCB + call fcblog ; Log in the specified directory + + if whldir + ld a,(z3whl) ; Check wheel status + or a ; If not set, then ignore options + jr z,dir2a + endif ;whldir + + ld a,(tfcb2+1) ; Check for any option letter + ld b,1 ; Flag for both DIR and SYS files + cp allchar ; See if all (SYS and DIR) option letter + jr z,dirpr ; Branch if so + dec b ; B = 0 for SYS files only + cp syschar ; See if SYS-only option letter + jr z,dirpr ; Branch if so +dir2a: + ld b,80h ; Flag for DIR-only selection + ; Drop into DIRPR to print directory + + endif ; diron + +;-------------------- + +; Directory display routine + +; On entry, if attribute checking is required, the B register is +; set as follows: +; 00H for SYS files only +; 80H for DIR files only +; 01H for both + + if diron or eraon + +dirpr: + if diron ; Attribute checking needed only for DIR + ld a,b ; Get flag + ld (systst),a ; Set system test flag + endif + + ld e,0 ; Set column counter to zero + push de ; Save column counter (E) + call srchfst1 ; Search for specified file (first occurrence) + jr nz,dir3 + call prnnf ; Print no-file message + pop de ; Restore DE + xor a ; Set Z to show no files found + ret + +; Entry selection loop. On entering this code, A contains the offset in the +; directory block as returned by the search-first or search-next call. + +dir3: + if diron ; Attribute checking needed only for DIR cmd + + call getsbit ; Get and test for type of files + jr z,dir6 + + else ;not diron + + dec a ; Adjust returned value from 1..4 to 0..3 + rrca ; Multiply by 32 to convert number to + rrca ; ..offset into TBUFF + rrca + ld c,a ; C = offset to entry in TBUFF + + endif ;diron + + pop de ; Restore count of + ld a,e ; ..entries displayed + inc e ; Increment entry counter + push de ; Save it + and 03h ; Output CRLF if 4 entries printed in line + jr nz,dir4 + call crlf ; New line + jr dir5 +dir4: + call print + + if wide + + defb ' ' ; 2 spaces + defb fence ; Then fence char + defb ' ',' '+80h ; Then 2 more spaces + + else ;not wide + + defb ' ' ; Space + defb fence ; Then fence char + defb ' '+80h ; Then space + + endif ; wide + +dir5: + ld a,1 + call dirptr ; HL now points to 1st byte of file name + call prfn ; Print file name +dir6: + call break ; Check for abort + jr z,dir7 + call srchnxt ; Search for next file + jr nz,dir3 ; Continue if file found + +dir7: + pop de ; Restore stack + dec a ; Set NZ flag + ret + + endif ; diron or eraon + +;----------------------------------------------------------------------------- + + if diron or attchk or eraon + +; This routine returns a pointer in HL to the directory entry in TBUFF that +; corresponds to the offset specified in registers C (file offset) and C +; (byte offset within entry). + +dirptr: + ld hl,tbuff + add a,c ; Add the two offset contributions + call addah ; Set pointer to desired byte + ld a,(hl) ; Get the desired byte + ret + + endif ; diron or attchk or eraon + +;----------------------------------------------------------------------------- + +; Test File in FCB for existence, ask user to delete if so, and abort if he +; choses not to + + if saveon or renon + +extest: + ld de,tfcb ; Point to FCB + push de ; ..and save it for later + call fcblog ; Log into specified directory + call srchfst1 ; Look for specified file + pop de ; Restore pointer + ret z ; OK if not found, so return + call printc + if bellfl + defb bell + endif ;bellfl + defb 'Erase',' '+80h + ld hl,tfcb+1 ; Point to file name field + call prfn ; Print it + call print ; Add question mark + defb '?' or 80h + call conin ; Get user response + cp 'Y' ; Test for permission to erase file + jp nz,restart ; If not, flush the entire command line + jp delete ; Delete the file + + endif ; saveon or renon + +;----------------------------------------------------------------------------- + +; Print file name pointed to by HL + + if diron or renon or saveon + +prfn: + ld b,8 ; Display 8 characters in name + call prfn1 + call print ; Put in dot + defb '.' or 80h + ld b,3 ; Display 3 characters in type +prfn1: + ld a,(hl) ; Get character + inc hl ; Point to next + call conout ; Print character + djnz prfn1 ; Loop through them all + ret + + endif ;diron or renon or saveon + +;----------------------------------------------------------------------------- + +; This routine returns NZ if the file has the required attributes and Z if +; it does not. It works by performing the 'exclusive or' of the mask passed +; in register A and the filename attribute obtained by masking out all but +; the highest bit of the character. For the 'both' case, setting any bit +; in the mask other than bit 7 will guarantee a nonzero result. +; +; File name: : X 0 0 0 0 0 0 0 (After 80H mask, X=1 if SYS, 0 if DIR) +; +; SYS-ONLY : 0 0 0 0 0 0 0 0 (XOR gives 00H if X=0 and 80H if X=1) +; DIR-ONLY : 1 0 0 0 0 0 0 0 (XOR gives 80H if X=0 and 00H if X=1) +; BOTH : 0 0 0 0 0 0 0 1 (XOR gives 01H if X=0 and 81H if X=1) + + if diron or attchk + +getsbit: + dec a ; Adjust to returned value from 1..4 to 0..3 + rrca ; Multiply by 32 to convert number to + rrca ; ..offset into TBUFF + rrca + ld c,a ; Save offset in TBUFF in C + ld a,10 ; Add 10 to point to SYS attribute bit + call dirptr ; A = SYS byte + and 80h ; Look only at attribute bit +systst equ $+1 ; In-the-code variable + xor 0 ; If SYSTST=0, SYS only; if SYSTST=80H, DIR + ; ..only; if SYSTST=1, both SYS and DIR + ret ; NZ if OK, Z if not OK + + endif ;diron or attchk + +;----------------------------------------------------------------------------- + +; Command: REN +; Function: To change the name of an existing file +; Forms: REN = +; Notes: If either file spec is ambiguous, or if the source file does +; not exist, the error handler will be entered. If a file with +; the new name already exists, the user is prompted for deletion +; and ZEX is turned off during the prompt. + + if renon + +ren: + ld hl,tfcb ; Check for ambiguity in first file name + call ambchk + call fcblog ; Login to fcb + ld hl,tfcb2 ; Check for ambiguity in second file name + call ambchk + xor a ; Use current drive for 2nd file + ld (de),a + call srchfst ; Check for old file's existence + jr nz,ren0a ; Branch if file exists +jpnofile: + ld a,ecnofile ; Set error code for file not found + jp error ; ..and invoke error handler +ren0a: + call extest ; Test for file existence and return if not + ld b,12 ; Exchange new and old file names + push de ; Save pointer to FCB + ld hl,tfcb2 ; Point to FCB for old file name +ren0: + ld a,(de) ; Get character of old name + ld c,a ; ..into C register + ld a,(hl) ; Get character of new name + ld (de),a ; ..into place in old name + ld (hl),c ; Put character of old name into new name + inc hl ; Advance pointers + inc de + djnz ren0 + +; Perform rename function + + pop de ; Restore pointer to FCB + ld c,17h ; BDOS rename function + jp bdostest + + endif ;renon + +;----------------------------------------------------------------------------- + +; Command: ERA +; Function: Erase files +; Forms: +; ERA Erase specified files and dislay their names +; ERA I Display names of files to be erased and prompt for +; inspection before erase is performed. (Character 'I' +; is defined by INSPCH in Z33HDR.LIB; if it is ' ', then +; any character triggers inspection.) + + if eraon + +era: + if inspfl and eraok; 'I' flag and verification enabled? + ld a,(tfcb2+1) ; Get flag, if any, entered by user + ld (eraflg),a ; Save it in code below + endif ;erav and eraok + + ld de,tfcb ; Point to target FCB + call fcblog ; ..and log into the specified directory + + if diron or attchk ; Attribute checking only in these cases + ld b,1 ; Display all matching files + endif ;diron or attchk + + call dirpr ; Print directory of erased files + ret z ; Abort if no files + + if eraok ; Print prompt + + if inspfl ; Test verify flag + +eraflg equ $+1 ; Address of flag (in-the-code modification) + ld a,0 + cp inspch ; Is it an inspect option? + + if inspch ne ' ' ; If an explicit inspect character is specified + jr nz,era2 ; ..skip prompt if it is not that character + else ; If INSPCH is the space character + jr z,era2 ; ..then skip prompt only if FCB has a space + endif ;inspch ne ' ' + + endif ;inspfl + + call printc + defb 'OK to Erase','?'+80h + call conin ; Get reply + cp 'Y' ; Yes? + ret nz ; Abort if not + + endif ; eraok + +era2: + ld de,tfcb + jp delete ; Delete files and return + + endif ; Eraon + +;----------------------------------------------------------------------------- + +; Command: LIST +; Function: Print out specified file on the LST: device +; Forms: LIST Print file (No Paging) +; Notes: The flags which apply to TYPE do not take effect with LIST + + if lton + +list: + ld a,0ffh ; Turn on printer flag + jr type0 + +;----------------------------------------------------------------------------- + +; Command: TYPE +; Function: Print out specified file on the CON: Device +; Forms: TYPE Print file with default paging option +; TYPE P Print file with paging option reversed + +type: + xor a ; Turn off printer flag + +; Common entry point for LIST and TYPE functions + +type0: + ld (prflg),a ; Set printer/console flag + ld a,(tfcb2+1) ; Check for user page toggle ('P') option + ld (pgflg),a ; Save it as a flag in code below + ld hl,tfcb ; Point to target file FCB + call ambchk ; Check for ambiguous file spec (vectors to + ; ..error handler if so) + call fcblog ; Log into specified directory + call open ; Open the file + + if renon ; If REN on, share code + jr z,jpnofile + else ;not renon ; Otherwise repeat code here + ld a,ecnofile + jp z,error + endif ;renon + + call crlf ; New line + ld a,(crttxt0) ; Set line count using value from the + ; ..environment for CRT0 + inc a ; One extra the first time through + ld (pagcnt),a + ld bc,080h ; Set character position and tab count + ; (B = 0 = tab, C = 080h = char position) + +; Main loop for loading next block + +type2: + ld a,c ; Get character count + cp 80h ; If not end of disk record + jr c,type3 ; ..then skip + + call readf ; Read next record of file + ret nz ; Quit if end of file + + ld c,0 ; Reset character count + ld hl,tbuff ; Point to first character + +; Main loop for printing characters in TBUFF + +type3: + ld a,(hl) ; Get next character + and 7fh ; Mask out MSB + cp 1ah ; Check for end of file (^z) + ret z ; Quit if so + +; Output character to CON: or LST: device with tabulation + + cp cr ; If carriage return, + jr z,type4 ; ..branch to reset tab count + cp lf ; If line feed, then output + jr z,type4a ; ..with no change in tab count + cp tab ; If tab + jr z,type5 ; ..expand to spaces + +; Output character and increment character count + + call lcout ; Output character + inc b ; Increment tab count + jr type6 + +; Output CR and reset tab count + +type4: + ld b,0 ; Reset tab counter + +; Output LF and leave tab count as is + +type4a: + call lcout ; Output or + jr type6 + +; Process tab character + +type5: + ld a,' ' ; Space + call lcout + inc b ; Increment tab count + ld a,b + and 7 + jr nz,type5 ; Loop until column = n * 8 + 7 + +; Continue processing + +type6: + inc c ; Increment character count + inc hl ; Point to next character + push bc + call break ; Check for user abort + pop bc + ret z ; Quit if so + jr type2 ; Else back for more + +;-------------------- + +; Output character in A to console or list device depending on a flag. +; Registers are preserved. This code is used only by the LIST and TYPE +; commands. + +lcout: + push af ; Save character +prflg equ $+1 ; Pointer for in-the-code modification + ld a,0 ; ..to determine destination (CON or LST) + or a ; Z=type, NZ=list + jr z,lc1 + + ; Output to list device + + pop af ; Get character back + push de + push bc + ld c,5 ; LISTOUT function + jp output + + ; Output to console with paging + +lc1: + pop af ; Get character back + push af ; Save it again for page check + call conout ; Output to console + pop af ; Get character back again + cp lf ; Check for new line (paging) + ret nz ; If not new line, we are done + + ; Paging routines + +pager: + push hl + ld hl,pagcnt ; Decrement lines remaining on screen + dec (hl) + jr nz,pager1 ; Jump if not end of page + + ; New page + ld a,(crttxt0) ; Get full page count from environment + ld (hl),a ; Reset count to a full page +pgflg equ $+1 ; Pointer to in-the-code buffer pgflg + ld a,0 + cp pagech ; Page default override option wanted? + + if pagech ne ' ' ; If using explicit character for page toggle + + if pagefl ; If paging is default + jr z,pager1 ; ..PAGECH means no paging + else ; If paging not default + jr nz,pager1 ; ..PAGECH means please paginate + endif ;pagefl + + else ; Any character toggles paging + + if pagefl ; If paging is default + jr nz,pager1 ; ..any character means no paging + else ; If paging not default + jr z,pager1 ; ..any character means please paginate + endif ;pagefl + + endif ;pagech ne ' ' + + ; End of page + push bc + call bios+9 ; Wait for user input (BIOS console input) + pop bc + cp 'C'-'@' ; Did user enter control-c? + jp z,nextcmd ; If so, terminate this command + +pager1: + pop hl ; Restore HL + ret + + endif ; lton + +;----------------------------------------------------------------------------- + +; Command: SAVE +; Function: To save the contents of the TPA onto disk as a file +; Forms: +; SAVE +; Save specified number of pages (starting at 100H) from TPA +; into specified file +; +; SAVE +; Like SAVE above, but numeric argument specifies +; number of sectors rather than pages + + if saveon + +; Entry point for SAVE command + +save: + call number ; Extract number from command line + jr c,badnumber ; Invoke error handler if bad number + push bc ; Save the number + call reparse ; Reparse tail after number of sectors/pages + pop hl ; Get sector/page count back into HL + ld a,(tfcb2+1) ; Check sector flag in second FCB + cp sectch + + if sectch ne ' ' ; If using a specific character, then jump + jr z,save0 ; ..if it is that character + else ; If allowing any character (SECTCH=' ') + jr nz,save0 ; ..jump if it is anything other than space + endif ;sectch ne ' ' + + add hl,hl ; Double page count to get sector count +save0: + ld a,1 ; Maximum allowed value in H + cp h ; Make sure sector count < 512 (64K) + jr c,badnumber ; If >511, invoke error handler + + push hl ; Save sector count + ld hl,tfcb + call ambchk ; Check for ambiguous file spec (vectors to + ; ..error handler if so) + + call extest ; Test for existence of file and abort if so + ld c,16h ; BDOS make file function + call bdostest + jr z,save3 ; Branch if error in creating file + + pop bc ; Get sector count into BC + ld hl,tpa-80h ; Set pointer to one record before TPA + +save1: + ld a,b ; Check for BC = 0 + or c + dec bc ; Count down on sectors (flags unchanged, + ; ..B=0FFH if all records written successfully) + jr z,save2 ; If BC=0, save is done so branch + + push bc ; Save sector count + ld de,80h ; Advance address by one record + add hl,de + push hl ; Save address on stack + ex de,hl ; Put address into DE for BDOS call + call dmaset ; Set DMA address for write + ld de,tfcb ; Write sector + ld c,15h ; BDOS write sector function + call bdossave + pop hl ; Get address back into HL + pop bc ; Get sector count back into BC + jr z,save1 ; If write successful, go back for more + + ld b,0 ; B=0 if write failed + +save2: + call close ; Close file even if last write failed + and b ; Combine close return code with + ; ..write success flag + ret nz ; Return if all ok + +save3: ; Disk must be full + ld a,ecdiskfull ; Disk full error code + jr jperror + + endif ; saveon + +;----------------------------------------------------------------------------- + + if lton or saveon or renon or geton + +; Check file control block pointed to by HL for any wildcard characters ('?'). +; Return to calling program if none found. Otherwise branch to error handler. +; The routine also treats an empty file name as ambiguous. + +ambchk: + push hl ; Save pointer to FCB + inc hl ; Point to first character in file name + ld a,(hl) ; See if first character is a space + cp ' ' + jr z,ambchk1 ; If so, branch to error return + + ld a,'?' ; Set up for scan for question mark + ld bc,11 ; Scan 11 characters + cpir + pop de ; Restore pointer to FCB in DE + ret nz ; Return if no '?' found +ambchk1: + ld a,ecambig ; Error code for ambiguous file name + jr jperror + + endif ;lton or renon or saveon or geton + + if lton or renon or saveon or geton or jumpon + +badnumber: + ld a,ecbadnum ; Error code for bad number value +jperror: ; Local entry point for relative jump + jp error ; ..to go to error handler + + endif ;lton or renon or saveon or geton or jumpon + +;----------------------------------------------------------------------------- + +; Command: JUMP +; Function: To execute a program already loaded into some specified memory +; address +; Forms: JUMP +; The address is in hex; the tail will be parsed as usual + + if jumpon + +jump: + call hexnum ; Get load address into BC + jr c,badnumber ; If bad number, invoke error handling + push bc ; ..and save it + call reparse ; Reparse tail after address value + pop hl ; Restore execution address to HL + jr getproglf ; Perform call via code below + + endif ;jumpon + +;----------------------------------------------------------------------------- + +; Command: GO +; Function: To Call the program in the TPA without loading +; loading from disk. Same as JUMP 100H, but much +; more convenient, especially when used with +; parameters for programs like STAT. Also can be +; allowed on remote-access systems with no problems. +; +;Form: GO + + if goon + +go: + ld hl,tpa ; Set up TPA as the execution address + + endif ; goon + + if jumpon or goon ; Common code + +getproglf: + ld (execadr),hl + xor a ; Set zero flag to enable leading CRLF + jp callproglf ; Perform call (with leading CRLF) + + endif ;jumpon or goon + +;----------------------------------------------------------------------------- + +; Command: GET +; Function: To load the specified file from disk to the specified address +; Forms: GET +; Loads the specified file to the specified hexadecimal address +; Note that the normal file search path is used to find the file. +; If SCANCUR is off, the file may not be found in the current +; directory unless a colon is included in the file spec. + + if geton + +get: + +; TMPCOLON was set when the file name was parsed. We use that as the colon +; flag so that the file will be loaded from a directory just as if it had +; been entered as the command name. + + if drvprefix and [not scancur] + ld a,(tmpcolon) ; Allow GET to load from specified + ld (colon),a ; directory + endif ;drvprefix and [not scancur] + + ld hl,tfcb2 ; Copy TFCB2 to CMDFCB for load + push hl + ld de,cmdfcb + ld bc,14 + ldir + pop hl + call ambchk ; Make sure file is not ambiguous (vectors + ; ..to error handler if so) + +; If GET fails to find the specified file along the search path, we do not +; want the ECP to be engaged. To prevent that, we fool the command processor +; by telling it that the ECP is already engaged. + + ld hl,cmdstatfl ; Point to command status flag + set 2,(hl) ; Turn on ECP flag to prevent use of ECP + call hexnum ; Get load address into BC + jr c,badnumber ; If invalid number, invoke error handler + + if not fullget + ld a,b ; If trying to load into base page + or a ; ..treat as error + jr z,badnumber + endif ;not fullget + + ld h,b ; Move address into HL + ld l,c + ld a,0ffh ; Disable dynamic loading + ; Fall through to mload + + endif ; geton + +; End ZCPR33-5.Z80 + + page + +; ZCPR33-6.Z80 + +;============================================================================= +; +; P A T H S E A R C H A N D F I L E L O A D I N G C O D E +; +;============================================================================= + +; This block of code loads a file into memory. The normal address at which +; loading is to begin is passed to the routine in the HL register. The name +; of the file to load is passed in the command file control block. +; +; This code supports an advanced option that loads files to a dynamic address +; specified in the header to the file using a new type-3 environment. In a +; type-3 environment, the execution/load address is stored in the word +; following the environment descriptor address. A value is passed to MLOAD in +; the A register that controls this dynamic loading mechanism. The value +; specifies the lowest environment type value for which dynamic loading will +; be performed. This value will be 3 when MLOAD is called for normal COM file +; execution and will be 0FFH when chained to from the GET command. In the +; latter case, the user-specified load address must be used. +; +; MLOAD guards against loading a file over the operating system. It computes +; the lower of the following two addresses: 1) the CPR entry point; 2) the +; bottom of protected memory as indicated by the DOS entry address stored at +; address 0006H. If the load would exceed this limit, error handling is +; engaged (except for the GET command when FULLGET is enabled). + +mload: + ld (envtype),a ; Set up in-the-code modification below + ld (execadr),hl ; Set up execution/load address + call defltdma ; Set DMA address to 80H for file searches + + +; This code sets the attributes of COM files which are acceptable. If both +; SYS and DIR type files are acceptable, there is no need to include this code, +; and ATTCHK can be set to false. + + if attchk ; Only if attribute checking enabled + ld a,comatt ; Attributes specified in Z33HDR.LIB + ld (systst),a ; Set flag + endif ;attchk + +;----------------------------------------------------------------------------- + +; PATH BUILDING CODE + +; In ZCPR33 the minpath feature, optional in ZCPR30, is always used. To +; minimize the size of the CPR code, however, there is an option to place the +; minpath in an external buffer (outside the CPR). If the path is short +; enough, the minpath can be placed at the bottom of the system stack. + + ld de,path ; Point to first element in user's symbolic path + ld hl,mpath ; Point to minpath buffer + xor a + ld (hl),a ; Initialize to empty minpath + + +; If DRVPREFIX is enabled, the CPR will recognize an explicit directory +; reference in a command. The first element of the path will then be this +; explicit directory. If no explicit directory was given in the command, +; then no entry is made into the search path. If the WPREFIX option is +; on, explicit directory prefixes will be recognized only when the wheel +; byte is on. + + if drvprefix ; Pay attention to du:com prefix? + + ld a,(colon) ; See if colon was present in command + or a + jr z,makepath2 ; If not, skip ahead + + if wprefix + ld a,(z3whl) ; See if wheel byte is on + or a + jr z,makepath2 ; If not, skip ahead + endif ;wprefix + + ld a,(cmdfcb) ; Get drive from command FCB + ld (hl),a ; Put drive into minpath + inc hl ; Advance pointer + ld a,(cmdfcb+13) ; Get user number from command FCB + ld (hl),a ; Put it into minpath + inc hl ; Advance pointer to next path element + xor a ; A=0 + ld (hl),a ; Store ending 0 in mpath +makepath2: + endif ; drvprefix + + +; If SCANCUR is enabled in Z33HDR.LIB, then we always include the current +; directory automatically, even without a '$$' element in the user's path. +; If WPREFIX is enabled, however, we do not want to allow the current +; directory to be included, but we must make sure that it is included in +; the building of the root path, in case the user's symbolic path is empty. + + if scancur ; Scan current directory at all times? + + ld bc,(curusr) ; C = current user, B = current drive + inc b ; Set drive to range 1..16 + + if wprefix + + ld a,(z3whl) ; See if wheel byte is on + or a + jr nz,addpath ; If it is, add element to path; if not, + ; ..fall through to MAKEPATH3 + else ;not wprefix + + jr addpath ; Begin loop of placing entries into mpath + + endif ;wprefix + + else ;not scancur + +; If SCANCUR is off and ROOTONLY is in effect, we have to make sure that some +; directory values are put into the root path in the case where the user's +; path is completely empty. To do so, we preset BC for directory A0. + + if rootonly + ld bc,0100h ; Setup for drive A (B=1), user 0 (C=0) + endif ;rootonly + + endif ;scancur + + +; Convert symbolic entries in user's path into absolute DU values in minpath. +; Entries are read one-by-one from the symbolic path. If the 'current' drive +; or user indicator is present (default symbol is '$'), then the current +; drive or user value is fetched. Otherwise the explicit binary value from the +; path is used. After each absolute DU value is formed, the minpath as it +; exists so far is scanned to see if this DU value is already there. If it is +; not, then the DU value is appended to the path. Otherwise it is ignored. + +makepath3: + ld a,(de) ; Get next symbolic path entry + or a ; If 0, we are at end of path + jr z,makepath6 + + ld bc,(curusr) ; C = current user, B = current drive + inc b ; Set drive to range 1..16 + cp curind ; Check for current drive symbol (default '$') + jr z,makepath4 ; If so, leave current drive in B + ld b,a ; Else move specified drive into B +makepath4: + inc de ; Point to user value in symbolic path + ld a,(de) ; Get user + inc de ; Point to next element in symbolic path + cp curind ; Check for current user symbol (default '$') + jr z,makepath5 ; If so, leave current drive in C + ld c,a ; Else move specified user into C +makepath5: + +; At this point in the code we have a potential path element in BC. We first +; have to scan the minpath we have so far to see if that element is already +; there. In that case we ignore it; otherwise we add it to the end of the path. + +addpath: + ; Skip path if directory given explicitly + + if skippath + + if wprefix + ld a,(z3whl) ; See if wheel byte is on + or a + call nz,skipchk ; If not, fall through + else ;not wprefix + call skipchk ; See if path should be skipped + endif ;wprefix + + jr nz,makepath3 ; If so, branch out of ADDPATH + + endif ;skippath + + ld hl,mpath ; Point to beginning of minpath + +addpath1: ; Point of reentry + ld a,(hl) ; Get drive value + or a ; Check for end of minpath + jr z,addpath2 ; If end, jump and add BC to minpath + + inc hl ; Increment pointer to user + cp b ; Check for drive match + ld a,(hl) ; Get user from minpath + inc hl ; Point to next minpath entry + jr nz,addpath1 ; If drive was different, loop back again + cp c ; Check for user match + jr nz,addpath1 ; If user is different, loop back again + jr makepath3 ; Branch if we have a duplicate + +; We have a new DU; add it to minpath + +addpath2: + ld (hl),b ; Store drive + inc hl + ld (hl),c ; Store user + inc hl + ld (hl),0 ; Store ending 0 + jr makepath3 ; Continue scanning user's path + +; If the ECP facility is set up to use the root directory, then create a +; root path. BC presently contains the proper DU. + +makepath6: + + if rootonly + ld hl,rootpth ; Point to special path to contain root + ld (hl),b ; Store disk + inc hl + ld (hl),c ; Store user + endif ;rootonly + +;----------------------------------------------------------------------------- + +; This is the code for loading the specified file by searching the minpath. + + xor a ; Always use current disk specification in the + ld (cmdfcb),a ; ..command FCB + +mload1: + + ld hl,mpath ; Point to beginning of minpath + +mload2: + +; Either the FASTECP or BADDUECP option may have set FIRSTCHAR to a space +; character as a signal to go directly to extended command processing. If +; neither option is enabled but SKIPPATH is, then the FIRSTCHAR data is +; stored in the routine below where path skipping is implemented. + + if fastecp or badduecp + + ld a,(cmdstatfl) ; If ECP is running + bit 2,a ; ..we branch to look for ECP along path + jr nz,mload2a +firstchar equ $+1 ; Pointer for in-the-code modification + ld a,0 + cp ' ' ; Was command invoked with leading space? + jr z,ecprun ; If so, go directly to ECP code + + endif ;fastecp or badduecp + +mload2a: + ld a,(hl) ; Get drive from path + or a ; If end of path, command not found + jr nz,mload3 ; If not end of path, skip over ECP code + +;----------------------------------------------------------------------------- + +; EXTENDED COMMAND PROCESSING + +; At this point we have exhausted the search path. We now engage the +; extended command processor. + +ecprun: + if skippath + call skipchk ; See if path should be skipped + jr nz,jnzerror ; If so, invoke error handler + endif ;skippath + + ld hl,cmdstatfl ; Point to command status flag + ld a,(hl) ; ..and get value + and 110b ; Isolate ECP and error handler bits +jnzerror: ; If either is set, + ld a,ecnocmd ; Error code for command not found + jp nz,error ; ..process as an error + + set 2,(hl) ; Set ECP bit + + ld hl,ecpfcb ; Copy name of ECP to command FCB + ld de,cmdfcb + ld bc,12 ; Only 12 bytes required + ldir + + ld hl,(cmdptr) ; Get pointer to current command line + call parsetail ; Parse entire command as the command tail + + if rootonly ; Look for ECP in root directory only + ld hl,rootpth ; Point to path containing root directory only + jr mload2 ; Search for command + else ; not rootonly + jr mload1 ; Search the entire minpath for the ECP + endif ; rootonly + +;----------------------------------------------------------------------------- + +mload3: + ld b,a ; Drive into B + inc hl ; Point to user number + ld c,(hl) ; User into C + ld (tempusr),bc ; Save the values + inc hl ; Point to next entry in path + call logtemp ; Log in path-specified user/drive + + if attchk ; If allowing execution only of COM files with + ; ..specific attributes + + ld de,cmdfcb ; Point to command FCB + call srchfst ; Look for directory entry for file + jr z,mload2a ; Continue path search if file not found + push hl ; Save path pointer + call getsbit ; Check system attribute bit + pop hl ; Restore path pointer + jr z,mload2a ; Continue if attributes do not match + call opencmd ; Open file for input + jr z,mload2a ; If open failed, back to next path element + + else ;not attchk + + call opencmd ; Open file for input + jr z,mload2a ; If open failed, back to next path element + + endif ; attchk + + call readcmd ; Read first record into default DMA address + jr nz,mload5 ; Branch if zero-length file + xor a ; Set file current record back to zero + ld (cmdfcb+20h),a + ld hl,80h ; Pointer to start of code + call z3chk + jr nz,mload3a ; If not Z3 file, branch + +; The following test is modified by earlier code. For normal COM file loading, +; a 3 is inserted for the minimum environment type for dynamic load address +; determination. For the GET command, where the user-specified address should +; be used, a value of 0FFH is put in here so the carry flag will always be set. + +envtype equ $+1 ; Pointer for in-the-code modification + cp 3 ; See if no higher than a type-3 environment + jr c,mload3a ; If higher than type 3, branch + + inc hl ; Advance to load address word + inc hl + inc hl + ld a,(hl) ; Get load address into HL + inc hl + ld h,(hl) + ld l,a + ld (execadr),hl ; Set new execution/load address + +mload3a: + ld hl,(execadr) ; Get initial loading address + +; Load the file, making sure neither CPR nor protected memory is overwritten + +mload4: + if fullget + ld a,(envtype) ; If ENVTYPE is FF (from GET command) + inc a ; ..then skip memory limit checking + jr z,mload4b + endif ;fullget + + if rel + ld bc,entry ; We have to use a relocatable form to get + dec b ; ..highest page below the CPR + else ;not rel + ld b,high entry - 1 ; We can use shorter code for absolute form + endif ;rel + + ld a,(0007h) ; Get highest page below + dec a ; ..protected memory + cp b ; If A is lower value, + jr c,mload4a ; ..branch + ld a,b ; Otherwise use lower value in B +mload4a: + cp h ; Are we going to overwrite protected memory? + ld a,ectpafull ; Get ready with TPA overflow error code + jp c,error ; Error if about to overwrite protected memory +mload4b: + push hl ; Save this load address + ex de,hl ; Set DMA address + call dmaset + call readcmd + pop hl ; Get last load address back + jr nz,mload5 ; Read error or eof? + ld de,128 ; Increment load address by 128 + add hl,de + jr mload4 ; Continue loading + +; In case a program would like to find out in what directory the command +; processor found the program, temporary DU is stored in bytes 13 (user) and +; 14 (drive) in the command FCB. + +mload5: + +tempusr equ $+1 ; Pointers for in-the-code modification +tempdr equ $+2 + ld hl,0 + ld (cmdfcb+13),hl + +logcurrent: ; Return to original logged directory + ld hl,(curusr) ; Set L = current user, H = current drive + ld a,h + call setdrive ; Login current drive + ld a,l + jp setuser ; Log in new user and return from MLOAD + +;---------------------------------------- + +; This routine checks to see if building the path or running the ECP should +; be skipped. If there is a colon in the command (an explicit directory +; given) but it was not a lone colon (indicating desire to skip resident +; commands), then the routine returns with the zero flag reset. + + if skippath + +skipchk: + ld a,(colon) ; Was there a colon in the command? + or a + ret z ; Return with zero flag set if not + + if fastecp or badduecp + ld a,(firstchar) ; See if the first character was the colon + else +firstchar equ $+1 ; Put data here if other two options are + ld a,0 ; ..false (in-the-code modification) + endif ;fastecp or badduecp + + cp ':' + ret ; Return: Z if lone colon, NZ otherwise + + endif ;skippath + + +; End ZCPR33-6.Z80 + + page + +;----------------------------------------------------------------------------- +; +; D A T A A R E A D E F I N I T I O N S +; +;----------------------------------------------------------------------------- + +; ---------- Page line count buffer + + if lton ; Needed only if TYPE command included + +pagcnt: + defs 1 ; Lines left on page (filled in by code) + + endif ;lton + + +; ---------- Minpath/Rootpth buffers + + if extmpath + +mpath equ extmpathadr ; Assign external minpath address + + else + +mpath: + if drvprefix + defs 2 ; Two bytes for specified DU + endif + + if scancur + defs 2 ; Two bytes for current DU + endif + + defs 2 * expaths ; Space for path from path buffer + + defs 1 ; One byte for ending null + + endif ; not extmpath + + + if rootonly +rootpth: + defs 2 ; Special path for root dir only + defb 0 ; End of path + endif ; rootonly + +;----------------------------------------------------------------------------- + +; The following will cause an error message to appear if +; the size of ZCPR33 is over 2K bytes. + + if [ $ - entry ] gt 800h + *** ZCPR33 IS LARGER THAN 2K BYTES *** + endif + + endif ;errflag + + end ; ZCPR33 + \ No newline at end of file diff --git a/Source/BPBIOS/bp33.dat b/Source/BPBIOS/bp33.dat deleted file mode 100644 index 2463481ec531dea45e3729e0a1af99610dfe82aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11008 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 diff --git a/Source/BPBIOS/bp33bnkx.dat b/Source/BPBIOS/bp33bnkx.dat deleted file mode 100644 index 8de61c304b1c1b11f72a2bcb6b76d13871da7981..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12416 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 diff --git a/Source/BPBIOS/bp33n.dat b/Source/BPBIOS/bp33n.dat index 69695a7ba34ffb6cc059137a4d5429016ddbb686..8ec9a9c2abda6192ba46c0d962204bd2eb28c064 100644 GIT binary patch literal 11392 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 literal 11904 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 diff --git a/Source/BPBIOS/bp33nbnk.dat b/Source/BPBIOS/bp33nbnk.dat index c2ab01c6a43ad940b03a2d6c7500051ed947c028..8ec9a9c2abda6192ba46c0d962204bd2eb28c064 100644 GIT binary patch literal 11392 zcmeHtdw3L8mU#6eopdLubftMz0+L%@5sGdINeLmAN%0B<2l6nWQ4k_C0x|+Ya12SL ziKCxVmCl7~NJ0QRp_6oX*tXROjf$ju&+ULS z?zpr2$M5@o-|zdjlCHY*BRiWCIYbg(vMwxFS zZsOOKSFb||ZKz#KX%zhz_~kXr@2s9*S4Zj(Qt6a=t>sG;me;JikJP`jvLXprC~CuP zE358#;>tt{^|6(DKZCkvq^{Fc;x|-WPfZw6>x4FOBta!6vaNYKimG9!Wi6phkmRlZ~vqd-<0nyqPJwn2;4QW6+e<^y2oW zEO=gQu)jKi@9U8%{QVv}6Ib;xw|j77kNCR@7C~{h_~b;X_{@a(+X>E?uv3X*Dv0mE z0ayGE;iBW!i35bl8={et^*2gAIpOj?>wO_)ikrH-R3L#nPC2MV(1oYI_*}N^odIc})Nv(ct+xzb9 zz$2hE$2%&1z6V+2dcnjOQ+#opqvDvN*k8(e4tU*+3}Wkq_XY1N#Cod`N7$X|J;@!K zaJ30GP^Qx3VWxTObkJr0ohjvi?19p(Rc7;T~tzt-auXLaMIZp49@ zlZvQASs+31f7{+o$kYcU(eF0P(>-e6LqX^#vgDw%6Aelm2ij z+lJeE#(^urFk?oxF95||5gj;Z#AJvUAQRt*uXOt&x)gv&Z=cF`#kmp-QDq7rFGJ%X zhUylB-F>DsQclIzlO9{#fzsq9*?6j#P0i-xOM0eyts#Qp+0TMpuzO)Z4T4%SEj4vZ zUgVA>bQbfTh^&G^gWV<#JHos8ApSR8jC=u8S}vGedq*63c$@XITeU@IO$~y51cbYD z+l0Gpwji{g+m4KY{?r!`(jq!5aLW!yg3c=EDzNT+cXW9`XqFNaZRpW1BAp9N%?$n6 z>FL5Vy`92lVw3e9vO(!m-DPToC;D^sFDo&Dt?4UxBdL(yg)t744DE00D8E5fxD|6) z$VyVqWz19#DaS|!@iyV8V_y8g(UR95KUVTP(h+Wz)`5JXgYhi`@fIyquM!=6SMBSf z_4R=01nqG>BVaNks*7*)#6k!0oSyMd*^j|?=qbUzE}TMj`T}h#m^7Wseo#-->?ODO z(FDO~0fkbPwz8kl411aT9hj!a-3Y+|;s9-9JLN<@jo7ysL!9S%Q%Y`o2Waav7qkQn zUvsv3;&-U-q%oM%WrWop$VjhFWZO&zNLjC|;1bh7Jbqil8%zon$x)+go|tHA6Z9{t zWrT51$m4%p1{@!VTT0UUEisVpwedd|0;Igs2wL(0;4M=c4;u0S(0Wy!H5Ga>;$e*p z1C-l5{81EhJ%`52ROxS^r|P8NO|%KOyFmzWQWDR0_6YghYLBZ-yw8Kz_MqvDoQ-&2 zkC4R}5?m{#YXw)q|B5@n|G?!qYJym+l`$rC2rv;@2T_onjw8e=+i444}L&C)q zTccDu9kh6Y>4_WE?=)!nDz}MZtQ2b^Uke2zL>sZ<{=xweF(u9n^rybPWPtA)!B_EY zs=-`Y9$@`xk5@v}FNK;+sxS1z)7ApGMITe-F7f5%M%JZn` zM)1)?JZ7UD)agum+COk$Ot2DphtvIN^3uK`9v8X-&^uMU}H3Is5^ z+K@mhn}8Qr$Rwv8?^3<}+MMbxlES^_V0<(#Nx`GuAkM7;Eb0?aORu`-)Sl-aM zb+5akVY_{;X0Ots`?hFBKhyldK7YV(-=z8N^%@sC6KoRKXz`4a%y<#}zCI9tNb4`E z=HBiNa>JV0Omw=YF_j^C@edEHF3#olseYw5uy%&40Txf?c z`TGQZAN3COp7rXcOqnT|W(wI##-KD;Ym;?7roqE1 z-sbagb2V2n)z)JkjAwe{7Ej#liKltuNEHo~WS~@OwkFQeY!K7>fS!;0g)ivXq*d|p zOhF&FbXT2@9~6x7G*s+5?3uBsZxtWmW&_&gY&5bdx%h{tA!;_gQ1OVbk522t8G|%} zmz)M{by}l7H9i$;v&iE9y(fqvShH8-*(g7VPoD-dFtu1EBO_~o($>!dKs!lu9igel zttgcfG}nSgH9LscoenH?9TO~NxwekDp+o6D6Oc1mCXNa-<7OclZCj<K4@GPulR-y?Yz>qK4flKhv^e%g&t=f+;X51BpyazI4AaOmh{yX!n5CpZz?9C* zhNE&p&w8H=#@O{f>xV$KQ#Kw#ncO_hwKfbp=!hM>AJGB@DgK;1#)oJVwFvI@* zjxw=MQ(G3)H!rB;uK8PDY2=$UmC(gux9C&{zt*vp_KtDCjref}8sSepjaV zAWD@S8mqs7%mcMwZS^;1`U9#XT{9V(sb?+`3Fc`nz*s1&;=~qEr&IH;5cKVy#=dGi zWAO1eg)>Z{rqjcSViz^qWM&p>bQ%mV#TuOzJ>v7O=)e{I5g-7aVZY`ly;Uzb92MH* zZ&ricEiX4T|LRRSA?QjgUh}xOHyjZxO>M|L*?ac5-?2=?_5J0Qpr7FSO*VHU46)IT zE46+6UWceP@{Ra*s>$Fj_1@vX^{U#d?I_}hR$}91#!OrN$LJb!VmRBm=pno^=PL-Bw{#P=#OR`pB#9R7n4uI}y ztGU`NE!WyM3n}K!{5{U**I^<^kus6FUYqsvh_nQ1q1RzD``ZEO9t~`5a^{ps*wof4NizP;}#Zt>p#2`R8gi0C}iI%C`Kd`5#K& zBCFES1L8eeM;CsmAD0c_ADsm+>V$rXZmiYZ(OM6&ZhX=Iw4+4J$w2x>wcSHHYrBbJ z^k+`2Jwv(?+zl`41&zDepW!)!5PuzmZ61@3v7B+3wM$^2elP9nzykv~=d1^R(4SmC zfcWOfvW1Is1!Md1<_nEB-uf}~ej>;3%4jc1YlNAF-<8#f(+2P>7lh0%9Yx`vUjPD~ zWSx*U;Fzi5WByJBVB`HTEi-%D{oeF;mV&IDi9hKtra&e-fj685!Jx-~dX_at*MXC+ zDbOIbW}&9!54MC-ORK$-cgD?M1z1#$E7dx&Ozpzu1EIL@^(^ZIc-g<51ICMCBG{h~ z%hfuK_qNldEttUOtk}#?qewRjhLn5w=GTSHU>8_uTePD`2^|#f0I#w``+0>kd0@!t6sC}BS+4>v2b#J|!|wBJRuc^0mUu?4zyJarvhf)y z>|14G4TP^(@!y?e-|wmb^Ij0jd$CgmzLe$*jv6pP)H~^9j#>?-J<@tDWPr%$1_4xJ z3?B@DcLqGcAb0BA$R#{|fJDsqiKc%$0Mxc@*a~Gc4H`$^GDnz&}5-pqk zFK|u%pWFBQf6n&;9@-xS6YC%*-r#XC5RN>sR_y-!bI@`=GQt2jDzfrw2;(!aERIN+IGx_r#N<2#g!J?mUR@@w-xEVD2%f zu@eyba+KMC_BU*3vJ8}s*;-x4J|K_Z; zRx9=3?_4OcfmCRkR1KD$hRqj%DoTgqazc5#7au?GWQk&t468D{h=il zi#`5gMEM`d@b94ytNyAC|0=o(ti*ft2pO#0`09ItF_{vpHNOkRTLrVfJ*y;D*0G22 zr3?7i{lXP|wjVe5Lp)MO-@|uZ0FK&Vjpc{>5Y}%J00XVoKzhH|>_Rj?F+h6%FiQ1% z(@6LGy~uSUN$c`ULkCNMAt0S4m|hxj|*wO50)wf zY6-&dfN%?#4q{(QRQ?%xj3pU8djDKD=UYUZw@PJK&cv5YKN7q zVP*5MvSnC#a9G(stP~9|Ur+-I85wEg2TvuRP#-eeK5_~I@D@isn_QdS(xp5V^XGUNNm^7gDDevV3WEi z5=bOUhMYsU3|WUDFaA5^9~ioKXwA^7p_)6Zi>TJb!AFN48QMLxbBN+D48p=BsH60_ zAr$a+PG%^`w0w~>{0Vg*Y%Sc#UD%cP3l*;#5y{IR|t7P|M*@2N*@ot zbmk$I{ZLsB${d1sl0owN!O#zeemhFuH~(ZE=UhtYp2m6E4Rq$YG90Uawfi7rCu_*bBjaS|;eqT{881@bos`>{rF(};P(*HuDxZHZD&M+q$Mz4X zze!LC{*vf}R7Vn>637Y64=f8LGw`}Qup@9F@Lb?n;N>JNLFo_O#7zsoJp@M}X0DU+aTt#W-2@(OIUoKi*rlTLVd>k0xMY|VdlyKl;@^j3lQqXx@h4$b zxe|;?PY$vX@rAGojKriD!cczvl5!}dycSYUhm=@IM-4KrLGUq|Q)4n>OJi~YyErCG ztQeE$vGZf{MplT)n^-<3m$I{BvdrehWPzO$ljpKoG1kM`^Wa<4~CoI zH?G!UcBHf{*LNS~5s!}!r8OA??WuON;4c%); zfS65L0vy306=Qx)P|Q2z-HGGF%!w~j>KCb#U!=}_ks2T=j-qadwNHHbF$k(Lh(^`e zI115cT+Os(T4Y&9tCp=_wid0dt*x$=^3k$YW%+3N3V4;TgxBh|@Twu%bv0%Ar7J6I z*54=RbAgMh+{(xuSM}^IGR4SCuNv7YlL-@>o=h;w0>M})wISFA{awu&D7<;NGca$y zV9c72u7?cIG>nHj-UJO@O@nU4zZfMuY$I-U1ZH&B)br1ygdM&vFMuFV|W5QXe4aQg zbPdp4ISk#+P?T;dg--{7FgO!5MEp!LQq_S=I+Paup{$SIUL-G#-d^};!}tyFR~kY} zMo3{pU@hd~+(G7ILPuu6z(^X!HH7SDN`6+nm=H%3VmP5f@g_*_C+X-u=UCCMG0cXd zEzU6&3Y~fU%zjn6m>@rKMaVv!h^`AJ9@udpbP&XYUGpGb6$-#f6^a7UBt<#F{!toD z;EYh0V>rR=9)snH<0b3q_PUEt}HE1_b z(Bt@25Nw(B2;{LTi+H)bT;cOL&6!UGck%;b; z#=_6RPVYxy*!FXCaHT*t9(H^XMg|8EajxPPSs>o;f2Q@BpdyV{S~d-B8cNS7&MeG) zlKvk3H2pT+P9LWsnyJ!Y7#QGS`A$ZMpzeCY93kEn3An_|VTb}@`$$;#dBW^+?%p0d z5Gv`niuBlcC{>Jw@vkl7)v#RhtGv8CNSDHrO#C<;QDw?grXH^FxED`{wahaxoB=c7 z_9`5f&bF0`b8O1gbT=fMAQ{&qM*27`&a-iYVMeg&j1UZ^dA2q|C)faJG&=*Cs7g9{NR12-0) zq+lTwq;R-h$j7@zNqaC1kh>57%eL`6ZG_~lwzd<~EN*c;EL{y(0KFIUwii&|TjcLm zOFsd?Y+D;L>|a(5aU{A?7=!(-Psmu3gr}53wFnF_(i~fv^x;@XTL%Dejs?;%s0PB# zuRpNE(*zt=x^_{#wJ$pT>^R~b|KPIzO5pZTJL=bzig?Cu3KR9?tzq8V8aV&oI!i{liYk8 zo=2Mu_zqe~v3{mhTEI$}>xmrq?~mVQ;k~cGm?rD7Oyf#g;H3Gs!^ltuqXdwa3T%hF zD=pED3v4ZMea~-3-RwU}6X7!0mL`Vg^oB~yj#pZsPN=mS3Wr)NBx>wP1=J0tzEqO%iUY4osqG6@|e%QGR9Bm;unz+a&7TZ7!7g5t~HaYbbvB-8KE83(>;luSP z)B6}4gC|50jI78eMZ$H^wy-pgO89u8kP{b#%%oGa94c|vXR>qP%P(kUuXyh$oWXwB zZw1m7u(QiUK0VVYq)LlyPeZHVu1?wb((j=Yole>MifA5d5wpgmVq3+xW70xfN^8AT zWUCv;i)di0-n$#<)JeCIj+I2xq0(m%JXji+&~VG+g;7^1wTyRp-$8nBf+yYvbFjbs zcN6e`dU4mnF5QIw3ygFv9O{6}0LhZkbrm)^0SxKH+ie7*-q5P@Jgpp}O;*-uVpxg@ zQ`P0T6h08jssk0(n~aku36V~ipTV_}GE(nqf;AGyin*cWY|4}}_xslC(T$NX+yXgC znNmsCo9~_OEv=TG8hoPK^gZHX5M&}ffnr!hPR81xRBw@NoXNM2rilAXd6Tla;7qSEV>S6qx)ivY$!rZXTTRdQieW_ zw#1k+F)?9cAvS~J?7|qHYG$Zb$0u;~Qd=@5x!aKHbfU_wyAWJA+lidNNy5HZR`1@2 zYKn?PG#|m94O+Cgps?^^w0uXyK6H-=XZomUG5Xq;-Kc0G5|(e-{qWWY=fY~eamS+% zNtqT4T$CgiDxGNM?#D7AR}QD9TlT@oI=@IP6w!*E4c~ZpUa~Zty*^4xtcLpm^UJsH z-nZk?CbVj2!=61&NT_MpxpOP*h*Zx_7J)04>(J^gdmlvQJN7+1c~-mkKbNZ8vUe9+ z-q7$U+P1f07ph%WN$SF9vXW3KC5f&27Th{mnLOC7+`4bymhD^j!F{KkD%gi}Zrh=z zP$EMmEY!1uhC~Xr819)E;btb4pRdaz6Nlv8%|rkF-A(JwyPF^VU%b0HxhrzxeQPU~ e!WwN~J>_!1Gyie^UI?&G=T{f`U+Di64g3d{=pv2) literal 12544 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 literal 11008 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 literal 12416 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 diff --git a/Source/BPBIOS/bp34.dat b/Source/BPBIOS/bp34.dat deleted file mode 100644 index 57932427425b74b9be5154364b55572e3549e8f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11904 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 EPiM6#7XSbN diff --git a/Source/BPBIOS/bp34t.dat b/Source/BPBIOS/bp34t.dat index 1abf11c5daf9974929a86a1052a0ce759be1afde..ffb28311126d6d0eba76815b64658ebfb1dd591a 100644 GIT binary patch literal 11392 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 literal 11904 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 diff --git a/Source/BPBIOS/bp34tbnk.dat b/Source/BPBIOS/bp34tbnk.dat index 733f543600c86c082bd32b166eebd067da253ac6..ffb28311126d6d0eba76815b64658ebfb1dd591a 100644 GIT binary patch literal 11392 zcmeHtYj_jawdm+!*^=#%#^NzH3Et8;Fi2qR2^eQ$4{uBg#*U$JiUSU9z@Y(5fX3Jk z!fDc^x35cj+Vpwarl$?(OIu8j0bvGg%VQIb#kMUurlgJ9s6^DM8X%TZS}g zbNZe8-5>Y6-*;rs%-(CSz4qE`ug88V6h*ydfY+_x#=93F@~d09mg=IiDC6yd+vV$5 z)U1c{jdg1&nWF!pd|BX-`l!oVDxpUmiP6Mplu9M?EQK11s%58{7gM#%M2&$k-esZW zJ1BMiYQi)^4=k;lO#JuW6s2tJVn4ee^@nIv@q7dv*#NZlxYBW4|H{e@=!x!EY7pAd zJ@nb?+K0O-YI*gFy3ejdXn9Swrl_bW-N^dSF8f3eZ)ZxWwhO@c*$-zhwus1Tk@2)|C)^iew%Eu+GiKN)f* z@8#cc97!A?bdCvnO48oKdOG3qearVk#E>)$jU4m+1c>17Qw}N`cHtW*S~xd)A8HpP ztt2Mr!yB~-hEw?KZa04@spG$qyqDwOaEebSd^JdCe5RyRXkMtMmsPjh>@JpghgUqRY3C5kBx`$I`<2oI+nFv%c$pm(sS;arB%zNjKXwX-k0(WR7l62NYj}Jd zuR0ML_}&SB2%4?IKX$jyn33lfkDtl|#Ha?06Gk>G${BPx3i%AmC>}f25_KhQgA^`CSz+6sk1q&Gi>-N_L ze`XtvYD~u6QCp5$rh=xHDb@n(=O4p^C(BSMqX4w4r!R@ToYiu*Q*}(e{N!=InKk%B znmoz~V*WyS+>pg_1wH6(tK|cKXce~(_ns)327}=p#LNi~pH0-Ru}{(|BgZ7>kYmB+ z$~ov}iGv72B_eU1Us`TRT1vE4oZbcE%^t+Bp7fL(+uVI?2(6*(DHV*OD7MUt%_sRB z{MLy+#z^G@u2(F+d|q=Q)-d;S`^gJ!-D=n|=d#NkQt52G-rYxQphJ;^$t@R>?W2*# zq)vrl&i$GSqka*_{Gy8OZWrgv^!gT;TpOgd=dpf2$C6SSE#gweV=C7tG3^O(s?^uz~I5wX)AkLN;T4mJpC;WlJT2p@4nMm&|0=?mxQ}_;0n%H=Qoep8K7Wo6j^I0Kk)HOW>_1qMAk!C2_#+hA|?| zW2bKoL z1y%^!Go9#d9;1)O*4Qq0R>h7+E5IGHh_uWb(zW$ayN5P0+9-^IO&4`>L>(#hE6t-t zs%;YmLeC%{6GKsMqR;0`E+kFm8A;~C`ONOc7r5|J@b6&hjkWpF5c|68HJh6kd>BW;+Es!7Hm7HFlda1 zCXNDEbra`xo>Ul&N-3e?6d;3`V-3d3V2onrF*k1#M-wfa7=%|Dr2&_hv739GYbkK^ zbJ9*ES;T9qz)s1x2KSvpVWg~Y$fArm$p3f*h zlGpZ3{!Mr(YG=^<@xQ+j?D$*qzn_|HqO`aaEpOi4x@UXSqx%s5g*mA7p7KR=%gbRl zQCwfVym{ZA?K^g$S!i|fs^VqMEnD|=Ry8--*UI*Fa%}Gwx%5YJFgzX%1?`*UpuJJH zMS8-m!Wuc5Q=XeFh3E4Zl8=s_FRii3z2Memqmd}*n)XXWJ+-GFIWtwwQ_bqe)6bv& z*6Hyx-#zU_+-zU1$Hc&_wb=>47dRd0W9Z|^U>zwqKOoxTvpkDLjq zckom0;0<^1c}k8d&XL`c=A1!2tm18_y|y{BtBi7=Gpfm4Z_?yV8okLZZxX43juLg0 zD$bIH*|HVf-8j(m+kSdF?ARo)C!84uykGbr-1d%&!E zTKyj2U;*@QY7&hC4JMhzn-(NZd`2?2uS~mep(p>XUBZGx9ZqnVbP@_fn7r{Zl#`OK;|hzA=^PpHcu-Lk7` z>mxF0n$e0q+n?B4v}*f~t*Cx}ZPBC-Z{4$}c@Jvdg^F@b%eU;< zAtIOp6C6n7nu^4SGWe7%(oM9?S&JPc>C=FjD<3F7d*U5+Z zIiA5_SOh(`B0Zk)Tx6CIgpeVdlXNGg;&U5LyCMgHQOmnP)g$Q-pd?J~p<$>9Dsr1vUgNx%nJ%o*ZnU#JMumi?wf& zgN`4_jwv;vQ``y?9$M;W5{i^bTz6btJv` zK~L27K^pFqttxT5dbb> zo(w&>Cm0SwE@BSz+Rb<3w!To%mFqi*GDU~XYHt-5g4nNj1Y2^0A=QyB8}!W7o=c<$ zbLDnmEMl%2*aG5o%D&~iw#VBtUV~?-FeMmcN@R@|B9C2=X@ikjAk$e8hRS5x96Rdw zE$_oso+uE2!LZ-(lF@499gZsb$>TN9@Ah9dxBcR{l;SlNRloIiHZ>pRO|5QZoE$xS z((70%<3`VlYLHKO!zOEI3xwfV!%CT~ECjiQYr!`?QVN&!<2(9?s(V2@UCA&XOWOEL zxULr_kxwg_>wk4he>x^bZ5j&tVHn^l9(SK+(Uazk}&kV%R>_BuHV zF)X&GLY5eJY}w*+tDEbO>X&RTKn(6z}KQz~WOAgiDz_%j~+O>eAWxeOiWtb3e$RXm{p&rklcLIqH)VT0WM0@wBv zwFZD3)FQa;-);MG`KbeDvpMpx@POPmh#&RfN(FznAFRj&;}C18lRIN|-V4woe#85$ zqg>9oaoVU#a{f(CuG zs}EmLaDKlRzvIzZC}R}5Z;UQou&{vF_w=`&ZLxBe_n5a+`9W7sPkB}g%&>zla|_N= z@Jna;+(8XR;h&rZ0}9+rZvl#Ac@lu^(pI)yj( zL&spmf7s9JW9z|4*A&Z;TC+e_iq!T!T z0-k{abjZr(WU!|yg<5c5NANcW*tZ9(K)vTj3V-HNfiI=)tfLkb5WPBSWR5x+raj^Y zIids4*9jd^i88#SfOUqv;jnFF;Nm4bT_GOxZ6fJkE1(@jvQc0h80&F5A*xslVBxnI zXF}EAU}dG- z3!#HVA&@1A%M~vROB#qrP=_Ma0S3N~F;n>lrn7~!+$0J@Yy_Hvwxa3Ah}7G>jsilC zSSiZFzv>s)$`xMxm9ynm=oOkK)_`VbVdGh#in0M+N-1(L?jP)A-v{IL?OxQE(;6wP zL7Dpfk;PSuyumU=1s~4|?xqi`!F4&oRdg$8iSOi560AD$^;dX(IwjP|K^IDP@Wx<| zxja+Su!r%bv-o8Xe+~c6gWEjdkCZoG!S|m9j@;f58-)7c)^8I41+9^x_d%c0g=jpW zkkLPkGK0P>GWZ~I(RBQ%;tz$O(m@bV&)&41Yq>qNcG5S)>XL#9#(5syJr2&& z&_P5E>_cgle*V8T(%SI&An8k`0&~V6_Ivyxn!3Ys862&jrU=Qw$Ic+q!0I8A|#GaO!t=@NPdeCK`9tW{cz|P`y2*g1bH`9>RmpqgSzmBTl z9u$0l_U%D*Yp^E=W$h0hp(Bg=MZPv<28MnGjLg)Lk>+O;$2y^qG@1&7JyTzStT5a& zGt$Lb;L!UAl`o$KUF&NH19k&vNj2YP%c1h?U6Ddx-Y`|@E2x2GHv|-OJff?bh+KK9 zW)wylCO7&0e5qrmOuDj-H#v|T1`ikF?*!FBEX1@}15BW%D`A-5sI@l7GO0C1dUf~^j_Dby+N%oN}eaBFTWu;bIMEb%sY4zzop< zuPG5r5b{vpPD1owLS+i?8tq@OGn5K=y+xFl<`_-=#-KBag` z4k<4E=WUmY|FrE=@t?L`D*l&k*VR-{o@V@v`r2f_^=3^km7++$DQd;M2hobHd$%{e zLwz+xA^1xdAEf%y#Tn=F&&@lx^jtavug{*_e(u1z=g)PY`(+xIqO^x@mrV=ELvRF= z^-0+80cJOT682Ysai&kgSRX|dWdrQ_ztLL+u)A_T33~uwvvNNP`x3xr)1QQW2VlGz zV7JLp(*j)pn`224Yq|BC76<^$WWA*(2BVS~rR-yYkbOLGHMaNnfzsCkaq;^B;kAII z3ghP{Y#*KrmqNK37hekq-w)u4(M|%7wf{cwX|PMBzYmCCR&hBdXs-Y%Rrp>YK3Q`@ z6@Cy{vN!AZ;ve3Vi@N)3OM8v7`9fuw8{bq}n4lK2U5s&Vi} zHCR6a-e*G1HRYNlNkXfZZdke&t*oo7sS}IP(p8m3XxVajtyl@K)obBZOS0>0D~l>t zR@ZL$oK$2B`BbTck@~J{**hhQk(ON7vr{G$1~xmLVA2TTcqFqqJP6}mW7AQ1Gxmh$ z&g1pwdFW;q+kAV+|W)%ij;E zvE_dvuh#>rDozC4-dm;lrdx>|UF5M!G%w$P>-Tgbs~uYTdVe;=6$#oFy-Doo97+40|HkK zUq2iZ#f}!}V0+y;jcU|P8G|jOC{s8J$EmTS1knbFlVEVwlSW3=e<3Dz@U&V3nJRp3 z6gIPC4Mk(IHM7QW0xak+0ocF5n?~TwlcEH&J+Im|l;isjXgQGUlrd-kw;kWxBod6TOUq6y!}ArAaoBl)x&s|KhzmphGIZ8O;Jj* zXT>*DILANe_;ZTcH3r)ie@=PCx6&XRkP@Nn&EKDvh*z663$30b3p)r*YNc zQtdhlMjVffLi8mg0(opO6ICe3whF2&49OZ$2%-#*qA>>aVNw^As?qdV{LkzE0||iL zkpI0#^50`phD^%oY<20*-FsjUc>VnYLUxkLsO4c!L48d_rW{Kk9^WorF(8@znvpc^Its-aBVR;{k5G$YMr(oMaC|>3Fzy<({ld5!d;&SBSjTPK?y0=- zQ)72|?jV7!;o66j@;- z5#1;LCGb4#^j-ftJH=c4JbmU#}s z888E8uSyzWmbF5dZB?dbcS5oil1VLM#P?(tpLczRi<(C z(+oP>Ujma9OoW2?R-lJ3!aGMudk_Z5y$68hSvii@L-H=GdtjQWQ6PEW#OKZT7#2WZ9*x!1e#F8{TqXMc$A;5^Ut(D@tV}0&E0N{KR zq#>w=0&QInZ}+wWhgAiK-}7fnnkK8Yphn->_?>6E%k|GA%^jBOPd7g-#v$@n9hh!O zGy@YgVkqz;?9SEzxJuv3YJH1Au0$^cS}d|wMKT+GkK$jN>SOEYTYbABB@|ond>ZG_ zzWpRO&x+^LaP8t=n$NKORjD?CmM}L{`JE^F?>BM2mmsD|S}f7Hn&xfdJnLbktAr>4 zq{U+E;h}0%tYN;jJ*hqStC3Fj-^4_q61Js@qB(t$ipu_K6V!=x)Btj%qe`U4j#fe4 zNak;AeEU&mBooeiG`TipoT+m~p6f<%hVP6#2R9(@1j^$~A(iiEBk5Kb><46R`8?l# zKC?BFd0q#XR#Jf^BT?m=%6g#bYlQB+%#6)Ga03V9=`%#l6;NSK zA&jbWe|i|!b$MDizWhV_Q?Y9HYRbXffz|e$+R-w!a-Ea{x-EEaJUlK~Kx3Yp& zyc9Uxh;n^T@J85n5kSdGtztA#4{h^HlBk?ZmhkyWp3hAiMf;(0XJalq8@}B94)&Vw z-jW&YyXP%Hx(ar7Iml<{>iJA@q4im470lHs>0dkngXnZhmX`$MSi4{z6U(esUyh3l ztQj4RVyU%$0xzV2tw!H2pi?j2O$JsJ$bgD}1?R!ixSWP-GB1p{BAJz(%h!vvz7$8S z4d!6~_}@vufA_N82)Hx}?MEfzjX3ps|MU zt2S8SOlRyx476x>Fq~argawSvn1+@xgy7;yj<$g(A!jPH#$xMXHo7;?NV-zQctZZz z(Mt3|tUbX#Uv-4wks*#~O9Ph)?OI`Vt^ln3@(}}9L?nH3gYzK1wDh>N+ zS-op7sx2)Q&^!ctHfUjK@uG!~p=H~f_o4>`IMYX^i_mAb>_Vjr5Wj58uE(}MG6z=c zE!+1!D(0F@a8Yu3ZQb2Yv~t%IxsY1{r>0x>LS&s+DwGIl`Hto!j4GIoHPntv0RT--{(nM@qgcQ+6H{oPH#NPcv8^Joh0Zdz{N y-Mn)9?&hWc`@5TyyCS#VcXd!1tls+RQ!WSm<~_+h2oBci{B)H6f&M>{z<&bljllZ= literal 12416 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


_Mi;Gb!2cLUzlnWW|&X&pgcE; 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 diff --git a/Source/BPBIOS/bp41.dat b/Source/BPBIOS/bp41.dat deleted file mode 100644 index fc3cb8c1e5e92e199bfb833ece4c9e9dd6d4f466..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17792 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 a@9(GV_)OkzyR)2r{(hDJhW`IRf&U3%6n)?T diff --git a/Source/BPBIOS/bp41n.dat b/Source/BPBIOS/bp41n.dat deleted file mode 100644 index 0c01177bd639fca369f3e10a4e41eb3d8bc330c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17920 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 diff --git a/Source/BPBIOS/bp41nbnk.dat b/Source/BPBIOS/bp41nbnk.dat new file mode 100644 index 0000000000000000000000000000000000000000..7f6786be432e24922649213fe46365e09d66b723 GIT binary patch literal 16512 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%0ArSvYU>Jrl`HJSC?ku9+!cm$;@%mA~(KchvK* zqn>{oRh9Fj9Z0sbbYj!DBQv!K#d&<^w?XZ(tc1GXiu8A!r{_nPO5cj$)zSCwE2PR< zBy6n8-&R0?m7y5!uTNFlFjnI~!hu-f-{Ls$_Jy2g4rHURg<-V`qr-T}A zRt!lmsLCkn{(8g#qK*+%sSjV$aR2rGe@Fpn8TS9Yll_;=lbsIL~aJ2Ep z{ho1#BfUX{P369WYmXnm>qz4+70=)A$u=C>A}coSE~3r z%nMye{HDCS{I})1%ik=2yL@lCQtmIO<%8wn^1qaSQa)PV;i-uP=@n)103tX+=e$UT z&-0zi3SWg`@{z)dm99ymEhc@Zl0I{0Wz;wH#I82acPkM;CyS&7ktY%JUm8KEyPJKA zBU^U3Z-@}H8%Qb^2)kX-ckPdMJsMM_Gt_na@!OAocgh=6cTUANTC|GSin2IYgfy#C zO#}lF5FldOF=qOFG%L;oBOdj6Zj2-v=S7@zBBswqvwRinTasIcszY|q+Q{%whNm$? z-DRHT5xM%s($Z3-YY=PjG(_U6%=v589rgb1tBY_#^(fRi1_OyzWs~Qz${Nr2E0w3q zx{>Ta(nuo?sUhNds#2(lI3BMwS)kaYrz(3yu@*qY1Rk$+)I@On#Ixh4iYuiXBYR2K zEYAHzrOWw5WjCMRje0en?^Skt^oS%y=+-Hox(I0Fn`P<|Cs@tGg2)(#Y=%Lqi|iH4 z=(;nkKd3?W)evC$1umBj`)%oal|B2PadmsV5ovj(9{9GGw#?wP%jCzr(nn|OrN=6J zh`D`^7b+mJ;*kiBEN^1EGzCwuL9;j%tn~fLT1k)e_VfZkf9ygUMrC$n^RBP1@poW^ z^(8z0a^n=))KXAT;SgYxmG8Wlf33XDYP~NO_*Fq}}E8d*xa?%l)vD{-)e& zrf-*v>Gn?)>H?QIJ|8Xaeq$f5y=yN+r^{({Z#kvqq9FaS5+R0K{s2QQJzcqDfZ{Uo zGnH%?{mPkc{sn18q!y2imjQFoQHqa)_@Pv1aJHhlmVHkD#kl|X74`84p| z9TD0$RY{cFIQR9DiUkm~pF+?)Kdbcoyb{y!F*5z6QqFkU^K9kC?2jv@`pAxElB+$4 zW6n{}kHKWmR!WN^P3T*^4tJYfMwM7>h+=L^C_100u4vBX%kg$y-o<~YU0XGg|8vL= z)cB|jbiTG~T&_jTkbYMA2zrIMR>+p;-oPSORLJ(1JuQ(=&$@{8^UC_KC#9cOrgt?< z&sH`K)7|A5Rcw~6csxnbiBpt z;5jy#rTy;u2=0_Ofke#+)TQnS#QWf%;5(dJ740sJ@)jmo$!^q~%30H=J#POzv0_nV z0#|&9vu3cYR;CqcHD2lA&^E92F(zTSpB(R4$V@JCS>U{=LLlO7uYg{$+F9HNA=~PS z6H97qMKi)z{jsFEU;55s!8(jF_sfG{@{+A_5hk#@oY$d zhySeG`H~wwI$v?SoV(nf-EJW(1%2Jk5Y8SO(cRD_?3D0fs8)Dmn;xu?%`=~K_eBGV zowelSMCXGQwVu%tD-Yca!Z{y_(5DgH{KV~UuV8Ve!qj#WY<0C<37=h+t}+>iT;Yg;#L=pbT4>)N%e5fboDOI5))){SK0s*QJ%`D-@aJ9dj{Bj>pHS*&JxxZudznr5-Ejj!2`JXH+JP|$?8p;R<*3&gzw6Vm*Toa#ocSv zbZ!?u&duh&A2N@ob8oso9I@cjY_6;fu~m2usgJjx_@95gZNK#K_6L9cc$@3BbN)&H q2On>zq5_v5Q@Xfx-cs<7eI+-3)3>;8frhQ9_{UZL3;O?q0{;VQ1AUPI literal 0 HcmV?d00001 diff --git a/Source/BPBIOS/bp41t.dat b/Source/BPBIOS/bp41t.dat deleted file mode 100644 index 06c9dfdb95e45603c242ae47530fb83e2a5e2c8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17792 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 diff --git a/Source/BPBIOS/bp41tbnk.dat b/Source/BPBIOS/bp41tbnk.dat new file mode 100644 index 0000000000000000000000000000000000000000..736fbe67c9a6fdc5a6ff1761839fde82afa0798e GIT binary patch literal 16768 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℞2+SiekH9>>>>>>>>>>>>>>>>>>>>>>>>>> W A R N I N G <<<<<<<<<<<<<<<<<<<<<<<<<<<<< +;>>> Do NOT Alter these unless you KNOW what you're doing <<< +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +REFRSH EQU NO ; Set to NO for only Static RAM, needed for + ; systems with dynamic RAMs. +NOWAIT EQU NO ; Set to NO to use configured Wait States in + ; Hard Disk Driver. Yes to eliminate Waits. + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; For Z-180/HD64180 systems, The Bank numbers should reflect Physical +; memory in 32k increments. In P112, the ROM occupies the first 32k +; increment and is ambiguously addressed occupying 0-1FFFFH. The upper +; memory bounds (BNKU, BNK3 and BNKM) should be set for your configuration. + +BNK0 EQU BID_USR ; First TPA Bank (switched in/out) 40000H +BNK1 EQU BID_HB ; Second TPA Bank (Common Bank) 48000H +BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H +BNKU EQU 00H ; User Area Bank 58000H + ; (set to 0 to disable) +BNK3 EQU BID_RAMD ; First Bank for RAM disk 60000H +BNKM EQU BID_RAMM ; Maximum Bank # F8000H + ; With both on-board RAMs only (MEM1 or MEM2), + ; the maximum Bank number is 11 (0BH). + +;=========== CPU-dependent Equates, Zilog Z-180/Hitachi HD64180 ========== + +CNTLA0 EQU 00H ; Control Port ASCI 0 +CNTLA1 EQU 01H ; Control Port ASCI 1 +STAT0 EQU 04H ; Serial port 0 Status +STAT1 EQU 05H ; Serial port 1 Status +TDR0 EQU 06H ; Serial port 0 Output Data +TDR1 EQU 07H ; Serial port 1 Output Data +RDR0 EQU 08H ; Serial port 0 Input Data +RDR1 EQU 09H ; Serial Port 1 Input Data +CNTR EQU 0AH ; HD64180 Counter port +TMDR0L EQU 0CH ; HD64180 DMA channel reg (low) +TMDR0H EQU 0DH ; HD64180 DMA channel reg (hi) +RLDR0L EQU 0EH ; CTC0 Reload Count, Low +RLDR0H EQU 0FH ; CTC0 Reload Count, High +TCR EQU 10H ; Interrupt Control Register +TMDR1L EQU 14H ; Timer Data Reg Ch1 (Low) +TMDR1H EQU 15H ; Timer Data Reg Ch1 (High) +RLDR1L EQU 16H ; Timer Reload Reg Ch1 (Low) +RLDR1H EQU 17H ; Timer Reload Reg Ch1 (High) +FRC EQU 18H ; Free-Running Counter +CCR EQU 1FH ; CPU Control Register (ZS8180/Z80182) +SAR0L EQU 20H ; DMA Channel 0 Register start (8 ports) +MAR1L EQU 28H ; DMA Channel 1 Register start (8 ports) +DSTAT EQU 30H ; DMA Status/Control port +DMODE EQU 31H ; DMA Mode Control port +DCNTL EQU 32H ; DMA/WAIT Control Register +IL EQU 33H ; Interrupt Segment Register +ITC EQU 34H ; Interrupt/Trap Control Register +RCR EQU 36H ; HD64180 Refresh Control register +CBR EQU 38H ; MMU Common Base Register +BBR EQU 39H ; MMU Bank Base Register +CBAR EQU 3AH ; MMU Common/Bank Area Register +OMCR EQU 3EH ; Operation Mode Control Reg +ICR EQU 3FH ; I/O Control Register + +; Some bit definitions used with the Z-180 on-chip peripherals: + +TDRE EQU 02H ; ACSI Transmitter Buffer Empty +RDRF EQU 80H ; ACSI Received Character available + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; Extended Features of Z80182 for P112 + +WSGCS EQU 0D8H ; Wait-State Generator CS +ENH182 EQU 0D9H ; Z80182 Enhancements Register +PINMUX EQU 0DFH ; Interrupt Edge/Pin Mux Register +RAMUBR EQU 0E6H ; RAM End Boundary +RAMLBR EQU 0E7H ; RAM Start Boundary +ROMBR EQU 0E8H ; ROM Boundary +FIFOCTL EQU 0E9H ; FIFO Control Register +RTOTC EQU 0EAH ; RX Time-Out Time Constant +TTOTC EQU 0EBH ; TX Time-Out Time Constant +FCR EQU 0ECH ; FIFO Register +SCR EQU 0EFH ; System Pin Control +RBR EQU 0F0H ; MIMIC RX Buffer Register (R) +THR EQU 0F0H ; MIMIN TX Holding Register (W) +IER EQU 0F1H ; Interrupt Enable Register +LCR EQU 0F3H ; Line Control Register +MCR EQU 0F4H ; Modem Control Register +LSR EQU 0F5H ; Line Status Register +MDMSR EQU 0F6H ; Modem Status Register +MSCR EQU 0F7H ; MIMIC Scratch Register +DLATL EQU 0F8H ; Divisor Latch (Low) +DLATM EQU 0F9H ; Divisor Latch (High) +TTCR EQU 0FAH ; TX Time Constant +RTCR EQU 0FBH ; RX Time Constant +IVEC EQU 0FCH ; MIMIC Interrupt Vector +MIMIE EQU 0FDH ; MIMIC Interrupt Enable Register +IUSIP EQU 0FEH ; MIMIC Interrupt Under-Service Register +MMCR EQU 0FFH ; MIMIC Master Control Register + +; Z80182 PIO Registers + +DDRA EQU 0EDH ; Data Direction Register A +DRA EQU 0EEH ; Port A Data +DDRB EQU 0E4H ; Data Direction Register B +DRB EQU 0E5H ; Data B Data +DDRC EQU 0DDH ; Data Direction Register C +DRC EQU 0DEH ; Data C Data + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; ESCC Registers on Z80182 + +SCCACNT EQU 0E0H ; ESCC Control Channel A +SCCAD EQU 0E1H ; ESCC Data Channel A +SCCBCNT EQU 0E2H ; ESCC Control Channel B +SCCBD EQU 0E3H ; ESCC Data Channel B + +; [E]SCC Internal Register Definitions + +RR0 EQU 00H +RR1 EQU 01H +RR2 EQU 02H +RR3 EQU 03H +RR6 EQU 06H +RR7 EQU 07H +RR10 EQU 0AH +RR12 EQU 0CH +RR13 EQU 0DH +RR15 EQU 0FH + +WR0 EQU 00H +WR1 EQU 01H +WR2 EQU 02H +WR3 EQU 03H +WR4 EQU 04H +WR5 EQU 05H +WR6 EQU 06H +WR7 EQU 07H +WR9 EQU 09H +WR10 EQU 0AH +WR11 EQU 0BH +WR12 EQU 0CH +WR13 EQU 0DH +WR14 EQU 0EH +WR15 EQU 0FH + +; FDC37C665/6 Parallel Port in Standard AT Mode + +DPORT EQU 8CH ; Data Port +SPORT EQU 8DH ; Status Port +CPORT EQU 8EH ; Control Port + +; FDC37C665/6 Configuration Control (access internal registers) + +CFCNTL EQU 90H ; Configuration control port +CFDATA EQU 91H ; Configuration data port + +; FDC37C665/6 Floppy Controller on P112 (Intel 80277 compatible) + +DCR EQU 92H ; Drive Control Register (Digital Output) +MSR EQU 94H ; Main Status Register +DR EQU 95H ; Data/Command Register +DRR EQU 97H ; Data Rate Register/Disk Changed Bit in B7 + +_DMA EQU 0A0H ; Diskette DMA Address + +; FDC37C665/6 Serial Port (National 16550 compatible) + +_RBR EQU 68H ;R Receiver Buffer +_THR EQU 68H ;W Transmit Holding Reg +_IER EQU 69H ;RW Interrupt-Enable Reg +_IIR EQU 6AH ;R Interrupt Ident. Reg +_FCR EQU 6AH ;W FIFO Control Reg +_LCR EQU 6BH ;RW Line Control Reg +_MCR EQU 6CH ;RW Modem Control Reg +_LSR EQU 6DH ;RW Line Status Reg +_MMSR EQU 6EH ;RW Modem Status Reg +_SCR EQU 6FH ;N/A Scratch Reg. (not avail in XT) +_DDL EQU 68H ;RW Divisor LSB | wih DLAB +_DLM EQU 69H ;RW Divisor MSB | set High + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; Equates for the National DP8490/NCR 5380 Prototype SCSI controller + + IF HARDDSK +NCR EQU 40H ; Base of NCR 5380 + +; 5380 Chip Registers + +NCRDAT EQU NCR ; Current SCSI Data (Read) + ; Output Data Register (Write) +NCRCMD EQU NCR+1 ; Initiator Command Register (Read/Write) +NCRMOD EQU NCR+2 ; Mode Register (Read/Write) +NCRTGT EQU NCR+3 ; Target Command Register (Read/Write) +NCRBUS EQU NCR+4 ; Current SCSI Bus Status (Read) +NCRST EQU NCR+5 ; Bus & Status Register (Read) + ; Start DMA Send (Write) +NCRINT EQU NCR+7 ; Reset Parity/Interrupt (Read) + ; Start DMA Initiator Receive (Write) +DMAACK EQU NCR+8 ; SCSI Dack IO Port (Read/Write) + +; Bit Assignments for NCR 5380 Ports as indicated + +B_ARST EQU 10000000B ; Assert *RST (NCRCMD) +B_AACK EQU 00010000B ; Assert *ACK (NCRCMD) +B_ASEL EQU 00000100B ; Assert *SEL (NCRCMD) +B_ABUS EQU 00000001B ; Assert *Data Bus (NCRCMD) + +B_BSY EQU 01000000B ; *Busy (NCRBUS) +B_REQ EQU 00100000B ; *Request (NCRBUS) +B_MSG EQU 00010000B ; *Message (NCRBUS) +B_CD EQU 00001000B ; *Command/Data (NCRBUS) +B_IO EQU 00000100B ; *I/O (NCRBUS) +B_SEL EQU 00000010B ; *Select (NCRBUS) + +B_PHAS EQU 00001000B ; Phase Match (NCRST) +B_BBSY EQU 00000100B ; Bus Busy (NCRST) + +B_MBSY EQU 00000100B ; Monitor Busy Flag (NCRMOD) +B_DMA EQU 00000010B ; DMA Mode of transfer (NCRMOD) + ENDIF ;harddsk + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; Equates reflecting GIDE Base address from Address Jumpers (if GIDE added) +; Set the base GIDE equate to the jumper setting on the GIDE board. + + IF IDE +GIDE EQU 50H ; Set base of 16 byte address range + +IDEDOR EQU GIDE+6 ; Digital Output Register +IDEDat EQU GIDE+8 ; IDE Data Register (16-bit wide) +IDEErr EQU GIDE+9 ; IDE Error Register +IDESCnt EQU GIDE+0AH ; IDE Sector Count Register +IDESNum EQU GIDE+0BH ; IDE Sector Number Register +IDECLo EQU GIDE+0CH ; IDE Cylinder Number (Low) +IDECHi EQU GIDE+0DH ; IDE Cylinter Number (High) +IDESDH EQU GIDE+0EH ; IDE S-Drive-Head Register +IDECmd EQU GIDE+0FH ; IDE Command/Status Register + +CMDHOM EQU 10H ; Home Drive Heads +CMDRD EQU 20H ; Read Sector Command (w/retry) +CMDWR EQU 30H ; Write Sector Command (w/retry) +CMDVER EQU 40H ; Verify Sector(s) Command (w/retry) +CMDFMT EQU 50H ; Format Track Command +CMDDIAG EQU 90H ; Execute Diagnostics Command +CMDINIT EQU 91H ; Initialize Drive Params Command +CMDPW0 EQU 0E0H ; Low Range of Power Control Commands +CMDPW3 EQU 0E3H ; High Range of Power Control Commands +CMDPWQ EQU 0E5H ; Power Status Query Command +CMDID EQU 0ECH ; Read Drive Ident Data Command + ENDIF ;ide +;=================== End Unique Equates ======================= + \ No newline at end of file diff --git a/Source/BPBIOS/def-ww-z33nbnk.lib b/Source/BPBIOS/def-ww-z33nbnk.lib new file mode 100644 index 00000000..0f37d33b --- /dev/null +++ b/Source/BPBIOS/def-ww-z33nbnk.lib @@ -0,0 +1,373 @@ +;:::::::::::::::::::::::::::::::::::::::::::::::********************** +; B/P BIOS Configuration and Equate File. ** System Dependant ** +; - D-X Designs Pty Ltd P112 CPU Board - ********************** +; Tailor your system here. +; +; 30 Aug 01 - Cleaned up for GPL release. HFB +; 11 May 97 - Added GIDE and adjusted HD equates. HFB +; 5 Jan 97 - Reformatted to Standard. HFB +; 10 Jun 96 - Initial Test Release. HFB +;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +; BIOS Configuration Equates and Macros + +DATE MACRO + DEFB '17 Jan 14' ; Date of this version + ENDM + +AUTOCL MACRO + DEFB 8,'ZEX Z33 ',0 ; Autostart command line + ENDM + +;--- Basic System and Z-System Section --- + +MOVCPM EQU no ; Integrate into MOVCPM "type" loader? + IF MOVCPM +VERS EQU 13H ; Version number in BCD (Hex) (Major/Minor) + ELSE +VERS EQU 21H ; Version number w/Device Swapping permitted + ENDIF +BANKED EQU YES ; Is this a banked BIOS? +ZSDOS2 EQU NO ; Yes = Banked Dos, No = CP/M 2.2 Compatible +INROM EQU NO ; Alternate bank in ROM? +MHZ EQU 18 ; Set to Speed in MHZ (6/9/12/16/18/24) +FASTWB EQU YES ; Yes if restoring CPR from banked RAM + ; ..No if restoring from Drive A +Z3 EQU YES ; Include ZCPR init code? +HAVIOP EQU NO ; Include IOP code into Jump table? +INTPXY EQU YES ; Internal HBIOS Mini Proxy +CONF_T EQU NO ; Set for Segment Configuration T +CONF_N EQU YES ; Set for Segment Configuration N + +;--- Memory configuration Section --- (Expansion Memory configured here) + +IBMOVS EQU NO ; Yes = Inter-bank Moves allowed (Z180/64180) + ; No = Include Common RAM transfer buffer + +;--- Character Device Section --- + +MORDEV EQU NO ; YES = Include any extra Char Device Drivers + ; NO = Only use the 4 defined Char Devices +ESCC_B EQU no ; Include ESCC Channel B Driver? + ; The following two devices result in non-standard data rates + ; with the standard 16.00 MHz crystal in the P112. If a more + ; "standard" crystal is used (12.288, 18.432, 24.576 MHz etc) + ; is used, the ports become usable. + ; Driver code for ASCI0 and ASCI1 includes an option for + ; assembling Polled or Interrupt-driven buffered input. + ; Select the desired option for ASCI0 with the BUFFA0 flag, + ; and BUFFA1 for ASCI1. +ASCI_0 EQU false ; Include ASCI0 Driver? +BUFFA0 EQU false ; Use buffered ASCI0 Input Driver? +ASCI_1 EQU false ; Include ASCI1 Driver? +BUFFA1 EQU false ; Use buffered ASCI1 Input Driver? + +QSIZE EQU 32 ; size of interrupt typeahead buffers (if used) + ; ..must be 2^n with n<8 +RTSCTS EQU no ; Include RTS/CTS code on Serial Outputs? +XONOFF EQU no ; Include Xon/Xoff handshaking in Serial lines? + +;--- Clock and Time Section --- + +CLOCK EQU YES ; Include ZSDOS Clock Driver Code? +DS1202 EQU YES ; Use Dallas DS-1202 instead of Interrupt RTC? +CLKSET EQU YES ; Allow DS-1202 Clock Sets? (Error if No) +TICTOC EQU NO ;== NOT USED IN P112 ("heartbeat" count) + +;--- Floppy Diskette Section --- + +BIOERM EQU yes ; Print BIOS error messages? +CALCSK EQU YES ; Calculate skew table? +AUTOSL EQU YES ; Auto select floppy formats? + ; If AUTOSL=True, the next two are active... +FDDMA EQU no ; Use DMA Control for Floppy Drive Transfers? +FLOPYH EQU no ; Include "Hi-Density" Floppy Formats? +FLOPY8 EQU no ; Include 8" Floppy Formats? +MORDPB EQU NO ; Include additional Floppy DPB Formats? + +;--- RAM Disk Section --- + +RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made + +;--- Hard Disk Section --- + +HARDDSK EQU YES ; YES = Add Hard-disk Code, NO = Floppy Only + ; (Pick 1 of 3 options below) +SCSI EQU NO ; YES = Use SCSI Driver +IDE EQU NO ; YES = Use IDE Driver +HDSK EQU YES ; YES = Use SIMH HDSK Driver +HDDMA EQU NO ; Use DMA-Controlled Hard Disk Data Transfers? + ; (DMA not implemented for GIDE) +UNIT_0 EQU YES ; Hard Disk Physical Unit 1 +UNIT_1 EQU YES ; Hard Disk Physical Unit 2 +UNIT_2 EQU YES ; Hard Disk Physical Unit 3 + +;--- Logical Drive Section --- + +DRV_A EQU no ; Set each of these equates for the drive and +DRV_B EQU no ; partition complement of your system. Assume +DRV_C EQU no ; that A-D are Floppies. +DRV_D EQU no +DRV_E EQU yes ; Assume that E-L and N-P are Hard Disk +DRV_F EQU yes ; Partitions +DRV_G EQU yes +DRV_H EQU yes +DRV_I EQU yes +DRV_J EQU yes +DRV_K EQU yes +DRV_L EQU yes +DRV_M EQU RAMDSK ; This is Yes for RAM drive +DRV_N EQU yes +DRV_O EQU ~RAMDSK ; Use HBIOS RAM disk if BPBIOS RAM disk is not enabled +DRV_P EQU no + +;========== Configuration Unique Equates (P112) =========== +;>>>>>>>>>>>>>>>>>>>>>>>>>>> W A R N I N G <<<<<<<<<<<<<<<<<<<<<<<<<<<<< +;>>> Do NOT Alter these unless you KNOW what you're doing <<< +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +REFRSH EQU NO ; Set to NO for only Static RAM, needed for + ; systems with dynamic RAMs. +NOWAIT EQU NO ; Set to NO to use configured Wait States in + ; Hard Disk Driver. Yes to eliminate Waits. + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; For Z-180/HD64180 systems, The Bank numbers should reflect Physical +; memory in 32k increments. In P112, the ROM occupies the first 32k +; increment and is ambiguously addressed occupying 0-1FFFFH. The upper +; memory bounds (BNKU, BNK3 and BNKM) should be set for your configuration. + +BNK0 EQU BID_USR ; First TPA Bank (switched in/out) 40000H +BNK1 EQU BID_HB ; Second TPA Bank (Common Bank) 48000H +BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H +BNKU EQU 00H ; User Area Bank 58000H + ; (set to 0 to disable) +BNK3 EQU BID_RAMD ; First Bank for RAM disk 60000H +BNKM EQU BID_RAMM ; Maximum Bank # F8000H + ; With both on-board RAMs only (MEM1 or MEM2), + ; the maximum Bank number is 11 (0BH). + +;=========== CPU-dependent Equates, Zilog Z-180/Hitachi HD64180 ========== + +CNTLA0 EQU 00H ; Control Port ASCI 0 +CNTLA1 EQU 01H ; Control Port ASCI 1 +STAT0 EQU 04H ; Serial port 0 Status +STAT1 EQU 05H ; Serial port 1 Status +TDR0 EQU 06H ; Serial port 0 Output Data +TDR1 EQU 07H ; Serial port 1 Output Data +RDR0 EQU 08H ; Serial port 0 Input Data +RDR1 EQU 09H ; Serial Port 1 Input Data +CNTR EQU 0AH ; HD64180 Counter port +TMDR0L EQU 0CH ; HD64180 DMA channel reg (low) +TMDR0H EQU 0DH ; HD64180 DMA channel reg (hi) +RLDR0L EQU 0EH ; CTC0 Reload Count, Low +RLDR0H EQU 0FH ; CTC0 Reload Count, High +TCR EQU 10H ; Interrupt Control Register +TMDR1L EQU 14H ; Timer Data Reg Ch1 (Low) +TMDR1H EQU 15H ; Timer Data Reg Ch1 (High) +RLDR1L EQU 16H ; Timer Reload Reg Ch1 (Low) +RLDR1H EQU 17H ; Timer Reload Reg Ch1 (High) +FRC EQU 18H ; Free-Running Counter +CCR EQU 1FH ; CPU Control Register (ZS8180/Z80182) +SAR0L EQU 20H ; DMA Channel 0 Register start (8 ports) +MAR1L EQU 28H ; DMA Channel 1 Register start (8 ports) +DSTAT EQU 30H ; DMA Status/Control port +DMODE EQU 31H ; DMA Mode Control port +DCNTL EQU 32H ; DMA/WAIT Control Register +IL EQU 33H ; Interrupt Segment Register +ITC EQU 34H ; Interrupt/Trap Control Register +RCR EQU 36H ; HD64180 Refresh Control register +CBR EQU 38H ; MMU Common Base Register +BBR EQU 39H ; MMU Bank Base Register +CBAR EQU 3AH ; MMU Common/Bank Area Register +OMCR EQU 3EH ; Operation Mode Control Reg +ICR EQU 3FH ; I/O Control Register + +; Some bit definitions used with the Z-180 on-chip peripherals: + +TDRE EQU 02H ; ACSI Transmitter Buffer Empty +RDRF EQU 80H ; ACSI Received Character available + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; Extended Features of Z80182 for P112 + +WSGCS EQU 0D8H ; Wait-State Generator CS +ENH182 EQU 0D9H ; Z80182 Enhancements Register +PINMUX EQU 0DFH ; Interrupt Edge/Pin Mux Register +RAMUBR EQU 0E6H ; RAM End Boundary +RAMLBR EQU 0E7H ; RAM Start Boundary +ROMBR EQU 0E8H ; ROM Boundary +FIFOCTL EQU 0E9H ; FIFO Control Register +RTOTC EQU 0EAH ; RX Time-Out Time Constant +TTOTC EQU 0EBH ; TX Time-Out Time Constant +FCR EQU 0ECH ; FIFO Register +SCR EQU 0EFH ; System Pin Control +RBR EQU 0F0H ; MIMIC RX Buffer Register (R) +THR EQU 0F0H ; MIMIN TX Holding Register (W) +IER EQU 0F1H ; Interrupt Enable Register +LCR EQU 0F3H ; Line Control Register +MCR EQU 0F4H ; Modem Control Register +LSR EQU 0F5H ; Line Status Register +MDMSR EQU 0F6H ; Modem Status Register +MSCR EQU 0F7H ; MIMIC Scratch Register +DLATL EQU 0F8H ; Divisor Latch (Low) +DLATM EQU 0F9H ; Divisor Latch (High) +TTCR EQU 0FAH ; TX Time Constant +RTCR EQU 0FBH ; RX Time Constant +IVEC EQU 0FCH ; MIMIC Interrupt Vector +MIMIE EQU 0FDH ; MIMIC Interrupt Enable Register +IUSIP EQU 0FEH ; MIMIC Interrupt Under-Service Register +MMCR EQU 0FFH ; MIMIC Master Control Register + +; Z80182 PIO Registers + +DDRA EQU 0EDH ; Data Direction Register A +DRA EQU 0EEH ; Port A Data +DDRB EQU 0E4H ; Data Direction Register B +DRB EQU 0E5H ; Data B Data +DDRC EQU 0DDH ; Data Direction Register C +DRC EQU 0DEH ; Data C Data + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; ESCC Registers on Z80182 + +SCCACNT EQU 0E0H ; ESCC Control Channel A +SCCAD EQU 0E1H ; ESCC Data Channel A +SCCBCNT EQU 0E2H ; ESCC Control Channel B +SCCBD EQU 0E3H ; ESCC Data Channel B + +; [E]SCC Internal Register Definitions + +RR0 EQU 00H +RR1 EQU 01H +RR2 EQU 02H +RR3 EQU 03H +RR6 EQU 06H +RR7 EQU 07H +RR10 EQU 0AH +RR12 EQU 0CH +RR13 EQU 0DH +RR15 EQU 0FH + +WR0 EQU 00H +WR1 EQU 01H +WR2 EQU 02H +WR3 EQU 03H +WR4 EQU 04H +WR5 EQU 05H +WR6 EQU 06H +WR7 EQU 07H +WR9 EQU 09H +WR10 EQU 0AH +WR11 EQU 0BH +WR12 EQU 0CH +WR13 EQU 0DH +WR14 EQU 0EH +WR15 EQU 0FH + +; FDC37C665/6 Parallel Port in Standard AT Mode + +DPORT EQU 8CH ; Data Port +SPORT EQU 8DH ; Status Port +CPORT EQU 8EH ; Control Port + +; FDC37C665/6 Configuration Control (access internal registers) + +CFCNTL EQU 90H ; Configuration control port +CFDATA EQU 91H ; Configuration data port + +; FDC37C665/6 Floppy Controller on P112 (Intel 80277 compatible) + +DCR EQU 92H ; Drive Control Register (Digital Output) +MSR EQU 94H ; Main Status Register +DR EQU 95H ; Data/Command Register +DRR EQU 97H ; Data Rate Register/Disk Changed Bit in B7 + +_DMA EQU 0A0H ; Diskette DMA Address + +; FDC37C665/6 Serial Port (National 16550 compatible) + +_RBR EQU 68H ;R Receiver Buffer +_THR EQU 68H ;W Transmit Holding Reg +_IER EQU 69H ;RW Interrupt-Enable Reg +_IIR EQU 6AH ;R Interrupt Ident. Reg +_FCR EQU 6AH ;W FIFO Control Reg +_LCR EQU 6BH ;RW Line Control Reg +_MCR EQU 6CH ;RW Modem Control Reg +_LSR EQU 6DH ;RW Line Status Reg +_MMSR EQU 6EH ;RW Modem Status Reg +_SCR EQU 6FH ;N/A Scratch Reg. (not avail in XT) +_DDL EQU 68H ;RW Divisor LSB | wih DLAB +_DLM EQU 69H ;RW Divisor MSB | set High + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; Equates for the National DP8490/NCR 5380 Prototype SCSI controller + + IF HARDDSK +NCR EQU 40H ; Base of NCR 5380 + +; 5380 Chip Registers + +NCRDAT EQU NCR ; Current SCSI Data (Read) + ; Output Data Register (Write) +NCRCMD EQU NCR+1 ; Initiator Command Register (Read/Write) +NCRMOD EQU NCR+2 ; Mode Register (Read/Write) +NCRTGT EQU NCR+3 ; Target Command Register (Read/Write) +NCRBUS EQU NCR+4 ; Current SCSI Bus Status (Read) +NCRST EQU NCR+5 ; Bus & Status Register (Read) + ; Start DMA Send (Write) +NCRINT EQU NCR+7 ; Reset Parity/Interrupt (Read) + ; Start DMA Initiator Receive (Write) +DMAACK EQU NCR+8 ; SCSI Dack IO Port (Read/Write) + +; Bit Assignments for NCR 5380 Ports as indicated + +B_ARST EQU 10000000B ; Assert *RST (NCRCMD) +B_AACK EQU 00010000B ; Assert *ACK (NCRCMD) +B_ASEL EQU 00000100B ; Assert *SEL (NCRCMD) +B_ABUS EQU 00000001B ; Assert *Data Bus (NCRCMD) + +B_BSY EQU 01000000B ; *Busy (NCRBUS) +B_REQ EQU 00100000B ; *Request (NCRBUS) +B_MSG EQU 00010000B ; *Message (NCRBUS) +B_CD EQU 00001000B ; *Command/Data (NCRBUS) +B_IO EQU 00000100B ; *I/O (NCRBUS) +B_SEL EQU 00000010B ; *Select (NCRBUS) + +B_PHAS EQU 00001000B ; Phase Match (NCRST) +B_BBSY EQU 00000100B ; Bus Busy (NCRST) + +B_MBSY EQU 00000100B ; Monitor Busy Flag (NCRMOD) +B_DMA EQU 00000010B ; DMA Mode of transfer (NCRMOD) + ENDIF ;harddsk + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; Equates reflecting GIDE Base address from Address Jumpers (if GIDE added) +; Set the base GIDE equate to the jumper setting on the GIDE board. + + IF IDE +GIDE EQU 50H ; Set base of 16 byte address range + +IDEDOR EQU GIDE+6 ; Digital Output Register +IDEDat EQU GIDE+8 ; IDE Data Register (16-bit wide) +IDEErr EQU GIDE+9 ; IDE Error Register +IDESCnt EQU GIDE+0AH ; IDE Sector Count Register +IDESNum EQU GIDE+0BH ; IDE Sector Number Register +IDECLo EQU GIDE+0CH ; IDE Cylinder Number (Low) +IDECHi EQU GIDE+0DH ; IDE Cylinter Number (High) +IDESDH EQU GIDE+0EH ; IDE S-Drive-Head Register +IDECmd EQU GIDE+0FH ; IDE Command/Status Register + +CMDHOM EQU 10H ; Home Drive Heads +CMDRD EQU 20H ; Read Sector Command (w/retry) +CMDWR EQU 30H ; Write Sector Command (w/retry) +CMDVER EQU 40H ; Verify Sector(s) Command (w/retry) +CMDFMT EQU 50H ; Format Track Command +CMDDIAG EQU 90H ; Execute Diagnostics Command +CMDINIT EQU 91H ; Initialize Drive Params Command +CMDPW0 EQU 0E0H ; Low Range of Power Control Commands +CMDPW3 EQU 0E3H ; High Range of Power Control Commands +CMDPWQ EQU 0E5H ; Power Status Query Command +CMDID EQU 0ECH ; Read Drive Ident Data Command + ENDIF ;ide +;=================== End Unique Equates ======================= + \ No newline at end of file diff --git a/Source/BPBIOS/def-ww-z33.lib b/Source/BPBIOS/def-ww-z33t.lib similarity index 96% rename from Source/BPBIOS/def-ww-z33.lib rename to Source/BPBIOS/def-ww-z33t.lib index 307c7ccc..4a09616a 100644 --- a/Source/BPBIOS/def-ww-z33.lib +++ b/Source/BPBIOS/def-ww-z33t.lib @@ -34,6 +34,9 @@ FASTWB EQU YES ; Yes if restoring CPR from banked RAM ; ..No if restoring from Drive A Z3 EQU YES ; Include ZCPR init code? HAVIOP EQU NO ; Include IOP code into Jump table? +INTPXY EQU NO ; Internal HBIOS Mini Proxy +CONF_T EQU YES ; Set for Segment Configuration T +CONF_N EQU NO ; Set for Segment Configuration N ;--- Memory configuration Section --- (Expansion Memory configured here) diff --git a/Source/BPBIOS/def-ww-z33bnk.lib b/Source/BPBIOS/def-ww-z33tbnk.lib similarity index 95% rename from Source/BPBIOS/def-ww-z33bnk.lib rename to Source/BPBIOS/def-ww-z33tbnk.lib index dc03758b..fffbe7ac 100644 --- a/Source/BPBIOS/def-ww-z33bnk.lib +++ b/Source/BPBIOS/def-ww-z33tbnk.lib @@ -33,7 +33,10 @@ MHZ EQU 18 ; Set to Speed in MHZ (6/9/12/16/18/24) FASTWB EQU YES ; Yes if restoring CPR from banked RAM ; ..No if restoring from Drive A Z3 EQU YES ; Include ZCPR init code? -HAVIOP EQU no ; Include IOP code into Jump table? +HAVIOP EQU NO ; Include IOP code into Jump table? +INTPXY EQU NO ; Internal HBIOS Mini Proxy +CONF_T EQU YES ; Set for Segment Configuration T +CONF_N EQU NO ; Set for Segment Configuration N ;--- Memory configuration Section --- (Expansion Memory configured here) diff --git a/Source/BPBIOS/def-ww-z34n.lib b/Source/BPBIOS/def-ww-z34n.lib new file mode 100644 index 00000000..865301ea --- /dev/null +++ b/Source/BPBIOS/def-ww-z34n.lib @@ -0,0 +1,373 @@ +;:::::::::::::::::::::::::::::::::::::::::::::::********************** +; B/P BIOS Configuration and Equate File. ** System Dependant ** +; - D-X Designs Pty Ltd P112 CPU Board - ********************** +; Tailor your system here. +; +; 30 Aug 01 - Cleaned up for GPL release. HFB +; 11 May 97 - Added GIDE and adjusted HD equates. HFB +; 5 Jan 97 - Reformatted to Standard. HFB +; 10 Jun 96 - Initial Test Release. HFB +;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +; BIOS Configuration Equates and Macros + +DATE MACRO + DEFB '17 Jan 14' ; Date of this version + ENDM + +AUTOCL MACRO + DEFB 8,'ZEX Z34 ',0 ; Autostart command line + ENDM + +;--- Basic System and Z-System Section --- + +MOVCPM EQU no ; Integrate into MOVCPM "type" loader? + IF MOVCPM +VERS EQU 13H ; Version number in BCD (Hex) (Major/Minor) + ELSE +VERS EQU 21H ; Version number w/Device Swapping permitted + ENDIF +BANKED EQU NO ; Is this a banked BIOS? +ZSDOS2 EQU NO ; Yes = Banked Dos, No = CP/M 2.2 Compatible +INROM EQU NO ; Alternate bank in ROM? +MHZ EQU 18 ; Set to Speed in MHZ (6/9/12/16/18/24) +FASTWB EQU YES ; Yes if restoring CPR from banked RAM + ; ..No if restoring from Drive A +Z3 EQU YES ; Include ZCPR init code? +HAVIOP EQU NO ; Include IOP code into Jump table? +INTPXY EQU YES ; Internal HBIOS Mini Proxy +CONF_T EQU NO ; Set for Segment Configuration T +CONF_N EQU YES ; Set for Segment Configuration N + +;--- Memory configuration Section --- (Expansion Memory configured here) + +IBMOVS EQU NO ; Yes = Inter-bank Moves allowed (Z180/64180) + ; No = Include Common RAM transfer buffer + +;--- Character Device Section --- + +MORDEV EQU NO ; YES = Include any extra Char Device Drivers + ; NO = Only use the 4 defined Char Devices +ESCC_B EQU no ; Include ESCC Channel B Driver? + ; The following two devices result in non-standard data rates + ; with the standard 16.00 MHz crystal in the P112. If a more + ; "standard" crystal is used (12.288, 18.432, 24.576 MHz etc) + ; is used, the ports become usable. + ; Driver code for ASCI0 and ASCI1 includes an option for + ; assembling Polled or Interrupt-driven buffered input. + ; Select the desired option for ASCI0 with the BUFFA0 flag, + ; and BUFFA1 for ASCI1. +ASCI_0 EQU false ; Include ASCI0 Driver? +BUFFA0 EQU false ; Use buffered ASCI0 Input Driver? +ASCI_1 EQU false ; Include ASCI1 Driver? +BUFFA1 EQU false ; Use buffered ASCI1 Input Driver? + +QSIZE EQU 32 ; size of interrupt typeahead buffers (if used) + ; ..must be 2^n with n<8 +RTSCTS EQU no ; Include RTS/CTS code on Serial Outputs? +XONOFF EQU no ; Include Xon/Xoff handshaking in Serial lines? + +;--- Clock and Time Section --- + +CLOCK EQU YES ; Include ZSDOS Clock Driver Code? +DS1202 EQU YES ; Use Dallas DS-1202 instead of Interrupt RTC? +CLKSET EQU YES ; Allow DS-1202 Clock Sets? (Error if No) +TICTOC EQU NO ;== NOT USED IN P112 ("heartbeat" count) + +;--- Floppy Diskette Section --- + +BIOERM EQU yes ; Print BIOS error messages? +CALCSK EQU YES ; Calculate skew table? +AUTOSL EQU YES ; Auto select floppy formats? + ; If AUTOSL=True, the next two are active... +FDDMA EQU no ; Use DMA Control for Floppy Drive Transfers? +FLOPYH EQU no ; Include "Hi-Density" Floppy Formats? +FLOPY8 EQU no ; Include 8" Floppy Formats? +MORDPB EQU NO ; Include additional Floppy DPB Formats? + +;--- RAM Disk Section --- + +RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made + +;--- Hard Disk Section --- + +HARDDSK EQU YES ; YES = Add Hard-disk Code, NO = Floppy Only + ; (Pick 1 of 3 options below) +SCSI EQU NO ; YES = Use SCSI Driver +IDE EQU NO ; YES = Use IDE Driver +HDSK EQU YES ; YES = Use SIMH HDSK Driver +HDDMA EQU NO ; Use DMA-Controlled Hard Disk Data Transfers? + ; (DMA not implemented for GIDE) +UNIT_0 EQU YES ; Hard Disk Physical Unit 1 +UNIT_1 EQU YES ; Hard Disk Physical Unit 2 +UNIT_2 EQU YES ; Hard Disk Physical Unit 3 + +;--- Logical Drive Section --- + +DRV_A EQU no ; Set each of these equates for the drive and +DRV_B EQU no ; partition complement of your system. Assume +DRV_C EQU no ; that A-D are Floppies. +DRV_D EQU no +DRV_E EQU yes ; Assume that E-L and N-P are Hard Disk +DRV_F EQU yes ; Partitions +DRV_G EQU yes +DRV_H EQU yes +DRV_I EQU yes +DRV_J EQU yes +DRV_K EQU yes +DRV_L EQU yes +DRV_M EQU RAMDSK ; This is Yes for RAM drive +DRV_N EQU yes +DRV_O EQU ~RAMDSK ; Use HBIOS RAM disk if BPBIOS RAM disk is not enabled +DRV_P EQU no + +;========== Configuration Unique Equates (P112) =========== +;>>>>>>>>>>>>>>>>>>>>>>>>>>> W A R N I N G <<<<<<<<<<<<<<<<<<<<<<<<<<<<< +;>>> Do NOT Alter these unless you KNOW what you're doing <<< +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +REFRSH EQU NO ; Set to NO for only Static RAM, needed for + ; systems with dynamic RAMs. +NOWAIT EQU NO ; Set to NO to use configured Wait States in + ; Hard Disk Driver. Yes to eliminate Waits. + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; For Z-180/HD64180 systems, The Bank numbers should reflect Physical +; memory in 32k increments. In P112, the ROM occupies the first 32k +; increment and is ambiguously addressed occupying 0-1FFFFH. The upper +; memory bounds (BNKU, BNK3 and BNKM) should be set for your configuration. + +BNK0 EQU BID_USR ; First TPA Bank (switched in/out) 40000H +BNK1 EQU BID_HB ; Second TPA Bank (Common Bank) 48000H +BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H +BNKU EQU 00H ; User Area Bank 58000H + ; (set to 0 to disable) +BNK3 EQU BID_RAMD ; First Bank for RAM disk 60000H +BNKM EQU BID_RAMM ; Maximum Bank # F8000H + ; With both on-board RAMs only (MEM1 or MEM2), + ; the maximum Bank number is 11 (0BH). + +;=========== CPU-dependent Equates, Zilog Z-180/Hitachi HD64180 ========== + +CNTLA0 EQU 00H ; Control Port ASCI 0 +CNTLA1 EQU 01H ; Control Port ASCI 1 +STAT0 EQU 04H ; Serial port 0 Status +STAT1 EQU 05H ; Serial port 1 Status +TDR0 EQU 06H ; Serial port 0 Output Data +TDR1 EQU 07H ; Serial port 1 Output Data +RDR0 EQU 08H ; Serial port 0 Input Data +RDR1 EQU 09H ; Serial Port 1 Input Data +CNTR EQU 0AH ; HD64180 Counter port +TMDR0L EQU 0CH ; HD64180 DMA channel reg (low) +TMDR0H EQU 0DH ; HD64180 DMA channel reg (hi) +RLDR0L EQU 0EH ; CTC0 Reload Count, Low +RLDR0H EQU 0FH ; CTC0 Reload Count, High +TCR EQU 10H ; Interrupt Control Register +TMDR1L EQU 14H ; Timer Data Reg Ch1 (Low) +TMDR1H EQU 15H ; Timer Data Reg Ch1 (High) +RLDR1L EQU 16H ; Timer Reload Reg Ch1 (Low) +RLDR1H EQU 17H ; Timer Reload Reg Ch1 (High) +FRC EQU 18H ; Free-Running Counter +CCR EQU 1FH ; CPU Control Register (ZS8180/Z80182) +SAR0L EQU 20H ; DMA Channel 0 Register start (8 ports) +MAR1L EQU 28H ; DMA Channel 1 Register start (8 ports) +DSTAT EQU 30H ; DMA Status/Control port +DMODE EQU 31H ; DMA Mode Control port +DCNTL EQU 32H ; DMA/WAIT Control Register +IL EQU 33H ; Interrupt Segment Register +ITC EQU 34H ; Interrupt/Trap Control Register +RCR EQU 36H ; HD64180 Refresh Control register +CBR EQU 38H ; MMU Common Base Register +BBR EQU 39H ; MMU Bank Base Register +CBAR EQU 3AH ; MMU Common/Bank Area Register +OMCR EQU 3EH ; Operation Mode Control Reg +ICR EQU 3FH ; I/O Control Register + +; Some bit definitions used with the Z-180 on-chip peripherals: + +TDRE EQU 02H ; ACSI Transmitter Buffer Empty +RDRF EQU 80H ; ACSI Received Character available + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; Extended Features of Z80182 for P112 + +WSGCS EQU 0D8H ; Wait-State Generator CS +ENH182 EQU 0D9H ; Z80182 Enhancements Register +PINMUX EQU 0DFH ; Interrupt Edge/Pin Mux Register +RAMUBR EQU 0E6H ; RAM End Boundary +RAMLBR EQU 0E7H ; RAM Start Boundary +ROMBR EQU 0E8H ; ROM Boundary +FIFOCTL EQU 0E9H ; FIFO Control Register +RTOTC EQU 0EAH ; RX Time-Out Time Constant +TTOTC EQU 0EBH ; TX Time-Out Time Constant +FCR EQU 0ECH ; FIFO Register +SCR EQU 0EFH ; System Pin Control +RBR EQU 0F0H ; MIMIC RX Buffer Register (R) +THR EQU 0F0H ; MIMIN TX Holding Register (W) +IER EQU 0F1H ; Interrupt Enable Register +LCR EQU 0F3H ; Line Control Register +MCR EQU 0F4H ; Modem Control Register +LSR EQU 0F5H ; Line Status Register +MDMSR EQU 0F6H ; Modem Status Register +MSCR EQU 0F7H ; MIMIC Scratch Register +DLATL EQU 0F8H ; Divisor Latch (Low) +DLATM EQU 0F9H ; Divisor Latch (High) +TTCR EQU 0FAH ; TX Time Constant +RTCR EQU 0FBH ; RX Time Constant +IVEC EQU 0FCH ; MIMIC Interrupt Vector +MIMIE EQU 0FDH ; MIMIC Interrupt Enable Register +IUSIP EQU 0FEH ; MIMIC Interrupt Under-Service Register +MMCR EQU 0FFH ; MIMIC Master Control Register + +; Z80182 PIO Registers + +DDRA EQU 0EDH ; Data Direction Register A +DRA EQU 0EEH ; Port A Data +DDRB EQU 0E4H ; Data Direction Register B +DRB EQU 0E5H ; Data B Data +DDRC EQU 0DDH ; Data Direction Register C +DRC EQU 0DEH ; Data C Data + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; ESCC Registers on Z80182 + +SCCACNT EQU 0E0H ; ESCC Control Channel A +SCCAD EQU 0E1H ; ESCC Data Channel A +SCCBCNT EQU 0E2H ; ESCC Control Channel B +SCCBD EQU 0E3H ; ESCC Data Channel B + +; [E]SCC Internal Register Definitions + +RR0 EQU 00H +RR1 EQU 01H +RR2 EQU 02H +RR3 EQU 03H +RR6 EQU 06H +RR7 EQU 07H +RR10 EQU 0AH +RR12 EQU 0CH +RR13 EQU 0DH +RR15 EQU 0FH + +WR0 EQU 00H +WR1 EQU 01H +WR2 EQU 02H +WR3 EQU 03H +WR4 EQU 04H +WR5 EQU 05H +WR6 EQU 06H +WR7 EQU 07H +WR9 EQU 09H +WR10 EQU 0AH +WR11 EQU 0BH +WR12 EQU 0CH +WR13 EQU 0DH +WR14 EQU 0EH +WR15 EQU 0FH + +; FDC37C665/6 Parallel Port in Standard AT Mode + +DPORT EQU 8CH ; Data Port +SPORT EQU 8DH ; Status Port +CPORT EQU 8EH ; Control Port + +; FDC37C665/6 Configuration Control (access internal registers) + +CFCNTL EQU 90H ; Configuration control port +CFDATA EQU 91H ; Configuration data port + +; FDC37C665/6 Floppy Controller on P112 (Intel 80277 compatible) + +DCR EQU 92H ; Drive Control Register (Digital Output) +MSR EQU 94H ; Main Status Register +DR EQU 95H ; Data/Command Register +DRR EQU 97H ; Data Rate Register/Disk Changed Bit in B7 + +_DMA EQU 0A0H ; Diskette DMA Address + +; FDC37C665/6 Serial Port (National 16550 compatible) + +_RBR EQU 68H ;R Receiver Buffer +_THR EQU 68H ;W Transmit Holding Reg +_IER EQU 69H ;RW Interrupt-Enable Reg +_IIR EQU 6AH ;R Interrupt Ident. Reg +_FCR EQU 6AH ;W FIFO Control Reg +_LCR EQU 6BH ;RW Line Control Reg +_MCR EQU 6CH ;RW Modem Control Reg +_LSR EQU 6DH ;RW Line Status Reg +_MMSR EQU 6EH ;RW Modem Status Reg +_SCR EQU 6FH ;N/A Scratch Reg. (not avail in XT) +_DDL EQU 68H ;RW Divisor LSB | wih DLAB +_DLM EQU 69H ;RW Divisor MSB | set High + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; Equates for the National DP8490/NCR 5380 Prototype SCSI controller + + IF HARDDSK +NCR EQU 40H ; Base of NCR 5380 + +; 5380 Chip Registers + +NCRDAT EQU NCR ; Current SCSI Data (Read) + ; Output Data Register (Write) +NCRCMD EQU NCR+1 ; Initiator Command Register (Read/Write) +NCRMOD EQU NCR+2 ; Mode Register (Read/Write) +NCRTGT EQU NCR+3 ; Target Command Register (Read/Write) +NCRBUS EQU NCR+4 ; Current SCSI Bus Status (Read) +NCRST EQU NCR+5 ; Bus & Status Register (Read) + ; Start DMA Send (Write) +NCRINT EQU NCR+7 ; Reset Parity/Interrupt (Read) + ; Start DMA Initiator Receive (Write) +DMAACK EQU NCR+8 ; SCSI Dack IO Port (Read/Write) + +; Bit Assignments for NCR 5380 Ports as indicated + +B_ARST EQU 10000000B ; Assert *RST (NCRCMD) +B_AACK EQU 00010000B ; Assert *ACK (NCRCMD) +B_ASEL EQU 00000100B ; Assert *SEL (NCRCMD) +B_ABUS EQU 00000001B ; Assert *Data Bus (NCRCMD) + +B_BSY EQU 01000000B ; *Busy (NCRBUS) +B_REQ EQU 00100000B ; *Request (NCRBUS) +B_MSG EQU 00010000B ; *Message (NCRBUS) +B_CD EQU 00001000B ; *Command/Data (NCRBUS) +B_IO EQU 00000100B ; *I/O (NCRBUS) +B_SEL EQU 00000010B ; *Select (NCRBUS) + +B_PHAS EQU 00001000B ; Phase Match (NCRST) +B_BBSY EQU 00000100B ; Bus Busy (NCRST) + +B_MBSY EQU 00000100B ; Monitor Busy Flag (NCRMOD) +B_DMA EQU 00000010B ; DMA Mode of transfer (NCRMOD) + ENDIF ;harddsk + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; Equates reflecting GIDE Base address from Address Jumpers (if GIDE added) +; Set the base GIDE equate to the jumper setting on the GIDE board. + + IF IDE +GIDE EQU 50H ; Set base of 16 byte address range + +IDEDOR EQU GIDE+6 ; Digital Output Register +IDEDat EQU GIDE+8 ; IDE Data Register (16-bit wide) +IDEErr EQU GIDE+9 ; IDE Error Register +IDESCnt EQU GIDE+0AH ; IDE Sector Count Register +IDESNum EQU GIDE+0BH ; IDE Sector Number Register +IDECLo EQU GIDE+0CH ; IDE Cylinder Number (Low) +IDECHi EQU GIDE+0DH ; IDE Cylinter Number (High) +IDESDH EQU GIDE+0EH ; IDE S-Drive-Head Register +IDECmd EQU GIDE+0FH ; IDE Command/Status Register + +CMDHOM EQU 10H ; Home Drive Heads +CMDRD EQU 20H ; Read Sector Command (w/retry) +CMDWR EQU 30H ; Write Sector Command (w/retry) +CMDVER EQU 40H ; Verify Sector(s) Command (w/retry) +CMDFMT EQU 50H ; Format Track Command +CMDDIAG EQU 90H ; Execute Diagnostics Command +CMDINIT EQU 91H ; Initialize Drive Params Command +CMDPW0 EQU 0E0H ; Low Range of Power Control Commands +CMDPW3 EQU 0E3H ; High Range of Power Control Commands +CMDPWQ EQU 0E5H ; Power Status Query Command +CMDID EQU 0ECH ; Read Drive Ident Data Command + ENDIF ;ide +;=================== End Unique Equates ======================= + \ No newline at end of file diff --git a/Source/BPBIOS/def-ww-z34nbnk.lib b/Source/BPBIOS/def-ww-z34nbnk.lib new file mode 100644 index 00000000..f64eb30e --- /dev/null +++ b/Source/BPBIOS/def-ww-z34nbnk.lib @@ -0,0 +1,373 @@ +;:::::::::::::::::::::::::::::::::::::::::::::::********************** +; B/P BIOS Configuration and Equate File. ** System Dependant ** +; - D-X Designs Pty Ltd P112 CPU Board - ********************** +; Tailor your system here. +; +; 30 Aug 01 - Cleaned up for GPL release. HFB +; 11 May 97 - Added GIDE and adjusted HD equates. HFB +; 5 Jan 97 - Reformatted to Standard. HFB +; 10 Jun 96 - Initial Test Release. HFB +;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +; BIOS Configuration Equates and Macros + +DATE MACRO + DEFB '17 Jan 14' ; Date of this version + ENDM + +AUTOCL MACRO + DEFB 8,'ZEX Z34 ',0 ; Autostart command line + ENDM + +;--- Basic System and Z-System Section --- + +MOVCPM EQU no ; Integrate into MOVCPM "type" loader? + IF MOVCPM +VERS EQU 13H ; Version number in BCD (Hex) (Major/Minor) + ELSE +VERS EQU 21H ; Version number w/Device Swapping permitted + ENDIF +BANKED EQU YES ; Is this a banked BIOS? +ZSDOS2 EQU NO ; Yes = Banked Dos, No = CP/M 2.2 Compatible +INROM EQU NO ; Alternate bank in ROM? +MHZ EQU 18 ; Set to Speed in MHZ (6/9/12/16/18/24) +FASTWB EQU YES ; Yes if restoring CPR from banked RAM + ; ..No if restoring from Drive A +Z3 EQU YES ; Include ZCPR init code? +HAVIOP EQU NO ; Include IOP code into Jump table? +INTPXY EQU YES ; Internal HBIOS Mini Proxy +CONF_T EQU NO ; Set for Segment Configuration T +CONF_N EQU YES ; Set for Segment Configuration N + +;--- Memory configuration Section --- (Expansion Memory configured here) + +IBMOVS EQU NO ; Yes = Inter-bank Moves allowed (Z180/64180) + ; No = Include Common RAM transfer buffer + +;--- Character Device Section --- + +MORDEV EQU NO ; YES = Include any extra Char Device Drivers + ; NO = Only use the 4 defined Char Devices +ESCC_B EQU no ; Include ESCC Channel B Driver? + ; The following two devices result in non-standard data rates + ; with the standard 16.00 MHz crystal in the P112. If a more + ; "standard" crystal is used (12.288, 18.432, 24.576 MHz etc) + ; is used, the ports become usable. + ; Driver code for ASCI0 and ASCI1 includes an option for + ; assembling Polled or Interrupt-driven buffered input. + ; Select the desired option for ASCI0 with the BUFFA0 flag, + ; and BUFFA1 for ASCI1. +ASCI_0 EQU false ; Include ASCI0 Driver? +BUFFA0 EQU false ; Use buffered ASCI0 Input Driver? +ASCI_1 EQU false ; Include ASCI1 Driver? +BUFFA1 EQU false ; Use buffered ASCI1 Input Driver? + +QSIZE EQU 32 ; size of interrupt typeahead buffers (if used) + ; ..must be 2^n with n<8 +RTSCTS EQU no ; Include RTS/CTS code on Serial Outputs? +XONOFF EQU no ; Include Xon/Xoff handshaking in Serial lines? + +;--- Clock and Time Section --- + +CLOCK EQU YES ; Include ZSDOS Clock Driver Code? +DS1202 EQU YES ; Use Dallas DS-1202 instead of Interrupt RTC? +CLKSET EQU YES ; Allow DS-1202 Clock Sets? (Error if No) +TICTOC EQU NO ;== NOT USED IN P112 ("heartbeat" count) + +;--- Floppy Diskette Section --- + +BIOERM EQU yes ; Print BIOS error messages? +CALCSK EQU YES ; Calculate skew table? +AUTOSL EQU YES ; Auto select floppy formats? + ; If AUTOSL=True, the next two are active... +FDDMA EQU no ; Use DMA Control for Floppy Drive Transfers? +FLOPYH EQU no ; Include "Hi-Density" Floppy Formats? +FLOPY8 EQU no ; Include 8" Floppy Formats? +MORDPB EQU NO ; Include additional Floppy DPB Formats? + +;--- RAM Disk Section --- + +RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made + +;--- Hard Disk Section --- + +HARDDSK EQU YES ; YES = Add Hard-disk Code, NO = Floppy Only + ; (Pick 1 of 3 options below) +SCSI EQU NO ; YES = Use SCSI Driver +IDE EQU NO ; YES = Use IDE Driver +HDSK EQU YES ; YES = Use SIMH HDSK Driver +HDDMA EQU NO ; Use DMA-Controlled Hard Disk Data Transfers? + ; (DMA not implemented for GIDE) +UNIT_0 EQU YES ; Hard Disk Physical Unit 1 +UNIT_1 EQU YES ; Hard Disk Physical Unit 2 +UNIT_2 EQU YES ; Hard Disk Physical Unit 3 + +;--- Logical Drive Section --- + +DRV_A EQU no ; Set each of these equates for the drive and +DRV_B EQU no ; partition complement of your system. Assume +DRV_C EQU no ; that A-D are Floppies. +DRV_D EQU no +DRV_E EQU yes ; Assume that E-L and N-P are Hard Disk +DRV_F EQU yes ; Partitions +DRV_G EQU yes +DRV_H EQU yes +DRV_I EQU yes +DRV_J EQU yes +DRV_K EQU yes +DRV_L EQU yes +DRV_M EQU RAMDSK ; This is Yes for RAM drive +DRV_N EQU yes +DRV_O EQU ~RAMDSK ; Use HBIOS RAM disk if BPBIOS RAM disk is not enabled +DRV_P EQU no + +;========== Configuration Unique Equates (P112) =========== +;>>>>>>>>>>>>>>>>>>>>>>>>>>> W A R N I N G <<<<<<<<<<<<<<<<<<<<<<<<<<<<< +;>>> Do NOT Alter these unless you KNOW what you're doing <<< +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +REFRSH EQU NO ; Set to NO for only Static RAM, needed for + ; systems with dynamic RAMs. +NOWAIT EQU NO ; Set to NO to use configured Wait States in + ; Hard Disk Driver. Yes to eliminate Waits. + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; For Z-180/HD64180 systems, The Bank numbers should reflect Physical +; memory in 32k increments. In P112, the ROM occupies the first 32k +; increment and is ambiguously addressed occupying 0-1FFFFH. The upper +; memory bounds (BNKU, BNK3 and BNKM) should be set for your configuration. + +BNK0 EQU BID_USR ; First TPA Bank (switched in/out) 40000H +BNK1 EQU BID_HB ; Second TPA Bank (Common Bank) 48000H +BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H +BNKU EQU 00H ; User Area Bank 58000H + ; (set to 0 to disable) +BNK3 EQU BID_RAMD ; First Bank for RAM disk 60000H +BNKM EQU BID_RAMM ; Maximum Bank # F8000H + ; With both on-board RAMs only (MEM1 or MEM2), + ; the maximum Bank number is 11 (0BH). + +;=========== CPU-dependent Equates, Zilog Z-180/Hitachi HD64180 ========== + +CNTLA0 EQU 00H ; Control Port ASCI 0 +CNTLA1 EQU 01H ; Control Port ASCI 1 +STAT0 EQU 04H ; Serial port 0 Status +STAT1 EQU 05H ; Serial port 1 Status +TDR0 EQU 06H ; Serial port 0 Output Data +TDR1 EQU 07H ; Serial port 1 Output Data +RDR0 EQU 08H ; Serial port 0 Input Data +RDR1 EQU 09H ; Serial Port 1 Input Data +CNTR EQU 0AH ; HD64180 Counter port +TMDR0L EQU 0CH ; HD64180 DMA channel reg (low) +TMDR0H EQU 0DH ; HD64180 DMA channel reg (hi) +RLDR0L EQU 0EH ; CTC0 Reload Count, Low +RLDR0H EQU 0FH ; CTC0 Reload Count, High +TCR EQU 10H ; Interrupt Control Register +TMDR1L EQU 14H ; Timer Data Reg Ch1 (Low) +TMDR1H EQU 15H ; Timer Data Reg Ch1 (High) +RLDR1L EQU 16H ; Timer Reload Reg Ch1 (Low) +RLDR1H EQU 17H ; Timer Reload Reg Ch1 (High) +FRC EQU 18H ; Free-Running Counter +CCR EQU 1FH ; CPU Control Register (ZS8180/Z80182) +SAR0L EQU 20H ; DMA Channel 0 Register start (8 ports) +MAR1L EQU 28H ; DMA Channel 1 Register start (8 ports) +DSTAT EQU 30H ; DMA Status/Control port +DMODE EQU 31H ; DMA Mode Control port +DCNTL EQU 32H ; DMA/WAIT Control Register +IL EQU 33H ; Interrupt Segment Register +ITC EQU 34H ; Interrupt/Trap Control Register +RCR EQU 36H ; HD64180 Refresh Control register +CBR EQU 38H ; MMU Common Base Register +BBR EQU 39H ; MMU Bank Base Register +CBAR EQU 3AH ; MMU Common/Bank Area Register +OMCR EQU 3EH ; Operation Mode Control Reg +ICR EQU 3FH ; I/O Control Register + +; Some bit definitions used with the Z-180 on-chip peripherals: + +TDRE EQU 02H ; ACSI Transmitter Buffer Empty +RDRF EQU 80H ; ACSI Received Character available + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; Extended Features of Z80182 for P112 + +WSGCS EQU 0D8H ; Wait-State Generator CS +ENH182 EQU 0D9H ; Z80182 Enhancements Register +PINMUX EQU 0DFH ; Interrupt Edge/Pin Mux Register +RAMUBR EQU 0E6H ; RAM End Boundary +RAMLBR EQU 0E7H ; RAM Start Boundary +ROMBR EQU 0E8H ; ROM Boundary +FIFOCTL EQU 0E9H ; FIFO Control Register +RTOTC EQU 0EAH ; RX Time-Out Time Constant +TTOTC EQU 0EBH ; TX Time-Out Time Constant +FCR EQU 0ECH ; FIFO Register +SCR EQU 0EFH ; System Pin Control +RBR EQU 0F0H ; MIMIC RX Buffer Register (R) +THR EQU 0F0H ; MIMIN TX Holding Register (W) +IER EQU 0F1H ; Interrupt Enable Register +LCR EQU 0F3H ; Line Control Register +MCR EQU 0F4H ; Modem Control Register +LSR EQU 0F5H ; Line Status Register +MDMSR EQU 0F6H ; Modem Status Register +MSCR EQU 0F7H ; MIMIC Scratch Register +DLATL EQU 0F8H ; Divisor Latch (Low) +DLATM EQU 0F9H ; Divisor Latch (High) +TTCR EQU 0FAH ; TX Time Constant +RTCR EQU 0FBH ; RX Time Constant +IVEC EQU 0FCH ; MIMIC Interrupt Vector +MIMIE EQU 0FDH ; MIMIC Interrupt Enable Register +IUSIP EQU 0FEH ; MIMIC Interrupt Under-Service Register +MMCR EQU 0FFH ; MIMIC Master Control Register + +; Z80182 PIO Registers + +DDRA EQU 0EDH ; Data Direction Register A +DRA EQU 0EEH ; Port A Data +DDRB EQU 0E4H ; Data Direction Register B +DRB EQU 0E5H ; Data B Data +DDRC EQU 0DDH ; Data Direction Register C +DRC EQU 0DEH ; Data C Data + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; ESCC Registers on Z80182 + +SCCACNT EQU 0E0H ; ESCC Control Channel A +SCCAD EQU 0E1H ; ESCC Data Channel A +SCCBCNT EQU 0E2H ; ESCC Control Channel B +SCCBD EQU 0E3H ; ESCC Data Channel B + +; [E]SCC Internal Register Definitions + +RR0 EQU 00H +RR1 EQU 01H +RR2 EQU 02H +RR3 EQU 03H +RR6 EQU 06H +RR7 EQU 07H +RR10 EQU 0AH +RR12 EQU 0CH +RR13 EQU 0DH +RR15 EQU 0FH + +WR0 EQU 00H +WR1 EQU 01H +WR2 EQU 02H +WR3 EQU 03H +WR4 EQU 04H +WR5 EQU 05H +WR6 EQU 06H +WR7 EQU 07H +WR9 EQU 09H +WR10 EQU 0AH +WR11 EQU 0BH +WR12 EQU 0CH +WR13 EQU 0DH +WR14 EQU 0EH +WR15 EQU 0FH + +; FDC37C665/6 Parallel Port in Standard AT Mode + +DPORT EQU 8CH ; Data Port +SPORT EQU 8DH ; Status Port +CPORT EQU 8EH ; Control Port + +; FDC37C665/6 Configuration Control (access internal registers) + +CFCNTL EQU 90H ; Configuration control port +CFDATA EQU 91H ; Configuration data port + +; FDC37C665/6 Floppy Controller on P112 (Intel 80277 compatible) + +DCR EQU 92H ; Drive Control Register (Digital Output) +MSR EQU 94H ; Main Status Register +DR EQU 95H ; Data/Command Register +DRR EQU 97H ; Data Rate Register/Disk Changed Bit in B7 + +_DMA EQU 0A0H ; Diskette DMA Address + +; FDC37C665/6 Serial Port (National 16550 compatible) + +_RBR EQU 68H ;R Receiver Buffer +_THR EQU 68H ;W Transmit Holding Reg +_IER EQU 69H ;RW Interrupt-Enable Reg +_IIR EQU 6AH ;R Interrupt Ident. Reg +_FCR EQU 6AH ;W FIFO Control Reg +_LCR EQU 6BH ;RW Line Control Reg +_MCR EQU 6CH ;RW Modem Control Reg +_LSR EQU 6DH ;RW Line Status Reg +_MMSR EQU 6EH ;RW Modem Status Reg +_SCR EQU 6FH ;N/A Scratch Reg. (not avail in XT) +_DDL EQU 68H ;RW Divisor LSB | wih DLAB +_DLM EQU 69H ;RW Divisor MSB | set High + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; Equates for the National DP8490/NCR 5380 Prototype SCSI controller + + IF HARDDSK +NCR EQU 40H ; Base of NCR 5380 + +; 5380 Chip Registers + +NCRDAT EQU NCR ; Current SCSI Data (Read) + ; Output Data Register (Write) +NCRCMD EQU NCR+1 ; Initiator Command Register (Read/Write) +NCRMOD EQU NCR+2 ; Mode Register (Read/Write) +NCRTGT EQU NCR+3 ; Target Command Register (Read/Write) +NCRBUS EQU NCR+4 ; Current SCSI Bus Status (Read) +NCRST EQU NCR+5 ; Bus & Status Register (Read) + ; Start DMA Send (Write) +NCRINT EQU NCR+7 ; Reset Parity/Interrupt (Read) + ; Start DMA Initiator Receive (Write) +DMAACK EQU NCR+8 ; SCSI Dack IO Port (Read/Write) + +; Bit Assignments for NCR 5380 Ports as indicated + +B_ARST EQU 10000000B ; Assert *RST (NCRCMD) +B_AACK EQU 00010000B ; Assert *ACK (NCRCMD) +B_ASEL EQU 00000100B ; Assert *SEL (NCRCMD) +B_ABUS EQU 00000001B ; Assert *Data Bus (NCRCMD) + +B_BSY EQU 01000000B ; *Busy (NCRBUS) +B_REQ EQU 00100000B ; *Request (NCRBUS) +B_MSG EQU 00010000B ; *Message (NCRBUS) +B_CD EQU 00001000B ; *Command/Data (NCRBUS) +B_IO EQU 00000100B ; *I/O (NCRBUS) +B_SEL EQU 00000010B ; *Select (NCRBUS) + +B_PHAS EQU 00001000B ; Phase Match (NCRST) +B_BBSY EQU 00000100B ; Bus Busy (NCRST) + +B_MBSY EQU 00000100B ; Monitor Busy Flag (NCRMOD) +B_DMA EQU 00000010B ; DMA Mode of transfer (NCRMOD) + ENDIF ;harddsk + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; Equates reflecting GIDE Base address from Address Jumpers (if GIDE added) +; Set the base GIDE equate to the jumper setting on the GIDE board. + + IF IDE +GIDE EQU 50H ; Set base of 16 byte address range + +IDEDOR EQU GIDE+6 ; Digital Output Register +IDEDat EQU GIDE+8 ; IDE Data Register (16-bit wide) +IDEErr EQU GIDE+9 ; IDE Error Register +IDESCnt EQU GIDE+0AH ; IDE Sector Count Register +IDESNum EQU GIDE+0BH ; IDE Sector Number Register +IDECLo EQU GIDE+0CH ; IDE Cylinder Number (Low) +IDECHi EQU GIDE+0DH ; IDE Cylinter Number (High) +IDESDH EQU GIDE+0EH ; IDE S-Drive-Head Register +IDECmd EQU GIDE+0FH ; IDE Command/Status Register + +CMDHOM EQU 10H ; Home Drive Heads +CMDRD EQU 20H ; Read Sector Command (w/retry) +CMDWR EQU 30H ; Write Sector Command (w/retry) +CMDVER EQU 40H ; Verify Sector(s) Command (w/retry) +CMDFMT EQU 50H ; Format Track Command +CMDDIAG EQU 90H ; Execute Diagnostics Command +CMDINIT EQU 91H ; Initialize Drive Params Command +CMDPW0 EQU 0E0H ; Low Range of Power Control Commands +CMDPW3 EQU 0E3H ; High Range of Power Control Commands +CMDPWQ EQU 0E5H ; Power Status Query Command +CMDID EQU 0ECH ; Read Drive Ident Data Command + ENDIF ;ide +;=================== End Unique Equates ======================= + \ No newline at end of file diff --git a/Source/BPBIOS/def-ww-z34.lib b/Source/BPBIOS/def-ww-z34t.lib similarity index 95% rename from Source/BPBIOS/def-ww-z34.lib rename to Source/BPBIOS/def-ww-z34t.lib index df947672..cfb06fad 100644 --- a/Source/BPBIOS/def-ww-z34.lib +++ b/Source/BPBIOS/def-ww-z34t.lib @@ -33,7 +33,10 @@ MHZ EQU 18 ; Set to Speed in MHZ (6/9/12/16/18/24) FASTWB EQU YES ; Yes if restoring CPR from banked RAM ; ..No if restoring from Drive A Z3 EQU YES ; Include ZCPR init code? -HAVIOP EQU no ; Include IOP code into Jump table? +HAVIOP EQU NO ; Include IOP code into Jump table? +INTPXY EQU NO ; Internal HBIOS Mini Proxy +CONF_T EQU YES ; Set for Segment Configuration T +CONF_N EQU NO ; Set for Segment Configuration N ;--- Memory configuration Section --- (Expansion Memory configured here) diff --git a/Source/BPBIOS/def-ww-z34bnk.lib b/Source/BPBIOS/def-ww-z34tbnk.lib similarity index 95% rename from Source/BPBIOS/def-ww-z34bnk.lib rename to Source/BPBIOS/def-ww-z34tbnk.lib index e80eb05a..dbb99554 100644 --- a/Source/BPBIOS/def-ww-z34bnk.lib +++ b/Source/BPBIOS/def-ww-z34tbnk.lib @@ -33,7 +33,10 @@ MHZ EQU 18 ; Set to Speed in MHZ (6/9/12/16/18/24) FASTWB EQU YES ; Yes if restoring CPR from banked RAM ; ..No if restoring from Drive A Z3 EQU YES ; Include ZCPR init code? -HAVIOP EQU no ; Include IOP code into Jump table? +HAVIOP EQU NO ; Include IOP code into Jump table? +INTPXY EQU NO ; Internal HBIOS Mini Proxy +CONF_T EQU YES ; Set for Segment Configuration T +CONF_N EQU NO ; Set for Segment Configuration N ;--- Memory configuration Section --- (Expansion Memory configured here) diff --git a/Source/BPBIOS/def-ww-z41nbnk.lib b/Source/BPBIOS/def-ww-z41nbnk.lib new file mode 100644 index 00000000..1e2b4570 --- /dev/null +++ b/Source/BPBIOS/def-ww-z41nbnk.lib @@ -0,0 +1,372 @@ +;:::::::::::::::::::::::::::::::::::::::::::::::********************** +; B/P BIOS Configuration and Equate File. ** System Dependant ** +; - D-X Designs Pty Ltd P112 CPU Board - ********************** +; Tailor your system here. +; +; 30 Aug 01 - Cleaned up for GPL release. HFB +; 11 May 97 - Added GIDE and adjusted HD equates. HFB +; 5 Jan 97 - Reformatted to Standard. HFB +; 10 Jun 96 - Initial Test Release. HFB +;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +; BIOS Configuration Equates and Macros + +DATE MACRO + DEFB '17 Jan 14' ; Date of this version + ENDM + +AUTOCL MACRO + DEFB 8,'ZEX Z41 ',0 ; Autostart command line + ENDM + +;--- Basic System and Z-System Section --- + +MOVCPM EQU no ; Integrate into MOVCPM "type" loader? + IF MOVCPM +VERS EQU 13H ; Version number in BCD (Hex) (Major/Minor) + ELSE +VERS EQU 21H ; Version number w/Device Swapping permitted + ENDIF +BANKED EQU YES ; Is this a banked BIOS? +ZSDOS2 EQU YES ; Yes = Banked Dos, No = CP/M 2.2 Compatible +INROM EQU NO ; Alternate bank in ROM? +MHZ EQU 18 ; Set to Speed in MHZ (6/9/12/16/18/24) +FASTWB EQU YES ; Yes if restoring CPR from banked RAM + ; ..No if restoring from Drive A +Z3 EQU YES ; Include ZCPR init code? +HAVIOP EQU NO ; Include IOP code into Jump table? +INTPXY EQU YES ; Internal HBIOS Mini Proxy +CONF_T EQU NO ; Set for Segment Configuration T +CONF_N EQU YES ; Set for Segment Configuration N + +;--- Memory configuration Section --- (Expansion Memory configured here) + +IBMOVS EQU NO ; Yes = Inter-bank Moves allowed (Z180/64180) + ; No = Include Common RAM transfer buffer +;--- Character Device Section --- + +MORDEV EQU NO ; YES = Include any extra Char Device Drivers + ; NO = Only use the 4 defined Char Devices +ESCC_B EQU no ; Include ESCC Channel B Driver? + ; The following two devices result in non-standard data rates + ; with the standard 16.00 MHz crystal in the P112. If a more + ; "standard" crystal is used (12.288, 18.432, 24.576 MHz etc) + ; is used, the ports become usable. + ; Driver code for ASCI0 and ASCI1 includes an option for + ; assembling Polled or Interrupt-driven buffered input. + ; Select the desired option for ASCI0 with the BUFFA0 flag, + ; and BUFFA1 for ASCI1. +ASCI_0 EQU false ; Include ASCI0 Driver? +BUFFA0 EQU false ; Use buffered ASCI0 Input Driver? +ASCI_1 EQU false ; Include ASCI1 Driver? +BUFFA1 EQU false ; Use buffered ASCI1 Input Driver? + +QSIZE EQU 32 ; size of interrupt typeahead buffers (if used) + ; ..must be 2^n with n<8 +RTSCTS EQU no ; Include RTS/CTS code on Serial Outputs? +XONOFF EQU no ; Include Xon/Xoff handshaking in Serial lines? + +;--- Clock and Time Section --- + +CLOCK EQU YES ; Include ZSDOS Clock Driver Code? +DS1202 EQU YES ; Use Dallas DS-1202 instead of Interrupt RTC? +CLKSET EQU YES ; Allow DS-1202 Clock Sets? (Error if No) +TICTOC EQU NO ;== NOT USED IN P112 ("heartbeat" count) + +;--- Floppy Diskette Section --- + +BIOERM EQU yes ; Print BIOS error messages? +CALCSK EQU YES ; Calculate skew table? +AUTOSL EQU YES ; Auto select floppy formats? + ; If AUTOSL=True, the next two are active... +FDDMA EQU no ; Use DMA Control for Floppy Drive Transfers? +FLOPYH EQU no ; Include "Hi-Density" Floppy Formats? +FLOPY8 EQU no ; Include 8" Floppy Formats? +MORDPB EQU NO ; Include additional Floppy DPB Formats? + +;--- RAM Disk Section --- + +RAMDSK EQU YES ; YES = Make RAM-Disk Code, NO = No code made + +;--- Hard Disk Section --- + +HARDDSK EQU YES ; YES = Add Hard-disk Code, NO = Floppy Only + ; (Pick 1 of 3 options below) +SCSI EQU NO ; YES = Use SCSI Driver +IDE EQU NO ; YES = Use IDE Driver +HDSK EQU YES ; YES = Use SIMH HDSK Driver +HDDMA EQU NO ; Use DMA-Controlled Hard Disk Data Transfers? + ; (DMA not implemented for GIDE) +UNIT_0 EQU YES ; Hard Disk Physical Unit 1 +UNIT_1 EQU YES ; Hard Disk Physical Unit 2 +UNIT_2 EQU YES ; Hard Disk Physical Unit 3 + +;--- Logical Drive Section --- + +DRV_A EQU no ; Set each of these equates for the drive and +DRV_B EQU no ; partition complement of your system. Assume +DRV_C EQU no ; that A-D are Floppies. +DRV_D EQU no +DRV_E EQU yes ; Assume that E-L and N-P are Hard Disk +DRV_F EQU yes ; Partitions +DRV_G EQU yes +DRV_H EQU yes +DRV_I EQU yes +DRV_J EQU yes +DRV_K EQU yes +DRV_L EQU yes +DRV_M EQU RAMDSK ; This is Yes for RAM drive +DRV_N EQU yes +DRV_O EQU ~RAMDSK ; Use HBIOS RAM disk if BPBIOS RAM disk is not enabled +DRV_P EQU no + +;========== Configuration Unique Equates (P112) =========== +;>>>>>>>>>>>>>>>>>>>>>>>>>>> W A R N I N G <<<<<<<<<<<<<<<<<<<<<<<<<<<<< +;>>> Do NOT Alter these unless you KNOW what you're doing <<< +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +REFRSH EQU NO ; Set to NO for only Static RAM, needed for + ; systems with dynamic RAMs. +NOWAIT EQU NO ; Set to NO to use configured Wait States in + ; Hard Disk Driver. Yes to eliminate Waits. + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; For Z-180/HD64180 systems, The Bank numbers should reflect Physical +; memory in 32k increments. In P112, the ROM occupies the first 32k +; increment and is ambiguously addressed occupying 0-1FFFFH. The upper +; memory bounds (BNKU, BNK3 and BNKM) should be set for your configuration. + +BNK0 EQU BID_USR ; First TPA Bank (switched in/out) 40000H +BNK1 EQU BID_HB ; Second TPA Bank (Common Bank) 48000H +BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H +BNKU EQU 00H ; User Area Bank 58000H + ; (set to 0 to disable) +BNK3 EQU BID_RAMD ; First Bank for RAM disk 60000H +BNKM EQU BID_RAMM ; Maximum Bank # F8000H + ; With both on-board RAMs only (MEM1 or MEM2), + ; the maximum Bank number is 11 (0BH). + +;=========== CPU-dependent Equates, Zilog Z-180/Hitachi HD64180 ========== + +CNTLA0 EQU 00H ; Control Port ASCI 0 +CNTLA1 EQU 01H ; Control Port ASCI 1 +STAT0 EQU 04H ; Serial port 0 Status +STAT1 EQU 05H ; Serial port 1 Status +TDR0 EQU 06H ; Serial port 0 Output Data +TDR1 EQU 07H ; Serial port 1 Output Data +RDR0 EQU 08H ; Serial port 0 Input Data +RDR1 EQU 09H ; Serial Port 1 Input Data +CNTR EQU 0AH ; HD64180 Counter port +TMDR0L EQU 0CH ; HD64180 DMA channel reg (low) +TMDR0H EQU 0DH ; HD64180 DMA channel reg (hi) +RLDR0L EQU 0EH ; CTC0 Reload Count, Low +RLDR0H EQU 0FH ; CTC0 Reload Count, High +TCR EQU 10H ; Interrupt Control Register +TMDR1L EQU 14H ; Timer Data Reg Ch1 (Low) +TMDR1H EQU 15H ; Timer Data Reg Ch1 (High) +RLDR1L EQU 16H ; Timer Reload Reg Ch1 (Low) +RLDR1H EQU 17H ; Timer Reload Reg Ch1 (High) +FRC EQU 18H ; Free-Running Counter +CCR EQU 1FH ; CPU Control Register (ZS8180/Z80182) +SAR0L EQU 20H ; DMA Channel 0 Register start (8 ports) +MAR1L EQU 28H ; DMA Channel 1 Register start (8 ports) +DSTAT EQU 30H ; DMA Status/Control port +DMODE EQU 31H ; DMA Mode Control port +DCNTL EQU 32H ; DMA/WAIT Control Register +IL EQU 33H ; Interrupt Segment Register +ITC EQU 34H ; Interrupt/Trap Control Register +RCR EQU 36H ; HD64180 Refresh Control register +CBR EQU 38H ; MMU Common Base Register +BBR EQU 39H ; MMU Bank Base Register +CBAR EQU 3AH ; MMU Common/Bank Area Register +OMCR EQU 3EH ; Operation Mode Control Reg +ICR EQU 3FH ; I/O Control Register + +; Some bit definitions used with the Z-180 on-chip peripherals: + +TDRE EQU 02H ; ACSI Transmitter Buffer Empty +RDRF EQU 80H ; ACSI Received Character available + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; Extended Features of Z80182 for P112 + +WSGCS EQU 0D8H ; Wait-State Generator CS +ENH182 EQU 0D9H ; Z80182 Enhancements Register +PINMUX EQU 0DFH ; Interrupt Edge/Pin Mux Register +RAMUBR EQU 0E6H ; RAM End Boundary +RAMLBR EQU 0E7H ; RAM Start Boundary +ROMBR EQU 0E8H ; ROM Boundary +FIFOCTL EQU 0E9H ; FIFO Control Register +RTOTC EQU 0EAH ; RX Time-Out Time Constant +TTOTC EQU 0EBH ; TX Time-Out Time Constant +FCR EQU 0ECH ; FIFO Register +SCR EQU 0EFH ; System Pin Control +RBR EQU 0F0H ; MIMIC RX Buffer Register (R) +THR EQU 0F0H ; MIMIN TX Holding Register (W) +IER EQU 0F1H ; Interrupt Enable Register +LCR EQU 0F3H ; Line Control Register +MCR EQU 0F4H ; Modem Control Register +LSR EQU 0F5H ; Line Status Register +MDMSR EQU 0F6H ; Modem Status Register +MSCR EQU 0F7H ; MIMIC Scratch Register +DLATL EQU 0F8H ; Divisor Latch (Low) +DLATM EQU 0F9H ; Divisor Latch (High) +TTCR EQU 0FAH ; TX Time Constant +RTCR EQU 0FBH ; RX Time Constant +IVEC EQU 0FCH ; MIMIC Interrupt Vector +MIMIE EQU 0FDH ; MIMIC Interrupt Enable Register +IUSIP EQU 0FEH ; MIMIC Interrupt Under-Service Register +MMCR EQU 0FFH ; MIMIC Master Control Register + +; Z80182 PIO Registers + +DDRA EQU 0EDH ; Data Direction Register A +DRA EQU 0EEH ; Port A Data +DDRB EQU 0E4H ; Data Direction Register B +DRB EQU 0E5H ; Data B Data +DDRC EQU 0DDH ; Data Direction Register C +DRC EQU 0DEH ; Data C Data + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; ESCC Registers on Z80182 + +SCCACNT EQU 0E0H ; ESCC Control Channel A +SCCAD EQU 0E1H ; ESCC Data Channel A +SCCBCNT EQU 0E2H ; ESCC Control Channel B +SCCBD EQU 0E3H ; ESCC Data Channel B + +; [E]SCC Internal Register Definitions + +RR0 EQU 00H +RR1 EQU 01H +RR2 EQU 02H +RR3 EQU 03H +RR6 EQU 06H +RR7 EQU 07H +RR10 EQU 0AH +RR12 EQU 0CH +RR13 EQU 0DH +RR15 EQU 0FH + +WR0 EQU 00H +WR1 EQU 01H +WR2 EQU 02H +WR3 EQU 03H +WR4 EQU 04H +WR5 EQU 05H +WR6 EQU 06H +WR7 EQU 07H +WR9 EQU 09H +WR10 EQU 0AH +WR11 EQU 0BH +WR12 EQU 0CH +WR13 EQU 0DH +WR14 EQU 0EH +WR15 EQU 0FH + +; FDC37C665/6 Parallel Port in Standard AT Mode + +DPORT EQU 8CH ; Data Port +SPORT EQU 8DH ; Status Port +CPORT EQU 8EH ; Control Port + +; FDC37C665/6 Configuration Control (access internal registers) + +CFCNTL EQU 90H ; Configuration control port +CFDATA EQU 91H ; Configuration data port + +; FDC37C665/6 Floppy Controller on P112 (Intel 80277 compatible) + +DCR EQU 92H ; Drive Control Register (Digital Output) +MSR EQU 94H ; Main Status Register +DR EQU 95H ; Data/Command Register +DRR EQU 97H ; Data Rate Register/Disk Changed Bit in B7 + +_DMA EQU 0A0H ; Diskette DMA Address + +; FDC37C665/6 Serial Port (National 16550 compatible) + +_RBR EQU 68H ;R Receiver Buffer +_THR EQU 68H ;W Transmit Holding Reg +_IER EQU 69H ;RW Interrupt-Enable Reg +_IIR EQU 6AH ;R Interrupt Ident. Reg +_FCR EQU 6AH ;W FIFO Control Reg +_LCR EQU 6BH ;RW Line Control Reg +_MCR EQU 6CH ;RW Modem Control Reg +_LSR EQU 6DH ;RW Line Status Reg +_MMSR EQU 6EH ;RW Modem Status Reg +_SCR EQU 6FH ;N/A Scratch Reg. (not avail in XT) +_DDL EQU 68H ;RW Divisor LSB | wih DLAB +_DLM EQU 69H ;RW Divisor MSB | set High + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; Equates for the National DP8490/NCR 5380 Prototype SCSI controller + + IF HARDDSK +NCR EQU 40H ; Base of NCR 5380 + +; 5380 Chip Registers + +NCRDAT EQU NCR ; Current SCSI Data (Read) + ; Output Data Register (Write) +NCRCMD EQU NCR+1 ; Initiator Command Register (Read/Write) +NCRMOD EQU NCR+2 ; Mode Register (Read/Write) +NCRTGT EQU NCR+3 ; Target Command Register (Read/Write) +NCRBUS EQU NCR+4 ; Current SCSI Bus Status (Read) +NCRST EQU NCR+5 ; Bus & Status Register (Read) + ; Start DMA Send (Write) +NCRINT EQU NCR+7 ; Reset Parity/Interrupt (Read) + ; Start DMA Initiator Receive (Write) +DMAACK EQU NCR+8 ; SCSI Dack IO Port (Read/Write) + +; Bit Assignments for NCR 5380 Ports as indicated + +B_ARST EQU 10000000B ; Assert *RST (NCRCMD) +B_AACK EQU 00010000B ; Assert *ACK (NCRCMD) +B_ASEL EQU 00000100B ; Assert *SEL (NCRCMD) +B_ABUS EQU 00000001B ; Assert *Data Bus (NCRCMD) + +B_BSY EQU 01000000B ; *Busy (NCRBUS) +B_REQ EQU 00100000B ; *Request (NCRBUS) +B_MSG EQU 00010000B ; *Message (NCRBUS) +B_CD EQU 00001000B ; *Command/Data (NCRBUS) +B_IO EQU 00000100B ; *I/O (NCRBUS) +B_SEL EQU 00000010B ; *Select (NCRBUS) + +B_PHAS EQU 00001000B ; Phase Match (NCRST) +B_BBSY EQU 00000100B ; Bus Busy (NCRST) + +B_MBSY EQU 00000100B ; Monitor Busy Flag (NCRMOD) +B_DMA EQU 00000010B ; DMA Mode of transfer (NCRMOD) + ENDIF ;harddsk + +;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +; Equates reflecting GIDE Base address from Address Jumpers (if GIDE added) +; Set the base GIDE equate to the jumper setting on the GIDE board. + + IF IDE +GIDE EQU 50H ; Set base of 16 byte address range + +IDEDOR EQU GIDE+6 ; Digital Output Register +IDEDat EQU GIDE+8 ; IDE Data Register (16-bit wide) +IDEErr EQU GIDE+9 ; IDE Error Register +IDESCnt EQU GIDE+0AH ; IDE Sector Count Register +IDESNum EQU GIDE+0BH ; IDE Sector Number Register +IDECLo EQU GIDE+0CH ; IDE Cylinder Number (Low) +IDECHi EQU GIDE+0DH ; IDE Cylinter Number (High) +IDESDH EQU GIDE+0EH ; IDE S-Drive-Head Register +IDECmd EQU GIDE+0FH ; IDE Command/Status Register + +CMDHOM EQU 10H ; Home Drive Heads +CMDRD EQU 20H ; Read Sector Command (w/retry) +CMDWR EQU 30H ; Write Sector Command (w/retry) +CMDVER EQU 40H ; Verify Sector(s) Command (w/retry) +CMDFMT EQU 50H ; Format Track Command +CMDDIAG EQU 90H ; Execute Diagnostics Command +CMDINIT EQU 91H ; Initialize Drive Params Command +CMDPW0 EQU 0E0H ; Low Range of Power Control Commands +CMDPW3 EQU 0E3H ; High Range of Power Control Commands +CMDPWQ EQU 0E5H ; Power Status Query Command +CMDID EQU 0ECH ; Read Drive Ident Data Command + ENDIF ;ide +;=================== End Unique Equates ======================= + \ No newline at end of file diff --git a/Source/BPBIOS/def-ww-z41.lib b/Source/BPBIOS/def-ww-z41tbnk.lib similarity index 95% rename from Source/BPBIOS/def-ww-z41.lib rename to Source/BPBIOS/def-ww-z41tbnk.lib index f95a8ded..bb97b618 100644 --- a/Source/BPBIOS/def-ww-z41.lib +++ b/Source/BPBIOS/def-ww-z41tbnk.lib @@ -33,7 +33,10 @@ MHZ EQU 18 ; Set to Speed in MHZ (6/9/12/16/18/24) FASTWB EQU YES ; Yes if restoring CPR from banked RAM ; ..No if restoring from Drive A Z3 EQU YES ; Include ZCPR init code? -HAVIOP EQU no ; Include IOP code into Jump table? +HAVIOP EQU NO ; Include IOP code into Jump table? +INTPXY EQU NO ; Internal HBIOS Mini Proxy +CONF_T EQU YES ; Set for Segment Configuration T +CONF_N EQU NO ; Set for Segment Configuration N ;--- Memory configuration Section --- (Expansion Memory configured here) diff --git a/Source/BPBIOS/def-ww.lib b/Source/BPBIOS/def-ww.lib index f95a8ded..1e2b4570 100644 --- a/Source/BPBIOS/def-ww.lib +++ b/Source/BPBIOS/def-ww.lib @@ -33,7 +33,10 @@ MHZ EQU 18 ; Set to Speed in MHZ (6/9/12/16/18/24) FASTWB EQU YES ; Yes if restoring CPR from banked RAM ; ..No if restoring from Drive A Z3 EQU YES ; Include ZCPR init code? -HAVIOP EQU no ; Include IOP code into Jump table? +HAVIOP EQU NO ; Include IOP code into Jump table? +INTPXY EQU YES ; Internal HBIOS Mini Proxy +CONF_T EQU NO ; Set for Segment Configuration T +CONF_N EQU YES ; Set for Segment Configuration N ;--- Memory configuration Section --- (Expansion Memory configured here) diff --git a/Source/BPBIOS/hardhb.z80 b/Source/BPBIOS/hardhb.z80 index 56c257d8..bfac16cd 100644 --- a/Source/BPBIOS/hardhb.z80 +++ b/Source/BPBIOS/hardhb.z80 @@ -194,19 +194,32 @@ HDSK_RW: LD C,(HL) ; LOAD IT IN C FOR HBIOS CALL LATER PUSH BC ; SAVE FUNCTION AND DEVICE FOR LATER - LD DE,(HSTTRK) - LD HL,0 - LD B,4 ; PREPARE TO LEFT SHIT BY 4 BITS +; LD DE,(HSTTRK) +; LD HL,0 +; LD B,4 ; PREPARE TO LEFT SHIT BY 4 BITS +;HDSK_RW1: +; SLA E ; SHIFT DE LEFT BY 4 BITS +; RL D +; RL L +; RL H +; DJNZ HDSK_RW1 ; LOOP TILL ALL BITS DONE +; LD A,(HSTSEC) ; GET THE SECTOR INTO A +; AND 0FH ; GET RID OF TOP NIBBLE FOR SAFETY +; OR E ; COMBINE WITH E +; LD E,A ; BACK IN E + + LD HL,(HSTTRK) ; GET TRACK VALUE + LD A,L ; LSB OF TRACK TO A + AND 0FH ; ISOLATE HEAD IN LOW 4 BITS + LD D,A ; STUFF IT IN D + 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: - SLA E ; SHIFT DE LEFT BY 4 BITS - RL D - RL L - RL H - DJNZ HDSK_RW1 ; LOOP TILL ALL BITS DONE - LD A,(HSTSEC) ; GET THE SECTOR INTO A - AND 0FH ; GET RID OF TOP NIBBLE FOR SAFETY - OR E ; COMBINE WITH E - LD E,A ; BACK IN E + SRL H ; SHIFT ONE BIT OUT + RR L ; ... OF HL + DJNZ HDSK_RW1 ; DO ALL 4 BITS + EX DE,HL ; HL <-> DE FOR HBIOS CALL POP BC ; RECOVER FUNCTION AND DEVICE CALL HBX_INVOKE diff --git a/Source/BPBIOS/romwbw.lib b/Source/BPBIOS/romwbw.lib index 03fc7bb0..25fcaa28 100644 --- a/Source/BPBIOS/romwbw.lib +++ b/Source/BPBIOS/romwbw.lib @@ -9,7 +9,7 @@ ; HBIOS configuration. ; HBIOS EQU YES ; Use HBIOS functions -INTPXY EQU YES ; Internal HBIOS Proxy +;INTPXY EQU YES ; Internal HBIOS Proxy HBLOC EQU 0FE00H ; Location of HBIOS proxy (used if not INTPXY) ; ; Set exactly one of the following to YES to specify platform diff --git a/Source/BPBIOS/z3base.lib b/Source/BPBIOS/z3base.lib index 397ecd97..520777ce 100644 --- a/Source/BPBIOS/z3base.lib +++ b/Source/BPBIOS/z3base.lib @@ -14,9 +14,8 @@ ; alternative, just leave this file alone and configure everything with ; the utilities provided. -; FFE0 - FFFF 32 Bytes HBIOS Reserved -; FFB0 - FFDF 48 Bytes ZCPR3 External Stack -; FF00 - FFAF 176 Bytes Multiple Command Line Buffer +; FFD0 - FFFF 48 Bytes ZCPR3 External Stack +; FF00 - FFCF 208 Bytes Multiple Command Line Buffer ; FE00 - FEFF 256 Bytes Environment Descriptor ; Bytes 00H-7FH: Z3 Parameters ; Bytes 80H-FFH: Z3 TCAP @@ -50,16 +49,14 @@ NO EQU FALSE ; The External Stack is placed in the very top position in memory. It is ; mandatory for B/P Bios and ZCPR 3.3. -;EXTSTK EQU 0FFD0H ; ZCPR3 External Stack -EXTSTK EQU 0FFB0H ; ZCPR3 External Stack +EXTSTK EQU 0FFD0H ; ZCPR3 External Stack EXTSTKS EQU YES ; The Multiple Command Line Buffer is placed in the Top Page of Memory to ; place it above the Environment. It is mandatory for ZCPR 3.3. Z3CL EQU 0FF00H ; ZCPR3 Command Line Buffer -;Z3CLS EQU 208-5 ; Size of Command Line Buffer-5 -Z3CLS EQU 176-5 ; Size of Command Line Buffer-5 +Z3CLS EQU 208-5 ; Size of Command Line Buffer-5 ; The ZCPR3 External Environment Descriptor is mandatory B/P Bios & ZCPR 3.3. ; The Environment Descriptor MUST begin on an even Page Boundary (xx00H). diff --git a/Source/BPBIOS/z3basen.lib b/Source/BPBIOS/z3basen.lib new file mode 100644 index 00000000..397ecd97 --- /dev/null +++ b/Source/BPBIOS/z3basen.lib @@ -0,0 +1,128 @@ +; B/P Bios System Z3 Definition File. + +; This file is adapted from the basic Z3BASE.LIB configuration file used for +; most ZCPR33 systems. It has added the new definitions for the Resident +; User Space defined in B/P Bios descriptions. +;========================================================================= +;== NOTE: The Starting Address of the User Space marks the lower == +;== base of memory and MUST be entered. B/P Bios Utilities use == +;== this address to locate many portions of the operating system. == +;========================================================================= +; To change your systems definition, first sketch out the memory map in the +; comment table, then set the equates to reflect the memory map, doing any +; required calculations for element sizes and required spaces. As an +; alternative, just leave this file alone and configure everything with +; the utilities provided. + +; FFE0 - FFFF 32 Bytes HBIOS Reserved +; FFB0 - FFDF 48 Bytes ZCPR3 External Stack +; FF00 - FFAF 176 Bytes Multiple Command Line Buffer +; FE00 - FEFF 256 Bytes Environment Descriptor +; Bytes 00H-7FH: Z3 Parameters +; Bytes 80H-FFH: Z3 TCAP +; FDFF 1 Byte Wheel byte +; FDF4 - FDFE 11 Bytes Path (5 elements) +; FDD0 - FDF3 36 Bytes ZCPR3 External FCB +; FD80 - FDCF 80 Bytes ZCPR3 Message Buffers +; FD00 - FD7F 128 Bytes ZCPR3 Shell Stack +; FC00 - FCFF 256 Bytes Named Directory Buffer +; FA00 - FBFF 512 Bytes Flow Command Package +; F200 - F9FF 2.0 KBytes Resident Command Package +; EC00 - F1FF 1.5 KBytes IO Package +; E900 - EBFF .75 KBytes Resident User Space + +; The remainder is for the Operating System. Exact sizes vary depending +; primarily on the Number and sizes of Hard Drive Partitions, but may be: + +; D100 - EBFF 5.0 KBytes B/P BIOS (unbanked version) +; C300 - D0FF 3.5 KBytes ZSDOS 1.0 BDOS +; BB00 - C2FF 2 KBytes ZCPR 3.3 Command Processor +; 0100 - BAFF ~46 KBytes Transient Program Area +; 0000 - 00FF 256 Bytes Standard CP/M Buffers +;======================================================================== + +FALSE EQU 0 +TRUE EQU NOT FALSE + +YES EQU TRUE +NO EQU FALSE + +; The External Stack is placed in the very top position in memory. It is +; mandatory for B/P Bios and ZCPR 3.3. + +;EXTSTK EQU 0FFD0H ; ZCPR3 External Stack +EXTSTK EQU 0FFB0H ; ZCPR3 External Stack +EXTSTKS EQU YES + +; The Multiple Command Line Buffer is placed in the Top Page of Memory to +; place it above the Environment. It is mandatory for ZCPR 3.3. + +Z3CL EQU 0FF00H ; ZCPR3 Command Line Buffer +;Z3CLS EQU 208-5 ; Size of Command Line Buffer-5 +Z3CLS EQU 176-5 ; Size of Command Line Buffer-5 + +; The ZCPR3 External Environment Descriptor is mandatory B/P Bios & ZCPR 3.3. +; The Environment Descriptor MUST begin on an even Page Boundary (xx00H). + +Z3ENV EQU 0FE00H ; Environment Descriptors +Z3ENVS EQU 2 ; Size of Env Descriptor in 128-Byte Blks + +; The ZCPR3 Wheel Byte is mandatory for ZCPR 3.3. + +Z3WHL EQU 0FDFFH ; Wheel Byte Address +Z3WHLS EQU YES + +; The Path is mandatory for ZCPR 3.3. + +EXPATH EQU 0FDF4H ; External Path starting Address +EXPATHS EQU 5 ; (Path Size = EXPATHS*2 + 1 = 11 bytes) + ; This defines 5 2-byte Path Elements + +; The ZCPR3 External FCB is mandatory for ZCPR 3.3. + +EXTFCB EQU 0FDD0H ; 36-Byte ZCPR3 External FCB +EXTFCBS EQU YES + +; The ZCPR3 Message Buffers are mandatory for ZCPR 3.3. + +Z3MSG EQU 0FD80H ; 80-Byte ZCPR3 Message Buffer +Z3MSGS EQU YES + +; Shell Stack definition. Set SHSTKS to 0 to eliminate Shell Stack + +SHSTK EQU 0FD00H ; Shell Stack Starting Address +SHSTKS EQU 4 ; Number of SHSIZE-Byte Shell Stack entries +SHSIZE EQU 32 ; (Stack Size = SHSTKS * SHSIZE = 128 Bytes) + +; ZCPR3 Named Directory Buffer definition. Set Z3NDIRS to 0 to eliminate +; the named directory buffer. + +Z3NDIR EQU 0FC00H ; Start of Named Directory Buffer +Z3NDIRS EQU 14 ; Number of Named Directory Elements + ; (NDIR Size = Z3NDIRS * 18 + 1 = 253 Bytes) + +; Flow Command Package definition. Set FCPS to 0 to eliminate FCP + +FCP EQU 0FA00H ; Start of Flow Command Package +FCPS EQU 4 ; (FCP Size = 128 * FCPS = 512 Bytes) + +; Resident Command Processor Definition. Set RCPS to 0 to eliminate RCP + +RCP EQU 0F200H ; Start of Resident Command Processor +RCPS EQU 16 ; (RCP Size = 128 * RCPS = 2 kBytes) + +; IO Package definition. Set IOPS to 0 to eliminate IOP + +IOP EQU 0EC00H ; Start of IO Package +IOPS DEFL 12 ; (IOP Size = 128 * IOPS = 1.5 kBytes) + +;========================================================================= +; Resident User Space Definition. Set USPCS to 0 to eliminate USPC. +; The USPC Value marks the Lower Limit of Reserved Common High Memory and +; MUST BE PRESENT! + +USPC EQU 0E900H ; Start of Resident User Space (MANDATORY) +USPCS EQU 6 ; (USPC Size = 128 * USPCS = 0.75 kBytes) + +;--- End of Z3BASE.LIB --- + \ No newline at end of file diff --git a/Source/BPBIOS/z3baset.lib b/Source/BPBIOS/z3baset.lib new file mode 100644 index 00000000..9327887a --- /dev/null +++ b/Source/BPBIOS/z3baset.lib @@ -0,0 +1,126 @@ +; B/P Bios System Z3 Definition File. + +; This file is adapted from the basic Z3BASE.LIB configuration file used for +; most ZCPR33 systems. It has added the new definitions for the Resident +; User Space defined in B/P Bios descriptions. +;========================================================================= +;== NOTE: The Starting Address of the User Space marks the lower == +;== base of memory and MUST be entered. B/P Bios Utilities use == +;== this address to locate many portions of the operating system. == +;========================================================================= +; To change your systems definition, first sketch out the memory map in the +; comment table, then set the equates to reflect the memory map, doing any +; required calculations for element sizes and required spaces. As an +; alternative, just leave this file alone and configure everything with +; the utilities provided. + +; FE00 - FFFF 512 Bytes HBIOS Reserved +; FDFF 1 Byte Wheel byte +; FDF4 - FDFE 11 Bytes Path (5 elements) +; FDD0 - FDF3 36 Bytes ZCPR3 External FCB +; FD80 - FDCF 80 Bytes ZCPR3 Message Buffers +; FD00 - FD7F 128 Bytes ZCPR3 Shell Stack +; FC00 - FCFF 256 Bytes Named Directory Buffer +; FA00 - FBFF 512 Bytes Flow Command Package +; F200 - F9FF 2.0 KBytes Resident Command Package +; EC00 - F1FF 1.5 KBytes IO Package +; EBD0 - EBFF 48 Bytes ZCPR3 External Stack +; EB00 - EBAF 176 Bytes Multiple Command Line Buffer +; EA00 - EAFF 256 Bytes Environment Descriptor +; Bytes 00H-7FH: Z3 Parameters +; Bytes 80H-FFH: Z3 TCAP +; E700 - E9FF .75 KBytes Resident User Space + +; The remainder is for the Operating System. Exact sizes vary depending +; primarily on the Number and sizes of Hard Drive Partitions, but may be: + +; D300 - E6FF 5.0 KBytes B/P BIOS (unbanked version) +; C500 - D2FF 3.5 KBytes ZSDOS 1.0 BDOS +; BD00 - C4FF 2 KBytes ZCPR 3.3 Command Processor +; 0100 - BCFF ~47 KBytes Transient Program Area +; 0000 - 00FF 256 Bytes Standard CP/M Buffers +;======================================================================== + +FALSE EQU 0 +TRUE EQU NOT FALSE + +YES EQU TRUE +NO EQU FALSE + +; The External Stack is placed in the very top position in memory. It is +; mandatory for B/P Bios and ZCPR 3.3. + +EXTSTK EQU 0EBD0H ; ZCPR3 External Stack +EXTSTKS EQU YES + +; The Multiple Command Line Buffer is placed in the Top Page of Memory to +; place it above the Environment. It is mandatory for ZCPR 3.3. + +Z3CL EQU 0EB00H ; ZCPR3 Command Line Buffer +Z3CLS EQU 208-5 ; Size of Command Line Buffer-5 + +; The ZCPR3 External Environment Descriptor is mandatory B/P Bios & ZCPR 3.3. +; The Environment Descriptor MUST begin on an even Page Boundary (xx00H). + +Z3ENV EQU 0EA00H ; Environment Descriptors +Z3ENVS EQU 2 ; Size of Env Descriptor in 128-Byte Blks + +; The ZCPR3 Wheel Byte is mandatory for ZCPR 3.3. + +Z3WHL EQU 0FDFFH ; Wheel Byte Address +Z3WHLS EQU YES + +; The Path is mandatory for ZCPR 3.3. + +EXPATH EQU 0FDF4H ; External Path starting Address +EXPATHS EQU 5 ; (Path Size = EXPATHS*2 + 1 = 11 bytes) + ; This defines 5 2-byte Path Elements + +; The ZCPR3 External FCB is mandatory for ZCPR 3.3. + +EXTFCB EQU 0FDD0H ; 36-Byte ZCPR3 External FCB +EXTFCBS EQU YES + +; The ZCPR3 Message Buffers are mandatory for ZCPR 3.3. + +Z3MSG EQU 0FD80H ; 80-Byte ZCPR3 Message Buffer +Z3MSGS EQU YES + +; Shell Stack definition. Set SHSTKS to 0 to eliminate Shell Stack + +SHSTK EQU 0FD00H ; Shell Stack Starting Address +SHSTKS EQU 4 ; Number of SHSIZE-Byte Shell Stack entries +SHSIZE EQU 32 ; (Stack Size = SHSTKS * SHSIZE = 128 Bytes) + +; ZCPR3 Named Directory Buffer definition. Set Z3NDIRS to 0 to eliminate +; the named directory buffer. + +Z3NDIR EQU 0FC00H ; Start of Named Directory Buffer +Z3NDIRS EQU 14 ; Number of Named Directory Elements + ; (NDIR Size = Z3NDIRS * 18 + 1 = 253 Bytes) + +; Flow Command Package definition. Set FCPS to 0 to eliminate FCP + +FCP EQU 0FA00H ; Start of Flow Command Package +FCPS EQU 4 ; (FCP Size = 128 * FCPS = 512 Bytes) + +; Resident Command Processor Definition. Set RCPS to 0 to eliminate RCP + +RCP EQU 0F200H ; Start of Resident Command Processor +RCPS EQU 16 ; (RCP Size = 128 * RCPS = 2 kBytes) + +; IO Package definition. Set IOPS to 0 to eliminate IOP + +IOP EQU 0EC00H ; Start of IO Package +IOPS DEFL 12 ; (IOP Size = 128 * IOPS = 1.5 kBytes) + +;========================================================================= +; Resident User Space Definition. Set USPCS to 0 to eliminate USPC. +; The USPC Value marks the Lower Limit of Reserved Common High Memory and +; MUST BE PRESENT! + +USPC EQU 0E700H ; Start of Resident User Space (MANDATORY) +USPCS EQU 6 ; (USPC Size = 128 * USPCS = 0.75 kBytes) + +;--- End of Z3BASE.LIB --- + \ No newline at end of file diff --git a/Source/BPBIOS/zcpr33.rel b/Source/BPBIOS/zcpr33.rel index f9f24ee8f8ffe0eaef5fcde485cea0da6cfceeb6..7c0a2567317e7d184145252a650170ae13fe22df 100644 GIT binary patch literal 2560 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 literal 2304 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 F_#gh+m`MNt diff --git a/Source/BPBIOS/zcpr33.rel.sav b/Source/BPBIOS/zcpr33.rel.sav deleted file mode 100644 index 7c0a2567317e7d184145252a650170ae13fe22df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2560 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 diff --git a/Source/BPBIOS/zcpr33n.rel b/Source/BPBIOS/zcpr33n.rel new file mode 100644 index 0000000000000000000000000000000000000000..f9f24ee8f8ffe0eaef5fcde485cea0da6cfceeb6 GIT binary patch literal 2304 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 F_#gh+m`MNt literal 0 HcmV?d00001 diff --git a/Source/BPBIOS/zcpr33t.rel b/Source/BPBIOS/zcpr33t.rel new file mode 100644 index 0000000000000000000000000000000000000000..3a2fd0547116bd5f219d398efb48f208732b1835 GIT binary patch literal 2304 zcmXw)dsGu=8phw5Op*!YGC{N;AQPgPZIB{hq_ma^H`j_Qt_noi7Bu955{nmDw`!P# z2ozE;C|HY@h;*$&s}YoVO4kWDQHn(rq=;*vTk003GNO(XTQJRZ_fLj`DWhV z^E?M@j@AKsfGqo#Uvi?qYW=wN>Bd3sky4&2U)atm+St#X26t1UpfDE{W-p1yjfZ0Gz@>bC+qspIS~ z|Duo>NE+w-UIdqJum{!VsppNG_qlnBr0Zo{z|Ru#Ac%a_ba^k$3yF`@v_#`?`shZT zYARz-iQ#h3IIUEj{RTD_LW~z}qm&y`_}aoxFO9pk7EJXoqyJ8NpA0C{1s}a+~!ExlfxB|E!#& z8Zbqop$yuVvz|KLaAo&1{E6(rr6T=fv{-CLZPjZ~>9tKwBbRszPD^HZTBGWrv1QZ6 zb%Sku0ru_HQR#T(Stg$L%UAj2+BL0K+%pL#fD;*hyqB-w(5`A!O(W5N$s!csGa0n` zQo+#|9$6qdd#_Zk^mmsUF8^hOKY)baadhQ zKH3`Y2b0n|^NuwASKI)6emD_9MzbVWPH@~*kJQ{QS+;Ls=%j?3+4SHPKIS_&Vf9XR zV(6S*S15)aa8uZ9OKGJ!6)&XY0aiCfj2B)@(vE5THhf|DVD3)?bIhsl2gN;V+=<+& zKrlcS|KOri1uO>1-m;3mvvj^xy>}M(-YLW-D%(kI{BCGw?(g>uKZApXdX^y1I6RO577( zxTMS5m}ifHuzPEnSg)Tl+ zPK}(x9l4h^EoNzV-?^+qs#WgfR_%(+8^7uoV|)L>k&u<@X|dPqo0`&ceZi4yPn$YY z0U#Ffg1TG7}zgrj&g7U#jM)Hny`_0 zeAd`3Tf9}rOu_FmXBb(N*Za+RpM`Xdcl$-<#mI<{G2H->mcT+2PBTXT7amf}J}1>v zHziz6Ym9WLM~I*@0<@l1Eq)*6pMMcT?meuLHzYjYK`IYbUmUbscU{yCyOQ-948MDX zr_aZH1=unYJS+S+vfC7l;C9zHf2q1=@!n7rZQgrIU5Y7&((pjJgK?|EHD}sxL4AN%(W5qDsNqp(+8+jQtS*`gs?{QrgrT4;OpbrkyOUxO`WH2=LW9$sA+_RF(Gu4fLA=C8;6SkD_l>NZWzVl^WpXQCH%)&AQUwPhK&pf zW$No1y>9m0(iGm&r=FZFb!VD~TbrgvUt9V3pmj3+^bOV=cPMz`k0p2QmOT#*r#rVj zwX?z%E$QOClD8yt28}bDXhC4;e8KhEVnyvPN2hq5w|dC1xdPd;%;8QZ_k|})B05r> z@|f~&20FqL3XQkXsERgizoC4S*v7_9ud*CEoUF$v(BPVJBti9kNjbF7=IaDULQg3x z(BAEMUM?hAXP^YcgYHir@6bXf~s~VmUOw(a2z~wqQ;`x-a+E zq;8N&)~~_}%E7^M66v?SoC0J{;q>pC8Da1P*~2dN;BsX1Wj>qco>*;f5yH%2@%;qg Ef9W)l>;M1& literal 0 HcmV?d00001 diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index b0a756c5..27094258 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -6,7 +6,7 @@ ; TODO: ; - IMPLEMENT IDE_INITDEVICE ; - HANDLE SECONDARY INTERFACE ON DIDE -; - BREAK OUT IDE_SELECT FROM UNITSEL +; - IMPLEMENT INTELLIGENT RESET, CHECK IF DEVICE IS ACTUALLY BROKEN BEFORE RESET ; ; +-----------------------------------------------------------------------+ ; | CONTROL BLOCK REGISTERS | @@ -154,11 +154,11 @@ IDE_IO_DRVADR .EQU $IDE_IO_BASE + $0F ; DRIVE ADDRESS REGISTER (R) ; ; COMMAND BYTES ; -IDE_CIDE_RECAL .EQU $10 -IDE_CIDE_READ .EQU $20 -IDE_CIDE_WRITE .EQU $30 -IDE_CIDE_IDDEV .EQU $EC -IDE_CIDE_SETFEAT .EQU $EF +IDE_CMD_RECAL .EQU $10 +IDE_CMD_READ .EQU $20 +IDE_CMD_WRITE .EQU $30 +IDE_CMD_IDDEV .EQU $EC +IDE_CMD_SETFEAT .EQU $EF ; ; FEATURE BYTES ; @@ -195,6 +195,18 @@ IDE_STAT .EQU 0 ; LAST STATUS (1 BYTE) IDE_TYPE .EQU 1 ; DEVICE TYPE (1 BYTE) IDE_CAPACITY .EQU 2 ; DEVICE CAPACITY (1 DWORD/4 BYTES) ; +; THE IDE_WAITXXX FUNCTIONS ARE BUILT TO TIMEOUT AS NEEDED SO DRIVER WILL +; NOT HANG IF DEVICE IS UNRESPONSIVE. DIFFERENT TIMEOUTS ARE USED DEPENDING +; ON THE SITUATION. GENERALLY, THE FAST TIMEOUT IS USED TO PROBE FOR DEVICES +; USING FUNCTIONS THAT PERFORM NO I/O. OTHERWISE THE NORMAL TIMEOUT IS USED. +; IDE SPEC ALLOWS FOR UP TO 30 SECS MAX TO RESPOND. IN PRACTICE, THIS IS WAY +; TOO LONG, BUT IF YOU ARE USING A VERY OLD DEVICE, THESE TIMEOUTS MAY NEED TO +; BE ADJUSTED. NOTE THAT THESE ARE BYTE VALUES, SO YOU CANNOT EXCEED 255. +; THE TIMEOUTS ARE IN UNITS OF .05 SECONDS. +; +IDE_TONORM .EQU 200 ; NORMAL TIMEOUT IS 10 SECS +IDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS +; ; MACRO TO RETURN POINTER TO FIELD WITHIN UNIT DATA ; #DEFINE IDE_DPTR(FIELD) CALL IDE_DPTRIMP \ .DB FIELD @@ -205,6 +217,14 @@ IDE_CAPACITY .EQU 2 ; DEVICE CAPACITY (1 DWORD/4 BYTES) ; IDE_INIT: PRTS("IDE:$") ; LABEL FOR IO ADDRESS +; + ; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER + ; AT 1MHZ, THE SCALER IS 961 (50000US / 52TS = 961) + ; SCALER IS THEREFORE 961 * CPU SPEED IN MHZ + LD DE,961 ; LOAD SCALER FOR 1MHZ + LD A,(HCB + HCB_CPUMHZ) ; LOAD CPU SPEED IN MHZ + CALL MULT8X16 ; HL := DE * A + LD (IDE_TOSCALER),HL ; SAVE IT ; #IF (IDEMODE == IDEMODE_DIO) PRTS(" MODE=DIO$") @@ -242,10 +262,6 @@ IDE_INIT1: RET ; DONE ; IDE_INIT2: -; ; DISPLAY DEVICE INFO -; CALL IDE_SELUNIT ; SELECT UNIT -; RET NZ ; ABORT ON ERROR -; LD (IDE_UNIT),A ; SET CURRENT UNIT ; ; CHECK FOR BAD STATUS @@ -298,7 +314,6 @@ IDE_DISPATCH: CP IDE_UNITCNT CALL NC,PANIC ; PANIC IF TOO HIGH LD (IDE_UNIT),A ; SAVE IT - ;CALL IDE_SELUNIT ; SELECT DESIRED UNIT ; ; DISPATCH ACCORDING TO DISK SUB-FUNCTION LD A,B ; GET REQUESTED FUNCTION @@ -371,12 +386,7 @@ IDE_SENSE: ; THE ENTIRE INTERFACE. SO, TO HANDLE POSSIBLE HOT ; SWAP WE DO THAT, THEN RESELECT THE DESIRED UNIT AND ; CONTINUE. - LD A,(IDE_UNIT) ; GET UNIT SELECTION - PUSH AF ; SAVE UNIT SELECTION CALL IDE_RESET ; RESET ALL DEVICES ON BUS - POP AF ; RECOVER UNIT SELECTION - LD (IDE_UNIT),A ; RESTORE UNIT SELECTION - ;CALL IDE_SELUNIT ; RESELECT DESIRED UNIT ; IDE_DPTR(IDE_STAT) ; POINT TO UNIT STATUS LD A,(HL) ; GET STATUS @@ -440,7 +450,7 @@ IDE_SETFEAT: OUT (IDE_IO_FEAT),A ; SET THE FEATURE VALUE DCALL PC_SPACE DCALL PRTHEXBYTE - LD A,IDE_CIDE_SETFEAT ; CMD = SETFEAT + LD A,IDE_CMD_SETFEAT ; CMD = SETFEAT LD (IDE_CMD),A ; SAVE IT JP IDE_RUNCMD ; RUN COMMAND AND EXIT ; @@ -455,7 +465,7 @@ IDE_IDENTIFY: OUT (IDE_IO_DRVHD),A DCALL PC_SPACE DCALL PRTHEXBYTE - LD A,IDE_CIDE_IDDEV + LD A,IDE_CMD_IDDEV LD (IDE_CMD),A CALL IDE_RUNCMD RET NZ @@ -477,7 +487,7 @@ IDE_RDSEC: DCALL PC_SPACE DCALL PRTHEXBYTE CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD - LD A,IDE_CIDE_READ + LD A,IDE_CMD_READ LD (IDE_CMD),A CALL IDE_RUNCMD RET NZ @@ -499,7 +509,7 @@ IDE_WRSEC: DCALL PC_SPACE DCALL PRTHEXBYTE CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD - LD A,IDE_CIDE_WRITE + LD A,IDE_CMD_WRITE LD (IDE_CMD),A CALL IDE_RUNCMD RET NZ @@ -510,7 +520,7 @@ IDE_WRSEC: ; IDE_SETADDR: ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER - ; IDE_IO_LBA3 HAS ALREADY BEEN SET BY IDE_SELECT + ; IDE_IO_LBA3 HAS ALREADY BEEN SET ; HSTLBA2-0 --> IDE_IO_LBA2-0 LD C,IDE_IO_LBA0 + 3 ; STARTING IO PORT (NOT PRE-DEC BELOW) LD HL,HSTLBA + 2 ; STARTING LBA BYTE ADR @@ -662,25 +672,34 @@ IDE_GETRES: IDE_RESET: ; #IF (PLATFORM == PLT_MK4) + ; USE HARDWARE RESET LINE LD A,$80 ; HIGH BIT OF XAR IS IDE RESET OUT (MK4_XAR),A - LD DE,16 ; DELAY ~250US + LD DE,2 ; DELAY 32US (SPEC IS >= 25US) CALL VDELAY XOR A ; CLEAR RESET BIT OUT (MK4_XAR),A #ELSE + ; INITIATE SOFT RESET LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES OUT (IDE_IO_CTRL),A #ENDIF ; - LD DE,16 ; DELAY ~250US + LD DE,2 ; DELAY 32US (SPEC IS >= 25US) CALL VDELAY ; + ; CONFIGURE OPERATION AND END SOFT RESET LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET - OUT (IDE_IO_CTRL),A + OUT (IDE_IO_CTRL),A ; PUSH TO REGISTER +; +; SPEC ALLOWS UP TO 450MS FOR DEVICES TO ASSERT THEIR PRESENCE +; VIA -DASP. I ENCOUNTER PROBLEMS LATER ON IF I DON'T WAIT HERE +; FOR THAT TO OCCUR. THUS FAR, IT APPEARS THAT 150MS IS SUFFICIENT +; FOR ANY DEVICE ENCOUNTERED. MAY NEED TO EXTEND BACK TO 500MS +; IF A SLOWER DEVICE IS ENCOUNTERED. ; - ;CALL LDELAY - LD DE,$2000 ; DELAY N * 16US (~128MS) + ;LD DE,500000/16 ; ~500MS + LD DE,150000/16 ; ~???MS CALL VDELAY ; ; CLEAR OUT ALL DATA (FOR ALL UNITS) @@ -704,7 +723,7 @@ IDE_RESET1: DJNZ IDE_RESET1 ; LOOP AS NEEDED ; POP AF ; RECOVER ORIGINAL UNIT NUMBER - CALL IDE_SELUNIT ; ... AND SELECT IT + LD (IDE_UNIT),A ; AND SAVE IT ; XOR A ; SIGNAL SUCCESS RET ; AND DONE @@ -713,54 +732,48 @@ IDE_RESET1: ; IDE_INITUNIT: LD (IDE_UNIT),A ; SET ACTIVE UNIT - + CALL IDE_SELUNIT ; SELECT UNIT RET NZ ; ABORT IF ERROR + + LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT + LD (HL),IDE_TOFAST ; USE FAST TIMEOUT DURING INIT CALL IDE_PROBE ; DO PROBE RET NZ ; ABORT IF ERROR - OR $FF - OUT (IDE_IO_COUNT),A ; ZERO KEY REGISTERS IN TESTED DEVICE - OUT (IDE_IO_SECT),A ; ZERO KEY REGISTERS IN TESTED DEVICE - - ;RET - - JP IDE_INITDEV ; INIT DEVICE AND RETURN + CALL IDE_INITDEV ; ATTEMPT TO INIT DEVICE + + LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT + LD (HL),IDE_TONORM ; BACK TO NORMAL TIMEOUT + + RET ; ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT -; UNIT IS SPECIFIED IN A +; UNIT IS SPECIFIED IN IDE_UNIT +; REGISTER A IS DESTROYED ; IDE_SELUNIT: -; LD HL,IDE_UNIT ; POINT TO PREVIOUSLY SELECTED UNIT -; CP (HL) ; SAME? -; RET Z ; IF SO, NOTHING MORE TO DO - + LD A,(IDE_UNIT) ; GET UNIT CP IDE_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?) JP NC,IDE_INVUNIT ; HANDLE INVALID UNIT ; -; ; NEW UNIT SELECTED, IMPLEMENT IT -; LD (IDE_UNIT),A ; RECORD NEW UNIT NUMBER -; -; #IF (IDEMODE == IDEMODE_DIDE) ; SELECT PRIMARY/SECONDARY INTERFACE FOR DIDE HARDWARE #ENDIF ; + ; DETERMINE AND SAVE DRIVE/HEAD VALUE FOR SELECTED UNIT PUSH HL ; SAVE HL + LD A,(IDE_UNIT) ; GET CURRENT UNIT AND $01 ; LS BIT DETERMINES MASTER/SLAVE LD HL,IDE_DRVSEL CALL ADDHLA LD A,(HL) ; LOAD DRIVE/HEAD VALUE POP HL ; RECOVER HL + LD (IDE_DRVHD),A ; SAVE IT ; - OUT (IDE_IO_DRVHD),A ; SELECT DRIVE - LD (IDE_DRVHD),A ; UPDATE SHADOW REGISTER -; - ; SPEC REQUIRES 400NS DELAY BEFORE CHECKING STATUS REGISTER -; - XOR A - RET + XOR A ; SIGNAL SUCCESS + RET ; AND DONE ; ; ; @@ -769,6 +782,23 @@ IDE_PROBE: CALL IDE_PRTPREFIX PRTS(" PROBE$") ; LABEL FOR IO ADDRESS #ENDIF +; + LD A,(IDE_DRVHD) + OUT (IDE_IO_DRVHD),A + DCALL PC_SPACE + DCALL PRTHEXBYTE + + CALL DELAY ; DELAY ~16US +; + DCALL IDE_REGDUMP +; + ;JR IDE_PROBE1 ; *DEBUG* +; +IDE_PROBE0: + CALL IDE_WAITBSY ; WAIT FOR BUSY TO CLEAR + RET NZ ; ABORT ON TIMEOUT +; + DCALL IDE_REGDUMP ; ; CHECK STATUS IN A,(IDE_IO_STAT) ; GET STATUS @@ -777,19 +807,6 @@ IDE_PROBE: OR A ; SET FLAGS TO TEST FOR ZERO JP Z,IDE_NOMEDIA ; -IDE_PROBE0: - ;CALL IDE_WAITBSY ; WAIT FOR BUSY TO CLEAR - ;RET NZ ; ABORT ON TIMEOUT -; - ;; CHECK STATUS - ;IN A,(IDE_IO_STAT) ; GET STATUS - ;DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS - ;OR A ; SET FLAGS TO TEST FOR ZERO - ;JR NZ,IDE_PROBE1 ; CONTINUE IF NON-ZERO - ;DEC A ; ZERO MEANS NO MEDIA, SIGNAL ERROR - ;RET ; AND DONE -; -IDE_PROBE1: ; CHECK SIGNATURE DCALL PC_SPACE IN A,(IDE_IO_COUNT) @@ -812,6 +829,7 @@ IDE_PROBE1: CP $00 JP NZ,IDE_NOMEDIA ; +IDE_PROBE1: ; SIGNATURE MATCHES ATA DEVICE, RECORD TYPE AND RETURN SUCCESS IDE_DPTR(IDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED LD (HL),IDE_TYPEATA ; SET THE DEVICE TYPE @@ -845,6 +863,7 @@ IDE_INITDEV: #ELSE LD A,IDE_FEAT_DISABLE8BIT ; FEATURE VALUE = DISABLE 8-BIT PIO #ENDIF + CALL IDE_SETFEAT ; SET FEATURE RET NZ ; BAIL OUT ON ERROR ; @@ -886,16 +905,16 @@ IDE_CHKDEVICE: ; ; IDE_WAITRDY: - LD B,15 ; ~15 SECOND TIMEOUT? + LD A,(IDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS + LD B,A ; PUT IN OUTER LOOP VAR IDE_WAITRDY1: - LD DE,-1 ; ~1 SECOND INNER LOOP + LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR IDE_WAITRDY2: IN A,(IDE_IO_STAT) ; READ STATUS LD C,A ; SAVE IT AND %11000000 ; ISOLATE BUSY AND RDY BITS XOR %01000000 ; WE WANT BUSY(7) TO BE 0 AND RDY(6) TO BE 1 RET Z ; ALL SET, RETURN WITH Z SET - CALL DELAY ; DELAY 16US DEC DE LD A,D OR E @@ -906,17 +925,17 @@ IDE_WAITRDY2: ; ; IDE_WAITDRQ: - LD B,3 ; ~3 SECOND TIMEOUT??? + LD A,(IDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS + LD B,A ; PUT IN OUTER LOOP VAR IDE_WAITDRQ1: - LD DE,-1 ; ~1 SECOND INNER LOOP + LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR IDE_WAITDRQ2: IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER LD C,A ; SAVE IT AND %10001000 ; TO FILL (OR READY TO FILL) XOR %00001000 RET Z - CALL DELAY ; DELAY 16US - DEC DE + DEC DE LD A,D OR E JR NZ,IDE_WAITDRQ2 @@ -926,21 +945,21 @@ IDE_WAITDRQ2: ; ; IDE_WAITBSY: - LD B,3 ; ~3 SECOND TIMEOUT??? + LD A,(IDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS + LD B,A ; PUT IN OUTER LOOP VAR IDE_WAITBSY1: - LD DE,-1 ; ~1 SECOND INNER LOOP + LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR IDE_WAITBSY2: - IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER - LD C,A ; SAVE IT - AND %10000000 ; TO FILL (OR READY TO FILL) - RET Z - CALL DELAY ; DELAY 16US - DEC DE - LD A,D - OR E - JR NZ,IDE_WAITBSY2 - DJNZ IDE_WAITBSY1 - JP IDE_BSYTO ; EXIT WITH BSYTO ERR + IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER ; 11TS + LD C,A ; SAVE IT ; 4TS + AND %10000000 ; TO FILL (OR READY TO FILL) ; 7TS + RET Z ; 5TS + DEC DE ; 6TS + LD A,D ; 4TS + OR E ; 4TS + JR NZ,IDE_WAITBSY2 ; 12TS + DJNZ IDE_WAITBSY1 ; ----- + JP IDE_BSYTO ; EXIT WITH BSYTO ERR ; 52TS ; ;============================================================================= ; ERROR HANDLING AND DIAGNOSTICS @@ -1042,7 +1061,8 @@ IDE_PRTSTAT3: POP AF RET ; -; +; PRINT ALL REGISTERS DIRECTLY FROM DEVICE +; DEVICE MUST BE SELECTED PRIOR TO CALL ; IDE_REGDUMP: PUSH AF @@ -1116,6 +1136,9 @@ IDE_STR_NO .TEXT "NO$" ; DATA STORAGE ;============================================================================= ; +IDE_TIMEOUT .DB IDE_TONORM ; WAIT FUNCS TIMEOUT IN TENTHS OF SEC +IDE_TOSCALER .DW CPUMHZ * 961 ; WAIT FUNCS SCALER FOR CPU SPEED +; IDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS IDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK ; diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index fbe774e5..7b9bc73a 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -5,7 +5,8 @@ ; ; TODO: ; - IMPLEMENT PPIDE_INITDEVICE -; - BREAK OUT PPIDE_SELECT FROM UNITSEL +; - IMPLEMENT INTELLIGENT RESET, CHECK IF DEVICE IS ACTUALLY BROKEN BEFORE RESET +; - FIX SCALER CONSTANT ; ; PPIDE_IO_DATALO .EQU PPIDEIOB + 0 ; IDE DATA BUS LSB (8255 PORT A) @@ -156,11 +157,11 @@ PPIDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE ; ; COMMAND BYTES ; -PPIDE_CPPIDE_RECAL .EQU $10 -PPIDE_CPPIDE_READ .EQU $20 -PPIDE_CPPIDE_WRITE .EQU $30 -PPIDE_CPPIDE_IDDEV .EQU $EC -PPIDE_CPPIDE_SETFEAT .EQU $EF +PPIDE_CMD_RECAL .EQU $10 +PPIDE_CMD_READ .EQU $20 +PPIDE_CMD_WRITE .EQU $30 +PPIDE_CMD_IDDEV .EQU $EC +PPIDE_CMD_SETFEAT .EQU $EF ; ; FEATURE BYTES ; @@ -197,6 +198,18 @@ PPIDE_STAT .EQU 0 ; LAST STATUS (1 BYTE) PPIDE_TYPE .EQU 1 ; DEVICE TYPE (1 BYTE) PPIDE_CAPACITY .EQU 2 ; DEVICE CAPACITY (1 DWORD/4 BYTES) ; +; THE IDE_WAITXXX FUNCTIONS ARE BUILT TO TIMEOUT AS NEEDED SO DRIVER WILL +; NOT HANG IF DEVICE IS UNRESPONSIVE. DIFFERENT TIMEOUTS ARE USED DEPENDING +; ON THE SITUATION. GENERALLY, THE FAST TIMEOUT IS USED TO PROBE FOR DEVICES +; USING FUNCTIONS THAT PERFORM NO I/O. OTHERWISE THE NORMAL TIMEOUT IS USED. +; IDE SPEC ALLOWS FOR UP TO 30 SECS MAX TO RESPOND. IN PRACTICE, THIS IS WAY +; TOO LONG, BUT IF YOU ARE USING A VERY OLD DEVICE, THESE TIMEOUTS MAY NEED TO +; BE ADJUSTED. NOTE THAT THESE ARE BYTE VALUES, SO YOU CANNOT EXCEED 255. +; THE TIMEOUTS ARE IN UNITS OF .05 SECONDS. +; +PPIDE_TONORM .EQU 200 ; NORMAL TIMEOUT IS 10 SECS +PPIDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS +; ; MACRO TO RETURN POINTER TO FIELD WITHIN UNIT DATA ; #DEFINE PPIDE_DPTR(FIELD) CALL PPIDE_DPTRIMP \ .DB FIELD @@ -207,6 +220,15 @@ PPIDE_CAPACITY .EQU 2 ; DEVICE CAPACITY (1 DWORD/4 BYTES) ; PPIDE_INIT: PRTS("PPIDE: IO=0x$") ; LABEL FOR IO ADDRESS +; + ; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER + ; AT 1MHZ, THE SCALER IS 961 (50000US / 52TS = 961) + ; SCALER IS THEREFORE 961 * CPU SPEED IN MHZ + LD DE,961 ; LOAD SCALER FOR 1MHZ + LD A,(HCB + HCB_CPUMHZ) ; LOAD CPU SPEED IN MHZ + CALL MULT8X16 ; HL := DE * A + LD (PPIDE_TOSCALER),HL ; SAVE IT +; LD A,PPIDEIOB CALL PRTHEXBYTE #IF (PPIDE8BIT) @@ -233,10 +255,6 @@ PPIDE_INIT1: RET ; DONE ; PPIDE_INIT2: -; ; DISPLAY DEVICE INFO -; CALL PPIDE_SELUNIT ; SELECT UNIT -; RET NZ ; ABORT ON ERROR -; LD (PPIDE_UNIT),A ; SET CURRENT UNIT ; ; CHECK FOR BAD STATUS @@ -289,7 +307,6 @@ PPIDE_DISPATCH: CP PPIDE_UNITCNT CALL NC,PANIC ; PANIC IF TOO HIGH LD (PPIDE_UNIT),A ; SAVE IT - ;CALL PPIDE_SELUNIT ; SELECT DESIRED UNIT ; ; DISPATCH ACCORDING TO DISK SUB-FUNCTION LD A,B ; GET REQUESTED FUNCTION @@ -332,6 +349,7 @@ PPIDE_READ: LD HL,PPIDE_PRTERR ; SET UP PPIDE_PRTERR PUSH HL ; ... TO FILTER ALL EXITS #ENDIF + CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT JP PPIDE_RDSEC ; ; @@ -342,6 +360,7 @@ PPIDE_WRITE: LD HL,PPIDE_PRTERR ; SET UP PPIDE_PRTERR PUSH HL ; ... TO FILTER ALL EXITS #ENDIF + CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT JP PPIDE_WRSEC ; ; @@ -360,12 +379,7 @@ PPIDE_SENSE: ; THE ENTIRE INTERFACE. SO, TO HANDLE POSSIBLE HOT ; SWAP WE DO THAT, THEN RESELECT THE DESIRED UNIT AND ; CONTINUE. - LD A,(PPIDE_UNIT) ; GET UNIT SELECTION - PUSH AF ; SAVE UNIT SELECTION CALL PPIDE_RESET ; RESET ALL DEVICES ON BUS - POP AF ; RECOVER UNIT SELECTION - LD (PPIDE_UNIT),A ; RESTORE UNIT SELECTION - ;CALL PPIDE_SELUNIT ; RESELECT DESIRED UNIT ; PPIDE_DPTR(PPIDE_STAT) ; POINT TO UNIT STATUS LD A,(HL) ; GET STATUS @@ -435,7 +449,7 @@ PPIDE_SETFEAT: .DB PPIDE_REG_FEAT DCALL PC_SPACE DCALL PRTHEXBYTE - LD A,PPIDE_CPPIDE_SETFEAT ; CMD = SETFEAT + LD A,PPIDE_CMD_SETFEAT ; CMD = SETFEAT LD (PPIDE_CMD),A ; SAVE IT JP PPIDE_RUNCMD ; RUN COMMAND AND EXIT ; @@ -452,7 +466,7 @@ PPIDE_IDENTIFY: .DB PPIDE_REG_DRVHD DCALL PC_SPACE DCALL PRTHEXBYTE - LD A,PPIDE_CPPIDE_IDDEV + LD A,PPIDE_CMD_IDDEV LD (PPIDE_CMD),A CALL PPIDE_RUNCMD RET NZ @@ -476,7 +490,7 @@ PPIDE_RDSEC: DCALL PC_SPACE DCALL PRTHEXBYTE CALL PPIDE_SETADDR ; SETUP CYL, TRK, HEAD - LD A,PPIDE_CPPIDE_READ + LD A,PPIDE_CMD_READ LD (PPIDE_CMD),A CALL PPIDE_RUNCMD RET NZ @@ -498,7 +512,7 @@ PPIDE_WRSEC: DCALL PC_SPACE DCALL PRTHEXBYTE CALL PPIDE_SETADDR ; SETUP CYL, TRK, HEAD - LD A,PPIDE_CPPIDE_WRITE + LD A,PPIDE_CMD_WRITE LD (PPIDE_CMD),A CALL PPIDE_RUNCMD RET NZ @@ -508,6 +522,10 @@ PPIDE_WRSEC: ; ; PPIDE_SETADDR: + ; XXX + ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER + ; IDE_IO_LBA3 HAS ALREADY BEEN SET + ; HSTLBA2-0 --> IDE_IO_LBA2-0 LD A,(HSTLBA + 2) DCALL PC_SPACE DCALL PRTHEXBYTE @@ -714,13 +732,11 @@ PPIDE_RESET: ; LD A,PPIDE_CTL_RESET OUT (PPIDE_IO_CTL),A - LD DE,16 - ;LD DE,1024 + LD DE,2 CALL VDELAY XOR A OUT (PPIDE_IO_CTL),A - LD DE,16 - ;LD DE,1024 + LD DE,2 CALL VDELAY ; LD A,%00001010 ; SET ~IEN, NO INTERRUPTS @@ -728,8 +744,14 @@ PPIDE_RESET: CALL PPIDE_OUT .DB PPIDE_REG_CTRL ; - ;CALL LDELAY - LD DE,$2000 ; DELAY N * 16US (~128MS) +; SPEC ALLOWS UP TO 450MS FOR DEVICES TO ASSERT THEIR PRESENCE +; VIA -DASP. I ENCOUNTER PROBLEMS LATER ON IF I DON'T WAIT HERE +; FOR THAT TO OCCUR. THUS FAR, IT APPEARS THAT 150MS IS SUFFICIENT +; FOR ANY DEVICE ENCOUNTERED. MAY NEED TO EXTEND BACK TO 500MS +; IF A SLOWER DEVICE IS ENCOUNTERED. +; + ;LD DE,500000/16 ; ~500MS + LD DE,150000/16 ; ~???MS CALL VDELAY ; ; CLEAR OUT ALL DATA (FOR ALL UNITS) @@ -753,7 +775,7 @@ PPIDE_RESET1: DJNZ PPIDE_RESET1 ; LOOP AS NEEDED ; POP AF ; RECOVER ORIGINAL UNIT NUMBER - CALL PPIDE_SELUNIT ; ... AND RESELECT IT + LD (PPIDE_UNIT),A ; AND SAVE IT ; XOR A ; SIGNAL SUCCESS RET ; AND DONE @@ -766,48 +788,36 @@ PPIDE_INITUNIT: CALL PPIDE_SELUNIT ; SELECT UNIT RET NZ ; ABORT IF ERROR + LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT + LD (HL),PPIDE_TOFAST ; USE FAST TIMEOUT DURING INIT + CALL PPIDE_PROBE ; DO PROBE RET NZ ; ABORT IF ERROR - OR $FF - CALL PPIDE_OUT - .DB PPIDE_REG_COUNT - CALL PPIDE_OUT - .DB PPIDE_REG_SECT - - ;RET - - JP PPIDE_INITDEV ; INIT DEVICE AND RETURN + CALL PPIDE_INITDEV ; INIT DEVICE AND RETURN +; + LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT + LD (HL),PPIDE_TONORM ; BACK TO NORMAL TIMEOUT +; + RET ; ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT ; UNIT IS SPECIFIED IN A ; PPIDE_SELUNIT: - ;LD HL,PPIDE_UNIT ; POINT TO PREVIOUSLY SELECTED UNIT - ;CP (HL) ; SAME? - ;RET Z ; IF SO, NOTHING MORE TO DO - + LD A,(PPIDE_UNIT) ; GET UNIT CP PPIDE_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?) JP NC,PPIDE_INVUNIT ; HANDLE INVALID UNIT -; - ; NEW UNIT SELECTED, IMPLEMENT IT - ;LD (PPIDE_UNIT),A ; RECORD NEW UNIT NUMBER ; PUSH HL ; SAVE HL, IT IS DESTROYED BELOW -; + LD A,(PPIDE_UNIT) ; GET CURRENT UNIT AND $01 ; LS BIT DETERMINES MASTER/SLAVE LD HL,PPIDE_DRVSEL CALL ADDHLA LD A,(HL) ; LOAD DRIVE/HEAD VALUE -; - ;OUT (PPIDE_REG_DRVHD),A ; SELECT DRIVE - CALL PPIDE_OUT - .DB PPIDE_REG_DRVHD - LD (PPIDE_DRVHD),A ; UPDATE SHADOW REGISTER -; - ; SPEC REQUIRES 400NS DELAY BEFORE CHECKING STATUS REGISTER -; POP HL ; RECOVER HL + LD (PPIDE_DRVHD),A ; SAVE IT +; XOR A RET ; @@ -818,6 +828,25 @@ PPIDE_PROBE: CALL PPIDE_PRTPREFIX PRTS(" PROBE$") ; LABEL FOR IO ADDRESS #ENDIF +; + LD A,(PPIDE_DRVHD) + ;OUT (IDE_IO_DRVHD),A + CALL PPIDE_OUT + .DB PPIDE_REG_DRVHD + DCALL PC_SPACE + DCALL PRTHEXBYTE + + CALL DELAY ; DELAY ~16US +; + DCALL PPIDE_REGDUMP +; + ;JR PPIDE_PROBE1 ; *DEBUG* +; +PPIDE_PROBE0: + CALL PPIDE_WAITBSY ; WAIT FOR BUSY TO CLEAR + RET NZ ; ABORT ON TIMEOUT +; + DCALL PPIDE_REGDUMP ; ; CHECK STATUS ; IN A,(PPIDE_REG_STAT) ; GET STATUS @@ -828,19 +857,6 @@ PPIDE_PROBE: OR A ; SET FLAGS TO TEST FOR ZERO JP Z,PPIDE_NOMEDIA ; CONTINUE IF NON-ZERO ; -PPIDE_PROBE0: - ;CALL PPIDE_WAITBSY ; WAIT FOR BUSY TO CLEAR - ;RET NZ ; ABORT ON TIMEOUT -; - ;; CHECK STATUS - ;IN A,(PPIDE_REG_STAT) ; GET STATUS - ;DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS - ;OR A ; SET FLAGS TO TEST FOR ZERO - ;JR NZ,PPIDE_PROBE1 ; CONTINUE IF NON-ZERO - ;DEC A ; ZERO MEANS NO MEDIA, SIGNAL ERROR - ;RET ; AND DONE -; -PPIDE_PROBE1: ; CHECK SIGNATURE DCALL PC_SPACE ;IN A,(PPIDE_REG_COUNT) @@ -871,6 +887,7 @@ PPIDE_PROBE1: CP $00 JP NZ,PPIDE_NOMEDIA ; +PPIDE_PROBE1: ; SIGNATURE MATCHES ATA DEVICE, RECORD TYPE AND RETURN SUCCESS PPIDE_DPTR(PPIDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED LD (HL),PPIDE_TYPEATA ; SET THE DEVICE TYPE @@ -945,9 +962,10 @@ PPIDE_CHKDEVICE: ; ; PPIDE_WAITRDY: - LD B,15 ; ~15 SECOND TIMEOUT? + LD A,(PPIDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS + LD B,A ; PUT IN OUTER LOOP VAR PPIDE_WAITRDY1: - LD DE,-1 ; ~1 SECOND INNER LOOP + LD DE,(PPIDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR PPIDE_WAITRDY2: ;IN A,(PPIDE_REG_STAT) ; READ STATUS CALL PPIDE_IN @@ -956,7 +974,6 @@ PPIDE_WAITRDY2: AND %11000000 ; ISOLATE BUSY AND RDY BITS XOR %01000000 ; WE WANT BUSY(7) TO BE 0 AND RDY(6) TO BE 1 RET Z ; ALL SET, RETURN WITH Z SET - CALL DELAY ; DELAY 16US DEC DE LD A,D OR E @@ -967,9 +984,10 @@ PPIDE_WAITRDY2: ; ; PPIDE_WAITDRQ: - LD B,3 ; ~3 SECOND TIMEOUT??? + LD A,(PPIDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS + LD B,A ; PUT IN OUTER LOOP VAR PPIDE_WAITDRQ1: - LD DE,-1 ; ~1 SECOND INNER LOOP + LD DE,(PPIDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR PPIDE_WAITDRQ2: ;IN A,(PPIDE_REG_STAT) ; READ STATUS CALL PPIDE_IN @@ -978,7 +996,6 @@ PPIDE_WAITDRQ2: AND %10001000 ; TO FILL (OR READY TO FILL) XOR %00001000 RET Z - CALL DELAY ; DELAY 16US DEC DE LD A,D OR E @@ -989,9 +1006,10 @@ PPIDE_WAITDRQ2: ; ; PPIDE_WAITBSY: - LD B,3 ; ~3 SECOND TIMEOUT??? + LD A,(PPIDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS + LD B,A ; PUT IN OUTER LOOP VAR PPIDE_WAITBSY1: - LD DE,-1 ; ~1 SECOND INNER LOOP + LD DE,(PPIDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR PPIDE_WAITBSY2: ;IN A,(PPIDE_REG_STAT) ; READ STATUS CALL PPIDE_IN @@ -999,7 +1017,6 @@ PPIDE_WAITBSY2: LD C,A ; SAVE IT AND %10000000 ; TO FILL (OR READY TO FILL) RET Z - CALL DELAY ; DELAY 16US DEC DE LD A,D OR E @@ -1072,7 +1089,6 @@ PPIDE_IOERR: JR PPIDE_ERR ; PPIDE_RDYTO: - CALL PC_COLON LD A,PPIDE_STRDYTO JR PPIDE_ERR ; @@ -1150,7 +1166,8 @@ PPIDE_PRTSTAT3: POP AF RET ; -; +; PRINT ALL REGISTERS DIRECTLY FROM DEVICE +; DEVICE MUST BE SELECTED PRIOR TO CALL ; PPIDE_REGDUMP: PUSH AF @@ -1232,6 +1249,9 @@ PPIDE_STR_NO .TEXT "NO$" ; DATA STORAGE ;============================================================================= ; +PPIDE_TIMEOUT .DB PPIDE_TONORM ; WAIT FUNCS TIMEOUT IN TENTHS OF SEC +PPIDE_TOSCALER .DW CPUMHZ * 961 ; WAIT FUNCS SCALER FOR CPU SPEED +; PPIDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS PPIDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK ; diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index 10e8d4a0..de6041f8 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -1358,11 +1358,11 @@ SD_GET1: OUT (SD_OPRREG),A ; DO IT DJNZ SD_GET1 ; REPEAT FOR ALL 8 BITS LD A,C ; GET BYTE RECEIVED INTO A -#IF (SDMODE == SDMODE_UART) + #IF (SDMODE == SDMODE_UART) XOR $FF ; DO IS INVERTED ON UART + #ENDIF #ENDIF RET -#ENDIF ; ;============================================================================= ; ERROR HANDLING AND DIAGNOSTICS diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index 14c53cea..522d1c54 100644 --- a/Source/HBIOS/util.asm +++ b/Source/HBIOS/util.asm @@ -213,10 +213,10 @@ HEXASCII: HEXCONV: AND 0FH ;LOW NIBBLE ONLY ADD A,90H - DAA + DAA ADC A,40H - DAA - RET + DAA + RET ; ; PRINT A BYTE BUFFER IN HEX POINTED TO BY DE ; REGISTER A HAS SIZE OF BUFFER @@ -244,7 +244,7 @@ DUMP_BUFFER: POP HL INC D INC D - + DB_BLKRD: PUSH BC PUSH HL @@ -258,7 +258,7 @@ DB_NXTONE: LD A,(HL) ; GET BYTE CALL PRTHEXBYTE ; PRINT IT CALL PC_SPACE ; -DB_UPDH: +DB_UPDH: INC HL ; POINT NEXT DEC C ; DEC. LOC COUNT JR NZ,DB_NXTONE ; IF LINE NOT DONE @@ -273,10 +273,10 @@ DB_PCRLF0: LD A,(HL) ; O.K. TO GET JR NZ,DB_PDOT ; DB_DOT: - LD A,2EH ; LOAD A DOT + LD A,2EH ; LOAD A DOT DB_PDOT: CALL COUT ; PRINT IT - INC HL ; + INC HL ; LD A,D ; CP H ; JR NZ,DB_UPDH1 ; @@ -292,7 +292,7 @@ DB_CONTD: CALL NEWLINE ; JP DB_BLKRD ; -DB_END: +DB_END: RET ; ; ; OUTPUT A '$' TERMINATED STRING @@ -346,11 +346,11 @@ PANIC: LD B,H LD C,L CALL PRTHEXWORD - + RST 38 - + HALT - + JP 0 ; ;================================================================================================== @@ -534,7 +534,7 @@ ADDHLA: RET ; ;**************************** -; A(BCD) => A(BIN) +; A(BCD) => A(BIN) ; [00H..99H] -> [0..99] ;**************************** ; @@ -555,7 +555,7 @@ BCD2BYTE: RET ; ;***************************** -; A(BIN) => A(BCD) +; A(BIN) => A(BCD) ; [0..99] => [00H..99H] ;***************************** ; @@ -720,6 +720,22 @@ MULT8_LOOP: MULT8_NOADD: DJNZ MULT8_LOOP RET +; +; MULTIPLY A 16 BIT BY 8 BIT INTO 16 BIT +; IN: MULTIPLY DE BY A +; OUT: HL = RESULT, B=0, A, C, DE UNCHANGED +; +MULT8X16: + LD B,8 + LD HL,0 +MULT8X16_1: + ADD HL,HL + RLCA + JR NC,MULT8X16_2 + ADD HL,DE +MULT8X16_2: + DJNZ MULT8X16_1 + RET ;; ;; COMPUTE HL / DE ;; RESULT IN BC, REMAINDER IN HL, AND SET ZF DEPENDING ON REMAINDER @@ -1023,13 +1039,13 @@ KY_STATLOOP: ; DECODE THE RAW VALUE KY_DECODE: LD D,00H - LD HL,KY_KEYMAP ; POINT TO BEGINNING OF TABLE + LD HL,KY_KEYMAP ; POINT TO BEGINNING OF TABLE KY_GET_LOOP: CP (HL) ; MATCH? JR Z,KY_GET_DONE ; FOUND, DONE INC HL INC D ; D + 1 - JR NZ,KY_GET_LOOP ; NOT FOUND, LOOP UNTIL EOT + JR NZ,KY_GET_LOOP ; NOT FOUND, LOOP UNTIL EOT KY_GET_DONE: ; CLEAR OUT KEY_BUF XOR A @@ -1037,7 +1053,7 @@ KY_GET_DONE: ; RETURN THE INDEX POSITION WHERE THE RAW VALUE WAS FOUND LD A,D RET -; +; ;__KY_SCAN____________________________________________________________________________________________ ; ; SCAN KEYBOARD MATRIX FOR AN INPUT @@ -1051,7 +1067,7 @@ KY_SCAN: IN A,(PPIB) ; GET ROWS AND 7FH ;ignore PB7 for PPISD CP 00H ; ANYTHING PRESSED? - JR NZ,KY_SCAN_FOUND ; YES, EXIT + JR NZ,KY_SCAN_FOUND ; YES, EXIT LD C,0040H LD A,42H | 30H ; SCAN COL TWO @@ -1060,7 +1076,7 @@ KY_SCAN: IN A,(PPIB) ; GET ROWS AND 7FH ;ignore PB7 for PPISD CP 00H ; ANYTHING PRESSED? - JR NZ,KY_SCAN_FOUND ; YES, EXIT + JR NZ,KY_SCAN_FOUND ; YES, EXIT LD C,0080H LD A,44H | 30H ; SCAN COL THREE @@ -1069,7 +1085,7 @@ KY_SCAN: IN A,(PPIB) ; GET ROWS AND 7FH ;ignore PB7 for PPISD CP 00H ; ANYTHING PRESSED? - JR NZ,KY_SCAN_FOUND ; YES, EXIT + JR NZ,KY_SCAN_FOUND ; YES, EXIT LD C,00C0H ; LD A,48H | 30H ; SCAN COL FOUR @@ -1078,7 +1094,7 @@ KY_SCAN: IN A,(PPIB) ; GET ROWS AND 7FH ;ignore PB7 for PPISD CP 00H ; ANYTHING PRESSED? - JR NZ,KY_SCAN_FOUND ; YES, EXIT + JR NZ,KY_SCAN_FOUND ; YES, EXIT LD A,040H | 30H ; TURN OFF ALL COLUMNS OUT (PPIC),A ; SEND TO COLUMN LINES @@ -1087,7 +1103,7 @@ KY_SCAN: KY_SCAN_FOUND: AND 3FH ; CLEAR TOP TWO BITS - OR C ; ADD IN ROW BITS + OR C ; ADD IN ROW BITS LD C,A ; STORE VALUE ; WAIT FOR KEY TO BE RELEASED @@ -1107,7 +1123,7 @@ KY_CLEAR_LOOP: ; WAIT FOR KEY TO CLEAR RET ; ;_KEYMAP_TABLE_____________________________________________________________________________________________________________ -; +; KY_KEYMAP: ; 0 1 2 3 4 5 6 7 .DB 041H,002H,042H,082H,004H,044H,084H,008H @@ -1156,7 +1172,7 @@ DSKY_HEXOUT2: JP Z,DSKY_STROBE ; DO FINAL STROBE AND RETURN CALL DSKY_STROBE JR DSKY_HEXOUT2 - + DSKY_STROBEC: LD A,80H | 30H JP DSKY_STROBE0