Browse Source

Reintegrate wbw -> trunk

pull/3/head
wwarthen 11 years ago
parent
commit
ea547a012b
  1. 3
      Clean.cmd
  2. 34
      Doc/Build.txt
  3. 5
      Doc/ChangeLog.txt
  4. BIN
      Doc/Source/RomWBW Architecture.docx
  5. 4
      ReadMe.txt
  6. 38
      RomList.txt
  7. 2
      Source/Apps/Assign.asm
  8. 4
      Source/Apps/Build.cmd
  9. 1013
      Source/Apps/OSLdr.asm
  10. 1
      Source/BIOS/Blank1024KB-UNA.dat
  11. 1
      Source/BIOS/Blank1024KB-UNALOAD.dat
  12. 1
      Source/BIOS/Blank512KB-UNA.dat
  13. 1
      Source/BIOS/Blank512KB-UNALOAD.dat
  14. 63
      Source/BIOS/Build.ps1
  15. 159
      Source/BIOS/BuildUNALOAD.ps1
  16. 1
      Source/BIOS/Clean.cmd
  17. 1
      Source/BIOS/Config/una_std.asm
  18. 108
      Source/BIOS/Config/zeta2_ppisd.asm
  19. 108
      Source/BIOS/Config/zeta2_ppp.asm
  20. 108
      Source/BIOS/Config/zeta2_std.asm
  21. 10
      Source/BIOS/MakeBlankROM.ps1
  22. 0
      Source/BIOS/Old/bootapp.asm
  23. 0
      Source/BIOS/Old/bootgen.asm
  24. 2
      Source/BIOS/Old/bootrom.asm
  25. 0
      Source/BIOS/Old/fill1k.asm
  26. 0
      Source/BIOS/Old/infolist.inc
  27. 0
      Source/BIOS/Old/loader.asm
  28. 121
      Source/BIOS/Old/osldr.asm
  29. 0
      Source/BIOS/Old/pgzero.asm
  30. 0
      Source/BIOS/Old/rom0.asm
  31. 0
      Source/BIOS/Old/romfill.asm
  32. 0
      Source/BIOS/Old/syscfg.asm
  33. 829
      Source/BIOS/UNA/UNA-BIOS user manual.TXT
  34. 2
      Source/BIOS/blank1024KB.dat
  35. 2
      Source/BIOS/blank512KB.dat
  36. 273
      Source/BIOS/cbios.asm
  37. 2
      Source/BIOS/dbgmon.asm
  38. 8
      Source/BIOS/diskdefs
  39. 42
      Source/BIOS/dsrtc.asm
  40. 21
      Source/BIOS/fd.asm
  41. 708
      Source/BIOS/hbios.asm
  42. 43
      Source/BIOS/md.asm
  43. 41
      Source/BIOS/memmgr.asm
  44. 60
      Source/BIOS/mk4.inc
  45. 44
      Source/BIOS/n8.inc
  46. 58
      Source/BIOS/n8vem.inc
  47. 6
      Source/BIOS/prefix.asm
  48. 948
      Source/BIOS/romldr.asm
  49. 211
      Source/BIOS/setup.asm
  50. 71
      Source/BIOS/simrtc.asm
  51. 279
      Source/BIOS/std.asm
  52. 16
      Source/BIOS/time.asm
  53. 32
      Source/BIOS/una.inc
  54. 10
      Source/BIOS/ver.inc
  55. 8
      Source/BIOS/xio.asm
  56. 22
      Source/CBIOS/Build.cmd
  57. 5
      Source/CBIOS/Clean.cmd
  58. 13
      Source/CBIOS/build.inc
  59. 2482
      Source/CBIOS/cbios.asm
  60. BIN
      Source/CBIOS/cbios.bin
  61. 4381
      Source/CBIOS/cbios.lst
  62. 20
      Source/CBIOS/config.asm
  63. 25
      Source/CBIOS/n8vem.inc
  64. 36
      Source/CBIOS/std-n8vem.inc
  65. 308
      Source/CBIOS/std.asm
  66. 394
      Source/CBIOS/util.asm
  67. 7
      Source/CBIOS/ver.inc
  68. BIN
      Source/RomDsk/ROM_1024KB/CLOCKS.DAT
  69. BIN
      Source/RomDsk/ROM_1024KB/FLASH.COM
  70. 880
      Source/RomDsk/ROM_1024KB/WSREADME.TXT
  71. BIN
      Source/RomDsk/ROM_512KB/FLASH.COM
  72. BIN
      Source/RomDsk/mk4_diskio3/FDTST.COM
  73. BIN
      Source/RomDsk/n8_2312/FDTST.COM
  74. BIN
      Source/RomDsk/n8_2511/FDTST.COM
  75. BIN
      Source/RomDsk/n8vem_dide/FDTST.COM
  76. BIN
      Source/RomDsk/n8vem_diskio/FDTST.COM
  77. BIN
      Source/RomDsk/n8vem_diskio3+cvdu/FDTST.COM
  78. BIN
      Source/RomDsk/n8vem_diskio3/FDTST.COM
  79. BIN
      Source/RomDsk/zeta2_ppisd/1200.COM
  80. BIN
      Source/RomDsk/zeta2_ppisd/38400.COM
  81. BIN
      Source/RomDsk/zeta2_ppisd/9600.COM
  82. BIN
      Source/RomDsk/zeta2_ppisd/FDTST.COM
  83. BIN
      Source/RomDsk/zeta2_ppisd/RTC.COM
  84. BIN
      Source/RomDsk/zeta2_ppisd/XM.COM
  85. BIN
      Source/RomDsk/zeta2_ppisd/XM5.COM
  86. BIN
      Source/RomDsk/zeta2_ppp/1200.COM
  87. BIN
      Source/RomDsk/zeta2_ppp/38400.COM
  88. BIN
      Source/RomDsk/zeta2_ppp/9600.COM
  89. BIN
      Source/RomDsk/zeta2_ppp/FDTST.COM
  90. BIN
      Source/RomDsk/zeta2_ppp/RTC.COM
  91. BIN
      Source/RomDsk/zeta2_ppp/TSTPPP.COM
  92. BIN
      Source/RomDsk/zeta2_ppp/XM.COM
  93. BIN
      Source/RomDsk/zeta2_ppp/XM5.COM
  94. BIN
      Source/RomDsk/zeta2_std/1200.COM
  95. BIN
      Source/RomDsk/zeta2_std/38400.COM
  96. BIN
      Source/RomDsk/zeta2_std/9600.COM
  97. BIN
      Source/RomDsk/zeta2_std/FDTST.COM
  98. BIN
      Source/RomDsk/zeta2_std/PPIDETST.COM
  99. BIN
      Source/RomDsk/zeta2_std/RTC.COM
  100. BIN
      Source/RomDsk/zeta2_std/XM.COM

3
Clean.cmd

@ -1,9 +1,10 @@
@echo off
setlocal
pushd Source && call Clean && popd
if exist *.img del *.img /Q
if exist debug.log del debug.log
if exist *.log del *.log /Q
if exist Output\*.* del Output\*.* /Q

34
Doc/Build.txt

@ -3,35 +3,45 @@ Building a Custom ROM
At present, the build environment assumes you are running
a current version of Microsoft Windows (either 32-bit or
64-bit).
64-bit). Additionally, you will need Microsoft PowerShell.
PowerShell is included in all distributions of Microsoft
Windows starting with Vista. It is available as a free
download for Windows XP from Microsoft
If you are using Linux, David Giles has contributed a Linux
makefile that should work for you. Please read the
LinuxBuild.txt file for more information.
Other than PowerShell, all required tools are included in
the distribution. You should not need anything other than
what comes as part of Windows or as part of the distribution.
All required tools are included in the distribution. You
should not need anything other than what comes as part of
Windows or as part of the distribution.
In summary, the process involves the 4 steps below. You must
configure PowerShell prior to these steps, but this only needs
to be done once.
In summary, the process involves the 4 steps below:
The basic steps to create a custom ROM are:
1) Create/update configuration file
2) Update/Add/Delete any files you want incorporated in
the ROM Disk
3) Run the build script (or makefile if you prefer) and
3) Run the build scripts and
confirm there are no errors.
4) Burn the resultant ROM image and try it.
The process is really very simple. In fact, you can
essentially skip steps 1 & 2 if you want to try simply
building one of the existing configurations.
I strongly recommend that you initially SKIP steps
1 & 2. Just try steps 3 & 4 to make sure you are
able to build a ROM and test it in your hardware.
Each of the 4 steps above is described in more detail
below.
Acquiring the Distribution
--------------------------
Preparing PowerShell
--------------------
1. Create/Update Configuration File
-----------------------------------

5
Doc/ChangeLog.txt

@ -1,3 +1,8 @@
Version 2.7.0
-------------
- WBW: Memory page reorganization
- WBW: Support for Zeta 2 (from Sergey Kiselev)
Version 2.6.5
-------------
- WBW: Yet more DS1302 clock driver delay mods

BIN
Doc/Source/RomWBW Architecture.docx

Binary file not shown.

4
ReadMe.txt

@ -8,8 +8,8 @@ Builders: Wayne Warthen (wwarthen@gmail.com)
Douglas Goodall (douglas_goodall@mac.com)
David Giles (vk5dg@internode.on.net)
Updated: 2014-10-25
Version: 2.6.5
Updated: 2015-03-14
Version: 2.7.0
This is an adaptation of CP/M-80 2.2 and ZSDOS/ZCPR
targeting ROMs for all N8VEM Z80 hardware variations

38
RomList.txt

@ -151,6 +151,14 @@ custom build.
- PPIDE support via built-in PPI
- Drives A:=ROM, B:=RAM, C:=FD0, D:=FD1, E:=PPIDE00-0, F:=PPIDE0-01, G:=PPIDE0-02, H:=PPIDE0-03
ZETA_ppisd.rom for Zeta Z80 SBC + PPISD:
- 512KB ROM, 512KB RAM
- 38.4KB serial console baud rate
- Basic ROM/RAM disk
- Floppy support via built-in FDC
- PPISD support
- Drives A:=ROM, B:=RAM, C:=SD0-00, D:=SD0-01, E:=SD0-02, F:=SD0-03
ZETA_ppp.rom for Zeta Z80 SBC w/ ParPortProp:
- 512KB ROM, 512KB RAM
- 38.4KB serial console baud rate
@ -165,6 +173,36 @@ custom build.
- NOTE: Console defaults to VGA & PS/2 Keyboard. Short JP1 (CONFIG)
to use the serial port as the console.
ZETA2_std.rom for Zeta 2 Z80 SBC:
- 512KB ROM, 512KB RAM
- 38.4KB serial console baud rate
- Basic ROM/RAM disk
- Floppy support via built-in FDC
- PPIDE support via built-in PPI
- Drives A:=ROM, B:=RAM, C:=FD0, D:=FD1, E:=PPIDE00-0, F:=PPIDE0-01, G:=PPIDE0-02, H:=PPIDE0-03
ZETA2_ppisd.rom for Zeta 2 Z80 SBC + PPISD:
- 512KB ROM, 512KB RAM
- 38.4KB serial console baud rate
- Basic ROM/RAM disk
- Floppy support via built-in FDC
- PPISD support
- Drives A:=ROM, B:=RAM, C:=SD0-00, D:=SD0-01, E:=SD0-02, F:=SD0-03
ZETA2_ppp.rom for Zeta 2 Z80 SBC w/ ParPortProp:
- 512KB ROM, 512KB RAM
- 38.4KB serial console baud rate
- Basic ROM/RAM disk
- Floppy support via built-in FDC
- SD Card support via ParPortProp
- VGA console support via ParPortProp
- PS/2 Keyboard support via ParPortProp
- Drives A:=ROM, B:=RAM, C:=FD0, D:=FD1, E:=PPPSD0-00, F:=PPPSD0-01, F:=PPPSD0-02, G:=PPPSD0-03
- WARNING: You must use the RomWBW specific firmware
for the Propeller found in the Support directory!
- NOTE: Console defaults to VGA & PS/2 Keyboard. Short JP1 (CONFIG)
to use the serial port as the console.
N8_2511.rom for N8 2511 Z180:
- Assumes oscillator frequency of 18.432MHz
- CPU clock at X1 (18.432MHz)

2
Source/Apps/Assign.asm

@ -37,7 +37,7 @@ bdos .equ $0005 ; BDOS invocation vector
stamp .equ $40 ; loc of RomWBW CBIOS zero page stamp
;
rmj .equ 2 ; CBIOS version - major
rmn .equ 6 ; CBIOS version - minor
rmn .equ 7 ; CBIOS version - minor
;
;===============================================================================
; Code Section

4
Source/Apps/Build.cmd

@ -15,6 +15,7 @@ call :asm SysCopy || goto :eof
call :asm Assign || goto :eof
call :asm Format || goto :eof
call :asm Talk || goto :eof
call :asm OSLdr || goto :eof
zx Z80ASM -SYSGEN/F
@ -23,5 +24,6 @@ goto :eof
:asm
echo.
echo Building %1...
tasm -t80 -b -g3 -fFF %1.asm %1.com %1.lst
rem tasm -t80 -b -g3 -fFF %1.asm %1.com %1.lst
tasm -t80 -g3 -fFF %1.asm %1.com %1.lst
goto :eof

1013
Source/Apps/OSLdr.asm

File diff suppressed because it is too large

1
Source/BIOS/Blank1024KB-UNA.dat

File diff suppressed because one or more lines are too long

1
Source/BIOS/Blank1024KB-UNALOAD.dat

File diff suppressed because one or more lines are too long

1
Source/BIOS/Blank512KB-UNA.dat

File diff suppressed because one or more lines are too long

1
Source/BIOS/Blank512KB-UNALOAD.dat

File diff suppressed because one or more lines are too long

63
Source/BIOS/Build.ps1

@ -1,10 +1,10 @@
param([string]$Platform = "", [string]$Config = "", [string]$RomSize = "", [string]$RomName = "")
param([string]$Platform = "", [string]$Config = "", [string]$RomSize = "512", [string]$RomName = "")
$Platform = $Platform.ToUpper()
while ($true)
{
if (($Platform -eq "N8VEM") -or ($Platform -eq "ZETA") -or ($Platform -eq "N8") -or ($Platform -eq "MK4") -or ($Platform -eq "UNA") -or ($Platform -eq "S2I") -or ($Platform -eq "S100")) {break}
$Platform = (Read-Host -prompt "Platform [N8VEM|ZETA|N8|MK4|UNA|S2I|S100]").Trim().ToUpper()
if (($Platform -eq "N8VEM") -or ($Platform -eq "ZETA") -or ($Platform -eq "ZETA2") -or ($Platform -eq "N8") -or ($Platform -eq "MK4") -or ($Platform -eq "UNA") -or ($Platform -eq "S2I") -or ($Platform -eq "S100")) {break}
$Platform = (Read-Host -prompt "Platform [N8VEM|ZETA|ZETA2|N8|MK4|UNA|S2I|S100]").Trim().ToUpper()
}
while ($true)
@ -26,8 +26,6 @@ while ($true)
if (($Platform -eq "N8") -or ($Platform -eq "MK4")) {$CPUType = "180"} else {$CPUType = "80"}
if ($Platform -eq "UNA") {$BIOS = "ubios"} else {$BIOS = "hbios"}
if ($RomName -eq "") {$RomName = "${Platform}_${Config}"}
while ($RomName -eq "")
{
@ -44,15 +42,10 @@ $env:TASMTABS = $TasmPath
$env:PATH = $TasmPath + ';' + $CpmToolsPath + ';' + $env:PATH
$OutDir = "../../Output"
#$RomFmt = "wbw_rom${RomSize}"
if ($Platform -eq "UNA") {$RomFmt = "una_rom${RomSize}"} else {$RomFmt = "wbw_rom${RomSize}"}
if ($Platform -eq "UNA") {$BlankFile = "blank${RomSize}KB-UNA.dat"} else {$BlankFile = "blank${RomSize}KB.dat"}
$RomFmt = "wbw_rom${RomSize}"
$BlankROM = "Blank${RomSize}KB.dat"
$RomDiskFile = "RomDisk.tmp"
$RomFile = "${OutDir}/${RomName}.rom"
$CPMImgFile = "${OutDir}/${RomName}_CPM.sys"
$ZSYSImgFile = "${OutDir}/${RomName}_ZSYS.sys"
$CPMLoader = "${OutDir}/${RomName}_CPM.com"
$ZSYSLoader = "${OutDir}/${RomName}_ZSYS.com"
""
"Building ${RomName}: ${ROMSize}KB ROM configuration ${Config} for Z${CPUType}..."
@ -84,8 +77,8 @@ Function Concat($InputFileList, $OutputFile)
;
#DEFINE TIMESTAMP ${TimeStamp}
;
ROMSIZE .EQU ${ROMSize} ; SIZE OF ROM IN KB
PLATFORM .EQU PLT_${Platform} ; HARDWARE PLATFORM
ROMSIZE .EQU ${ROMSize} ; SIZE OF ROM IN KB
;
; INCLUDE PLATFORM SPECIFIC DEVICE DEFINITIONS
;
@ -101,57 +94,51 @@ Copy-Item '..\cpm22\os3bdos.bin' 'bdos.bin'
Copy-Item '..\zcpr-dj\zcpr.bin' 'zcpr.bin'
Copy-Item '..\zsdos\zsdos.bin' 'zsdos.bin'
Asm 'syscfg'
Asm 'cbios' "-dBLD_SYS=SYS_CPM" -Output "cbios.bin"
Asm 'cbios' "-dBLD_SYS=SYS_ZSYS" -Output "zbios.bin"
Asm 'cbios' "-dBLD_SYS=SYS_CPM" -Output "cbios_cpm.bin"
Asm 'cbios' "-dBLD_SYS=SYS_ZSYS" -Output "cbios_zsys.bin"
Asm 'dbgmon'
Asm 'prefix'
Asm 'bootrom'
Asm 'bootapp'
Asm 'loader'
Asm 'pgzero'
Asm $BIOS
Asm 'hbfill'
Asm 'romfill'
Asm 'romldr'
if ($Platform -ne "UNA")
{
Asm 'setup'
Asm 'hbios'
}
# Generate result files using components above
"Building ${RomName} output files..."
Concat 'ccp.bin','bdos.bin','cbios.bin' 'cpm.bin'
Concat 'zcpr.bin','zsdos.bin','zbios.bin' 'zsys.bin'
Concat 'ccp.bin','bdos.bin','cbios_cpm.bin' 'cpm.bin'
Concat 'zcpr.bin','zsdos.bin','cbios_zsys.bin' 'zsys.bin'
Concat 'prefix.bin','cpm.bin' $CPMImgFile
Concat 'prefix.bin','zsys.bin' $ZSYSImgFile
Concat 'prefix.bin','cpm.bin' 'cpm.sys'
Concat 'prefix.bin','zsys.bin' 'zsys.sys'
Concat 'pgzero.bin','bootrom.bin','syscfg.bin','loader.bin','zsys.bin','hbfill.bin','dbgmon.bin','cpm.bin','hbfill.bin' 'rom1.bin'
Concat 'pgzero.bin','bootrom.bin','syscfg.bin','loader.bin',"${BIOS}.bin" 'rom2.bin'
Concat 'bootapp.bin','syscfg.bin','loader.bin',"${BIOS}.bin",'dbgmon.bin','cpm.bin' $CPMLoader
Concat 'bootapp.bin','syscfg.bin','loader.bin',"${BIOS}.bin",'dbgmon.bin','zsys.bin' $ZSYSLoader
Concat 'romldr.bin', 'dbgmon.bin','cpm.bin','zsys.bin' osimg.bin
# Create the RomDisk image
"Building ${RomSize}KB ${RomName} ROM disk data file..."
Copy-Item $BlankFile $RomDiskFile
Copy-Item $BlankROM $RomDiskFile
cpmcp -f $RomFmt $RomDiskFile ../RomDsk/ROM_${RomSize}KB/*.* 0:
cpmcp -f $RomFmt $RomDiskFile ../RomDsk/${Platform}_${Config}/*.* 0:
cpmcp -f $RomFmt $RomDiskFile ../Apps/*.com 0:
cpmcp -f $RomFmt $RomDiskFile ${OutDir}/${RomName}_CPM.sys 0:CPM.sys
cpmcp -f $RomFmt $RomDiskFile ${OutDir}/${RomName}_ZSYS.sys 0:ZSYS.sys
cpmcp -f $RomFmt $RomDiskFile *.sys 0:
if ($Platform -eq "UNA")
{
Copy-Item 'rom1.bin' ${OutDir}\UNA_WBW_SYS.bin
Copy-Item 'osimg.bin' ${OutDir}\UNA_WBW_SYS.bin
Copy-Item $RomDiskFile ${OutDir}\UNA_WBW_ROM${ROMSize}.bin
Concat 'UNA\UNA-BIOS.BIN','rom1.bin','UNA\FSFAT.BIN',$RomDiskFile $RomFile
Concat 'UNA\UNA-BIOS.BIN','osimg.bin','UNA\FSFAT.BIN',$RomDiskFile $RomFile
}
else
{
Concat 'rom1.bin','rom2.bin',$RomDiskFile $RomFile
Concat 'setup.bin', 'hbios.bin','osimg.bin','hbios.bin',$RomDiskFile $RomFile
}
# Cleanup
Remove-Item $RomDiskFile

159
Source/BIOS/BuildUNALOAD.ps1

@ -1,159 +0,0 @@
param([string]$Platform = "", [string]$Config = "", [string]$RomSize = "", [string]$SYS = "", [string]$RomName = "")
$Platform = $Platform.ToUpper()
while ($true)
{
if (($Platform -eq "N8VEM") -or ($Platform -eq "ZETA") -or ($Platform -eq "N8") -or ($Platform -eq "MK4") -or ($Platform -eq "S2I") -or ($Platform -eq "S100")) {break}
$Platform = (Read-Host -prompt "Platform [N8VEM|ZETA|N8|MK4|S2I|S100]").Trim().ToUpper()
}
while ($true)
{
$ConfigFile = "config_${Platform}_${Config}.asm"
if (Test-Path $ConfigFile) {break}
if ($Config -ne "") {Write-Host "${ConfigFile} does not exist!"}
"Configurations available:"
Get-Item "config_${Platform}_*.asm" | foreach {Write-Host " >", $_.Name.Substring(8 + $Platform.Length, $_.Name.Length - 12 - $Platform.Length)}
$Config = (Read-Host -prompt "Configuration").Trim()
}
while ($true)
{
if (($RomSize -eq "512") -or ($RomSize -eq "1024")) {break}
$RomSize = (Read-Host -prompt "ROM Size [512|1024]").Trim()
}
if (($Platform -eq "N8") -or ($Platform -eq "MK4")) {$CPUType = "180"} else {$CPUType = "80"}
$SYS = $SYS.ToUpper()
while ($true)
{
if (($SYS -eq "CPM") -or ($SYS -eq "ZSYS")) {break}
$SYS = (Read-Host -prompt "System [CPM|ZSYS]").Trim().ToUpper()
}
if ($RomName -eq "") {$RomName = "${Platform}_${Config}"}
while ($RomName -eq "")
{
$CP = (Read-Host -prompt "ROM Name [${Config}]").Trim()
if ($RomName -eq "") {$RomName = $Config}
}
$ErrorAction = 'Stop'
$TasmPath = '..\tools\tasm32'
$CpmToolsPath = '..\tools\cpmtools'
$env:TASMTABS = $TasmPath
$env:PATH = $TasmPath + ';' + $CpmToolsPath + ';' + $env:PATH
$OutDir = "../OutputUNALOAD"
$RomFmt = "n8vem_rom${RomSize}"
$BlankFile = "blank${RomSize}KB-UNALOAD.dat"
$RomDiskFile = "RomDisk.tmp"
$RomFile = "${OutDir}/${RomName}.rom"
$SysImgFile = "${OutDir}/${RomName}.sys"
$LoaderFile = "${OutDir}/${RomName}.com"
""
"Building ${RomName}: ${ROMSize}KB ROM configuration ${Config} for Z${CPUType}..."
""
$TimeStamp = '"' + (Get-Date -Format 'dd-MMM-yyyy') + '"'
Function Asm($Component, $Opt, $Architecture=$CPUType, $Output="${Component}.bin")
{
$Cmd = "tasm -t${Architecture} -g3 ${Opt} ${Component}.asm ${Output}"
$Cmd | write-host
Invoke-Expression $Cmd | write-host
if ($LASTEXITCODE -gt 0) {throw "TASM returned exit code $LASTEXITCODE"}
}
Function Concat($InputFileList, $OutputFile)
{
Set-Content $OutputFile -Value $null
foreach ($InputFile in $InputFileList)
{
Add-Content $OutputFile -Value ([System.IO.File]::ReadAllBytes($InputFile)) -Encoding byte
}
}
# Generate the build settings include file
@"
; RomWBW Configured for ${Platform} ${Config}, $(Get-Date -Format "s")
;
#DEFINE TIMESTAMP ${TimeStamp}
;
#DEFINE UNALOAD
;
ROMSIZE .EQU ${ROMSize} ; SIZE OF ROM IN KB
PLATFORM .EQU PLT_${Platform} ; HARDWARE PLATFORM
;
; INCLUDE PLATFORM SPECIFIC DEVICE DEFINITIONS
;
#INCLUDE "std-n8vem.inc"
;
#INCLUDE "${ConfigFile}"
;
"@ | Out-File "build.inc" -Encoding ASCII
# Build components
if ($SYS -eq "CPM")
{
# Asm 'ccpb03' -Output 'cp.bin'
# Asm 'bdosb01' -Output 'dos.bin'
# Copy-Item '..\cpm22\ccpb03.bin' 'cp.bin'
# Copy-Item '..\cpm22\bdosb01.bin' 'dos.bin'
# Copy-Item '..\cpm22\ccp22.bin' 'cp.bin'
# Copy-Item '..\cpm22\bdos22.bin' 'dos.bin'
Copy-Item '..\cpm22\os2ccp.bin' 'cp.bin'
Copy-Item '..\cpm22\os3bdos.bin' 'dos.bin'
}
if ($SYS -eq "ZSYS")
{
Copy-Item '..\zcpr-dj\zcpr.bin' 'cp.bin'
Copy-Item '..\zsdos\zsdos.bin' 'dos.bin'
}
Asm 'syscfg'
Asm 'cbios' "-dBLD_SYS=SYS_${SYS}"
Asm 'dbgmon'
Asm 'prefix'
Asm 'bootrom'
Asm 'bootapp'
Asm 'loader'
Asm 'pgzero'
Asm 'hbios'
Asm 'hbfill'
Asm 'romfill'
# Generate result files using components above
"Building ${RomName} output files..."
Concat 'cp.bin','dos.bin','cbios.bin' 'os.bin'
Concat 'prefix.bin','os.bin' $SysImgFile
Concat 'pgzero.bin','bootrom.bin','syscfg.bin','loader.bin','romfill.bin','dbgmon.bin','os.bin','hbfill.bin' 'rom1.bin'
Concat 'pgzero.bin','bootrom.bin','syscfg.bin','loader.bin','hbios.bin' 'rom2.bin'
Concat 'bootapp.bin','syscfg.bin','loader.bin','hbios.bin','dbgmon.bin','os.bin' $LoaderFile
# Create the RomDisk image
"Building ${RomSize}KB ${RomName} ROM disk data file..."
Copy-Item $BlankFile $RomDiskFile
cpmcp -f $RomFmt $RomDiskFile ../RomDsk/${SYS}_${RomSize}KB/*.* 0:
cpmcp -f $RomFmt $RomDiskFile ../RomDsk/cfg_${Platform}_${Config}/*.* 0:
cpmcp -f $RomFmt $RomDiskFile ../Apps/*.com 0:
cpmcp -f $RomFmt $RomDiskFile ${OutDir}/${RomName}.sys 0:${SYS}.sys
Concat '..\UNA\unaboot.bin','..\UNA\unabios.bin','rom1.bin','..\UNA\unafat.bin','rom2.bin',$RomDiskFile $RomFile
# Cleanup
Remove-Item $RomDiskFile

1
Source/BIOS/Clean.cmd

@ -7,4 +7,5 @@ if exist *.lst del *.lst
if exist *.exp del *.exp
if exist *.tmp del *.tmp
if exist *.mrk del *.mrk
if exist *.sys del *.sys
if exist build.inc del build.inc

1
Source/BIOS/Config/una_std.asm

@ -7,6 +7,7 @@
;
CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)

108
Source/BIOS/Config/zeta2_ppisd.asm

@ -0,0 +1,108 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR ZETA W/ PPISD
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
BOOTCON .EQU CIODEV_UART ; CONSOLE DEVICE FOR BOOT MESSAGES (MUST BE PRIMARY SERIAL PORT FOR PLATFORM)
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
CONBAUD .EQU 38400 ; BAUDRATE FOR CONSOLE DURING HARDWARE INIT
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...)
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
SIMRTCENABLE .EQU FALSE ; SIMH CLOCK DRIVER
DSRTCENABLE .EQU TRUE ; DS-1302 CLOCK DRIVER
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTCNT .EQU 1 ; NUMBER OF UARTS
UART0IOB .EQU $68 ; UART0 IOBASE
UART0BAUD .EQU CONBAUD ; UART0 BAUDRATE
UART0FIFO .EQU TRUE ; UART0 TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UART0AFC .EQU FALSE ; UART0 TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT
ASCI0BAUD .EQU CONBAUD ; ASCI0 BAUDRATE (IMPLEMENTED BY Z180_CNTLB0)
ASCI1BAUD .EQU CONBAUD ; ASCI1 BAUDRATE (IMPLEMENTED BY Z180_CNTLB1)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
WRTCACHE .EQU TRUE ; ENABLE WRITE CACHING IN CBIOS (DE)BLOCKING ALGORITHM
DSKTRACE .EQU FALSE ; ENABLE TRACING OF CBIOS DISK FUNCTION CALLS
;
MDENABLE .EQU TRUE ; TRUE FOR ROM/RAM DISK SUPPORT (ALMOST ALWAYS WANT THIS ENABLED)
MDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF MDENABLE = TRUE)
;
FDENABLE .EQU TRUE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_ZETA2 ; FDMODE_DIO, FDMODE_ZETA, FDMODE_DIDE, FDMODE_N8, FDMODE_DIO3
FDTRACE .EQU 1 ; 0=SILENT, 1=FATAL ERRORS, 2=ALL ERRORS, 3=EVERYTHING (ONLY RELEVANT IF FDENABLE = TRUE)
FDMEDIA .EQU FDM144 ; FDM720, FDM144, FDM360, FDM120 (ONLY RELEVANT IF FDENABLE = TRUE)
FDMEDIAALT .EQU FDM720 ; ALTERNATE MEDIA TO TRY, SAME CHOICES AS ABOVE (ONLY RELEVANT IF FDMAUTO = TRUE)
FDMAUTO .EQU TRUE ; SELECT BETWEEN MEDIA OPTS ABOVE AUTOMATICALLY
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
IDEENABLE .EQU FALSE ; TRUE FOR IDE SUPPORT
IDEMODE .EQU IDEMODE_DIO ; IDEMODE_DIO, IDEMODE_DIDE
IDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
IDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
IDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
PPIDEENABLE .EQU FALSE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
PPIDEIOB .EQU $60 ; PPIDE IOBASE
PPIDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPIDEENABLE = TRUE)
PPIDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
PPIDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
PPIDESLOW .EQU FALSE ; ADD DELAYS TO HELP PROBLEMATIC HARDWARE (TRY THIS IF PPIDE IS UNRELIABLE)
;
SDENABLE .EQU TRUE ; TRUE FOR SD SUPPORT
SDMODE .EQU SDMODE_PPI ; SDMODE_JUHA, SDMODE_CSIO, SDMODE_UART, SDMODE_PPI, SDMODE_DSD
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIOFAST .EQU FALSE ; TABLE-DRIVEN BIT INVERTER
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
PRPIOB .EQU $A8 ; PORT IO ADDRESS BASE
PRPSDENABLE .EQU TRUE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
PRPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PRPSDENABLE = TRUE)
PRPSDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
PRPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO)
;
PPPENABLE .EQU FALSE ; TRUE FOR PARPORTPROP SUPPORT
PPPSDENABLE .EQU TRUE ; TRUE FOR PARPORTPROP SD SUPPORT
PPPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPPENABLE = TRUE)
PPPSDCAPACITY .EQU 64 ; CAPACITY OF PPP SD DEVICE (IN MB)
PPPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO)
;
HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242
KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE = TRUE)
;
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
;
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M

108
Source/BIOS/Config/zeta2_ppp.asm

@ -0,0 +1,108 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR ZETA W/ PARPORTPROP
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
BOOTCON .EQU CIODEV_UART ; CONSOLE DEVICE FOR BOOT MESSAGES (MUST BE PRIMARY SERIAL PORT FOR PLATFORM)
DEFCON .EQU CIODEV_PPPCON ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON
ALTCON .EQU CIODEV_UART ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
CONBAUD .EQU 38400 ; BAUDRATE FOR CONSOLE DURING HARDWARE INIT
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...)
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
SIMRTCENABLE .EQU FALSE ; SIMH CLOCK DRIVER
DSRTCENABLE .EQU TRUE ; DS-1302 CLOCK DRIVER
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTCNT .EQU 1 ; NUMBER OF UARTS
UART0IOB .EQU $68 ; UART0 IOBASE
UART0BAUD .EQU CONBAUD ; UART0 BAUDRATE
UART0FIFO .EQU TRUE ; UART0 TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UART0AFC .EQU FALSE ; UART0 TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT
ASCI0BAUD .EQU CONBAUD ; ASCI0 BAUDRATE (IMPLEMENTED BY Z180_CNTLB0)
ASCI1BAUD .EQU CONBAUD ; ASCI1 BAUDRATE (IMPLEMENTED BY Z180_CNTLB1)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $01 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU $00 ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
WRTCACHE .EQU TRUE ; ENABLE WRITE CACHING IN CBIOS (DE)BLOCKING ALGORITHM
DSKTRACE .EQU FALSE ; ENABLE TRACING OF CBIOS DISK FUNCTION CALLS
;
MDENABLE .EQU TRUE ; TRUE FOR ROM/RAM DISK SUPPORT (ALMOST ALWAYS WANT THIS ENABLED)
MDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF MDENABLE = TRUE)
;
FDENABLE .EQU TRUE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_ZETA2 ; FDMODE_DIO, FDMODE_ZETA, FDMODE_DIDE, FDMODE_N8, FDMODE_DIO3
FDTRACE .EQU 1 ; 0=SILENT, 1=FATAL ERRORS, 2=ALL ERRORS, 3=EVERYTHING (ONLY RELEVANT IF FDENABLE = TRUE)
FDMEDIA .EQU FDM144 ; FDM720, FDM144, FDM360, FDM120 (ONLY RELEVANT IF FDENABLE = TRUE)
FDMEDIAALT .EQU FDM720 ; ALTERNATE MEDIA TO TRY, SAME CHOICES AS ABOVE (ONLY RELEVANT IF FDMAUTO = TRUE)
FDMAUTO .EQU TRUE ; SELECT BETWEEN MEDIA OPTS ABOVE AUTOMATICALLY
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
IDEENABLE .EQU FALSE ; TRUE FOR IDE SUPPORT
IDEMODE .EQU IDEMODE_DIO ; IDEMODE_DIO, IDEMODE_DIDE
IDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
IDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
IDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
PPIDEENABLE .EQU FALSE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
PPIDEIOB .EQU $60 ; PPIDE IOBASE
PPIDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPIDEENABLE = TRUE)
PPIDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
PPIDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
PPIDESLOW .EQU FALSE ; ADD DELAYS TO HELP PROBLEMATIC HARDWARE (TRY THIS IF PPIDE IS UNRELIABLE)
;
SDENABLE .EQU FALSE ; TRUE FOR SD SUPPORT
SDMODE .EQU SDMODE_NONE ; SDMODE_JUHA, SDMODE_CSIO, SDMODE_UART, SDMODE_PPI, SDMODE_DSD
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIOFAST .EQU FALSE ; TABLE-DRIVEN BIT INVERTER
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
PRPIOB .EQU $A8 ; PORT IO ADDRESS BASE
PRPSDENABLE .EQU TRUE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
PRPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PRPSDENABLE = TRUE)
PRPSDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
PRPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO)
;
PPPENABLE .EQU TRUE ; TRUE FOR PARPORTPROP SUPPORT
PPPSDENABLE .EQU TRUE ; TRUE FOR PARPORTPROP SD SUPPORT
PPPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPPENABLE = TRUE)
PPPSDCAPACITY .EQU 64 ; CAPACITY OF PPP SD DEVICE (IN MB)
PPPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO)
;
HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242
KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE = TRUE)
;
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
;
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M

108
Source/BIOS/Config/zeta2_std.asm

@ -0,0 +1,108 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR ZETA
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
BOOTCON .EQU CIODEV_UART ; CONSOLE DEVICE FOR BOOT MESSAGES (MUST BE PRIMARY SERIAL PORT FOR PLATFORM)
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
CONBAUD .EQU 38400 ; BAUDRATE FOR CONSOLE DURING HARDWARE INIT
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...)
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
SIMRTCENABLE .EQU FALSE ; SIMH CLOCK DRIVER
DSRTCENABLE .EQU TRUE ; DS-1302 CLOCK DRIVER
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTCNT .EQU 1 ; NUMBER OF UARTS
UART0IOB .EQU $68 ; UART0 IOBASE
UART0BAUD .EQU CONBAUD ; UART0 BAUDRATE
UART0FIFO .EQU TRUE ; UART0 TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UART0AFC .EQU FALSE ; UART0 TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT
ASCI0BAUD .EQU CONBAUD ; ASCI0 BAUDRATE (IMPLEMENTED BY Z180_CNTLB0)
ASCI1BAUD .EQU CONBAUD ; ASCI1 BAUDRATE (IMPLEMENTED BY Z180_CNTLB1)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
WRTCACHE .EQU TRUE ; ENABLE WRITE CACHING IN CBIOS (DE)BLOCKING ALGORITHM
DSKTRACE .EQU FALSE ; ENABLE TRACING OF CBIOS DISK FUNCTION CALLS
;
MDENABLE .EQU TRUE ; TRUE FOR ROM/RAM DISK SUPPORT (ALMOST ALWAYS WANT THIS ENABLED)
MDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF MDENABLE = TRUE)
;
FDENABLE .EQU TRUE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_ZETA2 ; FDMODE_DIO, FDMODE_ZETA, FDMODE_DIDE, FDMODE_N8, FDMODE_DIO3
FDTRACE .EQU 1 ; 0=SILENT, 1=FATAL ERRORS, 2=ALL ERRORS, 3=EVERYTHING (ONLY RELEVANT IF FDENABLE = TRUE)
FDMEDIA .EQU FDM144 ; FDM720, FDM144, FDM360, FDM120 (ONLY RELEVANT IF FDENABLE = TRUE)
FDMEDIAALT .EQU FDM720 ; ALTERNATE MEDIA TO TRY, SAME CHOICES AS ABOVE (ONLY RELEVANT IF FDMAUTO = TRUE)
FDMAUTO .EQU TRUE ; SELECT BETWEEN MEDIA OPTS ABOVE AUTOMATICALLY
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
IDEENABLE .EQU FALSE ; TRUE FOR IDE SUPPORT
IDEMODE .EQU IDEMODE_DIO ; IDEMODE_DIO, IDEMODE_DIDE
IDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
IDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
IDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
PPIDEENABLE .EQU FALSE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
PPIDEIOB .EQU $60 ; PPIDE IOBASE
PPIDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPIDEENABLE = TRUE)
PPIDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
PPIDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
PPIDESLOW .EQU FALSE ; ADD DELAYS TO HELP PROBLEMATIC HARDWARE (TRY THIS IF PPIDE IS UNRELIABLE)
;
SDENABLE .EQU FALSE ; TRUE FOR SD SUPPORT
SDMODE .EQU SDMODE_PPI ; SDMODE_JUHA, SDMODE_CSIO, SDMODE_UART, SDMODE_PPI, SDMODE_DSD
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIOFAST .EQU FALSE ; TABLE-DRIVEN BIT INVERTER
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
PRPIOB .EQU $A8 ; PORT IO ADDRESS BASE
PRPSDENABLE .EQU TRUE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
PRPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PRPSDENABLE = TRUE)
PRPSDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
PRPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO)
;
PPPENABLE .EQU FALSE ; TRUE FOR PARPORTPROP SUPPORT
PPPSDENABLE .EQU TRUE ; TRUE FOR PARPORTPROP SD SUPPORT
PPPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPPENABLE = TRUE)
PPPSDCAPACITY .EQU 64 ; CAPACITY OF PPP SD DEVICE (IN MB)
PPPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO)
;
HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242
KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE = TRUE)
;
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
;
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M

10
Source/BIOS/MakeBlankROM.ps1

@ -1,10 +1,4 @@
# Create a "dummy" rom image, filled with hex E5
#
Set-Content -Value ([byte[]](0xE5) * (512KB - 64KB)) -Encoding byte -Path 'Blank512KB.dat'
Set-Content -Value ([byte[]](0xE5) * (1MB - 64KB)) -Encoding byte -Path 'Blank1024KB.dat'
Set-Content -Value ([byte[]](0xE5) * (512KB - 128KB)) -Encoding byte -Path 'Blank512KB-UNA.dat'
Set-Content -Value ([byte[]](0xE5) * (1MB - 128KB)) -Encoding byte -Path 'Blank1024KB-UNA.dat'
Set-Content -Value ([byte[]](0xE5) * (512KB - 160KB)) -Encoding byte -Path 'Blank512KB-UNALOAD.dat'
Set-Content -Value ([byte[]](0xE5) * (1MB - 160KB)) -Encoding byte -Path 'Blank1024KB-UNALOAD.dat'
Set-Content -Value ([byte[]](0xE5) * (512KB - 128KB)) -Encoding byte -Path 'Blank512KB.dat'
Set-Content -Value ([byte[]](0xE5) * (1MB - 128KB)) -Encoding byte -Path 'Blank1024KB.dat'

0
Source/BIOS/bootapp.asm → Source/BIOS/Old/bootapp.asm

0
Source/BIOS/bootgen.asm → Source/BIOS/Old/bootgen.asm

2
Source/BIOS/bootrom.asm → Source/BIOS/Old/bootrom.asm

@ -3,7 +3,6 @@
; ROM BOOT MANAGER
;
; HARDWARE COLD START WILL JUMP HERE FOR INITIALIZATION
; REFER TO BANKEDBIOS.TXT FOR MORE INFORMATION.
;______________________________________________________________________________________________________________________
;
;
@ -13,7 +12,6 @@
;
DI ; NO INTERRUPTS
IM 1 ; INTERRUPT MODE 1
;LD SP,STACK ; SP IN RAM
LD SP,HBX_LOC ; SP IN RAM
;
;

0
Source/BIOS/hbfill.asm → Source/BIOS/Old/fill1k.asm

0
Source/BIOS/infolist.inc → Source/BIOS/Old/infolist.inc

0
Source/BIOS/loader.asm → Source/BIOS/Old/loader.asm

121
Source/BIOS/Old/osldr.asm

@ -0,0 +1,121 @@
;___BOOTAPP____________________________________________________________________________________________________________
;
; APPLICATION BOOT MANAGER
;
; USED TO LOAD AN APPLICATION IMAGE BASED COPY OF THE SYSTEM
; REFER TO BANKEDBIOS.TXT FOR MORE INFORMATION.
;______________________________________________________________________________________________________________________
;
; MEMORY MAP
;
; LOC LEN DESC
; ----- ----- --------------
; $0000 $1000 BOOTAPP CODE
; $1000 $1000 DBGMON IMAGE
; $2000 $3000 CPM IMAGE
; $5000 $3000 ZSYS IMAGE
; $8000 *** END ***
;
#INCLUDE "std.asm"
;
.ORG $100
;
DI ; NO INTERRUPTS
IM 1 ; INTERRUPT MODE 1
LD SP,STACK ; PRIVATE STACK
;
; BANNER
CALL NEWLINE
LD DE,STR_BANNER
CALL WRITESTR
;
MENU:
CALL NEWLINE
CALL NEWLINE
LD DE,STR_BOOTMENU
CALL WRITESTR
CALL CINUC
CP 'M' ; MONITOR
JP Z,GOMON
CP 'C' ; CP/M BOOT FROM ROM
JP Z,GOCPM
CP 'Z' ; ZSYSTEM BOOT FROM ROM
JP Z,GOZSYS
;
LD DE,STR_INVALID
CALL WRITESTR
JR MENU
;
GOMON:
LD DE,STR_BOOTMON
CALL WRITESTR
LD HL,$1000
LD DE,$C000
LD BC,$1000
LDIR
JP MON_SERIAL
;
GOCPM:
LD DE,STR_BOOTCPM
CALL WRITESTR
LD HL,$2000
LD DE,CPM_LOC
LD BC,$3000 - $400
LDIR
#IF (PLATFORM == PLT_UNA)
LD DE,$0100 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE)
#ELSE
LD DE,$0000 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE)
#ENDIF
JP CPM_ENT
;
GOZSYS:
LD DE,STR_BOOTZSYS
CALL WRITESTR
LD HL,$5000
LD DE,CPM_LOC
LD BC,$3000 - $400
LDIR
#IF (PLATFORM == PLT_UNA)
LD DE,$0100 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE)
#ELSE
LD DE,$0000 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE)
#ENDIF
JP CPM_ENT
;
; READ A CONSOLE CHARACTER AND CONVERT TO UPPER CASE
;
CINUC:
CALL CIN
AND 7FH ; STRIP HI BIT
CP 'A' ; KEEP NUMBERS, CONTROLS
RET C ; AND UPPER CASE
CP 7BH ; SEE IF NOT LOWER CASE
RET NC
AND 5FH ; MAKE UPPER CASE
RET
;
#DEFINE CIOMODE_HBIOS
#INCLUDE "util.asm"
;
; STRINGS
;_____________________________________________________________________________________________________________________________
;
STR_BOOTMON .DB "START MONITOR\r\n$"
STR_BOOTCPM .DB "BOOT CPM FROM ROM\r\n$"
STR_BOOTZSYS .DB "BOOT ZSYSTEM FROM ROM\r\n$"
STR_INVALID .DB "INVALID SELECTION\r\n$"
;
STR_BANNER .DB "\r\n", PLATFORM_NAME, " Boot Loader$"
STR_BOOTMENU .DB "\r\nBoot: (C)PM, (Z)System, (M)onitor,\r\n"
.DB " (L)ist devices, or Device ID ===> $"
;
;______________________________________________________________________________________________________________________
;
; PAD OUT REMAINDER
;
.FILL $1000 - $,$FF ; PAD OUT REMAINDER
;
STACK .EQU $ ; STACK IN SLACK SPACE
;
.END

0
Source/BIOS/pgzero.asm → Source/BIOS/Old/pgzero.asm

0
Source/BIOS/rom0.asm → Source/BIOS/Old/rom0.asm

0
Source/BIOS/romfill.asm → Source/BIOS/Old/romfill.asm

0
Source/BIOS/syscfg.asm → Source/BIOS/Old/syscfg.asm

829
Source/BIOS/UNA/UNA-BIOS user manual.TXT

@ -0,0 +1,829 @@
UNA error codes
===============
All UNA BIOS calls return a completion code in the C-register. If no
error has occurred, the code will be Zero, and the Z-flag will be
set. If any error has occurred, the Z-flag will be clear, and the
C-register indicates the nature of the error.
Calling conventions:
===================
UNA BIOS calls are made with a function code in the C-register. Some
calls will have a unit number in the B-register; other calls will
have a subfunction number in the B-register. Parameters are passed
in the other registers, as documented for each BIOS call. The BIOS
is invoked with an "RST 8" single-byte instruction.
Values are returned in various registers, or buffers, as specified
for each function call. Unless a value is specifically returned in a
register, the register is preserved across the BIOS call. The
exception to this rule is the AF register. Neither is preserved; and
the Flags-register always returns the Z-flag to indicate any error
condition (set==no error, clear==error code in C-register).
Error codes:
===========
; error.s
; error codes follow
NO_ERROR = 0
;
; Mild errors 1..63
;
ERR_NOT_YET = 1 ; Method still being implemented
; Definite errors 64..127
;
ERR_UNKNOWN = 65 ; Unknown call
ERR_UNIT_NO = 66 ; unit no. bad
ERR_METHOD = 67 ; method number is bad
ERR_ADDRESS = 68 ; address out of range (must be >=0x8000)
ERR_DECODE = 69 ; not an encoded value (decode.s)
ERR_CAPACITY = 70 ; LBA address beyond disk capacity
ERR_NO_MEDIA = 71 ; no Media in drive socket
ERR_WRONG_MEDIA = 72 ; not SDSC or SDHC
ERR_WRITE_PROT = 73 ; media is write-protected
ERR_NO_PROTO = 129 ; no Instance prototype found
ERR_NO_MEMORY = 130 ; ran out of Heap memory
ERR_NO_UNIT = 131 ; no new unit available
ERR_SIO_BAUD = 132 ; serial baud rate setup not possible
ERR_DISK_IO = 133 ; disk I/O error
ERR_TIMEOUT = 134 ; timeout
ERR_CRC16 = 135 ; CRC16 error on data read
CATASTROPHE_HEAP = 241 ; HEAP catastrophe
DRIVE_TRANSFER_NOT_SET = 242 ; DRIVE NOT 8 & NOT 16 BIT
;end error.s
BIOS calls:
==========
*** Serial I/O calls
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 10 -- INIT
;
; Enter with:
; C = 0x10
; B = unit number
; DE = setup parameters or -1 (use previous values)
;
; Exit with:
; C = error code (0==no error)
; Z flag is clear/set on error/no error
;
; Setup Parameter Word:
; _______________________________ _______________________________
; | | | encoded || | | | | |
; | |rts| Baud Rate ||dtr|xon| parity |stp| 8/7/6 |
; |_______|___|___|_______________||___|___|___________|___|_______|
; 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
; D register E register
;
; _______________________________ _______________________________
; | | re| te|~rs| er|8/7 pe stp|| | | | | | |
; | 0 | 1 | 1 | 0 | 0 | m2 m1 m0|| 0 | 0 | ps|peo| dr| SSS |
; |___|___|___|___|___|___________||___|___|___|___|___|___________|
; 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
; CNTLA0 CNTLB0
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 11 -- Read a character (wait for input)
;
; Enter with:
; C = 0x11 function code
; B = unit number
;
; Exit with:
; E = character read in
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 12 -- Write a character
;
; Enter with:
; C = 0x12 function code
; B = unit number
; E = character to write out
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 13 -- Input status (number of waiting characters)
;
; Enter with:
; C = 0x13
; B = unit number
;
; Exit with:
; E = number of characters in input queue
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 14 -- Output status (space available in output buffer)
;
; Enter with:
; C = 0x13
; B = unit number
;
; Exit with:
; E = number of empty character slots in output queue
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 15 -- Output characters until terminator
; i.e., output string
;
; Enter with:
; C = 0x15
; B = unit number
; DE = buffer address
; L = terminator (usually NUL or '$')
;
; Exit with:
; C = completion code
; All other registers preserved
;
; Errors:
; NO_ERROR Z flag is set
; ERR_ADDRESS Z flag is clear (NZ)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 16 -- Input count characters
;
; Enter with:
; C = 0x16
; B = unit number
; DE = buffer address
; HL = count of characters to input
;
; Exit with:
; C = completion code
; HL = count of characters actually read
; All other registers preserved
;
; Errors:
; NO_ERROR Z flag is set
; XXX Z flag is clear (NZ)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 17 -- Output count characters
;
; Enter with:
; C = 0x17
; B = unit number
; DE = buffer address
; HL = count of characters to put out
;
; Exit with:
; C = completion code
; HL = count of characters actually put out
; All other registers preserved
;
; Errors:
; NO_ERROR Z flag is set
; XXX Z flag is clear (NZ)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
*** IDE disk calls (c.f., SD card disk calls)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 40 -- Reset the IDE device and controller
;
; Enter with:
; C = 0x40 function code
; B = unit number (0...)
; D = flags2 values
; E = flags value
; DE == -1 means use previously set values
;
; Exit with:
; C = error code, or success=0
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 41 -- set Logical Block Address for next transfer
;
; Enter with:
; C = 0x41 function code
; B = unit number
; DE:HL = 28-bit LBA address of next transfer (R/W)
;
; Exit with:
; C = error code
;
; Errors:
; ERR_CAPACITY LBA address exceeds drive capacity
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 42 -- Read Sectors
;
; Enter with:
; C = 0x42 function code
; B = unit number
; DE = address of n*512 byte buffer
; L = number of sectors to read
;
; Exit with:
; C = 0 if no error
; DE = unchanged
; L = number of sectors read
;
; Errors:
; ERR_ADDRESS
; ERR_DISK_IO
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 43 -- Write Sectors
;
; Enter with:
; C = 0x43 function code
; B = unit number
; DE = address of n*512 byte buffer
; L = number of sectors to write
;
; Exit with:
; C = 0 if no error
; DE = unchanged
; L = number of sectors written
;
; Errors:
; ERR_ADDRESS
; ERR_DISK_IO
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 44 -- Verify Sectors
;
; Enter with:
; C = 0x44 function code
; B = unit number
; L = number of sectors to verify
;
; Exit with:
; C = 0 if no error
; L = number of sectors verified
;
; Errors:
; ERR_ADDRESS
; ERR_DISK_IO
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 45 -- Get IDE Disk Information
;
; Enter with:
; C = 0x45 function code
; B = unit number
; DE = pointer to 512 byte buffer (first call)
; if DE == null (0), then return what was previously noted
;
; Exit with:
; B = 'or' of flags and flags2
; DE:HL = sector capacity of the disk
;
;
; LBA capacity of disk noted in private instance data
; logical CHS information noted
; disk ID string noted
;
; Errors:
; ERR_ADDRESS
; ERR_TIMEOUT
; ERR_DISK_IO
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 46 -- Get Disk Geometry Information
;
; Enter with:
; C = 0x46 function code
; B = unit number
;
; Exit with:
; DE = number of cylinders
; H = number of heads per cylinder
; L = number of sectors per track
;
; Errors:
; ERR_DISK_IO
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 47 -- Get Disk Error Status
;
; Enter with:
; C = 0x47 function code
; B = unit number
;
; Exit with:
; D = contents of Status register after last operation
; E = contents of Error register after last operation
;
; Errors:
; none
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 48 -- Get Disk Type
;
; Enter with:
; C = 0x48 function code
; B = unit number
;
; Exit with:
; D = disk driver ID
; E = disk software type (may be different from Floppies)
; L = total disk units in the system
; H = disk physical type (pertinent to Floppies)
;
; Errors:
; none
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
*** SDcard disk calls (c.f., IDE disk calls)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 40 -- Reset the Disk device and controller
;
; Enter with:
; C = 0x40 function code
; B = unit number (0...)
; D = flags2 values
; E = flags value
; DE == -1 means use previously set values
;
; Exit with:
; C = error code, or success=0
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 41 -- set Logical Block Address for next transfer
;
; Enter with:
; C = 0x41 function code
; B = unit number
; DE:HL = 32-bit LBA address of next transfer (R/W)
;
; Exit with:
; C = error code
;
; Errors:
; ERR_CAPACITY LBA address exceeds drive capacity
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 42 -- Read Sectors
;
; Enter with:
; C = 0x42 function code
; B = unit number
; DE = address of n*512 byte buffer
; L = number of sectors to read
;
; Exit with:
; C = 0 if no error
; DE = unchanged
; L = number of sectors read
;
; Errors:
; ERR_ADDRESS
; ERR_NO_MEDIA
; ERR_DISK_IO
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 43 -- Write Sectors
;
; Enter with:
; C = 0x43 function code
; B = unit number
; DE = address of n*512 byte buffer
; L = number of sectors to write
;
; Exit with:
; C = 0 if no error
; DE = unchanged
; L = number of sectors written
;
; Errors:
; ERR_ADDRESS
; ERR_NO_MEDIA
; ERR_WRITE_PROT
; ERR_DISK_IO
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 44 -- Verify Sectors
;
; Enter with:
; C = 0x44 function code
; B = unit number
; L = number of sectors to verify
;
; Exit with:
; C = 0 if no error
; L = number of sectors verified
;
; Errors:
; ERR_ADDRESS
; ERR_DISK_IO
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 45 -- Get (IDE) Disk Information
;
; Enter with:
; C = 0x45 function code
; B = unit number
; DE = pointer to 512 byte buffer (36 bytes used for SD cards)
; if DE == NULL(0), then nothing is to be returned in the buffer
;
; Exit with:
; B = 'or' of flags and flags2
; DE:HL = sector capacity of the disk
;
; Buffer contains CID, CSD, OCR information from Function 40 call
;
; Errors:
; ERR_ADDRESS
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 46 -- Get Disk Geometry Information
;
; Enter with:
; C = 0x46 function code
; B = unit number
;
; Exit with:
; DE = number of cylinders
; H = number of heads per cylinder
; L = number of sectors per track
;
; Errors:
; ERR_DISK_IO
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 47 -- Get Disk Error Status
;
; Enter with:
; C = 0x47 function code
; B = unit number
;
; Exit with:
; D = contents of Status register after last operation
; E = contents of Error register after last operation
;
; Errors:
; none
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 48 -- Get Disk Type
;
; Enter with:
; C = 0x48 function code
; B = unit number
;
; Exit with:
; D = disk driver ID
; E = disk software type (may be different from Floppies)
; L = total disk units in the system
; H = disk physical type (pertinent to Floppies)
;
; Errors:
; none
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
*** CPU functions with no Unit number
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 0xF0 RESET / INITIALIZE
;
; Enter with:
; C = 0xF0
;
; Exit with:
; DE = lowest heap address
; HL = amount of heap memory in bytes
;
; Errors:
; CATASTROPHE_HEAP ; ran out of HEAP memory
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 0xF1 Get HMA
;
; Enter with:
; C = 0xF1
;
; Exit with:
; HL = start address of HBIOS stub in high memory
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 0xF2 GET/SET NVRAM
;
; Enter with:
; C = 0xF2
; B = 0 get NVRAM copy from CPU instance
; = 1 set NVRAM copy to CPU instance
; DE = destination/source buffer (31 chars)
;
; Errors:
; ERR_ADDRESS ; if address is <0x8000
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 0xF3 FIND PROTOTYPE
;
; Enter with:
; C = 0xF3
; B ID of Instance Prototype to Find
;
; Exit with:
; DE = HBIOS memory address of prototype
;
; Errors:
; ERR_NO_PROTO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 0xF4 PEEK
;
; Enter with:
; C = 0xF4
; DE = address in range 0..7FFF
;
; Exit with:
; B = Byte value at (DE)
;
; Errors:
; ERR_ADDRESS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 0xF5 POKE
;
; Enter with:
; C = 0xF5
; B = Byte value to POKE at (DE)
; DE = address in range 0..7FFF
;
; Exit with:
; nothing
;
; Errors:
; ERR_ADDRESS
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 0xF6 NEW INSTANCE
;
; Enter with:
; C = 0xF6
; DE = Instance Prototype pointer
; L = new instance device code
;
; Exit with:
; DE = new Instance pointer
; B = new Unit number
;
; Errors:
; ERR_NO_MEMORY
; ERR_NO_UNIT
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 0xF7 MALLOC
;
; Enter with:
; C = 0xF7
; DE = number of bytes to allocate from the heap
;
; Exit with:
; DE = number of bytes actually allocated
; HL = address in HBIOS memory of DE bytes
;
; Errors:
; ERR_NO_MEMORY
; DE = 0
; HL = max. allocation remaining
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 0xF8 get PHI -- get the CPU clock rate
;
; Enter with:
; C = 0xF8
;
; Exit with:
; DE:HL = CPU clock rate (phi) in Hz
;
; Errors:
; none
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 0xF9 get CPU info
; get the CPU type and encoded clock rate (PHI)
;
; Enter with:
; C = 0xF9
;
; Exit with:
; D = CPU model number (0=Z80, 1,2,3=level of Z180
; E = CPU encoded clock rate (PHI) or 0xFF if not encoded
;
; Errors:
; none
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; get BIOS info -- get BIOS information in various forms
;
; Enter with:
; C = 0xFA
; B = <subfunction code>
;
; Subfunction entry codes:
;
; Get 4 character signature
; B = 0 get 4 character signature in registers
; DE & HL D='-', E='A', H='N', L='U'
; Returns:
; DE = 0x2D41
; HL = 0x4E55
;
;
; Get 79 character BIOS version string + null
; B = 1 get 79 character BIOS version string + null
; DE = pointer to an 80 character buffer in high memory
;
; Returns:
; buffer is filled with up to 80 bytes
;
;
; Get 511 character BIOS version + copyright + license notice + null
; B = 2 get 511 long informatin + null terminator
; DE = pointer to a 512 character buffer in high memory
;
; Returns:
; buffer is filled with up to 512 bytes
;
;
; Get current execution environment (32K page codes)
; B = 3
;
; Returns:
; DE = currently executing page, ROM or RAM (usually EXEC_PAGE)
; HL = page containing UBIOS in RAM (always UBIOS_PAGE)
; (see "pages.inc" for the encodings)
;
;
; Get BIOS date and version information
; B = 4
;
; Returns:
; B = subversion load sequence number
; D = major version number
; E = minor version number in bits (0..6)
; alpha/beta indicator if bit 7 is set
; HL = BIOS date, packed (7/4/5) where Y=year-2000
; YYYYYYY MMMM DDDDD
;
;
; Get user execution environment (32K page codes)
; B = 5
;
; Returns:
; DE = low memory user RAM page (EXEC_PAGE)
; HL = high memory user RAM page (HIGH_PAGE)
; (see "pages.inc" for the encodings)
;
;
; Errors:
; ERR_ADDRESS if DE is not in the upper 32k (B==1 or 2)
; ERR_METHOD if B-reg value is not recognized
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function 0xFB Get/set lower page bank
;
; Enter with:
; C = 0xFB
;
; B = 0 get the page currently mapped into low memory
; page returned in DE
; = 1 set map the page in DE into low memory
; and return the current page in DE
; DE = page (from 'pages.inc') to map in, if B==1
;
; Exit with:
; DE = page currently mapped into low 32k memory bank
; = page previously mapped into low 32k mem. bank (set)
;
; Errors:
; ERR_METHOD if B is not 0 or 1
;
; CAUTION: This is a dangerous function. It may only be called from
; the high memory bank, since it changes the low memory mapping.
; Likewise, the stack must be in the high memory bank.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Get/set bootstrap history
;
; Enter with:
; C = 0xFC
;
; B = 0 get the saved bootstrap history
; = 1 set the bootstrap history for later retrieval
;
; Data registers to retain, if a Set
;
; Get or Set Data:
; DE = ROM page last booted (or -1, if not applicable)
; L = most recently booted disk unit number (or -1, if
; not applicable)
; Exit with:
; Registers with data, if a Get
; H = current boot disk BIOS unit number (from NVRAM)
;
; Errors:
; ERR_METHOD if B is not 0 or 1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

2
Source/BIOS/blank1024KB.dat

File diff suppressed because one or more lines are too long

2
Source/BIOS/blank512KB.dat

File diff suppressed because one or more lines are too long

273
Source/BIOS/cbios.asm

@ -83,20 +83,46 @@ CBXSIZ .EQU $ - CBX
;
; MAP LOGICAL CHARACTER DEVICES TO PHYSICAL CHARACTER DEVICES
;
; IOBYTE (0003H)
; ==============
;
; Device LST: PUN: RDR: CON:
; Bit position 7 6 5 4 3 2 1 0
;
; Dec Binary
;
; 0 00 TTY: TTY: TTY: TTY:
; 1 01 CRT: PTP: PTR: CRT:
; 2 10 LPT: UP1: UR1: BAT:
; 3 11 UL1: UP2: UR2: UC1:
;
; TTY: Teletype device (slow speed console)
; CRT: Cathode ray tube device (high speed console)
; BAT: Batch processing (input from RDR:, output to LST:)
; UC1: User-defined console
; PTR: Paper tape reader (high speed reader)
; UR1: User-defined reader #1
; UR2: User-defined reader #2
; PTP: Paper tape punch (high speed punch)
; UP1: User-defined punch #1
; UP2: User-defined punch #2
; LPT: Line printer
; UL1: User-defined list device #1
;
#IF (PLATFORM == PLT_UNA)
LD_TTY .EQU 0
LD_CRT .EQU 0
LD_TTY .EQU 0 ; -> COM0:
LD_CRT .EQU 0 ; -> COM14:
LD_BAT .EQU CIODEV_BAT
LD_UC1 .EQU 0
LD_PTR .EQU 0
LD_UR1 .EQU 0
LD_UR2 .EQU 0
LD_PTP .EQU 0
LD_UP1 .EQU 0
LD_UP2 .EQU 0
LD_LPT .EQU 0
LD_UL1 .EQU 0
LD_UC1 .EQU 0 ; -> COM1:
LD_PTR .EQU 0 ; -> COM1:
LD_UR1 .EQU 0 ; -> COM2:
LD_UR2 .EQU 0 ; -> COM3:
LD_PTP .EQU 0 ; -> COM1:
LD_UP1 .EQU 0 ; -> COM2:
LD_UP2 .EQU 0 ; -> COM3:
LD_LPT .EQU 0 ; -> LPT0:
LD_UL1 .EQU 0 ; -> LPT1:
#ELSE
@ -106,18 +132,18 @@ TTYDEV .EQU CIODEV_ASCI
TTYDEV .EQU CIODEV_UART
#ENDIF
;
LD_TTY .EQU TTYDEV
LD_CRT .EQU TTYDEV
LD_TTY .EQU TTYDEV ; -> COM0:
LD_CRT .EQU TTYDEV ; -> COM14:
LD_BAT .EQU CIODEV_BAT
LD_UC1 .EQU TTYDEV
LD_PTR .EQU TTYDEV
LD_UR1 .EQU TTYDEV
LD_UR2 .EQU TTYDEV
LD_PTP .EQU TTYDEV
LD_UP1 .EQU TTYDEV
LD_UP2 .EQU TTYDEV
LD_LPT .EQU TTYDEV
LD_UL1 .EQU TTYDEV
LD_UC1 .EQU TTYDEV ; -> COM1:
LD_PTR .EQU TTYDEV ; -> COM1:
LD_UR1 .EQU TTYDEV ; -> COM2:
LD_UR2 .EQU TTYDEV ; -> COM3:
LD_PTP .EQU TTYDEV ; -> COM1:
LD_UP1 .EQU TTYDEV ; -> COM2:
LD_UP2 .EQU TTYDEV ; -> COM3:
LD_LPT .EQU TTYDEV ; -> LPT0:
LD_UL1 .EQU TTYDEV ; -> LPT1:
;
#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))
LD_UC1 .SET CIODEV_ASCI + 1
@ -224,9 +250,7 @@ BOOT:
CALL INIT ; EXECUTE COLD BOOT CODE ROUTINE
;
LD SP,$100 ; MOVE STACK SO WE CAN INIT BUFFER AREA
; LD HL,BUFFERS ; INIT BUFFERS AREA
LD HL,INIT ; INIT BUFFERS AREA
; LD BC,CBIOS_END - BUFFERS ; SIZE OF BUFFER SPACE
LD BC,CBIOS_END - INIT ; SIZE OF BUFFER SPACE
CALL FILL ; DO IT
;
@ -243,13 +267,13 @@ WBOOT:
#IF (PLATFORM == PLT_UNA)
; RESTORE COMMAND PROCESSOR FROM UNA BIOS CACHE
LD BC,$01FB ; UNA FUNC = SET BANK
LD DE,$800D ; UBIOS_PAGE (SEE PAGES.INC)
LD DE,BID_BIOS ; UBIOS_PAGE (SEE PAGES.INC)
RST 08 ; DO IT
PUSH DE ; SAVE PREVIOUS BANK
LD HL,(CCPBUF) ; ADDRESS OF CCP BUF IN BIOS MEM
LD DE,CPM_LOC ; ADDRESS IN HI MEM OF CCP
LD BC,CCPSIZ ; SIZE OF CCP
LD BC,CCP_SIZ ; SIZE OF CCP
LDIR ; DO IT
LD BC,$01FB ; UNA FUNC = SET BANK
@ -257,13 +281,15 @@ WBOOT:
RST 08 ; DO IT
#ELSE
; RESTORE COMMAND PROCESSOR FROM CACHE IN HB BANK
LD B,BID_USR ; B = DEST BANK = USR BANK = TPA
LD C,BID_HB ; C = SRC BANK = HB BANK
CALL HB_XCOPY ; SET BANKS FOR INTERBANK COPY
LD HL,$800 ; COPY FROM FIXED LOCATION IN HB BANK
LD B,BF_SYSXCPY ; HBIOS FUNC: SYSTEM EXTENDED COPY
LD D,BID_USR ; D = DEST BANK = USR BANK = TPA
LD E,BID_BIOS ; E = SRC BANK = HB BANK
RST 08 ; SET BANKS FOR INTERBANK COPY
LD B,BF_SYSCPY ; HBIOS FUNC: SYSTEM COPY
LD HL,(CCPBUF) ; COPY FROM FIXED LOCATION IN HB BANK
LD DE,CPM_LOC ; TO CCP LOCATION IN USR BANK
LD BC,CCPSIZ ; COPY CONTENTS OF COMMAND PROCESSOR
CALL HB_COPY ; DO IT
LD IX,CCP_SIZ ; COPY CONTENTS OF COMMAND PROCESSOR
RST 08 ; DO IT
#ENDIF
;
; FALL THRU TO INVOKE CP/M
@ -275,9 +301,11 @@ GOCPM:
LD HL,SECBUF ; ADDRESS OF PHYSICAL SECTOR BUFFER
LD (BUFADR),HL ; SAVE IT IN BUFADR FOR LATER
#ELSE
; GET AND SAVE PHYSICAL DISK XFR BUFFER LOCATION
; ASSUMED TO BE IN HBIOS BANK (BID_HB)
LD B,BF_DIOGETBUF ; GET DISK BUFFER ADR IN HBIOS DRIVER BANK
; CALL BF_DIOSETBUF WITH A PARM OF ZERO TO CAUSE IT TO RESET
; THE PHYSICAL DISK BUFFER TO THE DEFAULT LOCATION PRE-ALLOCATED
; INSIDE OF THE HBIOS BANK. THE ADDRESS IS RETURNED IN HL AND SAVED.
LD B,BF_DIOSETBUF ; GET DISK BUFFER ADR IN HBIOS DRIVER BANK
LD HL,0
RST 08 ; MAKE HBIOS CALL
LD (BUFADR),HL ; RECORD THE BUFFER ADDRESS
#ENDIF
@ -301,7 +329,7 @@ GOCPM:
; CALL 5 -> INVOKE BDOS
LD ($0005),A ; JP OPCODE AT $0005
LD HL,BDOS ; GET BDOS ENTRY ADDRESS
LD HL,BDOS_LOC + 6 ; GET BDOS ENTRY ADDRESS
LD ($0006),HL ; PUT IT AT $0006
;
; INSTALL ROMWBW CBIOS PAGE ZERO STAMP AT $40
@ -329,7 +357,7 @@ CURDSK:
LD A,(CDISK) ; GET CURRENT USER/DISK
GOCCP:
LD C,A ; SETUP C WITH CURRENT USER/DISK, ASSUME IT IS OK
JP CCP ; JUMP TO COMMAND PROCESSOR
JP CCP_ENT ; JUMP TO COMMAND PROCESSOR
;
;__________________________________________________________________________________________________
GOMON:
@ -521,7 +549,7 @@ CIO_DISP:
JR NC,CIO_DISP1 ; HANDLE SPECIAL DEVICE
RST 08 ; RETURN VIA COMPLETION ROUTINE SET AT START
RET
CIO_DISP1:
; HANDLE SPECIAL DEVICES
AND $F0 ; ISOLATE DEVICE
@ -563,11 +591,11 @@ CIO_NUL:
NUL_IN:
LD E,$1B ; RETURN EOF
NUL_OUT:
RET
RET ; SWALLOW CHARACTER
;
NUL_IST:
NUL_OST:
OR $FF ; A=$FF & NZ SET
OR $FF ; A=$FF & NZ (READY)
RET
;
;==================================================================================================
@ -797,7 +825,6 @@ BLKRW7:
; CHECK WRITE TYPE, IF WRT_DIR, FORCE THE PHYSICAL WRITE
LD A,(WRTYPE) ; GET WRITE TYPE
CP WRT_DIR ; 1 = DIRECTORY WRITE
; JR Z,BLKFLSH ; FLUSH PENDING WRITES AND RETURN STATUS
JP Z,BLKFLSH ; FLUSH PENDING WRITES AND RETURN STATUS
XOR A ; ALL IS WELL, SET RETURN CODE 0
@ -990,13 +1017,17 @@ BLK_BLOCK:
LDIR
RET
#ELSE
LD C,BID_USR ; C=SRC=USER BANK=TPA
LD B,BID_HB ; B=DEST=HBIOS
CALL HB_XCOPY ; HB_XCOPY
CALL BLK_SETUP ; SETUP SOURCE AND DESTINATION
EX DE,HL ; SWAP HL/DE FOR BLOCK OPERATION
LD BC,128 ; DMA BUFFER SIZE
CALL HB_COPY ; HB_COPY (INTERBANK COPY)
LD B,BF_SYSXCPY ; HBIOS FUNC: SYSTEM EXTENDED COPY
LD E,BID_USR ; E=SRC=USER BANK=TPA
LD D,BID_BIOS ; D=DEST=HBIOS
RST 08 ; SET BANKS FOR INTERBANK COPY
CALL BLK_SETUP ; SETUP SOURCE AND DESTINATION
LD B,BF_SYSCPY ; HBIOS FUNC: SYSTEM COPY
EX DE,HL ; SWAP HL/DE FOR BLOCK OPERATION
PUSH IX ; SAVE IX
LD IX,128 ; DMA BUFFER SIZE
RST 08 ; DO IT
POP IX ; RESTORE IX
RET
#ENDIF
;
@ -1011,12 +1042,16 @@ BLK_DEBLOCK:
LDIR
RET
#ELSE
LD C,BID_HB ; C=SRC=HBIOS
LD B,BID_USR ; B=DEST=USER BANK=TPA
CALL HB_XCOPY ; HB_XCOPY
CALL BLK_SETUP ; SETUP SOURCE AND DESTINATION
LD BC,128 ; DMA BUFFER SIZE
CALL HB_COPY ; HB_COPY (INTERBANK COPY)
LD B,BF_SYSXCPY ; HBIOS FUNC: SYSTEM EXTENDED COPY
LD E,BID_BIOS ; C=SRC=HBIOS
LD D,BID_USR ; B=DEST=USER BANK=TPA
RST 08 ; DO IT
CALL BLK_SETUP ; SETUP SOURCE AND DESTINATION
LD B,BF_SYSCPY ; HBIOS FUNC: SYSTEM COPY
PUSH IX ; SAVE IX
LD IX,128 ; DMA BUFFER SIZE
RST 08 ; DO IT
POP IX ; RESTORE IX
RET
#ENDIF
;
@ -1102,14 +1137,15 @@ DSK_SELECT:
LD H,65 ; H = TRACKS PER SLICE, E = SLICE NO
CALL MULT8 ; HL := H * E (TOTAL TRACK OFFSET)
LD (SEKOFF),HL ; SAVE NEW TRACK OFFSET
;
; RESTORE DE TO BC (FOR ACCESS TO DRIVE LOGIN BIT)
POP BC ; GET ORIGINAL E INTO B
;
#IF (PLATFORM != PLT_UNA)
;
; CHECK IF THIS IS LOGIN, IF NOT, BYPASS MEDIA DETECTION
; FIX: WHAT IF PREVIOUS MEDIA DETECTION FAILED???
POP BC ; GET ORIGINAL E INTO B
BIT 0,B ; TEST DRIVE LOGIN BIT
#IF (PLATFORM == PLT_UNA)
JR DSK_SELECT2 ; NO MEDIA DETECTION FOR UNA
#ENDIF
JR NZ,DSK_SELECT2 ; BYPASS MEDIA DETECTION
;
; DETERMINE MEDIA IN DRIVE
@ -1138,6 +1174,7 @@ DSK_SELECT:
LD (HL),E ; SET LSB OF DPB IN DPH
INC HL ; BUMP TO MSB
LD (HL),D ; SET MSB OF DPB IN DPH
#ENDIF
;
DSK_SELECT2:
LD HL,(SEKDPH) ; HL = DPH ADDRESS FOR CP/M
@ -1150,7 +1187,7 @@ DSK_STATUS:
#IF (PLATFORM == PLT_UNA)
XOR A ; ASSUME OK FOR NOW
RET ; RETURN
#ENDIF
#ELSE
; C HAS CPM DRIVE, LOOKUP DEVICE/UNIT AND CHECK FOR INVALID DRIVE
CALL DSK_GETINF ; B = DEVICE/UNIT
RET NZ ; INVALID DRIVE ERROR
@ -1160,6 +1197,7 @@ DSK_STATUS:
LD B,BF_DIOST ; B := FUNCTION: STATUS
RST 08
RET
#ENDIF
;
;
;
@ -1217,11 +1255,6 @@ DSK_IO2:
LD DE,(BUFADR) ; SET BUFFER ADDRESS
LD HL,1 ; 1 SECTOR
;CALL PC_SPACE
;LD A,B
;CALL PRTHEXBYTE
RST 08
CALL NZ,PANIC
XOR A ; SET FLAGS BASED ON RESULT
@ -1382,7 +1415,7 @@ STR_SEC .DB " SEC=$"
;
SECADR .DW 0 ; ADDRESS OF SECTOR IN ROM/RAM PAGE
DEFDRIVE .DB 0 ; DEFAULT DRIVE
CCPBUF .DW 0 ; ADDRESS OF CCP BUF IN UNA BIOS
CCPBUF .DW $7000 ; ADDRESS OF CCP BUF IN BIOS BANK
;
; DOS DISK VARIABLES
;
@ -1443,11 +1476,11 @@ UNASPT: .DW 0 ; SECTORS PER TRACK
; DISK CONTROL STRUCTURES (DPB, DPH)
;==================================================================================================
;
RAMBLKS .EQU (((BID_RAMDN - BID_RAMD + 1) * 32) / 2)
RAMBLKS .EQU (((BID_RAMDN - BID_RAMD0 + 1) * 32) / 2)
CKS_RAM .EQU 0 ; CKS: 0 FOR NON-REMOVABLE MEDIA
ALS_RAM .EQU ((RAMBLKS + 7) / 8) ; ALS: BLKS / 8 (ROUNDED UP)
;
ROMBLKS .EQU (((BID_ROMDN - BID_ROMD + 1) * 32) / 2)
ROMBLKS .EQU (((BID_ROMDN - BID_ROMD0 + 1) * 32) / 2)
CKS_ROM .EQU 0 ; CKS: 0 FOR NON-REMOVABLE MEDIA
ALS_ROM .EQU ((ROMBLKS + 7) / 8) ; ALS: BLKS / 8 (ROUNDED UP)
;
@ -1660,7 +1693,7 @@ DPB_FD111:
.DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 60 SEC/TRK) = 15K
;
#IF (PLATFORM == PLT_UNA)
SECBUF .FILL 512,0 ; PHYSICAL DISK SECTOR BUFFER
SECBUF .FILL 512,0 ; PHYSICAL DISK SECTOR BUFFER
#ENDIF
;
;==================================================================================================
@ -1669,7 +1702,7 @@ SECBUF .FILL 512,0 ; PHYSICAL DISK SECTOR BUFFER
;
;BUFFERS:
;
BUFPOOL .EQU $ ; START OF BUFFER POOL
BUFPOOL .EQU $ ; START OF BUFFER POOL
;
;==================================================================================================
; COLD BOOT INITIALIZATION
@ -1679,14 +1712,10 @@ BUFPOOL .EQU $ ; START OF BUFFER POOL
;
;==================================================================================================
;
; .ORG BUFFERS
.FILL 16 * 4,0 ; RESERVED FOR DRVMAP TABLE
.FILL 16 * 16,0 ; RESERVED FOR DPH TABLE
;
INIT:
; SAVE INCOMING BOOT DEVICE/UNIT & LU
LD (BOOTDL),DE ; D -> BOOTDEV, E -> BOOTLU
; THIS INIT CODE WILL BE OVERLAID, SO WE ARE GOING
; TO MODIFY THE BOOT ENTRY POINT TO CAUSE A PANIC
; TO EASILY IDENTIFY IF SOMETHING TRIES TO INVOKE
@ -1699,7 +1728,7 @@ INIT:
#IF (PLATFORM == PLT_UNA)
; MAKE SURE UNA EXEC PAGE IS ACTIVE
LD BC,$01FB ; UNA FUNC = SET BANK
LD DE,$800E ; SWITCH BACK TO EXEC BANK
LD DE,BID_USR ; SWITCH BACK TO EXEC BANK
CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE)
; INSTALL UNA INVOCATION VECTOR FOR RST 08
@ -1707,6 +1736,17 @@ INIT:
LD (8),A ; STORE AT 0x0008
LD HL,($FFFE) ; UNA ENTRY VECTOR
LD (9),HL ; STORE AT 0x0009
#ELSE
; MAKE SURE USER BANK IS ACTIVE
LD B,BF_SYSSETBNK
LD C,BID_USR
CALL $FFF0
; INSTALL HBIOS INVOCATION VECTOR FOR RST 08
LD A,$C3 ; JP INSTRUCTION
LD (8),A ; STORE AT 0x0008
LD HL,($FFF1) ; HBIOS ENTRY VECTOR
LD (9),HL ; STORE AT 0x0009
#ENDIF
; PARAMETER INITIALIZATION
@ -1736,19 +1776,19 @@ INIT1:
#IF (PLATFORM == PLT_UNA)
; SAVE COMMAND PROCESSOR IMAGE TO MALLOCED CACHE IN UNA BIOS PAGE
LD C,$F7 ; UNA MALLOC
LD DE,CCPSIZ ; SIZE OF CCP
LD DE,CCP_SIZ ; SIZE OF CCP
RST 08 ; DO IT
CALL NZ,PANIC ; BIG PROBLEM
LD (CCPBUF),HL ; SAVE THE ADDRESS (IN BIOS MEM)
LD BC,$01FB ; UNA FUNC = SET BANK
LD DE,$800D ; UBIOS_PAGE (SEE PAGES.INC)
LD DE,BID_BIOS ; UBIOS_PAGE (SEE PAGES.INC)
RST 08 ; DO IT
PUSH DE ; SAVE PREVIOUS BANK
LD HL,CPM_LOC ; ADDRESS IN HI MEM OF CCP
LD DE,(CCPBUF) ; ADDRESS OF CCP BUF IN BIOS MEM
LD BC,CCPSIZ ; SIZE OF CCP
LD BC,CCP_SIZ ; SIZE OF CCP
LDIR ; DO IT
LD BC,$01FB ; UNA FUNC = SET BANK
@ -1756,13 +1796,15 @@ INIT1:
RST 08 ; DO IT
#ELSE
; SAVE COMMAND PROCESSOR TO DEDICATED CACHE IN RAM BANK 1
LD C,BID_USR ; B = SRC BANK = USR BANK = TPA
LD B,BID_HB ; C = DEST BANK = HB BANK
CALL HB_XCOPY ; SET BANKS FOR INTERBANK COPY
LD B,BF_SYSXCPY ; HBIOS FUNC: SYSTEM EXTENDED COPY
LD E,BID_USR ; E = SRC BANK = USR BANK = TPA
LD D,BID_BIOS ; D = DEST BANK = HB BANK
RST 08 ; DO IT
LD B,BF_SYSCPY ; HBIOS FUNC: SYSTEM COPY
LD HL,CPM_LOC ; COPY FROM CCP LOCATION IN USR BANK
LD DE,$0800 ; TO FIXED LOCATION IN HB BANK
LD BC,CCPSIZ ; COPY CONTENTS OF COMMAND PROCESSOR
CALL HB_COPY ; DO IT
LD DE,(CCPBUF) ; TO FIXED LOCATION IN HB BANK
LD IX,CCP_SIZ ; COPY CONTENTS OF COMMAND PROCESSOR
RST 08 ; DO IT
#ENDIF
; DISK SYSTEM INITIALIZATION
@ -1788,7 +1830,7 @@ INIT1:
;
; SETUP AUTOSTART COMMAND
LD HL,CMD ; ADDRESS OF STARTUP COMMAND
LD DE,CCP+7 ; START OF COMMAND BUFFER IN CCP
LD DE,CCP_LOC + 7 ; START OF COMMAND BUFFER IN CCP
LD BC,CMDLEN ; LENGTH OF AUTOSTART COMMAND
LDIR ; INSTALL IT
;
@ -1815,7 +1857,7 @@ MD_INIT:
;
#IF (CLRRAMDISK != CLR_NEVER)
LD BC,$01FB ; UNA FUNC = SET BANK
LD DE,$8000 ; FIRST BANK OF RAM DISK
LD DE,BID_RAMD0 ; FIRST BANK OF RAM DISK
CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE)
#IF (CLRRAMDISK == CLR_AUTO)
@ -1839,21 +1881,15 @@ CLRRAM1:
JR CLRRAM3 ; ALL ENTRIES VALID, BYPASS INIT
CLRRAM2:
#ENDIF
; LD A,BID_USR ; SWITCH BACK TO USR BANK
; CALL HB_SETBNK ; .. SO WRITESTR WILL WORK
LD BC,$01FB ; UNA FUNC = SET BANK
LD DE,$800E ; SWITCH BACK TO EXEC BANK FOR WRITESTR
LD DE,BID_USR ; SWITCH BACK TO EXEC BANK FOR WRITESTR
CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE)
LD DE,STR_INITRAMDISK ; RAM DISK INIT MESSAGE
CALL WRITESTR ; DISPLAY IT
; LD A,BID_RAMD ; SWITCH BACK TO FIRST BANK
; CALL HB_SETBNK ; .. OF RAM DISK
LD BC,$01FB ; UNA FUNC = SET BANK
LD DE,$8000 ; FIRST BANK OF RAM DISK
LD DE,BID_RAMD0 ; FIRST BANK OF RAM DISK
CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE)
LD HL,0 ; SOURCE ADR FOR FILL
@ -1861,11 +1897,8 @@ CLRRAM2:
LD A,$E5 ; FILL VALUE
CALL FILL ; DO IT
CLRRAM3:
; LD A,BID_USR ; USR BANK (TPA)
; CALL HB_SETBNK ; SELECT IT
LD BC,$01FB ; UNA FUNC = SET BANK
LD DE,$800E ; SWITCH BACK TO EXEC BANK
LD DE,BID_USR ; SWITCH BACK TO EXEC BANK
CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE)
#ENDIF
@ -1876,8 +1909,9 @@ CLRRAM3:
; FILL FIRST 8K OF RAM DISK TRACK 1 WITH 'E5'
;
#IF (CLRRAMDISK != CLR_NEVER)
LD A,BID_RAMD ; FIRST BANK OF RAM DISK
CALL HB_SETBNK ; SELECT IT
LD B,BF_SYSSETBNK ; HBIOS FUNC: SET BANK
LD C,BID_RAMD0 ; FIRST BANK OF RAM DISK
CALL $FFF0 ; DO IT (RST 08 NOT SAFE)
#IF (CLRRAMDISK == CLR_AUTO)
; CHECK FIRST 32 DIRECTORY ENTRIES. IF ANY START WITH AN INVALID
@ -1900,19 +1934,22 @@ CLRRAM1:
JR CLRRAM3 ; ALL ENTRIES VALID, BYPASS INIT
CLRRAM2:
#ENDIF
LD A,BID_USR ; SWITCH BACK TO USR BANK
CALL HB_SETBNK ; .. SO WRITESTR WILL WORK
LD B,BF_SYSSETBNK ; HBIOS FUNC: SET BANK
LD C,BID_USR ; SWITCH BACK TO USR BANK
CALL $FFF0 ; DO IT (RST 08 NOT SAFE)
LD DE,STR_INITRAMDISK ; RAM DISK INIT MESSAGE
CALL WRITESTR ; DISPLAY IT
LD A,BID_RAMD ; SWITCH BACK TO FIRST BANK
CALL HB_SETBNK ; .. OF RAM DISK
LD B,BF_SYSSETBNK ; HBIOS FUNC: SET BANK
LD C,BID_RAMD0 ; SWITCH BACK TO FIRST BANK
CALL $FFF0 ; DO IT (RST 08 NOT SAFE)
LD HL,0 ; SOURCE ADR FOR FILL
LD BC,$2000 ; LENGTH OF FILL IS 8K
LD A,$E5 ; FILL VALUE
CALL FILL ; DO IT
CLRRAM3:
LD A,BID_USR ; USR BANK (TPA)
CALL HB_SETBNK ; SELECT IT
LD B,BF_SYSSETBNK ; HBIOS FUNC: SET BANK
LD C,BID_USR ; USR BANK (TPA)
CALL $FFF0 ; DO IT (RST 08 NOT SAFE)
#ENDIF
;
#ENDIF
@ -1925,6 +1962,16 @@ CLRRAM3:
;
DRV_INIT:
;
; PERFORM UBIOS SPECIFIC INITIALIZATION
; BUILD DRVMAP BASED ON AVAILABLE UBIOS DISK DEVICE LIST
;
; GET BOOT DEVICE/UNIT/LU INFO
LD BC,$00FC ; UNA FUNC: GET BOOTSTRAP HISTORY
RST 08 ; CALL UNA
LD D,L ; SAVE L AS DEVICE/UNIT
LD E,0 ; LU IS ZERO
LD (BOOTVOL),DE ; D -> DEVICE/UNIT, E -> LU
;
; PERFORM UNA BIOS SPECIFIC INITIALIZATION
; UPDATE DRVMAP BASED ON AVAILABLE UNA UNITS
;
@ -1993,6 +2040,12 @@ DRV_INIT:
;
; PERFORM HBIOS SPECIFIC INITIALIZATION
; BUILD DRVMAP BASED ON AVAILABLE HBIOS DISK DEVICE LIST
;
; GET BOOT DEVICE/UNIT/LU INFO
LD B,BF_SYSATTR ; HBIOS FUNC: GET/SET ATTR
LD C,AID_BOOTVOL ; ATTRIB ID FOR BOOT DEVICE
RST 08 ; GET THE VALUE
LD (BOOTVOL),DE ; D -> DEVICE/UNIT, E -> LU
;
; SETUP THE DRVMAP STRUCTURE
LD HL,(BUFTOP) ; GET CURRENT BUFFER TOP
@ -2116,7 +2169,7 @@ DPH_INIT1:
PUSH HL ; SAVE DRIVE MAP POINTER
PUSH AF ; SAVE DEV/UNIT
; MATCH AND SAVE DEFAULT DRIVE BASED ON BOOT DEVICE/UNIT/SLICE
LD HL,BOOTDEV ; POINT TO BOOT DEVICE/UNIT
LD HL,BOOTVOL + 1 ; POINT TO BOOT DEVICE/UNIT
LD A,D ; LOAD CURRENT DEVICE/UNIT
CP (HL) ; MATCH?
JR NZ,DPH_INIT1A ; BYPASS IF NOT BOOT DEVICE/UNIT
@ -2138,7 +2191,6 @@ DPH_INIT1A:
; STORE THE DPH POINTER IN DRIVE MAP
POP DE ; RESTORE DPH ADDRESS TO DE
POP HL ; RESTORE DRIVE MAP POINTER TO HL
;RET NZ ; ABORT ON ERROR
JR Z,DPH_INIT2 ; IF MAKDPH OK, CONTINUE
LD DE,0 ; ... OTHERWISE ZERO OUT THE DPH POINTER
DPH_INIT2:
@ -2420,9 +2472,7 @@ DEV15 .EQU DEVUNK
DPHTOP .DW 0 ; CURRENT TOP OF DPH POOL
DIRBUF .DW 0 ; DIR BUF POINTER
BUFTOP .DW BUFPOOL ; CURRENT TOP OF BUF POOL
BOOTDL:
BOOTLU .DB 0
BOOTDEV .DB 0
BOOTVOL .DW ; BOOT VOLUME, MSB=BOOT DEVICE/UNIT, LSB=BOOT LU
;
STR_INITRAMDISK .DB "\r\nFormatting RAMDISK...$"
STR_LDR .DB "\r\n $"
@ -2444,5 +2494,8 @@ SLACK .EQU (CBIOS_END - BUFPOOL)
.ECHO "CBIOS total space used: "
.ECHO $ - CBIOS_LOC
.ECHO " bytes.\n"
;
; PAD OUT AREA RESERVED FOR HBIOS PROXY
.FILL $10000 - $
;
.END

2
Source/BIOS/dbgmon.asm

@ -104,7 +104,7 @@ DOBOOT:
CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE)
#ELSE
LD A,BID_BOOT
CALL PGSEL
CALL BNKSEL
#ENDIF
; JUMP TO RESTART ADDRESS
JP 0000H

8
Source/BIOS/diskdefs

@ -271,11 +271,11 @@ diskdef interak
os 2.2
end
# RomWBW 512KB ROM (64KB reserved, 448KB ROM Disk)
# RomWBW 512KB ROM (128KB reserved, 384KB ROM Disk)
diskdef wbw_rom512
seclen 512
tracks 14
tracks 12
sectrk 64
blocksize 2048
maxdir 256
@ -284,11 +284,11 @@ diskdef wbw_rom512
os 2.2
end
# RomWBW 1024KB ROM (64KB reserved, 960KB ROM Disk)
# RomWBW 1024KB ROM (128KB reserved, 896KB ROM Disk)
diskdef wbw_rom1024
seclen 512
tracks 30
tracks 28
sectrk 64
blocksize 2048
maxdir 256

42
Source/BIOS/dsrtc.asm

@ -142,14 +142,19 @@ DSRTC_GETTIM:
LD HL,DSRTC_TIMBUF ; POINT TO TIME BUFFER
CALL DSRTC_CLK2TIM ; CONVERT CLOCK TO TIME
;
LD C,BID_HB ; SOURCE BANK IS OUR BANK
CALL HBXX_GETBNK ; GET USER BANK
LD B,A ; PUT IN B AS DEST BANK
CALL HBXX_XCOPY ; SETUP COPY BANKS
LD HL,DSRTC_TIMBUF ; SOURCE IS TIMBUF
POP DE ; DESTINATION IS PASSED IN
LD BC,6 ; 6 BYTES
CALL HBXX_COPY ; DO IT
; NOW COPY TO REAL DESTINATION (INTERBANK SAFE)
; LD C,BID_BIOS ; SOURCE BANK IS HBIOS
; LD A,(HB_CURBNK) ; GET CURRENT BANK
; LD B,A ; .. AND USE AS DEST BANK
; LD (HB_SRCBNK),BC ; SET COPY BANKS
LD A,BID_BIOS ; COPY FROM BIOS BANK
LD (HB_SRCBNK),A ; SET IT
LD A,(HBX_INVBNK) ; COPY TO CURRENT USER BANK
LD (HB_DSTBNK),A ; SET IT
LD HL,DSRTC_TIMBUF ; SOURCE ADR
POP DE ; DEST ADR
LD BC,6 ; LENGTH IS 6 BYTES
CALL BNKCPY ; COPY THE CLOCK DATA
;
; CLEAN UP AND RETURN
XOR A ; SIGNAL SUCCESS
@ -164,13 +169,17 @@ DSRTC_GETTIM:
DSRTC_SETTIM:
;
; COPY INCOMING TIME DATA TO OUR TIME BUFFER
CALL HBXX_GETBNK
LD C,A
LD B,BID_HB
CALL HBXX_XCOPY
LD DE,DSRTC_TIMBUF
LD BC,6
CALL HBXX_COPY
; LD A,(HB_CURBNK) ; GET CURRENT BANK
; LD C,A ; .. AND USE AS SOURCE BANK
; LD B,BID_BIOS ; DESTINATION BANK IS HBIOS
; LD (HB_SRCBNK),BC ; SET COPY BANKS
LD A,(HBX_INVBNK) ; COPY FROM CURRENT USER BANK
LD (HB_SRCBNK),A ; SET IT
LD A,BID_BIOS ; COPY TO BIOS BANK
LD (HB_DSTBNK),A ; SET IT
LD DE,DSRTC_TIMBUF ; DEST ADR
LD BC,6 ; LENGTH IS 6 BYTES
CALL BNKCPY ; COPY THE CLOCK DATA
;
; WRITE TO CLOCK
LD HL,DSRTC_TIMBUF ; POINT TO TIME BUFFER
@ -226,7 +235,8 @@ DSRTC_TIM2CLK:
LD A,(HL)
LD (DSRTC_SEC),A
POP HL
XOR A
CALL TIMDOW
INC A ; CONVERT FROM 0-6 TO 1-7
LD (DSRTC_DAY),A
RET
;

21
Source/BIOS/fd.asm

@ -15,6 +15,13 @@ FDC_DIR: .EQU 038H ; DATA INPUT REGISTER
FDC_DOR: .EQU 03AH ; DIGITAL OUTPUT REGISTER (LATCH)
FDC_DMA: .EQU 03CH ; PSEUDO DMA DATA PORT
#ENDIF
#IF (FDMODE = FDMODE_ZETA2)
FDC_MSR: .EQU 030H ; 8272 MAIN STATUS REGISTER
FDC_DATA: .EQU 031H ; 8272 DATA PORT
FDC_DOR: .EQU 038H ; DIGITAL OUTPUT REGISTER
FDC_DCR: .EQU 028H ; CONFIGURATION CONTROL REGISTER
FDC_TC .EQU 038H ; TERMINAL COUNT (W/ DACK)
#ENDIF
#IF (FDMODE == FDMODE_DIDE)
FDC_BID: .EQU 00100000B ; IO RANGE 20H-3FH
FDC_MSR: .EQU FDC_BID | 01010B ; 8272 MAIN STATUS REGISTER
@ -296,15 +303,15 @@ DOR_BR500 .EQU 10100010B ; 500KBPS W/ MOTOR ON
DOR_INIT .EQU 10100000B ; INITIAL DEFAULT LATCH VALUE
#ENDIF
;
; *** DIDE/N8 ***
; *** DIDE/N8/ZETA V2 ***
;
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8))
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2))
DOR_INIT .EQU 00001100B ; SOFT RESET INACTIVE, DMA ENABLED
DOR_BR250 .EQU DOR_INIT
DOR_BR500 .EQU DOR_INIT
#ENDIF
;
; DCR (ONLY APPLIES TO DIDE AND N8)
; DCR (ONLY APPLIES TO DIDE, N8, AND ZETA V2)
;
DCR_BR250 .EQU 01H ; 250KBPS
DCR_BR500 .EQU 00H ; 500KBPS
@ -968,7 +975,7 @@ FC_SETDOR
;
; SET FST_DCR
;
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8))
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2))
;
FC_SETDCR
LD (FST_DCR),A
@ -1000,7 +1007,7 @@ FC_RESETFDC:
#IF ((FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3))
RES 7,A
#ENDIF
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8))
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2))
LD A,0
#ENDIF
CALL FC_SETDOR
@ -1015,7 +1022,7 @@ FC_RESETFDC:
; PULSE TERMCT TO TERMINATE ANY ACTIVE EXECUTION PHASE
;
FC_PULSETC:
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8))
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2)
IN A,(FDC_TC)
#ELSE
LD A,(FST_DOR)
@ -1051,7 +1058,7 @@ FC_MOTORON:
BIT 1,A ; SET FLAGS SET BASED ON CURRENT MOTOR BIT
RET Z ; MOTOR WAS PREVIOUSLY ON, WE ARE DONE
#ENDIF
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8))
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2))
; SETUP DCR FOR DIDE HARDWARE
LD A,(FCD_DCR) ; GET NEW DCR VALUE
CALL FC_SETDCR ; AND IMPLEMENT IT

708
Source/BIOS/hbios.asm

@ -2,37 +2,129 @@
;==================================================================================================
; HBIOS
;==================================================================================================
;
.ORG $1000
;
; INCLUDE GENERIC STUFF
;
#INCLUDE "std.asm"
;
.ORG 0
;
;==================================================================================================
; ENTRY VECTORS (JUMP TABLE)
; NORMAL PAGE ZERO SETUP, RET/RETI/RETN AS APPROPRIATE
;==================================================================================================
;
.FILL (000H - $),0FFH ; RST 0
JP HB_START
.DW ROM_SIG
.FILL (008H - $),0FFH ; RST 8
JP HB_DISPATCH
.FILL (010H - $),0FFH ; RST 10
RET
.FILL (018H - $),0FFH ; RST 18
RET
.FILL (020H - $),0FFH ; RST 20
RET
.FILL (028H - $),0FFH ; RST 28
RET
.FILL (030H - $),0FFH ; RST 30
RET
.FILL (038H - $),0FFH ; INT
RETI
.FILL (066H - $),0FFH ; NMI
RETN
;
ROM_SIG:
.DB $76, $B5 ; 2 SIGNATURE BYTES
.DB 1 ; STRUCTURE VERSION NUMBER
.DB 7 ; ROM SIZE (IN MULTIPLES OF 4KB, MINUS ONE)
.DW NAME ; POINTER TO HUMAN-READABLE ROM NAME
.DW AUTH ; POINTER TO AUTHOR INITIALS
.DW DESC ; POINTER TO LONGER DESCRIPTION OF ROM
.DB 0, 0, 0, 0, 0, 0 ; RESERVED FOR FUTURE USE; MUST BE ZERO
;
NAME .DB "ROMWBW v", BIOSVER, ", ", BIOSBLD, ", ", TIMESTAMP, 0
AUTH .DB "WBW",0
DESC .DB "ROMWBW v", BIOSVER, ", Copyright 2014, Wayne Warthen, GNU GPL v3", 0
;
.FILL ($100 - $),$FF ; PAD REMAINDER OF PAGE ZERO
;
;==================================================================================================
; BUILD META DATA
;==================================================================================================
;
.DB 'W',~'W' ; MARKER
.DB RMJ << 4 | RMN ; FIRST BYTE OF VERSION INFO
.DB RUP << 4 | RTP ; SECOND BYTE OF VERSION INFO
;
.DB PLATFORM
.DB CPUFREQ
.DW RAMSIZE
.DW ROMSIZE
;
.DB BID_COM
.DB BID_USR
.DB BID_BIOS
.DB BID_AUX
.DB BID_RAMD0
.DB BID_RAMDN
.DB BID_ROMD0
.DB BID_ROMDN
;
.FILL ($200 - $),$FF ; PAD REMAINDER OF PAGE ONE
;
;==================================================================================================
; HBIOS CORE
;==================================================================================================
;
;
;==================================================================================================
; ENTRY VECTORS (JUMP TABLE)
;==================================================================================================
;
JP HB_START ; HBIOS INITIALIZATION
JP HB_DISPATCH ; VECTOR TO DISPATCHER
;
;==================================================================================================
; HBIOS INTERNAL PROXY JUMP TABLE
; CHARACTER DEVICE LIST
;==================================================================================================
;
; THE FOLLOWING VECTOR TABLE IS USED BY HBIOS TO CALLBACK TO THE
; HBIOS PROXY INTERNALLY. IT SHOULD NEVER BE CALLED OUTSIDE OF HBIOS.
; IT IS PROVIDED SO THAT THE LOCATION OF THE HBIOS PROXY CAN BE LOCATED
; AT ARBITRARY ADDRESSES AND THE TABLE BELOW ADJUSTED AS NEEDED.
#DEFINE CHRENT(DEV,UNIT) \
#DEFCONT .DB DEV | UNIT
;
.DB CHRCNT
CHRMAP:
#IFDEF CHRLST
CHRLST
#ELSE
#IF ASCIENABLE
CHRENT(CIODEV_ASCI,0) ; ASCI0:
CHRENT(CIODEV_ASCI,1) ; ASCI1:
#ENDIF
#IF UARTENABLE
#IF (UARTCNT >= 1)
CHRENT(CIODEV_UART,0) ; UART0:
#ENDIF
#IF (UARTCNT >= 2)
CHRENT(CIODEV_UART,1) ; UART1:
#ENDIF
#IF (UARTCNT >= 3)
CHRENT(CIODEV_UART,2) ; UART2:
#ENDIF
#IF (UARTCNT >= 4)
CHRENT(CIODEV_UART,3) ; UART3:
#ENDIF
#ENDIF
#ENDIF
;
HBXX:
HBXX_SETBNK JP HBXI_SETBNK
HBXX_GETBNK JP HBXI_GETBNK
HBXX_COPY JP HBXI_COPY
HBXX_XCOPY JP HBXI_XCOPY
CHRCNT .EQU ($ - CHRMAP) / 1
.ECHO CHRCNT
.ECHO " character devices defined.\n"
;
;==================================================================================================
; HBIOS INTERNAL PROXY JUMP TABLE
; DISK DEVICE LIST
;==================================================================================================
;
#DEFINE DEVENT(DEV,UNIT) \
@ -98,7 +190,7 @@ DEVMAP:
;
DEVCNT .EQU ($ - DEVMAP) / 1
.ECHO DEVCNT
.ECHO " devices defined.\n"
.ECHO " disk devices defined.\n"
;
;==================================================================================================
; SYSTEM INITIALIZATION
@ -122,24 +214,6 @@ HB_START:
CALL PRTDEC
PRTS("KB$")
;
; INSTALL HBIOS PROXY IN UPPER MEMORY
;
LD HL,HBX_IMG ; HL := SOURCE OF HBIOS PROXY IMAGE
LD DE,HBX_LOC ; DE := DESTINATION TO INSTALL IT
LD BC,HBX_SIZ ; SIZE
LDIR ; DO THE COPY
;
; UDPATE THE PROXY CALLBACK VECTOR TABLE
;
LD HL,HBXI_SETBNK
LD (HBXX_SETBNK + 1),HL
LD HL,HBXI_GETBNK
LD (HBXX_GETBNK + 1),HL
LD HL,HBXI_COPY
LD (HBXX_COPY + 1),HL
LD HL,HBXI_XCOPY
LD (HBXX_XCOPY + 1),HL
;
; DURING INITIALIZATION, CONSOLE IS ALWAYS PRIMARY SERIAL PORT
; POST-INITIALIZATION, WILL BE SWITCHED TO USER CONFIGURED CONSOLE
;
@ -167,7 +241,7 @@ INITSYS2:
;
; SET UP THE DEFAULT DISK BUFFER ADDRESS
;
LD HL,HBX_IMG ; DEFAULT DISK XFR BUF ADDRESS
LD HL,HB_BUF ; DEFAULT DISK XFR BUF ADDRESS
LD (DIOBUF),HL ; SAVE IT
;
; NOW SWITCH TO USER CONFIGURED CONSOLE
@ -322,6 +396,13 @@ HB_DISPATCH:
; C: DEVICE/UNIT
;
CIO_DISPATCH:
;
; CIO FUNCTIONS STARTING AT CIOGETBUF ARE COMMON FUNCTIONS
LD A,B ; GET THE REQUESTED FUNCTION
CP BF_CIOGETCNT ; TEST FOR FIRST OF THE COMMON FUNCTIONS
JR NC,CIO_COMMON ; IF >= CIOGETCNT HANDLE AS COMMON DIO FUNCTION
;
; STANDARD FUNCTIONS ARE DISPATCHED TO DRIVER
LD A,C ; REQUESTED DEVICE/UNIT IS IN C
AND $F0 ; ISOLATE THE DEVICE PORTION
#IF (UARTENABLE)
@ -373,9 +454,44 @@ CIOCON:
LD C,A
JR CIO_DISPATCH
;
; HANDLE COMMON CHARACTER FUNCTIONS (NOT DEVICE DRIVER SPECIFIC)
;
CIO_COMMON:
SUB BF_CIOGETCNT ; FUNCTION = CIOGETCNT?
JR Z,CIO_GETCNT ; YES, HANDLE IT
DEC A ; FUNCTION = CIOGETINF?
JR Z,CIO_GETINF ; YES, HANDLE IT
CALL PANIC ; INVALID FUNCTION SPECFIED
;
; CHARACTER DEVICE: GET DEVICE COUNT
;
CIO_GETCNT:
LD A,(CHRMAP - 1) ; GET DEVICE COUNT
LD B,A ; PUT IT IN B
XOR A ; SIGNALS SUCCESS
RET
;
; CHARACTER DEVICE: GET DEVICE INFO
;
CIO_GETINF:
LD HL,CHRMAP - 1 ; POINT TO DEVICE MAP ENTRY COUNT
LD B,(HL) ; ENTRY COUNT TO B
LD A,C ; INDEX TO A
CP B ; CHECK INDEX AGAINST MAX VALUE (INDEX - COUNT)
JR NC,CIO_GETINF1 ; IF INDEX TOO HIGH, ERR
INC HL ; BUMP TO START OF CHR MAP ENTRIES
CALL ADDHLA ; AND POINT TO REQUESTED INDEX
LD C,(HL) ; DEVICE/UNIT TO C
XOR A ; SIGNAL SUCCESS
RET ; DONE
CIO_GETINF1:
OR $FF ; SIGNAL ERROR
RET ; RETURN
;
;==================================================================================================
; DISK I/O DEVICE DISPATCHER
;==================================================================================================
;================= =================================================================================
;
; ROUTE CALL TO SPECIFIED DISK I/O DRIVER
; B: FUNCTION
@ -466,8 +582,11 @@ DIO_GETBUF:
; DISK: SET BUFFER ADDRESS
;
DIO_SETBUF:
; BIT 7,H ; IS HIGH ORDER BIT SET?
; CALL Z,PANIC ; IF NOT, ADR IS IN LOWER 32K, NOT ALLOWED!!!
LD A,H ; TEST HL
OR L ; ... FOR ZERO
JR NZ,DIO_SETBUF1 ; IF NOT, PROCEED TO SET BUF ADR
LD HL,HB_BUF ; IF ZERO, SET TO DEFAULT ADR
DIO_SETBUF1:
LD (DIOBUF),HL ; RECORD NEW DISK BUFFER ADDRESS
XOR A ; SIGNALS SUCCESS
RET
@ -502,7 +621,7 @@ DIO_DEVINF1:
; REAL TIME CLOCK DEVICE DISPATCHER
;==================================================================================================
;
; ROUTE CALL TO REAL TIME CLOCK DRIVER (NOT YET IMPLEMENTED)
; ROUTE CALL TO REAL TIME CLOCK DRIVER
; B: FUNCTION
;
RTC_DISPATCH:
@ -687,15 +806,15 @@ SYS_DISPATCH:
DEC A
JR Z,SYS_GETBNK ; $F1
DEC A
JP Z,HBXI_COPY ; $F2
JP Z,SYS_COPY ; $F2
DEC A
JP Z,HBX_XCOPY ; $F2
JP Z,SYS_XCOPY ; $F3
DEC A
JR Z,SYS_GETCFG ; $F3
JR Z,SYS_ATTR ; $F4
DEC A
JR Z,SYS_SETCFG ; $F4
;JR Z,SYS_XXXX ; $F5
DEC A
JR Z,SYS_GETVER ; $F5
JR Z,SYS_GETVER ; $F6
CALL PANIC ; INVALID
;
; SET ACTIVE MEMORY BANK AND RETURN PREVIOUSLY ACTIVE MEMORY BANK
@ -704,10 +823,10 @@ SYS_DISPATCH:
; CALLER MUST EXTABLISH UPPER MEMORY STACK BEFORE INVOKING THIS FUNCTION!
;
SYS_SETBNK:
LD A,(HBX_CURBNK) ; GET THE PREVIOUS ACTIVE MEMORY BANK
LD A,(HBX_INVBNK) ; GET THE PREVIOUS ACTIVE MEMORY BANK
PUSH AF ; SAVE IT
LD A,C ; LOAD THE NEW BANK REQUESTED
LD (HBX_CURBNK),A ; SET IT FOR ACTIVATION UPON HBIOS RETURN
LD (HBX_INVBNK),A ; SET IT FOR ACTIVATION UPON HBIOS RETURN
POP AF ; GET PREVIOUS BANK INTO A
OR A
RET
@ -715,59 +834,62 @@ SYS_SETBNK:
; GET ACTIVE MEMORY BANK
;
SYS_GETBNK:
LD A,(HBX_CURBNK) ; GET THE PREVIOUS ACTIVE MEMORY BANK
LD A,(HBX_INVBNK) ; GET THE ACTIVE MEMORY BANK
OR A
RET
;
; GET ACTIVE MEMORY BANK
; PERFORM MEMORY COPY POTENTIALLY ACROSS BANKS
;
SYS_COPY:
PUSH IX
POP BC
CALL HBXI_COPY
CALL BNKCPY
XOR A
RET
;
; SET BANKS FOR EXTENDED (INTERBANK) MEMORY COPY
;
SYS_XCOPY:
PUSH DE
POP BC
CALL HBX_XCOPY
LD A,E
LD (HB_SRCBNK),A
LD A,D
LD (HB_DSTBNK),A
XOR A
RET
;
; GET ACTIVE CONFIGURATION
; DE: DESTINATION TO RECEIVE CONFIGURATION DATA BLOCK
; MUST BE IN UPPER 32K
;
SYS_GETCFG:
LD HL,$0200 ; SETUP SOURCE OF CONFIG DATA
LD BC,$0100 ; SIZE OF CONFIG DATA
LDIR ; COPY IT
; GET/SET SYSTEM ATTRIBUTE
; C: ATTRIBUTE ID (BIT 7 INDICATES GET/SET, ON=SET)
; DE: ATTRIBUTE VALUES
;
SYS_ATTR:
LD A,C ; LOAD ATTRIB ID
AND $7F ; MASK OUT GET/SET BIT
RLCA ; MULTIPLY BY 2 FOR WORD OFFSET
LD HL,HB_ATTR ; POINT TO START OF ATTR TABLE
CALL ADDHLA ; ADD THE OFFSET
BIT 7,C ; TEST HIGH BIT
JR NZ,SYS_ATTR1 ; IF SET, GO TO SET OPER
LD E,(HL) ; GET LSB TO E
INC HL ; NEXT BYTE
LD D,(HL) ; GET MSB TO D
XOR A
RET
;
; SET ACTIVE CONFIGURATION
; DE: SOURCE OF NEW CONFIGURATION DATA BLOCK
; MUST BE IN UPPER 32K
;
; HBIOS IS NOT REALLY SET UP TO DYNAMICALLY RECONFIGURE ITSELF!!!
; THIS FUNCTION IS NOT USEFUL YET.
;
SYS_SETCFG:
LD HL,$0200 ; SETUP SOURCE OF CONFIG DATA
LD BC,$0100
EX DE,HL
LDIR
SYS_ATTR1:
LD (HL),E ; SAVE LSB
INC HL ; NEXT BYTE
LD (HL),D ; SAVE MSB
XOR A
RET
;
; GET THE CURRENT HBIOS VERSION
; RETURNS VERSION IN DE AS BCD
; D: MAJOR VERION IN TOP 4 BITS, MINOR VERSION IN LOW 4 BITS
; E: UPDATE VERION IN TOP 4 BITS, PATCH VERSION IN LOW 4 BITS
; L: PLATFORM ID
;
SYS_GETVER:
LD DE,0 | (RMJ << 12) | (RMN << 8) | (RUP << 4) | RTP
LD L,PLATFORM
XOR A
RET
;
@ -787,6 +909,10 @@ CIO_IDLE:
POP AF ; RECOVER AF
RET
;
; WRAPPER FOR CALL TO HB_BNKCPY FOR USE BY INTERNAL HBIOS FUNCTIONS
;
BNKCPY .EQU HB_BNKCPY
;
;==================================================================================================
; DEVICE DRIVERS
;==================================================================================================
@ -1000,76 +1126,114 @@ HSTSEC .DW 0 ; SECTOR IN BUFFER
CUREMU .DB DEFEMU ; CURRENT EMULATION
CURVDA .DB DEFVDA ; CURRENT VDA TARGET FOR EMULATION
;
DIOBUF .DW HBX_IMG ; PTR TO 1024 BYTE DISK XFR BUFFER
DIOBUF .DW HB_BUF ; PTR TO 1024 BYTE DISK XFR BUFFER
;
BOOTDRV .DW 0 ; BOOT DRIVE / LU
;
STR_BANNER .DB "N8VEM HBIOS v", BIOSVER, ", ", BIOSBLD, ", ", TIMESTAMP, "$"
STR_PLATFORM .DB PLATFORM_NAME, "$"
;
HB_ATTR: ; ATTRIBUTE TABLE, 128 WORD VALUES
AT_BOOTVOL .DW 0 ; BOOT VOLUME, MSB=DEV/UNIT, LSB=LU
AT_BOOTROM .DW 0 ; BANK ID OF ROM PAGE BOOTED
.FILL HB_ATTR + 256 - $,0 ; FILL OUT UNUSED ENTRIES
;
;==================================================================================================
; FILL REMAINDER OF HBIOS
; FILL REMAINDER OF HBIOS (TO START OF 1K PHYSICAL DISK BUFFER AREA)
;==================================================================================================
;
SLACK .EQU (HBX_LOC - $8000 - $)
.FILL SLACK,0FFH
SLACK .EQU (HBBUF_IMG - $)
.FILL SLACK,$FF
;
.ECHO "HBIOS space remaining: "
.ECHO SLACK
.ECHO " bytes.\n"
;
HB_BUF .EQU $
;
;==================================================================================================
; HBIOS UPPER MEMORY STUB
; HBIOS UPPER MEMORY PROXY
;==================================================================================================
;
; THE FOLLOWING CODE IS RELOCATED TO THE TOP OF MEMORY TO HANDLE INVOCATION DISPATCHING
; AFTER RELOCATION THIS AREA (1K) IS REUSED AS THE HBIOS PHYSICAL DISK READ/WRITE BUFFER
;
HBX_IMG .EQU $
.ORG HBX_LOC
.FILL (HBX_IMG - $) ; FILL TO START OF PROXY IMAGE START
.ORG HBX_LOC ; ADJUST FOR RELOCATION
;
;==================================================================================================
; HBIOS JUMP TABLE
;==================================================================================================
; MEMORY LAYOUT:
; HBIOS PROXY CODE $FE00 (256 BYTES)
; INTERRUPT VECTORS $FF00 (32 BYTES, 16 ENTRIES)
; HBIOS PROXY COPY BUFFER $FF20 (128 BYTES)
; HBIOS PROXY PRIVATE STACK $FFA0 (64 BYTES, 32 ENTRIES)
; HBIOS PROXY MGMT BLOCK $FFE0 (32 BYTES)
;
JP HBX_INIT
JP HBX_INVOKE
JP HBX_SETBNK
JP HBX_GETBNK
JP HBX_COPY
JP HBX_XCOPY
JP HBX_FRGETB
JP HBX_FRGETW
JP HBX_FRPUTB
JP HBX_FRPUTW
; DEFINITIONS
;
;==================================================================================================
; HBIOS INITIALIZATION
;==================================================================================================
HBX_CODSIZ .EQU $100 ; 256 BYTE CODE SPACE
HBX_IVTSIZ .EQU $20 ; VECTOR TABLE SIZE (16 ENTRIES)
HBX_BUFSIZ .EQU $80 ; INTERBANK COPY BUFFER
HBX_STKSIZ .EQU $40 ; PRIVATE STACK SIZE
;
; SETUP RST 08 VECTOR TO HANDLE MAIN BIOS FUNCTIONS
; HBIOS IDENTIFICATION DATA BLOCK
;
HBX_INIT:
LD A,$C3 ; $C3 = JP
LD ($08),A
LD HL,HBX_INVOKE
LD ($09),HL
RET
HBX_IDENT:
.DB 'W',~'W' ; MARKER
.DB RMJ << 4 | RMN ; FIRST BYTE OF VERSION INFO
.DB RUP << 4 | RTP ; SECOND BYTE OF VERSION INFO
;
;==================================================================================================
; HBIOS ENTRY FOR RST 08 PROCESSING
;==================================================================================================
;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; SETBNK - Switch Memory Bank to Bank in A and show as current.
; Must preserve all Registers including Flags.
; All Bank Switching MUST be done by this routine
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
HBX_INVOKE:
LD (HBX_STKSAV),SP ; SAVE ORIGINAL STACK FRAME
LD SP,HBX_STACK ; SETUP NEW STACK FRAME
LD A,(HB_CURBNK) ; GET CURRENT BANK
LD (HBX_INVBNK),A ; SETUP TO RESTORE AT EXIT
LD A,BID_BIOS ; HBIOS BANK
CALL HBX_BNKSEL ; SELECT IT
CALL HB_DISPATCH ; CALL HBIOS FUNCTION DISPATCHER
PUSH AF ; SAVE AF (FUNCTION RETURN)
LD A,$FF ; LOAD ORIGINAL BANK ($FF IS REPLACED AT ENTRY)
HBX_INVBNK .EQU $ - 1
CALL HBX_BNKSEL ; SELECT IT
POP AF ; RESTORE AF
LD SP,0 ; RESTORE ORIGINAL STACK FRAME
HBX_STKSAV .EQU $ - 2
RET ; RETURN TO CALLER
;
HBX_SETBNK:
LD (HBX_CURBNK),A
;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;; SETBNK - Switch Memory Bank to Bank in A.
;; Preserve all Registers including Flags.
;; Does NOT update current bank.
;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; Enter at HBXI_SETBNK to set bank temporarily and avoid
; updating the "current" bank.
HBX_BNKSEL:
LD (HB_CURBNK),A ; RECORD NEW CURRENT BANK
;
HBXI_SETBNK:
#IF ((PLATFORM == PLT_N8VEM) | (PLATFORM == PLT_ZETA))
OUT (MPCL_ROM),A
OUT (MPCL_RAM),A
#ENDIF
#IF (PLATFORM == PLT_ZETA2)
BIT 7,A
JR Z,HBX_ROM ; JUMP IF IT IS A ROM PAGE
RES 7,A ; RAM PAGE REQUESTED: CLEAR ROM BIT
ADD A,16 ; ADD 16 x 32K - RAM STARTS FROM 512K
;
HBX_ROM:
RLCA ; TIMES 2 - GET 16K PAGE INSTEAD OF 32K
OUT (MPGSEL_0),A ; BANK_0: 0K - 16K
INC A
OUT (MPGSEL_1),A ; BANK_1: 16K - 32K
#ENDIF
#IF (PLATFORM == PLT_N8)
BIT 7,A
JR Z,HBX_ROM
@ -1094,6 +1258,11 @@ HBX_ROM:
;
#ENDIF
#IF (PLATFORM == PLT_MK4)
; BIT 7,A ; RAM?
; JR Z,HBX_BNKSEL1 ; IF NOT, BYPASS
; XOR %10010000 ; CLEAR BIT 8, SET BIT 4 TO ADDRESS RAM
;
HBX_BNKSEL1:
RLCA
RLCA
RLCA
@ -1101,29 +1270,12 @@ HBX_ROM:
#ENDIF
RET
;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; GETBNK - Get current memory bank and return in A.
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
HBX_GETBNK:
HBXI_GETBNK:
LD A,(HBX_CURBNK)
RET
;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Set Banks for Inter-Bank Xfer. Save all Registers.
; B = Destination Bank, C = Source Bank
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
HBX_XCOPY:
HBXI_XCOPY:
LD (HBX_SRCBNK),BC ; SETS BOTH SRCBNK AND DSTBNK
RET
;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Copy Data - Possibly between banks. This resembles CP/M 3, but
; usage of the HL and DE registers is reversed.
; Enter: HL = Source Address
; Caller MUST ensure stack is already in high memory.
; Enter:
; HL = Source Address
; DE = Destination Address
; BC = Number of bytes to copy
; Exit : None
@ -1131,233 +1283,121 @@ HBXI_XCOPY:
;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; Primary entry point activates private stack while doing work. The
; secondary entry point MUST be used by internal HBIOS code/drivers
; because our private stack is already active!
;
HBX_COPY:
LD (HBX_STKSAV),SP ; Save current stack
LD SP,HBX_STACK ; Activate our private stack
CALL HBX_COPY1 ; Do the work with private stack active
LD SP,(HBX_STKSAV) ; Back to original stack
LD A,(HBX_CURBNK) ; Get the "current" bank
JR HBXI_SETBNK ; Activate current bank and return
;
; Secondary entry point HBXI_COPY is for use internally by HBIOS and
; assumes a valid stack already exists in upper 32K. It also ignores
; the "current" bank and terminates with HBIOS bank active.
;
HBXI_COPY:
CALL HBX_COPY1
LD A,BID_HB ; Get the HBIOS bank
JR HBXI_SETBNK ; .. activate and return
;
;
;
HBX_COPY1:
; Setup for copy loop
LD (HBX_SRCADR),HL ; Init working source adr
LD (HBX_DSTADR),DE ; Init working dest adr
LD H,B ; Move bytes to copy from BC...
LD L,C ; to HL to use as byte counter
HBX_COPY2: ; Copy loop
INC L ; Set ZF to indicate...
DEC L ; if a partial page copy is needed
LD BC,$100 ; Assume a full page copy, 100H bytes
JR Z,HBX_COPY3 ; If full page copy, go do it
DEC B ; Otherwise, setup for partial page copy
LD C,L ; by making BC := 0
HBX_BNKCPY:
; Save current bank to restore at end
LD A,(HB_CURBNK)
LD (HBX_CPYBNK),A
HBX_COPY3:
; Setup for copy loop
LD (HB_SRCADR),HL ; Init working source adr
LD (HB_DSTADR),DE ; Init working dest adr
LD H,B ; Move bytes to copy from BC
LD L,C ; ... to HL to use as byte counter
;
HBX_BNKCPY2:
; Copy loop
LD A,L ; Low byte of count to A
AND $7F ; Isolate bits relevant to 128 byte buf
LD BC,$80 ; Assume full buf copy
JR Z,HBX_BNKCPY3 ; If full buf copy, go do it
LD C,A ; Otherwise, BC := bytes to copy
;
HBX_BNKCPY3:
PUSH HL ; Save bytes left to copy
CALL HBX_COPY4 ; Do it
CALL HBX_BNKCPY4 ; Do it
POP HL ; Recover bytes left to copy
XOR A ; Clear CF
SBC HL,BC ; Reflect bytes copied in HL
JR NZ,HBX_COPY2 ; If any left, then loop
JR NZ,HBX_BNKCPY2 ; If any left, then loop
LD A,$FF ; Load original bank ($FF is replaced at entry)
HBX_CPYBNK .EQU $ - 1
LD HL,(HBX_DEFBNK) ; Get TPA Bank #
LD H,L ; .to both H and L
LD (HBX_SRCBNK),HL ; ..set Source & Destination Bank # to default
RET ; Done
HBX_COPY4:
; Switch to source bank
LD A,(HBX_SRCBNK) ; Get source bank
CALL HBXI_SETBNK ; Set bank without making it current
; Copy BC bytes from HL -> BUF
; Allow HL to increment
JR HBX_BNKSEL ; Select and return
;
HBX_BNKCPY4: ; Switch to source bank
LD A,(HB_SRCBNK) ; Get source bank
CALL HBX_BNKSEL ; Set bank without making it current
;
; Copy BC bytes from HL -> BUF, allow HL to increment
PUSH BC ; Save copy length
LD HL,(HBX_SRCADR) ; Point to source adr
LD HL,(HB_SRCADR) ; Point to source adr
LD DE,HBX_BUF ; Setup buffer as interim destination
LDIR ; Copy BC bytes: src -> buffer
LD (HBX_SRCADR),HL ; Update source adr
LD (HB_SRCADR),HL ; Update source adr
POP BC ; Recover copy length
;
; Switch to dest bank
LD A,(HBX_DSTBNK) ; Get destination bank
CALL HBXI_SETBNK ; Set bank without making it current
; Copy BC bytes from BUF -> HL
; Allow DE to increment
LD A,(HB_DSTBNK) ; Get destination bank
CALL HBX_BNKSEL ; Set bank without making it current
;
; Copy BC bytes from BUF -> HL, allow DE to increment
PUSH BC ; Save copy length
LD HL,HBX_BUF ; Use the buffer as source now
LD DE,(HBX_DSTADR) ; Setup final destination for copy
LD DE,(HB_DSTADR) ; Setup final destination for copy
LDIR ; Copy BC bytes: buffer -> dest
LD (HBX_DSTADR),DE ; Update dest adr
LD (HB_DSTADR),DE ; Update dest adr
POP BC ; Recover copy length
RET ; Done
;
;==================================================================================================
; HBIOS ENTRY FOR RST 08 PROCESSING
;==================================================================================================
;
; MARKER IMMEDIATELY PRECEDES INVOKE ROUTINE ADDRESS
;
HBX_MARKER:
.DB 'W',~'W' ; IDENTIFIES HBIOS
;
; ENTRY POINT FOR BIOS FUNCTIONS (TARGET OF RST 08)
;
HBX_INVOKE:
LD (HBX_STKSAV),SP ; SAVE ORIGINAL STACK FRAME
LD SP,HBX_STACK ; SETUP NEW STACK FRAME
LD A,BID_HB ; HBIOS BANK
CALL HBXI_SETBNK ; SELECT IT
CALL HB_DISPATCH ; CALL HBIOS FUNCTION DISPATCHER
PUSH AF ; SAVE AF (FUNCTION RETURN)
LD A,(HBX_CURBNK) ; GET ENTRY BANK
CALL HBXI_SETBNK ; SELECT IT
POP AF ; RESTORE AF
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
RET ; RETURN TO CALLER
;
;==================================================================================================
; HBIOS INTERBANK MEMORY COPY BUFFER
;==================================================================================================
;
.FILL $FE00 - $,$FF ; FILL TO START OF BUFFER PAGE
HBX_BUF .FILL $100,0 ; INTER-BANK COPY BUFFER
;
;==================================================================================================
; HBIOS INTERRUPT VECTOR TABLE
;==================================================================================================
;
.FILL $FF00 - $,$FF ; FILL TO START OF LAST PAGE
;
; AREA RESERVED FOR UP TO 16 INTERRUPT VECTOR ENTRIES (MODE 2)
;
HBX_IVT:
.FILL $20,$FF
;
;==================================================================================================
; Load A,(HL) from Alternate Bank (in Reg C)
;==================================================================================================
;
HBX_FRGETB:
LD (HBX_STKSAV),SP ; SAVE ORIGINAL STACK FRAME
LD SP,HBX_STACK ; SETUP NEW STACK FRAME
PUSH BC
LD A,C
DI
CALL HBXI_SETBNK ; SELECT IT
LD C,(HL)
LD A,(HBX_CURBNK)
CALL HBXI_SETBNK ; SELECT IT
EI
LD A,C
POP BC
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
RET
;
;==================================================================================================
; Load DE,(HL) from Alternate Bank
;==================================================================================================
RET ; Done
;
HBX_FRGETW:
LD (HBX_STKSAV),SP ; SAVE ORIGINAL STACK FRAME
LD SP,HBX_STACK ; SETUP NEW STACK FRAME
LD A,C
DI
CALL HBXI_SETBNK ; SELECT IT
LD E,(HL)
INC HL
LD D,(HL)
DEC HL
LD A,(HBX_CURBNK)
CALL HBXI_SETBNK ; SELECT IT
EI
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
; Call a routine in another bank saving and restoring the original bank.
; Caller MUST ensure stack is already in high memory.
; On input A=target bank, HL=target address
;
HBX_BNKCALL:
LD (HBX_TGTBNK),A ; stuff target bank to call into code below
LD (HBX_TGTADR),HL ; stuff address to call into code below
LD A,(HB_CURBNK) ; get current bank
PUSH AF ; save for return
HBX_TGTBNK .EQU $ + 1
LD A,$FF ; load bank to call ($ff overlaid at entry)
CALL HBX_BNKSEL ; activate the new bank
HBX_TGTADR .EQU $ + 1
CALL $FFFF ; call routine ($FFFF is overlaid above)
EX (SP),HL ; save hl and get bank to restore in hl
PUSH AF ; save af
LD A,H ; bank to restore to a
CALL HBX_BNKSEL ; restore it
POP AF ; recover af
POP HL ; recover hl
RET
;
;==================================================================================================
; Load (HL),A to Alternate Bank (in Reg C)
;==================================================================================================
;
HBX_FRPUTB:
LD (HBX_STKSAV),SP ; SAVE ORIGINAL STACK FRAME
LD SP,HBX_STACK ; SETUP NEW STACK FRAME
PUSH BC
LD B,A
LD A,C
DI
CALL HBXI_SETBNK ; SELECT IT
LD (HL),B
LD A,(HBX_CURBNK)
CALL HBXI_SETBNK ; SELECT IT
EI
POP BC
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
RET
; FILLER FOR UNUSED HBIOS PROXY CODE SPACE
; PAD TO START OF INTERRUPT VECTOR TABLE
;
;==================================================================================================
; Load (HL),DE to Alternate Bank
;==================================================================================================
HBX_SLACK .EQU (HBX_LOC + HBX_CODSIZ - $)
.ECHO "HBIOS PROXY space remaining: "
.ECHO HBX_SLACK
.ECHO " bytes.\n"
.FILL HBX_SLACK,$FF
;
HBX_FRPUTW:
LD (HBX_STKSAV),SP ; SAVE ORIGINAL STACK FRAME
LD SP,HBX_STACK ; SETUP NEW STACK FRAME
LD A,C
DI
CALL HBXI_SETBNK ; SELECT IT
LD (HL),E
INC HL
LD (HL),D
DEC HL
LD A,(HBX_CURBNK)
CALL HBXI_SETBNK ; SELECT IT
EI
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
RET
; HBIOS INTERRUPT VECTOR TABLE (16 ENTRIES)
;
; PRIVATE DATA
HBX_IVT .FILL HBX_IVTSIZ,$FF
;
HBX_STKSAV .DW 0 ; Saved stack pointer during HBIOS calls
HBX_CURBNK .DB BID_USR ; Currently active memory bank
HBX_SAVBNK .DB 0 ; Place to save entry bank during HB processing
HBX_DEFBNK .DB BID_USR ; Default bank number
HBX_SRCBNK .DB BID_USR ; Copy Source Bank #
HBX_DSTBNK .DB BID_USR ; Copy Destination Bank #
HBX_SRCADR .DW 0 ; Copy Source Address
HBX_DSTADR .DW 0 ; Copy Destination Address
; INTERBANK COPY BUFFER (128 BYTES)
;
; PRIVATE STACK
HBX_BUF .FILL HBX_BUFSIZ,0
;
HBX_STKSIZ .EQU (HBX_END - $ - 2)
.ECHO "STACK space remaining: "
.ECHO HBX_STKSIZ
.ECHO " bytes.\n"
; PRIVATE STACK (64 BYTES, 32 ENTRIES)
;
.FILL HBX_STKSIZ,$FF
HBX_STACK .EQU $
.DW HBX_MARKER ; POINTER TO HBIOS MARKER
.END
;
; HBIOS PROXY MGMT BLOCK (TOP 32 BYTES)
;
.DB BID_BOOT ; CURRENTLY ACTIVE LOW MEMORY BANK ID
.DB $FF ; DEPRECATED!!!
.DW 0 ; BNKCPY SOURCE ADDRESS
.DB BID_USR ; BNKCPY SOURCE BANK ID
.DW 0 ; BNKCPY DESTINATION ADDRESS
.DB BID_USR ; BNKCPY DESTINATION BANK ID
.FILL 8,0 ; FILLER, RESERVED FOR FUTURE HBIOS USE
JP HBX_INVOKE ; FIXED ADR ENTRY FOR HBX_INVOKE (ALT FOR RST 08)
JP HBX_BNKSEL ; FIXED ADR ENTRY FOR HBX_BNKSEL
JP HBX_BNKCPY ; FIXED ADR ENTRY FOR HBX_BNKCPY
JP HBX_BNKCALL ; FIXED ADR ENTRY FOR HBX_BNKCALL
.DW HBX_IDENT ; ADDRESS OF HBIOX PROXY START
.DW HBX_IDENT ; ADDRESS OF HBIOS IDENT INFO DATA BLOCK
;
.END

43
Source/BIOS/md.asm

@ -56,14 +56,17 @@ MD_READ:
#ENDIF
PUSH BC
LD C,A ; SOURCE BANK
LD B,BID_HB ; DESTINATION BANK IS RAM BANK 1 (HBIOS)
LD B,BID_BIOS ; DESTINATION BANK IS RAM BANK 1 (HBIOS)
#IF (MDTRACE >= 2)
LD (MD_SRCBNK),BC
CALL MD_PRT
#ENDIF
CALL HBXX_XCOPY ; SET SRC AND DEST BANKS
LD A,C ; GET SOURCE BANK
LD (HB_SRCBNK),A ; SET IT
LD A,B ; GET DESTINATION BANK
LD (HB_DSTBNK),A ; SET IT
POP BC
CALL HBXX_COPY ; DO THE INTERBANK COPY
CALL BNKCPY ; DO THE INTERBANK COPY
XOR A
RET
;
@ -73,7 +76,6 @@ MD_WRITE:
LD A,C ; DEVICE/UNIT IS IN C
AND $0F ; ISOLATE UNIT NUM
LD A,1 ; PREPARE TO RETURN FALSE
;CALL Z,PANIC
RET Z ; RETURN ERROR IF ROM UNIT
CALL MD_IOSETUP ; SETUP FOR MEMORY COPY
@ -84,15 +86,18 @@ MD_WRITE:
LD (MD_LEN),BC
#ENDIF
PUSH BC
LD C,BID_HB ; SOURCE BANK IS RAM BANK 1 (HBIOS)
LD C,BID_BIOS ; SOURCE BANK IS RAM BANK 1 (HBIOS)
LD B,A ; DESTINATION BANK
#IF (MDTRACE >= 2)
LD (MD_SRCBNK),BC
CALL MD_PRT
#ENDIF
CALL HBXX_XCOPY ; SET SRC AND DEST BANKS
LD A,C ; GET SOURCE BANK
LD (HB_SRCBNK),A ; SET IT
LD A,B ; GET DESTINATION BANK
LD (HB_DSTBNK),A ; SET IT
POP BC
CALL HBXX_COPY ; DO THE INTERBANK COPY
CALL BNKCPY ; DO THE INTERBANK COPY
XOR A
RET
;
@ -109,25 +114,23 @@ MD_WRITE:
; BUT WE NEVER HAVE MORE THAN $FFFF BLOCKS IN A RAM/ROM DISK,
; SO THE HIGH WORD (TRK) IS IGNORED
;
; SINCE EACH BANK IS 32K, YOU CAN THINK OF THE HSTSEC VALUE AS
; EACH RAM/ROM BANK IS 32K BY DEFINITION AND EACH SECTOR IS 512
; BYTES BY DEFINITION. SO, EACH RAM/ROM BANK CONTAINS 64 SECTORS
; (32,768 / 512 = 64). THEREFORE, YOU CAN THINK OF HSTSEC AS
; 00000BBB:BBOOOOOO IS WHERE THE 'B' BITS REPRESENT THE BANK NUMBER
; AND THE 'O' BITS REPRESENT THE SECTOR NUMBER
; AND THE 'O' BITS REPRESENT THE SECTOR NUMBER.
;
; FOR A RAM/ROM DISK, WE NEED TO ADDRESS THE BANK NUMBER AND THE BYTE
; OFFSET WITHIN THE BANK. MAPPING HSTSEC TO A BYTE OFFSET GIVES US
; THIS: 00000BBB:BBOOOOOO:OOOOOOOOO. THE 9 TRAILING OFFSET BITS REPRESENT
; THE SECTOR CONTENTS AND ARE NOT "REAL" BITS.
;
; TO GET THE BANK NUMBER, WE CAN LEFT SHIFT TWICE TO GIVE US:
; TO EXTRACT THE BANK NUMBER, WE CAN LEFT SHIFT TWICE TO GIVE US:
; 000BBBBB:OOOOOOOO:OOOOOOO. FROM THIS WE CAN EXTRACT THE MSB OF HSTTRK
; TO USE AS THE BANK NUMBER. NOTE THAT THE "RAW" BANK NUMBER MUST THEN
; BE INCREMENTED PAST THE RESERVED AREAS OF THE RAM (2 BANKS) OR ROM (3 BANKS).
; BE OFFSET TO THE START OF THE ROM/RAM BANKS.
; ALSO NOTE THAT THE HIGH BIT OF THE BANK NUMBER REPRESENTS "RAM" SO THIS
; BIT MUST ALSO BE SET ACCORDING TO THE UNIT BEING ADDRESSED.
;
; TO GET THE BYTE OFFSET, WE CAN RIGHT SHIFT THE LSB BY 1 TO GIVE US:
; TO GET THE BYTE OFFSET, WE THEN RIGHT SHIFT THE LSB BY 1 TO GIVE US:
; 0OOOOOOO AND EXTRACT THE LSB OF THE HSTTRK TO REPRESENT THE MSB OF
; THE BYTE OFFSET. THE LSB OF THE BYTE OFFSET IS ALWAYS 0.
; THE BYTE OFFSET. THE LSB OF THE BYTE OFFSET IS ALWAYS 0 SINCE WE ARE
; DEALING WITH 512 BYTE BOUNDARIES.
;
MD_IOSETUP:
LD HL,(HSTSEC) ; HL := LOW WORD OF LBA
@ -154,11 +157,11 @@ MD_IOSETUP:
JR Z,MD_IOSETUP2 ; DO ROM DRIVE, ELSE FALL THRU FOR RAM DRIVE
;
MD_IOSETUP1: ; RAM
ADD A,BID_RAMD
ADD A,BID_RAMD0
RET
;
MD_IOSETUP2: ; ROM
ADD A,BID_ROMD
ADD A,BID_ROMD0
RET
;
;

41
Source/BIOS/memmgr.asm

@ -1,28 +1,49 @@
;==================================================================================================
; MEMORY PAGE MANAGEMENT
; MEMORY BANK MANAGEMENT
;==================================================================================================
;
; PAGE THE REQUESTED 32K BLOCK OF RAM/ROM INTO THE LOWER 32K OF CPU ADDRESS SPACE.
; LOAD DESIRED PAGE INDEX INTO A AND CALL PGSEL.
; SELECT THE REQUESTED 32K BANK OF RAM/ROM INTO THE LOWER 32K OF CPU ADDRESS SPACE.
; LOAD DESIRED BANK INDEX INTO A AND CALL BNKSEL.
;______________________________________________________________________________________________________________________
;
#IF ((PLATFORM == PLT_N8VEM) | (PLATFORM == PLT_ZETA))
PGSEL:
BNKSEL:
OUT (MPCL_ROM),A
OUT (MPCL_RAM),A
RET
#ENDIF
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ZETA SBC V2 USES 16K PAGES. ANY PAGE CAN BE MAPPED TO ONE OF FOUR BANKS:
; BANK_0: 0K - 16K; BANK_1: 16K - 32K; BANK_2: 32K - 48K; BANK_3: 48K - 64K
; THIS BNKSEL EMULATES N8VEM / ZETA BEHAVIOR BY SETTING BANK_0 and BANK_1 TO
; TWO CONSECUTIVE PAGES
#IF (PLATFORM == PLT_ZETA2)
BNKSEL:
BIT 7,A
JR Z,BNKSEL_ROM ; JUMP IF IT IS A ROM PAGE
RES 7,A ; RAM PAGE REQUESTED: CLEAR ROM BIT
ADD A,16 ; ADD 16 x 32K - RAM STARTS FROM 512K
;
BNKSEL_ROM:
RLCA ; TIMES 2 - GET 16K PAGE INSTEAD OF 32K
OUT (MPGSEL_0),A ; BANK_0: 0K - 16K
INC A
OUT (MPGSEL_1),A ; BANK_1: 16K - 32K
RET
#ENDIF
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#IF (PLATFORM == PLT_N8)
PGSEL:
BNKSEL:
BIT 7,A
JR Z,PGSEL_ROM
JR Z,BNKSEL_ROM
;
PGSEL_RAM:
BNKSEL_RAM:
RES 7,A
RLCA
RLCA
@ -32,7 +53,7 @@ PGSEL_RAM:
OUT0 (ACR),A
RET
;
PGSEL_ROM:
BNKSEL_ROM:
OUT0 (RMAP),A
XOR A
OUT0 (CPU_BBR),A
@ -45,7 +66,7 @@ PGSEL_ROM:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#IF (PLATFORM == PLT_MK4)
PGSEL:
BNKSEL:
RLCA
RLCA
RLCA
@ -59,7 +80,7 @@ PGSEL:
; ALL FUNCTIONALITY IS NULLED OUT HERE.
;
#IF (PLATFORM == PLT_S2I)
PGSEL:
BNKSEL:
RET
#ENDIF

60
Source/BIOS/mk4.inc

@ -25,52 +25,24 @@ PPIX .EQU PPIBASE + 3 ; PPI CONTROL PORT
;
; MEMORY BANK CONFIGURATION
;
#IF (PLATFORM == PLT_UNA)
BID_ROM0 .EQU $00
BID_ROMN .EQU (BID_ROM0 + ((ROMSIZE / 32) - 1))
BID_RAM0 .EQU $10
BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1))
BID_BOOT .EQU $00 ; HARDWARE COLD BOOT (SETUP)
; .EQU $01 ; UNA BIOS
BID_COMIMG .EQU $02 ; LOADER + CP/M IMAGE TO COPY TO BID_COM
; .EQU $03 ; UNA FATFS DRIVER
BID_HBIMG .EQU $00 ; NO HBIOS IMAGE FOR UNA
BID_ROMD .EQU $05 ; FIRST ROM DRIVE BANK
BID_ROMDN .EQU $0F ; LAST ROM DRIVE BANK
BID_BOOT .EQU BID_ROM0 ; BOOT BANK
BID_BIOSIMG .EQU BID_ROM0 + 1 ; BIOS IMAGE BANK
BID_OSIMG .EQU BID_ROM0 + 2 ; ROM LOADER AND IMAGES BANK
BID_FSFAT .EQU BID_ROM0 + 3 ; FAT FILESYSTEM DRIVER BANK
BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK
BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK
BID_RAMD .EQU $10 ; START OF RAM DRIVE
BID_RAMDN .EQU $1B ; LAST RAM DRIVE BANK
BID_BPB .EQU $1C ; RESERVED FOR BPBIOS BANK
BID_HB .EQU $00 ; NO HBIOS FOR UNA
; .EQU $1D ; SHADOW COPY OF UNABIOS IN RAM
BID_USR .EQU $1E ; LOW 32K OF TPA
BID_COM .EQU $1F ; COMMON BANK, UPPER 32K
#ELSE
#IFDEF UNALOAD
BID_BOOT .EQU $00 ; HARDWARE COLD BOOT (SETUP)
BID_COMIMG .EQU $02 ; LOADER + CP/M IMAGE TO COPY TO BID_COM
BID_HBIMG .EQU $04 ; HBIOS IMAGE TO COPY TO BID_HB
BID_ROMD .EQU $05 ; FIRST ROM DRIVE BANK
#ELSE
BID_BOOT .EQU $00 ; HARDWARE COLD BOOT (SETUP)
BID_COMIMG .EQU $00 ; LOADER + CP/M IMAGE TO COPY TO BID_COM
BID_HBIMG .EQU $01 ; HBIOS IMAGE TO COPY TO BID_HB
BID_ROMD .EQU $02 ; FIRST ROM DRIVE BANK
#ENDIF
BID_ROMDN .EQU ($00 + ((ROMSIZE / 32) - 1)) ; LAST ROM DRIVE BANK
BID_USR .EQU $10 ; LOW 32K OF TPA
BID_HB .EQU $11 ; WORKING COPY OF HBIOS IN RAM
BID_BPB .EQU $12 ; BPBIOS BANK
BID_RAMD .EQU $13 ; START OF RAM DRIVE
BID_RAMDN .EQU ($10 + ((RAMSIZE / 32) - 2)) ; LAST RAM DRIVE BANK
BID_COM .EQU $1F ; COMMON BANK, UPPER 32K
#ENDIF
BID_RAMD0 .EQU BID_RAM0 ; FIRST RAM DRIVE BANK
BID_RAMDN .EQU BID_RAMN - 4 ; LAST RAM DRIVE BANK
BID_AUX .EQU BID_RAMN - 3 ; AUX BANK (BPBIOS, ETC.)
BID_BIOS .EQU BID_RAMN - 2 ; BIOS BANK
BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.)
BID_COM .EQU BID_RAMN ; COMMON BANK, UPPER 32K
;
; Z180 REGISTERS

44
Source/BIOS/n8.inc

@ -31,31 +31,25 @@ DEFACR .EQU $1B
;
; MEMORY BANK CONFIGURATION
;
#IFDEF UNALOAD
BID_BOOT .EQU $00 ; HARDWARE COLD BOOT (SETUP)
BID_COMIMG .EQU $02 ; LOADER + CP/M IMAGE TO COPY TO BID_COM
BID_HBIMG .EQU $04 ; HBIOS IMAGE TO COPY TO BID_HB
BID_ROMD .EQU $05 ; FIRST ROM DRIVE BANK
BID_ROMDN .EQU ($00 + ((ROMSIZE / 32) - 1)) ; LAST ROM DRIVE BANK
BID_USR .EQU $80 ; LOW 32K OF TPA
BID_HB .EQU $81 ; WORKING COPY OF HBIOS IN RAM
BID_BPB .EQU $82 ; BPBIOS BANK
BID_RAMD .EQU $83 ; START OF RAM DRIVE
BID_RAMDN .EQU ($80 + ((RAMSIZE / 32) - 2)) ; LAST RAM DRIVE BANK
BID_COM .EQU ($80 + ((RAMSIZE / 32) - 1)) ; COMMON BANK, UPPER 32K
#ELSE
BID_BOOT .EQU $00 ; HARDWARE COLD BOOT (SETUP)
BID_COMIMG .EQU $00 ; LOADER + CP/M IMAGE TO COPY TO BID_COM
BID_HBIMG .EQU $01 ; HBIOS IMAGE TO COPY TO BID_HB
BID_ROMD .EQU $02 ; FIRST ROM DRIVE BANK
BID_ROMDN .EQU ($00 + ((ROMSIZE / 32) - 1)) ; LAST ROM DRIVE BANK
BID_USR .EQU $80 ; LOW 32K OF TPA
BID_HB .EQU $81 ; WORKING COPY OF HBIOS IN RAM
BID_BPB .EQU $82 ; BPBIOS BANK
BID_RAMD .EQU $83 ; START OF RAM DRIVE
BID_RAMDN .EQU ($80 + ((RAMSIZE / 32) - 2)) ; LAST RAM DRIVE BANK
BID_COM .EQU ($80 + ((RAMSIZE / 32) - 1)) ; COMMON BANK, UPPER 32K
#ENDIF
BID_ROM0 .EQU $00
BID_ROMN .EQU (BID_ROM0 + ((ROMSIZE / 32) - 1))
BID_RAM0 .EQU $80
BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1))
BID_BOOT .EQU BID_ROM0 ; BOOT BANK
BID_BIOSIMG .EQU BID_ROM0 + 1 ; BIOS IMAGE BANK
BID_OSIMG .EQU BID_ROM0 + 2 ; ROM LOADER AND IMAGES BANK
BID_FSFAT .EQU BID_ROM0 + 3 ; FAT FILESYSTEM DRIVER BANK
BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK
BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK
BID_RAMD0 .EQU BID_RAM0 ; FIRST RAM DRIVE BANK
BID_RAMDN .EQU BID_RAMN - 4 ; LAST RAM DRIVE BANK
BID_AUX .EQU BID_RAMN - 3 ; AUX BANK (BPBIOS, ETC.)
BID_BIOS .EQU BID_RAMN - 2 ; BIOS BANK
BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.)
BID_COM .EQU BID_RAMN ; COMMON BANK, UPPER 32K
;
; Z180 REGISTERS
;

58
Source/BIOS/n8vem.inc

@ -1,8 +1,19 @@
;
; N8VEM HARDWARE IO PORT ADDRESSES AND MEMORY LOCATIONS
;
MPCL_RAM .EQU $78 ; BASE IO ADDRESS OF RAM MEMORY PAGER CONFIGURATION LATCH
MPCL_ROM .EQU $7C ; BASE IO ADDRESS OF ROM MEMORY PAGER CONFIGURATION LATCH
#IF ((PLATFORM == PLT_N8VEM) | (PLATFORM == PLT_ZETA))
MPCL_RAM .EQU $78 ; BASE IO ADDRESS OF RAM MEMORY PAGER CONFIGURATION LATCH (WRITE ONLY)
MPCL_ROM .EQU $7C ; BASE IO ADDRESS OF ROM MEMORY PAGER CONFIGURATION LATCH (WRITE ONLY)
#ENDIF
;
#IF (PLATFORM == PLT_ZETA2)
MPGSEL_0 .EQU $78 ; BANK_0 PAGE SELECT REGISTER (WRITE ONLY)
MPGSEL_1 .EQU $79 ; BANK_1 PAGE SELECT REGISTER (WRITE ONLY)
MPGSEL_2 .EQU $7A ; BANK_2 PAGE SELECT REGISTER (WRITE ONLY)
MPGSEL_3 .EQU $7B ; BANK_3 PAGE SELECT REGISTER (WRITE ONLY)
MPGENA .EQU $7C ; PAGING ENABLE REGISTER - BIT 0 = 1 (WRITE ONLY)
#ENDIF
;
RTC .EQU $70 ; ADDRESS OF RTC LATCH AND INPUT PORT
;
; PPI 82C55 I/O IS DECODED TO PORT 60-67
@ -31,28 +42,21 @@ SIO_DLM .EQU SIO_BASE + 1 ; DLAB=1: DIVISOR LATCH (MS)
;
; MEMORY BANK CONFIGURATION
;
#IFDEF UNALOAD
BID_BOOT .EQU $00 ; HARDWARE COLD BOOT (SETUP)
BID_COMIMG .EQU $02 ; LOADER + CP/M IMAGE TO COPY TO BID_COM
BID_HBIMG .EQU $04 ; HBIOS IMAGE TO COPY TO BID_HB
BID_ROMD .EQU $05 ; FIRST ROM DRIVE BANK
BID_ROMDN .EQU ($00 + ((ROMSIZE / 32) - 1)) ; LAST ROM DRIVE BANK
BID_USR .EQU $80 ; LOW 32K OF TPA
BID_HB .EQU $81 ; WORKING COPY OF HBIOS IN RAM
BID_BPB .EQU $82 ; BPBIOS BANK
BID_RAMD .EQU $83 ; START OF RAM DRIVE
BID_RAMDN .EQU ($80 + ((RAMSIZE / 32) - 2)) ; LAST RAM DRIVE BANK
BID_COM .EQU $8F ; COMMON BANK, UPPER 32K
#ELSE
BID_BOOT .EQU $00 ; HARDWARE COLD BOOT (SETUP)
BID_COMIMG .EQU $00 ; LOADER + CP/M IMAGE TO COPY TO BID_COM
BID_HBIMG .EQU $01 ; HBIOS IMAGE TO COPY TO BID_HB
BID_ROMD .EQU $02 ; FIRST ROM DRIVE BANK
BID_ROMDN .EQU ($00 + ((ROMSIZE / 32) - 1)) ; LAST ROM DRIVE BANK
BID_USR .EQU $80 ; LOW 32K OF TPA
BID_HB .EQU $81 ; WORKING COPY OF HBIOS IN RAM
BID_BPB .EQU $82 ; BPBIOS BANK
BID_RAMD .EQU $83 ; START OF RAM DRIVE
BID_RAMDN .EQU ($80 + ((RAMSIZE / 32) - 2)) ; LAST RAM DRIVE BANK
BID_COM .EQU $8F ; COMMON BANK, UPPER 32K
#ENDIF
BID_ROM0 .EQU $00
BID_ROMN .EQU (BID_ROM0 + ((ROMSIZE / 32) - 1))
BID_RAM0 .EQU $80
BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1))
BID_BOOT .EQU BID_ROM0 ; BOOT BANK
BID_BIOSIMG .EQU BID_ROM0 + 1 ; BIOS IMAGE BANK
BID_OSIMG .EQU BID_ROM0 + 2 ; ROM LOADER AND IMAGES BANK
BID_FSFAT .EQU BID_ROM0 + 3 ; FAT FILESYSTEM DRIVER BANK
BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK
BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK
BID_RAMD0 .EQU BID_RAM0 ; FIRST RAM DRIVE BANK
BID_RAMDN .EQU BID_RAMN - 4 ; LAST RAM DRIVE BANK
BID_AUX .EQU BID_RAMN - 3 ; AUX BANK (BPBIOS, ETC.)
BID_BIOS .EQU BID_RAMN - 2 ; BIOS BANK
BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.)
BID_COM .EQU BID_RAMN ; COMMON BANK, UPPER 32K

6
Source/BIOS/prefix.asm

@ -128,9 +128,9 @@ STR_ERR .DB " Read Error!",0
.DW $AA55
;
.FILL ((PREFIX_SIZE - BLOCK_SIZE) - $),00H
PR_SIG .DW 0A55AH ; SIGNATURE GOES HERE
PR_PLATFORM .DB 0
PR_SIG .DW $A55A ; SIGNATURE GOES HERE
;
PR_PLATFORM .DB PLATFORM
PR_DEVICE .DB 0
PR_FORMATTER .DB 0,0,0,0,0,0,0,0
PR_DRIVE .DB 0

948
Source/BIOS/romldr.asm

@ -0,0 +1,948 @@
;
;==================================================================================================
; LOADER
;==================================================================================================
;
; INCLUDE GENERIC STUFF
;
#INCLUDE "std.asm"
;
MONIMG .EQU $1000
CPMIMG .EQU $2000
ZSYSIMG .EQU $5000
;
.ORG 0
;
;==================================================================================================
; NORMAL PAGE ZERO SETUP, RET/RETI/RETN AS APPROPRIATE
;==================================================================================================
;
.FILL (000H - $),0FFH ; RST 0
JP 0100H ; JUMP TO BOOT CODE
.FILL (008H - $),0FFH ; RST 8
#IF (PLATFORM == PLT_UNA)
JP $FFFD ; INVOKE UBIOS FUNCTION
#ELSE
JP $FFF0 ; INVOKE HBIOS FUNCTION
#ENDIF
.FILL (010H - $),0FFH ; RST 10
RET
.FILL (018H - $),0FFH ; RST 18
RET
.FILL (020H - $),0FFH ; RST 20
RET
.FILL (028H - $),0FFH ; RST 28
RET
.FILL (030H - $),0FFH ; RST 30
RET
.FILL (038H - $),0FFH ; INT
RETI
.FILL (066H - $),0FFH ; NMI
RETN
;
.FILL (100H - $),0FFH ; PAD REMAINDER OF PAGE ZERO
;
;
;==================================================================================================
; LOADER
;==================================================================================================
;
DI ; NO INTERRUPTS
IM 1 ; INTERRUPT MODE 1
LD SP,BL_STACK ; SETUP STACK
;
; COPY OURSELVES TO HI RAM FOR PHASE 2
;
LD HL,0 ; COPY FROM START OF ROM IMAGE
LD DE,$8000 ; TO HIMEM $8000
LD BC,$1000 ; COPY 4K
LDIR
;
JP PHASE2 ; CONTINUE EXECUTION IN HIMEM RAM
;
; THIS IS THE PHASE 2 CODE THAT MUST EXECUTE IN UPPER MEMORY
;
.ORG $ + $8000 ; SET ORG BASED ON OUR NEW LOCATION IN RAM
PHASE2:
; BANNER
CALL NEWLINE
LD DE,STR_BANNER
CALL WRITESTR
; RUN THE BOOT LOADER MENU
JP DOBOOTMENU
;
;__DOBOOT________________________________________________________________________________________________________________________
;
; PERFORM BOOT FRONT PANEL ACTION
;________________________________________________________________________________________________________________________________
;
DOBOOTMENU:
CALL NEWLINE
CALL NEWLINE
LD DE,STR_BOOTMENU
CALL WRITESTR
#IF (DSKYENABLE)
LD HL,BOOT ; POINT TO BOOT MESSAGE
CALL SEGDISPLAY ; DISPLAY MESSAGE
#ENDIF
#IF (BOOTTYPE == BT_AUTO)
LD BC,1000 * BOOT_TIMEOUT
LD (BL_TIMEOUT),BC
#ENDIF
DB_BOOTLOOP:
;
; CHECK FOR CONSOLE BOOT KEYPRESS
;
CALL CST
OR A
JP Z,DB_CONEND
CALL CINUC
CP 'M' ; MONITOR
JP Z,GOMON
CP 'C' ; CP/M BOOT FROM ROM
JP Z,GOCPM
CP 'Z' ; ZSYSTEM BOOT FROM ROM
JP Z,GOZSYS
CP 'L' ; LIST DRIVES
JP Z,GOLIST
CP '0' ; 0-9, DISK DEVICE
JP C,DB_INVALID
CP '9' + 1
JP NC,DB_INVALID
SUB '0'
JP GOBOOTDISK
DB_CONEND:
;
; CHECK FOR DSKY BOOT KEYPRESS
;
#IF (DSKYENABLE)
CALL KY_STAT ; GET KEY FROM KB INTO A
OR A
JP Z,DB_DSKYEND
CALL KY_GET
CP KY_GO ; GO = MONITOR
JP Z,GOMONDSKY
CP KY_BO ; BO = BOOT ROM
JP Z,GOCPM
; CP 0AH ; A-F, DISK BOOT
; JP C,DB_INVALID
CP 0FH + 1 ; 0-F, DISK BOOT
; JP NC,DB_INVALID
; SUB 0AH
JP GOBOOTDISK
; LD HL,BOOT ; POINT TO BOOT MESSAGE
; LD A,00H ; BLANK OUT SELECTION,IT WAS INVALID
; LD (HL),A ; STORE IT IN DISPLAY BUFFER
; CALL SEGDISPLAY ; DISPLAY THE BUFFER
DB_DSKYEND:
#ENDIF
;
; IF CONFIGURED, CHECK FOR AUTOBOOT TIMEOUT
;
#IF (BOOTTYPE == BT_AUTO)
; DELAY FOR 1MS TO MAKE TIMEOUT CALC EASY
LD DE,40
CALL VDELAY
; CHECK/INCREMENT TIMEOUT
LD BC,(BL_TIMEOUT)
DEC BC
LD (BL_TIMEOUT),BC
LD A,B
OR C
JP NZ,DB_BOOTLOOP
; TIMEOUT EXPIRED, PERFORM DEFAULT BOOT ACTION
LD A,BOOT_DEFAULT
CP 'M' ; MONITOR
JP Z,GOMON
CP 'C' ; CP/M BOOT FROM ROM
JP Z,GOCPM
CP 'Z' ; ZSYSTEM BOOT FROM ROM
JP Z,GOZSYS
CP 'L' ; LIST DRIVES
JP Z,GOLIST
CP '0' ; 0-9, DISK DEVICE
JP C,DB_INVALID
CP '9' + 1
JP NC,DB_INVALID
SUB '0'
JP GOBOOTDISK
#ENDIF
JP DB_BOOTLOOP
;
; BOOT OPTION PROCESSING
;
DB_INVALID:
LD DE,STR_INVALID
CALL WRITESTR
JP DOBOOTMENU
;
GOMON:
CALL LDMON
JP MON_SERIAL
;
GOMONDSKY:
CALL LDMON
JP MON_DSKY
;
LDMON:
LD DE,STR_BOOTMON
CALL WRITESTR
LD HL,MONIMG
LD DE,MON_LOC
LD BC,MON_SIZ
LDIR
RET
;
GOCPM:
LD DE,STR_BOOTCPM
CALL WRITESTR
LD HL,CPMIMG
GOCPM2:
LD DE,CPM_LOC
LD BC,CPM_SIZ
LDIR
#IF (PLATFORM == PLT_UNA)
LD DE,-1
LD L,1
LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY
RST 08 ; CALL UNA
#ELSE
LD B,BF_SYSATTR
LD C,AID_BOOTVOL | $80
LD DE,$0000
RST 08
#ENDIF
JP CPM_ENT
;
GOZSYS:
LD DE,STR_BOOTZSYS
CALL WRITESTR
LD HL,ZSYSIMG
JR GOCPM2
;
GOLIST:
LD DE,STR_LIST
CALL WRITESTR
LD DE,STR_DRVLIST
CALL WRITESTR
CALL PRTALL
JP DOBOOTMENU
;
GOBOOTDISK:
LD (BL_BOOTID),A
LD DE,STR_BOOTDISK
CALL WRITESTR
JP BOOTDISK
;
; BOOT FROM DISK DRIVE
;
BOOTDISK:
#IF (PLATFORM == PLT_UNA)
;
; BOOT FROM UNA DISK DRIVE
;
LD A,(BL_BOOTID) ; GET BOOT DEVICE ID
LD B,A ; MOVE TO B
; LOAD SECTOR 2 (BOOT INFO)
LD C,$41 ; UNA FUNC: SET LBA
LD DE,0 ; HI WORD OF LBA IS ALWAYS ZERO
LD HL,2 ; LOAD STARTING INFO SECTOR 2
RST 08 ; SET LBA
JP NZ,DB_ERR ; HANDLE ERROR
CALL PC_PERIOD ; MARK PROGRESS
;
LD C,$42 ; UNA FUNC: READ SECTORS
LD DE,BL_INFOSEC ; DEST OF CPM IMAGE
LD L,1 ; SECTORS TO READ
RST 08 ; DO READ
JP NZ,DB_ERR ; HANDLE ERROR
CALL PC_PERIOD ; MARK PROGRESS
;
; CHECK SIGNATURE
CALL NEWLINE ; FORMATTING
LD DE,(BB_SIG) ; GET THE SIGNATURE
LD A,$A5 ; FIRST BYTE SHOULD BE $A5
CP D ; COMPARE
JP NZ,DB_NOBOOT ; ERROR IF NOT EQUAL
LD A,$5A ; SECOND BYTE SHOULD BE $5A
CP E ; COMPARE
JP NZ,DB_NOBOOT ; ERROR IS NOT EQUAL
; PRINT CPMLOC VALUE
CALL NEWLINE
LD DE,STR_CPMLOC
CALL WRITESTR
LD BC,(BB_CPMLOC)
CALL PRTHEXWORD
; PRINT CPMEND VALUE
CALL PC_SPACE
LD DE,STR_CPMEND
CALL WRITESTR
LD BC,(BB_CPMEND)
CALL PRTHEXWORD
; PRINT CPMENT VALUE
CALL PC_SPACE
LD DE,STR_CPMENT
CALL WRITESTR
LD BC,(BB_CPMENT)
CALL PRTHEXWORD
CALL PC_SPACE
; PRINT DISK LABEL
LD DE,STR_LABEL
CALL WRITESTR
LD DE,BB_LABEL ; if it is there, then a printable
LD A,(BB_TERM) ; Display Disk Label if Present
CP '$' ; (dwg 2/7/2012)
CALL Z,WRITESTR ; label is there as well even if spaces.
;
LD DE,STR_LOADING ; LOADING MESSAGE
CALL WRITESTR ; PRINT IT
;
LD A,(BL_BOOTID) ; GET BOOT DEVICE ID
LD B,A ; MOVE TO B
;
LD C,$41 ; UNA FUNC: SET LBA
LD DE,0 ; HI WORD OF LBA IS ALWAYS ZERO
LD HL,3 ; LOAD STARTING AT SECTOR 3
RST 08 ; SET LBA
JP NZ,DB_ERR ; HANDLE ERROR
CALL PC_PERIOD ; MARK PROGRESS
;
LD C,$42 ; UNA FUNC: READ SECTORS
LD HL,(BB_CPMEND) ; HL := END
LD DE,(BB_CPMLOC) ; DE := START
OR A ; CLEAR CARRY
SBC HL,DE ; HL := LENGTH TO LOAD
LD A,H ; DETERMINE 512 BYTE SECTOR COUNT
RRCA ; ... BY DIVIDING MSB BY TWO
LD L,A ; SECTORS TO READ
LD DE,(BB_CPMLOC) ; DEST OF CPM IMAGE
RST 08 ; DO READ
JP NZ,DB_ERR ; HANDLE ERROR
CALL PC_PERIOD ; MARK PROGRESS
;
; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT
LD DE,-1
LD A,(BL_BOOTID)
LD L,A
LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY
RST 08 ; CALL UNA
;
; JUMP TO COLD BOOT ENTRY
CALL NEWLINE ; FORMATTING
LD HL,(BB_CPMENT) ; GET THE ENTRY POINT
JP (HL) ; ... AND GO
;
; PRINT LIST OF ALL DRIVES UNDER UNA
;
PRTALL:
LD B,0 ; START WITH UNIT 0
;
UPRTALL1: ; LOOP THRU ALL UNITS AVAILABLE
LD C,$48 ; UNA FUNC: GET DISK TYPE
LD L,0 ; PRESET UNIT COUNT TO ZERO
RST 08 ; CALL UNA, B IS ASSUMED TO BE UNTOUCHED!!!
LD A,L ; UNIT COUNT TO A
OR A ; PAST END?
RET Z ; WE ARE DONE
PUSH BC ; SAVE UNIT
CALL UPRTDRV ; PROCESS THE UNIT
POP BC ; RESTORE UNIT
INC B ; NEXT UNIT
JR UPRTALL1 ; LOOP
;
; PRINT THE UNA UNIT INFO
; ON INPUT B HAS UNIT
;
UPRTDRV:
PUSH BC ; SAVE UNIT
PUSH DE ; SAVE DISK TYPE
LD DE,STR_PREFIX ; NEWLINE AND SPACING
CALL WRITESTR ; PRINT IT
LD A,B ; DRIVE LETTER TO A
ADD A,'0' ; MAKE IT DISPLAY NUMERIC
CALL COUT ; PRINT IT
LD A,')' ; DRIVE LETTER COLON
CALL COUT ; PRINT IT
CALL PC_SPACE
POP DE ; RECOVER DISK TYPE
LD A,D ; DISK TYPE TO A
CP $40 ; RAM/ROM?
JR Z,UPRTDRV1 ; HANDLE RAM/ROM
LD DE,UDEVIDE ; ASSUME IDE
CP $41 ; IDE?
JR Z,UPRTDRV2 ; PRINT IT
LD DE,UDEVPPIDE ; ASSUME PPIDE
CP $42 ; PPIDE?
JR Z,UPRTDRV2 ; PRINT IT
LD DE,UDEVSD ; ASSUME SD
CP $43 ; SD?
JR Z,UPRTDRV2 ; PRINT IT
LD DE,UDEVDSD ; ASSUME DSD
CP $44 ; DSD?
JR Z,UPRTDRV2 ; PRINT IT
LD DE,UDEVUNK ; OTHERWISE UNKNOWN
JR UPRTDRV2
;
UPRTDRV1: ; HANDLE RAM/ROM
LD C,$45 ; UNA FUNC: GET DISK INFO
LD DE,$9000 ; 512 BYTE BUFFER *** FIX!!! ***
RST 08 ; CALL UNA
BIT 7,B ; TEST RAM DRIVE BIT
LD DE,UDEVROM ; ASSUME ROM
JR Z,UPRTDRV2 ; IF SO, PRINT IT
LD DE,UDEVRAM ; OTHERWISE RAM
JR UPRTDRV2 ; PRINT IT
;
UPRTDRV2: ; PRINT DEVICE
POP BC ; RECOVER UNIT
CALL WRITESTR ; PRINT DEVICE NAME
LD A,B ; UNIT TO A
ADD A,'0' ; MAKE IT PRINTABLE NUMERIC
CALL COUT ; PRINT IT
LD A,':' ; DEVICE NAME COLON
CALL COUT ; PRINT IT
RET ; DONE
;
UDEVRAM .DB "RAM$"
UDEVROM .DB "ROM$"
UDEVIDE .DB "IDE$"
UDEVPPIDE .DB "PPIDE$"
UDEVSD .DB "SD$"
UDEVDSD .DB "DSD$"
UDEVUNK .DB "UNK$"
;
#ELSE
;
LD DE,STR_BOOTDISK1 ; DISK BOOT MESSAGE
CALL WRITESTR ; PRINT IT
; CHECK FOR VALID DRIVE LETTER
LD A,(BL_BOOTID) ; BOOT DEVICE TO A
PUSH AF ; SAVE BOOT DEVICE
LD B,BF_DIODEVCNT ; HBIOS FUNC: DEVICE COUNT
RST 08 ; CALL HBIOS, DEVICE COUNT TO B
POP AF ; RESTORE BOOT DEVICE
CP B ; CHECK MAX (INDEX - COUNT)
JP NC,DB_NODISK ; HANDLE INVALID SELECTION
; GET DEVICE/UNIT, LU
LD B,BF_DIODEVINF ; HBIOS FUNC: DEVICE INFO
LD A,(BL_BOOTID) ; GET BOOT DEVICE ID
LD C,A ; PUT IN C
RST 08 ; CALL HBIOS, DEV INFO TO C
LD A,C ; DEVICE/UNIT TO A
LD (BL_DEVICE),A ; STORE IT
XOR A ; LU ALWAYS ZERO
LD (BL_LU),A ; STORE IT
; SENSE MEDIA
LD A,(BL_DEVICE) ; GET DEVICE/UNIT
LD C,A ; STORE IN C
LD B,BF_DIOMED ; DRIVER FUNCTION = DISK MEDIA
RST 08 ; CALL HBIOS
OR A ; SET FLAGS
JP Z,DB_ERR ; HANDLE ERROR
; SET SPT BASED ON MEDIA DETECTED
LD C,18 ; ASSUME 18 SPT
CP MID_FD144 ; 3.5" 1.44M FLOPPY?
JR Z,BOOTDISK1 ; YES, DONE
LD C,15 ; ASSUME 15 SPT
CP MID_FD120 ; 5.25" 1.2M FLOPPY?
JR Z,BOOTDISK1 ; YES, DONE
CP MID_FD111 ; 8" 1.11M FLOPPY?
JR Z,BOOTDISK1 ; YES, DONE
LD C,9 ; ASSUME 9 SPT
CP MID_FD720 ; 3.5" 720K FLOPPY?
JR Z,BOOTDISK1 ; YES, DONE
CP MID_FD360 ; 5.25" 360k FLOPPY?
JR Z,BOOTDISK1 ; YES, DONE
LD C,16 ; EVERYTHING ELSE IS LBA (USE 16 SPT)
BOOTDISK1:
LD A,C
LD (BL_SPT),A ; SAVE SPT
; DETERMINE STARTING TRACK FOR LU
LD A,(BL_LU) ; GET LU SPECIFIED
LD E,A ; LU INDEX
LD H,65 ; 65 TRACKS PER LU
CALL MULT8 ; HL := H * E
LD (BL_LUTRK),HL ; SAVE IT
; READ BOOT INFO SECTOR
LD HL,0 ; INITIAL TRACK (RELATIVE TO LU)
LD (BL_CURTRK),HL ; SAVE AS CURRENT TRACK
LD A,2 ; BOOT INFO IS IN SECTOR 2
LD (BL_CURSEC),A ; SAVE AS CURRENT SECTOR
LD HL,BL_INFOSEC ; WHERE TO PUT INFO SECTOR
LD (BL_CURDMA),HL ; ... AND SAVE IT
CALL DB_READSEC ; READ CURRENT SECTOR
JP NZ,DB_ERR ; HANDLE ERROR
; CHECK SIGNATURE
LD BC,(BB_SIG)
LD A,$A5
CP B
JP NZ,DB_NOBOOT
LD A,$5A
CP C
JP NZ,DB_NOBOOT
; PRINT CPMLOC VALUE
CALL NEWLINE
LD DE,STR_CPMLOC
CALL WRITESTR
LD BC,(BB_CPMLOC)
CALL PRTHEXWORD
; PRINT CPMEND VALUE
CALL PC_SPACE
LD DE,STR_CPMEND
CALL WRITESTR
LD BC,(BB_CPMEND)
CALL PRTHEXWORD
; PRINT CPMENT VALUE
CALL PC_SPACE
LD DE,STR_CPMENT
CALL WRITESTR
LD BC,(BB_CPMENT)
CALL PRTHEXWORD
CALL PC_SPACE
; PRINT DISK LABEL
LD DE,STR_LABEL
CALL WRITESTR
LD DE,BB_LABEL ; if it is there, then a printable
LD A,(BB_TERM) ; Display Disk Label if Present
CP '$' ; (dwg 2/7/2012)
CALL Z,WRITESTR ; label is there as well even if spaces.
; COMPUTE NUMBER OF SECTORS TO LOAD
LD HL,(BB_CPMEND) ; HL := END
LD DE,(BB_CPMLOC) ; DE := START
OR A ; CLEAR CARRY
SBC HL,DE ; HL := LENGTH TO LOAD
LD A,H ; DETERMINE 512 BYTE SECTOR COUNT
RRCA ; ... BY DIVIDING MSB BY TWO
LD (BL_COUNT),A ; ... AND SAVE IT
; LOADING MESSAGE
CALL NEWLINE
LD DE,STR_LOADING
CALL WRITESTR
; SETUP FOR DATA LOAD
LD HL,(BB_CPMLOC) ; GET TARGET LOAD LOCATION
LD (BL_CURDMA),HL ; ... AND SAVE IT
DB_LOOP:
CALL DB_NXTSEC ; BUMP TO NEXT SECTOR
CALL DB_READSEC ; READ SECTOR
JP NZ,DB_ERR ; HANDLE ERRORS
CALL PC_PERIOD ; SHOW PROGRESS
LD HL,(BL_CURDMA) ; GET LOAD LOC
LD DE,512 ; 512 BYTES PER SECTOR
ADD HL,DE ; INCREMENT MEM POINTER
LD (BL_CURDMA),HL ; ... AND SAVE IT
LD HL,BL_COUNT ; POINT TO COUNTER
DEC (HL) ; ... AND DECREMENT IT
JR NZ,DB_LOOP ; LOOP IF NEEDED
CALL NEWLINE ; FORMATTING
; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT
LD B,BF_SYSATTR
LD C,AID_BOOTVOL | $80
LD A,(BL_DEVICE) ; LOAD BOOT DEVICE/UNIT
LD D,A ; SAVE IN D
LD A,(BL_LU) ; LOAD BOOT LU
LD E,A ; SAVE IN E
RST 08
; JUMP TO COLD BOOT ENTRY
LD HL,(BB_CPMENT)
JP (HL)
;
; INCREMENT TO NEXT SECTOR
;
DB_NXTSEC:
LD A,(BL_SPT) ; GET SECTORS PER TRACK
LD B,A ; ... AND SAVE IT IN B
LD HL,BL_CURSEC ; POINT TO CURRENT SECTOR
INC (HL) ; INCREMENT IT
LD A,(HL) ; GET CURRENT SECTOR TO A
CP B ; COMPARE TO SPT IN B
RET NZ ; IF WE HAVE NOT HIT SPT, DONE
XOR A ; PREPARE TO CLEAR CUR SECTOR
LD (HL),A ; ... AND DO IT
LD HL,(BL_CURTRK) ; LOAD CURRENT TRACK VALUE
INC HL ; ... AND INCREMENT IT
LD (BL_CURTRK),HL ; ... AND SAVE IT
RET
;
; READ CURRENT SECTOR TO LOAD LOCATION
;
DB_READSEC:
LD HL,(BL_CURDMA) ; GET THE SECTOR DMA ADDRESS
#IF 0
CALL NEWLINE
PUSH HL
POP BC
CALL PRTHEXWORD
#ENDIF
LD B,BF_DIOSETBUF ; HBIOS FUNC: SET BUF
RST 08 ; CALL HBIOS
LD A,(BL_DEVICE) ; GET ACTIVE DEVICE/UNIT BYTE
AND $F0 ; ISOLATE DEVICE PORTION
CP DIODEV_FD ; FLOPPY?
JR NZ,DB_READSEC1 ; NO, USE LBA HANDLING
; SET HL=TRACK (ADD IN TRACK OFFSET)
LD DE,(BL_LUTRK) ; DE = TRACK OFFSET FOR LU SUPPORT
LD HL,(BL_CURTRK) ; HL = TRACK #
ADD HL,DE ; APPLY OFFSET FOR ACTIVE LU
; SET DE=SECTOR
LD A,(BL_CURSEC) ; GET THE SECTOR INTO A
LD E,A ; MOVE IT TO LSB
LD D,0 ; MSB IS ALWAYS ZERO
; SET C = DEVICE/UNIT
LD B,BF_DIORD ; FUNCTION IN B
LD A,(BL_DEVICE) ; LOAD DEVICE/UNIT VALUE
LD C,A ; SAVE IN C
JR DB_READSEC3 ; DISPATCH TO DRIVER
;
DB_READSEC1:
;
; LBA STYLE ACCESS
LD DE,(BL_CURTRK) ; GET TRACK INTO HL
LD B,4 ; PREPARE TO LEFT SHIFT BY 4 BITS
DB_READSEC2:
SLA E ; SHIFT DE LEFT BY 4 BITS
RL D
DJNZ DB_READSEC2 ; LOOP TILL ALL BITS DONE
LD A,(BL_CURSEC) ; GET THE SECTOR INTO A
AND $0F ; GET RID OF TOP NIBBLE
OR E ; COMBINE WITH E
LD E,A ; BACK IN E
LD HL,0 ; HL:DE NOW HAS LU RELATIVE LBA
; APPLY LU OFFSET NOW
; LU OFFSET IS EXPRESSED AS NUMBER OF BLOCKS * 256 TO LU OFFSET!
LD A,(BL_LUTRK) ; LSB OF LU TRACK TO A
ADD A,D ; ADD WITH D
LD D,A ; PUT IT BACK IN D
LD A,(BL_LUTRK+1) ; MSB OF LU TRACK TO A
CALL ADDHLA ; ADD LU OFFSET
LD B,BF_DIORD ; FUNCTION IN B
LD A,(BL_DEVICE) ; GET THE DEVICE/UNIT VALUE
LD C,A ; PUT IT IN C
;
DB_READSEC3:
;
; DISPATCH TO DRIVER
#IF 0
PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL PC_PERIOD
LD A,C
CALL PRTHEXBYTE
PUSH BC
PUSH HL
POP BC
CALL PC_PERIOD
CALL PRTHEXWORD
PUSH DE
POP BC
CALL PC_COLON
CALL PRTHEXWORD
CALL NEWLINE
POP BC
POP HL
POP DE
POP BC
POP AF
#ENDIF
RST 08
OR A ; SET FLAGS BASED ON RESULT
RET
;
; PRINT LIST OF ALL DRIVES
;
PRTALL:
;
LD B,BF_DIODEVCNT ; HBIOS FUNC: DEVICE COUNT
RST 08 ; CALL HBIOS
LD A,B ; COUNT TO A
OR A ; SET FLAGS
RET Z ; BAIL OUT IF ZERO
LD C,0 ; INIT DEVICE INDEX
;
PRTALL1:
LD DE,STR_PREFIX ; FORMATTING
CALL WRITESTR ; PRINT IT
LD A,C ; INDEX TO A
ADD A,'0' ; MAKE NUMERIC CHAR
CALL COUT ; PRINT IT
LD A,')' ; FORMATTING
CALL COUT ; PRINT IT
CALL PC_SPACE ; SPACING
PUSH BC ; SAVE LOOP CONTROL
LD B,BF_DIODEVINF ; HBIOS FUNC: DEVICE INFO
RST 08 ; CALL HBIOS
LD D,C ; DEVICE/UNIT TO D
LD E,0 ; LU IS ZERO
CALL PRTDRV ; PRINT IT
POP BC ; RESTORE LOOP CONTROL
INC C ; BUMP INDEX
DJNZ PRTALL1 ; LOOP AS NEEDED
RET ; DONE
;
; PRINT THE DEVICE/UNIT/LU INFO
; ON INPUT D HAS DEVICE/UNIT, E HAS LU
; DESTROY NO REGISTERS OTHER THAN A
;
PRTDRV:
PUSH DE ; PRESERVE DE
PUSH HL ; PRESERVE HL
LD A,D ; LOAD DEVICE/UNIT
RRCA ; ROTATE DEVICE
RRCA ; ... BITS
RRCA ; ... INTO
RRCA ; ... LOWEST 4 BITS
AND $0F ; ISOLATE DEVICE BITS
ADD A,A ; MULTIPLE BY TWO FOR WORD TABLE
LD HL,DEVTBL ; POINT TO START OF DEVICE NAME TABLE
CALL ADDHLA ; ADD A TO HL TO POINT TO TABLE ENTRY
LD A,(HL) ; DEREFERENCE HL TO LOC OF DEVICE NAME STRING
INC HL ; ...
LD D,(HL) ; ...
LD E,A ; ...
CALL WRITESTR ; PRINT THE DEVICE NMEMONIC
POP HL ; RECOVER HL
POP DE ; RECOVER DE
LD A,D ; LOAD DEVICE/UNIT
AND $0F ; ISOLATE UNIT
CALL PRTDECB ; PRINT IT
CALL PC_COLON ; FORMATTING
; LD A,E ; LOAD LU
; CALL PRTDECB ; PRINT IT
RET
;
DEVTBL: ; DEVICE TABLE
.DW DEV00, DEV01, DEV02, DEV03
.DW DEV04, DEV05, DEV06, DEV07
.DW DEV08, DEV09, DEV10, DEV11
.DW DEV12, DEV13, DEV14, DEV15
;
DEVUNK .DB "???$"
DEV00 .DB "MD$"
DEV01 .DB "FD$"
DEV02 .DB "RAMF$"
DEV03 .DB "IDE$"
DEV04 .DB "ATAPI$"
DEV05 .DB "PPIDE$"
DEV06 .DB "SD$"
DEV07 .DB "PRPSD$"
DEV08 .DB "PPPSD$"
DEV09 .DB "HDSK$"
DEV10 .EQU DEVUNK
DEV11 .EQU DEVUNK
DEV12 .EQU DEVUNK
DEV13 .EQU DEVUNK
DEV14 .EQU DEVUNK
DEV15 .EQU DEVUNK
;
#ENDIF
;
DB_NODISK:
; SELDSK DID NOT LIKE DRIVE SELECTION
LD DE,STR_NODISK
CALL WRITESTR
JP DOBOOTMENU
DB_NOBOOT:
; DISK IS NOT BOOTABLE
LD DE,STR_NOBOOT
CALL WRITESTR
JP DOBOOTMENU
DB_ERR:
; I/O ERROR DURING BOOT ATTEMPT
LD DE,STR_BOOTERR
CALL WRITESTR
JP DOBOOTMENU
;
#IF (DSKYENABLE)
;
;
;__SEGDISPLAY________________________________________________________________________________________
;
; DISPLAY CONTENTS OF DISPLAYBUF IN DECODED HEX BITS 0-3 ARE DISPLAYED DIG, BIT 7 IS DP
;____________________________________________________________________________________________________
;
SEGDISPLAY:
PUSH AF ; STORE AF
PUSH BC ; STORE BC
PUSH HL ; STORE HL
LD BC,0007H
ADD HL,BC
LD B,08H ; SET DIGIT COUNT
LD A,40H | 30H ; SET CONTROL PORT 7218 TO OFF
OUT (PPIC),A ; OUTPUT
CALL DELAY ; WAIT
LD A,0F0H ; SET CONTROL TO 1111 (DATA COMING, HEX DECODE,NO DECODE, NORMAL)
SEGDISPLAY1: ;
OUT (PPIA),A ; OUTPUT TO PORT
LD A,80H | 30H ; STROBE WRITE PULSE WITH CONTROL=1
OUT (PPIC),A ; OUTPUT TO PORT
CALL DELAY ; WAIT
LD A,40H | 30H ; SET CONTROL PORT 7218 TO OFF
OUT (PPIC),A ; OUTPUT
SEGDISPLAY_LP:
LD A,(HL) ; GET DISPLAY DIGIT
OUT (PPIA),A ; OUT TO PPIA
LD A,00H | 30H ; SET WRITE STROBE
OUT (PPIC),A ; OUT TO PPIC
CALL DELAY ; DELAY
LD A,40H | 30H ; SET CONTROL PORT OFF
OUT (PPIC),A ; OUT TO PPIC
CALL DELAY ; WAIT
DEC HL ; INC POINTER
DJNZ SEGDISPLAY_LP ; LOOP FOR NEXT DIGIT
POP HL ; RESTORE HL
POP BC ; RESTORE BC
POP AF ; RESTORE AF
RET
#ENDIF
;
;__TEXT_STRINGS_________________________________________________________________________________________________________________
;
; STRINGS
;_____________________________________________________________________________________________________________________________
;
STR_BOOTDISK .DB "BOOT FROM DISK\r\n$"
STR_BOOTDISK1 .DB "\r\nReading disk information...$"
STR_BOOTMON .DB "START MONITOR\r\n$"
STR_BOOTCPM .DB "BOOT CPM FROM ROM\r\n$"
STR_BOOTZSYS .DB "BOOT ZSYSTEM FROM ROM\r\n$"
STR_LIST .DB "LIST DEVICES\r\n$"
STR_INVALID .DB "INVALID SELECTION\r\n$"
STR_SETUP .DB "SYSTEM SETUP\r\n$"
STR_SIG .DB "SIGNATURE=$"
STR_CPMLOC .DB "LOC=$"
STR_CPMEND .DB "END=$"
STR_CPMENT .DB "ENT=$"
STR_LABEL .DB "LABEL=$"
STR_DRVLIST .DB "\r\nDevices:\r\n$"
STR_PREFIX .DB "\r\n $"
STR_LOADING .DB "\r\nLoading$"
STR_NODISK .DB "\r\nNo disk!$"
STR_NOBOOT .DB "\r\nDisk not bootable!$"
STR_BOOTERR .DB "\r\nBoot failure!$"
;
STR_BANNER .DB "\r\n", PLATFORM_NAME, " Boot Loader$"
STR_BOOTMENU .DB "\r\nBoot: (C)PM, (Z)System, (M)onitor,\r\n"
.DB " (L)ist devices, or Device ID ===> $"
;
.IF DSKYENABLE
BOOT:
; . . t o o b
.DB 00H, 00H, 80H, 80H, 094H, 09DH, 09DH, 09FH
.ENDIF
;
#DEFINE CIOMODE_HBIOS
#DEFINE DSKY_KBD
#INCLUDE "util.asm"
;
; READ A CONSOLE CHARACTER AND CONVERT TO UPPER CASE
;
CINUC:
CALL CIN
AND 7FH ; STRIP HI BIT
CP 'A' ; KEEP NUMBERS, CONTROLS
RET C ; AND UPPER CASE
CP 7BH ; SEE IF NOT LOWER CASE
RET NC
AND 5FH ; MAKE UPPER CASE
RET
;
;==================================================================================================
; WORKING DATA STORAGE
;==================================================================================================
;
BL_STACKSIZ .EQU 40H
.FILL BL_STACKSIZ,0
BL_STACK .EQU $
;
BL_SPT .DB 16 ; SECTORS PER TRACK FOR LOAD DEVICE
BL_LUTRK .DW 0 ; STARTING TRACK FOR LU
BL_CURTRK .DW 0 ; CURRENT TRACK FOR LOAD
BL_CURSEC .DB 0 ; CURRENT SECTOR FOR LOAD
BL_CURDMA .DW 0 ; CURRENT MEM LOC BEING LOADED
BL_COUNT .DB 0 ; LOAD COUNTER
BL_TIMEOUT .DW 0 ; AUTOBOOT TIMEOUT COUNTDOWN COUNTER
BL_BOOTID .DB 0 ; BOOT DEVICE ID CHOSEN BY USER
BL_DEVICE .DB 0 ; DEVICE TO LOAD FROM
BL_LU .DB 0 ; LU TO LOAD FROM
;
; BOOT INFO SECTOR IS READ INTO AREA BELOW
; THE THIRD SECTOR OF A DISK DEVICE IS RESERVED FOR BOOT INFO
;
BL_INFOSEC .EQU $
.FILL (512 - 128),0
BB_METABUF .EQU $
BB_SIG .DW 0 ; SIGNATURE (WILL BE 0A55AH IF SET)
BB_PLATFORM .DB 0 ; FORMATTING PLATFORM
BB_DEVICE .DB 0 ; FORMATTING DEVICE
BB_FORMATTER .FILL 8,0 ; FORMATTING PROGRAM
BB_DRIVE .DB 0 ; PHYSICAL DISK DRIVE #
BB_LU .DB 0 ; LOGICAL UNIT (LU)
.DB 0 ; MSB OF LU, NOW DEPRECATED
.FILL (BB_METABUF + 128) - $ - 32,0
BB_PROTECT .DB 0 ; WRITE PROTECT BOOLEAN
BB_UPDATES .DW 0 ; UPDATE COUNTER
BB_RMJ .DB 0 ; RMJ MAJOR VERSION NUMBER
BB_RMN .DB 0 ; RMN MINOR VERSION NUMBER
BB_RUP .DB 0 ; RUP UPDATE NUMBER
BB_RTP .DB 0 ; RTP PATCH LEVEL
BB_LABEL .FILL 16,0 ; 16 CHARACTER DRIVE LABEL
BB_TERM .DB 0 ; LABEL TERMINATOR ('$')
BB_BILOC .DW 0 ; LOC TO PATCH BOOT DRIVE INFO TO (IF NOT ZERO)
BB_CPMLOC .DW 0 ; FINAL RAM DESTINATION FOR CPM/CBIOS
BB_CPMEND .DW 0 ; END ADDRESS FOR LOAD
BB_CPMENT .DW 0 ; CP/M ENTRY POINT (CBIOS COLD BOOT)
;
;==================================================================================================
; FILL REMAINDER OF BANK
;==================================================================================================
;
SLACK: .EQU ($9000 - $)
.FILL SLACK
;
.ECHO "LOADER space remaining: "
.ECHO SLACK
.ECHO " bytes.\n"
.END

211
Source/BIOS/setup.asm

@ -0,0 +1,211 @@
;
;==================================================================================================
; SETUP
;==================================================================================================
;
; INCLUDE GENERIC STUFF
;
#INCLUDE "std.asm"
;
.ORG 0
;
;==================================================================================================
; NORMAL PAGE ZERO SETUP, RET/RETI/RETN AS APPROPRIATE
;==================================================================================================
;
.FILL (000H - $),0FFH ; RST 0
JP START ; JUMP TO BOOT CODE
.FILL (004H - $),0FFH ; FILL TO START OF SIG PTR
.DW ROM_SIG
.FILL (008H - $),0FFH ; RST 8
RET
.FILL (010H - $),0FFH ; RST 10
RET
.FILL (018H - $),0FFH ; RST 18
RET
.FILL (020H - $),0FFH ; RST 20
RET
.FILL (028H - $),0FFH ; RST 28
RET
.FILL (030H - $),0FFH ; RST 30
RET
.FILL (038H - $),0FFH ; INT
RETI
.FILL (066H - $),0FFH ; NMI
RETN
;
.FILL (070H - $),0FFH ; SIG STARTS AT $80
;
ROM_SIG:
.DB $76, $B5 ; 2 SIGNATURE BYTES
.DB 1 ; STRUCTURE VERSION NUMBER
.DB 7 ; ROM SIZE (IN MULTIPLES OF 4KB, MINUS ONE)
.DW NAME ; POINTER TO HUMAN-READABLE ROM NAME
.DW AUTH ; POINTER TO AUTHOR INITIALS
.DW DESC ; POINTER TO LONGER DESCRIPTION OF ROM
.DB 0, 0, 0, 0, 0, 0 ; RESERVED FOR FUTURE USE; MUST BE ZERO
;
NAME .DB "ROMWBW v", BIOSVER, ", ", BIOSBLD, ", ", TIMESTAMP, 0
AUTH .DB "WBW",0
DESC .DB "ROMWBW v", BIOSVER, ", Copyright 2014, Wayne Warthen, GNU GPL v3", 0
;
.FILL ($100 - $),$FF ; PAD REMAINDER OF PAGE ZERO
;
;==================================================================================================
; ROM COLD START
;==================================================================================================
;
START:
DI ; NO INTERRUPTS
IM 1 ; INTERRUPT MODE 1
LD SP,HBX_LOC ; SETUP INITIAL STACK JUST BELOW HBIOS PROXY
;
; HARDWARE BOOTSTRAP FOR Z180
; FOR N8, ACR & RMAP ARE ASSUMED TO BE ALREADY SET OR THIS CODE
; WOULD NOT BE EXECUTING
;
#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))
; SET BASE FOR CPU IO REGISTERS
LD A,CPU_BASE
OUT0 (CPU_ICR),A
; SET DEFAULT CPU CLOCK MULTIPLIERS (XTAL / 2)
XOR A
OUT0 (CPU_CCR),A
OUT0 (CPU_CMR),A
; SET DEFAULT WAIT STATES
LD A,$F0
OUT0 (CPU_DCNTL),A
#IF (Z180_CLKDIV >= 1)
; SET CLOCK DIVIDE TO 1 RESULTING IN FULL XTAL SPEED
LD A,$80
OUT0 (CPU_CCR),A
#ENDIF
#IF (Z180_CLKDIV >= 2)
; SET CPU MULTIPLIER TO 1 RESULTINT IN XTAL * 2 SPEED
LD A,$80
OUT0 (CPU_CMR),A
#ENDIF
; SET DESIRED WAIT STATES
LD A,0 + (Z180_MEMWAIT << 6) | (Z180_IOWAIT << 4)
OUT0 (CPU_DCNTL),A
; MMU SETUP
LD A,$80
OUT0 (CPU_CBAR),A ; SETUP FOR 32K/32K BANK CONFIG
XOR A
OUT0 (CPU_BBR),A ; BANK BASE = 0
LD A,(RAMSIZE + RAMBIAS - 64) >> 2
OUT0 (CPU_CBR),A ; COMMON BASE = LAST (TOP) BANK
#ENDIF
;
; HARDWARE BOOTSTRAP FOR ZETA 2
;
#IF (PLATFORM == PLT_ZETA2)
; SET PAGING REGISTERS
XOR A
OUT (MPGSEL_0),A
INC A
OUT (MPGSEL_1),A
LD A,62
OUT (MPGSEL_2),A
INC A
OUT (MPGSEL_3),A
; ENABLE PAGING
LD A,1
OUT (MPGENA),A
#ENDIF
;
; EMIT FIRST SIGN OF LIFE TO SERIAL PORT
;
CALL XIO_INIT ; INIT SERIAL PORT
LD HL,STR_BOOT ; POINT TO MESSAGE
CALL XIO_OUTS ; SAY HELLO
;
; COPY OURSELVES AND LOADER TO HI RAM FOR PHASE 2
;
LD HL,0 ; COPY FROM START OF ROM IMAGE
LD DE,$8000 ; TO HIMEM $F000
LD BC,$0800 ; COPY 2K
LDIR
;
CALL XIO_DOT ; MARK PROGRESS
;
JP PHASE2 ; JUMP TO PHASE 2 BOOT IN UPPER MEMORY
;
STR_BOOT .DB "RomWBW$"
;
; IMBED DIRECT SERIAL I/O ROUTINES
;
#INCLUDE "xio.asm"
;
;______________________________________________________________________________________________________________________
;
; THIS IS THE PHASE 2 CODE THAT MUST EXECUTE IN UPPER MEMORY
;
.ORG $ + $8000 ; WE ARE NOW EXECUTING IN UPPER MEMORY
;
PHASE2:
CALL XIO_DOT ; MARK PROGRESS
;
; LAUNCH HBIOS
;
; INSTALL HBIOS PROXY
LD A,BID_BIOSIMG ; HBIOS IMAGE ROM BANK
CALL BNKSEL ; SELECT IT
LD HL,HBX_IMG ; HL := SOURCE OF HBIOS PROXY IMAGE
LD DE,HBX_LOC ; DE := DESTINATION TO INSTALL IT
LD BC,HBX_SIZ ; SIZE
LDIR ; DO THE COPY
LD A,BID_BOOT ; BOOT/SETUP BANK
LD (HB_CURBNK),A ; INIT CURRENT BANK
CALL BNKSEL ; SELECT IT
CALL XIO_DOT ; MARK PROGRESS
;
; INSTALL HBIOS CORE IN SHADOW RAM BANK
LD A,BID_BIOSIMG ; SOURCE BANK
LD (HB_SRCBNK),A ; SET IT
LD A,BID_BIOS ; DESTINATION BANK
LD (HB_DSTBNK),A ; SET IT
LD HL,0 ; SOURCE ADDRESS IS ZERO
LD DE,0 ; TARGET ADDRESS IS ZERO
LD BC,$8000 ; COPY ENTIRE BANK
CALL HB_BNKCPY ; DO IT
CALL XIO_DOT ; MARK PROGRESS
;
; INITIALIZE HBIOS
LD A,BID_BIOS ; HBIOS BANK
LD HL,0 ; ADDRESS 0 IS HBIOS INIT ENTRY ADDRESS
CALL HB_BNKCALL ; DO IT
;
; CHAIN TO OS IMAGES BANK
;
LD A,BID_OSIMG ; CHAIN TO OS IMAGES BANK
LD HL,0 ; ENTER AT ADDRESS 0
CALL HB_BNKCALL ; GO THERE
HALT ; WE SHOULD NEVER COME BACK!
;
;==================================================================================================
; MEMORY MANAGER
;==================================================================================================
;
#INCLUDE "memmgr.asm"
;
;==================================================================================================
; FILL REMAINDER OF SETUP BANK
;==================================================================================================
;
SLACK .EQU ($10000 - $)
.FILL SLACK,$FF
;
.ECHO "SETUP space remaining: "
.ECHO SLACK
.ECHO " bytes.\n"
;
.END

71
Source/BIOS/simrtc.asm

@ -58,53 +58,22 @@ SIMRTC_SETBLK:
; 24 HOUR TIME FORMAT IS ASSUMED
;
SIMRTC_GETTIM:
; PUSH HL
; POP BC
; CALL NEWLINE
; CALL PRTHEXWORD
; CALL NEWLINE
; LD A,SIMRTC_CLKREAD ; READ CLOCK COMMAND
; OUT (SIMRTC_IO),A ; SEND IT TO SIMH
; LD B,SIMRTC_BUFSIZ ; SETUP TO GET 6 BYTES
; LD C,SIMRTC_IO ; FROM SIMH PORT
; INIR ; GET BYTES TO (HL)
;;
; XOR A ; SIGNAL SUCCESS
; RET ; AND RETURN
; GET THE TIME INTO TEMP BUF
PUSH HL ; SAVE PTR TO CALLS BUFFER
CALL SIMRTC_GETTIM0 ; GET TIME TO WORK BUFFER
;
; NOW COPY TO REAL DESTINATION (INTERBANK SAFE)
LD C,BID_HB ; SOURCE BANK IS OUT BANK
CALL HBXX_GETBNK
LD B,A ; .. AND USE AS DEST BANK
CALL HBXX_XCOPY ; SET COPY BANKS
LD A,BID_BIOS ; COPY FROM BIOS BANK
LD (HB_SRCBNK),A ; SET IT
LD A,(HBX_INVBNK) ; COPY TO CURRENT USER BANK
LD (HB_DSTBNK),A ; SET IT
LD HL,SIMRTC_BUF ; SOURCE ADR
POP DE ; DEST ADR
LD BC,SIMRTC_BUFSIZ ; LENGTH
CALL HBXX_COPY
; ; FILL IN DAY OF WEEK VIA ALGORITHM ASSUMING CENTURY IS 20XX
; PUSH HL
; LD A,(SIMRTC_YR)
; CALL BCD2BIN
; LD L,A ; YEAR VALUE
; LD H,0 ; .. IN HL
; LD DE,2000 ; ASSUME CENTURY IS 20XX
; ADD HL,DE ; .. AND ADD IT IN TO THE YEAR VALUE IN HL
; LD A,(SIMRTC_MO)
; CALL BCD2BIN
; LD D,A ; MONTH VALUE IN D
; LD A,(SIMRTC_DT)
; CALL BCD2BIN
; LD E,A ; DATE VALUE IN E
; CALL DOW
; POP HL
; LD (HL),A ; FILL IN THE FINAL VALUE
CALL BNKCPY ; COPY THE CLOCK DATA
;
LD DE,100 ; DELAY 100 * 25uS
CALL VDELAY ; SLOW DOWN SIMH FOR CLOCK TICKING TEST
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
@ -116,7 +85,6 @@ SIMRTC_GETTIM0:
LD C,SIMRTC_IO ; FROM SIMH PORT
INIR ; GET BYTES TO (HL)
RET
;
; RTC SET TIME
; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR
@ -125,27 +93,14 @@ SIMRTC_GETTIM0:
; 24 HOUR TIME FORMAT IS ASSUMED
;
SIMRTC_SETTIM:
;
; LD A,SIMRTC_CLKWRITE ; WRITE CLOCK COMMAND
; OUT (SIMRTC_IO),A ; SEND COMMAND TO SIMH
; LD A,L ; LOW BYTE OF BUFFER ADDRESS
; OUT (SIMRTC_IO),A ; SEND IT
; LD A,H ; HIGH BYTE OF BUFFER ADDRESS
; OUT (SIMRTC_IO),A ; SEND IT
;;
; XOR A ; SIGNAL SUCCESS
; RET ; AND RETURN
;
; COPY TO TEMP BUF
CALL HBXX_GETBNK
LD C,A ; .. AND USE AS SOURCE BANK
LD B,BID_HB ; DESTINATION BANK
CALL HBXX_XCOPY ; SET COPY BANKS
LD A,(HBX_INVBNK) ; COPY FROM CURRENT USER BANK
LD (HB_SRCBNK),A ; SET IT
LD A,BID_BIOS ; COPY TO BIOS BANK
LD (HB_DSTBNK),A ; SET IT
LD DE,SIMRTC_BUF ; DEST ADR
LD BC,SIMRTC_BUFSIZ ; LENGTH
CALL HBXX_COPY ; DO THE COPY
CALL BNKCPY ; COPY THE CLOCK DATA
;
LD HL,SIMRTC_BUF ; POINT TO TEMP BUF
LD A,SIMRTC_CLKWRITE ; WRITE CLOCK COMMAND

279
Source/BIOS/std.asm

@ -21,26 +21,21 @@
TRUE .EQU 1
FALSE .EQU 0
;
; DEPRECATED STUFF!!!
;
DIOPLT .EQU 0 ; DEPRECATED!!!
VDUMODE .EQU 0 ; DEPRECATED!!!
BIOSSIZE .EQU 0100H ; DEPRECATED!!!
;
; PRIMARY HARDWARE PLATFORMS
;
PLT_N8VEM .EQU 1 ; N8VEM ECB Z80 SBC
PLT_ZETA .EQU 2 ; ZETA Z80 SBC
PLT_N8 .EQU 3 ; N8 (HOME COMPUTER) Z180 SBC
PLT_MK4 .EQU 4
PLT_S2I .EQU 5 ; SCSI2IDE
PLT_S100 .EQU 6 ; S100COMPUTERS Z80 based system
PLT_UNA .EQU 7 ; UNA BIOS
PLT_ZETA2 .EQU 3 ; ZETA Z80 V2 SBC
PLT_N8 .EQU 4 ; N8 (HOME COMPUTER) Z180 SBC
PLT_MK4 .EQU 5
PLT_S2I .EQU 6 ; SCSI2IDE
PLT_S100 .EQU 7 ; S100COMPUTERS Z80 based system
PLT_UNA .EQU 8 ; UNA BIOS
;
; BOOT STYLE
;
BT_MENU .EQU 1 ; WAIT FOR MENU SELECTION AT LOADER PROMPT
BT_AUTO .EQU 2 ; AUTO SELECT BOOT_DEFAULT AFTER BOOT_TIMEOUT
BT_MENU .EQU 1 ; WAIT FOR MENU SELECTION AT LOADER PROMPT
BT_AUTO .EQU 2 ; AUTO SELECT BOOT_DEFAULT AFTER BOOT_TIMEOUT
;
; RAM DISK INITIALIZATION OPTIONS
;
@ -48,19 +43,6 @@ CLR_NEVER .EQU 0 ; NEVER CLEAR RAM DISK
CLR_AUTO .EQU 1 ; CLEAR RAM DISK IF INVALID DIR ENTRIES
CLR_ALWAYS .EQU 2 ; ALWAYS CLEAR RAM DISK
;
; DISK MAP SELECTION OPTIONS
;
DM_ROM .EQU 1 ; ROM DRIVE PRIORITY
DM_RAM .EQU 2 ; RAM DRIVE PRIORITY
DM_FD .EQU 3 ; FLOPPY DRIVE PRIORITY
DM_RF .EQU 4 ; FLOPPY DRIVE PRIORITY
DM_IDE .EQU 5 ; IDE DRIVE PRIORITY
DM_PPIDE .EQU 6 ; PPIDE DRIVE PRIORITY
DM_SD .EQU 7 ; SD DRIVE PRIORITY
DM_PRPSD .EQU 8 ; PROPIO SD DRIVE PRIORITY
DM_PPPSD .EQU 9 ; PROPIO SD DRIVE PRIORITY
DM_HDSK .EQU 10 ; SIMH HARD DISK DRIVE PRIORITY
;
; FLOPPY DISK MEDIA SELECTIONS (ID'S MUST BE INDEX OF ENTRY IN FCD_TBL)
;
FDM720 .EQU 0 ; 3.5" FLOPPY, 720KB, 2 SIDES, 80 TRKS, 9 SECTORS
@ -87,9 +69,10 @@ MID_FD111 .EQU 9
FDMODE_NONE .EQU 0 ; FD modes defined in std-*.inc
FDMODE_DIO .EQU 1 ; DISKIO V1
FDMODE_ZETA .EQU 2 ; ZETA
FDMODE_DIDE .EQU 3 ; DUAL IDE
FDMODE_N8 .EQU 4 ; N8
FDMODE_DIO3 .EQU 5 ; DISKIO V3
FDMODE_ZETA2 .EQU 3 ; ZETA V2
FDMODE_DIDE .EQU 4 ; DUAL IDE
FDMODE_N8 .EQU 5 ; N8
FDMODE_DIO3 .EQU 6 ; DISKIO V3
;
; IDE MODE SELECTIONS
;
@ -174,7 +157,7 @@ CP .EQU CP_ZCPR
;
; INCLUDE PLATFORM SPECIFIC HARDWARE DEFINITIONS
;
#IF ((PLATFORM == PLT_N8VEM) | (PLATFORM == PLT_ZETA))
#IF ((PLATFORM == PLT_N8VEM) | (PLATFORM == PLT_ZETA) | (PLATFORM == PLT_ZETA2))
#INCLUDE "n8vem.inc"
#ENDIF
;
@ -251,52 +234,6 @@ BF_CIOOST .EQU BF_CIO + 4 ; CHARACTER OUTPUT STATUS
BF_DIO .EQU $40
BF_DIORD .EQU BF_DIO + 2 ; DISK READ
BF_DIOWR .EQU BF_DIO + 3 ; DISK WRITE
BF_DIOST .EQU $FF ; DISK STATUS
BF_DIOMED .EQU $FF ; DISK MEDIA
BF_DIOID .EQU $FF ; DISK IDENTIFY
BF_DIOGETBUF .EQU $FF ; DISK GET BUFFER ADR
BF_DIOSETBUF .EQU $FF ; DISK SET BUFFER ADR
BF_DIODEVCNT .EQU $FF ; DISK DEVICE COUNT
BF_DIODEVINF .EQU $FF ; DISK DEVICE INFO
;
BF_RTC .EQU $20
BF_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME
BF_RTCSETTIM .EQU BF_RTC + 1 ; SET TIME
BF_RTCGETBYT .EQU BF_RTC + 2 ; GET NVRAM BYTE BY INDEX
BF_RTCSETBYT .EQU BF_RTC + 3 ; SET NVRAM BYTE BY INDEX
BF_RTCGETBLK .EQU BF_RTC + 4 ; GET NVRAM DATA BLOCK
BF_RTCSETBLK .EQU BF_RTC + 5 ; SET NVRAM DATA BLOCK
;
BF_EMU .EQU $30
BF_EMUIN .EQU BF_EMU + 0 ; EMULATOR CHARACTER INPUT
BF_EMUOUT .EQU BF_EMU + 1 ; EMULATOR CHARACTER OUTPUT
BF_EMUIST .EQU BF_EMU + 2 ; EMULATOR CHARACTER INPUT STATUS
BF_EMUOST .EQU BF_EMU + 3 ; EMULATOR CHARACTER OUTPUT STATUS
BF_EMUCFG .EQU BF_EMU + 4 ; EMULATOR CHARACTER I/O CONFIG
BF_EMUINI .EQU BF_EMU + 8 ; INITIALIZE EMULATION
BF_EMUQRY .EQU BF_EMU + 9 ; QUERY EMULATION STATUS
;
BF_VDA .EQU $40
BF_VDAINI .EQU BF_VDA + 0 ; INITIALIZE VDU
BF_VDAQRY .EQU BF_VDA + 1 ; QUERY VDU STATUS
BF_VDARES .EQU BF_VDA + 2 ; SOFT RESET VDU
BF_VDASCS .EQU BF_VDA + 3 ; SET CURSOR STYLE
BF_VDASCP .EQU BF_VDA + 4 ; SET CURSOR POSITION
BF_VDASAT .EQU BF_VDA + 5 ; SET CHARACTER ATTRIBUTE
BF_VDASCO .EQU BF_VDA + 6 ; SET CHARACTER COLOR
BF_VDAWRC .EQU BF_VDA + 7 ; WRITE CHARACTER
BF_VDAFIL .EQU BF_VDA + 8 ; FILL
BF_VDACPY .EQU BF_VDA + 9 ; COPY
BF_VDASCR .EQU BF_VDA + 10 ; SCROLL
BF_VDAKST .EQU BF_VDA + 11 ; GET KEYBOARD STATUS
BF_VDAKFL .EQU BF_VDA + 12 ; FLUSH KEYBOARD BUFFER
BF_VDAKRD .EQU BF_VDA + 13 ; READ KEYBOARD
;
BF_SYS .EQU $F0
BF_SYSGETCFG .EQU BF_SYS + 0 ; GET CONFIGURATION DATA BLOCK
BF_SYSSETCFG .EQU BF_SYS + 1 ; SET CONFIGURATION DATA BLOCK
BF_SYSBNKCPY .EQU BF_SYS + 2 ; COPY TO/FROM RAM/ROM MEMORY BANK
BF_SYSGETVER .EQU BF_SYS + 3 ; GET VERSION OF HBIOS
#ELSE
BF_CIO .EQU $00
BF_CIOIN .EQU BF_CIO + 0 ; CHARACTER INPUT
@ -304,6 +241,8 @@ BF_CIOOUT .EQU BF_CIO + 1 ; CHARACTER OUTPUT
BF_CIOIST .EQU BF_CIO + 2 ; CHARACTER INPUT STATUS
BF_CIOOST .EQU BF_CIO + 3 ; CHARACTER OUTPUT STATUS
BF_CIOCFG .EQU BF_CIO + 4 ; CHARACTER I/O CONFIG
BF_CIOGETCNT .EQU BF_CIO + 8 ; CHARACTER DEVICE COUNT
BF_CIOGETINF .EQU BF_CIO + 9 ; CHARACTER DEVICE INFO
;
BF_DIO .EQU $10
BF_DIORD .EQU BF_DIO + 0 ; DISK READ
@ -350,102 +289,103 @@ BF_VDAKFL .EQU BF_VDA + 12 ; FLUSH KEYBOARD BUFFER
BF_VDAKRD .EQU BF_VDA + 13 ; READ KEYBOARD
;
BF_SYS .EQU $F0
BF_SYSGETCFG .EQU BF_SYS + 0 ; GET CONFIGURATION DATA BLOCK
BF_SYSSETCFG .EQU BF_SYS + 1 ; SET CONFIGURATION DATA BLOCK
BF_SYSBNKCPY .EQU BF_SYS + 2 ; COPY TO/FROM RAM/ROM MEMORY BANK
BF_SYSGETVER .EQU BF_SYS + 3 ; GET VERSION OF HBIOS
BF_SYSSETBNK .EQU BF_SYS + 0 ; SET CURRENT BANK
BF_SYSGETBNK .EQU BF_SYS + 1 ; GET CURRENT BANK
BF_SYSCPY .EQU BF_SYS + 2 ; COPY TO/FROM RAM/ROM MEMORY BANK
BF_SYSXCPY .EQU BF_SYS + 3 ; EXTENDED COPY SETUP
BF_SYSATTR .EQU BF_SYS + 4 ; GET/SET SYSTEM ATTRIBUTE VALUE
;BF_SYSXXXX .EQU BF_SYS + 5 ;
BF_SYSGETVER .EQU BF_SYS + 6 ; GET VERSION OF HBIOS
#ENDIF
;
; SYSTEM ATTRIBUTE IDS
;
AID_BOOTVOL .EQU 0 ; BOOT VOLUME, MSB=DEV/UNIT, LSB=LU
AID_BOOTROM .EQU 0 ; BANK ID OF ROM PAGE BOOTED
;
; MEMORY LAYOUT
;
CPM_LOC .EQU 0D000H ; CONFIGURABLE: LOCATION OF CPM FOR RUNNING SYSTEM
CPM_SIZ .EQU 2C00H ; SIZE OF CPM IMAGE (CCP + BDOS + CBIOS (INCLUDING DATA))
CPM_END .EQU CPM_LOC + CPM_SIZ
;
CCP_LOC .EQU CPM_LOC ; START OF COMMAND PROCESSOR
CCP_SIZ .EQU 800H
CCP_END .EQU CCP_LOC + CCP_SIZ
;
BDOS_LOC .EQU CCP_END ; START OF BDOS
BDOS_SIZ .EQU 0E00H
BDOS_END .EQU BDOS_LOC + BDOS_SIZ
;
CBIOS_LOC .EQU BDOS_END
CBIOS_SIZ .EQU CPM_END - CBIOS_LOC
CBIOS_END .EQU CBIOS_LOC + CBIOS_SIZ
;
CPM_ENT .EQU CBIOS_LOC
;
HBX_LOC .EQU CPM_END
HBX_SIZ .EQU 400H
HBX_END .EQU HBX_LOC + HBX_SIZ
;
MON_LOC .EQU 0C000H ; LOCATION OF MONITOR FOR RUNNING SYSTEM
MON_SIZ .EQU 01000H ; SIZE OF MONITOR BINARY IMAGE
MON_END .EQU MON_LOC + MON_SIZ
MON_DSKY .EQU MON_LOC ; MONITOR ENTRY (DSKY)
MON_SERIAL .EQU MON_LOC + 3 ; MONITOR ENTRY (SERIAL PORT)
;
CBIOS_BOOT .EQU CBIOS_LOC + 0
CBIOS_WBOOT .EQU CBIOS_LOC + 3
CBIOS_CONST .EQU CBIOS_LOC + 6
CBIOS_CONIN .EQU CBIOS_LOC + 9
CBIOS_CONOUT .EQU CBIOS_LOC + 12
CBIOS_LIST .EQU CBIOS_LOC + 15
CBIOS_PUNCH .EQU CBIOS_LOC + 18
CBIOS_READER .EQU CBIOS_LOC + 21
CBIOS_HOME .EQU CBIOS_LOC + 24
CBIOS_SELDSK .EQU CBIOS_LOC + 27
CBIOS_SETTRK .EQU CBIOS_LOC + 30
CBIOS_SETSEC .EQU CBIOS_LOC + 33
CBIOS_SETDMA .EQU CBIOS_LOC + 36
CBIOS_READ .EQU CBIOS_LOC + 39
CBIOS_WRITE .EQU CBIOS_LOC + 42
CBIOS_LISTST .EQU CBIOS_LOC + 45
CBIOS_SECTRN .EQU CBIOS_LOC + 48
;
; EXTENDED CBIOS FUNCTIONS
;
CBIOS_BNKSEL .EQU CBIOS_LOC + 51
CBIOS_GETDSK .EQU CBIOS_LOC + 54
CBIOS_SETDSK .EQU CBIOS_LOC + 57
CBIOS_GETINFO .EQU CBIOS_LOC + 60
;
; PLACEHOLDERS FOR FUTURE CBIOS EXTENSIONS
;
CBIOS_RSVD1 .EQU CBIOS_LOC + 63
CBIOS_RSVD2 .EQU CBIOS_LOC + 76
CBIOS_RSVD3 .EQU CBIOS_LOC + 69
CBIOS_RSVD4 .EQU CBIOS_LOC + 72
;
; BIOS ENTRY POINTS
;
HB_INIT .EQU HBX_LOC + (0 * 3)
HB_INVOKE .EQU HBX_LOC + (1 * 3)
HB_SETBNK .EQU HBX_LOC + (2 * 3)
HB_GETBNK .EQU HBX_LOC + (3 * 3)
HB_COPY .EQU HBX_LOC + (4 * 3)
HB_XCOPY .EQU HBX_LOC + (5 * 3)
HB_FRGETB .EQU HBX_LOC + (6 * 3)
HB_FRGETW .EQU HBX_LOC + (7 * 3)
HB_FRPUTB .EQU HBX_LOC + (8 * 3)
HB_FRPUTW .EQU HBX_LOC + (9 * 3)
;
CDISK: .EQU 00004H ; LOC IN PAGE 0 OF CURRENT DISK NUMBER 0=A,...,15=P
IOBYTE: .EQU 00003H ; LOC IN PAGE 0 OF I/O DEFINITION BYTE.
;
; MEMORY CONFIGURATION
;
MSIZE .EQU 59 ; CP/M VERSION MEMORY SIZE IN KILOBYTES
;
; "BIAS" IS ADDRESS OFFSET FROM 3400H FOR MEMORY SYSTEMS
; THAN 16K (REFERRED TO AS "B" THROUGHOUT THE TEXT)
;
BIAS: .EQU (MSIZE-20)*1024
CCP: .EQU 3400H+BIAS ; BASE OF CCP
BDOS: .EQU CCP+806H ; BASE OF BDOS
BIOS: .EQU CCP+1600H ; BASE OF BIOS
CCPSIZ: .EQU 00800H
SYS_SIZ .EQU $3000 ; COMBINED SIZE OF SYSTEM AREA (OS + HBIOS PROXY)
HBBUF_SIZ .EQU 1024 ; INVARIANT HBIOS PHYSICAL DISK BUFFER, 1K
HBX_SIZ .EQU $200 ; HBIOS PROXY SIZE (SUBJECT TO CHANGE)
CPM_SIZ .EQU SYS_SIZ - HBX_SIZ ; NET SIZE OF ALL OS COMPONENTS (EXCLUDING HBIOS PROXY)
CCP_SIZ .EQU $800 ; INVARIANT SIZE OF CCP
BDOS_SIZ .EQU $E00 ; INVARIANT SIZE OF BDOS
CBIOS_SIZ .EQU CPM_SIZ - CCP_SIZ - BDOS_SIZ ; CBIOS IS THE REMAINDER
MEMTOP .EQU $10000 ; INVARIANT TOP OF Z80 ADDRESSABLE MEMORY
BNKTOP .EQU $8000 ; BANK MEMORY BARRIER
HBBUF_IMG .EQU BNKTOP - HBBUF_SIZ ; LOC OF DISK BUFFER IN HBIOS IMAGE BANK
HBX_IMG .EQU BNKTOP - HBX_SIZ ; LOC OF HBX IMAGE IN HBIOS IMAGE BANK
HBBUF_END .EQU BNKTOP ; END OF PHYSICAL DISK BUFFER IN HBIOS
HBBUF_LOC .EQU HBBUF_END - HBBUF_SIZ ; START OF PHYSICAL DISK BUFFER
HBX_END .EQU MEMTOP ; END OF HBIOS PROXY
HBX_LOC .EQU HBX_END - HBX_SIZ ; START OF HBIOS PROXY
CPM_END .EQU HBX_LOC ; END OF CPM COMPONENTS (INCLUDING CBIOS)
CPM_LOC .EQU CPM_END - CPM_SIZ ; START OF CPM COMPONENTS
CBIOS_END .EQU HBX_LOC ; END OF CBIOS
CBIOS_LOC .EQU CBIOS_END - CBIOS_SIZ ; START OF CBIOS
BDOS_END .EQU CBIOS_LOC ; END OF BDOS
BDOS_LOC .EQU BDOS_END - BDOS_SIZ ; START OF BDOS
CCP_END .EQU BDOS_LOC ; END OF CCP
CCP_LOC .EQU CCP_END - CCP_SIZ ; START OF CCP
CPM_ENT .EQU CBIOS_LOC ; CPM ENTRY POINT (IN CBIOS)
CCP_ENT .EQU CPM_LOC ; COMMAND PROCESSOR ENTRY POINT (IN CCP)
MON_LOC .EQU $C000 ; LOCATION OF MONITOR FOR RUNNING SYSTEM
MON_SIZ .EQU $1000 ; SIZE OF MONITOR BINARY IMAGE
MON_END .EQU MON_LOC + MON_SIZ ; END OF MONITOR
MON_DSKY .EQU MON_LOC + (0 * 3) ; MONITOR ENTRY (DSKY)
MON_SERIAL .EQU MON_LOC + (1 * 3) ; MONITOR ENTRY (SERIAL PORT)
CBIOS_BOOT .EQU CBIOS_LOC + (0 * 3)
CBIOS_WBOOT .EQU CBIOS_LOC + (1 * 3)
CBIOS_CONST .EQU CBIOS_LOC + (2 * 3)
CBIOS_CONIN .EQU CBIOS_LOC + (3 * 3)
CBIOS_CONOUT .EQU CBIOS_LOC + (4 * 3)
CBIOS_LIST .EQU CBIOS_LOC + (5 * 3)
CBIOS_PUNCH .EQU CBIOS_LOC + (6 * 3)
CBIOS_READER .EQU CBIOS_LOC + (7 * 3)
CBIOS_HOME .EQU CBIOS_LOC + (8 * 3)
CBIOS_SELDSK .EQU CBIOS_LOC + (9 * 3)
CBIOS_SETTRK .EQU CBIOS_LOC + (10 * 3)
CBIOS_SETSEC .EQU CBIOS_LOC + (11 * 3)
CBIOS_SETDMA .EQU CBIOS_LOC + (12 * 3)
CBIOS_READ .EQU CBIOS_LOC + (13 * 3)
CBIOS_WRITE .EQU CBIOS_LOC + (14 * 3)
CBIOS_LISTST .EQU CBIOS_LOC + (15 * 3)
CBIOS_SECTRN .EQU CBIOS_LOC + (16 * 3)
;
CDISK: .EQU 4 ; LOC IN PAGE 0 OF CURRENT DISK NUMBER 0=A,...,15=P
IOBYTE: .EQU 3 ; LOC IN PAGE 0 OF I/O DEFINITION BYTE
;
; HBIOS PROXY COMMON DATA BLOCK
; EXACTLY 32 BYTES AT $FFE0-$FFFF
;
HBX_XFC .EQU $10000 - $20 ; HBIOS PROXY INTERFACE AREA, 32 BYTES FIXED
;
HBX_XFCDAT .EQU HBX_XFC ; DATA PORTION OF HBIOX PROXY INTERFACE AREA
HB_CURBNK .EQU HBX_XFCDAT + 0 ; CURRENTLY ACTIVE LOW MEMORY BANK ID
;HB_PRVBNK .EQU HBX_XFCDAT + 1 ; PREVIOUS BANK (DEPRECATED)
HB_SRCADR .EQU HBX_XFCDAT + 2 ; BNKCPY: DESTINATION BANK ID
HB_SRCBNK .EQU HBX_XFCDAT + 4 ; BNKCPY: SOURCE BANK ID
HB_DSTADR .EQU HBX_XFCDAT + 5 ; BNKCPY: DESTINATION ADDRESS
HB_DSTBNK .EQU HBX_XFCDAT + 7 ; BNKCPY: SOURCE ADDRESS
HB_CNT .EQU HBX_XFCDAT + 8 ; BNKCPY: COUNT
;
HBX_XFCFNS .EQU HBX_XFC + $10 ; JUMP TABLE PORTION OF HBIOS PROXY INTERFACE AREA
HB_INVOKE .EQU HBX_XFCFNS + (0 * 3) ; INVOKE HBIOS FUNCTION
HB_BNKSEL .EQU HBX_XFCFNS + (1 * 3) ; SELECT LOW MEMORY BANK ID
HB_BNKCPY .EQU HBX_XFCFNS + (2 * 3) ; INTERBANK MEMORY COPY
HB_BNKCALL .EQU HBX_XFCFNS + (3 * 3) ; INTERBANK FUNCTION CALL
;HB_LOC .EQU HBX_XFCFNS + 12 ; ADDRESS OF HBIOS PROXY START (DEPRECATED)
HB_IDENT .EQU HBX_XFCFNS + 14 ; POINTER TO HBIOS IDENT DATA BLOCK
;
;
;
#IF (PLATFORM == PLT_N8VEM)
#DEFINE PLATFORM_NAME "N8VEM Z80"
@ -453,6 +393,9 @@ CCPSIZ: .EQU 00800H
#IF (PLATFORM == PLT_ZETA)
#DEFINE PLATFORM_NAME "ZETA Z80"
#ENDIF
#IF (PLATFORM == PLT_ZETA2)
#DEFINE PLATFORM_NAME "ZETA Z80 V2"
#ENDIF
#IF (PLATFORM == PLT_N8)
#DEFINE PLATFORM_NAME "N8 Z180"
#ENDIF

16
Source/BIOS/time.asm

@ -83,11 +83,10 @@ DOW_YR .DB 0
DOW_DT .DB 0
DOW_MO .DB 0
;
; PRINT DATE AND TIME
; INPUT: YYMMDDHHMMSS BUFFER AT HL (BCD ENCODED)
; DERIVE DOW FROM STARNDARD TIME BUFFER AT HL
; RETURN DOW IN A (0-6: SUN-SAT)
;
PRTDT:
PUSH HL ; SAVE BUFFER POINTER
TIMDOW:
INC HL ; POINT TO MONTH
LD A,(HL) ; LOAD MONTH (BCD)
CALL BCD2BIN ; CVT TO BINARY
@ -106,7 +105,14 @@ PRTDT:
LD DE,2000 ; ASSUME CENTURY IS 20XX
ADD HL,DE ; .. AND ADD IT IN TO THE YEAR VALUE IN HL
POP DE ; RECOVER DE (MONTH, DATE)
CALL DOW
JP DOW
;
; PRINT DATE AND TIME
; INPUT: YYMMDDHHMMSS BUFFER AT HL (BCD ENCODED)
;
PRTDT:
PUSH HL ; SAVE BUFFER POINTER
CALL TIMDOW
CALL PRTDOW
POP HL ; RECOVER PTR TO START OF BUF
CALL PC_SPACE

32
Source/BIOS/una.inc

@ -12,18 +12,22 @@ PPIX .EQU PPIBASE + 3 ; PPI CONTROL PORT
;
; MEMORY BANK CONFIGURATION (THIS NEEDS TO BE ERADICATED)
;
BID_BOOT .EQU $00 ; HARDWARE COLD BOOT (SETUP)
; .EQU $01 ; UNA BIOS
BID_COMIMG .EQU $02 ; LOADER + CP/M IMAGE TO COPY TO BID_COM
; .EQU $03 ; UNA FATFS DRIVER
BID_HBIMG .EQU $00 ; NO HBIOS IMAGE FOR UNA
BID_ROMD .EQU $05 ; FIRST ROM DRIVE BANK
BID_ROMDN .EQU $0F ; LAST ROM DRIVE BANK
BID_ROM0 .EQU $0000
BID_ROMN .EQU (BID_ROM0 + ((ROMSIZE / 32) - 1))
BID_RAM0 .EQU $8000
BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1))
BID_BOOT .EQU BID_ROM0 ; BOOT BANK
BID_BIOSIMG .EQU BID_ROM0 + 1 ; BIOS IMAGE BANK
BID_OSIMG .EQU BID_ROM0 + 2 ; ROM LOADER AND IMAGES BANK
BID_FSFAT .EQU BID_ROM0 + 3 ; FAT FILESYSTEM DRIVER BANK
BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK
BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK
BID_RAMD0 .EQU BID_RAM0 ; FIRST RAM DRIVE BANK
BID_RAMDN .EQU BID_RAMN - 4 ; LAST RAM DRIVE BANK
BID_AUX .EQU BID_RAMN - 3 ; AUX BANK (BPBIOS, ETC.)
BID_BIOS .EQU BID_RAMN - 2 ; BIOS BANK
BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.)
BID_COM .EQU BID_RAMN ; COMMON BANK, UPPER 32K
BID_RAMD .EQU $10 ; START OF RAM DRIVE
BID_RAMDN .EQU $1B ; LAST RAM DRIVE BANK
BID_BPB .EQU $1C ; RESERVED FOR BPBIOS BANK
BID_HB .EQU $00 ; NO HBIOS FOR UNA
; .EQU $1D ; SHADOW COPY OF UNABIOS IN RAM
BID_USR .EQU $1E ; LOW 32K OF TPA
BID_COM .EQU $1F ; COMMON BANK, UPPER 32K

10
Source/BIOS/ver.inc

@ -1,7 +1,7 @@
#DEFINE RMJ 2
#DEFINE RMN 6
#DEFINE RUP 5
#DEFINE RTP 17
#DEFINE BIOSVER "2.6.5"
#DEFINE BIOSBLD "Build 17"
#DEFINE RMN 7
#DEFINE RUP 0
#DEFINE RTP 0
#DEFINE BIOSVER "2.7.0"
#DEFINE BIOSBLD "Build 0 Developmental"
#DEFINE REVISION 500

8
Source/BIOS/xio.asm

@ -12,8 +12,6 @@ XIO_INIT: ; MINIMAL UART INIT
; SHOULD UNA SERIAL I/O BE RESET HERE???
#ENDIF
#IFNDEF UNALOAD
;
#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))
; ASCI0
@ -26,7 +24,7 @@ XIO_INIT: ; MINIMAL UART INIT
#ENDIF
#IF ((PLATFORM == PLT_N8VEM) | (PLATFORM == PLT_ZETA) | (PLATFORM == PLT_S2I))
#IF ((PLATFORM == PLT_N8VEM) | (PLATFORM == PLT_ZETA) | (PLATFORM == PLT_ZETA2) | (PLATFORM == PLT_S2I))
XIO_DIV .EQU (1843200 / (16 * CONBAUD))
@ -42,8 +40,6 @@ XIO_DIV .EQU (1843200 / (16 * CONBAUD))
LD A,6 ; DISABLE & RESET FIFO'S
OUT (SIO_FCR),A ; DO IT
#ENDIF
#ENDIF
RET
@ -83,7 +79,7 @@ XIO_OUTC1:
RET
#ENDIF
#IF ((PLATFORM == PLT_N8VEM) | (PLATFORM == PLT_ZETA) | (PLATFORM == PLT_S2I))
#IF ((PLATFORM == PLT_N8VEM) | (PLATFORM == PLT_ZETA) | (PLATFORM == PLT_ZETA2) | (PLATFORM == PLT_S2I))
PUSH AF ; SAVE INCOMING BYTE
XIO_OUTC1:
IN A,(SIO_LSR) ; READ LINE STATUS REGISTER

22
Source/CBIOS/Build.cmd

@ -0,0 +1,22 @@
@echo off
setlocal
set TOOLS=../../Tools
set PATH=%TOOLS%\tasm32;%TOOLS%\zx;%PATH%
set TASMTABS=%TOOLS%\tasm32
set ZXBINDIR=%TOOLS%/cpm/bin/
set ZXLIBDIR=%TOOLS%/cpm/lib/
set ZXINCDIR=%TOOLS%/cpm/include/
call :asm cbios || goto :eof
goto :eof
:asm
echo.
echo Building %1...
tasm -t80 -b -g3 -fFF %1.asm %1.bin %1.lst
goto :eof

5
Source/CBIOS/Clean.cmd

@ -0,0 +1,5 @@
@echo off
if exist *.bin del *.bin
if exist *.lst del *.lst
if exist *.prn del *.prn
if exist *.hex del *.hex

13
Source/CBIOS/build.inc

@ -0,0 +1,13 @@
; RomWBW Configured for N8VEM simh, 2015-02-14T09:50:52
;
#DEFINE TIMESTAMP "14-Feb-2015"
;
PLATFORM .EQU PLT_N8VEM ; HARDWARE PLATFORM
ROMSIZE .EQU 512 ; SIZE OF ROM IN KB
;
; INCLUDE PLATFORM SPECIFIC DEVICE DEFINITIONS
;
#INCLUDE "std-n8vem.inc"
;
#INCLUDE "config.asm"
;

2482
Source/CBIOS/cbios.asm

File diff suppressed because it is too large

BIN
Source/CBIOS/cbios.bin

Binary file not shown.

4381
Source/CBIOS/cbios.lst

File diff suppressed because it is too large

20
Source/CBIOS/config.asm

@ -0,0 +1,20 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR SIMH EMULATOR
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_ALWAYS ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
;
;DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
WRTCACHE .EQU TRUE ; ENABLE WRITE CACHING IN CBIOS (DE)BLOCKING ALGORITHM
DSKTRACE .EQU FALSE ; ENABLE TRACING OF CBIOS DISK FUNCTION CALLS
;
#DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M

25
Source/CBIOS/n8vem.inc

@ -0,0 +1,25 @@
;
; N8VEM HARDWARE IO PORT ADDRESSES AND MEMORY LOCATIONS
;
RTC .EQU $70 ; ADDRESS OF RTC LATCH AND INPUT PORT
;
; MEMORY BANK CONFIGURATION
;
BID_ROM0 .EQU $00
BID_ROMN .EQU (BID_ROM0 + ((ROMSIZE / 32) - 1))
BID_RAM0 .EQU $80
BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1))
BID_BOOT .EQU BID_ROM0 ; BOOT BANK
BID_BIOSIMG .EQU BID_ROM0 + 1 ; BIOS IMAGE BANK
BID_OSIMG .EQU BID_ROM0 + 2 ; ROM LOADER AND IMAGES BANK
BID_FSFAT .EQU BID_ROM0 + 3 ; FAT FILESYSTEM DRIVER BANK
BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK
BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK
BID_RAMD0 .EQU BID_RAM0 ; FIRST RAM DRIVE BANK
BID_RAMDN .EQU BID_RAMN - 4 ; LAST RAM DRIVE BANK
BID_AUX .EQU BID_RAMN - 3 ; AUX BANK (BPBIOS, ETC.)
BID_BIOS .EQU BID_RAMN - 2 ; BIOS BANK
BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.)
BID_COM .EQU BID_RAMN ; COMMON BANK, UPPER 32K

36
Source/CBIOS/std-n8vem.inc

@ -0,0 +1,36 @@
;
; CHARACTER DEVICES
;
CIODEV_UART .EQU $00
CIODEV_ASCI .EQU $10
CIODEV_VDU .EQU $20
CIODEV_CVDU .EQU $30
CIODEV_UPD7220 .EQU $40
CIODEV_N8V .EQU $50
CIODEV_PRPCON .EQU $60
CIODEV_PPPCON .EQU $70
CIODEV_CONSOLE .EQU $C0
CIODEV_CRT .EQU $D0
CIODEV_BAT .EQU $E0
CIODEV_NUL .EQU $F0
;
; DISK DEVICES (ONLY FIRST NIBBLE RELEVANT, SECOND NIBBLE RESERVED FOR UNIT)
;
DIODEV_MD .EQU $00
DIODEV_FD .EQU $10
DIODEV_RF .EQU $20
DIODEV_IDE .EQU $30
DIODEV_ATAPI .EQU $40
DIODEV_PPIDE .EQU $50
DIODEV_SD .EQU $60
DIODEV_PRPSD .EQU $70
DIODEV_PPPSD .EQU $80
DIODEV_HDSK .EQU $90
;
; VDA DEVICES (VIDEO DISPLAY ADAPTER)
;
VDADEV_NONE .EQU $00 ; NO VDA DEVICE
VDADEV_VDU .EQU $10 ; ECB VDU - 6545 CHIP
VDADEV_CVDU .EQU $20 ; ECB COLOR VDU - 8563 CHIP (NOT IMP)
VDADEV_UPD7220 .EQU $30 ; ECB uP7220 (NOT IMPLEMENTED)
VDADEV_N8V .EQU $40 ; N8 ONBOARD VDA SUBSYSTEM

308
Source/CBIOS/std.asm

@ -0,0 +1,308 @@
; ~/RomWBW/branches/s100/Source/std.asm 1/19/2013 dwg -
;
; The purpose of this file is to define generic symbols and to include
; the appropriate std-*.inc file to bring in platform specifics.
; There are four classes of systems supported by N8VEM.
; 1. N8VEM Platforms that include ECB interface
; 2. ZETA Genrally N8VEM-like, but no ECB
; 3. N8 Generally N8VEM-like bt 180 and extra embedded devices
; 4. S100 Assumes Z80 Master CPU Card
; All the classes require certain generic definitions, and these are
; defined here prior to the inclusion of platform specific .inc files.
; It is unfortunate, but all the possible config items must be defined
; here because the config gets read before the specific std-*.inc's
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
TRUE .EQU 1
FALSE .EQU 0
;
; PRIMARY HARDWARE PLATFORMS
;
PLT_N8VEM .EQU 1 ; N8VEM ECB Z80 SBC
PLT_ZETA .EQU 2 ; ZETA Z80 SBC
PLT_N8 .EQU 3 ; N8 (HOME COMPUTER) Z180 SBC
PLT_MK4 .EQU 4
PLT_S2I .EQU 5 ; SCSI2IDE
PLT_S100 .EQU 6 ; S100COMPUTERS Z80 based system
PLT_UNA .EQU 7 ; UNA BIOS
;
; RAM DISK INITIALIZATION OPTIONS
;
CLR_NEVER .EQU 0 ; NEVER CLEAR RAM DISK
CLR_AUTO .EQU 1 ; CLEAR RAM DISK IF INVALID DIR ENTRIES
CLR_ALWAYS .EQU 2 ; ALWAYS CLEAR RAM DISK
;
; FLOPPY DISK MEDIA SELECTIONS (ID'S MUST BE INDEX OF ENTRY IN FCD_TBL)
;
FDM720 .EQU 0 ; 3.5" FLOPPY, 720KB, 2 SIDES, 80 TRKS, 9 SECTORS
FDM144 .EQU 1 ; 3.5" FLOPPY, 1.44MB, 2 SIDES, 80 TRKS, 18 SECTORS
FDM360 .EQU 2 ; 5.25" FLOPPY, 360KB, 2 SIDES, 40 TRKS, 9 SECTORS
FDM120 .EQU 3 ; 5.25" FLOPPY, 1.2MB, 2 SIDES, 80 TRKS, 15 SECTORS
FDM111 .EQU 4 ; 8" FLOPPY, 1.11MB, 2 SIDES, 74 TRKS, 15 SECTORS
;
; MEDIA ID VALUES
;
MID_NONE .EQU 0
MID_MDROM .EQU 1
MID_MDRAM .EQU 2
MID_RF .EQU 3
MID_HD .EQU 4
MID_FD720 .EQU 5
MID_FD144 .EQU 6
MID_FD360 .EQU 7
MID_FD120 .EQU 8
MID_FD111 .EQU 9
;
; CONSOLE TERMINAL TYPE CHOICES
;
TERM_TTY .EQU 0
TERM_ANSI .EQU 1
TERM_WYSE .EQU 2
TERM_VT52 .EQU 3
;
; EMULATION TYPES
;
EMUTYP_NONE .EQU 0
EMUTYP_TTY .EQU 1
EMUTYP_ANSI .EQU 2
;
; SYSTEM GENERATION SETTINGS
;
SYS_CPM .EQU 1 ; CPM (IMPLIES BDOS + CCP)
SYS_ZSYS .EQU 2 ; ZSYSTEM OS (IMPLIES ZSDOS + ZCPR)
;
DOS_BDOS .EQU 1 ; BDOS
DOS_ZDDOS .EQU 2 ; ZDDOS VARIANT OF ZSDOS
DOS_ZSDOS .EQU 3 ; ZSDOS
;
CP_CCP .EQU 1 ; CCP COMMAND PROCESSOR
CP_ZCPR .EQU 2 ; ZCPR COMMAND PROCESSOR
;
; CONFIGURE DOS (DOS) AND COMMAND PROCESSOR (CP) BASED ON SYSTEM SETTING (SYS)
;
#IFNDEF BLD_SYS
SYS .EQU SYS_CPM
#ELSE
SYS .EQU BLD_SYS
#ENDIF
;
#IF (SYS == SYS_CPM)
DOS .EQU DOS_BDOS
CP .EQU CP_CCP
#DEFINE OSLBL "CP/M-80 2.2"
#ENDIF
;
#IF (SYS == SYS_ZSYS)
DOS .EQU DOS_ZSDOS
CP .EQU CP_ZCPR
#DEFINE OSLBL "ZSDOS 1.1"
#ENDIF
;
; INCLUDE VERSION AND BUILD SETTINGS
;
#INCLUDE "ver.inc" ; ADD BIOSVER
;
#INCLUDE "build.inc" ; INCLUDE USER CONFIG, ADD VARIANT, TIMESTAMP, & ROMSIZE
;
; INCLUDE PLATFORM SPECIFIC HARDWARE DEFINITIONS
;
#IF ((PLATFORM == PLT_N8VEM) | (PLATFORM == PLT_ZETA))
#INCLUDE "n8vem.inc"
#ENDIF
;
#IF (PLATFORM == PLT_S2I)
#INCLUDE "s2i.inc"
#ENDIF
;
#IF (PLATFORM == PLT_N8)
#INCLUDE "n8.inc"
#ENDIF
;
#IF (PLATFORM == PLT_MK4)
#INCLUDE "mk4.inc"
#ENDIF
;
#IF (PLATFORM == PLT_UNA)
#INCLUDE "una.inc"
#ENDIF
;
; CHARACTER DEVICE FUNCTIONS
;
CF_INIT .EQU 0
CF_IN .EQU 1
CF_IST .EQU 2
CF_OUT .EQU 3
CF_OST .EQU 4
;
; DISK OPERATIONS
;
DOP_READ .EQU 0 ; READ OPERATION
DOP_WRITE .EQU 1 ; WRITE OPERATION
DOP_FORMAT .EQU 2 ; FORMAT OPERATION
DOP_READID .EQU 3 ; READ ID OPERATION
;
; BIOS FUNCTIONS
;
#IF (PLATFORM == PLT_UNA)
BF_CIO .EQU $10
BF_CIOIN .EQU BF_CIO + 1 ; CHARACTER INPUT
BF_CIOOUT .EQU BF_CIO + 2 ; CHARACTER OUTPUT
BF_CIOIST .EQU BF_CIO + 3 ; CHARACTER INPUT STATUS
BF_CIOOST .EQU BF_CIO + 4 ; CHARACTER OUTPUT STATUS
;
BF_DIO .EQU $40
BF_DIORD .EQU BF_DIO + 2 ; DISK READ
BF_DIOWR .EQU BF_DIO + 3 ; DISK WRITE
#ELSE
BF_CIO .EQU $00
BF_CIOIN .EQU BF_CIO + 0 ; CHARACTER INPUT
BF_CIOOUT .EQU BF_CIO + 1 ; CHARACTER OUTPUT
BF_CIOIST .EQU BF_CIO + 2 ; CHARACTER INPUT STATUS
BF_CIOOST .EQU BF_CIO + 3 ; CHARACTER OUTPUT STATUS
BF_CIOCFG .EQU BF_CIO + 4 ; CHARACTER I/O CONFIG
;
BF_DIO .EQU $10
BF_DIORD .EQU BF_DIO + 0 ; DISK READ
BF_DIOWR .EQU BF_DIO + 1 ; DISK WRITE
BF_DIOST .EQU BF_DIO + 2 ; DISK STATUS
BF_DIOMED .EQU BF_DIO + 3 ; DISK MEDIA
BF_DIOID .EQU BF_DIO + 4 ; DISK IDENTIFY
BF_DIOGETBUF .EQU BF_DIO + 8 ; DISK GET BUFFER ADR
BF_DIOSETBUF .EQU BF_DIO + 9 ; DISK SET BUFFER ADR
BF_DIODEVCNT .EQU BF_DIO + 10 ; DISK DEVICE COUNT
BF_DIODEVINF .EQU BF_DIO + 11 ; DISK DEVICE INFO
;
BF_RTC .EQU $20
BF_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME
BF_RTCSETTIM .EQU BF_RTC + 1 ; SET TIME
BF_RTCGETBYT .EQU BF_RTC + 2 ; GET NVRAM BYTE BY INDEX
BF_RTCSETBYT .EQU BF_RTC + 3 ; SET NVRAM BYTE BY INDEX
BF_RTCGETBLK .EQU BF_RTC + 4 ; GET NVRAM DATA BLOCK
BF_RTCSETBLK .EQU BF_RTC + 5 ; SET NVRAM DATA BLOCK
;
BF_EMU .EQU $30
BF_EMUIN .EQU BF_EMU + 0 ; EMULATOR CHARACTER INPUT
BF_EMUOUT .EQU BF_EMU + 1 ; EMULATOR CHARACTER OUTPUT
BF_EMUIST .EQU BF_EMU + 2 ; EMULATOR CHARACTER INPUT STATUS
BF_EMUOST .EQU BF_EMU + 3 ; EMULATOR CHARACTER OUTPUT STATUS
BF_EMUCFG .EQU BF_EMU + 4 ; EMULATOR CHARACTER I/O CONFIG
BF_EMUINI .EQU BF_EMU + 8 ; INITIALIZE EMULATION
BF_EMUQRY .EQU BF_EMU + 9 ; QUERY EMULATION STATUS
;
BF_VDA .EQU $40
BF_VDAINI .EQU BF_VDA + 0 ; INITIALIZE VDU
BF_VDAQRY .EQU BF_VDA + 1 ; QUERY VDU STATUS
BF_VDARES .EQU BF_VDA + 2 ; SOFT RESET VDU
BF_VDASCS .EQU BF_VDA + 3 ; SET CURSOR STYLE
BF_VDASCP .EQU BF_VDA + 4 ; SET CURSOR POSITION
BF_VDASAT .EQU BF_VDA + 5 ; SET CHARACTER ATTRIBUTE
BF_VDASCO .EQU BF_VDA + 6 ; SET CHARACTER COLOR
BF_VDAWRC .EQU BF_VDA + 7 ; WRITE CHARACTER
BF_VDAFIL .EQU BF_VDA + 8 ; FILL
BF_VDACPY .EQU BF_VDA + 9 ; COPY
BF_VDASCR .EQU BF_VDA + 10 ; SCROLL
BF_VDAKST .EQU BF_VDA + 11 ; GET KEYBOARD STATUS
BF_VDAKFL .EQU BF_VDA + 12 ; FLUSH KEYBOARD BUFFER
BF_VDAKRD .EQU BF_VDA + 13 ; READ KEYBOARD
;
BF_SYS .EQU $F0
BF_SYSSETBNK .EQU BF_SYS + 0 ; SET CURRENT BANK
BF_SYSGETBNK .EQU BF_SYS + 1 ; GET CURRENT BANK
BF_SYSCPY .EQU BF_SYS + 2 ; COPY TO/FROM RAM/ROM MEMORY BANK
BF_SYSXCPY .EQU BF_SYS + 3 ; EXTENDED COPY SETUP
BF_SYSATTR .EQU BF_SYS + 4 ; GET/SET SYSTEM ATTRIBUTE VALUE
;BF_SYSXXXX .EQU BF_SYS + 5 ;
BF_SYSGETVER .EQU BF_SYS + 6 ; GET VERSION OF HBIOS
#ENDIF
;
; SYSTEM ATTRIBUTE IDS
;
AID_BOOTVOL .EQU 0 ; BOOT VOLUME, MSB=DEV/UNIT, LSB=LU
AID_BOOTROM .EQU 0 ; BANK ID OF ROM PAGE BOOTED
;
; MEMORY LAYOUT
;
SYS_SIZ .EQU $3000 ; COMBINED SIZE OF SYSTEM AREA (OS + HBIOS PROXY)
HBBUF_SIZ .EQU 1024 ; INVARIANT HBIOS PHYSICAL DISK BUFFER, 1K
HBX_SIZ .EQU $200 ; HBIOS PROXY SIZE (SUBJECT TO CHANGE)
CPM_SIZ .EQU SYS_SIZ - HBX_SIZ ; NET SIZE OF ALL OS COMPONENTS (EXCLUDING HBIOS PROXY)
CCP_SIZ .EQU $800 ; INVARIANT SIZE OF CCP
BDOS_SIZ .EQU $E00 ; INVARIANT SIZE OF BDOS
CBIOS_SIZ .EQU CPM_SIZ - CCP_SIZ - BDOS_SIZ ; CBIOS IS THE REMAINDER
MEMTOP .EQU $10000 ; INVARIANT TOP OF Z80 ADDRESSABLE MEMORY
BNKTOP .EQU $8000 ; BANK MEMORY BARRIER
HBBUF_IMG .EQU BNKTOP - HBBUF_SIZ ; LOC OF DISK BUFFER IN HBIOS IMAGE BANK
HBX_IMG .EQU BNKTOP - HBX_SIZ ; LOC OF HBX IMAGE IN HBIOS IMAGE BANK
HBBUF_END .EQU BNKTOP ; END OF PHYSICAL DISK BUFFER IN HBIOS
HBBUF_LOC .EQU HBBUF_END - HBBUF_SIZ ; START OF PHYSICAL DISK BUFFER
HBX_END .EQU MEMTOP ; END OF HBIOS PROXY
HBX_LOC .EQU HBX_END - HBX_SIZ ; START OF HBIOS PROXY
CPM_END .EQU HBX_LOC ; END OF CPM COMPONENTS (INCLUDING CBIOS)
CPM_LOC .EQU CPM_END - CPM_SIZ ; START OF CPM COMPONENTS
CBIOS_END .EQU HBX_LOC ; END OF CBIOS
CBIOS_LOC .EQU CBIOS_END - CBIOS_SIZ ; START OF CBIOS
BDOS_END .EQU CBIOS_LOC ; END OF BDOS
BDOS_LOC .EQU BDOS_END - BDOS_SIZ ; START OF BDOS
CCP_END .EQU BDOS_LOC ; END OF CCP
CCP_LOC .EQU CCP_END - CCP_SIZ ; START OF CCP
CPM_ENT .EQU CBIOS_LOC ; CPM ENTRY POINT (IN CBIOS)
CCP_ENT .EQU CPM_LOC ; COMMAND PROCESSOR ENTRY POINT (IN CCP)
MON_LOC .EQU $C000 ; LOCATION OF MONITOR FOR RUNNING SYSTEM
MON_SIZ .EQU $1000 ; SIZE OF MONITOR BINARY IMAGE
MON_END .EQU MON_LOC + MON_SIZ ; END OF MONITOR
MON_DSKY .EQU MON_LOC + (0 * 3) ; MONITOR ENTRY (DSKY)
MON_SERIAL .EQU MON_LOC + (1 * 3) ; MONITOR ENTRY (SERIAL PORT)
CBIOS_BOOT .EQU CBIOS_LOC + (0 * 3)
CBIOS_WBOOT .EQU CBIOS_LOC + (1 * 3)
CBIOS_CONST .EQU CBIOS_LOC + (2 * 3)
CBIOS_CONIN .EQU CBIOS_LOC + (3 * 3)
CBIOS_CONOUT .EQU CBIOS_LOC + (4 * 3)
CBIOS_LIST .EQU CBIOS_LOC + (5 * 3)
CBIOS_PUNCH .EQU CBIOS_LOC + (6 * 3)
CBIOS_READER .EQU CBIOS_LOC + (7 * 3)
CBIOS_HOME .EQU CBIOS_LOC + (8 * 3)
CBIOS_SELDSK .EQU CBIOS_LOC + (9 * 3)
CBIOS_SETTRK .EQU CBIOS_LOC + (10 * 3)
CBIOS_SETSEC .EQU CBIOS_LOC + (11 * 3)
CBIOS_SETDMA .EQU CBIOS_LOC + (12 * 3)
CBIOS_READ .EQU CBIOS_LOC + (13 * 3)
CBIOS_WRITE .EQU CBIOS_LOC + (14 * 3)
CBIOS_LISTST .EQU CBIOS_LOC + (15 * 3)
CBIOS_SECTRN .EQU CBIOS_LOC + (16 * 3)
;
CDISK: .EQU 4 ; LOC IN PAGE 0 OF CURRENT DISK NUMBER 0=A,...,15=P
IOBYTE: .EQU 3 ; LOC IN PAGE 0 OF I/O DEFINITION BYTE
;
; HBIOS PROXY COMMON DATA BLOCK
; EXACTLY 32 BYTES AT $FFE0-$FFFF
;
HBX_XFC .EQU $10000 - $20 ; HBIOS PROXY INTERFACE AREA, 32 BYTES FIXED
;
HBX_XFCDAT .EQU HBX_XFC ; DATA PORTION OF HBIOX PROXY INTERFACE AREA
HB_CURBNK .EQU HBX_XFCDAT + 0 ; CURRENTLY ACTIVE LOW MEMORY BANK ID
HB_PRVBNK .EQU HBX_XFCDAT + 1 ; PREVIOUS BANK (BANK SELECTED PRIOR TO CURRENT BANK)
HB_SRCADR .EQU HBX_XFCDAT + 2 ; BNKCPY: DESTINATION BANK ID
HB_SRCBNK .EQU HBX_XFCDAT + 4 ; BNKCPY: SOURCE BANK ID
HB_DSTADR .EQU HBX_XFCDAT + 5 ; BNKCPY: DESTINATION ADDRESS
HB_DSTBNK .EQU HBX_XFCDAT + 7 ; BNKCPY: SOURCE ADDRESS
HB_CNT .EQU HBX_XFCDAT + 8 ; BNKCPY: COUNT
;
HBX_XFCFNS .EQU HBX_XFC + $10 ; JUMP TABLE PORTION OF HBIOS PROXY INTERFACE AREA
HB_INVOKE .EQU HBX_XFCFNS + (0 * 3) ; INVOKE HBIOS FUNCTION
HB_BNKSEL .EQU HBX_XFCFNS + (1 * 3) ; SELECT LOW MEMORY BANK ID
HB_BNKCPY .EQU HBX_XFCFNS + (2 * 3) ; INTERBANK MEMORY COPY
HB_BNKCALL .EQU HBX_XFCFNS + (3 * 3) ; INTERBANK FUNCTION CALL
HB_LOC .EQU HBX_XFCFNS + 12 ; ADDRESS OF HBIOS PROXY START
HB_IDENT .EQU HBX_XFCFNS + 14 ; POINTER TO HBIOS IDENT DATA BLOCK

394
Source/CBIOS/util.asm

@ -0,0 +1,394 @@
;
;==================================================================================================
; UTILITY FUNCTIONS
;==================================================================================================
;
;
CHR_CR .EQU 0DH
CHR_LF .EQU 0AH
CHR_BS .EQU 08H
CHR_ESC .EQU 1BH
;
;__________________________________________________________________________________________________
;
; UTILITY PROCS TO PRINT SINGLE CHARACTERS WITHOUT TRASHING ANY REGISTERS
;
PC_SPACE:
PUSH AF
LD A,' '
JR PC_PRTCHR
PC_PERIOD:
PUSH AF
LD A,'.'
JR PC_PRTCHR
PC_COLON:
PUSH AF
LD A,':'
JR PC_PRTCHR
PC_COMMA:
PUSH AF
LD A,','
JR PC_PRTCHR
PC_LBKT:
PUSH AF
LD A,'['
JR PC_PRTCHR
PC_RBKT:
PUSH AF
LD A,']'
JR PC_PRTCHR
PC_LT:
PUSH AF
LD A,'<'
JR PC_PRTCHR
PC_GT:
PUSH AF
LD A,'>'
JR PC_PRTCHR
PC_LPAREN:
PUSH AF
LD A,'('
JR PC_PRTCHR
PC_RPAREN:
PUSH AF
LD A,')'
JR PC_PRTCHR
PC_ASTERISK:
PUSH AF
LD A,'*'
JR PC_PRTCHR
PC_CR:
PUSH AF
LD A,CHR_CR
JR PC_PRTCHR
PC_LF:
PUSH AF
LD A,CHR_LF
JR PC_PRTCHR
PC_PRTCHR:
CALL COUT
POP AF
RET
NEWLINE:
CALL PC_CR
CALL PC_LF
RET
;
; PRINT THE HEX BYTE VALUE IN A
;
PRTHEXBYTE:
PUSH AF
PUSH DE
CALL HEXASCII
LD A,D
CALL COUT
LD A,E
CALL COUT
POP DE
POP AF
RET
;
; PRINT THE HEX WORD VALUE IN BC
;
PRTHEXWORD:
PUSH AF
LD A,B
CALL PRTHEXBYTE
LD A,C
CALL PRTHEXBYTE
POP AF
RET
;
; CONVERT BINARY VALUE IN A TO ASCII HEX CHARACTERS IN DE
;
HEXASCII:
LD D,A
CALL HEXCONV
LD E,A
LD A,D
RLCA
RLCA
RLCA
RLCA
CALL HEXCONV
LD D,A
RET
;
; CONVERT LOW NIBBLE OF A TO ASCII HEX
;
HEXCONV:
AND 0FH ;LOW NIBBLE ONLY
ADD A,90H
DAA
ADC A,40H
DAA
RET
;
; OUTPUT A '$' TERMINATED STRING
;
WRITESTR:
PUSH AF
WRITESTR1:
LD A,(DE)
CP '$' ; TEST FOR STRING TERMINATOR
JP Z,WRITESTR2
CALL COUT
INC DE
JP WRITESTR1
WRITESTR2:
POP AF
RET
;
; PANIC: TRY TO DUMP MACHINE STATE AND HALT
;
PANIC:
PUSH HL
PUSH DE
PUSH BC
PUSH AF
LD DE,STR_PANIC
CALL WRITESTR
LD DE,STR_AF
CALL WRITESTR
POP BC ; AF
CALL PRTHEXWORD
LD DE,STR_BC
CALL WRITESTR
POP BC ; BC
CALL PRTHEXWORD
LD DE,STR_DE
CALL WRITESTR
POP BC ; DE
CALL PRTHEXWORD
LD DE,STR_HL
CALL WRITESTR
POP BC ; HL
CALL PRTHEXWORD
LD DE,STR_PC
CALL WRITESTR
POP BC ; PC
CALL PRTHEXWORD
LD DE,STR_SP
CALL WRITESTR
LD HL,0
ADD HL,SP ; SP
LD B,H
LD C,L
CALL PRTHEXWORD
RST 38
HALT
JP 0
;
;==================================================================================================
; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED)
;==================================================================================================
;
; OUTPUT CHARACTER FROM A
COUT:
PUSH AF
PUSH BC
PUSH DE
PUSH HL
LD C,A
CALL CBIOS_CONOUT
POP HL
POP DE
POP BC
POP AF
RET
;
; INPUT CHARACTER TO A
;
CIN:
PUSH BC
PUSH DE
PUSH HL
CALL CBIOS_CONIN
POP HL
POP DE
POP BC
RET
;
; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING)
;
CST:
PUSH BC
PUSH DE
PUSH HL
CALL CBIOS_CONST
POP HL
POP DE
POP BC
RET
;
STR_PANIC .DB "\r\n\r\n>>> FATAL ERROR:$"
STR_AF .DB " AF=$"
STR_BC .DB " BC=$"
STR_DE .DB " DE=$"
STR_HL .DB " HL=$"
STR_PC .DB " PC=$"
STR_SP .DB " SP=$"
;
; INDIRECT JUMP TO ADDRESS IN HL
;
; MOSTLY USEFUL TO PERFORM AN INDIRECT CALL LIKE:
; LD HL,xxxx
; CALL JPHL
;
JPHL: JP (HL)
;
; ADD HL,A
;
; A REGISTER IS DESTROYED!
;
ADDHLA:
ADD A,L
LD L,A
RET NC
INC H
RET
;
; MULTIPLY 8-BIT VALUES
; IN: MULTIPLY H BY E
; OUT: HL = RESULT, E = 0, B = 0
;
MULT8:
LD D,0
LD L,D
LD B,8
MULT8_LOOP:
ADD HL,HL
JR NC,MULT8_NOADD
ADD HL,DE
MULT8_NOADD:
DJNZ MULT8_LOOP
RET
;
; FILL MEMORY AT HL WITH VALUE A, LENGTH IN BC, ALL REGS USED
; LENGTH *MSUT* BE GREATER THAN 1 FOR PROPER OPERATION!!!
;
FILL:
LD D,H ; SET DE TO HL
LD E,L ; SO DESTINATION EQUALS SOURCE
LD (HL),A ; FILL THE FIRST BYTE WITH DESIRED VALUE
INC DE ; INCREMENT DESTINATION
DEC BC ; DECREMENT THE COUNT
LDIR ; DO THE REST
RET ; RETURN
;
; SET A BIT IN BYTE ARRAY AT HL, INDEX IN A
;
BITSET:
CALL BITLOC ; LOCATE THE BIT
OR (HL) ; SET THE SPECIFIED BIT
LD (HL),A ; SAVE IT
RET ; RETURN
;
; CLEAR A BIT IN BYTE ARRAY AT HL, INDEX IN A
;
BITCLR:
CALL BITLOC ; LOCATE THE BIT
CPL ; INVERT ALL BITS
AND (HL) ; CLEAR SPECIFIED BIT
LD (HL),A ; SAVE IT
RET ; RETURN
;
; GET VALUE OF A BIT IN BYTE ARRAY AT HL, INDEX IN A
;
BITTST:
CALL BITLOC ; LOCATE THE BIT
AND (HL) ; SET Z FLAG BASED ON BIT
RET ; RETURN
;
; LOCATE A BIT IN BYTE ARRAY AT HL, INDEX IN A
; RETURN WITH HL POINTING TO BYTE AND A WITH MASK FOR SPECIFIC BIT
;
BITLOC:
PUSH AF ; SAVE BIT INDEX
SRL A ; DIVIDE BY 8 TO GET BYTE INDEX
SRL A ; "
SRL A ; "
LD C,A ; MOVE TO BC
LD B,0 ; "
ADD HL,BC ; HL NOW POINTS TO BYTE CONTAINING BIT
POP AF ; RECOVER A (INDEX)
AND $07 ; ISOLATE REMAINDER, Z SET IF ZERO
LD B,A ; SETUP SHIFT COUNTER
LD A,1 ; SETUP A WITH MASK
RET Z ; DONE IF ZERO
BITLOC1:
SLA A ; SHIFT
DJNZ BITLOC1 ; LOOP AS NEEDED
RET ; DONE
;
; PRINT VALUE OF A IN DECIMAL WITH LEADING ZERO SUPPRESSION
;
PRTDECB:
PUSH HL
PUSH AF
LD L,A
LD H,0
CALL PRTDEC
POP AF
POP HL
RET
;
; PRINT VALUE OF HL IN DECIMAL WITH LEADING ZERO SUPPRESSION
;
PRTDEC:
PUSH BC
PUSH DE
PUSH HL
LD E,'0'
LD BC,-10000
CALL PRTDEC1
LD BC,-1000
CALL PRTDEC1
LD BC,-100
CALL PRTDEC1
LD C,-10
CALL PRTDEC1
LD E,0
LD C,-1
CALL PRTDEC1
POP HL
POP DE
POP BC
RET
PRTDEC1:
LD A,'0' - 1
PRTDEC2:
INC A
ADD HL,BC
JR C,PRTDEC2
SBC HL,BC
CP E
JR Z,PRTDEC3
LD E,0
CALL COUT
PRTDEC3:
RET
;
;==================================================================================================
; DATA
;==================================================================================================
;
STR_EMPTY .TEXT "<EMPTY>$"

7
Source/CBIOS/ver.inc

@ -0,0 +1,7 @@
#DEFINE RMJ 2
#DEFINE RMN 7
#DEFINE RUP 0
#DEFINE RTP 0
#DEFINE BIOSVER "2.7.0"
#DEFINE BIOSBLD "Build 0 Developmental"
#DEFINE REVISION 500

BIN
Source/RomDsk/ROM_1024KB/CLOCKS.DAT

Binary file not shown.

BIN
Source/RomDsk/ROM_1024KB/FLASH.COM

Binary file not shown.

880
Source/RomDsk/ROM_1024KB/WSREADME.TXT

@ -1,880 +0,0 @@
--THE README FILE--
------------------------
README contains late-breaking news and tips about WordStar,
and information about printers.
THE DISKS THAT CAME IN YOUR PACKAGE
-----------------------------------
The file HOMONYMS.TXT is included on the Speller disk
contrary to what is listed in Appendix D.
INSTALLATION
------------
WINSTALL and WSCHANGE
WordStar has two installation programs:
o WINSTALL contains the basic choices to install WordStar.
It is recommended for all users.
Be sure and install your valid disk drives since WordStar
running under CP/M cannot recover from attempts to access non-
existent disk drives.
o WSCHANGE contains every installation and customization
choice. It is designed for advanced users and users who
want to customize WordStar after they're familiar with it.
Use the menu listing below for a directory of the menus
in WSCHANGE.
Directory of WSCHANGE Menus
The chart below shows the organization of menus in WSCHANGE.
Print it out and refer to it as you customize WordStar.
Main Installation Menu
A Console
A Monitor
A Monitor selection
B Monitor name
C Screen sizing
B Function keys
C Monitor patches
A Special characters
B Cursor control
C Screen control
D Keyboard patches
A Function keys
B Save function keys
E Interface patches
A Console busy handshaking
B Special I/O subroutines
B Printer
A Printer choices
A Printer selection
B Printer name
C Default printer driver
B Printer driver library
A Select library file
B Create smaller library
C Add new printer driver
D Change printer driver data
C WS printer patches
A Custom print controls, printer initialization
NOTE: Disregard the "CUSTOM & SIMPLE Controls Save CUSTOM/SIMPLE
Controls" option shown. This is not available from this menu.
D Printing defaults
E Printer interface
A Printer port selection
B Printer busy handshaking
C Printer subroutines
C Computer
A Disk drives
A Valid disk drives
B Maximum valid user number
C Delay disk access if typing
B Operating system
A Single-user system
B Multi-user MP/M
C Multi-user Turbo DOS
D ZCPR3
C Memory usage
D WordStar files
E Directory display
F Computer patches
D WordStar
A Page layout
A Page sizing & margins
B Headers & footers
C Tabs
B Editing settings
A Edit screen & help level
B Typing
C Paragraph alignment
D Blocks
E Erase & unerase
F Lines & characters
G Find & replace
H WordStar 3.3 compatibility
I Printing defaults
C Other features
A Spelling checks
B Nondocument mode
C Indexing
D Shorthand (key macros)
E Merge printing
F Miscellaneous
E Patching
A Auto patcher
B Save settings
C Reset all settings
MEMORY USAGE
------------
WordStar requires a minimum TPA size of 50 kbytes to run
using the factory defaults. The TPA is the amount of memory
available in your computer for use by programs that have a
file type of COM. To see how big the TPA is in your computer,
press the question mark key (?) at the Opening Menu.
The amount of memory required by WordStar can be reduced by
approximately 3 kbytes if necessary. Use the WSCHANGE program
to select the minimum memory configuration option. The menu
will show you what capabilities are being reduced.
WordStar uses a general-purpose buffer for a variety of
tasks. WordStar allocates memory to this buffer for editing,
for merge printing, and at the Opening Menu (see BFSIZE in
PATCH.LST). The buffer used for editing is usually the most
sensitive to a reduced TPA size. (You may be able to use the
Opening Menu and print, but there may be insufficient memory
for editing.)
The merge print buffer is used only to hold merge print
variable names and data. Increase it if you run out of memory
while merge printing.
The Opening Menu buffer is used primarily to hold the file
directory, and for miscellaneous tasks.
LOW-MEMORY INDICATOR IN STATUS LINE
-----------------------------------
If the Low-Memory indicator appears in the status line, it
means that WordStar was unable to complete some function.
The most common symptoms are: the line number in the
status line is wrong, or a paragraph alignment could not be
completed. You may correct the line counter by saving your
file, exiting WordStar, and re-loading your file. To correct
the paragraph alignment, move your cursor to the point where
paragraph alignment stopped, and then press ^B again.
The reason this comes up is that WordStar was not able to fit
a big enough chunk of text into memory at one time.
When you first begin editing, WordStar uses the value from
EDSIZE in the user area to determine the minimum amount
of memory required for a page of text. The default
is set for approximately a 55 line by 66 column page. If
your page size is routinely larger than this, you may want
to increase EDSIZE. Multiply the number of lines by the
number of columns, and divide by 128.
If the Low-Memory indicator comes on while printing, it is due
to either the same reasons as for editing, or there is
insufficient memory to print the text proportionally spaced.
The amount of memory required depends on which printer
driver you are using. If you aren't using the .PS ON dot
command to turn proportional spacing on in your document,
low memory won't be a problem. Also, WordStar uses more
memory for merge printing than it does for regular printing
(around 2.5 kbytes more).
The Low-Memory indicator will also appear when a full disk error
is encountered during editing. Treat the disk-full error as you
would normally.
RAM-RESIDENT PROGRAMS
---------------------
RAM-resident programs, such as SmartKey, reduce the amount of
working memory (TPA) that WordStar can use. The new features in
WordStar, such as shorthand, may reduce the need for these
RAM-resident programs, thus freeing memory for WordStar.
ZCPR3 SUPPORT
-------------
In order to enable the ZCPR facilities within WordStar, the user
must use the Z3INS utility provided with ZCPR to install the
address of the ZCPR "environment" into WordStar. The environment
contains information that WordStar uses to support ZCPR-specific
functions.
Generally, the user should log onto the drive containing the file
WS.COM, and issue the command:
Z3INS SYS.ENV WS.COM
The user should also run either WINSTALL or WSCHANGE to further
install WordStar for ZCPR. However, this is not mandatory because
the only thing that happens is that the WordStar sign-on says
"ZCPR3," and the LGLUSR location in the user area is changed for a
maximum user number of 31. (The normal default for LGLUSR is 15.)
Once the user has installed WordStar for use with ZCPR, the user
will be able to use the following ZCPR features:
- A named directory may be used when logging onto a new drive/user.
- A named directory may be used instead of a drive/user as part
of any file name.
- The drive/user always appears above file directories. (For CP/M
only the drive letter is shown if the user number is zero.)
- The directory name also appears above the directory if one has
been defined for the currently logged drive/user.
- If WordStar does not find its OVR files on the current drive and
user, it will search the drives and user numbers in the ZCPR
search path rather than using its standard search pattern.
- WordStar installs itself as a ZCPR "shell" process which lets the
user enter any legal ZCPR command when running a program. (CP/M
can only run programs that are COM files.)
OSBORNE USERS
-------------
The command to change a hard carriage return to a soft carriage
return (document mode) or to turn Auto-indent ON (nondocument
mode) does not function on the Osborne because of a limitation
in its BIOS. The following patch can be applied to change the
command from ^^ to ^- (Ctrl-Hyphen):
Using DDT or SID in the file WSMSGS.OVR:
At 02DA replace 1E with a 1D
At 02EF replace 1E with a 1D
At 0359 replace 1E with a 1D
At 06B2 replace 1E with a 1D
At 06C9 replace 1E with a 1D
At the system prompt type SAVE 53 WSMSGS.OVR
For more information on how to use SID or DDT, see your CP/M
reference guide. As always, be sure and apply the patch to a
COPY of the file.
INSTRUCTIONS FOR TWO FLOPPY DISK COMPUTERS
------------------------------------------
Do not remove the Program disk while you are using WordStar.
The Printer Driver Library file (WSPRINT.OVR) on the WordStar
program disk is much smaller than the Printer Driver Library
file contained on the disk labeled PRINTER. Be sure to read the
section in "Starting" that discusses the printer library file.
RUN A PROGRAM
-------------
Once you press R you can type the drive and user number for the
program you want to run. You may run only .COM files. CCP commands,
such as DIR cannot be used.
INDEXING
--------
Using StarIndex
StarIndex 1.01 works with files created with this release of
WordStar.
"Can't Use That Printer" Message
When WordStar creates an index or table of contents, it uses
the printer drivers $INDEX and $TOC. If you created a smaller
WSPRINT.OVR file, you may have left these drivers out. To
return them to the file, copy the original WSPRINT.OVR file
onto your disk. When you create a smaller file again, be sure
to save these drivers. See Appendix C in the WordStar manual
for a list of other drivers to save.
SPELL CHECKING
--------------
Dual floppy disk users:
Unless you have sufficient room on your working WordStar program
disk for the files TW.COM, SPELL.COM, MARKFIX.COM, REVIEW.COM and
MAINDICT.CMP you will not be able to run a spell check from the
Opening Menu. You will need to exit WordStar and replace the
working WordStar program disk with the dictionary disk you created
during installation. This disk should contain the files listed
above. Make sure the disk in drive B has the file you want to
spell-check.
Follow the directions for running a spell check in The WORD Plus
manual.
UPGRADING FROM A PREVIOUS RELEASE
---------------------------------
This release of WordStar contains many new features and commands.
See the "What's New" booklet for a complete list. The following
changes came in too late to be included in the documentation.
Printer Patches
Previous versions of WordStar treat most dot matrix printers
and other non-daisy wheel printers as a DRAFT printer with a
few patchable items. Because of this, many users have used
these patches to be able to use certain features of their
printers. Sometimes the patches have been quite extensive, and
some users have many files that count on them.
The printer drivers of WordStar Release 4, on the other hand,
are very powerful. Almost every driver recognizes all the print
controls and all the dot commands. In fact, if a document is
written to be printed on one kind of printer, it is likely that
it will also print fine on some other printer.
However, if you want to use your existing files with WordStar
4, and those files rely on the user area being patched in a
special way, you can probably do so by moving the patches into
WordStar 4, and using the CUSTOM or SIMPLE printer driver.
On the INSTALL disk is a program called MOVEPRN.COM that
copies the printer driver portion of the previous release's
user area into files that can be installed into Release 4 with
the "auto patcher" feature.
Copy the program MOVEPRN.COM onto the disk containing the
WS.COM file for the previous version. Type
MOVEPRN WS.COM FILE1.PAT FILE2.PAT
MOVEPRN extracts the proper portions of the user area and
writes them into two files that may then be used with the "auto
patcher" feature of WSCHANGE.
FILE1.PAT is to be used with the general patching menu
(Choose E "Patching" on the WSCHANGE Main Menu, then A "Auto
Patcher"). FILE2.PAT should be used to install strings first
into the SIMPLE driver, and then into the CUSTOM driver (choose
B "Printer" on the WSCHANGE Main Menu, then B "Printer driver
library", D "Change printer driver data" and D "Driver auto
patcher").
Test print your document first with the SIMPLE driver, and then
with the CUSTOM driver to see which one produces the most
satisfactory results.
Also read Appendix C for more information on using the Auto
Patcher.
Hanging Indents
For WordStar Professional Release 4, MailMerge reformats indented
text created with ^OG to the current margins. If you want the text
to remain indented, use embedded ruler lines or the .RM, .LM,
and .PM commands. See the "Reference Guide" for more information.
Pressing ^OG to wrap back to the first tab on the ruler line after
having reached the last tab works the same way it did in previous
versions of WordStar, contrary to what is stated in the manual.
TERMINALS
---------
WordStar comes installed for an "idealized" special terminal.
WINSTALL and WSCHANGE allow you to install many terminals by
name, thus allowing WordStar to take advantage of the special
features that the terminal might support, such as underlining
or the function keys.
Use either WINSTALL or WSCHANGE to pick your specific terminal
or computer screen from the Monitor menu. If your terminal
isn't on the menu, it probably emulates one of those that is
there. Look in your terminal documentation to find out.
After you install WordStar for the proper terminal, run
WordStar and open the file PRINT.TST to see which attributes
(such as bold and underline) work on your screen.
WordStar will highlight the following in some way...
Bold (^PB)
Underline (^PS)
Strike-out (^PX)
Subscript (^PV)
Superscript (^PT)
Doublestrike (^PD)
Italics (^PY)
Blocks (^KB, ^KK)
Error messages
Most of the time, normal text will be shown in dim intensity,
and highlighted text will be shown in bright intensity. You
may have to use a brightness and/or contrast knob to adjust
your screen the first time you use WordStar this way.
If your dim intensity is too dim to see well, and you can't
adjust it, you can change the BRITE flag to ON using WSCHANGE.
This will invert bright and dim in your text, so that regular
text is displayed bright, and highlighted text will be
displayed as dim. However, text in the menus is not affected.
DISPLAY PROBLEMS WITH TERMINALS
-------------------------------
Once you have installed WordStar for the proper terminal, you
may still experience display problems.
If text from the previous screen remains after WordStar
displays a new screenful of text, the most likely cause is
cursor wrap. Basically, WordStar must know what happens to the
cursor when a character is displayed at the rightmost position
of the screen. It can either remain at the right edge, or it
can wrap to the beginning of the next line. The WRAP flag in
WordStar must be set either on or off to correspond to the
way the terminal works. (It is generally set for the
terminal's factory default, but the default can usually be
changed using the terminal's setup mode.)
Another possible cause for display problems is your terminal's
incomplete emulation of some other terminal. The most
common differences are...
Line insert (LININS), line delete (LINDEL),
Erase to end of screen (ERAEOS),
Erase to end of line (ERAEOL),
And, erase screen (ERASCR).
Look in the manual for your terminal and use WSCHANGE to see
if the control sequences match.
PRINTERS
--------
WHAT'S IN THIS SECTION
This section contains the following information:
Choosing a Printer
Setting Up Your Printer
Printer Drivers
Proportional Printing
Laser Printers
Information on Specific Printers
CHOOSING A PRINTER
WordStar is ready to work with over 100 printers. The printer you
choose during installation becomes your default printer. However,
when you print a document, you can choose any other printer. To
choose a default printer, follow these steps:
1. Look at the Printer Information brochure that came in your
package. The first chart shows the printers listed on the
Printer Selection Menus. If your printer is on the menu,
simply choose it during installation.
2. If your printer isn't listed on the menu, it may work like a
printer that is. Refer to the second chart in the Printer
Information brochure for a list of printers that work like
printers on the menu. When WordStar asks you to choose a
printer, choose the printer that works like yours.
3. If neither chart lists your printer, choose Typewriter Printer
(if your printer can backspace) or Draft Printer (if it can't).
These choices may not take advantage of all your printer's
features, but they will work with almost any printer.
Note: If you choose Draft or Typewriter, you can modify custom
print controls and printer initialization.
If you want to make more modifications to take advantage of your
printer's feature, choose the Custom or Simple drivers, then use
the WS Printer Patches section of WSCHANGE to tell WordStar the
codes for your printer. Refer to your printer manual for these
codes. Some printers work better with the Custom driver and some
with the Simple driver. Try using both and see which works better
with your printer. See the "Reference Guide" for more information.
SETTING UP YOUR PRINTER
Choosing a Printer Port
Each printer is connected to a printer port at the back of
the computer. WordStar looks for printers on the LST: port.
If your printer is connected to a different port, use
WSCHANGE to tell WordStar the correct port.
Testing Your Printer Connection
At the operating system prompt, type "PIP LST:=READ.ME." This
file should be printed by your printer. If it is not, your printer
may be connected to a different port. See your computer reference
manual, and the section on the STAT command in your CP/M
reference manual for more information.
PRINTER DRIVERS
The WSPRINT.OVR file on the Printers disk contains a printer
driver for each printer on the Printer Selection Menu. The printer
driver for a printer contains all the codes WordStar needs to work
with that printer.
Each printer driver has a short name. If you choose a printer when
you print a document, you see the names of the printer drivers, not
the names of the printers.
PROPORTIONAL PRINTING
WordStar supports proportional printing on a number of printers.
To turn on proportional printing, either install WordStar to
default to proportional printing, or place a ".PS on" command
in your document. At print time, WordStar selects the
appropriate proportional font based on the character width
(.CW) currently in effect.
The specific printer descriptions later in this section show
recommended character widths for proportional typefaces.
These widths are for a normal mix of upper- and lowercase
letters. If you have many words or phrases all in uppercase
or if you want your text less densely printed, choose a larger
character width.
While WordStar mostly sets character widths based on the
proportional-width table in the driver, on the more advanced
daisy wheel printers, WordStar uses the printer's proportional-
spacing mode. WordStar determines how much white space is needed
to right-justify the line based on its own proportional width
tables. If the table values don't match the wheel installed,
WordStar won't be able to justify the line correctly.
WordStar sends standard ASCII characters; if a proportional wheel
uses a different spoke mapping, set up the printer to handle this.
LASER PRINTERS
WordStar supports laser printer features such as font changes
and proportional spacing.
WordStar supports several laser printers: the Canon LPB-8 A1 & A2;
the Hewlett-Packard LaserJet, LaserJet+, and LaserJet 500+;
and the Ricoh LP4080. Refer to the "Specific Printer
Information" section of this file for information on these
printers. General notes about using laser printers are given below.
Paper Size and Margins
Laser printers come with preset page margins. You need to
compensate for these margins by changing page length in your
WordStar documents. The chart below shows the recommended
settings for 8 1/2 X 11 inch paper for both portrait and landscape
orientations. These settings allow 55 lines of text for portrait
orientation and 40 lines of text for landscape orientation (at 6
lines per inch). They also allow for a footer of up to 3 lines
and a one-line header. If you use multiple-line headers, adjust
the top margin accordingly.
Dot Default Portrait Landscape
Setting Command Value Orientation Orientation
------- ------- ------- ----------- -----------
page length .PL 66 62 47
top margin .MT 3 2 2
bottom margin .MB 8 5 5
header margin .HM 2 1 1
footer margin .FM 2 2 2
If the laser printer is your primary printer, you can use WSCHANGE
to make these settings the defaults.
Because laser printers leave small margins at the left and right
sides of the page, you may want to use a smaller page offset
setting (the default is .PO 8).
Form Feeds
When you print with a laser printer, answer Y for yes to the "Use
form feeds (Y/N)?" prompt at print time. (The default is NO.) If
the laser printer is your primary printer, you can use WSCHANGE to
change the default to yes.
WordStar Commands for Font Selection
The WordStar dot commands and print control commands listed below
determine the fonts used for printing a document.
.PR .PR OR=L selects landscape orientation; .PR OR=P (or just
.PR OR) selects portrait orientation (the default). If
either of these commands appears after the first printing
line on a page, the orientation will not change until the
following page.
.PS .PS ON selects proportionally spaced characters; .PS OFF
(the default) selects fixed-spaced characters.
.CW The character-width setting (.CW followed by the width in
120ths of an inch) determines the character pitch and font
selected for fixed-width printing. For proportional fonts, it
determines the point size and proportional-width table
selected.
.LQ .LQ ON selects near letter quality print (if supported by
your printer). LQ OFF selects draft quality print. Default
is ON.
^PY The italic print control toggles between normal and italic
characters when the appropriate italic font is available.
^PB The boldface print control toggles between normal and bold
characters when the appropriate bold font is available.
^PD The double strike print control used with the laser printers
toggles overprinting with a horizontal offset of 1/120"
between the two character images. This allows a bold effect
where no bold font is available.
^PA ^PA turns alternate pitch on. Use .CW to assign different
character widths to normal pitch (see ^PN below) and alternate
pitch so that each pitch accesses a different font. You can
then change fonts by switching between the two pitches. This
is the only way to use two fonts on the same line.
(See "Character width" and "Pitch" in the "Reference Guide.")
^PN ^PN turns normal pitch on. You can use it with ^PA as
described above.
^P@ When working with columns, if you use alternate and normal
pitch for two fonts, or if you use proportional spacing, you
may need to use ^P@ to make sure the columns line up.
Remember that the column position set with ^P@ is determined
by the normal pitch character width. (See "Columns" and
"Proportional spacing" in the "Reference Guide."
INFORMATION ON SPECIFIC PRINTERS
This section describes the capabilities of each printer listed on
the Printer Selection Menu. The printers are listed in alphabetical
order (except for the generic printers such as "Draft,"
"Typewriter," "Custom," "Simple," and the various print-to-disk
options, which are listed first).
There is a chart for each printer explaining how features work and
listing any special notes about the printer. Each printer is
described in the following format:
PRINTER NAME ----- Driver: (short name)
^PY Effect of italics/ribbon color print control
^PT/V Subscript/superscript information
.CW Information on available character widths and fonts. The
chart shows the .CW, .LQ, and .PS settings required to use
different fonts.
.LQ OFF .LQ ON .PS ON Font Name
------- ------ ------ ---------
.cw val .cw val recommended value (range) font 1
.cw val .cw val recommended value (range) font 2
.UL Continuous-underline information (if restrictions)
.UJ Microspace-justification information (if restrictions)
N/A means a command has no effect on this printer.
NOTES Switch settings, special features, anomalies.
DRAFT PRINTER (nonbackspacing) ----- Driver: DRAFT
^PD Overprints the line twice
^PB Overprints the line three times
^PS Overprints the underscore character in a separate pass
^PT/V Prints super/subscripts with a full line between
super/subscript and text
.LH Sets line height only in multiples of full lines
.CW N/A
.PS N/A
.LQ N/A
.UJ N/A
NOTES This driver works with any printer that doesn't automatically
perform a line feed when it receives a carriage return command. All
overprinting is done by returning the carriage and passing over the
line again.
TYPEWRITER PRINTER (backspacing) ----- Driver: TYPEWR
^PD Backspaces and overprints each character twice
^PB Backspaces and overprints each character three times
^PS Backspaces and overprints the underscore character
^PT/V Prints super/subscripts with a full line between
super/subscript and text
.LH Sets line height only in multiples of full lines
.CW N/A
.PS N/A
.LQ N/A
.UJ N/A
NOTES This driver works with any printer that doesn't automatically
perform a line feed when a it receives a carriage return command,
and responds to a backspace character. Overprinting is done by
backspacing.
AUTO LINE FEED PRINTER (backspacing) ----- Driver: AUTOLF
^PD Backspaces and overprints each character twice
^PB Backspaces and overprints each character three times
^PS Backspaces and overprints the underscore character
^PT/V Prints super/subscripts with a full line between
super/subscript and text
.LH Sets line height only in multiples of full lines
.CW N/A
.PS N/A
.LQ N/A
.UJ N/A
NOTES This driver works with any printer that automatically
performs a line feed when it receives a carriage return character,
and responds to a backspace command. Overprinting is done by
backspacing.
SIMPLE CUSTOMIZABLE PRINTERS ----- Driver: SIMPLE
All print controls cause control strings (on and off) in
the user area to be sent to the printer. These strings
are used by both the SIMPLE and CUSTOM drivers. They can
be installed with the WSCHANGE program.
.LQ Controlled by user area strings
.PS Controlled by user area strings
.CW N/A
.UJ N/A
.LH N/A
NOTES This printer driver prints the line in one pass, sending
control strings from the user area to select print enhancements.
CUSTOMIZABLE PRINTERS ----- Driver: CUSTOM
All print controls cause control strings (on and off) in
the user area to be sent to the printer. These strings
are used by both the SIMPLE and CUSTOM drivers. They can
be installed with the WSCHANGE program.
.LQ ON/OFF controlled by user area strings
.PS ON/OFF controlled by user area strings
.LH Sets line height only in multiples of full lines
.UJ N/A
.CW N/A
NOTES This driver prints the line in multiple passes, sending
control strings from the user area to select print enhancements.
PREVIEW TO DISK ----- Driver: PRVIEW
This driver prints documents to the PREVIEW.WS file to allow
you to preview the format and appearance of a document before
printing. Headers, footers, and pagination are shown correctly
and print controls remain in the file to display onscreen
attributes. Dot commands are not printed.
PRINT TO DISK WITHOUT PRINT CONTROLS ----- Driver: ASCII
This driver prints to the ASCII.WS file, stripping headers and
footers, high bits, and print controls.
PRINT TO DISK WITHOUT HEADERS AND FOOTERS ----- Driver: XTRACT
This driver prints to the XTRACT.WS disk file, stripping headers
and footers, but preserving high bits and print controls.
ANADEX 9500A, 9500B ----- Driver: 9500
^PY N/A
^PT/V Even superscript roll
.CW .CW Font name
--- ---------
9 13.3 cpi
10 12 cpi
12 10 cpi
18 6.7 cpi
20 6 cpi
24 5 cpi
.LH 1/24" resolution, use even values
.UJ This printer has no incremental horizontal positioning
.PS N/A
.LQ N/A
ANADEX 9501B, INTEQ 5100B ----- Driver: 9501B
^PY N/A
^PT/V Even superscript roll
.CW .CW Font name
--- ---------
7 16.7 cpi
8 15 cpi
10 12.5 cpi
12 10 cpi
14 8.3 cpi
16 7.5 cpi
20 6.2 cpi
24 5 cpi
.LH 1/24" resolution, use even values
.UJ This printer has no incremental horizontal positioning
.PS N/A
.LQ N/A
C. ITOH STARWRITER 1550 AND 8510 ----- Driver: C1550
^PY N/A
^PT/V Prints full-size characters with roll
.CW .CW Font Name
--- ---------
7 compressed
10 elite
12 pica
14 expanded compressed
20 expanded elite
24 expanded pica
.LQ N/A
.PS N/A
.UL Continuous underlining suppresses microspace justification
C. ITOH F10 STARWRITER ----- Driver: QUME
See Diablo 630, 1610, 1620 Daisy Wheel.
Note: Proportional printing was tested with a Theme 10 wheel.
CANON LBP-8A1 AND LBP-8A2 LASER PRINTER ----- Driver: LBP8
^PY Selects italics if appropriate font installed
^PT/V Prints full-size characters with roll
.PS .PS
.CW OFF ON Font Name
--- -- ---------
6 - 20 cpi
8 - 15 cpi
9 - 13.3 cpi
10 - 12 cpi (elite)
12 - 10 cpi
20 - 6 cpi
24 - 5 cpi
16 - 7.5 cpi
- 7 (0-8) Garland 8 point
- 10 (9-11) Garland 12 point
- 14 (12-17) Expanded 8 point
- 20 (18-30) Expand

BIN
Source/RomDsk/ROM_512KB/FLASH.COM

Binary file not shown.

BIN
Source/RomDsk/mk4_diskio3/FDTST.COM

Binary file not shown.

BIN
Source/RomDsk/n8_2312/FDTST.COM

Binary file not shown.

BIN
Source/RomDsk/n8_2511/FDTST.COM

Binary file not shown.

BIN
Source/RomDsk/n8vem_dide/FDTST.COM

Binary file not shown.

BIN
Source/RomDsk/n8vem_diskio/FDTST.COM

Binary file not shown.

BIN
Source/RomDsk/n8vem_diskio3+cvdu/FDTST.COM

Binary file not shown.

BIN
Source/RomDsk/n8vem_diskio3/FDTST.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_ppisd/1200.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_ppisd/38400.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_ppisd/9600.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_ppisd/FDTST.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_ppisd/RTC.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_ppisd/XM.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_ppisd/XM5.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_ppp/1200.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_ppp/38400.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_ppp/9600.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_ppp/FDTST.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_ppp/RTC.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_ppp/TSTPPP.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_ppp/XM.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_ppp/XM5.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_std/1200.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_std/38400.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_std/9600.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_std/FDTST.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_std/PPIDETST.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_std/RTC.COM

Binary file not shown.

BIN
Source/RomDsk/zeta2_std/XM.COM

Binary file not shown.

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

Loading…
Cancel
Save