Reload v2.1.1 to trunk

This commit is contained in:
wayne
2012-10-23 07:55:29 +00:00
parent e3b6bc5d01
commit 8da2b1b720
688 changed files with 76635 additions and 0 deletions

143
trunk/Source/Build.ps1 Normal file
View File

@@ -0,0 +1,143 @@
param([string]$Config = "", [string]$RomSize = "", [string]$CPUType = "", [string]$SYS = "", [string]$RomName = "")
while ($true)
{
$ConfigFile = "config_${Config}.asm"
if (Test-Path $ConfigFile) {break}
if ($Config -ne "") {Write-Host "${ConfigFile} does not exist!"}
"Configurations available:"
Get-Item config_*.asm | foreach {Write-Host " >", $_.Name.Substring(7,$_.Name.Length - 11)}
$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()
}
while ($true)
{
if (($CPUType -eq "80") -or ($CPUType -eq "180")) {break}
$CPUType = (Read-Host -prompt "CPU Type Z[80|180]").Trim()
}
$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 = $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 = "../Output"
$RomFmt = "rom${RomSize}KB"
$BlankFile = "blank${RomSize}KB.dat"
$ConfigFile = "Config_${Config}.asm"
$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 'yyMMddThhmm') + '"'
$Variant = '"RomWBW-' + $Env:UserName + '"'
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 ${Config}, $(Get-Date)
;
#DEFINE TIMESTAMP ${TimeStamp}
#DEFINE VARIANT ${Variant}
;
ROMSIZE .EQU ${ROMSize} ; SIZE OF ROM IN KB
;
#INCLUDE "${ConfigFile}"
;
"@ | Out-File "build.inc" -Encoding ASCII
# Build components
if ($SYS -eq "CPM")
{
Asm 'ccpb03' -Output 'cp.bin'
Asm 'bdosb01' -Output 'dos.bin'
}
if ($SYS -eq "ZSYS")
{
Asm 'zcprw' -Architecture '85' -Output 'cp.bin'
Asm 'zsdos' -Output 'dos.bin'
}
Asm 'syscfg'
Asm 'cbios' "-dBLD_SYS=SYS_${SYS}"
Asm 'dbgmon'
Asm 'prefix'
Asm 'bootrom'
Asm 'bootapp'
Asm 'loader'
Asm 'pgzero'
Asm 'bnk1'
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' 'rom0.bin'
Concat 'pgzero.bin','bootrom.bin','syscfg.bin','loader.bin','bnk1.bin' 'rom1.bin'
Concat 'bootapp.bin','syscfg.bin','loader.bin','bnk1.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_${Config}/*.* 0:
cpmcp -f $RomFmt $RomDiskFile ../Apps/core/*.* 0:
cpmcp -f $RomFmt $RomDiskFile ../Output/${RomName}.sys 0:${SYS}.sys
Concat 'rom0.bin','rom1.bin',$RomDiskFile $RomFile
# Cleanup
Remove-Item $RomDiskFile

10
trunk/Source/Clean.cmd Normal file
View File

@@ -0,0 +1,10 @@
@echo off
if exist *.bin del *.bin
if exist *.com del *.com
if exist *.img del *.img
if exist *.rom del *.rom
if exist *.lst del *.lst
if exist *.exp del *.exp
if exist *.tmp del *.tmp
if exist *.mrk del *.mrk
if exist build.inc del build.inc

1
trunk/Source/Make.cmd Normal file
View File

@@ -0,0 +1 @@
@..\tools\gcc\mingw32-make %*

View File

@@ -0,0 +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'

2586
trunk/Source/bdosb01.asm Normal file

File diff suppressed because it is too large Load Diff

131
trunk/Source/bioshdr.inc Normal file
View File

@@ -0,0 +1,131 @@
; bioshdr.inc 5/10/2012 dwg - offsets into the BIOS Header data
B_BOOT .equ 0e600h
B_WBOOT .equ 0e603h
B_CONST .equ 0e606h
B_CONIN .equ 0e609h
B_CONOUT .equ 0e60ch
B_LIST .equ 0e60fh
B_PUNCH .equ 0e612h
B_READER .equ 0e615h
B_HOME .equ 0e618h
B_SELDSK .equ 0e61bh
B_SETTRK .equ 0e61eh
B_SETSEC .equ 0e621h
B_SETDMA .equ 0e624h
B_READ .equ 0e627h
B_WRITE .equ 0e62ah
B_LISTST .equ 0e62dh
B_SECTRN .equ 0e630h
B_BNKSEL .equ 0e633h
B_GETLU .equ 0e636h
B_SETLU .equ 0e639h
B_GETINFO .equ 0e63ch
B_RSVD1 .equ 0e63fh
B_RSVD2 .equ 0e642h
B_RSVD3 .equ 0e645h
B_RSVD4 .equ 0e648h
B_CNFGDATA .equ 0e64bh
B_RMJ .equ 0e64bh
B_RMN .equ 0e64ch
B_RUP .equ 0e64dh
B_RTP .equ 0e64eh
B_DSKBOOT .equ 0e64fh
B_BOOTDRV .equ 0e650h
B_MONTH .equ 0e651h
B_DAY .equ 0e652h
B_YEAR .equ 0e653h
B_HOUR .equ 0e654h
B_MIN .equ 0e655h
B_SEC .equ 0e656h
; Config Proper Start Here
B_FREQ .equ 0e657h
B_PLATFORM .equ B_FREQ+1
B_DIOPLAT .equ B_PLATFORM+1
B_VDUMODE .equ B_DIOPLAT+1
B_ROMSIZE .equ B_VDUMODE+1
B_RAMSIZE .equ B_ROMSIZE+2
B_CLRRAMDSK .equ B_RAMSIZE+2
B_DSKYENABLE .equ B_CLRRAMDSK+1
B_UARTENABLE .equ B_DSKYENABLE+1
B_VDUENABLE .equ B_UARTENABLE+1
B_FDENABLE .equ B_VDUENABLE+1
B_FDTRACE .equ B_FDENABLE+1
B_FDMEDIA .equ B_FDTRACE+1
B_FDMEDIAALT .equ B_FDMEDIA+1
B_FDMAUTO .equ B_FDMEDIAALT+1
B_IDEENABLE .equ B_FDMAUTO+1
B_IDETRACE .equ B_IDEENABLE+1
B_IDE8BIT .equ B_IDETRACE+1
B_IDECAPACITY .equ B_IDE8BIT+1
B_PPIDEENABLE .equ B_IDECAPACITY+2
B_PPIDETRACE .equ B_PPIDEENABLE+1
B_PPIDE8BIT .equ B_PPIDETRACE+1
B_PPIDECAPACITY .equ B_PPIDE8BIT+1
B_PPIDESLOW .equ B_PPIDECAPACITY+2
B_BOOTTYPE .equ B_PPIDESLOW+1
B_BAUDRATE .equ B_BOOTTYPE+1
B_CLKDIV .equ B_BAUDRATE+2
B_MEMWAIT .equ B_CLKDIV+1
B_IOWAIT .equ B_MEMWAIT+1
B_CNTLB0 .equ B_IOWAIT+1
B_CNTLB1 .equ B_CNTLB0+1
B_SDCAPACITY .equ B_CNTLB1+1
B_SDCSIO .equ B_SDCAPACITY+2
B_SDCSIOFAST .equ B_SDCSIO+1
B_DEFIOBYTE .equ B_SDCSIOFAST+1
B_TERMTYPE .equ B_DEFIOBYTE+1
B_REVISION .equ B_TERMTYPE+1
B_PRPSDENABLE .equ B_REVISION+2
B_PRPSDTRACE .equ B_PRPSDENABLE+1
B_PRPSDCAPACITY .equ B_PRPSDTRACE+1
B_PRPCONENABLE .equ B_PRPSDCAPACITY+2
B_DATASIZE .equ B_PRPCONENABLE+1
B_INFOVER .equ 0
B_STRBANNER .equ B_INFOVER+2
B_VARLOC .equ B_STRBANNER+2
B_TSTLOC .equ B_VARLOC+2
B_SECADR .equ B_TSTLOC+2
B_SEKDSK .equ B_SECADR+2
B_SEKTRK .equ B_SEKDSK+2
B_SEKSEC .equ B_SEKTRK+2
B_DSKOP .equ B_SEKSEC+2
B_DMAADR .equ B_DSKOP+2
B_DPHADR .equ B_DMAADR+2
B_XLT .equ B_DPHADR+2
B_HST .equ B_XLT+2
B_DIRBF .equ B_HST+2
B_DPBMAP .equ B_DIRBF+2
B_DSKMAP .equ B_DPBMAP+2
B_DPHMAP .equ B_DSKMAP+2
B_CIOMAP .equ B_DPHMAP+2
B_SECBUF .equ B_CIOMAP+2
B_ORGFDDATA .equ B_SECBUF+2
B_ORGIDEDATA .equ B_ORGFDDATA+2
B_ORGSDDATA .equ B_ORGIDEDATA+2
B_ORGPRPSDDATA .equ B_ORGSDDATA+2
B_ORGPPPSDDATA .equ B_ORGPRPSDDATA+2
B_INFOTBLSIZE .equ B_ORGPPPSDDATA+2
;;;;;;;;;;;;;;;;;;;;;
; eof - bioshdr.inc ;
;;;;;;;;;;;;;;;;;;;;;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

502
trunk/Source/bnk1.asm Normal file
View File

@@ -0,0 +1,502 @@
;__________________________________________________________________________________________________
;
; BANK1
;__________________________________________________________________________________________________
;
; bnk1.asm 5/23/2012 dwg Beta 4 - Enhanced SYS_GETCFG and SYS_SETCFG
.ORG 1000H
;
; INCLUDE GENERIC STUFF
;
#INCLUDE "std.asm"
;
;==================================================================================================
; BANK 1 ENTRY / JUMP TABLE
;==================================================================================================
;
; THIS IS THE ENTRY DISPATCH POINT FOR BANK1
;__________________________________________________________________________________________________
;
JP INITSYS
JP BIOS_DISPATCH
;
;==================================================================================================
; SYSTEM INITIALIZATION
;==================================================================================================
;
; AT THIS POINT, IT IS ASSUMED WE ARE OPERATING FROM RAM PAGE 1
;
INITSYS:
;
; INSTALL HBIOS PROXY IN UPPER MEMORY
;
LD HL,HB_IMG
LD DE,HB_LOC
LD BC,HB_SIZ
LDIR
;
LD HL,$8000 ; DEFAULT DISK XFR BUF ADDRESS
LD (DIOBUF),HL ; SAVE IT
;
#IF (PLATFORM != PLT_N8)
IN A,(RTC) ; RTC PORT, BIT 6 HAS STATE OF CONFIG JUMPER
; LD A,40H ; *DEBUG* SIMULATE JUMPER OPEN
; LD A,00H ; *DEBUG* SIMULATE JUMPER SHORTED
AND 40H ; ISOLATE BIT 6
JR Z,INITSYS1 ; IF BIT6=0, SHORTED, USE ALT CONSOLE
LD A,DEFCON ; LOAD DEF CONSOLE DEVICE CODE
JR INITSYS2 ; CONTINUE
INITSYS1:
LD A,ALTCON ; LOAD ALT CONSOLE DEVICE CODE
INITSYS2:
LD (CONDEV),A ; SET THE ACTIVE CONSOLE DEVICE
#ENDIF
;
; PERFORM DEVICE INITIALIZATION
;
#IF (UARTENABLE)
CALL UART_INIT
#ENDIF
#IF (VDUENABLE)
CALL VDU_INIT
#ENDIF
#IF (PRPENABLE)
CALL PRP_INIT
#ENDIF
#IF (PPPENABLE)
CALL PPP_INIT
#ENDIF
#IF (DSKYENABLE)
CALL DSKY_INIT
#ENDIF
#IF (FDENABLE)
CALL FD_INIT
#ENDIF
#IF (IDEENABLE)
CALL IDE_INIT
#ENDIF
#IF (PPIDEENABLE)
CALL PPIDE_INIT
#ENDIF
#IF (SDENABLE)
CALL SD_INIT
#ENDIF
#IF (HDSKENABLE)
CALL HDSK_INIT
#ENDIF
;
RET
;
;==================================================================================================
; IDLE
;==================================================================================================
;
;__________________________________________________________________________________________________
;
IDLE:
#IF (FDENABLE)
CALL FD_IDLE
#ENDIF
RET
;
;==================================================================================================
; BIOS FUNCTION DISPATCHER
;==================================================================================================
;
; MAIN BIOS FUNCTION
; B: FUNCTION
;__________________________________________________________________________________________________
;
BIOS_DISPATCH:
LD A,B ; REQUESTED FUNCTION IS IN B
CP BF_CIO + $10
JR C,CIO_DISPATCH
CP BF_DIO + $10
JR C,DIO_DISPATCH
CP BF_CLK + $10
JR C,CLK_DISPATCH
CP BF_VDU + $10
JR C,CRT_DISPATCH
CP BF_SYS ; SKIP TO BF_SYS VALUE AT $F0
CALL C,PANIC ; PANIC IF LESS THAN BF_SYS
JR SYS_DISPATCH ; OTHERWISE SYS CALL
CALL PANIC ; THIS SHOULD NEVER BE REACHED
;
; SETUP AND CALL CHARACTER DRIVER
; B: FUNCTION
; C: DEVICE/UNIT
; E: CHARACTER IN/OUT
;
CIO_DISPATCH:
LD A,C ; REQUESTED DEVICE/UNIT IS IN C
AND $F0 ; ISOLATE THE DEVICE PORTION
#IF (UARTENABLE)
CP CIODEV_UART
JP Z,UART_DISPATCH
#ENDIF
#IF (PRPENABLE & PRPCONENABLE)
CP CIODEV_PRPCON
JP Z,PRPCON_DISPATCH
#ENDIF
#IF (PPPENABLE & PPPCONENABLE)
CP CIODEV_PPPCON
JP Z,PPPCON_DISPATCH
#ENDIF
#IF (VDUENABLE)
CP CIODEV_VDU
JP Z,VDU_DISPATCH
#ENDIF
CALL PANIC
;
;
;
DIO_DISPATCH:
LD A,B
; DIO FUNCTIONS STARTING AT $18 ARE COMMON
; AND DO NOT DISPATCH TO DRIVERS
CP $18
JR NC,DIO_COMMON
; DISPATCH FUCNTION TO APPROPRIATE DRIVER
AND $0F ;
; HACK TO FILL IN HSTTRK AND HSTSEC
; BUT ONLY FOR READ/WRITE FUNCTION CALLS
; ULTIMATELY, HSTTRK AND HSTSEC ARE TO BE REMOVED
CP 2
JR NC,DIO_DISPATCH1
LD (HSTTRK),HL
LD (HSTSEC),DE
DIO_DISPATCH1:
LD A,C ; REQUESTED DEVICE/UNIT IS IN C
LD (HSTDSK),A ; TEMP HACK TO FILL IN HSTDSK
AND $F0 ; ISOLATE THE DEVICE PORTION
#IF (FDENABLE)
CP DIODEV_FD
JP Z,FD_DISPATCH
#ENDIF
#IF (IDEENABLE)
CP DIODEV_IDE
JP Z,IDE_DISPATCH
#ENDIF
#IF (PPIDEENABLE)
CP DIODEV_PPIDE
JP Z,PPIDE_DISPATCH
#ENDIF
#IF (SDENABLE)
CP DIODEV_SD
JP Z,SD_DISPATCH
#ENDIF
#IF (PRPENABLE & PRPSDENABLE)
CP DIODEV_PRPSD
JP Z,PRPSD_DISPATCH
#ENDIF
#IF (PPPENABLE & PPPSDENABLE)
CP DIODEV_PPPSD
JP Z,PPPSD_DISPATCH
#ENDIF
#IF (HDSKENABLE)
CP DIODEV_HDSK
JP Z,HDSK_DISPATCH
#ENDIF
CALL PANIC
;
; HANDLE COMMON DISK FUNCTIONS (NOT DEVICE DRIVER SPECIFIC)
;
DIO_COMMON:
SUB $18
JR Z,DIO_GBA
DEC A
JR Z,DIO_SBA
CALL PANIC
;
; DISK: GET BUFFER ADDRESS
;
DIO_GBA:
LD HL,(DIOBUF)
XOR A
RET
;
; DISK: SET BUFFER ADDRESS
;
DIO_SBA:
BIT 7,H ; IS HIGH ORDER BIT SET?
CALL Z,PANIC ; IF NOT, ADR IS IN LOWER 32K, NOT ALLOWED!!!
LD (DIOBUF),HL
XOR A
RET
;
;
;
CLK_DISPATCH:
CALL PANIC
;
;
;
CRT_DISPATCH:
CALL PANIC
;
;
;
SYS_DISPATCH:
LD A,B
CP BF_SYSGETCFG
JR Z,SYS_GETCFG
CP BF_SYSSETCFG
JR Z,SYS_SETCFG
CP BF_SYSBNKCPY
JR Z,SYS_BNKCPY
CALL PANIC
;
SYS_GETCFG:
LD HL,$0200 ; SETUP SOURCE OF CONFIG DATA
LD BC,$0100 ; SIZE OF CONFIG DATA
LDIR ; COPY IT
RET
;
SYS_SETCFG:
LD HL,$0200 ; SETUP SOURCE OF CONFIG DATA
LD BC,$0100
EX DE,HL
LDIR
RET
;
SYS_BNKCPY:
LD A,C ; BANK SELECTION TO A
PUSH IX
POP BC ; BC = BYTE COUNT TO COPY
JP $FF03 ; JUST PASS CONTROL TO HBIOS STUB IN UPPER MEMORY
;
; COMMON ROUTINE THAT IS CALLED BY CHARACTER IO DRIVERS WHEN
; AN IDLE CONDITION IS DETECTED (WAIT FOR INPUT/OUTPUT)
;
CIO_IDLE:
LD HL,IDLECOUNT ; POINT TO IDLE COUNT
DEC (HL) ; 256 TIMES?
CALL Z,IDLE ; RUN IDLE PROCESS EVERY 256 ITERATIONS
XOR A ; SIGNAL NO CHAR READY
RET ; AND RETURN
;
;==================================================================================================
; DEVICE DRIVERS
;==================================================================================================
;
#IF (UARTENABLE)
ORG_UART .EQU $
#INCLUDE "uart.asm"
SIZ_UART .EQU $ - ORG_UART
.ECHO "UART occupies "
.ECHO SIZ_UART
.ECHO " bytes.\n"
#ENDIF
;
#IF (VDUENABLE)
ORG_VDU .EQU $
#INCLUDE "vdu.asm"
SIZ_VDU .EQU $ - ORG_VDU
.ECHO "VDU occupies "
.ECHO SIZ_VDU
.ECHO " bytes.\n"
#ENDIF
;
#IF (PRPENABLE)
ORG_PRP .EQU $
#INCLUDE "prp.asm"
SIZ_PRP .EQU $ - ORG_PRP
.ECHO "PRP occupies "
.ECHO SIZ_PRP
.ECHO " bytes.\n"
#ENDIF
;
#IF (PPPENABLE)
ORG_PPP .EQU $
#INCLUDE "ppp.asm"
SIZ_PPP .EQU $ - ORG_PPP
.ECHO "PPP occupies "
.ECHO SIZ_PPP
.ECHO " bytes.\n"
#ENDIF
;
#IF (FDENABLE)
ORG_FD .EQU $
#INCLUDE "fd.asm"
SIZ_FD .EQU $ - ORG_FD
.ECHO "FD occupies "
.ECHO SIZ_FD
.ECHO " bytes.\n"
#ENDIF
#IF (IDEENABLE)
ORG_IDE .EQU $
#INCLUDE "ide.asm"
SIZ_IDE .EQU $ - ORG_IDE
.ECHO "IDE occupies "
.ECHO SIZ_IDE
.ECHO " bytes.\n"
#ENDIF
#IF (PPIDEENABLE)
ORG_PPIDE .EQU $
#INCLUDE "ppide.asm"
SIZ_PPIDE .EQU $ - ORG_PPIDE
.ECHO "PPIDE occupies "
.ECHO SIZ_PPIDE
.ECHO " bytes.\n"
#ENDIF
#IF (SDENABLE)
ORG_SD .EQU $
#INCLUDE "sd.asm"
SIZ_SD .EQU $ - ORG_SD
.ECHO "SD occupies "
.ECHO SIZ_SD
.ECHO " bytes.\n"
#ENDIF
#IF (HDSKENABLE)
ORG_HDSK .EQU $
#INCLUDE "hdsk.asm"
SIZ_HDSK .EQU $ - ORG_HDSK
.ECHO "HDSK occupies "
.ECHO SIZ_HDSK
.ECHO " bytes.\n"
#ENDIF
;
#DEFINE CIOMODE_CONSOLE
#DEFINE DSKY_KBD
#INCLUDE "util.asm"
;
;;;;#INCLUDE "memmgr.asm"
;
;==================================================================================================
; BANK ONE GLOBAL DATA
;==================================================================================================
;
CONDEV .DB DEFCON
;
IDLECOUNT .DB 0
;
HSTDSK .DB 0 ; DISK IN BUFFER
HSTTRK .DW 0 ; TRACK IN BUFFER
HSTSEC .DW 0 ; SECTOR IN BUFFER
;
DIOBUF .DW $FD00 ; PTR TO 512 BYTE DISK XFR BUFFER
;
;==================================================================================================
; FILL REMAINDER OF BANK
;==================================================================================================
;
SLACK: .EQU (7F00H - $)
.FILL SLACK,0FFH
;
.ECHO "BNK1 space remaining: "
.ECHO SLACK
.ECHO " bytes.\n"
;
;==================================================================================================
; HBIOS UPPER MEMORY STUB
;==================================================================================================
;
; THE FOLLOWING CODE IS RELOCATED TO THE TOP PAGE IN MEMORY TO HANDLE INVOCATION DISPATCHING
;
HB_IMG .EQU $
.ORG HB_LOC
;
;==================================================================================================
; HBIOS DISPATCH
;==================================================================================================
;
; DISPATCH JUMP TABLE FOR UPPER MEMORY HBIOS FUNCTIONS
;
JP HB_INIT
JP HB_BNKCPY
;
; MEMORY MANAGER
;
#INCLUDE "memmgr.asm"
;
;==================================================================================================
; HBIOS BOOT ROUTINE
;==================================================================================================
;
; SETUP RST 08 TO HANDLE MAIN BIOS FUNCTIONS
;
HB_INIT:
LD A,0C3H ; $C3 = JP
LD (8H),A
LD HL,HB_ENTRY
LD (9H),HL
RET
;
;==================================================================================================
; HBIOS BNKCPY ROUTINE
;==================================================================================================
;
; SELECT A DESIGNATED RAM/ROM BANK INTO LOWER 32K, THEN PERFORM A BULK MEMORY COPY
; A: BANK SELECTION (BIT 7: 1=RAM/0=ROM, BITS 0-6: BANK NUMBER)
; DE: DESTINATION ADDRESS
; HL: SOURCE ADDRESS
; BC: COUNT OF BYTES TO COPY;
;
HB_BNKCPY:
BIT 7,A ; CHECK BIT 7
JR NZ,HB_BNKCPY1 ; RAM PAGE
;
CALL ROMPG ; SELECT ROM PAGE
JR HB_BNKCPY2 ; GO TO COMMON STUFF
;
HB_BNKCPY1:
RES 7,A ; CLEAR BIT 7
CALL RAMPG ; SELECT RAM PAGE AND FALL THRU
;
HB_BNKCPY2:
LDIR ; DO THE COPY
LD A,1 ; RESELECT RAM PAGE 1
CALL RAMPG ; DO IT
RET ; BACK TO LOWER MEMORY
;
;==================================================================================================
; HBIOS ENTRY FOR RST 08 PROCESSING
;==================================================================================================
;
; ENTRY POINT FOR BIOS FUNCTIONS (TARGET OF RST 08)
;
HB_ENTRY:
LD (STACKSAV),SP ; SAVE ORIGINAL STACK FRAME
LD SP,STACK ; SETUP NEW STACK FRAME
PGRAMF(1) ; MAP RAM PAGE 1 INTO LOWER 32K
CALL 1003H ; CALL BANK 1 HBIOS FUNCTION DISPATCHER
PUSH AF ; SAVE AF (FUNCTION RETURN)
PGRAMF(0) ; MAP RAM PAGE 0 INTO LOWER 32K
POP AF ; RESTORE AF
LD SP,(STACKSAV) ; RESTORE ORIGINAL STACK FRAME
RET ; RETURN TO CALLER
;
; PRIVATE DATA
;
STACKSAV .DW 0
;
; JUST FOR FUN, PRIVATE STACK IS LOCATED AT TOP OF MEMORY...
;
STACK .EQU 0
;
;
;
HB_SLACK .EQU (HB_END - $)
.ECHO "STACK space remaining: "
.ECHO HB_SLACK
.ECHO " bytes.\n"
;
.FILL HB_SLACK,0FFH
;
.END

119
trunk/Source/bootapp.asm Normal file
View File

@@ -0,0 +1,119 @@
;___BOOTAPP____________________________________________________________________________________________________________
;
; APPLICATION BOOT MANAGER
;
; USED TO LOAD AN APPLICATION IMAGE BASED COPY OF THE SYSTEM
; REFER TO BANKEDBIOS.TXT FOR MORE INFORMATION.
;______________________________________________________________________________________________________________________
;
;
#INCLUDE "std.asm"
;
.ORG 0100H
;
DI ; NO INTERRUPTS
IM 1 ; INTERRUPT MODE 1
;
; PERFORM MINIMAL Z180 SPECIFIC INITIALIZATION
;
#IF (PLATFORM == PLT_N8)
; SET BASE FOR CPU IO REGISTERS
LD A,CPU_IOBASE
OUT0 (CPU_ICR),A
; SET CPU CLOCK DIV
LD A,Z180_CLKDIV << 7
OUT0 (CPU_CCR),A
; SET WAIT STATES
LD A,0 + (Z180_MEMWAIT << 6) | (Z180_IOWAIT << 4)
OUT0 (CPU_DCNTL),A
; MMU SETUP
LD A,80H
OUT0 (CPU_CBAR),A ; SETUP FOR 32K/32K BANK CONFIG
XOR A
OUT0 (CPU_BBR),A ; BANK BASE = 0
LD A,(RAMSIZE - 64) >> 2
OUT0 (CPU_CBR),A ; COMMON BASE = LAST (TOP) BANK
#ENDIF
;
; RELOCATE MONITOR/OS CODE FROM 8000H TO C000H
; - HBIOS PROXY AT $FF00 IS OVERLAID, BUT WE DON'T CARE
; ABOUT IT ANYMORE, IT WILL BE REFRESHED DURING HBIOS
; INIT LATER.
;
LD HL,8000H ; COPY MEMORY FROM 8000
LD DE,0C000H ; TO C000
LD BC,4000H ; COPY 16K
LDIR
;
; COPY FIRST $1000 BYTES TO $8000 (UPPER, NON-BANKED MEMORY)
; THIS INCLUDES OURSELVES AND THE LOADER CODE
;
;
; RELOCATE BOOT PHASE 2 AND LOADER CODE FROM 0000H TO 8000H
;
LD HL,0000H ; COPY MEMORY FROM 0000
LD DE,8000H ; TO 8000H
LD BC,1000H ; COPY 1000H BYTES
LDIR
;
JP PHASE2 ; JUMP TO PHASE 2 BOOT IN UPPER MEMORY
;
;______________________________________________________________________________________________________________________
;
; THIS IS THE PHASE 2 CODE THAT MUST EXECUTE IN UPPER MEMORY
;
.ORG $ + $8000 ; WE ARE NOW EXECUTING IN UPPER MEMORY
;
PHASE2:
LD SP,9000H ; INIT BOOT STACK
;
; COPY RAMPG0 TO RAMPG1
;
LD HL,0000H ; HL = LOCATION IN LOMEM TO COPY FROM/TO
LOOP:
LD DE,09000H ; DE = BUFFER ADDRESS
LD BC,1000H ; BYTES TO COPY (4K CHUNKS)
PUSH BC ; SAVE COPY SIZE
PUSH DE ; SAVE COPY DEST
PUSH HL ; SAVE COPY SOURCE
LD A,0 ; SELECT PAGE 1
CALL RAMPG ; OF ROM FOR COPY
LDIR ; COPY ROM -> BUFFER
POP DE ; RESTORE SOURCE AS NEW DESTINATION
POP HL ; RESTORE DESTINATION AS NEW SOURCE
POP BC ; RESTORE COPY SIZE
LD A,1 ; SELECT PAGE 1
CALL RAMPG ; OF RAM FOR COPY
LDIR ; COPY BUFFER -> RAM
EX DE,HL ; GET LOMEM POINTER BACK TO HL
LD A,H ; HIGH BYTE OF POINTER TO A
CP 80H ; HIGH BYTE WILL BE 80H WHEN WE ARE DONE
JP NZ,LOOP ; IF NOT DONE, LOOP TO DO NEXT 4K CHUNK
;
; INITIALIZE HBIOS AND JUMP TO LOADER
;
LD A,1 ; SETUP TO SELECT PAGE 1
CALL RAMPG ; SELECT RAM PAGE 1 (WHICH IS NOW LOADED WITH BNK1 CODE)
CALL 1000H ; CALL HBIOS INITIALIZATION
CALL RAMPGZ ; MAKE SURE RAM PAGE ZERO IS MAPPED TO LOWER 32K
CALL 0FF00H ; CALL HBIOS PROXY INITIALIZATION
;
JP 8400H ; JUMP TO LOADER
;______________________________________________________________________________________________________________________
;
; NOTE THAT MEMORY MANAGER CODE IS IN UPPER MEMORY!
;
#INCLUDE "memmgr.asm"
;______________________________________________________________________________________________________________________
;
; PAD OUT REMAINDER OF PAGE
;
.ORG $ - $8000 ; ORG BACK TO LOWER MEMORY
.FILL $0200 - $,$FF ; PAD OUT REMAINDER OF PAGE
;
.END

424
trunk/Source/bootgen.asm Normal file
View File

@@ -0,0 +1,424 @@
;___BOOTGEN___________________________________________________________________________________________________________
;
; COPY THE SYSTEM TO THE BOOT SECTORS OF AN IDE HDD
;
; CREATED BY : DAN WERNER 09 12.2009
;
;
;
;
;__CONSTANTS_________________________________________________________________________________________________________________________
;
CR: .EQU 0DH ; ASCII CARRIAGE RETURN CHARACTER
LF: .EQU 0AH ; ASCII LINE FEED CHARACTER
ESC: .EQU 1BH ; ASCII ESCAPE CHARACTER
BS: .EQU 08H ; ASCII BACKSPACE CHARACTER
;
;
;
;__MAIN_PROGRAM_____________________________________________________________________________________________________________________
;
.ORG 00100h ; FOR DEBUG IN CP/M (AS .COM)
LD HL,(0001H) ; GET WBOOT ADDRESS
LD BC,1603H ; GET CP/M TOP
SBC HL,BC ;
LD (CPMSTART),HL ; SET IT
DEC HL ;
LD SP,HL ; SETUP STACK
; PARSE COMMAND LINE
LD HL,0081H ; SET INDEX POINTER
LD B,(0080H) ; NUMBER OF BYTES
PARSECMD:
LD A,(HL) ; GET DRIVE LETTER ON COMMAND LINE
INC HL
CP 20H ; IS SPACE?
JP NZ,PARSEGOT ; JUMP ON NON-BLANK
DJNZ PARSECMD ; LOOP
PARSEERR:
LD DE,MSG_VALID ;
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
CALL 0005H
JP EXIT ; EXIT
PARSEGOT:
SUB 'A' ; TURN IT INTO A NUMERIC
JP C,PARSEERR ;
CP 16 ; VALID CP/M DRIVE?
JP P,PARSEERR ;
LD (DEVICENUMBER),A ; DEVICE ID
; GET NUMBER OF SECTORS PER TRACK
LD L,A ; L=DISK NUMBER 0,1,2,3,4
LD H,0 ; HIGH ORDER ZERO
ADD HL,HL ; *2
ADD HL,HL ; *4
ADD HL,HL ; *8
ADD HL,HL ; *16 (SIZE OF EACH HEADER)
PUSH HL ;
POP DE
LD HL,(0001H) ;
LD BC,0058 ;
ADD HL,BC ;
ADD HL,DE ; HL= DPBASE(DISKNO*16)
EX DE,HL ;
LD A,(DE) ;
LD L,A ;
INC DE ;
LD A,(DE) ;
LD H,A ;
EX DE,HL ;
LD A,(DE) ;
LD (SECTRACK),A ;
INC DE ;
LD A,(DE) ;
LD (SECTRACK+1),A ;
LD DE,DRIVE_MSG ;
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
CALL 0005H
LD A,(DEVICENUMBER) ;
ADD A,'A' ;
CALL COUT ;
LD A,':' ;
CALL COUT ;
CALL CRLF ;
LD DE,BASE_MSG ;
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
CALL 0005H
LD HL,(CPMSTART) ;
CALL PHL ;
LD DE,END_MSG ;
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
CALL 0005H
LD HL,(CPMEND) ;
CALL PHL ;
CALL CRLF ;
LD DE,SECTOR_MSG ;
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
CALL 0005H
LD HL,(SECTRACK) ;
CALL PHL ;
CALL CRLF ;
; RUN WITH GOOD OUTPUT
LD A,(DEVICENUMBER) ; SET DEVICE NUMBER
LD C,A
CALL SELDSK ; SELECT DISK
LD HL,000CH ; SET INITIAL SECTOR
LD (CURSECTOR),HL
LD HL,0000H ; SET INITIAL TRACK
LD (CURTRACK),HL ;
LD HL,(CPMSTART) ; SET BEGINNING OF CPM
LD (CURADDRESS),HL ;
LD BC,(DMAAD) ; SETUP THE DMA AREA
CALL SETDMA ;
LOOP:
LD BC,(CURSECTOR) ; SET SECTOR
CALL SETSEC ;
LD BC,(CURTRACK) ;
CALL SETTRK ;
CALL COPYTODMA ; COPY BYTES TO DMA
CALL WRITE ; WRITE SECTOR
LD HL,(CURADDRESS) ; IF IX>CPMEND, EXIT PROGRAM
LD BC,(CPMEND) ;
LD A,H ;
CP B ;
JP NZ,CONTINUE ;
LD A,L ;
CP C ;
JP M,ENDLOOP ;
CONTINUE:
LD HL,(CURSECTOR) ; GET NEXT TRACK & SECTOR
INC HL ;
LD (CURSECTOR),HL ;
LD BC,(SECTRACK) ;
LD A,H ;
CP B ;
JP NZ,LOOP ;
LD A,L ;
CP C ;
JP NZ,LOOP ;
LD HL,(CURTRACK) ;
INC HL ;
LD (CURTRACK),HL ;
LD HL,0000H ;
LD (CURSECTOR),HL ;
JP LOOP ;
ENDLOOP:
; WRITE CP/M BOOT START AND END ADDRESSES IN LAST TWO WORDS OF MEDIA INFO SECTOR
LD BC,000BH ; SET SECTOR
CALL SETSEC ;
LD BC,0000H ;
CALL SETTRK ;
CALL READ ;
LD HL,(DMAAD) ; SET ADDRESS IN BUFFER TO LAST TWO WORDS
LD BC,122 ;
ADD HL,BC ;
LD A,(CPMSTART) ;
LD (HL),A ;
LD A,(CPMSTART+1) ;
INC HL
LD (HL),A ;
LD A,(CPMEND) ;
INC HL
LD (HL),A ;
LD A,(CPMEND+1) ;
INC HL
LD (HL),A ;
LD A,(0001H) ;
DEC A ;
DEC A ;
DEC A ;
INC HL
LD (HL),A ;
LD A,(0002H) ;
INC HL
LD (HL),A ;
CALL WRITE ; WRITE SECTOR
EXIT:
LD DE,MSG_END ;
LD C,09H ; CP/M WRITE END STRING TO CONSOLE CALL
CALL 0005H ;
;
LD C,00H ; CP/M SYSTEM RESET CALL
CALL 0005H ; RETURN TO PROMPT
;___COPYTODMA_____________________________________________________________________________________
;
; COPY CURRENT ADDRESS BLOCK TO DMA
;_________________________________________________________________________________________________
COPYTODMA:
LD HL,(DMAAD) ; LOAD HL WITH DMA ADDRESS
LD E,L ;
LD D,H ; GET IT INTO DE
LD HL,(CURADDRESS) ; GET RAM ADDRESS TO COPY
LD BC,128 ; BC IS COUNTER FOR FIXED SIZE TRANSFER (128 BYTES)
LDIR ; TRANSFER
LD HL,(CURADDRESS) ; INCREMENT ADDRESS POINTER BY COPY SIZE
LD BC,128 ;
ADD HL,BC ;
LD (CURADDRESS),HL ;
RET
;__HXOUT_________________________________________________________________________________________________________________________
;
; PRINT THE ACCUMULATOR CONTENTS AS HEX DATA ON THE SERIAL PORT
;________________________________________________________________________________________________________________________________
;
HXOUT:
PUSH BC ; SAVE BC
LD B,A ;
RLC A ; DO HIGH NIBBLE FIRST
RLC A ;
RLC A ;
RLC A ;
AND 0FH ; ONLY THIS NOW
ADD A,30H ; TRY A NUMBER
CP 3AH ; TEST IT
JR C,OUT1 ; IF CY SET PRINT 'NUMBER'
ADD A,07H ; MAKE IT AN ALPHA
OUT1:
CALL COUT ; SCREEN IT
LD A,B ; NEXT NIBBLE
AND 0FH ; JUST THIS
ADD A,30H ; TRY A NUMBER
CP 3AH ; TEST IT
JR C,OUT2 ; PRINT 'NUMBER'
ADD A,07H ; MAKE IT ALPHA
OUT2:
CALL COUT ; SCREEN IT
POP BC ; RESTORE BC
RET ;
;__SPACE_________________________________________________________________________________________________________________________
;
; PRINT A SPACE CHARACTER ON THE SERIAL PORT
;________________________________________________________________________________________________________________________________
;
SPACE:
PUSH AF ; STORE AF
LD A,20H ; LOAD A "SPACE"
CALL COUT ; SCREEN IT
POP AF ; RESTORE AF
RET ; DONE
;__CRLF_________________________________________________________________________________________________________________________
;
; PRINT A CR/LF
;________________________________________________________________________________________________________________________________
;
CRLF:
PUSH AF ; STORE AF
LD A,0DH ; LOAD A "SPACE"
CALL COUT ; SCREEN IT
LD A,0AH ; LOAD A "SPACE"
CALL COUT ; SCREEN IT
POP AF ; RESTORE AF
RET ; DONE
;__COUT_________________________________________________________________________________________________________________________
;
; PRINT CONTENTS OF A
;________________________________________________________________________________________________________________________________
;
COUT:
PUSH BC ;
PUSH AF ;
PUSH HL ;
PUSH DE ;
LD (COUT_BUFFER),A ;
LD DE,COUT_BUFFER ;
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
CALL 0005H
POP DE ;
POP HL ;
POP AF ;
POP BC ;
RET ; DONE
;__PHL_________________________________________________________________________________________________________________________
;
; PRINT THE HL REG ON THE SERIAL PORT
;________________________________________________________________________________________________________________________________
;
PHL:
LD A,H ; GET HI BYTE
CALL HXOUT ; DO HEX OUT ROUTINE
LD A,L ; GET LOW BYTE
CALL HXOUT ; HEX IT
CALL SPACE ;
RET ; DONE
COUT_BUFFER:
.DB 00
.DB "$"
BASE_MSG:
.TEXT "CP/M IMAGE="
.db "$"
END_MSG:
.TEXT "TO "
.db "$"
SECTOR_MSG:
.TEXT "SECTORS/TRACK="
.db "$"
DRIVE_MSG:
.TEXT "DRIVE="
.db "$"
;__CBIOS_________________________________________________________________________________________________________________________
;
; CBIOS JUMP TABLE
;________________________________________________________________________________________________________________________________
;
SELDSK: ;SELECT DISK
PUSH BC ;
LD HL,(0001H) ;
LD BC,0024 ;
ADD HL,BC ;
POP BC ;
JP (HL) ;
SETTRK: ;SET DISK TRACK ADDR
PUSH BC ;
LD HL,(0001H) ;
LD BC,0027 ;
ADD HL,BC ;
POP BC ;
JP (HL) ;
SETSEC: ;SET DISK SECTOR ADDR
PUSH BC ;
LD HL,(0001H) ;
LD BC,0030 ;
ADD HL,BC ;
POP BC ;
JP (HL) ;
SETDMA: ;SET DMA BUFFER ADDR
PUSH BC ;
LD HL,(0001H) ;
LD BC,0033 ;
ADD HL,BC ;
POP BC ;
JP (HL) ;
READ: ;READ SECTOR
PUSH BC ;
LD HL,(0001H) ;
LD BC,0036 ;
ADD HL,BC ;
POP BC ;
JP (HL) ;
WRITE: ;WRITE SECTOR
PUSH BC ;
LD HL,(0001H) ;
LD BC,0039 ;
ADD HL,BC ;
POP BC ;
JP (HL) ;
CURTRACK: .DW 0 ; CURRENT TRACK
CURSECTOR: .DW 0 ; CURRENT SECTOR
CURADDRESS: .DW 0 ; CURRENT CP/M ADDRESS
DMAAD: .DW 5000H ; DIRECT MEMORY ADDRESS
CPMEND: .DW 0FDFFH ; END OF CP/M
SECTRACK: .DW 0100H ; SECTORS PER TRACK
CPMSTART: .DW 0D000H ; START OF CP/M
DEVICENUMBER: .DB 2 ; DEVICE ID
MSG_END:
.DB LF, CR ; LINE FEED AND CARRIAGE RETURN
.TEXT "BOOTGEN COMPLETED."
.DB LF, CR ; LINE FEED AND CARRIAGE RETURN
.DB "$" ; LINE TERMINATOR
MSG_VALID:
.DB LF, CR ; LINE FEED AND CARRIAGE RETURN
.TEXT "USAGE: BOOTGEN (DRIVE):"
.DB LF, CR ; LINE FEED AND CARRIAGE RETURN
.TEXT "(DRIVE) IS ANY VALID CP/M DRIVE:"
.DB LF, CR ; LINE FEED AND CARRIAGE RETURN
.DB "$" ; LINE TERMINATOR
.END

109
trunk/Source/bootrom.asm Normal file
View File

@@ -0,0 +1,109 @@
;___BOOTROM____________________________________________________________________________________________________________
;
; ROM BOOT MANAGER
;
; HARDWARE COLD START WILL JUMP HERE FOR INITIALIZATION
; REFER TO BANKEDBIOS.TXT FOR MORE INFORMATION.
;______________________________________________________________________________________________________________________
;
;
#INCLUDE "std.asm"
;
.ORG 0100H
;
DI ; NO INTERRUPTS
IM 1 ; INTERRUPT MODE 1
;
; PERFORM MINIMAL Z180 SPECIFIC INITIALIZATION
;
#IF (PLATFORM == PLT_N8)
; SET BASE FOR CPU IO REGISTERS
LD A,CPU_IOBASE
OUT0 (CPU_ICR),A
; SET CPU CLOCK DIV
LD A,Z180_CLKDIV << 7
OUT0 (CPU_CCR),A
; SET WAIT STATES
LD A,0 + (Z180_MEMWAIT << 6) | (Z180_IOWAIT << 4)
OUT0 (CPU_DCNTL),A
; MMU SETUP
LD A,80H
OUT0 (CPU_CBAR),A ; SETUP FOR 32K/32K BANK CONFIG
XOR A
OUT0 (CPU_BBR),A ; BANK BASE = 0
LD A,(RAMSIZE - 64) >> 2
OUT0 (CPU_CBR),A ; COMMON BASE = LAST (TOP) BANK
#ENDIF
;
; COPY ENTIRE CONTENTS OF ROM BANK 0 TO HI RAM
; THIS INCLUDES OURSELVES AND THE LOADER CODE
; - HBIOS PROXY AT $FF00 IS OVERLAID, BUT WE DON'T CARE
; BECAUSE IT WILL BE REFRESHED DURING HBIOS
; INIT LATER.
;
LD HL,0000H ; COPY MEMORY FROM LOMEM (0000H)
LD DE,8000H ; TO HIMEM (8000H)
LD BC,8000H ; COPY ENTIRE BANK, 8000H BYTES
LDIR
;
JP PHASE2 ; JUMP TO PHASE 2 BOOT IN UPPER MEMORY
;
;______________________________________________________________________________________________________________________
;
; THIS IS THE PHASE 2 CODE THAT MUST EXECUTE IN UPPER MEMORY
;
.ORG $ + $8000 ; WE ARE NOW EXECUTING IN UPPER MEMORY
;
PHASE2:
LD SP,9000H ; INIT BOOT STACK
;
; COPY ROMPG1 TO RAMPG1
;
LD HL,0000H ; HL = LOCATION IN LOMEM TO COPY FROM/TO
LOOP:
LD DE,09000H ; DE = BUFFER ADDRESS
LD BC,1000H ; BYTES TO COPY (4K CHUNKS)
PUSH BC ; SAVE COPY SIZE
PUSH DE ; SAVE COPY DEST
PUSH HL ; SAVE COPY SOURCE
LD A,1 ; SELECT PAGE 1
CALL ROMPG ; OF ROM FOR COPY
LDIR ; COPY ROM -> BUFFER
POP DE ; RESTORE SOURCE AS NEW DESTINATION
POP HL ; RESTORE DESTINATION AS NEW SOURCE
POP BC ; RESTORE COPY SIZE
LD A,1 ; SELECT PAGE 1
CALL RAMPG ; OF RAM FOR COPY
LDIR ; COPY BUFFER -> RAM
EX DE,HL ; GET LOMEM POINTER BACK TO HL
LD A,H ; HIGH BYTE OF POINTER TO A
CP 80H ; HIGH BYTE WILL BE 80H WHEN WE ARE DONE
JP NZ,LOOP ; IF NOT DONE, LOOP TO DO NEXT 4K CHUNK
;
; INITIALIZE HBIOS AND JUMP TO LOADER
;
LD A,1 ; SETUP TO SELECT PAGE 1
CALL RAMPG ; SELECT RAM PAGE 1 (WHICH IS NOW LOADED WITH BNK1 CODE)
CALL 1000H ; CALL HBIOS INITIALIZATION
CALL RAMPGZ ; MAKE SURE RAM PAGE ZERO IS MAPPED TO LOWER 32K
CALL 0FF00H ; CALL HBIOS PROXY INITIALIZATION
;
JP 8400H ; JUMP TO LOADER
;______________________________________________________________________________________________________________________
;
; NOTE THAT MEMORY MANAGER CODE IS IN UPPER MEMORY!
;
#INCLUDE "memmgr.asm"
;______________________________________________________________________________________________________________________
;
; PAD OUT REMAINDER OF PAGE
;
.ORG $ - $8000 ; ORG BACK TO LOWER MEMORY
.FILL $0200 - $,$FF ; PAD OUT REMAINDER OF PAGE
;
.END

2123
trunk/Source/cbios.asm Normal file

File diff suppressed because it is too large Load Diff

1264
trunk/Source/ccpb03.asm Normal file

File diff suppressed because it is too large Load Diff

202
trunk/Source/cnfgdata.inc Normal file
View File

@@ -0,0 +1,202 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; cnfgdata.inc 6/02/2012 dwg - for 2.0 B8 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 6/04/2012 dwg - add BOOTLU per Wayne email ;
; 6/02/2012 dwg - change BOOTDISK to DEVUNIT ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 5/10/2012 dwg - cleanup for 2.0 architecture ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; cnfgdata.inc 3/14/2012 dwg - for 2.0 X5 ;
; 3/14/2012 dwg - retire LDRCON & DBGCON ;
; cnfgdata.inc 3/04/2012 dwg - for 2.0.0.0 ;
; 3/04/2012 dwg - added ptrs VAR_LOC & TST_LOC ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.DB RMJ,RMN,RUP,RTP ; config data version
; Loader data
;
; This area is for notes left by the loader from when the ccp/bdos/bios were
; placed in memory and kicked off, this allows logging onto the boot drive on startup
;
DISKBOOT .DB FALSE ; FALSE if ROM BOOT, otherwise TRUE
BOOTDEVICE .DB 0 ; if not ROM boot, has DEV/UNIT of boot device
BOOTLU .DW 0 ; logical unit on dev/unit for boot
.DB 0,0,0, 0,0,0 ; system startup time to be filled in by loader (from rtc)
;==================================================================================================
; CONFIGURATION
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
;CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
.DB CPUFREQ
;PLATFORM .EQU PLT_ZETA ; PLT_N8VEM, PLT_ZETA
.DB PLATFORM
;DIOPLT .EQU DIOPLT_ZETA ; DIOPLT_NONE, DIOPLT_DISKIO, DIOPLT_ZETA, DIOPLT_DIDE, DIOPLT_N8, DIOPLT_DISKIO3
.DB DIOPLT
;VDUMODE .EQU VDUPLT_NONE ; VDUPLT_NONE, VDUPLT_VDUV1, VDUPLT_PROPIO, VDUPLT_N8, VDUPLT_V2 (ONLY V1 IMPLEMENTED!)
.DB VDUMODE
;ROMSIZE .EQU 512 ; SIZE OF ROM IN KB, MUST MATCH YOUR HARDWARE!!!
.DW ROMSIZE
;RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
.DW RAMSIZE
;CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
.DB CLRRAMDISK
;DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
.DB DSKYENABLE
;UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
.DB UARTENABLE
;VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
.DB VDUENABLE
;FDENABLE .EQU TRUE ; TRUE FOR FLOPPY SUPPORT
.DB FDENABLE
;FDTRACE .EQU 1 ; 0=SILENT, 1=FATAL ERRORS, 2=ALL ERRORS, 3=EVERYTHING (ONLY RELEVANT IF FDENABLE = TRUE)
.DB FDTRACE
;FDMEDIA .EQU FDM720 ; FDM720 OR FDM144 (ONLY RELEVANT IF FDENABLE = TRUE)
.DB FDMEDIA
;FDMEDIAALT .EQU FDM144 ; ALTERNATIVE MEDIA TO TRY
.DB FDMEDIAALT
;FDMAUTO .EQU TRUE ; SELECT BETWEEN MEDIA OPTS ABOVE AUTOMATICALLY
.DB FDMAUTO
;IDEENABLE .EQU FALSE ; TRUE FOR IDE SUPPORT
.DB IDEENABLE
;IDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
.DB IDETRACE
;IDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
.DB IDE8BIT
;IDECAPACITY .EQU 64 ; SIZE OF DEVICE IN MEGABYTES
.DW IDECAPACITY
;PPIDEENABLE .EQU TRUE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
.DB PPIDEENABLE
;PPIDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPIDEENABLE = TRUE)
.DB PPIDETRACE
;PPIDE8BIT .EQU TRUE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
.DB PPIDE8BIT
;PPIDECAPACITY .EQU 64
.DW PPIDECAPACITY ; SIZE OF DEVICE IN MEGABYTES
; PPIDESLOW .EQU FALSE
.DB PPIDESLOW ; Add NOPs to PPIDE driver for recovery time
;BOOTTYPE: .EQU BT_JP2 ; BT_UART, BT_DSKY, BT_JP2
.DB BOOTTYPE
;BOOT_TIMEOUT .EQU 10 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
.DB BOOT_TIMEOUT
;BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
.DB BOOT_DEFAULT
;BAUDRATE .EQU 38400 ; IN BPS: 1200, 9600, 38400, ..., 115200
.DW BAUDRATE
#IF (PLATFORM == PLT_N8)
;Z180_CLKDIV .EQU 1 ; 0=XTAL/2, 1=XTAL/1
.DB Z180_CLKDIV
;Z180_MEMWAIT .EQU 0 ; MEMORY WAIT STATES TO INSERT (0-3)
.DB Z180_MEMWAIT
;Z180_IOWAIT .EQU 3 ; IO WAIT STATES TO INSERT (0-3)
.DB Z180_IOWAIT
;Z180_CNTLB0 .EQU 20H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
.DB Z180_CNTLB0
;Z180_CNTLB1 .EQU 20H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
.DB Z180_CNTLB1
.DB SDENABLE ; SD support boolean
.DB SDTRACE ; SD trace type
;SDCAPACITY .EQU 64 ; DEVICE SIZE IN MEGABYTES
.DW SDCAPACITY
.DB SDCSIO ; USE CSI/O PORT (boolean)
.DB SDCSIOFAST ; USE FAST CSI/O ALGORITHM (boolean)
#ELSE
.DB 0E5h ; placeholder for Z180_CLKDIV
.DB 0E5h ; placeholder for Z180_MEMWAIT
.DB 0E5h ; placeholder for Z180_IOWAIT
.DB 0E5h ; placeholder for Z180_CNTLB0
.DB 0E5h ; placeholder for Z180_CNTLB1
.DB 0e5h ; placeholder for SDENABLE
.DB 0e5h ; placeholder for SDTARCE
.DW 0e5e5h ; placeholder for SDCAPACITY
.DB 0e5h ; placeholder for SDCSIO
.DB 0e5h ; placeholder for SDCSIOFAST
#ENDIF
; DEFIOBYTE .EQU $00 ; INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE);
.DB DEFIOBYTE
; TERMTYPE .EQU TERM_TTY
.DB TERMTYPE
; REVISION .EQU 500 ; approximate svn revision of source tree
.DW REVISION
#IF (PRPSDENABLE)
.DB PRPSDENABLE
.DB PRPSDTRACE
.DW PRPSDCAPACITY
.DB PRPCONENABLE
#ELSE
.DB 0E5h ; placeholder for PRPSDENABLE
.DB 0E5h ; placeholder for PRPSDTARCE
.DW 0E5E5h ; placeholder for PRPSDCAPACITY
.DB 0E5h ; placeholder for PRPCONENABLE
#ENDIF
; DATASIZE .EQU 0700h ;
.DW BIOSSIZE
;PPPENABLE .EQU FALSE ; TRUE FOR PARPORTPROP SUPPORT
.DB PPPENABLE
;PPPSDENABLE .EQU TRUE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
.DB PPPSDENABLE
;PPPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPPENABLE = TRUE)
.DB PPPSDTRACE
;PPPSDCAPACITY .EQU 64 ; CAPACITY OF PPP SD DEVICE (IN MB)
.DW PPPSDCAPACITY
;PPPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO)
.DB PPPCONENABLE
; PRPENABLE .EQU FALSE
.DB PRPENABLE
;;;;;;;;;;;;;;;;;;;;;;
; eof - cnfgdata.inc ;
;;;;;;;;;;;;;;;;;;;;;;

View File

@@ -0,0 +1,92 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR N8 5/8/2012
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8 ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
;
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)
;
DSKMAP .EQU DM_RAM ; DM_ROM, DM_RAM, DM_FD, DM_IDE, DM_PPIDE, DM_SD, DM_PRPSD, DM_PPPSD
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
;
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
;
FDENABLE .EQU TRUE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_N8 ; 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
;
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)
PPIDEMODE .EQU PPIDEMODE_STD ; PPIDEMODE_STD, PPIDEMODE_DIO3
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
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIO .EQU TRUE ; TRUE IF USING THE CSIO PORT (N8 ONLY)
SDCSIOFAST .EQU FALSE ; TRUE IF USING THE LOOKUP TABLE RATHER THAN SHIFTS AND ROTATES (N8 ONLY)
PPISD .EQU FALSE ; TRUE IF USING PPISD MINI-BOARD (DO NOT COMBINE WITH PPIDE)
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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 PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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)
;
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 'R' ; SELECTION TO INVOKE AT TIMEOUT
;
BAUDRATE .EQU 38400 ; IN BPS: 1200, 9600, 38400, ..., 115200
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2
;
Z180_CLKDIV .EQU 1 ; 0=XTAL/2, 1=XTAL/1
Z180_MEMWAIT .EQU 0 ; MEMORY WAIT STATES TO INSERT (0-3)
Z180_IOWAIT .EQU 3 ; IO WAIT STATES TO INSERT (0-3)
Z180_CNTLB0 .EQU 20H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
Z180_CNTLB1 .EQU 20H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT

View File

@@ -0,0 +1,92 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR N8 5/8/2012
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8 ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
;
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)
;
DSKMAP .EQU DM_RAM ; DM_ROM, DM_RAM, DM_FD, DM_IDE, DM_PPIDE, DM_SD, DM_PRPSD, DM_PPPSD
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
;
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
;
FDENABLE .EQU TRUE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_N8 ; 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
;
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)
PPIDEMODE .EQU PPIDEMODE_STD ; PPIDEMODE_STD, PPIDEMODE_DIO3
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
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIO .EQU FALSE ; TRUE IF USING THE CSIO PORT (N8 ONLY)
SDCSIOFAST .EQU FALSE ; TRUE IF USING THE LOOKUP TABLE RATHER THAN SHIFTS AND ROTATES (N8 ONLY)
PPISD .EQU FALSE ; TRUE IF USING PPISD MINI-BOARD (DO NOT COMBINE WITH PPIDE)
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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 PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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)
;
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 'R' ; SELECTION TO INVOKE AT TIMEOUT
;
BAUDRATE .EQU 38400 ; IN BPS: 1200, 9600, 38400, ..., 115200
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2
;
Z180_CLKDIV .EQU 1 ; 0=XTAL/2, 1=XTAL/1
Z180_MEMWAIT .EQU 0 ; MEMORY WAIT STATES TO INSERT (0-3)
Z180_IOWAIT .EQU 3 ; IO WAIT STATES TO INSERT (0-3)
Z180_CNTLB0 .EQU 20H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
Z180_CNTLB1 .EQU 20H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT

View File

@@ -0,0 +1,86 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC 5/8/2012
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
;
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)
;
DSKMAP .EQU DM_RAM ; DM_ROM, DM_RAM, DM_FD, DM_IDE, DM_PPIDE, DM_SD, DM_PRPSD, DM_PPPSD
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
;
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
;
FDENABLE .EQU FALSE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_DIO ; 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
;
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)
PPIDEMODE .EQU PPIDEMODE_STD ; PPIDEMODE_STD, PPIDEMODE_DIO3
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
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIO .EQU FALSE ; TRUE IF USING THE CSIO PORT (N8 ONLY)
SDCSIOFAST .EQU FALSE ; TRUE IF USING THE LOOKUP TABLE RATHER THAN SHIFTS AND ROTATES (N8 ONLY)
PPISD .EQU FALSE ; TRUE IF USING PPISD MINI-BOARD (DO NOT COMBINE WITH PPIDE)
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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 PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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)
;
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 'R' ; SELECTION TO INVOKE AT TIMEOUT
;
BAUDRATE .EQU 38400 ; IN BPS: 1200, 9600, 38400, ..., 115200
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2

View File

@@ -0,0 +1,86 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC 5/8/2012
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
;
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)
;
DSKMAP .EQU DM_RAM ; DM_ROM, DM_RAM, DM_FD, DM_IDE, DM_PPIDE, DM_SD, DM_PRPSD, DM_PPPSD
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
;
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
;
FDENABLE .EQU TRUE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_DIDE ; 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
;
IDEENABLE .EQU TRUE ; TRUE FOR IDE SUPPORT
IDEMODE .EQU IDEMODE_DIDE ; 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)
PPIDEMODE .EQU PPIDEMODE_STD ; PPIDEMODE_STD, PPIDEMODE_DIO3
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
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIO .EQU FALSE ; TRUE IF USING THE CSIO PORT (N8 ONLY)
SDCSIOFAST .EQU FALSE ; TRUE IF USING THE LOOKUP TABLE RATHER THAN SHIFTS AND ROTATES (N8 ONLY)
PPISD .EQU FALSE ; TRUE IF USING PPISD MINI-BOARD (DO NOT COMBINE WITH PPIDE)
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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 PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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)
;
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 'R' ; SELECTION TO INVOKE AT TIMEOUT
;
BAUDRATE .EQU 38400 ; IN BPS: 1200, 9600, 38400, ..., 115200
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2

View File

@@ -0,0 +1,86 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC 5/8/2012
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
;
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)
;
DSKMAP .EQU DM_RAM ; DM_ROM, DM_RAM, DM_FD, DM_IDE, DM_PPIDE, DM_SD, DM_PRPSD, DM_PPPSD
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
;
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
;
FDENABLE .EQU TRUE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_DIO ; 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
;
IDEENABLE .EQU TRUE ; 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)
PPIDEMODE .EQU PPIDEMODE_STD ; PPIDEMODE_STD, PPIDEMODE_DIO3
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
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIO .EQU FALSE ; TRUE IF USING THE CSIO PORT (N8 ONLY)
SDCSIOFAST .EQU FALSE ; TRUE IF USING THE LOOKUP TABLE RATHER THAN SHIFTS AND ROTATES (N8 ONLY)
PPISD .EQU FALSE ; TRUE IF USING PPISD MINI-BOARD (DO NOT COMBINE WITH PPIDE)
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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 PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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)
;
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 'R' ; SELECTION TO INVOKE AT TIMEOUT
;
BAUDRATE .EQU 38400 ; IN BPS: 1200, 9600, 38400, ..., 115200
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2

View File

@@ -0,0 +1,86 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC W/ DISKIO V3 5/8/2012
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
;
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)
;
DSKMAP .EQU DM_RAM ; DM_ROM, DM_RAM, DM_FD, DM_IDE, DM_PPIDE, DM_SD, DM_PRPSD, DM_PPPSD
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
;
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
;
FDENABLE .EQU TRUE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_DIO3 ; 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
;
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 TRUE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
PPIDEMODE .EQU PPIDEMODE_DIO3 ; PPIDEMODE_STD, PPIDEMODE_DIO3
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
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIO .EQU FALSE ; TRUE IF USING THE CSIO PORT (N8 ONLY)
SDCSIOFAST .EQU FALSE ; TRUE IF USING THE LOOKUP TABLE RATHER THAN SHIFTS AND ROTATES (N8 ONLY)
PPISD .EQU FALSE ; TRUE IF USING PPISD MINI-BOARD (DO NOT COMBINE WITH PPIDE)
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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 PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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)
;
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 'R' ; SELECTION TO INVOKE AT TIMEOUT
;
BAUDRATE .EQU 38400 ; IN BPS: 1200, 9600, 38400, ..., 115200
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2

View File

@@ -0,0 +1,86 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC W/ PPIDE 5/8/2012
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
;
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)
;
DSKMAP .EQU DM_RAM ; DM_ROM, DM_RAM, DM_FD, DM_IDE, DM_PPIDE, DM_SD, DM_PRPSD, DM_PPPSD
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
;
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
;
FDENABLE .EQU FALSE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_DIO ; 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
;
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 TRUE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
PPIDEMODE .EQU PPIDEMODE_STD ; PPIDEMODE_STD, PPIDEMODE_DIO3
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
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIO .EQU FALSE ; TRUE IF USING THE CSIO PORT (N8 ONLY)
SDCSIOFAST .EQU FALSE ; TRUE IF USING THE LOOKUP TABLE RATHER THAN SHIFTS AND ROTATES (N8 ONLY)
PPISD .EQU FALSE ; TRUE IF USING PPISD MINI-BOARD (DO NOT COMBINE WITH PPIDE)
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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 PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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)
;
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 'R' ; SELECTION TO INVOKE AT TIMEOUT
;
BAUDRATE .EQU 38400 ; IN BPS: 1200, 9600, 38400, ..., 115200
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2

View File

@@ -0,0 +1,86 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC 5/8/2012
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
;
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)
;
DSKMAP .EQU DM_RAM ; DM_ROM, DM_RAM, DM_FD, DM_IDE, DM_PPIDE, DM_SD, DM_PRPSD, DM_PPPSD
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
;
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
;
FDENABLE .EQU FALSE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_DIO ; 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
;
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)
PPIDEMODE .EQU PPIDEMODE_STD ; PPIDEMODE_STD, PPIDEMODE_DIO3
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
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIO .EQU FALSE ; TRUE IF USING THE CSIO PORT (N8 ONLY)
SDCSIOFAST .EQU FALSE ; TRUE IF USING THE LOOKUP TABLE RATHER THAN SHIFTS AND ROTATES (N8 ONLY)
PPISD .EQU TRUE ; TRUE IF USING PPISD MINI-BOARD (DO NOT COMBINE WITH PPIDE)
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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 PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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)
;
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 'R' ; SELECTION TO INVOKE AT TIMEOUT
;
BAUDRATE .EQU 38400 ; IN BPS: 1200, 9600, 38400, ..., 115200
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2

View File

@@ -0,0 +1,86 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC 5/8/2012
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_PRPCON ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU CIODEV_UART ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
;
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)
;
DSKMAP .EQU DM_RAM ; DM_ROM, DM_RAM, DM_FD, DM_IDE, DM_PPIDE, DM_SD, DM_PRPSD, DM_PPPSD
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
;
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
;
FDENABLE .EQU FALSE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_DIO ; 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
;
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)
PPIDEMODE .EQU PPIDEMODE_STD ; PPIDEMODE_STD, PPIDEMODE_DIO3
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
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIO .EQU FALSE ; TRUE IF USING THE CSIO PORT (N8 ONLY)
SDCSIOFAST .EQU FALSE ; TRUE IF USING THE LOOKUP TABLE RATHER THAN SHIFTS AND ROTATES (N8 ONLY)
PPISD .EQU FALSE ; TRUE IF USING PPISD MINI-BOARD (DO NOT COMBINE WITH PPIDE)
;
PRPENABLE .EQU TRUE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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 PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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)
;
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 'R' ; SELECTION TO INVOKE AT TIMEOUT
;
BAUDRATE .EQU 38400 ; IN BPS: 1200, 9600, 38400, ..., 115200
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2

View File

@@ -0,0 +1,86 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC W/ VDU 5/8/2012
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
;
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)
;
DSKMAP .EQU DM_RAM ; DM_ROM, DM_RAM, DM_FD, DM_IDE, DM_PPIDE, DM_SD, DM_PRPSD, DM_PPPSD
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU TRUE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
;
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
;
FDENABLE .EQU FALSE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_DIO ; 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
;
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)
PPIDEMODE .EQU PPIDEMODE_STD ; PPIDEMODE_STD, PPIDEMODE_DIO3
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
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIO .EQU FALSE ; TRUE IF USING THE CSIO PORT (N8 ONLY)
SDCSIOFAST .EQU FALSE ; TRUE IF USING THE LOOKUP TABLE RATHER THAN SHIFTS AND ROTATES (N8 ONLY)
PPISD .EQU FALSE ; TRUE IF USING PPISD MINI-BOARD (DO NOT COMBINE WITH PPIDE)
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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 PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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)
;
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 'R' ; SELECTION TO INVOKE AT TIMEOUT
;
BAUDRATE .EQU 38400 ; IN BPS: 1200, 9600, 38400, ..., 115200
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2

View File

@@ -0,0 +1,86 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR SIMH EMULATOR 5/8/2012
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
;
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)
;
DSKMAP .EQU DM_RAM ; DM_ROM, DM_RAM, DM_FD, DM_IDE, DM_PPIDE, DM_SD, DM_PRPSD, DM_PPPSD
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTFIFO .EQU FALSE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
;
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
;
FDENABLE .EQU FALSE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_DIO ; 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
;
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)
PPIDEMODE .EQU PPIDEMODE_STD ; PPIDEMODE_STD, PPIDEMODE_DIO3
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
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIO .EQU FALSE ; TRUE IF USING THE CSIO PORT (N8 ONLY)
SDCSIOFAST .EQU FALSE ; TRUE IF USING THE LOOKUP TABLE RATHER THAN SHIFTS AND ROTATES (N8 ONLY)
PPISD .EQU FALSE ; TRUE IF USING PPISD MINI-BOARD (DO NOT COMBINE WITH PPIDE)
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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 PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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 TRUE ; TRUE FOR HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
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 'R' ; SELECTION TO INVOKE AT TIMEOUT
;
BAUDRATE .EQU 38400 ; IN BPS: 1200, 9600, 38400, ..., 115200
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2

View File

@@ -0,0 +1,86 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR ZETA 5/8/2012
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_ZETA ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
;
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)
;
DSKMAP .EQU DM_RAM ; DM_ROM, DM_RAM, DM_FD, DM_IDE, DM_PPIDE, DM_SD, DM_PRPSD, DM_PPPSD
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
;
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
;
FDENABLE .EQU TRUE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_ZETA ; 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
;
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 TRUE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
PPIDEMODE .EQU PPIDEMODE_STD ; PPIDEMODE_STD, PPIDEMODE_DIO3
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
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIO .EQU FALSE ; TRUE IF USING THE CSIO PORT (N8 ONLY)
SDCSIOFAST .EQU FALSE ; TRUE IF USING THE LOOKUP TABLE RATHER THAN SHIFTS AND ROTATES (N8 ONLY)
PPISD .EQU TRUE ; TRUE IF USING PPISD MINI-BOARD (DO NOT COMBINE WITH PPIDE)
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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 PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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)
;
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 'R' ; SELECTION TO INVOKE AT TIMEOUT
;
BAUDRATE .EQU 38400 ; IN BPS: 1200, 9600, 38400, ..., 115200
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2

View File

@@ -0,0 +1,86 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR ZETA W/ PPP 5/8/2012
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_ZETA ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_PPPCON ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU CIODEV_UART ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
;
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)
;
DSKMAP .EQU DM_RAM ; DM_ROM, DM_RAM, DM_FD, DM_IDE, DM_PPIDE, DM_SD, DM_PRPSD, DM_PPPSD
;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
;
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
;
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
;
FDENABLE .EQU TRUE ; TRUE FOR FLOPPY SUPPORT
FDMODE .EQU FDMODE_ZETA ; 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
;
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)
PPIDEMODE .EQU PPIDEMODE_STD ; PPIDEMODE_STD, PPIDEMODE_DIO3
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
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIO .EQU FALSE ; TRUE IF USING THE CSIO PORT (N8 ONLY)
SDCSIOFAST .EQU FALSE ; TRUE IF USING THE LOOKUP TABLE RATHER THAN SHIFTS AND ROTATES (N8 ONLY)
PPISD .EQU FALSE ; TRUE IF USING PPISD MINI-BOARD (DO NOT COMBINE WITH PPIDE)
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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 PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
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)
;
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 'R' ; SELECTION TO INVOKE AT TIMEOUT
;
BAUDRATE .EQU 38400 ; IN BPS: 1200, 9600, 38400, ..., 115200
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2

1590
trunk/Source/dbgmon.asm Normal file

File diff suppressed because it is too large Load Diff

341
trunk/Source/diskdefs Normal file
View File

@@ -0,0 +1,341 @@
diskdef ibm-3740
seclen 128
tracks 77
sectrk 26
blocksize 1024
maxdir 64
skew 6
boottrk 2
os p2dos
end
diskdef 4mb-hd
seclen 128
tracks 1024
sectrk 32
blocksize 2048
maxdir 256
skew 1
boottrk 0
os p2dos
end
diskdef pcw
seclen 512
tracks 40
sectrk 9
blocksize 1024
maxdir 64
skew 1
boottrk 1
os 3
end
diskdef pc1.2m
seclen 512
tracks 80
# this format uses 15 sectors per track, but 30 per cylinder
sectrk 30
blocksize 4096
maxdir 256
skew 1
boottrk 0
os 3
end
# CP/M 86 on 1.44MB floppies
diskdef cpm86-144feat
seclen 512
tracks 160
sectrk 18
blocksize 4096
maxdir 256
skew 1
boottrk 2
os 3
end
diskdef cf2dd
seclen 512
tracks 160
sectrk 9
blocksize 2048
maxdir 256
skew 1
boottrk 1
os 3
end
#amstrad: values are read from super block (special name hardcoded)
# Royal alphatronic
# setfdprm /dev/fd1 dd ssize=256 cyl=40 sect=16 head=2
diskdef alpha
seclen 256
tracks 40
sectrk 32
blocksize 2048
maxdir 128
skew 1
boottrk 2
os 2.2
end
# Apple II CP/M skew o Apple II DOS 3.3 skew
diskdef apple-do
seclen 256
tracks 35
sectrk 16
blocksize 1024
maxdir 64
skew 0
boottrk 3
os 2.2
end
# Apple II CP/M skew o Apple II PRODOS skew
diskdef apple-po
seclen 256
tracks 35
sectrk 16
blocksize 1024
maxdir 64
skew 0
boottrk 3
os 2.2
end
# MYZ80 hard drive (only works with libdsk, because it has a 256-byte header)
diskdef myz80
seclen 1024
tracks 64
sectrk 128
blocksize 4096
maxdir 1024
skew 1
boottrk 0
os 3
end
# Despite being Amstrad formats, CPC System and CPC Data don't have an Amstrad
# superblock. You'll need to use libdsk to access them because the Linux
# and Windows kernel drivers won't touch them.
diskdef cpcsys
seclen 512
tracks 40
sectrk 9
blocksize 1024
maxdir 64
skew 1
boottrk 2
os 3
end
diskdef cpcdata
seclen 512
tracks 40
sectrk 9
blocksize 1024
maxdir 64
skew 1
boottrk 0
os 3
end
# after being read in with no sector skew.
diskdef nigdos
seclen 512
# NigDos double sided disk format, 42 tracks * 2 sides
tracks 84
sectrk 10
blocksize 2048
maxdir 128
skew 1
boottrk 0
# this format wastes half of the directory entry
logicalextents 1
os 3
end
diskdef epsqx10
seclen 512
tracks 40
sectrk 20
blocksize 2048
maxdir 128
skew 0
boottrk 2
os 2.2
end
diskdef ibm-8ss
seclen 512
tracks 40
sectrk 8
blocksize 1024
maxdir 64
skew 0
boottrk 1
os 2.2
end
diskdef ibm-8ds
seclen 512
tracks 40
sectrk 8
blocksize 1024
maxdir 64
skew 0
boottrk 1
os 2.2
end
diskdef electroglas
seclen 512
tracks 80
sectrk 10
blocksize 2048
maxdir 256
skew 0
boottrk 1
os 3
end
# IBM CP/M-86
# setfdprm /dev/fd1 sect=8 dtr=1 hd ssize=512 tpi=48 head=1
diskdef ibmpc-514ss
seclen 512
tracks 40
sectrk 8
blocksize 1024
maxdir 64
skew 1
boottrk 1
os 2.2
end
# IBM CP/M-86
# setfdprm /dev/fd1 sect=8 dtr=1 hd ssize=512 tpi=48
diskdef ibmpc-514ds
seclen 512
tracks 80
sectrk 8
blocksize 2048
maxdir 64
skew 0
boottrk 2
os 2.2
end
diskdef p112
seclen 512
tracks 160
sectrk 18
blocksize 2048
maxdir 256
skew 1
boottrk 2
os 3
end
diskdef p112-old
seclen 512
tracks 160
sectrk 18
blocksize 2048
maxdir 128
skew 1
boottrk 1
os 3
end
diskdef kpii
seclen 512
tracks 40
sectrk 10
blocksize 1024
maxdir 32
skew 0
boottrk 1
os 2.2
end
# setfdprm /dev/fd0 dd sect=10
diskdef interak
seclen 512
tracks 80
sectrk 20
blocksize 4096
maxdir 256
skew 1
boottrk 2
os 2.2
end
# For 512KB ROM, less 32K for system image
diskdef rom512KB
seclen 128
tracks 14
sectrk 256
blocksize 2048
maxdir 256
skew 1
boottrk 0
os 2.2
end
# For 1024KB ROM, less 32K for system image
diskdef rom1024KB
seclen 128
tracks 30
sectrk 256
blocksize 2048
maxdir 256
skew 1
boottrk 0
os 2.2
end
# For N8VEM mass storage (4 raw partitions)
diskdef hd0
seclen 512
tracks 65
sectrk 256
blocksize 4096
maxdir 512
skew 1
boottrk 1
os 2.2
end
diskdef hd1
seclen 512
tracks 130
sectrk 256
blocksize 4096
maxdir 512
skew 1
boottrk 66
os 2.2
end
diskdef hd2
seclen 512
tracks 195
sectrk 256
blocksize 4096
maxdir 512
skew 1
boottrk 131
os 2.2
end
diskdef hd3
seclen 512
tracks 260
sectrk 256
blocksize 4096
maxdir 512
skew 1
boottrk 196
os 2.2
end

1635
trunk/Source/fd.asm Normal file

File diff suppressed because it is too large Load Diff

173
trunk/Source/fd_data.asm Normal file
View File

@@ -0,0 +1,173 @@
;
;==================================================================================================
; FLOPPY DISK DRIVER - DATA
;==================================================================================================
;
#IF (FDMEDIA == FDM720)
#DEFINE FDDPB DPB_FD720 ; DPB_FD720 OR DPB_FD144
#DEFINE FDCKS CKS_FD720
#DEFINE FDALS ALS_FD720
#ENDIF
#IF (FDMEDIA == FDM144)
#DEFINE FDDPB DPB_FD144 ; DPB_FD720 OR DPB_FD144
#DEFINE FDCKS CKS_FD144
#DEFINE FDALS ALS_FD144
#ENDIF
#IF (FDMEDIA == FDM360)
#DEFINE FDDPB DPB_FD360 ; DPB_FD720 OR DPB_FD144
#DEFINE FDCKS CKS_FD360
#DEFINE FDALS ALS_FD360
#ENDIF
#IF (FDMEDIA == FDM120)
#DEFINE FDDPB DPB_FD120 ; DPB_FD720 OR DPB_FD144
#DEFINE FDCKS CKS_FD120
#DEFINE FDALS ALS_FD120
#ENDIF
#IF (FDMEDIA == FDM111)
#DEFINE FDDPB DPB_FD111 ; DPB_FD720 OR DPB_FD144
#DEFINE FDCKS CKS_FD111
#DEFINE FDALS ALS_FD111
#ENDIF
;
;
;
.DB DIODEV_FD + 0
FDDPH0: .DW 0000, 0000
.DW 0000, 0000
.DW DIRBF, FDDPB
.DW FDCSV0, FDALV0
.DB DIODEV_FD + 1
FDDPH1: .DW 0000, 0000
.DW 0000, 0000
.DW DIRBF, FDDPB
.DW FDCSV1, FDALV1
; .EXPORT FDDPH0, FDDPH1
;;
;; DISK PARAMETER BLOCKS USED FOR FLOPPY DRIVER
;;
;; IBM 720KB 3.5" FLOPPY DRIVE, 80 TRKS, 36 SECS/TRK, 512 BYTES/SEC
;; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 128
;;
;#IF ((FDMEDIA == FDM720) | (FDMEDIAALT == FDM720))
;DPB_FD720:
; .DW 36 ; SPT: SECTORS PER TRACK
; .DB 4 ; BSH: BLOCK SHIFT FACTOR
; .DB 15 ; BLM: BLOCK MASK
; .DB 0 ; EXM: EXTENT MASK
; .DW 350 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((720K - 18K OFF) / 2K BLS) - 1 = 350
; .DW 127 ; DRM: DIR ENTRIES - 1 = 128 - 1 = 127
; .DB 11000000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
; .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
; .DW 32 ; CKS: DIRECTORY CHECK VECTOR SIZE = 128 / 4
; .DW 4 ; OFF: RESERVED TRACKS = 4 TRKS * (512 B/SEC * 36 SEC/TRK) = 18K
;#ELSE
;DPB_FD720 .EQU 0
;#ENDIF
CKS_FD720 .EQU 32 ; CKS: DIR ENT / 4 = 128 / 4 = 32
ALS_FD720 .EQU 44 ; ALS: BLKS / 8 = 351 / 8 = 44 (ROUNDED UP)
; .EXPORT DPB_FD720
;#ENDIF
;;
;; IBM 1.44MB 3.5" FLOPPY DRIVE, 80 TRKS, 72 SECS/TRK, 512 BYTES/SEC
;; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256
;;
;#IF ((FDMEDIA == FDM144) | (FDMEDIAALT == FDM144))
;DPB_FD144:
; .DW 72 ; SPT: SECTORS PER TRACK
; .DB 4 ; BSH: BLOCK SHIFT FACTOR
; .DB 15 ; BLM: BLOCK MASK
; .DB 0 ; EXM: EXTENT MASK
; .DW 710 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,440K - 18K OFF) / 2K BLS) - 1 = 710
; .DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255
; .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
; .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
; .DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
; .DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 72 SEC/TRK) = 18K
;#ELSE
;DPB_FD144 .EQU 0
;#ENDIF
CKS_FD144 .EQU 64 ; CKS: DIR ENT / 4 = 256 / 4 = 64
ALS_FD144 .EQU 89 ; ALS: BLKS / 8 = 711 / 8 = 89 (ROUNDED UP)
; .EXPORT DPB_FD144
;#ENDIF
;;
;; IBM 360KB 5.25" FLOPPY DRIVE, 40 TRKS, 9 SECS/TRK, 512 BYTES/SEC
;; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 128
;;
;#IF ((FDMEDIA == FDM360) | (FDMEDIAALT == FDM360))
;DPB_FD360:
; .DW 36 ; SPT: SECTORS PER TRACK
; .DB 4 ; BSH: BLOCK SHIFT FACTOR
; .DB 15 ; BLM: BLOCK MASK
; .DB 0 ; EXM: EXTENT MASK
; .DW 170 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((360K - 18K OFF) / 2K BLS) - 1 = 170
; .DW 127 ; DRM: DIR ENTRIES - 1 = 128 - 1 = 127
; .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
; .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
; .DW 32 ; CKS: DIRECTORY CHECK VECTOR SIZE = 128 / 4
; .DW 4 ; OFF: RESERVED TRACKS = 4 TRKS * (512 B/SEC * 36 SEC/TRK) = 18K
;#ELSE
;DPB_FD360 .EQU 0
;#ENDIF
CKS_FD360 .EQU 32 ; CKS: DIR ENT / 4 = 128 / 4 = 32
ALS_FD360 .EQU 89 ; ALS: BLKS / 8 = 171 / 8 = 22 (ROUNDED UP)
; .EXPORT DPB_FD360
;#ENDIF
;;
;; IBM 1.20MB 5.25" FLOPPY DRIVE, 80 TRKS, 60 SECS/TRK, 512 BYTES/SEC
;; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256
;;
;#IF ((FDMEDIA == FDM120) | (FDMEDIAALT == FDM120))
;DPB_FD120:
; .DW 60 ; SPT: SECTORS PER TRACK
; .DB 4 ; BSH: BLOCK SHIFT FACTOR
; .DB 15 ; BLM: BLOCK MASK
; .DB 0 ; EXM: EXTENT MASK
; .DW 591 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,200K - 15K OFF) / 2K BLS) - 1 = 591
; .DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255
; .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
; .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
; .DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
; .DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 60 SEC/TRK) = 15K
;#ELSE
;DPB_FD120 .EQU 0
;#ENDIF
CKS_FD120 .EQU 64 ; CKS: DIR ENT / 4 = 256 / 4 = 64
ALS_FD120 .EQU 74 ; ALS: BLKS / 8 = 592 / 8 = 74 (ROUNDED UP)
; .EXPORT DPB_FD120
;#ENDIF
;;
;; IBM 1.11MB 8" FLOPPY DRIVE, 74 TRKS, 60 SECS/TRK, 512 BYTES/SEC
;; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256
;;
;#IF ((FDMEDIA == FDM111) | (FDMEDIAALT == FDM111))
;DPB_FD111:
; .DW 60 ; SPT: SECTORS PER TRACK
; .DB 4 ; BSH: BLOCK SHIFT FACTOR
; .DB 15 ; BLM: BLOCK MASK
; .DB 0 ; EXM: EXTENT MASK
; .DW 546 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,110K - 15K OFF) / 2K BLS) - 1 = 546
; .DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255
; .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
; .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
; .DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
; .DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 60 SEC/TRK) = 15K
CKS_FD111 .EQU 64 ; CKS: DIR ENT / 4 = 256 / 4 = 64
ALS_FD111 .EQU 69 ; ALS: BLKS / 8 = 592 / 8 = 74 (ROUNDED UP)
; .EXPORT DPB_FD111
;#ENDIF
;
;
;
#IF (FDMAUTO)
; ASSUME WORST CASE SIZES
FDCSV0: .FILL CKS_FD144
FDALV0: .FILL ALS_FD144
FDCSV1: .FILL CKS_FD144
FDALV1: .FILL ALS_FD144
#ELSE
FDCSV0: .FILL FDCKS
FDALV0: .FILL FDALS
FDCSV1: .FILL FDCKS
FDALV1: .FILL FDALS
#ENDIF

10
trunk/Source/hbfill.asm Normal file
View File

@@ -0,0 +1,10 @@
;
;==================================================================================================
; FILLER FOR HBIOS PROXY, JUST A 256 BYTE FILLER
;==================================================================================================
;
#INCLUDE "std.asm"
;
.FILL HB_SIZ,0FFH
;
.END

278
trunk/Source/hdsk.asm Normal file
View File

@@ -0,0 +1,278 @@
;
;==================================================================================================
; HDSK DISK DRIVER
;==================================================================================================
;
; IO PORT ADDRESSES
;
HDSK_IO .EQU $FD
;
HDSK_CMDNONE .EQU 0
HDSK_CMDRESET .EQU 1
HDSK_CMDREAD .EQU 2
HDSK_CMDWRITE .EQU 3
HDSK_CMDPARAM .EQU 4
;
; STATUS
;
HDSKRC_OK .EQU 0
;
; UNIT CONFIGURATION
;
HDSK0_DEVICE .DB 11100000B ; LBA, MASTER DEVICE
HDSK1_DEVICE .DB 11110000B ; LBA, SLAVE DEVICE
;
;
;
HDSK_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F
JR Z,HDSK_RD
DEC A
JR Z,HDSK_WR
DEC A
JR Z,HDSK_ST
DEC A
JR Z,HDSK_MED
CALL PANIC
;
HDSK_RD:
JP HDSK_READ
HDSK_WR:
JP HDSK_WRITE
HDSK_ST:
JP HDSK_STATUS
HDSK_MED:
JP HDSK_MEDIA
;
; HDSK_MEDIA
;
HDSK_MEDIA:
LD A,MID_HD
RET
;
;
;
HDSK_INIT:
XOR A
DEC A ; INITIAL STATUS IS NOT READY $FF
LD (HDSK_STAT),A ; SAVE IT
XOR A ; INIT SUCCEEDED
RET ; RETURN
;
;
;
HDSK_STATUS:
LD A,(HDSK_STAT) ; LOAD STATUS
OR A ; SET FLAGS
RET
;
;
;
HDSK_READ:
LD A,HDSK_CMDREAD
JR HDSK_RW
;
;
;
HDSK_WRITE:
LD A,HDSK_CMDWRITE
JR HDSK_RW
;
;
;
HDSK_RW:
LD (HDSK_CMD),A
; CLEAR RESULTS
XOR A ; A = 0
LD (HDSK_RC),A ; CLEAR RETURN CODE
; INIT IF NEEDED
LD A,(HDSK_STAT) ; GET CURRENT STATUS
OR A ; SET FLAGS
CALL NZ,HDSK_RESET ; RESET IF NOT READY
; SET DEVICE
LD A,(HSTDSK)
AND 0FH
LD (HDSK_DEVICE),A
; SET SECTOR (IGNORES MSB)
LD A,(HSTSEC)
LD (HDSK_SEC),A
; SET TRACK
LD BC,(HSTTRK)
LD (HDSK_TRK),BC
; SET TRANSFER ADDRESS
LD BC,(DIOBUF)
LD (HDSK_DMA),BC
; EXECUTE COMMAND
LD B,7 ; SIZE OF PARAMETER BLOCK
LD HL,HDSK_PARMBLK ; START ADDRESS OF PARAMETER BLOCK
HDSK_RW1:
LD A,(HL) ; GET BYTE OF PARAMETER BLOCK
OUT (0FDH),A ; SEND IT TO PORT
INC HL ; POINT TO NEXT BYTE
DJNZ HDSK_RW1
IN A,(0FDH) ; GET RESULT CODE
LD (HDSK_RC),A
OR A
JR Z,HDSK_OK
JR HDSK_ERR
HDSK_ERR:
XOR A
DEC A ; A=$FF TO SIGNAL ERROR
LD (HDSK_STAT),A ; SAVE IT
#IF (HDSKTRACE >= 1)
PUSH AF
CALL HDSK_PRT
POP AF
#ENDIF
RET
HDSK_OK:
#IF (HDSKTRACE >= 2)
CALL HDSK_PRT
#ENDIF
XOR A
RET
;
;
;
HDSK_RESET:
LD B,32
LD A,HDSK_CMDRESET
HDSK_RESET1:
OUT (0FDH),A
DJNZ HDSK_RESET1
XOR A ; STATUS = OK
LD (HDSK_STAT),A ; SAVE IT
#IF (HDSKTRACE >= 2)
CALL NEWLINE
LD DE,HDSKSTR_PREFIX
CALL WRITESTR
CALL PC_SPACE
LD DE,HDSKSTR_RESET
CALL WRITESTR
#ENDIF
RET
;
;
;
HDSK_PRT:
CALL NEWLINE
LD DE,HDSKSTR_PREFIX
CALL WRITESTR
CALL PC_SPACE
LD DE,HDSKSTR_CMD
CALL WRITESTR
LD A,(HDSK_CMD)
CALL PRTHEXBYTE
CALL PC_SPACE
CALL PC_LBKT
LD A,(HDSK_CMD)
LD DE,HDSKSTR_NONE
CP HDSK_CMDNONE
JP Z,HDSK_PRTCMD
LD DE,HDSKSTR_RESET
CP HDSK_CMDRESET
JP Z,HDSK_PRTCMD
LD DE,HDSKSTR_READ
CP HDSK_CMDREAD
JP Z,HDSK_PRTCMD
LD DE,HDSKSTR_WRITE
CP HDSK_CMDWRITE
JP Z,HDSK_PRTCMD
LD DE,HDSKSTR_PARAM
CP HDSK_CMDPARAM
JP Z,HDSK_PRTCMD
LD DE,HDSKSTR_UNKCMD
HDSK_PRTCMD:
CALL WRITESTR
CALL PC_RBKT
LD A,(HDSK_CMD)
CP HDSK_CMDREAD
JR Z,HDSK_PRTRW
CP HDSK_CMDWRITE
JR Z,HDSK_PRTRW
RET
HDSK_PRTRW:
CALL PC_SPACE
LD A,(HDSK_DEVICE)
CALL PRTHEXBYTE
CALL PC_SPACE
LD BC,(HDSK_TRK)
CALL PRTHEXWORD
CALL PC_SPACE
LD A,(HDSK_SEC)
CALL PRTHEXBYTE
CALL PC_SPACE
LD BC,(HDSK_DMA)
CALL PRTHEXWORD
CALL PC_SPACE
LD DE,HDSKSTR_ARROW
CALL WRITESTR
CALL PC_SPACE
LD DE,HDSKSTR_RC
CALL WRITESTR
LD A,(HDSK_RC)
CALL PRTHEXBYTE
CALL PC_SPACE
CALL PC_LBKT
LD A,(HDSK_RC)
LD DE,HDSKSTR_RCOK
CP HDSKRC_OK
JP Z,HDSK_PRTRC
LD DE,HDSKSTR_RCUNK
HDSK_PRTRC:
CALL WRITESTR
CALL PC_RBKT
RET
;
;
;
HDSKSTR_PREFIX .TEXT "HDSK:$"
HDSKSTR_CMD .TEXT "CMD=$"
HDSKSTR_RC .TEXT "RC=$"
HDSKSTR_ARROW .TEXT "-->$"
HDSKSTR_NONE .TEXT "NONE$"
HDSKSTR_RESET .TEXT "RESET$"
HDSKSTR_READ .TEXT "READ$"
HDSKSTR_WRITE .TEXT "WRITE$"
HDSKSTR_PARAM .TEXT "PARAM$"
HDSKSTR_UNKCMD .TEXT "UNKCMD$"
HDSKSTR_RCOK .TEXT "OK$"
HDSKSTR_RCUNK .TEXT "UNKNOWN ERROR$"
;
;==================================================================================================
; HDSK DISK DRIVER - DATA
;==================================================================================================
;
HDSK_STAT .DB 0
HDSK_RC .DB 0
;
HDSK_PARMBLK:
HDSK_CMD .DB 0 ; HDSK_READ OR HDSK_WRITE
HDSK_DEVICE .DB 0 ; 0 .. 7, DEFINES HARD DISK TO BE USED
HDSK_SEC .DB 0 ; 0 .. 31, DEFINES SECTOR
HDSK_TRK .DW 0 ; 0 .. 2047, DEFINES TRACK
HDSK_DMA .DW 0 ; DEFINES WHERE RESULT IS PLACED IN MEMORY

View File

@@ -0,0 +1,61 @@
;
;==================================================================================================
; HDSK DISK DRIVER - DATA
;==================================================================================================
;
HDSK_SLICETRKS .EQU 65 ; TRACKS PER SLICE
HDSK_TRKSIZE .EQU 128 ; SIZE OF TRACK (IN KB)
HDSK_SLICESIZE .EQU ((HDSK_SLICETRKS * HDSK_TRKSIZE) + 1023) / 1024 ; SIZE OF EACH SLICE (IN MB)
HDSK_NUMSLICES .EQU HDSKCAPACITY / HDSK_SLICESIZE ; TOTAL SLICES IN DEVICE
HDSK0_SLICEDEF .EQU 0 ; DEFAULT SLICE FOR UNIT 0
HDSK1_SLICEDEF .EQU 1 ; DEFAULT SLICE FOR UNIT 1
HDSK2_SLICEDEF .EQU 2 ; DEFAULT SLICE FOR UNIT 0
HDSK3_SLICEDEF .EQU 3 ; DEFAULT SLICE FOR UNIT 1
;
.DB DIODEV_HDSK + 0
HDSKDPH0 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW HDSKCSV0,HDSKALV0
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
HDSK0_SLICE .DW HDSK0_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW HDSK_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_HDSK + 0
HDSKDPH1 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW HDSKCSV1,HDSKALV1
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
HDSK1_SLICE .DW HDSK1_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW HDSK_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_HDSK + 0
HDSKDPH2 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW HDSKCSV2,HDSKALV2
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
HDSK2_SLICE .DW HDSK2_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW HDSK_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_HDSK + 0
HDSKDPH3 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW HDSKCSV3,HDSKALV3
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
HDSK3_SLICE .DW HDSK3_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW HDSK_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
HDSKCKS .EQU 0 ; CKS: 0 FOR NON-REMOVABLE MEDIA
HDSKALS .EQU 256 ; ALS: BLKS / 8 = 2048 / 8 = 256 (ROUNDED UP)
;
HDSKCSV0: .FILL HDSKCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
HDSKALV0: .FILL HDSKALS ; MAX OF 2048 DATA BLOCKS
HDSKCSV1: .FILL HDSKCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
HDSKALV1: .FILL HDSKALS ; MAX OF 2048 DATA BLOCKS
HDSKCSV2: .FILL HDSKCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
HDSKALV2: .FILL HDSKALS ; MAX OF 2048 DATA BLOCKS
HDSKCSV3: .FILL HDSKCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
HDSKALV3: .FILL HDSKALS ; MAX OF 2048 DATA BLOCKS

509
trunk/Source/ide.asm Normal file
View File

@@ -0,0 +1,509 @@
;
;==================================================================================================
; IDE DISK DRIVER
;==================================================================================================
;
; IO PORT ADDRESSES
;
#IF (IDEMODE == IDEMODE_DIO)
#IF (IDE8BIT)
IDEDATA: .EQU 20H ; DATA PORT (8 BIT)
#ELSE
IDEDATALO: .EQU 20H ; DATA PORT (16 BIT LO BYTE)
IDEDATAHI: .EQU 28H ; DATA PORT (16 BIT HI BYTE)
#ENDIF
#ENDIF
;
#IF (IDEMODE == IDEMODE_DIDE)
#IF (IDE8BIT)
IDEDATA: .EQU 20H ; DATA PORT (8 BIT OR 16 BIT PIO LO/HI BYTES)
#ELSE
IDEDATA: .EQU 28H ; DATA PORT (16 BIT PIO LO/HI BYTES)
IDEDMA: .EQU 29H ; DATA PORT (16 BIT DMA LO/HI BYTES)
#ENDIF
#ENDIF
;
IDEERR: .EQU 21H ; READ: ERROR REGISTER; WRITE: PRECOMP
IDESECTC: .EQU 22H ; SECTOR COUNT
IDESECTN: .EQU 23H ; SECTOR NUMBER
IDECYLLO: .EQU 24H ; CYLINDER LOW
IDECYLHI: .EQU 25H ; CYLINDER HIGH
IDEDEVICE: .EQU 26H ; DRIVE/HEAD
IDESTTS: .EQU 27H ; READ: STATUS; WRITE: COMMAND
IDECTRL: .EQU 2EH ; READ: ALTERNATIVE STATUS; WRITE; DEVICE CONTROL
IDEADDR: .EQU 2FH ; DRIVE ADDRESS (READ ONLY)
;
;
;
IDECMD_READ .EQU 020H
IDECMD_WRITE .EQU 030H
IDECMD_SETFEAT .EQU 0EFH
;
IDERC_OK .EQU 0
IDERC_CMDERR .EQU 1
IDERC_RDYTO .EQU 2
IDERC_BUFTO .EQU 3
;
; UNIT CONFIGURATION
;
IDE0_DEVICE .DB 11100000B ; LBA, MASTER DEVICE
IDE1_DEVICE .DB 11110000B ; LBA, SLAVE DEVICE
;
;
;
IDE_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F
JR Z,IDE_RD
DEC A
JR Z,IDE_WR
DEC A
JR Z,IDE_ST
DEC A
JR Z,IDE_MED
CALL PANIC
;
IDE_RD:
JP IDE_READ
IDE_WR:
JP IDE_WRITE
IDE_ST:
JP IDE_STATUS
IDE_MED:
JP IDE_MEDIA
;
; IDE_MEDIA
;
IDE_MEDIA:
LD A,MID_HD
RET
;
;
;
IDE_INIT:
CALL IDE_RESET
XOR A
DEC A ; INITIAL STATUS IS NOT READY $FF
LD (IDE_STAT),A ; SAVE IT
RET
;
;
;
IDE_STATUS:
LD A,(IDE_STAT) ; LOAD STATUS
OR A ; SET FLAGS
RET
;
;
;
IDE_READ:
LD A,IDECMD_READ
LD (IDE_CMD),A
JP IDE_RW
;
;
;
IDE_WRITE:
LD A,IDECMD_WRITE
LD (IDE_CMD),A
JP IDE_RW
;
;
;
IDE_RW:
; CLEAR RESULTS
XOR A ; A = 0
LD (IDE_RC),A ; CLEAR RETURN CODE
LD (IDE_STTS),A ; CLEAR SAVED STTS
LD (IDE_ERRS),A ; CLEAR SAVED ERR
; INIT REQUIRED?
LD A,(IDE_STAT) ; GET CURRENT STATUS
OR A ; SET FLAGS
JR Z,IDE_RW0 ; IF STATUS OK, BYPASS RESET
CALL IDE_RESET ; DO THE RESET
#IF (IDE8BIT)
CALL IDE_WAITRDY
LD A,01H
OUT (IDEERR),A
LD A,IDECMD_SETFEAT
OUT (IDESTTS),A
CALL IDE_WAITRDY
JP NC,IDE_ERR
CALL IDE_CHKERR ; CHECK FOR ERRORS
JP NC,IDE_ERR
#IF (IDETRACE >= 2)
CALL IDE_PRT
#ENDIF
#ENDIF
IDE_RW0:
CALL IDE_WAITRDY ; WAIT FOR DRIVE READY
JP NC,IDE_ERR
CALL IDE_SETUP ; SETUP CYL, TRK, HEAD
LD A,(IDE_CMD)
OUT (IDESTTS),A
CALL IDE_WAITRDY ; WAIT FOR DRIVE READY
JP NC,IDE_ERR
CALL IDE_CHKERR ; CHECK FOR ERRORS
JP NC,IDE_ERR
CALL IDE_WAITBUF ; WAIT FOR BUFFER READY
JP NC,IDE_ERR
LD A,(IDE_CMD) ; DISPATCH TO READ OR WRITE SPECIFIC LOGIC
CP IDECMD_WRITE
JP Z,IDE_RW1
CALL IDE_BUFRD ; READ BUFFER
CALL IDE_WAITRDY ; WAIT FOR DRIVE READY
JP NC,IDE_ERR
CALL IDE_CHKERR ; CHECK FOR ERRORS
JP NC,IDE_ERR
JP IDE_OK
IDE_RW1:
CALL IDE_BUFWR ; WRITE BUFFER
CALL IDE_WAITRDY ; WAIT FOR DRIVE READY
JP NC,IDE_ERR
CALL IDE_CHKERR ; CHECK FOR ERRORS
JP NC,IDE_ERR
JP IDE_OK
IDE_ERR:
XOR A
DEC A ; A = $FF TO SIGNAL ERROR
LD (IDE_STAT),A ; SAVE IT
#IF (IDETRACE >= 1)
PUSH AF
CALL IDE_PRT
POP AF
#ENDIF
RET
IDE_OK:
#IF (IDETRACE >= 2)
CALL IDE_PRT
#ENDIF
XOR A
RET
;
;
;
IDE_RESET:
LD A,000001110B ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES
OUT (IDECTRL),A
LD DE,8 ; DELAY ABOUT 200ms
CALL VDELAY
LD A,000001010B ; NO INTERRUPTS, DEASSERT RESET
OUT (IDECTRL),A
XOR A
LD (IDE_STAT),A ; STATUS OK
RET ; SAVE IT
;
;
;
IDE_WAITRDY:
LD DE,0 ; TIMEOUT IS 250us * 65536 = 15 SECONDS
IDE_WBSY:
PUSH DE
LD DE,10 ; INNER LOOP DELAY IS 250us (25us * 10)
CALL VDELAY
POP DE
DEC DE
LD A,D
OR E
JP Z,IDE_TO
IN A,(IDESTTS) ; READ STATUS
LD (IDE_STTS),A ; SAVE IT
AND 011000000b ; ISOLATE BUSY AND RDY BITS
XOR 001000000b ; WE WANT BUSY(7) TO BE 0 AND RDY(6) TO BE 1
JP NZ,IDE_WBSY
SCF ; CARRY 1 = OK
RET
IDE_TO:
LD A,IDERC_RDYTO
LD (IDE_RC),A
XOR A ; CARRY 0 = TIMEOUT
RET
;
;
;
IDE_CHKERR:
IN A,(IDESTTS) ; GET STATUS
LD (IDE_STTS),A ; SAVE IT
AND 000000001B ; ERROR BIT SET?
SCF ; ASSUME NO ERR
RET Z ; NO ERR, RETURN WITH CF SET
IN A,(IDEERR) ; READ ERROR FLAGS
LD (IDE_ERRS),A ; SAVE IT
LD A,IDERC_CMDERR ; COMMAND ERROR
LD (IDE_RC),A ; SAVE IT
OR A ; CLEAR CF TO SIGNAL ERROR
RET
;
;
;
IDE_WAITBUF:
LD DE,0
IDE_WDRQ:
CALL DELAY
INC DE
LD A,D
OR E
JP Z,IDE_TO2
IN A,(IDESTTS) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER
LD (IDE_STTS),A ; SAVE IT
AND 000001000B ; TO FILL (OR READY TO FILL)
JP Z,IDE_WDRQ
SCF ; CARRY 1 = OK
RET
IDE_TO2:
LD A,IDERC_BUFTO
LD (IDE_RC),A
XOR A ; CARRY 0 = TIMED OUT
RET
;
;
;
IDE_BUFRD:
LD HL,(DIOBUF)
LD B,0
#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE))
LD C,IDEDATA
INIR
INIR
#ELSE
LD C,IDEDATAHI
IDE_BUFRD1:
IN A,(IDEDATALO) ; READ THE LO BYTE
LD (HL),A ; SAVE IN BUFFER
INC HL ; INC BUFFER POINTER
INI ; READ AND SAVE HI BYTE, INC HL, DEC B
JP NZ,IDE_BUFRD1 ; LOOP AS NEEDED
#ENDIF
RET
;
;
;
IDE_BUFWR:
LD HL,(DIOBUF)
LD B,0
#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE))
LD C,IDEDATA
OTIR
OTIR
#ELSE
LD C,IDEDATAHI
IDE_BUFWR1:
LD A,(HL) ; GET THE LO BYTE AND KEEP IT IN A FOR LATER
INC HL ; BUMP TO NEXT BYTE IN BUFFER
OUTI ; WRITE HI BYTE, INC HL, DEC B
OUT (IDEDATALO),A ; NOW WRITE THE SAVED LO BYTE TO LO BYTE
JP NZ,IDE_BUFWR1 ; LOOP AS NEEDED
#ENDIF
RET
;
;
;
IDE_SETUP:
LD A,1
OUT (IDESECTC),A
LD A,(HSTDSK) ; HSTDSK -> HEAD BIT 4 TO SELECT UNIT
AND 0FH
CP 0
JP Z,IDE_SETUP_UNIT0
CP 1
JP Z,IDE_SETUP_UNIT1
CALL NC,PANIC
IDE_SETUP_UNIT0:
LD A,(IDE0_DEVICE)
; LD DE,(IDE0_OFFSET)
JP IDE_SETUP1
IDE_SETUP_UNIT1:
LD A,(IDE1_DEVICE)
; LD DE,(IDE1_OFFSET)
JP IDE_SETUP1
IDE_SETUP1:
LD (IDE_DEVICE),A
OUT (IDEDEVICE),A
LD HL,(HSTTRK) ; HSTTRK -> IDECYLHI/LO
LD A,H
LD (IDE_CYLHI),A
OUT (IDECYLHI),A
LD A,L
LD (IDE_CYLLO),A
OUT (IDECYLLO),A
LD BC,(HSTSEC) ; HSTSEC -> IDESECTN
LD A,C
LD (IDE_SEC),A
OUT (IDESECTN),A
#IF (DSKYENABLE)
CALL IDE_DSKY
#ENDIF
RET
;
;
;
#IF (DSKYENABLE)
IDE_DSKY:
LD HL,DSKY_HEXBUF
LD A,(IDE_DEVICE)
LD (HL),A
INC HL
LD A,(IDE_CYLHI)
LD (HL),A
INC HL
LD A,(IDE_CYLLO)
LD (HL),A
INC HL
LD A,(IDE_SEC)
LD (HL),A
CALL DSKY_HEXOUT
RET
#ENDIF
;
;
;
IDE_PRT:
CALL NEWLINE
LD DE,IDESTR_PREFIX
CALL WRITESTR
CALL PC_SPACE
LD DE,IDESTR_CMD
CALL WRITESTR
LD A,(IDE_CMD)
CALL PRTHEXBYTE
CALL PC_SPACE
CALL PC_LBKT
LD A,(IDE_CMD)
LD DE,IDESTR_READ
CP IDECMD_READ
JP Z,IDE_PRTCMD
LD DE,IDESTR_WRITE
CP IDECMD_WRITE
JP Z,IDE_PRTCMD
LD DE,IDESTR_UNKCMD
IDE_PRTCMD:
CALL WRITESTR
CALL PC_RBKT
CALL PC_SPACE
LD A,(IDE_DEVICE)
CALL PRTHEXBYTE
LD A,(IDE_CYLHI)
CALL PRTHEXBYTE
LD A,(IDE_CYLLO)
CALL PRTHEXBYTE
LD A,(IDE_SEC)
CALL PRTHEXBYTE
CALL PC_SPACE
LD DE,IDESTR_ARROW
CALL WRITESTR
CALL PC_SPACE
IN A,(IDESTTS)
CALL PRTHEXBYTE
CALL PC_SPACE
IN A,(IDEERR)
CALL PRTHEXBYTE
CALL PC_SPACE
LD DE,IDESTR_RC
CALL WRITESTR
LD A,(IDE_RC)
CALL PRTHEXBYTE
CALL PC_SPACE
CALL PC_LBKT
LD A,(IDE_RC)
LD DE,IDESTR_RCOK
CP IDERC_OK
JP Z,IDE_PRTRC
LD DE,IDESTR_RCCMDERR
CP IDERC_CMDERR
JP Z,IDE_PRTRC
LD DE,IDESTR_RCRDYTO
CP IDERC_RDYTO
JP Z,IDE_PRTRC
LD DE,IDESTR_RCBUFTO
CP IDERC_BUFTO
JP Z,IDE_PRTRC
LD DE,IDESTR_RCUNK
IDE_PRTRC:
CALL WRITESTR
CALL PC_RBKT
RET
;
;
;
IDESTR_PREFIX .TEXT "IDE:$"
IDESTR_CMD .TEXT "CMD=$"
IDESTR_RC .TEXT "RC=$"
IDESTR_ARROW .TEXT "-->$"
IDESTR_READ .TEXT "READ$"
IDESTR_WRITE .TEXT "WRITE$"
IDESTR_UNKCMD .TEXT "UNKCMD$"
IDESTR_RCOK .TEXT "OK$"
IDESTR_RCCMDERR .TEXT "COMMAND ERROR$"
IDESTR_RCRDYTO .TEXT "READY TIMEOUT$"
IDESTR_RCBUFTO .TEXT "BUFFER TIMEOUT$"
IDESTR_RCUNK .TEXT "UNKNOWN ERROR$"
;
;==================================================================================================
; IDE DISK DRIVER - DATA
;==================================================================================================
;
IDE_STAT .DB 0
IDE_RC .DB 0
;
IDE_CMD: .DB 0
IDE_DEVICE .DB 0
IDE_CYLHI: .DB 0
IDE_CYLLO: .DB 0
IDE_SEC: .DB 0
IDE_STTS: .DB 0
IDE_ERRS .DB 0
;
;
;
;
; Error Register (ERR bit being set in the Status Register)
;
; Bit 7: BBK (Bad Block Detected) Set when a Bad Block is detected.
; Bit 6: UNC (Uncorrectable Data Error) Set when Uncorrectable Error is encountered.
; Bit 5: MC (Media Changed) Set to 0.
; Bit 4: IDNF (ID Not Found) Set when Sector ID not found.
; Bit 3: MCR (Media Change Request) Set to 0.
; Bit 2: ABRT (Aborted Command) Set when Command Aborted due to drive error.
; Bit 1: TKONF (Track 0 Not Found) Set when Executive Drive Diagnostic Command.
; Bit 0: AMNF (Address mark Not Found) Set in case of a general error.
;
; Status Register (When the contents of this register are read by the host, the IREQ# bit is cleared)
;
; Bit 7: BSY (Busy) Set when the drive is busy and unable to process any new ATA commands.
; Bit 6: DRDY (Data Ready) Set when the device is ready to accept ATA commands from the host.
; Bit 5: DWF (Drive Write Fault) Always set to 0.
; Bit 4: DSC (Drive Seek Complete) Set when the drive heads have been positioned over a specific track.
; Bit 3: DRQ (Data Request) Set when device is ready to transfer a word or byte of data to or from the host and the device.
; Bit 2: CORR (Corrected Data) Always set to 0.
; Bit 1: IDX (Index) Always set to 0.
; Bit 0: ERR (Error) Set when an error occurred during the previous ATA command.

61
trunk/Source/ide_data.asm Normal file
View File

@@ -0,0 +1,61 @@
;
;==================================================================================================
; IDE DISK DRIVER - DATA
;==================================================================================================
;
IDE_SLICETRKS .EQU 65 ; TRACKS PER SLICE
IDE_TRKSIZE .EQU 128 ; SIZE OF TRACK (IN KB)
IDE_SLICESIZE .EQU ((IDE_SLICETRKS * IDE_TRKSIZE) + 1023) / 1024 ; SIZE OF EACH SLICE (IN MB)
IDE_NUMSLICES .EQU IDECAPACITY / IDE_SLICESIZE ; TOTAL SLICES IN DEVICE
IDE0_SLICEDEF .EQU 0 ; DEFAULT SLICE FOR UNIT 0
IDE1_SLICEDEF .EQU 1 ; DEFAULT SLICE FOR UNIT 1
IDE2_SLICEDEF .EQU 2 ; DEFAULT SLICE FOR UNIT 0
IDE3_SLICEDEF .EQU 3 ; DEFAULT SLICE FOR UNIT 1
;
.DB DIODEV_IDE + 0
IDEDPH0 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW IDECSV0,IDEALV0
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
IDE0_SLICE .DW IDE0_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW IDE_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_IDE + 0
IDEDPH1 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW IDECSV1,IDEALV1
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
IDE1_SLICE .DW IDE1_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW IDE_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_IDE + 0
IDEDPH2 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW IDECSV2,IDEALV2
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
IDE2_SLICE .DW IDE2_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW IDE_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_IDE + 0
IDEDPH3 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW IDECSV3,IDEALV3
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
IDE3_SLICE .DW IDE3_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW IDE_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
IDECKS .EQU 0 ; CKS: 0 FOR NON-REMOVABLE MEDIA
IDEALS .EQU 256 ; ALS: BLKS / 8 = 2048 / 8 = 256 (ROUNDED UP)
;
IDECSV0: .FILL IDECKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
IDEALV0: .FILL IDEALS ; MAX OF 2048 DATA BLOCKS
IDECSV1: .FILL IDECKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
IDEALV1: .FILL IDEALS ; MAX OF 2048 DATA BLOCKS
IDECSV2: .FILL IDECKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
IDEALV2: .FILL IDEALS ; MAX OF 2048 DATA BLOCKS
IDECSV3: .FILL IDECKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
IDEALV3: .FILL IDEALS ; MAX OF 2048 DATA BLOCKS

24
trunk/Source/infolist.inc Normal file
View File

@@ -0,0 +1,24 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; infolist.inc 6/ 7/2012 dwg - removed DSK_MAP pointer ;
; infolist.inc 5/16/2012 dwg - BIOS information pointers ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; The putpose of this table is to provide pointers that can
; be used by utility programs to access BIOS internals for
; debugging and informative purposes. Any time the format
; changes, the first word should be incremented to the Apps
; can determine the lineage of a specific BIOS. This table
; was created in support of the 2.0.0.0 banked BIOS.
INFOLIST:
.DW 2 ; INFOLIST version 2 6/7/2012
.DW STR_BANNER
.DW VAR_LOC
.DW TST_LOC
.DW DPB_MAP
.DW DPH_MAP
.DW CIO_MAP
;;;;;;;;;;;;;;;;;;;;;;
; eof - infolist.inc ;
;;;;;;;;;;;;;;;;;;;;;;

795
trunk/Source/loader.asm Normal file
View File

@@ -0,0 +1,795 @@
;
;==================================================================================================
; LOADER
;==================================================================================================
;
; FIX!!! NEED TO SWITCH FROM CBIOS CALLS TO HBIOS CALLS!!!
;
; INCLUDE GENERIC STUFF
;
#INCLUDE "std.asm"
;
; 12/1/2011 dwg -
DRIVES .EQU 1 ; control diskmap display function
;
.ORG 8400H
;
; SETUP OUR STACK
LD SP,BL_STACK ; SET UP LOADER STACK
; SETUP CBIOS IOBYTE
LD A,DEFIOBYTE ; LOAD DEFAULT IOBYTE
LD (IOBYTE),A ; STORE IT
#IF (PLATFORM != PLT_N8)
IN A,(RTC) ; RTC PORT, BIT 6 HAS STATE OF CONFIG JUMPER
; LD A,40H ; *DEBUG* SIMULATE JUMPER OPEN
; LD A,00H ; *DEBUG* SIMULATE JUMPER SHORTED
AND 40H ; ISOLATE BIT 6
JR Z,INIT1 ; IF BIT6=0, SHORTED, USE ALT IOBYTE
LD A,DEFIOBYTE ; LOAD DEF IOBYTE VALUE
JR INIT2 ; CONTINUE
INIT1:
LD A,ALTIOBYTE ; LOAD ALT IOBYTE VALUE
INIT2:
LD (IOBYTE),A ; SET THE ACTIVE IOBYTE
#ENDIF
; RUN THE BOOT LOADER MENU
JP DOBOOTMENU
;
;__DOBOOT________________________________________________________________________________________________________________________
;
; PERFORM BOOT FRONT PANEL ACTION
;________________________________________________________________________________________________________________________________
;
DOBOOTMENU:
LD DE,STR_BANNER
CALL WRITESTR
CALL LISTDRIVES
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
;
#IF (UARTENABLE | VDUENABLE | (PRPENABLE & PRPCONENABLE) | (PPPENABLE & PPPCONENABLE))
CALL CST
OR A
JR Z,DB_CONEND
CALL CINUC
CP 'S' ; SETUP
JR Z,GOSETUP
CP 'M' ; MONITOR
JR Z,GOMONUART
CP 'R' ; ROM BOOT
JR Z,GOROM
CP 'A' ; A-P, DISK BOOT
JR C,DB_INVALID
CP 'P' + 1 ; HMMM... 'M' DRIVE CONFLICTS WITH MONITOR SELECTION
JR NC,DB_INVALID
SUB 'A'
JR GOBOOTDISK
DB_CONEND:
#ENDIF
;
; CHECK FOR DSKY BOOT KEYPRESS
;
#IF (DSKYENABLE)
CALL KY_STAT ; GET KEY FROM KB INTO A
OR A
JR Z,DB_DSKYEND
CALL KY_GET
CP KY_GO ; GO = MONITOR
JR Z,GOMONDSKY
CP KY_BO ; BO = BOOT ROM
JR Z,GOROM
CP 0AH ; A-F, DISK BOOT
JR C,DB_INVALID
CP 0FH + 1
JR NC,DB_INVALID
SUB 0AH
JR 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
JR NZ,DB_BOOTLOOP
; TIMEOUT EXPIRED, PERFORM DEFAULT BOOT ACTION
LD A,BOOT_DEFAULT
CP 'M' ; MONITOR
JR Z,GOMONUART
CP 'R' ; ROM BOOT
JR Z,GOROM
CP 'A' ; A-P, DISK BOOT
JR C,DB_INVALID
CP 'P' + 1 ; HMMM... DRIVE M CONFLICTS WITH "MONITOR" SELECTION
JR NC,DB_INVALID
SUB 'A'
JR GOBOOTDISK
#ENDIF
JP DB_BOOTLOOP
;
; BOOT OPTION PROCESSING
;
DB_INVALID:
LD DE,STR_INVALID
CALL WRITESTR
JP DOBOOTMENU
;
GOSETUP:
LD DE,STR_SETUP
CALL WRITESTR
JP DOSETUPMENU
;
GOMONUART:
LD DE,STR_BOOTMON
CALL WRITESTR
JP MON_UART
;
GOMONDSKY:
LD DE,STR_BOOTMON
CALL WRITESTR
JP MON_DSKY
;
GOROM:
LD DE,STR_BOOTROM
CALL WRITESTR
JP CPM_ENT
;
GOBOOTDISK:
LD C,A
LD DE,STR_BOOTDISK
CALL WRITESTR
JP BOOTDISK
;
; BOOT FROM DISK DRIVE
;
BOOTDISK:
LD DE,STR_BOOTDISK1
CALL WRITESTR
; SAVE BOOT DRIVE
LD A,C
LD (BL_BOOTDRIVE),A
; SAVE BOOT DEVICE/SLICE
CALL CBIOS_GETDSK
LD A,B
LD (BL_BOOTDEVICE),A
LD (BL_BOOTLU),DE
; SELECT THE REQUESTED DRIVE
LD A,(BL_BOOTDRIVE) ; GET CBIOS BOOT DRIVE BACK
LD C,A ; MOVE TO C
LD E,0 ; BIT0=0 IN E MEANS FIRST SELECT
CALL CBIOS_SELDSK ; CALL CBIOS DSKSEL TO GET DPH ADDRESS
; IF HL=0, SELDSK FAILED! SELECTED DRIVE IS NOT AVAILABLE
LD A,H
OR L
JP Z,DB_NODISK
; ; *DEBUG* PRINT DPH ADDRESS
; CALL NEWLINE
; PUSH HL
; POP BC
; CALL PRTHEXWORD
; BUMP HL TO POINT TO DPB AND LOAD IT
LD DE,10
ADD HL,DE ; HL = ADDRESS OF ADDRESS OF DPB
LD A,(HL) ; DEREFERENCE
INC HL
LD H,(HL)
LD L,A ; NOW HL = ADDRESS OF DPB
; ; *DEBUG* PRINT DPB ADDRESS
; CALL PC_SPACE
; PUSH HL
; POP BC
; CALL PRTHEXWORD
; FIRST WORD OF DPB IS SECTORS PER TRACK, SAVE IT
LD C,(HL)
INC HL
LD B,(HL) ; NOW BC = SECTORS PER TRACK
; LD BC,36 ; *DEBUG*
LD (BL_LDSPT),BC ; SAVE IT
LD DE,12 ; POINT TO DPB OFFSET FIELD
ADD HL,DE
LD A,(HL)
INC HL
OR (HL)
JP Z,DB_NOBOOT ; IF OFFSET = ZERO, THERE IS NO BOOT AREA!!!
; ; *DEBUG* PRINT SECTORS PER TRACK
; CALL PC_SPACE
; CALL PRTHEXWORD
; SETUP TO LOAD METADATA
LD BC,BL_METABUF
CALL CBIOS_SETDMA
LD BC,0
CALL CBIOS_SETTRK
LD BC,11
CALL CBIOS_SETSEC
; READ META DATA
CALL CBIOS_READ
OR A
JP NZ,DB_ERR
; ; PRINT SIGNATURE
; CALL NEWLINE
; LD DE,STR_SIG
; CALL WRITESTR
; LD BC,(BL_SIG)
; CALL PRTHEXWORD
; CHECK SIGNATURE
LD BC,(BL_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,(BL_CPMLOC)
CALL PRTHEXWORD
; PRINT CPMEND VALUE
CALL PC_SPACE
LD DE,STR_CPMEND
CALL WRITESTR
LD BC,(BL_CPMEND)
CALL PRTHEXWORD
; PRINT CPMENT VALUE
CALL PC_SPACE
LD DE,STR_CPMENT
CALL WRITESTR
LD BC,(BL_CPMENT)
CALL PRTHEXWORD
CALL PC_SPACE
LD DE,STR_LABEL
CALL WRITESTR
LD A,(BL_TERM) ; Display Disk Label if Present
CP '$' ; (dwg 2/7/2012)
JP NZ,NO_LABEL ; pick up string terminator for label
LD DE,BL_LABEL ; if it is there, then a printable
CALL WRITESTR ; label is there as wellm even if spaces.
NO_LABEL: ;
;
; SETUP BL_CPM... STUFF
;
; COMPUTE BL_SIZ
LD HL,(BL_CPMEND)
LD DE,(BL_CPMLOC)
SCF
CCF
SBC HL,DE
LD (BL_LDSIZ),HL
; SETUP FOR DATA LOAD
LD HL,BL_LDLOC
LD (BL_LDCLOC),HL
LD DE,(BL_LDSIZ)
ADD HL,DE
LD (BL_LDEND),HL
LD BC,0
LD (BL_LDCTRK),BC
LD BC,12
LD (BL_LDCSEC),BC
; ; *DEBUG* PRINT SPT, SEC, TRK, SIZ, END
; CALL NEWLINE
; LD BC,(BL_LDSPT)
; CALL PRTHEXWORD
; CALL PC_SPACE
; LD BC,(BL_LDCSEC)
; CALL PRTHEXWORD
; CALL PC_SPACE
; LD BC,(BL_LDCTRK)
; CALL PRTHEXWORD
; CALL PC_SPACE
; LD BC,(BL_LDSIZ)
; CALL PRTHEXWORD
; CALL PC_SPACE
; LD BC,(BL_LDEND)
; CALL PRTHEXWORD
; LOADING MESSAGE
CALL NEWLINE
LD DE,STR_LOADING
CALL WRITESTR
;
; LOADING LOOP
;
DB_LOOP:
; SETUP TO READ SECTOR
LD BC,(BL_LDCTRK)
; CALL NEWLINE ; *DEBUG*
; CALL PRTHEXWORD ; *DEBUG*
CALL CBIOS_SETTRK
LD BC,(BL_LDCSEC)
; CALL PC_SPACE ; *DEBUG*
; CALL PRTHEXWORD ; *DEBUG*
CALL CBIOS_SETSEC
LD BC,(BL_LDCLOC)
; CALL PC_SPACE ; *DEBUG*
; CALL PRTHEXWORD ; *DEBUG*
CALL CBIOS_SETDMA
; READ IT
CALL CBIOS_READ
OR A
JP NZ,DB_ERR
CALL PC_PERIOD
; ; *DEBUG* PRINT FIRST WORD OF DATA LOADED
; CALL PC_SPACE
; LD HL,(BL_LDCLOC)
; LD A,(HL)
; INC HL
; LD B,(HL)
; LD C,A
; CALL PRTHEXWORD
; INCREMENT MEMORY POINTER
LD HL,(BL_LDCLOC)
LD DE,128
ADD HL,DE
LD (BL_LDCLOC),HL
; CHECK TO SEE IF WE ARE DONE
LD DE,(BL_LDEND)
LD A,H
CP D
JR NZ,DB_CONT
LD A,L
CP E
JR NZ,DB_CONT
JP DB_DONE
DB_CONT:
; INCREMENT SECTOR
LD BC,(BL_LDCSEC)
INC BC
LD (BL_LDCSEC),BC
; TEST FOR END OF TRACK (LDCSEC/BC == LDSPT/DE)
LD DE,(BL_LDSPT)
LD A,C
CP E
JR NZ,DB_LOOP ; B != D, NOT AT EOT
LD A,B
CP D
JR NZ,DB_LOOP ; C != E, NOT AT EOT
; END OF TRACK, RESET SECTOR & INCREMENT TRACK
LD BC,0
LD (BL_LDCSEC),BC
LD BC,(BL_LDCTRK)
INC BC
LD (BL_LDCTRK),BC
JP DB_LOOP
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
DB_DONE:
CALL NEWLINE
; ; *DEBUG*
; CALL NEWLINE
; LD BC,BL_LDLOC
; CALL PRTHEXWORD
; CALL PC_SPACE
; LD BC,(BL_CPMLOC)
; CALL PRTHEXWORD
; CALL PC_SPACE
; LD BC,(BL_LDSIZ)
; CALL PRTHEXWORD
; CALL PC_SPACE
; LD BC,(BL_CPMENT)
; CALL PRTHEXWORD
; JP DOBOOTMENU ; *DEBUG*
; ALL DONE, NOW RELOCATE IMAGE BY COPYING
LD DE,(BL_LDSIZ) ; BYTES TO MOVE
LD HL,(BL_CPMLOC)
ADD HL,DE
DEC HL ; HL = PTR TO DEST (TOP)
PUSH HL ; SAVE IT
LD HL,BL_LDLOC
ADD HL,DE
DEC HL ; HL = PTR TO SRC (TOP)
POP DE ; RECOVER DEST PTR
LD BC,(BL_LDSIZ) ; BC = BYTES TO COPY
LDDR
; PATCH BOOT DRIVE INFO INTO CONFIG DATA
LD A,1
CALL RAMPG
LD HL,$020D ; LOCATION OF BOOTINFO IN SYSCFG IN RAM PAGE 0
CALL PATBI
CALL RAMPGZ
; ; IF BILOC IS SET, THEN ALSO PATCH BOOT INFO INTO OS IMAGE
; LD HL,(BL_BILOC)
; LD A,H
; OR L
; CALL NZ,PATBI ; PATCH IF BL_BILOC <> 0
; JUMP TO COLD BOOT ENTRY
LD HL,(BL_CPMENT)
JP (HL)
PATBI:
; PATCH BOOT DRIVE INFO AT ADDRESS SPECIFIED BY HL
LD A,TRUE ; BOOT FROM DISK = TRUE
LD (HL),A ; SAVE IT
INC HL
LD A,(BL_BOOTDEVICE) ; GET BOOT DEVICE/UNIT
LD (HL),A ; SAVE IT
INC HL
LD DE,(BL_BOOTLU) ; GET BOOT LU
LD (HL),E ; SAVE LSB
INC HL
LD (HL),D ; SAVE MSB
RET
;
;
;
DOSETUPMENU:
LD DE,STR_SETUPMENU
CALL WRITESTR
CALL CINUC
CP 'F' ; FORMAT RAM DISK
JP Z,FMTRAMDSK
CP 'X' ; EXIT
JP Z,DOBOOTMENU
JP DOSETUPMENU ; NO VALID KEY, LOOP
;
FMTRAMDSK:
JP DOSETUPMENU
;
; DISPLAY LIST OF DRIVES
;
LISTDRIVES:
#IF (DRIVES)
call NEWLINE
ld c,0 ; start with drive 0
ld b,16 ; loop through 16 drives
dmloop:
push bc ; preserve drive and loop counter
ld a,c ; drive letter into a
add a,'A' ; convert to alpha version of drive letter
ld (BL_TMPDRV),a ; save it for printing if needed
call CBIOS_GETDSK ; get drive into, c still has drive number
or a ; set flags on result
jr nz,dmdone ; error, skip this drive
ld (BL_TMPLU),de ; save lu for later
ld a,b ; device/unit into a for matching below
ld de,str_devrom
cp DIODEV_MD+0 ; ROM
jr z,dmprt
ld de,str_devram
cp DIODEV_MD+1 ; RAM
jr z,dmprt
and $f0 ; after ram/rom, compare on high nibble only
ld de,str_devfd
cp DIODEV_FD ; floppy disk
jr z,dmprt
ld de,str_devide
cp DIODEV_IDE ; IDE
jr z,dmprt
ld de,str_devatapi
cp DIODEV_ATAPI ; ATAPI
jr z,dmprt
ld de,str_devppide
cp DIODEV_PPIDE ; PPIDE
jr z,dmprt
ld de,str_devsd
cp DIODEV_SD ; Generic SD
jr z,dmprt
ld de,str_devprpsd
cp DIODEV_PRPSD ; PropIO SD
jr z,dmprt
ld de,str_devpppsd
cp DIODEV_PPPSD ; ParPortProp SD
jr z,dmprt
ld de,str_devhdsk
cp DIODEV_HDSK ; SIMH HDSK
jr z,dmprt
jr dmdone
dmprt:
ld a,(BL_TMPDRV) ; recover drive letter
call COUT ; print it
ld a,'=' ; load equal sign
call COUT ; print it
call WRITESTR ; print device name now (str ptr in de)
ld a,b ; a = device/unit
and $f0 ; isolate device
jr z,dmprt1 ; bypass unit printing for mem disk
ld a,b ; a = device/unit
and $0f ; remove device nibble
add a,'0' ; convert to alpha
call COUT ; print unit number
ld a,h ; load slice max msb
or l ; compare to lsb
jr z,dmprt1 ; if zero, no lu support
ld a,'-' ; slice prefix
call COUT ; print slice prefix
ld de,(BL_TMPLU) ; recover LU
ld a,e ; ignore msb, load lsb in a
call PRTHEXBYTE ; print it
dmprt1:
call PC_SPACE ; padding
dmdone:
pop bc ; recover drive num and loop counter
inc c ; increment drive number
dec b ; decrement loop counter
jp nz,dmloop ; loop if more drives to check
ret ; done
#ENDIF
;
#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 (PIOC),A ; OUTPUT
CALL DELAY ; WAIT
LD A,0F0H ; SET CONTROL TO 1111 (DATA COMING, HEX DECODE,NO DECODE, NORMAL)
SEGDISPLAY1: ;
OUT (PIOA),A ; OUTPUT TO PORT
LD A,80H+30H ; STROBE WRITE PULSE WITH CONTROL=1
OUT (PIOC),A ; OUTPUT TO PORT
CALL DELAY ; WAIT
LD A,40H+30H ; SET CONTROL PORT 7218 TO OFF
OUT (PIOC),A ; OUTPUT
SEGDISPLAY_LP:
LD A,(HL) ; GET DISPLAY DIGIT
OUT (PIOA),A ; OUT TO PIOA
LD A,00H+30H ; SET WRITE STROBE
OUT (PIOC),A ; OUT TO PIOC
CALL DELAY ; DELAY
LD A,40H+30H ; SET CONTROL PORT OFF
OUT (PIOC),A ; OUT TO PIOC
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_BOOTROM .DB "BOOT FROM ROM\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_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\r\n", PLATFORM_NAME, " Boot Loader v", BIOSVER
.DB " (", VARIANT, "-", TIMESTAMP, ")\r\n$"
STR_BOOTMENU:
.DB "\r\nBoot: (M)onitor, (R)OM, or Drive Letter ===> $"
;
STR_SETUPMENU:
.DB "\r\n\r\n", PLATFORM_NAME, " Setup & Configuration v", BIOSVER
.DB " (", VARIANT, "-", TIMESTAMP, ")\r\n\r\n"
; .DB "(F)ormat RAM Disk\r\n"
.DB "e(X)it Setup\r\n"
.DB "\r\n===> $"
;
.IF DSKYENABLE
BOOT:
; . . t o o b
.DB 00H, 00H, 80H, 80H, 094H, 09DH, 09DH, 09FH
.ENDIF
;
#DEFINE CIOMODE_CBIOS
#DEFINE DSKY_KBD
#INCLUDE "util.asm"
;
#INCLUDE "memmgr.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
;==================================================================================================
;
; WE USE A 256 BYTE AREA JUST AT THE START OF RAM (TOP 32KB)
; FOR WORKING DATA STORAGE. THE FIRST 128 BYTES ARE RESERVED
; TO LOAD THE BLOCK CONTAINING THE BOOT LOAD METADATA. THE
; METADATA IS IN THE LAST 6 BYTES OF THIS BLOCK.
;
;__________________________________________________________________________________________________
;
;BL_METABUF .ORG 8000H ; START OF RAM
BL_METABUF .EQU $
BL_SIG .DW 0 ; SIGNATURE (WILL BE 0A55AH IF SET)
BL_PLATFORM .DB 0 ; Formatting Platform
BL_DEVICE .DB 0 ; Formatting Device
BL_FORMATTER .FILL 8,0 ; Formatting Program
BL_DRIVE .DB 0 ; Physical Disk Drive #
BL_LU .DW 0 ; Logical Unit (slice)
;
; .ORG (BL_METABUF + 128 - 32)
.FILL (BL_METABUF + 128) - $ - 32
BL_PROTECT .DB 0 ; write protect boolean
BL_UPDATES .DW 0 ; update counter
BL_RMJ .DB 0 ; RMJ Major Version Number
BL_RMN .DB 0 ; RMN Minor Version Number
BL_RUP .DB 0 ; RUP Update Number
BL_RTP .DB 0 ; RTP Patch Level
BL_LABEL .FILL 16,0 ; 16 Character Drive Label
BL_TERM .DB 0 ; LABEL TERMINATOR ('$')
BL_BILOC .DW 0 ; LOC TO PATCH BOOT DRIVE INFO TO (IF NOT ZERO)
BL_CPMLOC .DW 0 ; FINAL RAM DESTINATION FOR CPM/CBIOS
BL_CPMEND .DW 0 ; END ADDRESS FOR LOAD
BL_CPMENT .DW 0 ; CP/M ENTRY POINT (CBIOS COLD BOOT)
;
; WORKING STORAGE STARTS HERE
;
BL_STACKSIZ .EQU 40H
.FILL BL_STACKSIZ,0
BL_STACK .EQU $
;
BL_LDSPT .DW 0 ; SECTORS PER TRACK FOR LOAD DEVICE
BL_LDCTRK .DW 0 ; CURRENT TRACK FOR LOAD
BL_LDCSEC .DW 0 ; CURRENT SECTOR FOR LOAD
BL_LDCLOC .DW 0 ; CURRENT MEM LOC BEING LOADED
BL_LDEND .DW 0 ; RAM LOCATION TO STOP LOAD
BL_LDSIZ .DW 0 ; SIZE OF CPM/CBIOS IMAGE TO LOAD
BL_TIMEOUT .DW 0 ; AUTOBOOT TIMEOUT COUNTDOWN COUNTER
BL_BOOTDRIVE .DB 0 ; TEMPORARY STORAGE FOR BOOT DRIVE
BL_BOOTDEVICE .DB 0 ; TEMPORARY STORAGE FOR BOOT DEVICE/UNIT
BL_BOOTLU .DW 0 ; TEMPORARY STORAGE FOR BOOT LU
BL_TMPDRV .DB 0 ; TEMP STORAGE FOR DRIVE LETTER
BL_TMPLU .DW 0 ; TEMP STORAGE FOR LU
;
BL_LDLOC .EQU 100H ; LOAD IMAGE HERE BEFORE RELOCATING
;
#IF (DRIVES)
str_devrom .DB "ROM$"
str_devram .DB "RAM$"
str_devfd .DB "FD$"
str_devide .DB "IDE$"
str_devatapi .DB "ATAPI$"
str_devppide .DB "PPIDE$"
str_devsd .DB "SD$"
str_devprpsd .DB "PRPSD$"
str_devpppsd .DB "PPPSD$"
str_devhdsk .DB "HDSK$"
#ENDIF
;
;==================================================================================================
; FILL REMAINDER OF BANK
;==================================================================================================
;
SLACK: .EQU (9000H - $)
.FILL SLACK
;
.ECHO "LOADER space remaining: "
.ECHO SLACK
.ECHO " bytes.\n"
.END

209
trunk/Source/makefile Normal file
View File

@@ -0,0 +1,209 @@
#
# GCC based makefile
#
# 05/24/2012 2.0 wbw - changed to handle HBIOS
#
# 01/11/2011 1.4 wbw - added support for ZSDOS/ZDDOS/ZCPR
#
# 12/22/2011 1.3 wbw - removed all built-in config stuff, operation is now entirely
# dependent on variables CONFIG, ROMSIZE, and CPU
#
# 12/02/2011 1.3 wbw - replaced makever functionality with built-in makefile stuff
#
# 11/29/2011 1.3 dwg - uses makever to generate stdincl.inc from the version.hpp file
#
# 11/19/2011 1.3 dwg - added n8vem_vdu to "usage" and "all" rules
# enhanced clean to get files in $(OUTDIR)
# added custom to "all" rule
#
# The operation of this makefile is entirely dependent on the setting
# of three variables: CONFIG, ROMSIZE, and CPU:
#
# CONFIG determines which configuration to build which means that
# it will determine the config_xxx.asm config settings file to
# include as well as the output file names. So, for example,
# if CONFIG is "n8vem", the config_n8vem.asm file will be used
# for BIOS configuration settings and the output files will be
# n8vem.rom, n8vem.sys, and n8vem.com.
#
# ROMSIZE specifies the size of the ROM image to be produced and
# currently must be either "1024" for a 1MB ROM or "512" for a
# 512KB ROM.
#
# CPU specifies the instruction set to be used in assembly and
# must be either "80" for Z80 or "180" for Z180. Currently,
# you should use 180 for N8 ROMs and 80 for everything else.
#
# SYS specifies the system variant to build in. CPM will
# build traditional CP/M. ZSYS will build ZSystem which
# currently means ZSDOS 1.2 & ZCPR 1.0
#
# ROMNAME names the output file. It defaults to
# CONFIG. The output of the build will be:
# <ROMNAME>.rom, <ROMNAME>.sys, and <ROMNAME>.com.
#
# These variables can be passed into the makefile by the command
# line, hardcoded in this file, or set as environment variables
# in the OS. To use a command line, use the following format:
#
# make CONFIG=<config> ROMSIZE=<romsize> CPU=<cpu> SYS=<sys> ROMNAME=<romname>
#
# An example of this is:
#
# make CONFIG=n8vem ROMSIZE=512 CPU=80 SYS=CPM ROMNAME=n8vem
#
# Alternatively, you can specify the variables by hardcoding them
# in this file. To do so, uncomment the five lines after these
# comments and change the values as desired.
# If the variables are specified this way, you would then invoke
# the make by simply using "make"
#
# If you want to set them as environment variables, you can
# do this with commands like the following at an OS command
# prompt or in a batch file:
#
# SET CONFIG=n8vem
# SET ROMSIZE=512
# SET CPU=80
# SET SYS=CPM
# SET ROMNAME=n8vem
#
# Note: use "make clean" to delete temporary and output files
#
# A good idea is to do a clean with every build and this can be
# accomplished on one command line doing something like this:
#
# make clean all CONFIG=n8vem ROMSIZE=512 CPU=80 SYS=CPM ROMNAME=n8vem
#
# or, if you are using hard coded variables above:
#
# make clean all
#
# Uncomment and update values below to hardcode settings:
#
#CONFIG := n8vem
#ROMSIZE := 512
#CPU := 80
#SYS := CPM
#ROMNAME := n8vem
ifndef ROMNAME
ROMNAME := $(CONFIG)
endif
CPMTOOLSPATH := ../tools/cpmtools
CPMCP := $(CPMTOOLSPATH)/cpmcp.exe
ROMDSKFILES := ../RomDsk/$(SYS)_$(ROMSIZE)KB/*.* ../RomDsk/cfg_$(CONFIG)/*.* ../Apps/core/*.*
ifeq "$(SYS)" "CPM"
DOSBIN := bdosb01.bin
CPBIN := ccpb03.bin
else
DOSBIN := zsdos.bin
CPBIN := zcprw.bin
endif
OUTDIR := ..\Output
TASMPATH := ../tools/tasm32
TASM := $(TASMPATH)/tasm.exe
TASMTABS := $(TASMPATH)
export TASMTABS
ASMOPT80 := -t$(CPU) -g3
ASMOPT85 := -t85 -g3
ASM80 := $(TASM) $(ASMOPT80)
ASM85 := $(TASM) $(ASMOPT85)
ASMIMG := $(TASM) $(ASMOPT80) -b -fE5
NULL :=
SPACE := ${NULL} ${NULL}
%.bin: %.asm
$(ASM80) $< $@
%.com: %.asm
$(ASM80) $< $@
%.img: %.asm
$(ASMIMG) $< $@
%.exe: %.cpp
$(CC) $< -o $@
ifneq ($(MAKECMDGOALS),clean)
ifeq "$(and $(CONFIG), $(ROMSIZE), $(CPU), $(SYS), $(ROMNAME))" ""
$(error Usage: make CONFIG=<config> ROMSIZE=[512|1024] CPU=[80|180] SYS=[CPM|ZSYS] ROMNAME=<romname>)
endif
endif
all: $(OUTDIR)\$(ROMNAME).rom $(OUTDIR)\$(ROMNAME).sys $(OUTDIR)\$(ROMNAME).com
build.inc:
echo ; >$@
echo ; RomWBW Configured for $(CONFIG), %date% %time% >>$@
echo ; >>$@
echo #DEFINE TIMESTAMP "%date:~-4,4%%date:~-10,2%%date:~-7,2%T%time:~0,2%%time:~3,2%" >>$@
echo #DEFINE VARIANT "WBW-%username%" >>$@
echo ; >>$@
echo ROMSIZE .EQU $(ROMSIZE) >>$@
echo ; >>$@
echo #INCLUDE "config_$(CONFIG).asm" >>$@
echo ; >>$@
bootrom.bin : bootrom.asm std.asm build.inc ver.inc
$(TASM) $(ASMOPT80) $< $@
bootapp.bin : bootapp.asm std.asm build.inc ver.inc
$(TASM) $(ASMOPT80) $< $@
pgzero.bin : pgzero.asm std.asm build.inc ver.inc
$(TASM) $(ASMOPT80) $< $@
zcprw.bin : zcprw.asm zcpr.asm
$(TASM) $(ASMOPT85) $< $@
zsdos.bin : zsdos.asm zsdos.lib zsdos-gp.z80
$(TASM) $(ASMOPT80) $< $@
cbios.bin: cbios.asm fd_data.asm ide_data.asm ppide_data.asm sd_data.asm prp_data.asm ppp_data.asm uart.asm vdu.asm std.asm ver.inc build.inc
$(TASM) $(ASMOPT80) -dBLD_SYS=SYS_$(SYS) $< $@
dbgmon.bin: dbgmon.asm std.asm ver.inc build.inc
syscfg.bin: syscfg.asm std.asm build.inc ver.inc
os.bin: $(CPBIN) $(DOSBIN) cbios.bin
copy /B $(subst $(SPACE),+,$(^)) $@
rom0.bin: pgzero.bin bootrom.bin syscfg.bin loader.bin romfill.bin dbgmon.bin os.bin hbfill.bin
copy /B $(subst $(SPACE),+,$(^)) $@
rom1.bin: pgzero.bin bootrom.bin syscfg.bin loader.bin bnk1.bin
copy /B $(subst $(SPACE),+,$(^)) $@
$(OUTDIR)\$(ROMNAME).rom: rom0.bin rom1.bin $(ROMDISKFILES) $(OUTDIR)\$(ROMNAME).sys
copy blank$(ROMSIZE)KB.dat RomDisk.tmp
$(CPMCP) -f rom$(ROMSIZE)KB RomDisk.tmp $(ROMDSKFILES) 0:
$(CPMCP) -f rom$(ROMSIZE)KB RomDisk.tmp ../Output/$(ROMNAME).sys 0:$(SYS).sys
copy /B rom0.bin+rom1.bin+RomDisk.tmp $@
$(OUTDIR)\$(ROMNAME).com: bootapp.bin syscfg.bin loader.bin bnk1.bin dbgmon.bin os.bin
copy /B $(subst $(SPACE),+,$(^)) $@
$(OUTDIR)\$(ROMNAME).sys: prefix.bin os.bin
copy /B $(subst $(SPACE),+,$(^)) $@
clean:
if exist *.bin del *.bin
if exist *.com del *.com
if exist *.img del *.img
if exist *.rom del *.rom
if exist *.lst del *.lst
if exist *.exp del *.exp
if exist *.tmp del *.tmp
if exist build.inc del build.inc
if exist $(OUTDIR)\*.* erase /Q $(OUTDIR)\*.*

206
trunk/Source/makefile.linux Normal file
View File

@@ -0,0 +1,206 @@
#
# GCC based makefile
#
# 06/18/2012 2.0 dgg - updated for v2.0
#
# 02/22/2012 1.5 dgg - modified for assembly under Linux
#
# 01/11/2011 1.4 wbw - added support for ZSDOS/ZDDOS/ZCPR
#
# 12/22/2011 1.3 wbw - removed all built-in config stuff, operation is now entirely
# dependent on variables CONFIG, ROMSIZE, and CPU
#
# 12/02/2011 1.3 wbw - replaced makever functionality with built-in makefile stuff
#
# 11/29/2011 1.3 dwg - uses makever to generate stdincl.inc from the version.hpp file
#
# 11/19/2011 1.3 dwg - added n8vem_vdu to "usage" and "all" rules
# enhanced clean to get files in $(OUTDIR)
# added custom to "all" rule
#
# The operation of this makefile is entirely dependent on the setting
# of three variables: CONFIG, ROMSIZE, and CPU:
#
# CONFIG determines which configuration to build which means that
# it will determine the config_xxx.asm config settings file to
# include as well as the output file names. So, for example,
# if CONFIG is "n8vem", the config_n8vem.asm file will be used
# for BIOS configuration settings and the output files will be
# n8vem.rom, n8vem.sys, and n8vem.com.
#
# ROMSIZE specifies the size of the ROM image to be produced and
# currently must be either "1024" for a 1MB ROM or "512" for a
# 512KB ROM.
#
# CPU specifies the instruction set to be used in assembly and
# must be either "80" for Z80 or "180" for Z180. Currently,
# you should use 180 for N8 ROMs and 80 for everything else.
#
# SYS specifies the system variant to build in. CPM will
# build traditional CP/M. ZSYS will build ZSystem which
# currently means ZSDOS 1.2 & ZCPR 1.0
#
# ROMNAME names the output file. It defaults to
# CONFIG. The output of the build will be:
# <ROMNAME>.rom, <ROMNAME>.sys, and <ROMNAME>.com.
#
# These variables can be passed into the makefile by the command
# line, hardcoded in this file, or set as environment variables
# in the OS. To use a command line, use the following format:
#
# make CONFIG=<config> ROMSIZE=<romsize> CPU=<cpu> SYS=<sys> ROMNAME=<romname>
#
# An example of this is:
#
# make CONFIG=n8vem ROMSIZE=512 CPU=80 SYS=CPM ROMNAME=n8vem
#
# Alternatively, you can specify the variables by hardcoding them
# in this file. To do so, uncomment the five lines after these
# comments and change the values as desired.
# If the variables are specified this way, you would then invoke
# the make by simply using "make"
#
# If you want to set them as environment variables, you can
# do this with commands like the following at an OS command
# prompt or in a batch file:
#
# SET CONFIG=n8vem
# SET ROMSIZE=512
# SET CPU=80
# SET SYS=CPM
# SET ROMNAME=n8vem
#
# Note: use "make clean" to delete temporary and output files
#
# A good idea is to do a clean with every build and this can be
# accomplished on one command line doing something like this:
#
# make clean all CONFIG=n8vem ROMSIZE=512 CPU=80 SYS=CPM ROMNAME=n8vem
#
# or, if you are using hard coded variables above:
#
# make clean all
#
# Uncomment and update values below to hardcode settings:
#
#CONFIG := n8vem
#ROMSIZE := 512
#CPU := 80
#SYS := CPM
#ROMNAME := n8vem
ifndef ROMNAME
ROMNAME := $(CONFIG)
endif
CPMCP := /usr/bin/cpmcp
ROMDSKFILES := ../RomDsk/$(SYS)_$(ROMSIZE)KB/*.* ../RomDsk/cfg_$(CONFIG)/*.* ../Apps/core/*.*
ifeq "$(SYS)" "CPM"
DOSBIN := bdosb01.bin
CPBIN := ccpb03.bin
else
DOSBIN := zsdos.bin
CPBIN := zcprw.bin
endif
OUTDIR := ../Output
TASM := /usr/local/bin/tasm
TASMTABS := /usr/local/lib
export TASMTABS
ASMOPT80 := -t$(CPU) -g3
ASMOPT85 := -t85 -g3
ASM80 := $(TASM) $(ASMOPT80)
ASM85 := $(TASM) $(ASMOPT85)
ASMIMG := $(TASM) $(ASMOPT80) -b -fE5
NULL :=
SPACE := ${NULL} ${NULL}
%.bin: %.asm
$(ASM80) $< $@
%.com: %.asm
$(ASM80) $< $@
%.img: %.asm
$(ASMIMG) $< $@
%.exe: %.cpp
$(CC) $< -o $@
ifneq ($(MAKECMDGOALS),clean)
ifeq "$(and $(CONFIG), $(ROMSIZE), $(CPU), $(SYS), $(ROMNAME))" ""
$(error Usage: make CONFIG=<config> ROMSIZE=[512|1024] CPU=[80|180] SYS=[CPM|ZSYS] ROMNAME=<romname>)
endif
endif
all: $(OUTDIR)/$(ROMNAME).rom $(OUTDIR)/$(ROMNAME).sys $(OUTDIR)/$(ROMNAME).com
build.inc:
echo ';' >$@
echo -n '; RomWBW Configured for '$(CONFIG)' ' >>$@
date >> $@
echo ; >>$@
echo -n '#DEFINE TIMESTAMP "' >>$@
date '+%Y %m %d %H%M"' >>$@
echo ; >>$@
echo '#DEFINE VARIANT "WBW-$(USERNAME)"' >>$@
echo ; >>$@
echo ROMSIZE .EQU $(ROMSIZE) >>$@
echo ; >>$@
echo '#INCLUDE "config_'$(CONFIG)'.asm"' >>$@
echo ; >>$@
bootrom.bin : bootrom.asm std.asm build.inc ver.inc
$(TASM) $(ASMOPT80) $< $@
bootapp.bin : bootapp.asm std.asm build.inc ver.inc
$(TASM) $(ASMOPT80) $< $@
pgzero.bin : pgzero.asm std.asm build.inc ver.inc
$(TASM) $(ASMOPT80) $< $@
zcprw.bin : zcprw.asm zcpr.asm
$(TASM) $(ASMOPT85) $< $@
zsdos.bin : zsdos.asm zsdos.lib zsdos-gp.z80
$(TASM) $(ASMOPT80) $< $@
cbios.bin: cbios.asm fd_data.asm ide_data.asm ppide_data.asm sd_data.asm prp_data.asm ppp_data.asm uart.asm vdu.asm std.asm ver.inc build.inc
$(TASM) $(ASMOPT80) -dBLD_SYS=SYS_$(SYS) $< $@
dbgmon.bin: dbgmon.asm std.asm ver.inc build.inc
syscfg.bin: syscfg.asm std.asm build.inc ver.inc
os.bin: $(CPBIN) $(DOSBIN) cbios.bin
cat $(CPBIN) $(DOSBIN) cbios.bin >>$@
rom0.bin: pgzero.bin bootrom.bin syscfg.bin loader.bin romfill.bin dbgmon.bin os.bin hbfill.bin
cat pgzero.bin bootrom.bin syscfg.bin loader.bin romfill.bin dbgmon.bin os.bin hbfill.bin >>$@
rom1.bin: pgzero.bin bootrom.bin syscfg.bin loader.bin bnk1.bin
cat pgzero.bin bootrom.bin syscfg.bin loader.bin bnk1.bin >>$@
$(OUTDIR)/$(ROMNAME).rom: rom0.bin rom1.bin $(ROMDISKFILES) $(OUTDIR)/$(ROMNAME).sys
cp blank$(ROMSIZE)KB.dat RomDisk.tmp
$(CPMCP) -f rom$(ROMSIZE)KB RomDisk.tmp $(ROMDSKFILES) 0:
$(CPMCP) -f rom$(ROMSIZE)KB RomDisk.tmp ../Output/$(ROMNAME).sys 0:$(SYS).sys
cat rom0.bin rom1.bin RomDisk.tmp >>$@
$(OUTDIR)/$(ROMNAME).com: bootapp.bin syscfg.bin loader.bin bnk1.bin dbgmon.bin os.bin
cat bootapp.bin syscfg.bin loader.bin bnk1.bin dbgmon.bin os.bin >>$@
$(OUTDIR)/$(ROMNAME).sys: prefix.bin os.bin
cat prefix.bin os.bin >>$@
clean:
rm -f *.bin *.com *.img *.rom *.lst *.exp *.tmp
rm -f build.inc
rm -f $(OUTDIR)/*.*

79
trunk/Source/memmgr.asm Normal file
View File

@@ -0,0 +1,79 @@
;==================================================================================================
; MEMORY PAGE 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 EITHER RAMPG OR ROMPG AS DESIRED.
; RAMPGZ AND ROMPGZ ARE SHORTCUTS TO PAGE IN THE RAM/ROM ZERO PAGE.
;______________________________________________________________________________________________________________________
;
#IF (PLATFORM = PLT_N8)
RAMPGZ: ; SELECT RAM PAGE ZERO
XOR A
RAMPG:
RLCA
RLCA
RLCA
OUT0 (CPU_BBR),A
LD A,DEFACR | 80H
OUT0 (ACR),A
RET
;
ROMPGZ: ; SELECT ROM PAGE ZERO
XOR A
ROMPG:
OUT0 (RMAP),A
XOR A
OUT0 (CPU_BBR),A
LD A,DEFACR
OUT0 (ACR),A
RET
#ELSE
RAMPGZ: ; SELECT RAM PAGE ZERO
XOR A
RAMPG:
OR 80H ; TURN ON BIT 7 TO SELECT RAM PAGES
JR PGSEL
ROMPGZ: ; SELECT ROM PAGE ZERO
XOR A
ROMPG:
AND 7FH ; TURN OFF BIT 7 TO SELECT ROM PAGES
JR PGSEL
PGSEL:
OUT (MPCL_ROM),A
OUT (MPCL_RAM),A
RET
#ENDIF
;
;______________________________________________________________________________________________________________________
;
; MACROS TO PERFORM RAM/ROM PAGE SELECTION INTO LOWER 32K OF MEMORY SPACE
; PGRAM(P) SELECT RAM PAGE P
; PGRAMF(P) SELECT RAM PAGE P, FAST VERSION ASSUMES CURRENT PAGE IS A RAM PAGE
; PGROM(P) SELECT ROM PAGE P
; PGROMF(P) SELECT ROM PAGE P, FAST VERSION ASSUMES CURRENT PAGE IS A ROM PAGE
;
; REGISTER A IS DESTROYED
;______________________________________________________________________________________________________________________
;
#IF (PLATFORM = PLT_N8)
#DEFINE PGRAM(P) LD A,P << 3 \ OUT0 (CPU_BBR),A \ LD A,DEFACR | 80H \ OUT0 (ACR),A
#DEFINE PGRAMF(P) LD A,P << 3 \ OUT0 (CPU_BBR),A
#DEFINE PGROM(P) LD A,P \ OUT0 (RMAP),A \ XOR A \ OUT0 (CPU_BBR),A \ LD A,DEFACR \ OUT0 (ACR),A
#DEFINE PGROMF(P) LD A,P \ OUT0 (RMAP),A
#ELSE
#DEFINE PGRAM(P) LD A,P | 80H \ OUT (MPCL_ROM),A \ OUT (MPCL_RAM),A
#DEFINE PGRAMF(P) LD A,P | 80H \ OUT (MPCL_RAM),A
#DEFINE PGROM(P) LD A,P & 7FH \ OUT (MPCL_ROM),A \ OUT (MPCL_RAM),A
#DEFINE PGROMF(P) LD A,P & 7FH \ OUT (MPCL_ROM),A
#ENDIF

28
trunk/Source/pgzero.asm Normal file
View File

@@ -0,0 +1,28 @@
;___PGZERO_____________________________________________________________________________________________________________
;
.ORG 0000H
;
; 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
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 (100H - $),0FFH
;
.END

674
trunk/Source/ppide.asm Normal file
View File

@@ -0,0 +1,674 @@
;
;==================================================================================================
; PPIDE DISK DRIVER
;==================================================================================================
;
; 11/29/2011 dwg - DOUGDEBUG controls the embedded NOPs which adjust for
; recovery time while using the parallel port to talk to the PPIDE and IDE
; device. Using this stabilized by Zeta (8MHz) with a CF chip.
;
; 12/02/2011 wbw - renamed DOUGDEBUG to PPIDESLOW and exposed in config
; PPIDESLOW now controls the RECOVERY macro definition.
;
#IF (PPIDESLOW)
#DEFINE RECOVERY NOP\ NOP\ NOP\ NOP
#ELSE
#DEFINE RECOVERY ;
#ENDIF
;
; MAP PPI PORTS TO PPIDE PORTS
;
#IF (PPIDEMODE == PPIDEMODE_DIO3)
IDELSB .EQU 20H ; LSB
IDEMSB .EQU 21H ; MSB
IDECTL .EQU 22H ; CONTROL SIGNALS
PPI1CONT .EQU 23H ; CONTROL BYTE PPI 82C55
#ELSE
IDELSB .EQU PIOA ; LSB
IDEMSB .EQU PIOB ; MSB
IDECTL .EQU PIOC ; CONTROL SIGNALS
PPI1CONT .EQU PIOX ; CONTROL BYTE PPI 82C55
#ENDIF
;
; PPI control bytes for read and write to IDE drive
;
RD_IDE_8255 .EQU 10010010B ; IDE_8255_CTL OUT, IDE_8255_LSB/MSB INPUT
WR_IDE_8255 .EQU 10000000B ; ALL THREE PORTS OUTPUT
;
; IDE CONTROL LINES FOR USE WITH IDE_8255_CTL. CHANGE THESE 8
; CONSTANTS TO REFLECT WHERE EACH SIGNAL OF THE 8255 EACH OF THE
; IDE CONTROL SIGNALS IS CONNECTED. ALL THE CONTROL SIGNALS MUST
; BE ON THE SAME PORT, BUT THESE 8 LINES LET YOU CONNECT THEM TO
; WHICHEVER PINS ON THAT PORT.
;
PPIDE_A0_LINE .EQU 01H ; DIRECT FROM 8255 TO IDE INTERFACE
PPIDE_A1_LINE .EQU 02H ; DIRECT FROM 8255 TO IDE INTERFACE
PPIDE_A2_LINE .EQU 04H ; DIRECT FROM 8255 TO IDE INTERFACE
PPIDE_CS0_LINE .EQU 08H ; INVERTER BETWEEN 8255 AND IDE INTERFACE
PPIDE_CS1_LINE .EQU 10H ; INVERTER BETWEEN 8255 AND IDE INTERFACE
PPIDE_WR_LINE .EQU 20H ; INVERTER BETWEEN 8255 AND IDE INTERFACE
PPIDE_RD_LINE .EQU 40H ; INVERTER BETWEEN 8255 AND IDE INTERFACE
PPIDE_RST_LINE .EQU 80H ; INVERTER BETWEEN 8255 AND IDE INTERFACE
;
;------------------------------------------------------------------
; MORE SYMBOLIC CONSTANTS... THESE SHOULD NOT BE CHANGED, UNLESS OF
; COURSE THE IDE DRIVE INTERFACE CHANGES, PERHAPS WHEN DRIVES GET
; TO 128G AND THE PC INDUSTRY WILL DO YET ANOTHER KLUDGE.
;
; SOME SYMBOLIC CONSTANTS FOR THE IDE REGISTERS, WHICH MAKES THE
; CODE MORE READABLE THAN ALWAYS SPECIFYING THE ADDRESS PINS
;
PPIDE_DATA .EQU PPIDE_CS0_LINE
PPIDE_ERROR .EQU PPIDE_CS0_LINE + PPIDE_A0_LINE
PPIDE_SEC_CNT .EQU PPIDE_CS0_LINE + PPIDE_A1_LINE
PPIDE_SECTOR .EQU PPIDE_CS0_LINE + PPIDE_A1_LINE + PPIDE_A0_LINE
PPIDE_CYL_LSB .EQU PPIDE_CS0_LINE + PPIDE_A2_LINE
PPIDE_CYL_MSB .EQU PPIDE_CS0_LINE + PPIDE_A2_LINE + PPIDE_A0_LINE
PPIDE_HEAD .EQU PPIDE_CS0_LINE + PPIDE_A2_LINE + PPIDE_A1_LINE
PPIDE_COMMAND .EQU PPIDE_CS0_LINE + PPIDE_A2_LINE + PPIDE_A1_LINE + PPIDE_A0_LINE
PPIDE_STTS .EQU PPIDE_CS0_LINE + PPIDE_A2_LINE + PPIDE_A1_LINE + PPIDE_A0_LINE
PPIDE_CONTROL .EQU PPIDE_CS1_LINE + PPIDE_A2_LINE + PPIDE_A1_LINE
PPIDE_ASTTS .EQU PPIDE_CS1_LINE + PPIDE_A2_LINE + PPIDE_A1_LINE + PPIDE_A0_LINE
;
; IDE COMMAND CONSTANTS. THESE SHOULD NEVER CHANGE.
;
PPIDECMD_RECAL .EQU 010H
PPIDECMD_READ .EQU 020H
PPIDECMD_WRITE .EQU 030H
PPIDECMD_INIT .EQU 091H
PPIDECMD_ID .EQU 0ECH
PPIDECMD_SPINDOWN .EQU 0E0H
PPIDECMD_SPINUP .EQU 0E1H
PPIDECMD_SETFEAT .EQU 0EFH
;
PPIDERC_OK .EQU 0
PPIDERC_CMDERR .EQU 1
PPIDERC_RDYTO .EQU 2
PPIDERC_BUFTO .EQU 3
;
; UNIT CONFIGURATION
;
PPIDE0_DEVICE .DB 11100000B ; LBA, MASTER DEVICE
PPIDE1_DEVICE .DB 11110000B ; LBA, SLAVE DEVICE
;
;
;
PPIDE_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F
JR Z,PPIDE_RD
DEC A
JR Z,PPIDE_WR
DEC A
JR Z,PPIDE_ST
DEC A
JR Z,PPIDE_MED
CALL PANIC
;
PPIDE_RD:
JP PPIDE_XREAD
PPIDE_WR:
JP PPIDE_XWRITE
PPIDE_ST:
JP PPIDE_STATUS
PPIDE_MED:
JP PPIDE_MEDIA
;
; PPIDE_MEDIA
;
PPIDE_MEDIA:
LD A,MID_HD
RET
;
;
;
PPIDE_INIT:
CALL PPIDE_RESET
XOR A
DEC A ; INITIAL STATUS IS NOT READY $FF
LD (PPIDE_STAT),A ; SAVE IT
RET
;
;
;
PPIDE_STATUS:
LD A,(PPIDE_STAT) ; LOAD STATUS
OR A ; SET FLAGS
RET
;
;
;
PPIDE_XREAD:
LD A,PPIDECMD_READ
LD (PPIDEP_CMD),A
JP PPIDE_RW
;
;
;
PPIDE_XWRITE:
LD A,PPIDECMD_WRITE
LD (PPIDEP_CMD),A
JP PPIDE_RW
;
;
;
PPIDE_RW:
; CLEAR RESULTS
XOR A ; A = 0
LD (PPIDE_RC),A ; CLEAR RETURN CODE
LD (PPIDEP_STTS),A ; CLEAR SAVED STTS
LD (PPIDEP_ERR),A ; CLEAR SAVED ERR
; INIT REQUIRED?
LD A,(PPIDE_STAT)
OR A ; SET FLAGS
JR Z,PPIDE_RW0 ; IF STATUS OK, BYPASS RESET
CALL PPIDE_RESET ; DO THE RESET
#IF (PPIDE8BIT)
CALL PPIDE_WAITRDY
LD C,01H
LD A,PPIDE_ERROR
CALL PPIDE_WRITE
LD C,PPIDECMD_SETFEAT
LD A,PPIDE_COMMAND
CALL PPIDE_WRITE
CALL PPIDE_WAITRDY
JP NC,PPIDE_ERR
CALL PPIDE_CHKERR ; CHECK FOR ERRORS
JP NC,PPIDE_ERR
#IF (PPIDETRACE >= 2)
CALL IDE_PRT
#ENDIF
#ENDIF
PPIDE_RW0:
CALL PPIDE_WAITRDY ; WAIT FOR DRIVE READY
JP NC,PPIDE_ERR
CALL PPIDE_SETUP ; SETUP CYL, TRK, HEAD
LD A,(PPIDEP_CMD)
LD C,A
LD A,PPIDE_COMMAND
CALL PPIDE_WRITE
CALL PPIDE_WAITRDY ; WAIT FOR DRIVE READY
JP NC,PPIDE_ERR
CALL PPIDE_CHKERR ; CHECK FOR ERRORS
JP NC,PPIDE_ERR
CALL PPIDE_WAITBUF ; WAIT FOR BUFFER READY
JP NC,PPIDE_ERR
LD A,(PPIDEP_CMD) ; DISPATCH TO READ OR WRITE SPECIFIC LOGIC
CP PPIDECMD_WRITE
JP Z,PPIDE_RW1
CALL PPIDE_BUFRD ; READ BUFFER
CALL PPIDE_WAITRDY ; WAIT FOR DRIVE READY
JP NC,PPIDE_ERR
CALL PPIDE_CHKERR ; CHECK FOR ERRORS
JP NC,PPIDE_ERR
JP PPIDE_OK
PPIDE_RW1:
CALL PPIDE_BUFWR ; WRITE BUFFER
CALL PPIDE_WAITRDY ; WAIT FOR DRIVE READY
JP NC,PPIDE_ERR
CALL PPIDE_CHKERR ; CHECK FOR ERRORS
JP NC,PPIDE_ERR
JP PPIDE_OK
PPIDE_ERR:
XOR A
DEC A ; A = $FF TO SIGNAL ERROR
LD (PPIDE_STAT),A ; SAVE IT
#IF (PPIDETRACE >= 1)
PUSH AF
CALL PPIDE_PRT
POP AF
#ENDIF
RET
PPIDE_OK:
#IF (PPIDETRACE >= 2)
CALL PPIDE_PRT
#ENDIF
XOR A
RET
;
;
;
PPIDE_RESET:
LD C,000001110B ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES
LD A,PPIDE_CONTROL
CALL PPIDE_WRITE
LD DE,8 ; DELAY ABOUT 200ms
CALL VDELAY
LD C,000000010B ; NO INTERRUPTS, DEASSERT RESET
LD A,PPIDE_CONTROL
CALL PPIDE_WRITE
XOR A ; STATUS OK
LD (PPIDE_STAT),A ; SAVE IT
RET
;
;
;
PPIDE_WAITRDY:
LD DE,0 ; TIMEOUT IS 250us * 65536 = 15 SECONDS
PPIDE_WBSY:
PUSH DE
LD DE,10 ; INNER LOOP DELAY IS 250us (25us * 10)
CALL VDELAY
POP DE
DEC DE
LD A,D
OR E
JP Z,PPIDE_TO
LD A,PPIDE_STTS
CALL PPIDE_READ
LD A,C
LD (PPIDEP_STTS),A ; SAVE IT
AND 011000000B ; ISOLATE BUSY AND RDY BITS
XOR 001000000B ; WE WANT BUSY(7) TO BE 0 AND RDY(6) TO BE 1
JP NZ,PPIDE_WBSY
SCF ; CARRY 1 = OK
RET
PPIDE_TO:
LD A,PPIDERC_RDYTO
LD (PPIDE_RC),A
XOR A ; CARRY 0 = TIMEOUT
RET
;
;
;
PPIDE_CHKERR:
LD A,PPIDE_STTS
CALL PPIDE_READ
LD A,C
LD (PPIDEP_STTS),A ; SAVE IT
AND 000000001B ; ERROR BIT SET?
SCF ; ASSUME NO ERR
RET Z ; NO ERR, RETURN WITH CF SET
LD A,PPIDE_ERROR
CALL PPIDE_READ
LD A,C
LD (PPIDEP_ERR),A ; SAVE IT
LD A,PPIDERC_CMDERR ; COMMAND ERROR
LD (PPIDE_RC),A ; SAVE IT
OR A ; CLEAR CF TO SIGNAL ERROR
RET
;
;
;
PPIDE_WAITBUF:
LD DE,0
PPIDE_WDRQ:
CALL DELAY
INC DE
LD A,D
OR E
JP Z,PPIDE_TO2
LD A,PPIDE_STTS
CALL PPIDE_READ
LD A,C
LD (PPIDEP_STTS),A ; SAVE IT
AND 010001000B ; TO FILL (OR READY TO FILL)
XOR 000001000B
JP NZ,PPIDE_WDRQ
SCF ; CARRY 1 = OK
RET
PPIDE_TO2:
LD A,PPIDERC_BUFTO
LD (PPIDE_RC),A
XOR A ; CARRY 0 = TIMED OUT
RET
;
;
;
#IF (PPIDE8BIT)
PPIDE_BUFRD:
LD HL,(DIOBUF)
LD DE,200H
PPIDE_BUFRD1:
LD A,PPIDE_DATA
CALL PPIDE_READ
LD (HL),C
INC HL
DEC DE
LD A,D
OR E
JP NZ,PPIDE_BUFRD1
RET
#ELSE
PPIDE_BUFRD:
LD HL,(DIOBUF)
LD D,0
PPIDE_BUFRD1:
LD A,PPIDE_DATA
CALL PPIDE_READ
LD (HL),C
INC HL
LD (HL),B
INC HL
DEC D
JP NZ,PPIDE_BUFRD1
RET
#ENDIF
;
;
;
#IF (PPIDE8BIT)
PPIDE_BUFWR:
LD HL,(DIOBUF)
LD DE,200H
PPIDE_BUFWR1:
LD C,(HL)
LD A,PPIDE_DATA
CALL PPIDE_WRITE
INC HL
DEC DE
LD A,D
OR E
JP NZ,PPIDE_BUFWR1
#ELSE
PPIDE_BUFWR:
LD HL,(DIOBUF)
LD D,0
PPIDE_BUFWR1:
LD C,(HL)
INC HL
LD B,(HL)
INC HL
LD A,PPIDE_DATA
CALL PPIDE_WRITE
DEC D
JP NZ,PPIDE_BUFWR1
RET
#ENDIF
;
;
;
PPIDE_SETUP:
LD C,1
LD A,PPIDE_SEC_CNT
CALL PPIDE_WRITE
LD A,(HSTDSK) ; HSTDSK -> HEAD BIT 4 TO SELECT UNIT
AND 0FH
CP 0
JP Z,PPIDE_SETUP_UNIT0
CP 1
JP Z,PPIDE_SETUP_UNIT1
CALL PANIC
PPIDE_SETUP_UNIT0:
LD A,(PPIDE0_DEVICE)
; LD DE,(PPIDE0_OFFSET)
JP PPIDE_SETUP1
PPIDE_SETUP_UNIT1:
LD A,(PPIDE1_DEVICE)
; LD DE,(PPIDE1_OFFSET)
JP PPIDE_SETUP1
PPIDE_SETUP1:
LD (PPIDEP_HEAD),A
LD C,A
LD A,PPIDE_HEAD
CALL PPIDE_WRITE
LD HL,(HSTTRK) ; HSTTRK -> IDECYLHI/LO
LD A,H
LD (PPIDEP_CYLHI),A
LD C,A
LD A,PPIDE_CYL_MSB
CALL PPIDE_WRITE
LD A,L
LD (PPIDEP_CYLLO),A
LD C,A
LD A,PPIDE_CYL_LSB
CALL PPIDE_WRITE
LD BC,(HSTSEC) ; HSTSEC -> IDESECTN
LD A,C
LD (PPIDEP_SEC),A
LD C,A
LD A,PPIDE_SECTOR
CALL PPIDE_WRITE
#IF (DSKYENABLE)
CALL PPIDE_DSKY
#ENDIF
RET
;
;
;
PPIDE_READ:
PUSH AF ; save register value
LD A,RD_IDE_8255
OUT (PPI1CONT),A ; Config 8255 chip, read mode
RECOVERY
POP AF ; restore register value
OUT (IDECTL),A ; Drive address onto control lines
RECOVERY
OR PPIDE_RD_LINE ; assert RD pin
OUT (IDECTL),A
RECOVERY
PUSH AF ; save register value
IN A,(IDELSB) ; read lower byte
RECOVERY
LD C,A ; save in reg C
IN A,(IDEMSB) ; read upper byte
RECOVERY
LD B,A ; save in reg C
POP AF ; restore register value
XOR PPIDE_RD_LINE ; de-assert RD signal
OUT (IDECTL),A
RECOVERY
XOR A
OUT (IDECTL),A ; Deassert all control pins
RECOVERY
RET
;
;
;
PPIDE_WRITE:
PUSH AF ; save IDE register value
LD A,WR_IDE_8255
OUT (PPI1CONT),A ; Config 8255 chip, write mode
RECOVERY
LD A,C ; get value to be written
OUT (IDELSB),A
RECOVERY
LD A,B ; get value to be written
OUT (IDEMSB),A
RECOVERY
POP AF ; get saved IDE register
OUT (IDECTL),A ; Drive address onto control lines
RECOVERY
OR PPIDE_WR_LINE ; assert write pin
OUT (IDECTL),A
RECOVERY
XOR PPIDE_WR_LINE ; de assert WR pin
OUT (IDECTL),A ; Drive address onto control lines
RECOVERY
XOR A
OUT (IDECTL),A ; release bus signals
RECOVERY
RET
;
;
;
#IF (DSKYENABLE)
PPIDE_DSKY:
LD HL,DSKY_HEXBUF
LD A,(PPIDEP_HEAD)
LD (HL),A
INC HL
LD A,(PPIDEP_CYLHI)
LD (HL),A
INC HL
LD A,(PPIDEP_CYLLO)
LD (HL),A
INC HL
LD A,(PPIDEP_SEC)
LD (HL),A
CALL DSKY_HEXOUT
RET
#ENDIF
;
;
;
PPIDE_PRT:
CALL NEWLINE
LD DE,PPIDESTR_PREFIX
CALL WRITESTR
CALL PC_SPACE
LD DE,PPIDESTR_CMD
CALL WRITESTR
LD A,(PPIDEP_CMD)
CALL PRTHEXBYTE
CALL PC_SPACE
CALL PC_LBKT
LD A,(PPIDEP_CMD)
LD DE,PPIDESTR_READ
CP PPIDECMD_READ
JP Z,PPIDE_PRTCMD
LD DE,PPIDESTR_WRITE
CP PPIDECMD_READ
JP Z,PPIDE_PRTCMD
LD DE,PPIDESTR_UNKCMD
PPIDE_PRTCMD:
CALL WRITESTR
CALL PC_RBKT
CALL PC_SPACE
LD A,(PPIDEP_HEAD)
CALL PRTHEXBYTE
LD A,(PPIDEP_CYLHI)
CALL PRTHEXBYTE
LD A,(PPIDEP_CYLLO)
CALL PRTHEXBYTE
LD A,(PPIDEP_SEC)
CALL PRTHEXBYTE
CALL PC_SPACE
LD DE,PPIDESTR_ARROW
CALL WRITESTR
CALL PC_SPACE
LD A,PPIDE_STTS
CALL PPIDE_READ
LD A,C
CALL PRTHEXBYTE
CALL PC_SPACE
LD A,PPIDE_ERROR
CALL PPIDE_READ
LD A,C
CALL PRTHEXBYTE
CALL PC_SPACE
LD DE,PPIDESTR_RC
CALL WRITESTR
LD A,(PPIDE_RC)
CALL PRTHEXBYTE
CALL PC_SPACE
CALL PC_LBKT
LD A,(PPIDE_RC)
LD DE,PPIDESTR_RCOK
CP PPIDERC_OK
JP Z,PPIDE_PRTRC
LD DE,PPIDESTR_RCCMDERR
CP PPIDERC_CMDERR
JP Z,PPIDE_PRTRC
LD DE,PPIDESTR_RCRDYTO
CP PPIDERC_RDYTO
JP Z,PPIDE_PRTRC
LD DE,PPIDESTR_RCBUFTO
CP PPIDERC_BUFTO
JP Z,PPIDE_PRTRC
LD DE,PPIDESTR_RCUNK
PPIDE_PRTRC:
CALL WRITESTR
CALL PC_RBKT
RET
;
;
;
PPIDESTR_PREFIX .TEXT "PPIDE:$"
PPIDESTR_CMD .TEXT "CMD=$"
PPIDESTR_RC .TEXT "RC=$"
PPIDESTR_ARROW .TEXT "-->$"
PPIDESTR_READ .TEXT "READ$"
PPIDESTR_WRITE .TEXT "WRITE$"
PPIDESTR_UNKCMD .TEXT "UNKCMD"
PPIDESTR_RCOK .TEXT "OK$"
PPIDESTR_RCCMDERR .TEXT "COMMAND ERROR$"
PPIDESTR_RCRDYTO .TEXT "READY TIMEOUT$"
PPIDESTR_RCBUFTO .TEXT "BUFFER TIMEOUT$"
PPIDESTR_RCUNK .TEXT "UNKNOWN ERROR$"
;
;==================================================================================================
; PPIDE DISK DRIVER - DATA
;==================================================================================================
;
PPIDE_STAT .DB 0
PPIDE_RC .DB 0
;
; PPIDE PARAMETERS
;
PPIDEP_CMD .DB 0
PPIDEP_HEAD .DB 0
PPIDEP_CYLHI .DB 0
PPIDEP_CYLLO .DB 0
PPIDEP_SEC .DB 0
PPIDEP_STTS .DB 0
PPIDEP_ERR .DB 0
;
;
;
;
;
;
;
; Error Register (ERR bit being set in the Status Register)
;
; Bit 7: BBK (Bad Block Detected) Set when a Bad Block is detected.
; Bit 6: UNC (Uncorrectable Data Error) Set when Uncorrectable Error is encountered.
; Bit 5: MC (Media Changed) Set to 0.
; Bit 4: IDNF (ID Not Found) Set when Sector ID not found.
; Bit 3: MCR (Media Change Request) Set to 0.
; Bit 2: ABRT (Aborted Command) Set when Command Aborted due to drive error.
; Bit 1: TKONF (Track 0 Not Found) Set when Executive Drive Diagnostic Command.
; Bit 0: AMNF (Address mark Not Found) Set in case of a general error.
;
; Status Register (When the contents of this register are read by the host, the IREQ# bit is cleared)
;
; Bit 7: BSY (Busy) Set when the drive is busy and unable to process any new ATA commands.
; Bit 6: DRDY (Data Ready) Set when the device is ready to accept ATA commands from the host.
; Bit 5: DWF (Drive Write Fault) Always set to 0.
; Bit 4: DSC (Drive Seek Complete) Set when the drive heads have been positioned over a specific track.
; Bit 3: DRQ (Data Request) Set when device is ready to transfer a word or byte of data to or from the host and the device.
; Bit 2: CORR (Corrected Data) Always set to 0.
; Bit 1: IDX (Index) Always set to 0.
; Bit 0: ERR (Error) Set when an error occurred during the previous ATA command.

View File

@@ -0,0 +1,61 @@
;
;==================================================================================================
; PPIDE DISK DRIVER - DATA
;==================================================================================================
;
PPIDE_SLICETRKS .EQU 65 ; TRACKS PER SLICE
PPIDE_TRKSIZE .EQU 128 ; SIZE OF TRACK (IN KB)
PPIDE_SLICESIZE .EQU ((PPIDE_SLICETRKS * PPIDE_TRKSIZE) + 1023) / 1024 ; SIZE OF EACH SLICE (IN MB)
PPIDE_NUMSLICES .EQU PPIDECAPACITY / PPIDE_SLICESIZE ; TOTAL SLICES IN DEVICE
PPIDE0_SLICEDEF .EQU 0 ; DEFAULT SLICE FOR UNIT 0
PPIDE1_SLICEDEF .EQU 1 ; DEFAULT SLICE FOR UNIT 1
PPIDE2_SLICEDEF .EQU 2 ; DEFAULT SLICE FOR UNIT 0
PPIDE3_SLICEDEF .EQU 3 ; DEFAULT SLICE FOR UNIT 1
;
.DB DIODEV_PPIDE + 0
PPIDEDPH0 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW PPIDECSV0,PPIDEALV0
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
PPIDE0_SLICE .DW PPIDE0_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW PPIDE_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_PPIDE + 0
PPIDEDPH1 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,0FFFFH
.DW PPIDECSV1,PPIDEALV1
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
PPIDE1_SLICE .DW PPIDE1_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW PPIDE_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_PPIDE + 0
PPIDEDPH2 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,0FFFFH
.DW PPIDECSV2,PPIDEALV2
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
PPIDE2_SLICE .DW PPIDE2_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW PPIDE_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_PPIDE + 0
PPIDEDPH3 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,0FFFFH
.DW PPIDECSV3,PPIDEALV3
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
PPIDE3_SLICE .DW PPIDE3_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW PPIDE_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
PPIDECKS .EQU 0 ; CKS: 0 FOR NON-REMOVABLE MEDIA
PPIDEALS .EQU 256 ; ALS: BLKS / 8 = 2048 / 8 = 256 (ROUNDED UP)
;
PPIDECSV0: .FILL PPIDECKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
PPIDEALV0: .FILL PPIDEALS ; MAX OF 2048 DATA BLOCKS
PPIDECSV1: .FILL PPIDECKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
PPIDEALV1: .FILL PPIDEALS ; MAX OF 2048 DATA BLOCKS
PPIDECSV2: .FILL PPIDECKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
PPIDEALV2: .FILL PPIDEALS ; MAX OF 2048 DATA BLOCKS
PPIDECSV3: .FILL PPIDECKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
PPIDEALV3: .FILL PPIDEALS ; MAX OF 2048 DATA BLOCKS

472
trunk/Source/ppp.asm Normal file
View File

@@ -0,0 +1,472 @@
;
;==================================================================================================
; PARPORTPROP DRIVER
;==================================================================================================
;
; COMMAND BYTES
;
PPP_CMDNOP .EQU $00 ; DO NOTHING
PPP_CMDECHOBYTE .EQU $01 ; RECEIVE A BYTE, INVERT IT, SEND IT BACK
PPP_CMDECHOBUF .EQU $02 ; RECEIVE 512 BYTE BUFFER, SEND IT BACK
;
PPP_CMDDSKRES .EQU $10 ; RESTART SD CARD SUPPORT
PPP_CMDDSKSTAT .EQU $11 ; SEND LAST SD CARD STATUS (4 BYTES)
PPP_CMDDSKPUT .EQU $12 ; PPI -> SECTOR BUFFER -> PPP
PPP_CMDDSKGET .EQU $13 ; PPP -> SECTOR BUFFER -> PPI
PPP_CMDDSKRD .EQU $14 ; READ SCTOR FROM SD CARD INTO PPP BUFFER, RETURN 1 BYTE STATUS
PPP_CMDDSKWR .EQU $15 ; WRITE SECTOR TO SD CARD FROM PPP BUFFER, RETURN 1 BYTE STATUS
;
PPP_CMDVIDOUT .EQU $20 ; WRITE A BYTE TO THE TERMINAL EMULATOR
;
PPP_CMDKBDSTAT .EQU $30 ; RETURN A BYTE WITH NUMBER OF CHARACTERS IN BUFFER
PPP_CMDKBDRD .EQU $31 ; RETURN A CHARACTER, WAIT IF NECESSARY
;
PPP_CMDSPKTONE .EQU $40 ; EMIT SPEAKER TONE AT SPECIFIED FREQUENCY AND DURATION
;
PPP_CMDSIOINIT .EQU $50 ; RESET SERIAL PORT AND ESTABLISH A NEW BAUD RATE (4 BYTE BAUD RATE)
PPP_CMDSIORX .EQU $51 ; RECEIVE A BYTE IN FROM SERIAL PORT
PPP_CMDSIOTX .EQU $52 ; TRANSMIT A BYTE OUT OF THE SERIAL PORT
PPP_CMDSIORXST .EQU $53 ; SERIAL PORT RECEIVE STATUS (RETURNS # BYTES OF RX BUFFER USED)
PPP_CMDSIOTXST .EQU $54 ; SERIAL PORT TRANSMIT STATUS (RETURNS # BYTES OF TX BUFFER SPACE AVAILABLE)
PPP_CMDSIORXFL .EQU $55 ; SERIAL PORT RECEIVE BUFFER FLUSH
PPP_CMDSIOTXFL .EQU $56 ; SERIAL PORT TRANSMIT BUFFER FLUSH (NOT IMPLEMENTED)
;
PPP_CMDRESET .EQU $F0 ; SOFT RESET PROPELLER
;
; GLOBAL PARPORTPROP INITIALIZATION
;
PPP_INIT:
LD A,$9B ; PPI MODE 0, ALL PINS INPUT
OUT (PIOX),A ; SEND IT
LD A,11000010B ; PPI MODE 2 (BI HANDSHAKE), PC0-2 OUT, PB IN
OUT (PIOX),A
CALL DELAY ; PROBABLY NOT NEEDED
LD A,00000000B ; SET PC0 -> 0
OUT (PIOX),A
LD A,00000010B ; SET PC1 -> 0
OUT (PIOX),A
LD A,00000101B ; SET PC2 -> 1 - ASSERT RESET ON PPP
OUT (PIOX),A
LD A,00000110B ; SET PC3 -> 0
OUT (PIOX),A
CALL DELAY ; PROBABLY NOT NEEDED
IN A,(PIOA) ; CLEAR GARBAGE???
CALL DELAY ; PROBABLY NOT NEEDED
LD A,00000001B ; SET CMD FLAG
OUT (PIOX),A ; SEND IT
LD E,PPP_CMDRESET
CALL PUTBYTE ; SEND THE COMMAND BYTE
CALL DELAY
LD A,00000000B ; CLEAR CMD FLAG
OUT (PIOX),A
LD A,00000100B ; SET PC2 -> 0 - DEASSERT RESET ON PPP
OUT (PIOX),A
CALL DELAY ; PROBABLY NOT NEEDED
LD BC,0
INIT1:
PUSH BC
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
IN A,(PIOA)
POP BC
CP $AA
RET Z
DEC BC
LD A,B
OR C
JR NZ,INIT1
CALL NEWLINE
LD DE,PPPSTR_TIMEOUT
CALL WRITESTR
CALL PPPSD_INIT ; SD CARD INITIALIZATION
RET
;
;==================================================================================================
; PARPORTPROP CONSOLE DRIVER
;==================================================================================================
;
; DISPATCH FOR CONSOLE SUBFUNCTIONS
;
PPPCON_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,PPPCON_IN ; JUMP IF CHARACTER IN
DEC A ; NEXT SUBFUNCTION
JR Z,PPPCON_OUT ; JUMP IF CHARACTER OUT
DEC A ; NEXT SUBFUCNTION
JR Z,PPPCON_IST ; JUMP IF INPUT STATUS
DEC A ; NEXT SUBFUNCTION
JR Z,PPPCON_OST ; JUMP IF OUTPUT STATUS
CALL PANIC ; OTHERWISE SOMETHING IS BADLY BROKEN
;
; CHARACTER INPUT
; WAIT FOR A CHARACTER AND RETURN IT IN E
;
PPPCON_IN:
CALL PPPCON_IST ; CHECK FOR CHAR PENDING
JR Z,PPPCON_IN ; WAIT FOR IT IF NECESSARY
LD D,PPP_CMDKBDRD ; CMD = KEYBOARD READ
CALL SENDCMD ; SEND COMMAND
CALL GETBYTE ; GET CHARACTER READ
XOR A ; CLEAR A (SUCCESS)
RET ; AND RETURN
;
; CHARACTER INPUT STATUS
; RETURN STATUS IN A, 0 = NOTHING PENDING, > 0 CHAR PENDING
;
PPPCON_IST:
LD D,PPP_CMDKBDSTAT ; CMD = KEYBOARD STATUS
CALL SENDCMD ; SEND COMMAND
CALL GETBYTE ; GET RESPONSE
LD A,E ; MOVE IT TO A
OR A ; SET FLAGS
RET NZ ; A <> 0, CHAR(S) PENDING
JP CIO_IDLE ; OTHERWISE RET VIA IDLE PROCESSING
;
; CHARACTER OUTPUT
; WRITE CHARACTER IN E
;
PPPCON_OUT:
CALL PPPCON_OST ; CHECK FOR OUTPUT READY
JR Z,PPPCON_OUT ; WAIT IF NECESSARY
LD D,PPP_CMDVIDOUT ; CMD = VIDEO OUTPUT
CALL SENDCMD ; SEND COMMAND
CALL PUTBYTE ; SEND IT
RET ; RETURN
;
; CHARACTER OUTPUT STATUS
; RETURN STATUS IN A, 0 = NOT READY, > 0 READY TO SEND
; CONSOLE IS ALWAYS READY TO SEND (SYNCHRONOUS OUTPUT)
;
PPPCON_OST:
XOR A ; SET A=$01 TO SIGNAL READY
INC A
RET
;
;==================================================================================================
; PARPORTPROP SD CARD DRIVER
;==================================================================================================
;
PPPSD_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F
JP Z,PPPSD_READ ; READ
DEC A
JP Z,PPPSD_WRITE ; WRITE
DEC A
JP Z,PPPSD_STATUS ; STATUS
DEC A
JP Z,PPPSD_MEDIA ; MEDIA ID
CALL PANIC
;
; SETUP FOR SUBSEQUENT ACCESS
; INIT CARD IF NOT READY OR ON DRIVE LOG IN
;
PPPSD_MEDIA:
; REINITIALIZE THE CARD HERE TO DETERMINE PRESENCE
CALL PPPSD_INITCARD
LD A,MID_NONE ; ASSUME FAILURE
RET NZ
; ALL IS WELL, RETURN MEDIA IDENTIFIER
LD A,MID_HD ; SET MEDIA ID
RET
;
; SD CARD INITIALIZATION
;
PPPSD_INIT:
; MARK DRIVE NOT READY
; HARDWARE INIT DEFERRED UNTIL DRIVE SELECT
XOR A
DEC A
LD (PPPSD_STAT),A
RET
;
; REPORT SD CARD READY STATE
;
PPPSD_STATUS:
LD A,(PPPSD_STAT) ; GET THE CURRENT READY STATUS
OR A
RET
;
; READ AN LBA BLOCK FROM THE SD CARD
;
PPPSD_READ:
CALL PPPSD_CHKCARD ; CHECK / REINIT CARD AS NEEDED
RET NZ ; BAIL OUT ON ERROR
; READ A SECTOR
CALL PPPSD_SETBLK ; SETUP PPP_LBA WITH BLOCK NUMBER
LD D,PPP_CMDDSKRD ; COMMAND = DSKWR
CALL SENDCMD ; SEND COMMAND
CALL PPPSD_SENDBLK ; SEND THE LBA BLOCK NUMBER
CALL GETBYTE
LD A,E
LD (PPPSD_STAT),A ; SAVE STATUS
CALL PPPSD_PRTREAD ; PRINT DIAGNOSTICS AS NEEDED
OR A ; SET FLAGS
RET NZ ; BAIL OUT ON ERROR
; GET THE SECTOR DATA
LD D,PPP_CMDDSKGET ; COMMAND = DSKGET
CALL SENDCMD ; SEND COMMAND
; READ THE SECTOR DATA
LD BC,512
LD HL,(DIOBUF)
DSKREAD1:
CALL GETBYTE
LD (HL),E
INC HL
DEC BC
LD A,B
OR C
JP NZ,DSKREAD1
XOR A ; SUCCESS
RET
;
; WRITE AN LBA BLOCK TO THE SD CARD
;
PPPSD_WRITE:
CALL PPPSD_CHKCARD ; CHECK / REINIT CARD AS NEEDED
RET NZ ; BAIL OUT ON ERROR
CALL PPPSD_SETBLK ; SETUP THE LBA BLOCK INDEX
; PUT THE SECTOR DATA
LD D,PPP_CMDDSKPUT ; COMMAND = DSKPUT
CALL SENDCMD ; SEND COMMAND
; SEND OVER THE SECTOR CONTENTS
LD BC,512
LD HL,(DIOBUF)
DSKWRITE1:
LD E,(HL)
INC HL
CALL PUTBYTE
DEC BC
LD A,B
OR C
JP NZ,DSKWRITE1
; WRITE THE SECTOR
LD D,PPP_CMDDSKWR ; COMMAND = DSKWR
CALL SENDCMD
CALL PPPSD_SENDBLK ; SEND THE LBA BLOCK NUMBER
CALL GETBYTE
LD A,E
LD (PPPSD_STAT),A ; SAVE STATUS
CALL PPPSD_PRTWRITE ; PRINT DIAGNOSTICS AS NEEDED
OR A ; SET FLAGS
RET ; ALL DONE
;
; REINITIALIZE THE SD CARD
;
PPPSD_INITCARD:
; RESET & STATUS DISK
LD D,PPP_CMDDSKRES ; COMMAND = DSKRESET
CALL SENDCMD
CALL GETBYTE
LD A,E
LD (PPPSD_STAT),A ; SAVE UPDATED STATUS
OR A
RET ; Z/NZ SET, A HAS RESULT CODE
;
; CHECK THE SD CARD, ATTEMPT TO REINITIALIZE IF NEEDED
;
PPPSD_CHKCARD:
LD A,(PPPSD_STAT) ; GET STATUS
OR A ; SET FLAGS
CALL NZ,PPPSD_INITCARD ; INIT CARD IF NOT READY
RET ; RETURN WITH STATUS IN A
;
; SET UP LBA BLOCK INDEX BASED ON HSTTRK AND HSTSEC
; NOTE THAT BYTE ORDER IS LITTLE ENDIAN FOR PROPLELLER!
; SEE MAPPING IN COMMENTS
; NOTE THAT HSTSEC:MSB IS UNUSED
;
PPPSD_SETBLK:
LD HL,PPP_LBA + 3 ; WORK BACKWARDS, START WITH END OF LBA
XOR A ; MSB OF LBA IS ALWAYS ZERO
LD (HL),A ; LBAHI:MSB = 0
DEC HL ; POINT TO NEXT BYTE
LD DE,(HSTTRK) ; DE = HSTTRK
LD (HL),D ; LBAHI:LSB = D = HSTTRK:MSB
DEC HL ; POINT TO NEXT BYTE
LD (HL),E ; LBALO:MSB = E = HSTTRK:LSB
DEC HL ; POINT TO NEXT BYTE
LD A,(HSTSEC) ; A = HSTSEC:LSB
LD (HL),A ; LBALO:LSB = A = HSTSEC:LSB
RET
;
; SEND INDEX OF BLOCK TO READ FROM SD CARD
; 32 BIT VALUE (4 BYTES)
; NOTE THAT BYTES ARE SENT REVERSED, PROPELLER IS LITTLE ENDIAN
;
PPPSD_SENDBLK:
LD HL,PPP_LBA
LD B,4
PPPSD_SENDBLK1:
LD E,(HL)
INC HL
CALL PUTBYTE
DJNZ PPPSD_SENDBLK1
RET
;
; PRINT DIAGNOSTICS AFTER COMMAND EXECUTION
;
PPPSD_PRTREAD:
LD DE,PPPSTR_READ
JR PPPSD_PRT
PPPSD_PRTWRITE:
LD DE,PPPSTR_WRITE
JR PPPSD_PRT
PPPSD_PRT:
OR A
#IF (PPPSDTRACE == 0)
RET
#ELSE
#IF (PPPSDTRACE == 1)
RET Z
#ENDIF
PUSH AF
CALL NEWLINE
LD DE,PPPSTR_PREFIX ; PRINT DRIVER PREFIX
CALL WRITESTR
CALL PC_SPACE
CALL WRITESTR ; PRINT FUNCTION
CALL PPPSD_PRTBLK ; PRINT BLOCK NUMBER
CALL PC_SPACE
LD DE,PPPSTR_ARROW ; PRINT ARROW
CALL WRITESTR
CALL PC_SPACE
POP AF
PUSH AF
CALL PRTHEXBYTE ; PRINT RESULT BYTE
CALL NZ,PPPSD_PRTERR ; PRINT DETAILED ERROR VALUE IF APPROPRIATE
POP AF
RET ; RET WITH A = STATUS
PPPSD_PRTBLK:
CALL PC_SPACE
LD HL,PPP_LBA + 4
LD B,4
PPPSD_PRTBLK1:
DEC HL
LD A,(HL)
CALL PRTHEXBYTE
DJNZ PPPSD_PRTBLK1
RET
PPPSD_PRTERR:
LD D,PPP_CMDDSKSTAT
CALL SENDCMD
LD HL,PPP_DSKSTAT
LD B,4
PPPSD_PRTERR1:
CALL GETBYTE
LD (HL),E
INC HL
DJNZ PPPSD_PRTERR1
CALL PC_LBKT
LD BC,(PPP_DSKSTHI)
CALL PRTHEXWORD
LD BC,(PPP_DSKSTLO)
CALL PRTHEXWORD
CALL PC_RBKT
RET
#ENDIF
;
;==================================================================================================
; PPPSD DISK DRIVER - DATA
;==================================================================================================
;
PPPSD_STAT .DB 0
;
PPP_LBA:
PPP_LBALO .DW 0
PPP_LBAHI .DW 0
PPP_DSKSTAT:
PPP_DSKSTLO .DW 0
PPP_DSKSTHI .DW 0
;
PPPSTR_PREFIX .TEXT "PPPDSK:$"
PPPSTR_CMD .TEXT "CMD=$"
PPPSTR_READ .TEXT "READ$"
PPPSTR_WRITE .TEXT "WRITE$"
;PPPSTR_RC .TEXT "RC=$"
PPPSTR_ARROW .TEXT "-->$"
PPPSTR_ERR .TEXT "ERR=$"
;PPPSTR_RCOK .TEXT "OK$"
;PPPSTR_RCRDYTO .TEXT "READY TIMEOUT$"
;
;==================================================================================================
; GLOBAL PPP DRIVER FUNCTIONS
;==================================================================================================
;
PUTBYTE:
IN A,(PIOC)
BIT 7,A
JR Z,PUTBYTE
LD A,E
OUT (PIOA),A
RET
;
GETBYTE:
IN A,(PIOC)
BIT 5,A
JR Z,GETBYTE
IN A,(PIOA)
LD E,A
RET
;
SENDCMD:
IN A,(PIOA) ; DISCARD ANYTHING PENDING
; WAIT FOR OBF HIGH (OUTPUT BUFFER TO BE EMPTY)
IN A,(PIOC)
BIT 7,A
JR Z,SENDCMD
LD A,00000001B ; SET CMD FLAG
OUT (PIOX),A ; SEND IT
SENDCMD0:
IN A,(PIOC)
BIT 7,A
JR Z,SENDCMD0
LD A,D
OUT (PIOA),A
SENDCMD1:
; WAIT FOR OBF HIGH (BYTE HAS BEEN RECEIVED)
IN A,(PIOC)
BIT 7,A
JR Z,SENDCMD1
; TURN OFF CMD
LD A,00000000B ; CLEAR CMD FLAG
OUT (PIOX),A
RET
;
PPPSTR_TIMEOUT .TEXT "ParPortProp not responding!$"

61
trunk/Source/ppp_data.asm Normal file
View File

@@ -0,0 +1,61 @@
;
;==================================================================================================
; PPPSD DISK DRIVER - DATA
;==================================================================================================
;
PPPSD_SLICETRKS .EQU 65 ; TRACKS PER SLICE
PPPSD_TRKSIZE .EQU 128 ; SIZE OF TRACK (IN KB)
PPPSD_SLICESIZE .EQU ((PPPSD_SLICETRKS * PPPSD_TRKSIZE) + 1023) / 1024 ; SIZE OF EACH SLICE (IN MB)
PPPSD_NUMSLICES .EQU PPPSDCAPACITY / PPPSD_SLICESIZE ; TOTAL SLICES IN DEVICE
PPPSD0_SLICEDEF .EQU 0 ; DEFAULT SLICE FOR UNIT 0
PPPSD1_SLICEDEF .EQU 1 ; DEFAULT SLICE FOR UNIT 1
PPPSD2_SLICEDEF .EQU 2 ; DEFAULT SLICE FOR UNIT 0
PPPSD3_SLICEDEF .EQU 3 ; DEFAULT SLICE FOR UNIT 1
;
.DB DIODEV_PPPSD + 0
PPPSDDPH0 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW PPPSDCSV0,PPPSDALV0
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
PPPSD0_SLICE .DW PPPSD0_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW PPPSD_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_PPPSD + 0
PPPSDDPH1 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW PPPSDCSV1,PPPSDALV1
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
PPPSD1_SLICE .DW PPPSD1_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW PPPSD_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_PPPSD + 0
PPPSDDPH2 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW PPPSDCSV2,PPPSDALV2
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
PPPSD2_SLICE .DW PPPSD2_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW PPPSD_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_PPPSD + 0
PPPSDDPH3 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW PPPSDCSV3,PPPSDALV3
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
PPPSD3_SLICE .DW PPPSD3_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW PPPSD_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
PPPSDCKS .EQU 0 ; CKS: 0 FOR NON-REMOVABLE MEDIA
PPPSDALS .EQU 256 ; ALS: BLKS / 8 = 2048 / 8 = 256 (ROUNDED UP)
;
PPPSDCSV0 .FILL PPPSDCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
PPPSDALV0 .FILL PPPSDALS ; MAX OF 2048 DATA BLOCKS
PPPSDCSV1 .FILL PPPSDCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
PPPSDALV1 .FILL PPPSDALS ; MAX OF 2048 DATA BLOCKS
PPPSDCSV2 .FILL PPPSDCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
PPPSDALV2 .FILL PPPSDALS ; MAX OF 2048 DATA BLOCKS
PPPSDCSV3 .FILL PPPSDCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
PPPSDALV3 .FILL PPPSDALS ; MAX OF 2048 DATA BLOCKS

53
trunk/Source/prefix.asm Normal file
View File

@@ -0,0 +1,53 @@
;----------------------------------------------------------------------------
; PREFIX.ASM
;
; PUT AT THE HEAD OF BOOT.BIN TO XFER TO A FLOPPY DISK
;
;----------------------------------------------------------------------------
; 5/11/2012 dwg - changed offset to BIOS booting fixup location
; 3/ 2/2012 dwg - fixed BOOT_INFO_LOC (moved when jump added for bnksel)
; 2/15/2012 dwg - added origin data written by formatter
; 2/ 5/2012 dwg - added version quad, updates counter, and write protect boolean to metadata
; 1/ 9/2012 wbw - added signature
; 1/ 5/2012 dwg - added version of build generating system image
; 1/ 5/2012 dwg - added drive label to metadata for 1.4
#INCLUDE "std.asm"
BYT .EQU 1 ; used to describe METADATA_SIZE below
WRD .EQU 2
SECTOR_SIZE .EQU 512
BLOCK_SIZE .EQU 128
PREFIX_SIZE .EQU (3 * SECTOR_SIZE) ; 3 SECTORS
METADATA_SIZE .EQU BYT+WRD+(4*BYT)+16+BYT+WRD+WRD+WRD+WRD ; (as defined below)
BOOT_INFO_LOC .EQU CPM_ENT + 04BH
; PTR TO LOCATION TO RECORD BOOT INFO IN MEMORY IMAGE
; FIXUP REQUIRED WHEN BIOS HEADER CHANGES
.ORG 0000H
JP CPM_ENT
;
.FILL ((PREFIX_SIZE - BLOCK_SIZE) - $),00H
PR_SIG .DW 0A55AH ; SIGNATURE GOES HERE
PR_PLATFORM .DB 0
PR_DEVICE .DB 0
PR_FORMATTER .DB 0,0,0,0,0,0,0,0
PR_DRIVE .DB 0
PR_LOG_UNIT .DW 0
;
.FILL ((PREFIX_SIZE - METADATA_SIZE) - $),00H
.DB 0 ; write protect boolean
.DW 0 ; starting update number
.DB RMJ,RMN,RUP,RTP
.DB "Unlabeled Drive ","$"
.DW BOOT_INFO_LOC ; PTR TO LOCATION TO STORE DISKBOOT & BOOTDRIVE (SEE CNFGDATA)
.DW CPM_LOC ; CCP START
.DW CPM_END ; END OF CBIOS
.DW CPM_ENT ; COLD BOOT LOCATION
.END

357
trunk/Source/prp.asm Normal file
View File

@@ -0,0 +1,357 @@
;
;==================================================================================================
; PROPIO DRIVER
;==================================================================================================
;
;
; GLOBAL PARPORTPROP INITIALIZATION
;
PRP_INIT:
CALL PRPSD_INIT ; SD CARD INITIALIZATION
RET
;
;==================================================================================================
; PROPIO CONSOLE DRIVER
;==================================================================================================
;
PRPCON_CMD .EQU $40 ; PROPIO CONSOLE COMMAND PORT (WHEN WRITTEN)
PRPCON_STATUS .EQU $40 ; PROPIO CONSOLE STATUS PORT (WHEN READ)
PRPCON_DATA .EQU $41 ; PROPIO CONSOLE DATA PORT (READ=KBD, WRITE=DISPLAY)
;
PRPCON_BUSY .EQU $80 ; BIT SET WHEN PROPIO CONSOLE INTERFACE IS BUSY
PRPCON_ERR .EQU $40 ; BIT SET WHEN PROPIO CONSOLE ERROR HAS OCCURRED
PRPCON_KBDRDY .EQU $20 ; BIT SET WHEN KEYBOARD BUF HAS A BYTE READY (BUF FULL)
PRPCON_DSPRDY .EQU $10 ; BIT SET WHEN DISPLAY BUF IS READY FOR A BYTE (BUF EMPTY)
;
;
;
PRPCON_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,PRPCON_IN
DEC A
JR Z,PRPCON_OUT
DEC A
JR Z,PRPCON_IST
DEC A
JR Z,PRPCON_OST
CALL PANIC
;
;
;
PRPCON_IN:
CALL PRPCON_IST ; CHECK FOR CHAR PENDING
JR Z,PRPCON_IN ; WAIT FOR IT IF NECESSARY
IN A,(PRPCON_DATA) ; READ THE CHAR FROM PROPIO
LD E,A
RET
;
;
;
PRPCON_IST:
IN A,(PRPCON_STATUS) ; READ LINE STATUS REGISTER
AND PRPCON_KBDRDY | PRPCON_BUSY ; ISOLATE KBDRDY AND BUSY
SUB PRPCON_KBDRDY ; KBD RDY BUT NOT BUSY?
JR Z,PRPCON_IST1 ; YES, GO TO READY LOGIC
JP CIO_IDLE
PRPCON_IST1:
DEC A ; SET A=$FF TO SIGNAL READY
RET ; RETURN
;
;
;
PRPCON_OUT:
CALL PRPCON_OST ; CHECK FOR OUTPUT READY
JR Z,PRPCON_OUT ; WAIT IF NECESSARY
LD A,E ; RECOVER THE CHAR TO WRITE
OUT (PRPCON_DATA),A ; WRITE THE CHAR TO PROPIO
RET
;
PRPCON_OST:
IN A,(PRPCON_STATUS) ; READ LINE STATUS REGISTER
AND PRPCON_DSPRDY | PRPCON_BUSY ; ISOLATE DSPRDY AND BUSY
SUB PRPCON_DSPRDY ; DSP RDY BUT NOT BUSY?
JR Z,PRPCON_OST1 ; YES, GO TO READY LOGIC
JP CIO_IDLE
PRPCON_OST1:
DEC A ; SET A=$FF TO SIGNAL READY
RET ; RETURN
;
;==================================================================================================
; PRPSD DISK DRIVER
;==================================================================================================
;
; IO PORT ADDRESSES
;
PRPSD_DSKCMD .EQU 42H
PRPSD_DSKST .EQU 42H
PRPSD_DSKIO .EQU 43H
;
PRPSD_CMDRESET .EQU 10H
PRPSD_CMDINIT .EQU 20H
PRPSD_CMDREAD .EQU 30H
PRPSD_CMDPREP .EQU 40H
PRPSD_CMDWRITE .EQU 50H
;
PRPSD_STBUSY .EQU 80H
PRPSD_STERR .EQU 40H
PRPSD_STOVR .EQU 20H
PRPSD_STTO .EQU 10H
;
;
;
PRPSD_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F
JR Z,PRPSD_RD
DEC A
JR Z,PRPSD_WR
DEC A
JR Z,PRPSD_ST
DEC A
JR Z,PRPSD_MED
CALL PANIC
;
PRPSD_RD:
JP PRPSD_READ
PRPSD_WR:
JP PRPSD_WRITE
PRPSD_ST:
JP PRPSD_STATUS
PRPSD_MED:
JP PRPSD_MEDIA
;
; PRPSD_MEDIA
;
PRPSD_MEDIA:
; REINITIALIZE THE CARD HERE
CALL PRPSD_INITCARD
LD A,MID_NONE ; ASSUME FAILURE
RET NZ
; ALL IS WELL, RETURN MEDIA IDENTIFIER
LD A,MID_HD ; SET MEDIA ID
RET
;
;
;
PRPSD_INIT:
; MARK DRIVE NOT READY
; HARDWARE INIT DEFERRED UNTIL DRIVE SELECT
XOR A
DEC A
LD (PRPSD_STAT),A
RET
;
;
;
PRPSD_STATUS:
LD A,(PRPSD_STAT) ; GET THE CURRENT READY STATUS
OR A
RET
;
;
;
PRPSD_READ:
CALL PRPSD_CHKCARD ; CHECK / REINIT CARD AS NEEDED
RET NZ ; BAIL OUT ON ERROR
LD A,PRPSD_CMDRESET
CALL PRPSD_SNDCMD
RET NZ ; RETURN ON FAILURE, A = STATUS
CALL PRPSD_SETBLK
LD A,PRPSD_CMDREAD
CALL PRPSD_SNDCMD
RET NZ ; RETURN ON FAILURE, A = STATUS
LD C,PRPSD_DSKIO
LD B,0
LD HL,(DIOBUF)
INIR
INIR
OR A ; SET FLAGS
RET ; RETURN WITH A = STATUS
;
;
;
PRPSD_WRITE:
CALL PRPSD_CHKCARD ; CHECK / REINIT CARD AS NEEDED
RET NZ ; BAIL OUT ON ERROR
LD A,PRPSD_CMDRESET
CALL PRPSD_SNDCMD
RET NZ ; RETURN ON FAILURE, A = STATUS
CALL PRPSD_SETBLK
LD A,PRPSD_CMDPREP
CALL PRPSD_SNDCMD
RET NZ ; RETURN ON FAILURE, A = STATUS
LD C,PRPSD_DSKIO
LD B,0
LD HL,(DIOBUF)
OTIR
OTIR
LD A,PRPSD_CMDWRITE
CALL PRPSD_SNDCMD
RET NZ ; RETURN ON FAILURE, A = STATUS
OR A ; SET FLAGS
RET ; RETURN WITH A = STATUS
;
;
;
PRPSD_SNDCMD:
LD (PRPSD_CMD),A
OUT (PRPSD_DSKCMD),A
NOP ; SETTLE
NOP ; SETTLE
LD BC,0
PRPSD_SNDCMD1:
IN A,(PRPSD_DSKST)
BIT 7,A
JR Z,PRPSD_SNDCMD2 ; RET WITH A = STATUS
LD E,A ; SAVE STATUS
CALL DELAY
DEC BC
LD A,B
OR C
JR NZ,PRPSD_SNDCMD1
LD A,E ; RECOVER STATUS
OR PRPSD_STTO ; SET TIMEOUT BIT
PRPSD_SNDCMD2:
LD (PRPSD_STAT),A
JR PRPSD_PRT ; RET WITH A = STATUS
;
;
;
PRPSD_INITCARD:
; RESET INTERFACE, RETURN WITH NZ ON FAILURE
LD A,PRPSD_CMDRESET
CALL PRPSD_SNDCMD
RET NZ ; NZ SET, A HAS ERROR CODE
; REQUEST HARDWARE INIT, RESULT IN A, Z/NZ SET
LD A,PRPSD_CMDINIT
CALL PRPSD_SNDCMD
RET ; Z/NZ SET, A HAS RESULT CODE
;
; CHECK THE SD CARD, ATTEMPT TO REINITIALIZE IF NEEDED
;
PRPSD_CHKCARD:
LD A,(PRPSD_STAT) ; GET STATUS
OR A ; SET FLAGS
CALL NZ,PRPSD_INITCARD ; INIT CARD IF NOT READY
RET ; RETURN WITH STATUS IN A
;
; SEND INDEX OF BLOCK TO READ FROM SD CARD
; 32 BIT VALUE (4 BYTES)
; NOTE THAT BYTES ARE SENT REVERSED, PROPELLER IS LITTLE ENDIAN
;
PRPSD_SETBLK:
LD DE,PRPSD_BLK + 3
LD A,(HSTSEC) ; A = LSB OF OS SECTOR
CALL PRPSD_SETBLK1
LD HL,(HSTTRK) ; GET OS TRACK VALUE
LD A,L ; EXTRACT LSB
CALL PRPSD_SETBLK1
LD A,H ; EXTRACT MSB
CALL PRPSD_SETBLK1
XOR A ; A = 0, NOT USED
CALL PRPSD_SETBLK1
RET
PRPSD_SETBLK1:
OUT (PRPSD_DSKIO),A ; SEND IT
LD (DE),A
DEC DE
RET
PRPSD_PRT:
BIT 6,A
#IF (PRPSDTRACE == 0)
RET
#ELSE
#IF (PRPSDTRACE == 1)
RET Z
#ENDIF
PUSH AF
CALL NEWLINE
CALL PC_LBKT
CALL PRTHEXWORD
CALL PC_RBKT
CALL PC_SPACE
LD DE,PRPSTR_PREFIX
CALL WRITESTR
CALL PC_SPACE
LD DE,PRPSTR_CMD
CALL WRITESTR
LD A,(PRPSD_CMD)
CALL PRTHEXBYTE
CP PRPSD_CMDREAD
CALL Z,PRPSD_PRTBLK
CP PRPSD_CMDWRITE
CALL Z,PRPSD_PRTBLK
CALL PC_SPACE
LD DE,PRPSTR_ARROW
CALL WRITESTR
CALL PC_SPACE
POP AF
PUSH AF
CALL PRTHEXBYTE
BIT 6,A
CALL NZ,PRPSD_PRTERR
POP AF
RET ; RET WITH A = STATUS
PRPSD_PRTBLK:
CALL PC_SPACE
LD HL,PRPSD_BLK
LD B,4
PRPSD_PRTBLK1:
LD A,(HL)
CALL PRTHEXBYTE
INC HL
DJNZ PRPSD_PRTBLK1
RET
PRPSD_PRTERR:
LD B,4
PRPSD_PRTERR1:
IN A,(PRPSD_DSKIO)
PUSH AF
DJNZ PRPSD_PRTERR1
CALL PC_SPACE
LD DE,PRPSTR_ERR
CALL WRITESTR
LD B,4
PRPSD_PRTERR2:
POP AF
CALL PRTHEXBYTE
DJNZ PRPSD_PRTERR2
RET
#ENDIF
;
;
;
PRPSTR_PREFIX .TEXT "PRPDSK:$"
PRPSTR_CMD .TEXT "CMD=$"
;PRPSTR_RC .TEXT "RC=$"
PRPSTR_ARROW .TEXT "-->$"
PRPSTR_ERR .TEXT "ERR=$"
;PRPSTR_RCOK .TEXT "OK$"
;PRPSTR_RCRDYTO .TEXT "READY TIMEOUT$"
;
;==================================================================================================
; PRPSD DISK DRIVER - DATA
;==================================================================================================
;
PRPSD_STAT .DB 0
;
PRPSD_CMD .DB 0
PRPSD_BLK .DB 0, 0, 0, 0

61
trunk/Source/prp_data.asm Normal file
View File

@@ -0,0 +1,61 @@
;
;==================================================================================================
; PRPSD DISK DRIVER - DATA
;==================================================================================================
;
PRPSD_SLICETRKS .EQU 65 ; TRACKS PER SLICE
PRPSD_TRKSIZE .EQU 128 ; SIZE OF TRACK (IN KB)
PRPSD_SLICESIZE .EQU ((PRPSD_SLICETRKS * PRPSD_TRKSIZE) + 1023) / 1024 ; SIZE OF EACH SLICE (IN MB)
PRPSD_NUMSLICES .EQU PRPSDCAPACITY / PRPSD_SLICESIZE ; TOTAL SLICES IN DEVICE
PRPSD0_SLICEDEF .EQU 0 ; DEFAULT SLICE FOR UNIT 0
PRPSD1_SLICEDEF .EQU 1 ; DEFAULT SLICE FOR UNIT 1
PRPSD2_SLICEDEF .EQU 2 ; DEFAULT SLICE FOR UNIT 0
PRPSD3_SLICEDEF .EQU 3 ; DEFAULT SLICE FOR UNIT 1
;
.DB DIODEV_PRPSD + 0
PRPSDDPH0 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW PRPSDCSV0,PRPSDALV0
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
PRPSD0_SLICE .DW PRPSD0_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW PRPSD_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_PRPSD + 0
PRPSDDPH1 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW PRPSDCSV1,PRPSDALV1
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
PRPSD1_SLICE .DW PRPSD1_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW PRPSD_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_PRPSD + 0
PRPSDDPH2 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW PRPSDCSV2,PRPSDALV2
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
PRPSD2_SLICE .DW PRPSD2_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW PRPSD_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_PRPSD + 0
PRPSDDPH3 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW PRPSDCSV3,PRPSDALV3
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
PRPSD3_SLICE .DW PRPSD3_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW PRPSD_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
PRPSDCKS .EQU 0 ; CKS: 0 FOR NON-REMOVABLE MEDIA
PRPSDALS .EQU 256 ; ALS: BLKS / 8 = 2048 / 8 = 256 (ROUNDED UP)
;
PRPSDCSV0 .FILL PRPSDCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
PRPSDALV0 .FILL PRPSDALS ; MAX OF 2048 DATA BLOCKS
PRPSDCSV1 .FILL PRPSDCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
PRPSDALV1 .FILL PRPSDALS ; MAX OF 2048 DATA BLOCKS
PRPSDCSV2 .FILL PRPSDCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
PRPSDALV2 .FILL PRPSDALS ; MAX OF 2048 DATA BLOCKS
PRPSDCSV3 .FILL PRPSDCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
PRPSDALV3 .FILL PRPSDALS ; MAX OF 2048 DATA BLOCKS

8
trunk/Source/romfill.asm Normal file
View File

@@ -0,0 +1,8 @@
;
;==================================================================================================
; FILLER FOR ROM PAGE 0 (SEE BANKEDBIOS.TXT)
;==================================================================================================
;
.FILL 3000H
;
.END

957
trunk/Source/sd.asm Normal file
View File

@@ -0,0 +1,957 @@
;
;=============================================================================
; SD DISK DRIVER
;=============================================================================
;
; - CATER FOR THE VARIOUS SDCARD HARDWARE VERSIONS
; CSIO IS FOR N8-2312 PRODUCTION BOARDS AND MODIFIED N8-2511 PROTOTYPE BOARDS
; RTC IS FOR UNMODIFIED N8-2511 BOARDS AND N8VEM/ZETA USING JUHA MINI-BOARDS
; PPISD IS FOR A PPISD MINI-BOARD CONNECTED TO 26-PIN PPI HEADER
; - MAKE RTC A PSEUDO-REGISTER FOR NON-CSIO
; - PERFORM BOOT INITIALIZATION OF RTC SOMEWHERE ELSE???
; - PUT RELEVANT RTC BITS TO A KNOWN STATE AT ALL I/O ENTRY POINTS
;
; CONTROL BITS
;
#IF (PLATFORM==PLT_N8)
SD_CS .EQU $04 ; RTC BIT 2, SD CARD SELECT (ACTIVE HI)
#IF (!SDCSIO)
SD_CLK .EQU $02 ; RTC BIT 1, SD CLOCK
SD_DOUT .EQU $01 ; RTC BIT 0, SD DATA OUT
SD_DIN .EQU $40 ; RTC BIT 6, SD DATA IN
#ENDIF
#ELSE
#IF (PPISD)
SD_CS .EQU $10 ; PC4, SD CARD SELECT (ACTIVE LO)
SD_CLK .EQU $02 ; PC1, SD CLOCK
SD_DOUT .EQU $01 ; PC0, SD DATA OUT
SD_DIN .EQU $80 ; PB7, SD DATA IN
#ELSE
SD_CS .EQU $04 ; RTC BIT 2, SD CARD SELECT (ACTIVE HI)
SD_CLK .EQU $40 ; RTC BIT 6, SD CLOCK
SD_DOUT .EQU $80 ; RTC BIT 7, DATA OUT TO SD-CARD
SD_DIN .EQU $40 ; RTC BIT 6, DATA IN FROM SD-CARD
#ENDIF
#ENDIF
;#IF (!SDCSIO)
;#IF (PLATFORM = PLT_N8)
;SD_CS .EQU $04 ; RTC BIT 2, SD CARD SELECT
;SD_CLK .EQU $02 ; RTC BIT 1, SD CLOCK
;SD_DOUT .EQU $01 ; RTC BIT 0, SD DATA OUT
;SD_DIN .EQU $40 ; RTC BIT 6, SD DATA IN
;#ELSE ; Zeta or Z80-SBC MK II
;SD_CS .EQU $04 ; RTC BIT 2, SD CARD SELECT
;SD_CLK .EQU $40 ; RTC BIT 6, SD CLOCK
;SD_DOUT .EQU $80 ; RTC BIT 7, DATA OUT TO SD-CARD
;SD_DIN .EQU $40 ; RTC BIT 6, DATA IN FROM SD-CARD
;#ENDIF
;#ENDIF
;
; SD CARD COMMANDS
;
SD_CMD0 .EQU $40 | 0 ; GO_IDLE_STATE
SD_CMD1 .EQU $40 | 1 ; SEND_OP_COND
SD_CMD8 .EQU $40 | 8 ; SEND_IF_COND
SD_CMD9 .EQU $40 | 9 ; SEND_CSD
SD_CMD10 .EQU $40 | 10 ; SEND_CID
SD_CMD16 .EQU $40 | 16 ; SET_BLOCKLEN
SD_CMD17 .EQU $40 | 17 ; READ_SINGLE_BLOCK
SD_CMD24 .EQU $40 | 24 ; WRITE_BLOCK
SD_CMD55 .EQU $40 | 55 ; APP_CMD
SD_CMD58 .EQU $40 | 58 ; READ_OCR
; SD APPLICATION SPECIFIC COMMANDS
SD_ACMD41 .EQU $40 | 41 ; SD_APP_OP_COND
;
; SD CARD TYPE
;
SD_TYPEUNK .EQU 0
SD_TYPEMMC .EQU 1
SD_TYPESDSC .EQU 2
SD_TYPESDHC .EQU 3
;
;
;
SD_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F
JR Z,SD_READ
DEC A
JR Z,SD_WRITE
DEC A
JR Z,SD_STATUS
DEC A
JR Z,SD_MEDIA
CALL PANIC
;
;
;
SD_MEDIA:
; INITIALIZE THE SD CARD TO ACCOMMODATE HOT SWAPPING
CALL SD_INITCARD
LD A,MID_NONE ; ASSUME FAILURE
RET NZ ; INIT FAILED, RETURN WITH HL=0
; SET READY AND RETURN
XOR A
LD (SD_STAT),A ; SD_STAT = 0 = OK
LD A,MID_HD
RET
;
SD_INIT:
LD A,20H ; PUT RTC LATCH TO IDLE
OUT (RTC),A
#IF (PPISD)
LD A,82H ; PPI PORT A=OUT, B=IN, C=OUT
OUT (PIOX),A
LD A,30H ; PC4,5 /CS HIGH
OUT (PIOC),A
#ENDIF
XOR A
DEC A
LD (SD_STAT),A
RET
;
SD_STATUS:
LD A,(SD_STAT)
OR A
RET
;
SD_READ:
JP SD_RDSEC
;
SD_WRITE:
JP SD_WRSEC
;
;=============================================================================
; SD INTERFACE ROUTINES
;=============================================================================
;
; SD_SENDCLKS: A=RTC MASK, B=# OF CLK TRANSITIONS
; For bit bang versions B is number of transitions
; For PPISD B is number of bits
; For CSIO B is number of bytes
SD_SENDCLKS:
#IF (!SDCSIO)
#IF (PPISD)
LD A,03 ;PC1=1, TOGGLE CLOCK
OUT (PIOX),A
NOP
LD A,02 ;PC1=0, RESET CLOCK
OUT (PIOX),A
#ELSE
OUT (RTC),A
XOR SD_CLK ; TOGGLE CLOCK BIT
#ENDIF
DJNZ SD_SENDCLKS
RET
#ELSE
SD_SENDCLKS1:
CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING
LD A,0FFH
OUT0 (CPU_TRDR),A ; put byte in buffer
IN0 A,(CPU_CNTR)
SET 4,A ; set transmit enable
OUT0 (CPU_CNTR),A
DJNZ SD_SENDCLKS
RET
SD_WAITTX: ; WAIT FOR TX EMPTY
IN0 A,(CPU_CNTR) ; get CSIO status
BIT 4,A ; Tx empty?
JR NZ,SD_WAITTX
RET
SD_WAITRX:
IN0 A,(CPU_CNTR) ; wait for receiver to finish
BIT 5,A
JR NZ,SD_WAITRX
RET
#ENDIF
;
; COMPLETE A TRANSACTION - PRESERVE AF
;
SD_DONE:
PUSH AF
#IF (!SDCSIO)
#IF (PPISD)
LD A,30H
OUT (PIOC),A ;PC4=1 /CS INACTIVE
LD B,16
#ELSE
XOR A
LD B,17
#ENDIF
CALL SD_SENDCLKS
#ELSE
CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING
IN A,(RTC)
AND ~SD_CS ; CLEAR CS
OUT (RTC),A
LD B,2
CALL SD_SENDCLKS
#ENDIF
POP AF
RET
;
; SEND ONE BYTE
;
SD_PUT:
#IF (PPISD)
; CALL PRTHEXBYTE ; *DEBUG*
LD C,A ; C=BYTE TO SEND
LD B,8 ; SEND 8 BITS (LOOP 8 TIMES)
LD A,08H ;PC4=0, /CS ACTIVE
OUT (PIOX),A
SD_PUT1:
RL C ;ROTATE NEXT BIT FROM C INTO CF
LD A,01 ;PC0=1, DATA OUT=1
JR C,SD_PUT2
LD A,00 ;PC0=0, DATA OUT =0
SD_PUT2:
OUT (PIOX),A ;SEND DATA OUT
LD A,03 ;PC1=1, TOGGLE CLOCK
OUT (PIOX),A
LD A,02 ;PC1=0, RESET CLOCK
OUT (PIOX),A
DJNZ SD_PUT1 ;REPEAT FOR ALL 8 BITS
RET
#ELSE
#IF (!SDCSIO)
; CALL PRTHEXBYTE ; *DEBUG*
LD C,A ; C=BYTE TO SEND
LD B,8 ; SEND 8 BITS (LOOP 8 TIMES)
SD_PUT1:
#IF (PLATFORM=PLT_N8)
LD A,2 ; SD_CS >> 1 (SD_CS WILL BE SET AFTER ROTATE)
RL C ; ROTATE NEXT BIT FROM C INTO CF
RLA ; ROTATE CF INTO A:0, SD_DOUT is RTC:0
#ELSE
LD A,8 ; SD_CS WILL BE IN BIT2 AFTER ROTATE
RL C ; ROTATE NEXT BIT FROM C INTO CF
RRA ; ROTATE CARRY INTO A:7, SD_DOUT is RTC:7
#ENDIF
OUT (RTC),A ; CLOCK LOW (ABOUT TO SEND BIT)
OR SD_CLK ; SET CLOCK BIT
OUT (RTC),A ; CLOCK HIGH (SEND BIT)
DJNZ SD_PUT1 ; REPEAT FOR ALL 8 BITS
AND ~SD_CLK ; RESET CLOCK
OUT (RTC),A ; LEAVE WITH CLOCK LOW
RET
#ELSE
CALL MIRROR ; MSB<-->LSB mirror bits, result in C
CALL SD_WAITRX ; MAKE SURE WE ARE DONE SENDING
OUT0 (CPU_TRDR),C ; put byte in buffer
IN0 A,(CPU_CNTR)
SET 4,A ; set transmit enable
OUT0 (CPU_CNTR),A
RET ; let it do the rest
#ENDIF
#ENDIF
;
; RECEIVE ONE BYTE
;
SD_GET:
#IF (PPISD)
LD B,8 ; RECEIVE 8 BITS (LOOP 8 TIMES)
SD_GET1:
IN A,(PIOB) ; GET BIT FROM SD-CARD
RLA ; ROTATE PB7 INTO CARRY
RL C ; ROTATE CARRY INTO C
LD A,03 ; PC1=1, TOGGLE CLOCK
OUT (PIOX),A
LD A,02 ; PC1=0, RESET CLOCK
OUT (PIOX),A
DJNZ SD_GET1 ; REPEAT FOR ALL 8 BITS
LD A,C ; GET BYTE RECEIVED INTO A
; CALL PRTHEXBYTE ; *DEBUG*
RET
#ELSE
#IF (!SDCSIO)
LD B,8 ; RECEIVE 8 BITS (LOOP 8 TIMES)
SD_GET1:
IN A,(RTC) ; GET RTC BITS
RLA ; ROTATE RTC:6 (SD_IN) INTO CF
RLA
RL C ; ROTATE CF INTO C:0
LD A,SD_CS | SD_DOUT | SD_CLK
OUT (RTC),A ; CLOCK HIGH (ACK BIT RECEIVED)
AND ~SD_CLK ; RESET CLOCK BIT
OUT (RTC),A ; CLOCK LOW (READY FOR NEXT BIT)
DJNZ SD_GET1 ; REPEAT FOR ALL 8 BITS
LD A,C ; GET BYTE RECEIVED INTO A
; CALL PRTHEXBYTE ; *DEBUG*
RET
#ELSE
CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING
IN0 A,(CPU_CNTR) ; get CSIO status
SET 5,A ; start receiver
OUT0 (CPU_CNTR),A
CALL SD_WAITRX
IN0 A,(CPU_TRDR) ; get received byte
CALL MIRROR ; MSB<-->LSB mirror bits
LD A,C ; keep result
RET
#ENDIF
#ENDIF
#IF (SDCSIO)
MIRROR: ; MSB<-->LSB mirror bits in A, result in C
#IF (!SDCSIOFAST) ; slow speed, least code space
LD B,8 ; bit counter
MIRROR1:
RLA ; rotate bit 7 into carry
RR C ; rotate carry into result
DJNZ MIRROR1 ; do all 8 bits
RET
#ELSE ; fastest but uses most code space
LD BC,MIRTAB ; 256 byte mirror table
ADD A,C ; add offset
LD C,A
JR NC,MIRROR2
INC B
MIRROR2:
LD A,(BC) ; get result
LD C,A ; return result in C
RET
#ENDIF
#ENDIF
;
; SELECT CARD AND WAIT FOR IT TO BE READY ($FF)
;
SD_WAITRDY:
#IF (PPISD)
LD A,21H ;/CS ACTIVE (PC4), DOUT=1 (PC0)
OUT (PIOC),A
#ELSE
IN A,(RTC)
#IF (!SDCSIO)
OR SD_CS | SD_DOUT ; SET SD_CS (CHIP SELECT)
#ELSE
CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING
OR SD_CS ; SET SD_CS (CHIP SELECT)
#ENDIF
OUT (RTC),A
#ENDIF
LD DE,0 ; LOOP MAX (TIMEOUT)
SD_WAITRDY1:
; CALL PC_SPACE ; *DEBUG*
CALL SD_GET
; CALL PRTHEXBYTE ; *DEBUG*
; XOR A ; *DEBUG* TO SIMULATE READY TIMEOUT
INC A ; $FF -> $00
RET Z ; IF READY, RETURN
DEC DE
LD A,D
OR E
JR NZ,SD_WAITRDY1 ; KEEP TRYING UNTIL TIMEOUT
LD A,$FF ; SIGNAL TIMEOUT ERROR
OR A ; SET FLAGS
RET ; TIMEOUT
;
; SD_GETDATA
;
SD_GETDATA:
PUSH BC ; SAVE LENGTH TO RECEIVE
LD DE,$7FFF ; LOOP MAX (TIMEOUT)
SD_GETDATA1:
CALL SD_GET
CP $FF ; WANT BYTE != $FF
JR NZ,SD_GETDATA2 ; NOT $FF, MOVE ON
DEC DE
BIT 7,D
JR Z,SD_GETDATA1 ; KEEP TRYING UNTIL TIMEOUT
SD_GETDATA2:
LD (SD_TOK),A
POP DE ; RESTORE LENGTH TO RECEIVE
CP $FE ; PACKET START?
JR NZ,SD_GETDATA4 ; NOPE, ABORT, A HAS ERROR CODE
LD HL,(DIOBUF) ; RECEIVE BUFFER
SD_GETDATA3:
CALL SD_GET ; GET NEXT BYTE
LD (HL),A ; SAVE IT
INC HL
DEC DE
LD A,D
OR E
JR NZ,SD_GETDATA3 ; LOOP FOR ALL BYTES
CALL SD_GET ; DISCARD CRC BYTE 1
CALL SD_GET ; DISCARD CRC BYTE 2
XOR A ; RESULT IS ZERO
SD_GETDATA4:
RET
;
; SD_PUTDATA
;
SD_PUTDATA:
PUSH BC ; SAVE LENGTH TO SEND
LD A,$FE ; PACKET START
CALL SD_PUT ; SEND IT
POP DE ; RESTORE LENGTH TO SEND
LD HL,(DIOBUF) ; RECEIVE BUFFER
SD_PUTDATA1:
LD A,(HL) ; GET NEXT BYTE TO SEND
CALL SD_PUT ; SEND IF
INC HL
DEC DE
LD A,D
OR E
JR NZ,SD_PUTDATA1 ; LOOP FOR ALL BYTES
LD A,$FF ; DUMMY CRC BYTE
CALL SD_PUT
LD A,$FF ; DUMMY CRC BYTE
CALL SD_PUT
LD DE,$7FFF ; LOOP MAX (TIMEOUT)
SD_PUTDATA2:
CALL SD_GET
CP $FF ; WANT BYTE != $FF
JR NZ,SD_PUTDATA3 ; NOT $FF, MOVE ON
DEC DE
BIT 7,D
JR Z,SD_PUTDATA2 ; KEEP TRYING UNTIL TIMEOUT
SD_PUTDATA3:
AND $1F
LD (SD_TOK),A
CP $05
RET NZ
XOR A
RET
;
; SETUP COMMAND BUFFER
;
SD_SETCMD0: ; NO PARMS
LD HL,SD_CMDBUF
LD (HL),A
INC HL
XOR A
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
INC HL
LD A,$FF
LD (HL),A
RET
;
SD_SETCMDP: ; W/ PARMS IN BC & DE
CALL SD_SETCMD0
LD HL,SD_CMDP0
LD (HL),B
INC HL
LD (HL),C
INC HL
LD (HL),D
INC HL
LD (HL),E
RET
;
; EXECUTE A SD CARD COMMAND
;
SD_EXEC:
XOR A
LD (SD_RC),A
LD (SD_TOK),A
LD HL,SD_CMDBUF
LD E,6 ; COMMANDS ARE 6 BYTES
SD_EXEC1:
#IF (SDCSIO)
CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING
IN A,(RTC)
OR SD_CS ; SET CS
OUT (RTC),A
#ENDIF
LD A,(HL)
CALL SD_PUT
INC HL
DEC E
JR NZ,SD_EXEC1
LD DE,$100 ; LOOP MAX (TIMEOUT)
SD_EXEC2:
CALL SD_GET
OR A ; SET FLAGS
JP P,SD_EXEC3 ; IF HIGH BIT IS 0, WE HAVE RESULT
DEC DE
BIT 7,D
JR Z,SD_EXEC2
SD_EXEC3:
LD (SD_RC),A
#IF (SDTRACE >= 2)
CALL SD_PRTTRN
#ENDIF
#IF (DSKYENABLE)
CALL SD_DSKY
#ENDIF
RET
;
SD_EXECCMD0: ; EXEC COMMAND, NO PARMS
CALL SD_SETCMD0
JR SD_EXEC
;
SD_EXECCMDP: ; EXEC CMD W/ PARMS IN BC/DE
CALL SD_SETCMDP
JR SD_EXEC
;
; PUT CARD IN IDLE STATE
;
SD_GOIDLE:
; SMALL DELAY HERE HELPS SOME CARDS
LD DE,200 ; 5 MILISECONDS
CALL VDELAY
; PUT CARD IN IDLE STATE
LD A,SD_CMD0 ; CMD0 = ENTER IDLE STATE
CALL SD_SETCMD0
LD A,$95
LD (SD_CMDBUF+5),A ; SET CRC=$95
CALL SD_EXEC ; EXEC CMD
CP $01 ; IN IDLE STATE?
CALL SD_DONE
RET
;
; INIT CARD
;
SD_INITCARD:
#IF (PPISD)
LD A,82H ; PPI PORT A=OUT, B=IN, C=OUT
OUT (PIOX),A
LD A,30H ; PC4,5 /CS HIGH
OUT (PIOC),A
#ENDIF
LD A,20H ; PUT RTC LATCH TO IDLE
OUT (RTC),A
#IF (SDCSIO)
; CSIO SETUP
; LD A,02 ; 18MHz/20 <= 400kHz
LD A,06 ; ???
OUT0 (CPU_CNTR),A
#ENDIF
CALL SD_DONE ; SEEMS TO HELP SOME CARDS...
#IF (!SDCSIO)
#IF (PPISD)
LD A,21H ; /CS=0, DOUT=1, CLK=0
OUT (PIOC),A
LD B,07FH ; 127 CLOCKS (255 TRANSITIONS STARTING WITH LO)
#ELSE
LD A,SD_CS | SD_DOUT ; CS=HI, DOUT=HI
LD B,0FFH ; 127 CLOCKS (255 TRANSITIONS STARTING WITH LO)
#ENDIF
#ELSE
CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING
IN A,(RTC)
OR SD_CS ; SET CS
OUT (RTC),A
LD B,16
#ENDIF
CALL SD_SENDCLKS ; INIT DELAY + GO SPI MODE
; WAIT FOR CARD TO BE READY FOR A COMMAND
CALL SD_WAITRDY
JP NZ,SD_ERRRDYTO
; PUT CARD IN IDLE STATE
CALL SD_GOIDLE
CALL NZ,SD_GOIDLE ; SOME CARDS REQUIRE A SECOND ATTEMPT
JP NZ,SD_ERRCMD ; GIVE UP
SD_INITCARD00:
LD A,SD_TYPESDSC ; ASSUME SDSC CARD TYPE
LD (SD_TYPE),A ; SAVE IT
; CMD8 IS REQUIRED FOR V2 CARDS. FAILURE HERE IS OK AND
; JUST MEANS THAT IT IS A V1.X CARD
LD A,SD_CMD8
LD BC,0
LD D,1 ; VHS=1, 2.7-3.6V
LD E,$AA ; CHECK PATTERN
CALL SD_SETCMDP
LD A,$87
LD (SD_CMDBUF+5),A ; SET CRC=$87
CALL SD_EXEC ; EXEC CMD
AND ~$01
JR NZ,SD_INITCARD0
; CMD8 WORKED, SO THIS IS V2 CARD
; NEED TO CONSUME EXTRA CMD8 RESPONSE BYTES (4)
CALL SD_GET
CALL SD_GET
CALL SD_GET
CALL SD_GET
SD_INITCARD0:
CALL SD_DONE
LD B,0 ; LOOP LIMIT (TIMEOUT)
SD_INITCARD1:
; CALL SD_APP_OP_COND UNTIL CARD IS READY (NOT IDLE)
LD DE,200 ; 5 MILLISECONDS
CALL VDELAY
LD A,SD_CMD55 ; APP CMD IS NEXT
PUSH BC
CALL SD_EXECCMD0
POP BC
AND ~$01 ; ONLY 0 (OK) OR 1 (IDLE) ARE OK
CALL SD_DONE
JP NZ,SD_ERRCMD
LD A,SD_ACMD41 ; SD_APP_OP_COND
PUSH BC
LD BC,$4000 ; INDICATE WE SUPPORT HC
LD DE,$0000
CALL SD_EXECCMDP
POP BC
PUSH AF
AND ~$01
CALL SD_DONE
POP AF
; LD A,$01 ; *DEBUG* TO SIMULATE INIT TIMEOUT ERROR
CP $00 ; INIT DONE?
JR Z,SD_INITCARD2 ; YUP, MOVE ON
CP $01 ; IDLE?
JP NZ,SD_ERRCMD ; NOPE, MUST BE CMD ERROR, ABORT
DJNZ SD_INITCARD1 ; KEEP CHECKING
LD A,$FF ; SIGNAL TIMEOUT
OR A
JP SD_ERRINITTO
SD_INITCARD2:
; CMD58 RETURNS THE 32 BIT OCR REGISTER, WE WANT TO CHECK
; BIT 30, IF SET THIS IS SDHC/XC CARD
LD A,SD_CMD58
CALL SD_EXECCMD0
CALL NZ,SD_DONE
JP NZ,SD_ERRCMD
; CMD58 WORKED, GET OCR DATA AND SET CARD TYPE
CALL SD_GET ; BITS 31-24
AND $40 ; ISOLATE BIT 30 (CCS)
JR Z,SD_INITCARD21 ; NOT HC/XC, BYPASS
LD A,SD_TYPESDHC ; CARD TYPE = SDHC
LD (SD_TYPE),A ; SAVE IT
SD_INITCARD21:
CALL SD_GET ; BITS 23-16, DISCARD
CALL SD_GET ; BITS 15-8, DISCARD
CALL SD_GET ; BITS 7-0, DISCARD
CALL SD_DONE
; SET OUR DESIRED BLOCK LENGTH (512 BYTES)
LD A,SD_CMD16 ; SET_BLOCK_LEN
LD BC,0
LD DE,512
CALL SD_EXECCMDP
CALL SD_DONE
JP NZ,SD_ERRCMD
#IF (SDTRACE >= 2)
CALL NEWLINE
LD DE,SDSTR_SDTYPE
CALL WRITESTR
LD A,(SD_TYPE)
CALL PRTHEXBYTE
#ENDIF
; RET NZ ; IF ERROR, ABORT NOW WITH A SET CORRECTLY
#IF (SDCSIO)
CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING
XOR A ; NOW SET CSIO PORT TO FULL SPEED
OUT (CPU_CNTR),A
#ENDIF
XOR A ; A = 0 (STATUS = OK)
LD (SD_STAT),A ; SAVE IT
RET ; RETURN WITH A=0, AND Z SET
;;
;; GET AND PRINT CSD, CID
;;
;SD_CARDINFO:
; LD A,SD_CMD9 ; SEND_CSD
; CALL SD_EXECCMD0
; CALL SD_DONE
; JP NZ,SD_ERRCMD ; ABORT IF PROBLEM
; LD BC,16 ; 16 BYTES OF CSD
; CALL SD_GETDATA
; CALL SD_DONE
;
; LD DE,SDSTR_CSD
; CALL WRITESTR
; LD DE,SECBUF
; LD A,16
; CALL PRTHEXBUF
;
; LD A,SD_CMD10 ; SEND_CID
; CALL SD_EXECCMD0
; CALL SD_DONE
; JP NZ,SD_ERRCMD ; ABORT IF PROBLEM
; LD BC,16 ; 16 BYTES OF CID
; CALL SD_GETDATA
; CALL SD_DONE
;
; LD DE,SDSTR_CID
; CALL WRITESTR
; LD DE,SECBUF
; LD A,16
; CALL PRTHEXBUF
;
; RET
;
; READ ONE SECTOR
;
;
; CHECK THE SD CARD, ATTEMPT TO REINITIALIZE IF NEEDED
;
SD_CHKCARD:
LD A,(SD_STAT) ; GET STATUS
OR A ; SET FLAGS
CALL NZ,SD_INITCARD ; INIT CARD IF NOT READY
RET ; RETURN WITH STATUS IN A
SD_RDSEC:
CALL SD_CHKCARD ; CHECK / REINIT CARD AS NEEDED
RET NZ
CALL SD_WAITRDY ; WAIT FOR CARD TO BE READY FOR A COMMAND
JP NZ,SD_ERRRDYTO ; HANDLE NOT READY TIMEOUT ERROR
CALL SD_SETADDR ; SETUP BLOCK ADDRESS
LD A,SD_CMD17 ; READ_SINGLE_BLOCK
CALL SD_EXECCMDP ; EXEC CMD WITH BLOCK ADDRESS AS PARM
CALL NZ,SD_DONE ; TRANSACTION DONE IF ERROR OCCURRED
JP NZ,SD_ERRCMD ; ABORT ON ERROR
LD BC,512 ; LENGTH TO READ
CALL SD_GETDATA ; GET THE BLOCK
CALL SD_DONE
JP NZ,SD_ERRDATA ; DATA XFER ERROR
RET
;
; WRITE ONE SECTOR
;
SD_WRSEC:
CALL SD_CHKCARD ; CHECK / REINIT CARD AS NEEDED
RET NZ
CALL SD_WAITRDY ; WAIT FOR CARD TO BE READY FOR A COMMAND
JP NZ,SD_ERRRDYTO ; HANDLE NOT READY TIMEOUT ERROR
CALL SD_SETADDR ; SETUP BLOCK ADDRESS
LD A,SD_CMD24 ; WRITE_BLOCK
CALL SD_EXECCMDP ; EXEC CMD WITH BLOCK ADDRESS AS PARM
CALL NZ,SD_DONE ; TRANSACTION DONE IF ERROR OCCURRED
JP NZ,SD_ERRCMD ; ABORT ON ERROR
LD BC,512 ; LENGTH TO WRITE
CALL SD_PUTDATA ; PUT THE BLOCK
CALL SD_DONE
JP NZ,SD_ERRDATA ; DATA XFER ERROR
RET
;
;
;
SD_SETADDR:
LD A,(SD_TYPE)
CP SD_TYPESDSC
JR Z,SD_SETADDRSDSC
CP SD_TYPESDHC
JR Z,SD_SETADDRSDHC
CALL PANIC
SD_SETADDRSDSC:
LD HL,(HSTSEC)
LD E,0
LD D,L
LD HL,(HSTTRK)
LD C,L
LD B,H
XOR A
RL D
RL C
RL B
RET
SD_SETADDRSDHC:
LD A,(HSTSEC) ; GET SECTOR (LSB ONLY)
LD E,A ; PUT IN E
LD HL,(HSTTRK) ; GET TRACK
LD D,L ; TRACK LSB -> D
LD C,H ; TRACK MSB -> C
LD B,0 ; B ALWAYS ZERO
RET
;
; HANDLE READY TIMEOUT ERROR
;
SD_ERRRDYTO:
#IF (SDTRACE >= 1)
CALL SD_PRTPREFIX
LD DE,SDSTR_ERRRDYTO
#ENDIF
JR SD_CARDERR
;
; HANDLE INIT TIMEOUT ERROR
;
SD_ERRINITTO:
#IF (SDTRACE >= 1)
CALL SD_PRTPREFIX
LD DE,SDSTR_ERRINITTO
#ENDIF
JR SD_CARDERR
;
; HANDLE COMMAND ERROR
;
SD_ERRCMD:
#IF (SDTRACE == 1)
CALL SD_PRTTRN
#ENDIF
#IF (SDTRACE >= 1)
LD DE,SDSTR_ERRCMD
#ENDIF
JR SD_CARDERR
;
; HANDLE COMMAND ERROR
;
SD_ERRDATA:
#IF (SDTRACE == 1)
CALL SD_PRTTRN
#ENDIF
#IF (SDTRACE >= 1)
LD DE,SDSTR_ERRDATA
#ENDIF
JR SD_CARDERR
;
; GENERIC ERROR HANDLER, DE POINTS TO ERROR STRING
;
SD_CARDERR:
PUSH AF
XOR A
DEC A
LD A,FALSE
LD (SD_STAT),A
#IF (SDTRACE >= 1)
CALL PC_SPACE
CALL PC_LBKT
CALL WRITESTR
CALL PC_RBKT
#ENDIF
POP AF
LD (SD_STAT),A
RET
;
; PRINT DIAGNONSTIC PREFIX
;
SD_PRTPREFIX:
CALL NEWLINE
LD DE,SDSTR_PREFIX
CALL WRITESTR
RET
;
; PRT COMMAND TRACE
;
SD_PRTTRN:
PUSH AF
CALL SD_PRTPREFIX
LD DE,SD_CMDBUF
LD A,6
CALL PRTHEXBUF
CALL PC_SPACE
LD DE,SDSTR_ARROW
CALL WRITESTR
CALL PC_SPACE
LD DE,SDSTR_RC
CALL WRITESTR
LD A,(SD_RC)
CALL PRTHEXBYTE
CALL PC_SPACE
LD DE,SDSTR_TOK
CALL WRITESTR
LD A,(SD_TOK)
CALL PRTHEXBYTE
POP AF
RET
;
; DISPLAY COMMAND, LOW ORDER WORD OF PARMS, AND RC
;
#IF (DSKYENABLE)
SD_DSKY:
PUSH AF
LD HL,DSKY_HEXBUF
LD A,(SD_CMD)
LD (HL),A
INC HL
LD A,(SD_CMDP2)
LD (HL),A
INC HL
LD A,(SD_CMDP3)
LD (HL),A
INC HL
LD A,(SD_RC)
CALL DSKY_HEXOUT
POP AF
RET
#ENDIF
;
;
;
#IF (SDCSIOFAST)
MIRTAB: .DB 00H, 80H, 40H, 0C0H, 20H, 0A0H, 60H, 0E0H, 10H, 90H, 50H, 0D0H, 30H, 0B0H, 70H, 0F0H
.DB 08H, 88H, 48H, 0C8H, 28H, 0A8H, 68H, 0E8H, 18H, 98H, 58H, 0D8H, 38H, 0B8H, 78H, 0F8H
.DB 04H, 84H, 44H, 0C4H, 24H, 0A4H, 64H, 0E4H, 14H, 94H, 54H, 0D4H, 34H, 0B4H, 74H, 0F4H
.DB 0CH, 8CH, 4CH, 0CCH, 2CH, 0ACH, 6CH, 0ECH, 1CH, 9CH, 5CH, 0DCH, 3CH, 0BCH, 7CH, 0FCH
.DB 02H, 82H, 42H, 0C2H, 22H, 0A2H, 62H, 0E2H, 12H, 92H, 52H, 0D2H, 32H, 0B2H, 72H, 0F2H
.DB 0AH, 8AH, 4AH, 0CAH, 2AH, 0AAH, 6AH, 0EAH, 1AH, 9AH, 5AH, 0DAH, 3AH, 0BAH, 7AH, 0FAH
.DB 06H, 86H, 46H, 0C6H, 26H, 0A6H, 66H, 0E6H, 16H, 96H, 56H, 0D6H, 36H, 0B6H, 76H, 0F6H
.DB 0EH, 8EH, 4EH, 0CEH, 2EH, 0AEH, 6EH, 0EEH, 1EH, 9EH, 5EH, 0DEH, 3EH, 0BEH, 7EH, 0FEH
.DB 01H, 81H, 41H, 0C1H, 21H, 0A1H, 61H, 0E1H, 11H, 91H, 51H, 0D1H, 31H, 0B1H, 71H, 0F1H
.DB 09H, 89H, 49H, 0C9H, 29H, 0A9H, 69H, 0E9H, 19H, 99H, 59H, 0D9H, 39H, 0B9H, 79H, 0F9H
.DB 05H, 85H, 45H, 0C5H, 25H, 0A5H, 65H, 0E5H, 15H, 95H, 55H, 0D5H, 35H, 0B5H, 75H, 0F5H
.DB 0DH, 8DH, 4DH, 0CDH, 2DH, 0ADH, 6DH, 0EDH, 1DH, 9DH, 5DH, 0DDH, 3DH, 0BDH, 7DH, 0FDH
.DB 03H, 83H, 43H, 0C3H, 23H, 0A3H, 63H, 0E3H, 13H, 93H, 53H, 0D3H, 33H, 0B3H, 73H, 0F3H
.DB 0BH, 8BH, 4BH, 0CBH, 2BH, 0ABH, 6BH, 0EBH, 1BH, 9BH, 5BH, 0DBH, 3BH, 0BBH, 7BH, 0FBH
.DB 07H, 87H, 47H, 0C7H, 27H, 0A7H, 67H, 0E7H, 17H, 97H, 57H, 0D7H, 37H, 0B7H, 77H, 0F7H
.DB 0FH, 8FH, 4FH, 0CFH, 2FH, 0AFH, 6FH, 0EFH, 1FH, 9FH, 5FH, 0DFH, 3FH, 0BFH, 7FH, 0FFH
#ENDIF
;
;
;
SDSTR_PREFIX .TEXT "SD:$"
SDSTR_ARROW .TEXT "-->$"
SDSTR_RC .TEXT "RC=$"
SDSTR_TOK .TEXT "TOK=$"
SDSTR_OK .TEXT "OK$"
SDSTR_ERR .TEXT "ERR$"
SDSTR_ERRRDYTO .TEXT "READY TIMEOUT$"
SDSTR_ERRINITTO .TEXT "INIT TIMEOUT$"
SDSTR_ERRCMD .TEXT "CMD ERR$"
SDSTR_ERRDATA .TEXT "DATA ERR$"
SDSTR_SDTYPE .TEXT "SD CARD TYPE: $"
;
;==================================================================================================
; SD DISK DRIVER - DATA
;==================================================================================================
;
SD_STAT .DB 0
SD_TYPE .DB 0
SD_RC .DB 0
SD_TOK .DB 0
SD_CMDBUF .EQU $
SD_CMD .DB 0
SD_CMDP0 .DB 0
SD_CMDP1 .DB 0
SD_CMDP2 .DB 0
SD_CMDP3 .DB 0
SD_CMDCRC .DB 0

61
trunk/Source/sd_data.asm Normal file
View File

@@ -0,0 +1,61 @@
;
;==================================================================================================
; IDE DISK DRIVER - DATA
;==================================================================================================
;
SD_SLICETRKS .EQU 65 ; TRACKS PER SLICE
SD_TRKSIZE .EQU 128 ; SIZE OF TRACK (IN KB)
SD_SLICESIZE .EQU ((SD_SLICETRKS * SD_TRKSIZE) + 1023) / 1024 ; SIZE OF EACH SLICE (IN MB)
SD_NUMSLICES .EQU SDCAPACITY / SD_SLICESIZE ; TOTAL SLICES IN DEVICE
SD0_SLICEDEF .EQU 0 ; DEFAULT SLICE FOR UNIT 0
SD1_SLICEDEF .EQU 1 ; DEFAULT SLICE FOR UNIT 1
SD2_SLICEDEF .EQU 2 ; DEFAULT SLICE FOR UNIT 0
SD3_SLICEDEF .EQU 3 ; DEFAULT SLICE FOR UNIT 1
;
.DB DIODEV_SD + 0
SDDPH0 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW SDCSV0,SDALV0
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
SD0_SLICE .DW SD0_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW SD_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_SD + 0
SDDPH1 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW SDCSV1,SDALV1
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
SD1_SLICE .DW SD1_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW SD_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_SD + 0
SDDPH2 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW SDCSV2,SDALV2
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
SD2_SLICE .DW SD2_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW SD_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
.DB DIODEV_SD + 0
SDDPH3 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_HD
.DW SDCSV3,SDALV3
.DB "LU" ; LOGICAL UNIT ENHANCEMENT SIGNATURE
SD3_SLICE .DW SD3_SLICEDEF ; CURRENTLY ACTIVE SLICE
.DW SD_NUMSLICES ; NUMBER OF SLICES AVAILABLE
;
SDCKS .EQU 0 ; CKS: 0 FOR NON-REMOVABLE MEDIA
SDALS .EQU 256 ; ALS: BLKS / 8 = 2048 / 8 = 256 (ROUNDED UP)
;
SDCSV0: .FILL SDCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
SDALV0: .FILL SDALS ; MAX OF 2048 DATA BLOCKS
SDCSV1: .FILL SDCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
SDALV1: .FILL SDALS ; MAX OF 2048 DATA BLOCKS
SDCSV2: .FILL SDCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
SDALV2: .FILL SDALS ; MAX OF 2048 DATA BLOCKS
SDCSV3: .FILL SDCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
SDALV3: .FILL SDALS ; MAX OF 2048 DATA BLOCKS

577
trunk/Source/std.asm Normal file
View File

@@ -0,0 +1,577 @@
;
;==================================================================================================
; STANDARD INCLUDE STUFF
;==================================================================================================
;
; 5/21/2012 2.0.0.0 dwg - added B1F0PEEK & B1F0POKE
;
; 5/11/2012 2.0.0.0 dwg - moved BIOS JMPS together
;
; 3/04/2012 2.0.0.0 dwg - added CBIOS_BNKSEL for new BIOS jump (OEM extension)
;
; 2/21/2012 dwg - added TERM_VT52 terminal type for VDU
; 12/12/2011 dwg - changed TERM_NOT_SPEC to TERM_TTY & TTY=0 ANSI=1 WYSE=2
;
; 12/11/2011 dwg - added TERM_ANSI and TERM_WYSE for TERMTYPE
;
; 11/29/2011 dwg - now uses dynamically generated include file
; instead of static definitions.
;
;---------------------------------------------------------------------------------------------------
;
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
;
; BOOT STYLE
;
BT_MENU .EQU 1 ; WAIT FOR MENU SELECTION AT LOADER PROMPT
BT_AUTO .EQU 2 ; AUTO SELECT BOOT_DEFAULT AFTER BOOT_TIMEOUT
;
; VDU MODE SELECTIONS
;
VDUMODE_VDU .EQU 1 ; ORIGINAL ECB VDU (6545 CHIP)
VDUMODE_CVDU .EQU 2 ; ECB VDU COLOR (PENDING HARDWARE DEVELOPMENT)
VDUMODE_N8 .EQU 3 ; N8 ONBOARD VIDEO SUBSYSTEM (NOT IMPLEMENTED)
;
; CHARACTER DEVICES
;
CIODEV_UART .EQU $00
CIODEV_PRPCON .EQU $10
CIODEV_VDU .EQU $20
CIODEV_CVDU .EQU $30
CIODEV_PPPCON .EQU $40
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_IDE .EQU $20
DIODEV_ATAPI .EQU $30
DIODEV_PPIDE .EQU $40
DIODEV_SD .EQU $50
DIODEV_PRPSD .EQU $60
DIODEV_PPPSD .EQU $70
DIODEV_HDSK .EQU $80
;
; 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
;
; 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_IDE .EQU 4 ; IDE DRIVE PRIORITY
DM_PPIDE .EQU 5 ; PPIDE DRIVE PRIORITY
DM_SD .EQU 6 ; SD DRIVE PRIORITY
DM_PRPSD .EQU 7 ; PROPIO SD DRIVE PRIORITY
DM_PPPSD .EQU 8 ; PROPIO SD DRIVE PRIORITY
DM_HDSK .EQU 9 ; 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
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_HD .EQU 3
MID_FD720 .EQU 4
MID_FD144 .EQU 5
MID_FD360 .EQU 6
MID_FD120 .EQU 7
MID_FD111 .EQU 8
;
; FD MODE SELECTIONS
;
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
;
; IDE MODE SELECTIONS
;
IDEMODE_DIO .EQU 1 ; DISKIO V1
IDEMODE_DIDE .EQU 2 ; DUAL IDE
;
; PPIDE MODE SELECTIONS
;
PPIDEMODE_STD .EQU 1 ; STANDARD N8VEM PARALLEL PORT
PPIDEMODE_DIO3 .EQU 2 ; DISKIO V3 PARALLEL PORT
;
; CONSOLE DEVICE CHOICES FOR LDRCON AND DBGCON IN CONFIG SETTINGS
;
CON_UART .EQU 1
CON_VDU .EQU 2
CON_PRP .EQU 3
CON_PPP .EQU 4
;
; CONSOLE TERMINAL TYPE CHOICES
;
TERM_TTY .EQU 0
TERM_ANSI .EQU 1
TERM_WYSE .EQU 2
TERM_VT52 .EQU 3
;
; 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.2C"
#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
;
#IF (PLATFORM != PLT_N8)
;
; N8VEM HARDWARE IO PORT ADDRESSES AND MEMORY LOCATIONS
;
MPCL_RAM .EQU 78H ; BASE IO ADDRESS OF RAM MEMORY PAGER CONFIGURATION LATCH
MPCL_ROM .EQU 7CH ; BASE IO ADDRESS OF ROM MEMORY PAGER CONFIGURATION LATCH
RTC .EQU 70H ; ADDRESS OF RTC LATCH AND INPUT PORT
;__HARDWARE_INTERFACES________________________________________________________________________________________________________________
;
; PIO 82C55 I/O IS DECODED TO PORT 60-67
;
PIOA .EQU 60H ; PORT A
PIOB .EQU 61H ; PORT B
PIOC .EQU 62H ; PORT C
PIOX .EQU 63H ; PIO CONTROL PORT
;
; 16C550 SERIAL LINE UART
;
SIO_BASE .EQU 68H
SIO_RBR .EQU SIO_BASE + 0 ; DLAB=0: RCVR BUFFER REG (READ ONLY)
SIO_THR .EQU SIO_BASE + 0 ; DLAB=0: XMIT HOLDING REG (WRITE ONLY)
SIO_IER .EQU SIO_BASE + 1 ; DLAB=0: INT ENABLE REG
SIO_IIR .EQU SIO_BASE + 2 ; INT IDENT REGISTER (READ ONLY)
SIO_FCR .EQU SIO_BASE + 2 ; FIFO CONTROL REG (WRITE ONLY)
SIO_LCR .EQU SIO_BASE + 3 ; LINE CONTROL REG
SIO_MCR .EQU SIO_BASE + 4 ; MODEM CONTROL REG
SIO_LSR .EQU SIO_BASE + 5 ; LINE STATUS REG
SIO_MSR .EQU SIO_BASE + 6 ; MODEM STATUS REG
SIO_SCR .EQU SIO_BASE + 7 ; SCRATCH REGISTER
SIO_DLL .EQU SIO_BASE + 0 ; DLAB=1: DIVISOR LATCH (LS)
SIO_DLM .EQU SIO_BASE + 1 ; DLAB=1: DIVISOR LATCH (MS)
;
#ENDIF ; (PLATFORM != PLT_N8)
;
#IF (PLATFORM == PLT_N8)
;
; Z180 REGISTERS
;
CPU_IOBASE .EQU 40H ; ONLY RELEVANT FOR Z180
;
CPU_CNTLA0: .EQU CPU_IOBASE+$00 ;ASCI0 control A
CPU_CNTLA1: .EQU CPU_IOBASE+$01 ;ASCI1 control A
CPU_CNTLB0: .EQU CPU_IOBASE+$02 ;ASCI0 control B
CPU_CNTLB1: .EQU CPU_IOBASE+$03 ;ASCI1 control B
CPU_STAT0: .EQU CPU_IOBASE+$04 ;ASCI0 status
CPU_STAT1: .EQU CPU_IOBASE+$05 ;ASCI1 status
CPU_TDR0: .EQU CPU_IOBASE+$06 ;ASCI0 transmit
CPU_TDR1: .EQU CPU_IOBASE+$07 ;ASCI1 transmit
CPU_RDR0: .EQU CPU_IOBASE+$08 ;ASCI0 receive
CPU_RDR1: .EQU CPU_IOBASE+$09 ;ASCI1 receive
CPU_CNTR: .EQU CPU_IOBASE+$0A ;CSI/O control
CPU_TRDR: .EQU CPU_IOBASE+$0B ;CSI/O transmit/receive
CPU_TMDR0L: .EQU CPU_IOBASE+$0C ;Timer 0 data lo
CPU_TMDR0H: .EQU CPU_IOBASE+$0D ;Timer 0 data hi
CPU_RLDR0L: .EQU CPU_IOBASE+$0E ;Timer 0 reload lo
CPU_RLDR0H: .EQU CPU_IOBASE+$0F ;Timer 0 reload hi
CPU_TCR: .EQU CPU_IOBASE+$10 ;Timer control
;
CPU_ASEXT0: .EQU CPU_IOBASE+$12 ;ASCI0 extension control (Z8S180)
CPU_ASEXT1: .EQU CPU_IOBASE+$13 ;ASCI1 extension control (Z8S180)
;
CPU_TMDR1L: .EQU CPU_IOBASE+$14 ;Timer 1 data lo
CPU_TMDR1H: .EQU CPU_IOBASE+$15 ;Timer 1 data hi
CPU_RLDR1L: .EQU CPU_IOBASE+$16 ;Timer 1 reload lo
CPU_RLDR1H: .EQU CPU_IOBASE+$17 ;Timer 1 reload hi
CPU_FRC: .EQU CPU_IOBASE+$18 ;Free running counter
CPU_ASTC0L: .EQU CPU_IOBASE+$1A ;ASCI0 Time constant lo (Z8S180)
CPU_ASTC0H: .EQU CPU_IOBASE+$1B ;ASCI0 Time constant hi (Z8S180)
CPU_ASTC1L: .EQU CPU_IOBASE+$1C ;ASCI1 Time constant lo (Z8S180)
CPU_ASTC1H: .EQU CPU_IOBASE+$1D ;ASCI1 Time constant hi (Z8S180)
CPU_CMR: .EQU CPU_IOBASE+$1E ;Clock multiplier (latest Z8S180)
CPU_CCR: .EQU CPU_IOBASE+$1F ;CPU control (Z8S180)
;
CPU_SAR0L: .EQU CPU_IOBASE+$20 ;DMA0 source addr lo
CPU_SAR0H: .EQU CPU_IOBASE+$21 ;DMA0 source addr hi
CPU_SAR0B: .EQU CPU_IOBASE+$22 ;DMA0 source addr bank
CPU_DAR0L: .EQU CPU_IOBASE+$23 ;DMA0 dest addr lo
CPU_DAR0H: .EQU CPU_IOBASE+$24 ;DMA0 dest addr hi
CPU_DAR0B: .EQU CPU_IOBASE+$25 ;DMA0 dest addr bank
CPU_BCR0L: .EQU CPU_IOBASE+$26 ;DMA0 byte count lo
CPU_BCR0H: .EQU CPU_IOBASE+$27 ;DMA0 byte count hi
CPU_MAR1L: .EQU CPU_IOBASE+$28 ;DMA1 memory addr lo
CPU_MAR1H: .EQU CPU_IOBASE+$29 ;DMA1 memory addr hi
CPU_MAR1B: .EQU CPU_IOBASE+$2A ;DMA1 memory addr bank
CPU_IAR1L: .EQU CPU_IOBASE+$2B ;DMA1 I/O addr lo
CPU_IAR1H: .EQU CPU_IOBASE+$2C ;DMA1 I/O addr hi
CPU_IAR1B: .EQU CPU_IOBASE+$2D ;DMA1 I/O addr bank (Z8S180)
CPU_BCR1L: .EQU CPU_IOBASE+$2E ;DMA1 byte count lo
CPU_BCR1H: .EQU CPU_IOBASE+$2F ;DMA1 byte count hi
CPU_DSTAT: .EQU CPU_IOBASE+$30 ;DMA status
CPU_DMODE: .EQU CPU_IOBASE+$31 ;DMA mode
CPU_DCNTL: .EQU CPU_IOBASE+$32 ;DMA/WAIT control
CPU_IL: .EQU CPU_IOBASE+$33 ;Interrupt vector load
CPU_ITC: .EQU CPU_IOBASE+$34 ;INT/TRAP control
;
CPU_RCR: .EQU CPU_IOBASE+$36 ;Refresh control
;
CPU_CBR: .EQU CPU_IOBASE+$38 ;MMU common base register
CPU_BBR: .EQU CPU_IOBASE+$39 ;MMU bank base register
CPU_CBAR .EQU CPU_IOBASE+$3A ;MMU common/bank area register
;
CPU_OMCR: .EQU CPU_IOBASE+$3E ;Operation mode control
CPU_ICR: .EQU $3F ;I/O control register (not relocated!!!)
;
; N8 ONBOARD I/O REGISTERS
;
N8_IOBASE .EQU $80
;
PIO .EQU N8_IOBASE+$00
PIOA .EQU PIO+$00 ; PORT A
PIOB .EQU PIO+$01 ; PORT B
PIOC .EQU PIO+$02 ; PORT C
PIOX .EQU PIO+$03 ; PIO CONTROL PORT
;
PIO2 .EQU N8_IOBASE+$04
PIO2A .EQU PIO2+$00 ; PORT A
PIO2B .EQU PIO2+$01 ; PORT B
PIO2C .EQU PIO2+$02 ; PORT C
PIO2X .EQU PIO2+$03 ; PIO CONTROL PORT
;
RTC: .EQU N8_IOBASE+$08 ;RTC latch and buffer
;FDC: .EQU N8_IOBASE+$0C ;Floppy disk controller
;UTIL: .EQU N8_IOBASE+$10 ;Floppy disk utility
ACR: .EQU N8_IOBASE+$14 ;auxillary control register
RMAP: .EQU N8_IOBASE+$16 ;ROM page register
VDP: .EQU N8_IOBASE+$18 ;Video Display Processor (TMS9918A)
PSG: .EQU N8_IOBASE+$1C ;Programmable Sound Generator (AY-3-8910)
;
DEFACR .EQU $1B
;
#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
;
; DISK DRIVER FUNCTIONS
;
DF_READY .EQU 1
DF_SELECT .EQU 2
DF_READ .EQU 3
DF_WRITE .EQU 4
DF_FORMAT .EQU 5
;
; BIOS FUNCTIONS
;
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_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_DIOGBA .EQU BF_DIO + 8 ; DISK GET BUFFER ADR
BF_DIOSBA .EQU BF_DIO + 9 ; DISK SET BUFFER ADR
;
BF_CLK .EQU $20
BF_CLKRD .EQU BF_CLK + 0
BF_CLKWR .EQU BF_CLK + 1
;
BF_VDU .EQU $30
BF_VDUIN .EQU BF_VDU + 0 ; VDU CHARACTER INPUT
BF_VDUOUT .EQU BF_VDU + 1 ; VDU CHARACTER OUTPUT
BF_VDUIST .EQU BF_VDU + 2 ; VDU CHARACTER INPUT STATUS
BF_VDUOST .EQU BF_VDU + 3 ; VDU CHARACTER OUTPUT STATUS
BF_VDUXY .EQU BF_VDU + 4 ; VDU CURSOR POSITION X/Y
;
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
;
;
; MEMORY LAYOUT
;
CPM_LOC .EQU 0D000H ; CONFIGURABLE: LOCATION OF CPM FOR RUNNING SYSTEM
CPM_SIZ .EQU 2F00H ; 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
;
HB_LOC .EQU CPM_END
HB_SIZ .EQU 100H
HB_END .EQU HB_LOC + HB_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_UART .EQU MON_LOC + 3 ; MONITOR ENTRY (UART)
;
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
;
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
;
#IF (PLATFORM == PLT_N8VEM)
#DEFINE PLATFORM_NAME "N8VEM Z80 SBC"
#ENDIF
#IF (PLATFORM == PLT_ZETA)
#DEFINE PLATFORM_NAME "ZETA Z80 SBC"
#ENDIF
#IF (PLATFORM == PLT_N8)
#DEFINE PLATFORM_NAME "N8 Z180 SBC"
#ENDIF
;
#IF (DSKYENABLE)
#DEFINE DSKYLBL ", DSKY"
#ELSE
#DEFINE DSKYLBL ""
#ENDIF
;
#IF (VDUENABLE)
#DEFINE VDULBL ", VDU"
#ELSE
#DEFINE VDULBL ""
#ENDIF
;
#IF (FDENABLE)
#IF (FDMAUTO)
#DEFINE FDLBL ", FLOPPY (AUTOSIZE)"
#ELSE
#IF (FDMEDIA == FDM720)
#DEFINE FDLBL ", FLOPPY (720KB)"
#ENDIF
#IF (FDMEDIA == FDM144)
#DEFINE FDLBL ", FLOPPY (1.44MB)"
#ENDIF
#IF (FDMEDIA == FDM120)
#DEFINE FDLBL ", FLOPPY (1.20MB)"
#ENDIF
#IF (FDMEDIA == FDM360)
#DEFINE FDLBL ", FLOPPY (360KB)"
#ENDIF
#IF (FDMEDIA == FDM111)
#DEFINE FDLBL ", FLOPPY (1.11MB)"
#ENDIF
#ENDIF
#ELSE
#DEFINE FDLBL ""
#ENDIF
;
#IF (IDEENABLE)
#IF (IDEMODE == IDEMODE_DIO)
#DEFINE IDELBL ", IDE (DISKIO)"
#ENDIF
#IF (IDEMODE == IDEMODE_DIDE)
#DEFINE IDELBL ", IDE (DUAL IDE)"
#ENDIF
#ELSE
#DEFINE IDELBL ""
#ENDIF
;
#IF (PPIDEENABLE)
#IF (PPIDEMODE == PPIDEMODE_STD)
#DEFINE PPIDELBL ", PPIDE (STD)"
#ENDIF
#IF (PPIDEMODE == PPIDEMODE_DIO3)
#DEFINE PPIDELBL ", PPIDE (DISKIO V3)"
#ENDIF
#ELSE
#DEFINE PPIDELBL ""
#ENDIF
;
#IF (SDENABLE)
#DEFINE SDLBL ", SD CARD"
#ELSE
#DEFINE SDLBL ""
#ENDIF
;
#IF (IDEENABLE)
#DEFINE IDELBL ", IDE"
#ELSE
#DEFINE IDELBL ""
#ENDIF
;
#IF (PPIDEENABLE)
#DEFINE PPIDELBL ", PPIDE"
#ELSE
#DEFINE PPIDELBL ""
#ENDIF
#IF (SDENABLE)
#DEFINE SDLBL ", SD CARD"
#ELSE
#DEFINE SDLBL ""
#ENDIF
#IF (PRPENABLE)
#IF (PRPCONENABLE & PRPSDENABLE)
#DEFINE PRPLBL ", PROPIO (CONSOLE, SD CARD)"
#ENDIF
#IF (PRPCONENABLE & !PRPSDENABLE)
#DEFINE PRPLBL ", PROPIO (CONSOLE)"
#ENDIF
#IF (!PRPCONENABLE & PRPSDENABLE)
#DEFINE PRPLBL ", PROPIO (SD CARD)"
#ENDIF
#IF (!PRPCONENABLE & !PRPSDENABLE)
#DEFINE PRPLBL ", PROPIO ()"
#ENDIF
#ELSE
#DEFINE PRPLBL ""
#ENDIF
#IF (PPPENABLE)
#IF (PPPCONENABLE & PPPSDENABLE)
#DEFINE PPPLBL ", PARPORTPROP (CONSOLE, SD CARD)"
#ENDIF
#IF (PPPCONENABLE & !PPPSDENABLE)
#DEFINE PPPLBL ", PARPORTPROP (CONSOLE)"
#ENDIF
#IF (!PPPCONENABLE & PPPSDENABLE)
#DEFINE PPPLBL ", PARPORTPROP (SD CARD)"
#ENDIF
#IF (!PPPCONENABLE & !PPPSDENABLE)
#DEFINE PPPLBL ", PARPORTPROP ()"
#ENDIF
#ELSE
#DEFINE PPPLBL ""
#ENDIF
.ECHO "Configuration: "
.ECHO PLATFORM_NAME
.ECHO DSKYLBL
.ECHO VDULBL
.ECHO FDLBL
.ECHO IDELBL
.ECHO PPIDELBL
.ECHO SDLBL
.ECHO PRPLBL
.ECHO PPPLBL
.ECHO "\n"

34
trunk/Source/syscfg.asm Normal file
View File

@@ -0,0 +1,34 @@
;___SYSCFG_____________________________________________________________________________________________________________
;
; syscfg.asm 3/04/2012 2.0.0.0 dwg - added required configuration information
;
; Include standard BIOS definitions
;
#INCLUDE "std.asm"
;
.ORG 0000H ; ALL ADDRESSES GENERATED WILL BE ZERO BASED
;
JP 0000H ; DUMMY JP INSTRUCTION FOR COMPATIBILITY
;
; Reserved for Configuration Information
;
.DW cnf_loc
.DW tst_loc1
.DW var_loc1
;
; BIOS configuration data
;
cnf_loc:
#INCLUDE "cnfgdata.inc"
;
; Build information strings
;
tst_loc1 .DB TIMESTAMP
var_loc1 .DB VARIANT
.DB '$' ; provide terminator for variable length field
;
.EXPORT DISKBOOT,BOOTDEVICE,BOOTLU
;
.FILL 200H - $,$FF
;
.END

229
trunk/Source/uart.asm Normal file
View File

@@ -0,0 +1,229 @@
;
;==================================================================================================
; UART DRIVER (SERIAL PORT)
;==================================================================================================
;
#IF (PLATFORM != PLT_N8)
UART0_DIV .EQU (1843200 / (16 * BAUDRATE))
#ENDIF
;
; CHARACTER DEVICE DRIVER ENTRY
; A: RESULT (OUT), CF=ERR
; B: FUNCTION (IN)
; C: CHARACTER (IN/OUT)
; E: DEVICE/UNIT (IN)
;
;
UART_DISPATCH:
#IF (PLATFORM == PLT_N8)
LD A,C ; GET DEVICE/UNIT
AND $0F ; ISOLATE UNIT
JR Z,UART0
DEC A
JR Z,UART1
CALL PANIC
#ENDIF
;
UART0:
; LD C,E ; FIX: COMPAT W/OLD DRIVERS, GET CHAR INTO C
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,UART0_IN
DEC A
JR Z,UART0_OUT
DEC A
JR Z,UART0_IST
DEC A
JR Z,UART0_OST
CALL PANIC
;
;
;
UART_INIT:
#IF (PLATFORM == PLT_N8)
; ASCI0
LD A,66H
OUT0 (CPU_ASEXT0),A
LD A,64H
OUT0 (CPU_CNTLA0),A
LD A,Z180_CNTLB0
OUT0 (CPU_CNTLB0),A
; ASCI1
LD A,66H
OUT0 (CPU_ASEXT1),A
LD A,64H
OUT0 (CPU_CNTLA1),A
LD A,Z180_CNTLB1
OUT0 (CPU_CNTLB1),A
#ELSE
LD A,80H
OUT (SIO_LCR),A ; DLAB ON
LD A,UART0_DIV
OUT (SIO_DLL),A ; SET DIVISOR (LS)
LD A,00H
OUT (SIO_DLM),A ; SET DIVISOR (MS)
LD B,03H ; B = DEFAULT SETTING FOR MCR (DTR + RTS)
#IF (UARTAFC)
LD A,$55 ; TEST VALUE
OUT (SIO_SCR),A ; SET SCRATCH REG TO TEST VALUE
LD A,0BFH
OUT (SIO_LCR),A ; SET LCR=$BF TO ATTEMPT TO ACCESS EFR
IN A,(SIO_SCR) ; READ SCRATCH REGISTER
CP $55 ; IF $55, NO EFR
JR NZ,UART_AFC1 ; NZ, HAVE EFR, DO IT
SET 5,B ; ENABLE AUTO FLOW CONTROL
JR UART_AFC2
UART_AFC1:
LD A,0C0H ; ENABLE CTS/RTS FLOW CONTROL
OUT (SIO_EFR),A ; SAVE IT
UART_AFC2:
#ENDIF
LD A,03H
OUT (SIO_LCR),A ; DLAB OFF, 8 DATA, 1 STOP, NO PARITY
LD A,B ; LOAD MCR VALUE TO SET
OUT (SIO_MCR),A ; SAVE IT
#IF (UARTFIFO)
LD A,07H ; ENABLE AND RESET FIFOS
OUT (SIO_FCR),A
#ENDIF
#ENDIF
RET
;
;
;
UART0_IN:
CALL UART0_IST
OR A
JR Z,UART0_IN
#IF (PLATFORM == PLT_N8)
IN0 A,(CPU_RDR0) ; READ THE CHAR FROM THE UART
#ELSE
IN A,(SIO_RBR) ; READ THE CHAR FROM THE UART
#ENDIF
LD E,A
RET
;
;
;
UART0_IST:
#IF (PLATFORM == PLT_N8)
; CHECK FOR ERROR FLAGS
IN0 A,(CPU_STAT0)
AND 70H ; PARITY, FRAMING, OR OVERRUN ERROR
JR Z,UART0_IST1 ; ALL IS WELL, CHECK FOR DATA
; CLEAR ERROR(S) OR NOTHING FURTHER CAN BE RECEIVED!!!
IN0 A,(CPU_CNTLA0)
RES 3,A ; CLEAR EFR (ERROR FLAG RESET)
OUT0 (CPU_CNTLA0),A
UART0_IST1: ; CHECK FOR STAT0.RDRF (DATA READY)
IN0 A,(CPU_STAT0) ; READ LINE STATUS REGISTER
AND $80 ; TEST IF DATA IN RECEIVE BUFFER
#ELSE
IN A,(SIO_LSR) ; READ LINE STATUS REGISTER
AND $01 ; TEST IF DATA IN RECEIVE BUFFER
#ENDIF
JP Z,CIO_IDLE ; DO IDLE PROCESSING
LD A,$01 ; SIGNAL DATA PENDING
RET
;
;
;
UART0_OUT:
CALL UART0_OST
OR A
JR Z,UART0_OUT
LD A,E
#IF (PLATFORM == PLT_N8)
OUT0 (CPU_TDR0),A
#ELSE
OUT (SIO_THR),A ; THEN WRITE THE CHAR TO UART
#ENDIF
RET
;
UART0_OST:
#IF (PLATFORM == PLT_N8)
IN0 A,(CPU_STAT0)
AND $02
JR Z,UART0_OST
#ELSE
IN A,(SIO_LSR) ; READ LINE STATUS REGISTER
AND $20
JR Z,UART0_OST ; IF NOT REPEAT
#ENDIF
JP Z,CIO_IDLE ; DO IDLE PROCESSING
LD A,$01 ; SIGNAL DATA PENDING
RET
;
;
;
#IF (PLATFORM == PLT_N8)
;
UART1:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,UART0_IN
DEC A
JR Z,UART0_OUT
DEC A
JR Z,UART0_IST
DEC A
JR Z,UART0_OST
CALL PANIC
;
;
;
UART1_IN:
CALL UART1_IST
OR A
JR Z,UART1_IN
IN0 A,(CPU_RDR1) ; READ THE CHAR FROM THE UART
LD E,A
RET
;
;
;
UART1_IST:
; CHECK FOR ERROR FLAGS
IN0 A,(CPU_STAT1)
AND 70H ; PARITY, FRAMING, OR OVERRUN ERROR
JR Z,UART1_IST1 ; ALL IS WELL, CHECK FOR DATA
; CLEAR ERROR(S) OR NOTHING FURTHER CAN BE RECEIVED!!!
IN0 A,(CPU_CNTLA1)
RES 3,A ; CLEAR EFR (ERROR FLAG RESET)
OUT0 (CPU_CNTLA1),A
UART1_IST1: ; CHECK FOR STAT0.RDRF (DATA READY)
IN0 A,(CPU_STAT1) ; READ LINE STATUS REGISTER
AND $80 ; TEST IF DATA IN RECEIVE BUFFER
JP Z,CIO_IDLE ; DO IDLE PROCESSING
LD A,$01 ; SIGNAL DATA PENDING
RET
;
;
;
UART1_OUT:
CALL UART1_OST
OR A
JR Z,UART1_OUT
LD A,E
OUT0 (CPU_TDR1),A
RET
;
UART1_OST:
IN0 A,(CPU_STAT1)
AND $02
JR Z,UART1_OST
JP Z,CIO_IDLE ; DO IDLE PROCESSING
LD A,$01 ; SIGNAL DATA PENDING
RET
#ENDIF

632
trunk/Source/util.asm Normal file
View File

@@ -0,0 +1,632 @@
;
;==================================================================================================
; 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_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
LD DE,HEXSTRBUF
CALL HEXSTRBYTE
LD A,'$'
LD (DE),A
LD DE,HEXSTRBUF
CALL WRITESTR
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 VALUE IN A TO A 2 CHARACTER HEX STRING AT DE
;
HEXCHR .TEXT "0123456789ABCDEF"
;
HEXSTRBYTE:
PUSH BC
PUSH HL
PUSH AF
LD BC,0
RRA
RRA
RRA
RRA
AND 0FH
LD C,A
LD HL,HEXCHR
ADD HL,BC
LD A,(HL)
LD (DE),A
INC DE
POP AF
PUSH AF
LD BC,0
AND 0FH
LD C,A
LD HL,HEXCHR
ADD HL,BC
LD A,(HL)
LD (DE),A
INC DE
POP AF
POP HL
POP BC
RET
;
; CONVERT VALUE IN BC TO A 4 CHARACTER HEX STRING AT DE
;
HEXSTRWORD:
LD A,B
CALL HEXSTRBYTE
LD A,C
CALL HEXSTRBYTE
RET
;
; PRINT A BYTE BUFFER IN HEX POINTED TO BY DE
; REGISTER A HAS SIZE OF BUFFER
;
PRTHEXBUF:
CP 0 ; EMPTY BUFFER?
JP Z,PRTHEXBUF2
LD B,A
PRTHEXBUF1:
CALL PC_SPACE
LD A,(DE)
CALL PRTHEXBYTE
INC DE
DJNZ PRTHEXBUF1
JP PRTHEXBUFX
PRTHEXBUF2:
CALL PC_SPACE
LD DE,STR_EMPTY
CALL WRITESTR
PRTHEXBUFX:
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
CALL PRTHEXWORD
LD DE,STR_BC
CALL WRITESTR
POP BC
CALL PRTHEXWORD
LD DE,STR_DE
CALL WRITESTR
POP BC
CALL PRTHEXWORD
LD DE,STR_HL
CALL WRITESTR
POP BC
CALL PRTHEXWORD
LD DE,STR_PC
CALL WRITESTR
POP BC
CALL PRTHEXWORD
LD DE,STR_SP
CALL WRITESTR
LD (PANIC_SP),SP
LD BC,(PANIC_SP)
CALL PRTHEXWORD
JP 0
;
;==================================================================================================
; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED)
;==================================================================================================
;
; OUTPUT CHARACTER FROM A
COUT:
PUSH AF
PUSH BC
PUSH DE
PUSH HL
#IFDEF CIOMODE_CONSOLE
#DEFINE CIOMODE_NONDOS
LD E,A
LD A,(CONDEV)
LD C,A
LD B,BF_CIOOUT
CALL BIOS_DISPATCH
#ENDIF
#IFDEF CIOMODE_CBIOS
#DEFINE CIOMODE_NONDOS
LD C,A
CALL CBIOS_CONOUT
#ENDIF
#IFNDEF CIOMODE_NONDOS
LD E,A
LD C,03H
CALL 0005H
#ENDIF
POP HL
POP DE
POP BC
POP AF
RET
;
; INPUT CHARACTER TO A
;
CIN:
PUSH BC
PUSH DE
PUSH HL
#IFDEF CIOMODE_CONSOLE
#DEFINE CIOMODE_NONDOS
LD A,(CONDEV)
LD C,A
LD B,BF_CIOIN
CALL BIOS_DISPATCH
LD A,E
#ENDIF
#IFDEF CIOMODE_CBIOS
#DEFINE CIOMODE_NONDOS
CALL CBIOS_CONIN
#ENDIF
#IFNDEF CIOMODE_NONDOS
LD C,01H
CALL 0005H
#ENDIF
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
#IFDEF CIOMODE_CONSOLE
#DEFINE CIOMODE_NONDOS
LD B,BF_CIOIST
LD A,(CONDEV)
LD C,A
CALL BIOS_DISPATCH
#ENDIF
#IFDEF CIOMODE_CBIOS
#DEFINE CIOMODE_NONDOS
CALL CBIOS_CONST
#ENDIF
#IFNDEF CIOMODE_NONDOS
LD C,0BH
CALL 0005H
#ENDIF
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)
;
; DELAY ABOUT 25us (100 TSTATES INCLUDING CALL AND RET)
;
; TOTAL T STATES = ((B*13) + 51)
; 4MHZ CPU, B=4, 103 T STATES = 25.75us
; 8MHZ CPU, B=12, 207 TSTATES = 25.875us
; B = ((2 * FREQ) - 4)
;
DELAY: ; 17 T STATES (FOR CALL)
PUSH BC ; 11 T STATES
LD B,((CPUFREQ * 2) - 4) ; 8 T STATES
DJNZ $ ; (B*13) - 5 T STATES
POP BC ; 10 T STATES
RET ; 10 T STATES
;
; DELAY 25us * VALUE IN DE (VARIABLE DELAY)
;
VDELAY:
CALL DELAY
DEC DE
LD A,D
OR E
JP NZ,VDELAY
RET
;
; DELAY ABOUT 0.5 SECONDS = 25us * 20,000
;
LDELAY:
PUSH DE
LD DE,20000
CALL VDELAY
POP DE
RET
;
; MULTIPLY 8-BIT VALUES
; IN: MULTIPLY H WITH E
; OUT: HL = RESULT
;
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
;
;==================================================================================================
; DSKY KEYBOARD ROUTINES
;==================================================================================================
;
#IF (DSKYENABLE)
;
; ____C0______C1______C2______C3__
;B5 | 20 D 60 E A0 F E0 BO
;B4 | 10 A 50 B 90 C D0 GO
;B3 | 08 7 48 8 88 9 C8 EX
;B2 | 04 4 44 5 84 6 C4 DE
;B1 | 02 1 42 2 82 3 C2 EN
;B0 | 01 FW 41 0 81 BK C1 CL
;
KY_0 .EQU 000H
KY_1 .EQU 001H
KY_2 .EQU 002H
KY_3 .EQU 003H
KY_4 .EQU 004H
KY_5 .EQU 005H
KY_6 .EQU 006H
KY_7 .EQU 007H
KY_8 .EQU 008H
KY_9 .EQU 009H
KY_A .EQU 00AH
KY_B .EQU 00BH
KY_C .EQU 00CH
KY_D .EQU 00DH
KY_E .EQU 00EH
KY_F .EQU 00FH
KY_FW .EQU 010H ; FORWARD
KY_BK .EQU 011H ; BACKWARD
KY_CL .EQU 012H ; CLEAR
KY_EN .EQU 013H ; ENTER
KY_DE .EQU 014H ; DEPOSIT
KY_EX .EQU 015H ; EXAMINE
KY_GO .EQU 016H ; GO
KY_BO .EQU 017H ; BOOT
;
;__DSKY_INIT_________________________________________________________________________________________
;
; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS
;____________________________________________________________________________________________________
;
DSKY_INIT:
LD A,82H
OUT (PIOX),A
LD A,30H ;disable /CS on PPISD card(s)
OUT (PIOC),A
XOR A
LD (KY_BUF),A
RET
#IFDEF DSKY_KBD
;
;__KY_STAT___________________________________________________________________________________________
;
; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS
;____________________________________________________________________________________________________
;
KY_STAT:
; IF WE ALREADY HAVE A KEY, RETURN WITH NZ
LD A,(KY_BUF)
OR A
RET NZ
; SCAN FOR A KEYPRESS, A=0 NO DATA OR A=RAW BYTE
CALL KY_SCAN ; SCAN KB ONCE
OR A ; SET FLAGS
RET Z ; NOTHING FOUND, GET OUT
LD (KY_BUF),A ; SAVE RAW KEYCODE
RET ; RETURN
;
;__KY_GET____________________________________________________________________________________________
;
; GET A SINGLE KEY (WAIT FOR ONE IF NECESSARY)
;____________________________________________________________________________________________________
;
KY_GET:
; SEE IF WE ALREADY HAVE A KEY SAVED, GO TO DECODE IF SO
LD A,(KY_BUF)
OR A
JR NZ,KY_DECODE
; NO KEY SAVED, WAIT FOR ONE
KY_STATLOOP:
CALL KY_STAT
OR A
JR Z,KY_STATLOOP
; DECODE THE RAW VALUE
KY_DECODE:
LD D,00H
LD HL,KY_KEYMAP ; POINT TO BEGINNING OF TABLE
KY_GET_LOOP:
CP (HL) ; MATCH?
JR Z,KY_GET_DONE ; FOUND, DONE
INC HL
INC D ; D + 1
JR NZ,KY_GET_LOOP ; NOT FOUND, LOOP UNTIL EOT
KY_GET_DONE:
; CLEAR OUT KEY_BUF
XOR A
LD (KY_BUF),A
; RETURN THE INDEX POSITION WHERE THE RAW VALUE WAS FOUND
LD A,D
RET
;
;__KY_SCAN____________________________________________________________________________________________
;
; SCAN KEYBOARD MATRIX FOR AN INPUT
;____________________________________________________________________________________________________
;
KY_SCAN:
LD C,0000H
LD A,41H+30H ; SCAN COL ONE
OUT (PIOC),A ; SEND TO COLUMN LINES
CALL DELAY ; DEBOUNCE
IN A,(PIOB) ; GET ROWS
AND 7FH ;ignore PB7 for PPISD
CP 00H ; ANYTHING PRESSED?
JR NZ,KY_SCAN_FOUND ; YES, EXIT
LD C,0040H
LD A,42H+30H ; SCAN COL TWO
OUT (PIOC),A ; SEND TO COLUMN LINES
CALL DELAY ; DEBOUNCE
IN A,(PIOB) ; GET ROWS
AND 7FH ;ignore PB7 for PPISD
CP 00H ; ANYTHING PRESSED?
JR NZ,KY_SCAN_FOUND ; YES, EXIT
LD C,0080H
LD A,44H+30H ; SCAN COL THREE
OUT (PIOC),A ; SEND TO COLUMN LINES
CALL DELAY ; DEBOUNCE
IN A,(PIOB) ; GET ROWS
AND 7FH ;ignore PB7 for PPISD
CP 00H ; ANYTHING PRESSED?
JR NZ,KY_SCAN_FOUND ; YES, EXIT
LD C,00C0H ;
LD A,48H+30H ; SCAN COL FOUR
OUT (PIOC),A ; SEND TO COLUMN LINES
CALL DELAY ; DEBOUNCE
IN A,(PIOB) ; GET ROWS
AND 7FH ;ignore PB7 for PPISD
CP 00H ; ANYTHING PRESSED?
JR NZ,KY_SCAN_FOUND ; YES, EXIT
LD A,040H+30H ; TURN OFF ALL COLUMNS
OUT (PIOC),A ; SEND TO COLUMN LINES
LD A,00H ; RETURN NULL
RET ; EXIT
KY_SCAN_FOUND:
AND 3FH ; CLEAR TOP TWO BITS
OR C ; ADD IN ROW BITS
LD C,A ; STORE VALUE
; WAIT FOR KEY TO BE RELEASED
LD A,4FH+30H ; SCAN ALL COL LINES
OUT (PIOC),A ; SEND TO COLUMN LINES
CALL DELAY ; DEBOUNCE
KY_CLEAR_LOOP: ; WAIT FOR KEY TO CLEAR
IN A,(PIOB) ; GET ROWS
AND 7FH ;ignore PB7 for PPISD
CP 00H ; ANYTHING PRESSED?
JR NZ,KY_CLEAR_LOOP ; YES, LOOP UNTIL KEY RELEASED
LD A,040H+30H ; TURN OFF ALL COLUMNS
OUT (PIOC),A ; SEND TO COLUMN LINES
LD A,C ; RESTORE VALUE
RET
;
;_KEYMAP_TABLE_____________________________________________________________________________________________________________
;
KY_KEYMAP:
; 0 1 2 3 4 5 6 7
.DB 041H,002H,042H,082H,004H,044H,084H,008H
; 8 9 A B C D E F
.DB 048H,088H,010H,050H,090H,020H,060H,0A0H
; FW BK CL EN DE EX GO BO
.DB 001H,081H,0C1H,0C2H,0C4H,0C8H,0D0H,0E0H
#ENDIF ; DSKY_KBD
;
;==================================================================================================
; DSKY HEX DISPLAY
;==================================================================================================
;
DSKY_HEXOUT:
LD B,DSKY_HEXBUFLEN
LD HL,DSKY_BUF
LD DE,DSKY_HEXBUF
DSKY_HEXOUT1:
LD A,(DE) ; FIRST NIBBLE
SRL A
SRL A
SRL A
SRL A
LD (HL),A
INC HL
LD A,(DE) ; SECOND NIBBLE
AND 0FH
LD (HL),A
INC HL
INC DE ; NEXT BYTE
DJNZ DSKY_HEXOUT1
LD A,82H ; SETUP PPI
OUT (PIOX),A
CALL DSKY_COFF
LD A,0D0H ; 7218 -> (DATA COMING, HEXA DECODE)
OUT (PIOA),A
CALL DSKY_STROBEC
LD HL,DSKY_BUF ; POINT TO START OF BUF
LD B,DSKY_BUFLEN ; NUMBER OF DIGITS
LD C,PIOA
DSKY_HEXOUT2:
OUTI
JP Z,DSKY_STROBE ; DO FINAL STROBE AND RETURN
CALL DSKY_STROBE
JR DSKY_HEXOUT2
DSKY_STROBEC:
LD A,80H+30H
JP DSKY_STROBE0
DSKY_STROBE:
LD A,00H+30H ; SET WRITE STROBE
DSKY_STROBE0:
OUT (PIOC),A ; OUT TO PORTC
CALL DELAY ; DELAY
DSKY_COFF
LD A,40H+30H ; SET CONTROL PORT OFF
OUT (PIOC),A ; OUT TO PORTC
CALL DELAY ; WAIT
RET
#ENDIF
;
;==================================================================================================
; DATA
;==================================================================================================
;
STR_EMPTY .TEXT "<EMPTY>$"
;
HEXSTRBUF .TEXT "XX$"
;
KY_BUF .DB 0
DSKY_BUF: .FILL 8,0
DSKY_BUFLEN .EQU $ - DSKY_BUF
DSKY_HEXBUF .FILL 4,0
DSKY_HEXBUFLEN .EQU $ - DSKY_HEXBUF
;
PANIC_SP .DW 0

1516
trunk/Source/vdu.asm Normal file

File diff suppressed because it is too large Load Diff

6
trunk/Source/ver.inc Normal file
View File

@@ -0,0 +1,6 @@
#DEFINE RMJ 2
#DEFINE RMN 1
#DEFINE RUP 1
#DEFINE RTP 0
#DEFINE BIOSVER "2.1.1"
#DEFINE REVISION 1741

2050
trunk/Source/zcpr.asm Normal file

File diff suppressed because it is too large Load Diff

64
trunk/Source/zcprw.asm Normal file
View File

@@ -0,0 +1,64 @@
;
;==================================================================================================
; WRAPPER FOR ZCPR FOR N8VEM PROJECT
; WAYNE WARTHEN - 2011-01-10
;==================================================================================================
;
; THE FOLLOWING MACROS DO THE HEAVY LIFTING TO MAKE THE ZCPR SOURCE
; COMPATIBLE WITH TASM
;
;#DEFINE DS .DS
;#DEFINE ds .ds
#DEFINE DS .FILL
#DEFINE ds .fill
#DEFINE TITLE .TITLE
#DEFINE title .title
#DEFINE EQU .EQU
#define equ .equ
#DEFINE NAME \;
#DEFINE PAGE .PAGE
#DEFINE page .page
#DEFINE CSEG .CSEG
#DEFINE ORG .ORG
#DEFINE org .org
#DEFINE END .END
#DEFINE IF .IF
#DEFINE if .if
#DEFINE ELSE .ELSE
#DEFINE else .else
#DEFINE ENDIF .ENDIF
#DEFINE endif .endif
#DEFINE DEFB .DB
#DEFINE defb .db
#DEFINE DEFW .DW
#DEFINE defw .dw
#DEFINE DEFL .EQU
#DEFINE defl .equ
#DEFINE DEFS .DB
#DEFINE defs .db
#DEFINE DW .DW
#DEFINE dw .dw
#DEFINE DB .DB
#DEFINE db .db
#DEFINE END .END
#DEFINE end .end
;
; Add some Z80 instructions
;
#ADDINSTR JR * 18 2 R1 1
#ADDINSTR JRC * 38 2 R1 1
#ADDINSTR JRNC * 30 2 R1 1
#ADDINSTR JRZ * 28 2 R1 1
#ADDINSTR JRNZ * 20 2 R1 1
#ADDINSTR LDIR "" B0ED 2 NOP 1
#ADDINSTR DJNZ * 10 2 R1 1
#ADDINSTR LDED * 5BED 4 NOP 1
#ADDINSTR SDED * 53ED 4 NOP 1
;
; NOW INCLUDE THE MAIN SOURCE
;
#INCLUDE "zcpr.asm"
;
.FILL ((CPRLOC + 0800H) - $),055H
;
.END

3174
trunk/Source/zsdos-gp.z80 Normal file

File diff suppressed because it is too large Load Diff

39
trunk/Source/zsdos.asm Normal file
View File

@@ -0,0 +1,39 @@
;
;==================================================================================================
; WRAPPER FOR ZSDOS/ZDDOS FOR N8VEM PROJECT
; WAYNE WARTHEN - 2011-01-09
;==================================================================================================
;
; THE FOLLOWING MACROS DO THE HEAVY LIFTING TO MAKE THE ZSDOS SOURCE
; COMPATIBLE WITH TASM
;
#DEFINE EQU .EQU
#DEFINE NAME \;
#DEFINE PAGE .PAGE
#DEFINE CSEG .CSEG
#DEFINE DSEG .DSEG
#DEFINE ORG .ORG
#DEFINE END .END
#DEFINE IF .IF
#DEFINE ELSE .ELSE
#DEFINE ENDIF .ENDIF
#DEFINE DEFB .DB
#DEFINE DEFW .DW
#DEFINE FILL .FILL
;
; ZSDOS USES A .LIB FILE FOR CONFIGURATION. SINCE TASM HAS NO SUPPORT FOR THIS
; WE JUST INCLUDE THE FILE HERE.
;
#DEFINE BLD_ZSDOS11 TRUE ; TRUE BUILDS VER 1.1, FALSE BUILDS VER 1.2
#DEFINE BLD_ZS TRUE ; TRUE FOR ZSDOS BUILD, FALSE FOR ZDDOS BUILD
#DEFINE BLD_ROM FALSE
#INCLUDE "zsdos.lib"
;
;
; ESTABLISH STARTING ADDRESS FOR ZSDOS
;
.ORG 0D800H
;
; NOW INCLUDE THE MAIN SOURCE
;
#INCLUDE "zsdos-gp.z80"

185
trunk/Source/zsdos.lib Normal file
View File

@@ -0,0 +1,185 @@
;
; WW - CUSTOMIZED FOR N8VEM PROJECT
;
;.....
; ZSDOS Customization. -HFB, 18 Sept 1987
; revised 07/17/88 CWC
FALSE .EQU 0
TRUE .EQU ~FALSE
; Set these conditionals before assembly
;****************************************************************************
; In the General Public Release version, we have included an equate which
; controls an additional unreleased fix (which only Howard Goldstein found).
; If the following equate is set TRUE, a version 1.1 BDOS will be produced
; which will require no changes to any released utilities. If set to FALSE,
; a version 1.2 BDOS will result, and many support utility libraries and
; overlays will need to be revised to make them function properly. HFB
;WW - NOW USES BLD_ZSDOS11 TO INHERIT SETTING FROM WRAPPER
ZSDOS11 .EQU BLD_ZSDOS11 ; Set True for Ver 1.1, False for 1.2
;****************************************************************************
;WW - NOW USES BLD_ZS TO INHERIT SETTING FROM WRAPPER
ZS .EQU BLD_ZS ; Set True for ZSDOS, False for ZDDOS
;----------
; Select assembler for ZSDOS. Any modifications to source code must
; support these assemblers at minimum.
SLR .EQU FALSE ; SLR Z80ASM or SLR180 Assembler, OR ZMAC
ZAS .EQU TRUE ; MITEK/ECHELON ZAS Assembler (3.0 or later)
IF ZAS
NAME DOS
ENDIF
IF SLR
.Z80
NAME ('DOS')
ENDIF
IF ZAS & ZS
IF ZSDOS11
.TITLE 'ZSDOS 1.1 - Enhanced CP/M BDOS Replacement'
ELSE ;~Zsdos11
.TITLE 'ZSDOS 1.2 - Enhanced CP/M BDOS Replacement'
ENDIF ;Zsdos11
ENDIF
IF ZAS & (~ZS)
IF ZSDOS11
.TITLE 'ZDDOS 1.1 - Enhanced CP/M BDOS Replacement w/DS'
ELSE ;~Zsdos11
.TITLE 'ZDDOS 1.2 - Enhanced CP/M BDOS Replacement w/DS'
ENDIF ;Zsdos11
ENDIF
IF SLR & ZS
IF ZSDOS11
TITLE "ZSDOS 1.1 - Enhanced CP/M BDOS Replacement"
ELSE ;~Zsdos11
TITLE "ZSDOS 1.2 - Enhanced CP/M BDOS Replacement"
ENDIF ;Zsdos11
ENDIF
IF SLR & (~ZS)
IF ZSDOS11
TITLE "ZDDOS 1.1 - Enhanced CP/M BDOS Replacement w/DS"
ELSE ;~Zsdos11
TITLE "ZDDOS 1.2 - Enhanced CP/M BDOS Replacement w/DS"
ENDIF ;Zsdos11
ENDIF
;----------
; P2DOS introduced a search path feature compatible with that used in
; Richard Conn's ZCPR2 and ZCPR3. If a requested file is not located in
; the currently logged Drive/User, the SEARCH routine will sequentially
; scan along the path until either the file is found or the end of the
; path is reached.
IF ZS
;WW - changed from EQU to #DEFINE to avoid forward reference error in TASM
;PATHAD EQU IPATH ; Set to the desired ZCPR2/3 search path.
#DEFINE PATHAD IPATH
ELSE ; use 0000H to disable path. A short
PATHAD .EQU 00000H ; 3 element internal path is provided
ENDIF ; in ZSDOS. ZDDOS does not use path.
;----------
; The WHEEL byte may be sensed from within ZSDOS by setting the following
; address to that of the ZCPR3 WHEEL byte. A value of 0 disables the WHEEL
; byte sensing.
WHLADR .EQU 00000H ; Set WHEEL byte address (0FDFFH for SB180)
;----------
; Some systems, like the Kaypro 4, only recognize changes between single
; and double-sided disks when the system is warm booted; BDOS Function 13
; (reset disk) will not work. By adding a "hook" to the BIOS of these mach-
; ines and setting RESDSK to TRUE, BDOS functions 13 and 37 will allow changes
; between single and double-sided disks; very handy for disk housekeeping
; utilities such as NSWP, NULU, and cataloging programs.
; The "hook" is added as follows: Obtain the source to your computer's BIOS.
; Examine the code for WARM BOOT. Somewhere, there should be a call to a rou-
; tine which initializes the disk system after a warm boot, or which detects
; changes between single and double-sided disks. Call this routine DISKINT
; for purposes of discussion. Modify your BIOS's cold boot routine to ini-
; tialize 3 bytes at address SETDSK as "JP DISKINT". The location of SETDSK
; is arbitrary, it may be in your BIOS, or in a reserved spot in CP/M's page 0.
RESDSK .EQU FALSE
IF RESDSK
SETDSK .EQU 004BH ; Set to suit your system (bh)
ENDIF ; resdsk (bh)
;----------
; The following equate is used to produce separate code and data segments
; for blowing ZSDOS into ROM. Calling BDOS Function 0 will initialize the
; Data Segment to default values.
ROM .EQU BLD_ROM ; Separate data and code?
;----------
; Many ZSDOS features can be controlled while ZSDOS is running by altering
; the FLAG byte. Set the following equate to your desired configuration based
; on your requirements. The individual bit assignments in the FLAG byte are:
;
; Bit - 7 6 5 4 3 2 1 0
; \ \ \ \ \ \ \ \__Public File Enable (1) / Disable (0)
; \ \ \ \ \ \ \___Public/Path Write Enable (1) / Disable (0)
; \ \ \ \ \ \____Read-Only Enable (1) / Disable (0)
; \ \ \ \ \_____Fast Fixed Disk Relog Enable (1) / Disable (0)
; \ \ \ \______Disk Change Warning Enable (1) / Disable (0)
; \ \ \_______ZCPR2/3 Path Enable (1) / Disable (0)
; \ \________Path without System Enable (1) / Disable (0)
; \_________(Reserved)
FLGBITS .EQU 01101101B ; PUBLIC On, P/P Write Off, R/O On,
; Fast Relog On,Disk Change warning Off,
; Path On, No System path On
; The operation of Bit 6 represents a deviation from the description of PUBLIC
; Files as given in DDJ Article by Bridger Mitchell and Derek McKay of Plu*
; Perfect Systems. The PUBLIC Specification states that Public Files will NOT
; be found by any wildcard reference except when a "?" is in the FCB+0 byte.
; The code here relaxes that requirement as follows: If we are in the same
; user area as the public file, then don't report the file as PUBLIC, but find
; it. This has a nasty side effect - it allows erasing of PUBLIC files if we
; are in the same area. However, these files also show up on the directory
; (they wouldn't otherwise), so at least we should know we're blasting them.
;----------
; Equates for selecting ZSDOS or ZDDOS configurations
; Since much ZSDOS code must be deleted to embed DateStamper in ZDDOS, the
; following flags do the stripping:
; PICKEY - True = Don't save users' DE register
; CTLREN - True = Add ^R Retype line to cons read, False = No ^R
; UNROLL - True = Inline code for shifts, False = collapse into loops
; UPATH - True = Add User path from OS, False = No OS path search
IF ZS
CTLREN .EQU TRUE
UNROLL .EQU TRUE
UPATH .EQU TRUE
PICKEY .EQU FALSE
ELSE
CTLREN .EQU FALSE
UNROLL .EQU FALSE
UPATH .EQU FALSE
PICKEY .EQU FALSE
ENDIF
;----------
; To Use the Named-COMMON aspect of NZCOM and JETLOADER (tm), the BIOS must
; be referenced from the _BIOS_ name. If operating under this scheme, set
; the ZRL equate to TRUE. With the ZRL equate set to FALSE, a standalone
; .REL file will be produced with no external requirements.
ZRL .EQU FALSE ; Set True .ZRL file with COMMON for NZCOM,
; False to produce straight .REL file