Compare commits

...

7 Commits
v2.5 ... v2.5.4

Author SHA1 Message Date
wwarthen
c3352d708c 2014-03-02 02:41:14 +00:00
wwarthen
2e4eb2fb1b Reintegrate wbw -> trunk 2014-03-02 02:37:34 +00:00
wwarthen
63b624fa0c Reintegrate wbw -> trunk 2014-01-21 02:09:03 +00:00
wwarthen
7c547f515a Reintegrate wbw -> trunk 2013-11-22 23:16:39 +00:00
wayne
762f325e10 Fix 2013-09-30 06:05:14 +00:00
wayne
b030913abd Reintegrate wbw -> trunk 2013-09-30 04:44:49 +00:00
wayne
ff5bf3c669 Reintegrate wbw -> trunk 2013-06-25 23:54:23 +00:00
80 changed files with 2524 additions and 438 deletions

View File

@@ -1,16 +1,16 @@
/************************************/
/* applvers.h dwg - 2.5.0.15 */
/* applvers.h dwg - 2.5.4.20 */
/************************************/
#define A_RMJ 2
#define A_RMN 5
#define A_RUP 0
#define A_RTP 16
#define A_RUP 4
#define A_RTP 20
#define A_MONTH 6
#define A_DAY 23
#define A_YEAR 2013
#define A_YR 13
#define A_MONTH 3
#define A_DAY 1
#define A_YEAR 2014
#define A_YR 14
/********************/
/* eof - applvers.h */

View File

@@ -1,16 +1,16 @@
; applvers.lib 3/31/2012 dwg - For RomWBW 2.5.0.14 Release
; applvers.lib 3/31/2012 dwg - For RomWBW 2.5.4.20 Release
A$RMJ equ 2
A$RMN equ 5
A$RUP equ 0
A$RTP equ 16
A$RUP equ 4
A$RTP equ 20
A$MONTH equ 6
A$DAY equ 23
A$YEAR equ 2013
A$MONTH equ 3
A$DAY equ 1
A$YEAR equ 2014
date macro
dat db ' 6/23/2013$'
dat db ' 3/1/2014$'
endm
serial macro

View File

@@ -131,7 +131,7 @@ prtcfg1(pSysCfg)
pCfg->conbaud);
pager();
printf ("Default Video Display: %s, Default Emulation: %s",
VDAName[pCfg->defvda], EmuName[pCfg->defemu]);
VDAName[(pCfg->defvda) >> 4], EmuName[pCfg->defemu]);
pager();
printf ("Current Terminal Type: %s",
TermName[pCfg->termtype]);

View File

@@ -1,3 +1,23 @@
Version 2.5.4
-------------
- WBW: Fixed IOBYTE handling
- WBW: Added Propeller firmware support for PropIO V2
Version 2.5.3
-------------
- WBW: Fixed EXM in DPB for 360K floppy definition (credit to Martin for finding this error)
- WBW: Improved /WAIT trigger performance in PropIO (credit to Marko)
PropIO now seems to be compatible with CPU clock speeds up to 16MHz
- WBW: Corrected the IO base address for PPIDE driver on N8 variants (credit to Arlen Michaels)
Version 2.5.2
-------------
- WBW: Added initial support for RAM Floppy
Version 2.5.1
-------------
- WBW: Fix PPIDE bug
Version 2.5
-----------
- WBW: Implemented CRT driver model (video and keyboard)

View File

@@ -1,5 +1,9 @@
Assembling the RomWBW firmware under Linux.
Note: Updated on 6/25/2013 to eliminate the need for the separate Linux
makefile. The standard makefile now has conditionals to allow it to be
used under Windows of Linux (I hope) --WW
This method has been used under Ubuntu Linux and may have to be adapted for
other distributions. It is a bit more involved than the Windows procedure.
@@ -25,24 +29,17 @@ These are all done from a terminal. (: is end of the command prompt)
1. Go to the RomWBW Source directory.e.g.
:cd /n8vem/RomWBW/current/Source
2. I have included a new makefile called "makefile.linux" in the Source
directory. Rename this to just "makefile". Edit it to suit your targets and
if you have changed the default location for TASM.
:~/RomWBW/current/Source mv makefile.linux makefile
3. The Linux version of TASM can't handle the CR-LF line endings. So from the
2. The Linux version of TASM can't handle the CR-LF line endings. So from the
command prompt use dos2unix to convert all the source files.
:~/RomWBW/current/Source dos2unix -f *.asm *.inc *.z80 *.lib diskdefs
4. You'll have to alter the disk definitions for the cpmtools package to cater
3. You'll have to alter the disk definitions for the cpmtools package to cater
for the new roms. Easiest way is to copy the one given in the source over the
old. This must be done as superuser.
:~/RomWBW/current/Source sudo cp diskdefs /etc/cpmtools/diskdefs
5. From now on it's the same as using the DOS/Windows instructions in Build.txt.
4. From now on it's the same as using the DOS/Windows instructions in Build.txt.
Make any last changes, go to the Source directory and make
:~/RomWBW/current/Source make clean ; make
DGG

Binary file not shown.

Binary file not shown.

View File

@@ -7,7 +7,7 @@ echo which means that local scripts can be run without
echo being signed. This is required to use the RomWBW
echo build process.
echo.
PowerShell -command Write-Host "Your PowerShell ExecutionPolicy is currently (Get-ExecutionPolicy)"
PowerShell -command Write-Host "Your PowerShell ExecutionPolicy is currently set to: `'(Get-ExecutionPolicy)`'"
echo.
echo In order to modify the ExecutionPolicy, this command
echo file *MUST* be run with administrator privileges.
@@ -24,6 +24,6 @@ echo Attempting to change Execution Policy...
echo.
PowerShell Set-ExecutionPolicy RemoteSigned
echo.
PowerShell -command Write-Host "Your new PowerShell ExecutionPolicy is now (Get-ExecutionPolicy)"
PowerShell -command Write-Host "Your new PowerShell ExecutionPolicy is now set to: `'(Get-ExecutionPolicy)`'"
echo.
pause

View File

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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
RomDsk/cfg_n8vem_rf/RTC.COM Normal file

Binary file not shown.

BIN
RomDsk/cfg_n8vem_rf/T5.COM Normal file

Binary file not shown.

BIN
RomDsk/cfg_n8vem_rf/VT3.COM Normal file

Binary file not shown.

BIN
RomDsk/cfg_n8vem_rf/XM.COM Normal file

Binary file not shown.

BIN
RomDsk/cfg_n8vem_rf/XM5.COM Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -108,6 +108,13 @@ DRI CP/M (BDOS & CCP)
- Basic ROM/RAM disk (no floppy/IDE)
- Drives A:=ROM, B:=RAM, C:=HDSK0-00, D:=HDSK0-01, E:=HDSK0-02, F:=HDSK0-03
N8VEM_rf.rom for N8VEM Z80 SBC V1/2 + RAM Flopppy:
- 512KB ROM, 512KB RAM
- 38.4KB serial console baud rate
- Basic ROM/RAM disk (no floppy/IDE)
- RAM Floppy support
- Drives A:=ROM, B:=RAM, C:=RF0, D:=RF1
N8VEM_vdu.rom for N8VEM Z80 SBC V1/V2:
- 512KB ROM, 512KB RAM
- 38.4KB serial console baud rate
@@ -253,6 +260,13 @@ ZSYSTEM (ZSDOS & ZCPR)
- Basic ROM/RAM disk (no floppy/IDE)
- Drives A:=ROM, B:=RAM, C:=HDSK0-00, D:=HDSK0-01, E:=HDSK0-02, F:=HDSK0-03
N8VEM_rf_z.rom for N8VEM Z80 SBC V1/2 + RAM Flopppy:
- 512KB ROM, 512KB RAM
- 38.4KB serial console baud rate
- Basic ROM/RAM disk (no floppy/IDE)
- RAM Floppy support
- Drives A:=ROM, B:=RAM, C:=RF0, D:=RF1
ZETA_std_z.rom for Zeta Z80 SBC:
- 512KB ROM, 512KB RAM
- 38.4KB serial console baud rate

View File

@@ -46,7 +46,7 @@ WBOOTE JP WBOOT ; #1 - WARM START
; easily located by external programs. They transfger control to routines
; that are located somewhere within the main section of the CBIOS.
;
JP BNKSEL ; #17 - SEL. RAM BANK FOR LOW32K (obsolete, use HBIOS)
JP PANIC ; #17 - SEL. RAM BANK FOR LOW32K (deprecated, use HBIOS)
JP GETDSK ; #18 - Get Disk Info (device/unit/lu)
JP SETDSK ; #19 - Set Disk Into (device/unit/lu)
JP GETINFO ; #20 - Get BIOS Info Base Ptr
@@ -101,15 +101,13 @@ WBOOT:
IM 1
;
LD SP,ISTACK ; STACK FOR INITIALIZATION
;
; RELOAD COMMAND PROCESSOR FROM CACHE
LD A,1 ; SELECT RAM BANK 1
CALL RAMPG ; DO IT
LD HL,0800H ; LOCATION IN RAM BANK 1 OF COMMAND PROCESSOR CACHE
LD DE,CPM_LOC ; LOCATION OF ACTIVE COMMAND PROCESSOR
LD BC,CCPSIZ ; SIZE OF COMMAND PROCESSOR
LDIR ; COPY
CALL RAMPGZ ; RESTORE RAM PAGE 0
;
LD B,BF_SYSBNKCPY ; B = FUNCTION = BANK COPY
LD C,$81 ; C = BANK = RAM BANK 1
LD HL,$0800 ; SOURCE = $800, CCP CACHE IN RAM BANK 1
LD DE,CPM_LOC ; DESTINATION IS LOCATION OF ACTIVE CCP
LD IX,CCPSIZ ; SIZE OF CCP
RST 08
;
; FALL THRU TO INVOKE CP/M
;
@@ -378,12 +376,6 @@ READWRITE:
JR BLKRW
;
;__________________________________________________________________________________________________
BNKSEL:
;
LD A,C
JP RAMPG
;
;__________________________________________________________________________________________________
GETDSK:
;
; INPUT: C=DRIVE # (0=A, 1=B, ... P=16)
@@ -1433,6 +1425,14 @@ SIZ_HDSK_DPH .EQU $ - ORG_HDSK_DPH
.ECHO SIZ_HDSK_DPH
.ECHO " bytes.\n"
#ENDIF
#IF (RFENABLE)
ORG_RF_DPH .EQU $
#INCLUDE "rf_dph.asm"
SIZ_RF_DPH .EQU $ - ORG_RF_DPH
.ECHO "RF DPH occupies "
.ECHO SIZ_RF_DPH
.ECHO " bytes.\n"
#ENDIF
;
; DISK PARAMETER BLOCKS
;
@@ -1461,7 +1461,7 @@ DPB_ROM:
.DW 256 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
#IF (ROMBLKS < 256)
#IF ((ROMBLKS - 1) < 256)
.DB 1 ; EXM: EXTENT MASK
#ELSE
.DB 0 ; EXM: EXTENT MASK
@@ -1483,7 +1483,7 @@ DPB_RAM:
.DW 256 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
#IF (RAMBLKS < 256)
#IF ((RAMBLKS - 1) < 256)
.DB 1 ; EXM: EXTENT MASK
#ELSE
.DB 0 ; EXM: EXTENT MASK
@@ -1496,6 +1496,24 @@ DPB_RAM:
.DW 0 ; OFF: RESERVED TRACKS = 0 TRK
;__________________________________________________________________________________________________
;
; 4MB RAM FLOPPY DRIVE, 32 TRKS, 1024 SECS/TRK, 128 BYTES/SEC
; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256
; SEC/TRK ENGINEERED SO THAT AFTER DEBLOCKING, SECTOR NUMBER OCCUPIES 1 BYTE (0-255)
;
.DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128)
DPB_RF:
.DW 1024 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 0 ; EXM: EXTENT MASK
.DW 2047 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = (4MB / 2K BLS) - 1 = 2047
.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 0 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
.DW 0 ; OFF: RESERVED TRACKS = 0 TRK
;__________________________________________________________________________________________________
;
; 8MB HARD DISK DRIVE, 65 TRKS, 1024 SECS/TRK, 128 BYTES/SEC
; BLOCKSIZE (BLS) = 4K, DIRECTORY ENTRIES = 128
; SEC/TRK ENGINEERED SO THAT AFTER DEBLOCKING, SECTOR NUMBER OCCUPIES 1 BYTE (0-255)
@@ -1556,7 +1574,7 @@ DPB_FD360:
.DW 36 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK
.DB 0 ; EXM: EXTENT MASK
.DB 1 ; 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
@@ -1632,6 +1650,7 @@ DPB_MAP:
.DW DPB_FD360 ; MID_FD360
.DW DPB_FD120 ; MID_FD120
.DW DPB_FD111 ; MID_FD111
.DW DPB_RF ; MID_RF
;
DPB_CNT .EQU ($ - DPB_MAP) / 2
;
@@ -1707,6 +1726,10 @@ DPH_MAP:
.DW HDSKDPH2
.DW HDSKDPH3
#ENDIF
#IF (DSKMAP == DM_RF)
.DW RFDPH0
.DW RFDPH1
#ENDIF
#IF (DSKMAP != DM_ROM)
.DW MDDPH0
#ENDIF
@@ -1753,6 +1776,10 @@ DPH_MAP:
.DW HDSKDPH2
.DW HDSKDPH3
#ENDIF
#IF ((DSKMAP != DM_RF) & RFENABLE)
.DW RFDPH0
.DW RFDPH1
#ENDIF
#ENDIF ; CUSTOM_DPHMAP
;
DPH_CNT .EQU ($ - DPH_MAP) / 2
@@ -1855,9 +1882,6 @@ INIT:
; SETUP A TEMP STACK IN UPPER 32K
LD SP,ISTACK ; STACK FOR INITIALIZATION
; ENSURE RAM PAGE ZERO ACTIVE
CALL RAMPGZ
; THIS INIT CODE WILL BE OVERLAID, SO WE ARE GOING
; TO MODIFY THE BOOT ENTRY POINT TO CAUSE A PANIC
; TO EASILY IDENTIFY IF SOMETHING TRIES TO INVOKE
@@ -1892,14 +1916,13 @@ INIT1:
CALL WRITESTR
CALL NEWLINE
; SAVE COMMAND PROCESSOR TO CACHE IN RAM1
LD A,1
CALL RAMPG
LD HL,CPM_LOC ; LOCATION OF ACTIVE COMMAND PROCESSOR
LD DE,0800H ; LOCATION IN RAM 1 OF COMMAND PROCESSOR CACHE
LD BC,CCPSIZ ; SIZE OF COMMAND PROCESSOR
LDIR
CALL RAMPGZ
; SAVE COMMAND PROCESSOR TO CACHE IN RAM BANK 1
LD B,BF_SYSBNKCPY ; B = FUNCTION = BANK COPY
LD C,$81 ; C = BANK = RAM BANK 1
LD HL,CPM_LOC ; SOURCE IS LOCATION OF ACTIVE CCP
LD DE,$0800 ; DESTINATION = $800, CCP CACHE IN RAM BANK 1
LD IX,CCPSIZ ; SIZE OF CCP
RST 08
; SYSTEM INITIALIZATION
CALL BLKRES ; RESET DISK (DE)BLOCKING ALGORITHM

View File

@@ -55,7 +55,7 @@ IDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!
IDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
PPIDEENABLE .EQU FALSE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
PPIDEIOB .EQU $60 ; PPIDE IOBASE
PPIDEIOB .EQU $80 ; PPIDE IOBASE
PPIDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPIDEENABLE = TRUE)
PPIDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
PPIDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
@@ -83,6 +83,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU TRUE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -55,7 +55,7 @@ IDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!
IDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
PPIDEENABLE .EQU FALSE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
PPIDEIOB .EQU $60 ; PPIDE IOBASE
PPIDEIOB .EQU $80 ; PPIDE IOBASE
PPIDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPIDEENABLE = TRUE)
PPIDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
PPIDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
@@ -83,6 +83,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU TRUE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -91,6 +91,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -87,6 +87,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU TRUE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -87,6 +87,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -87,6 +87,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -87,6 +87,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU TRUE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -87,6 +87,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -87,6 +87,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -91,6 +91,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -87,6 +87,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -87,6 +87,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -87,6 +87,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

103
Source/config_n8vem_rf.asm Normal file
View File

@@ -0,0 +1,103 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
BOOTCON .EQU CIODEV_UART ; CONSOLE DEVICE FOR BOOT MESSAGES (MUST BE PRIMARY SERIAL PORT FOR PLATFORM)
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
CONBAUD .EQU 38400 ; BAUDRATE FOR CONSOLE DURING HARDWARE INIT
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...)
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
;
DSKMAP .EQU DM_RAM ; DM_ROM, DM_RAM, DM_FD, DM_IDE, DM_PPIDE, DM_SD, DM_PRPSD, DM_PPPSD, DM_HDSK
;
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)
UARTCNT .EQU 1 ; NUMBER OF UARTS
UART0IOB .EQU $68 ; UART0 IOBASE
UART0BAUD .EQU CONBAUD ; UART0 BAUDRATE
UART0FIFO .EQU TRUE ; UART0 TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UART0AFC .EQU FALSE ; UART0 TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT
ASCI0BAUD .EQU CONBAUD ; ASCI0 BAUDRATE (IMPLEMENTED BY Z180_CNTLB0)
ASCI1BAUD .EQU CONBAUD ; ASCI1 BAUDRATE (IMPLEMENTED BY Z180_CNTLB1)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
WRTCACHE .EQU TRUE ; ENABLE WRITE CACHING IN CBIOS (DE)BLOCKING ALGORITHM
DSKTRACE .EQU FALSE ; ENABLE TRACING OF CBIOS DISK FUNCTION CALLS
;
MDENABLE .EQU TRUE ; TRUE FOR ROM/RAM DISK SUPPORT (ALMOST ALWAYS WANT THIS ENABLED)
;
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)
PPIDEIOB .EQU $60 ; PPIDE IOBASE
PPIDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPIDEENABLE = TRUE)
PPIDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
PPIDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
PPIDESLOW .EQU FALSE ; ADD DELAYS TO HELP PROBLEMATIC HARDWARE (TRY THIS IF PPIDE IS UNRELIABLE)
;
SDENABLE .EQU FALSE ; TRUE FOR SD SUPPORT
SDMODE .EQU SDMODE_JUHA ; SDMODE_JUHA, SDMODE_CSIO, SDMODE_UART, SDMODE_PPI, SDMODE_DSD
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIOFAST .EQU FALSE ; TABLE-DRIVEN BIT INVERTER
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
PRPSDENABLE .EQU TRUE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
PRPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PRPSDENABLE = TRUE)
PRPSDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
PRPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO)
;
PPPENABLE .EQU FALSE ; TRUE FOR PARPORTPROP SUPPORT
PPPSDENABLE .EQU TRUE ; TRUE FOR PARPORTPROP SD SUPPORT
PPPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPPENABLE = TRUE)
PPPSDCAPACITY .EQU 64 ; CAPACITY OF PPP SD DEVICE (IN MB)
PPPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO)
;
HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
RFENABLE .EQU TRUE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242
KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE = TRUE)
;
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT

View File

@@ -87,6 +87,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -87,6 +87,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -87,6 +87,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU TRUE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -0,0 +1,103 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR ZETA W/ PPISD
;==================================================================================================
;
; BUILD CONFIGURATION OPTIONS
;
CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
BOOTCON .EQU CIODEV_UART ; CONSOLE DEVICE FOR BOOT MESSAGES (MUST BE PRIMARY SERIAL PORT FOR PLATFORM)
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
CONBAUD .EQU 38400 ; BAUDRATE FOR CONSOLE DURING HARDWARE INIT
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...)
TERMTYPE .EQU TERM_ANSI ; TERM_TTY=0, TERM_ANSI=1, TERM_WYSE=2
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
;
DSKMAP .EQU DM_RAM ; DM_ROM, DM_RAM, DM_FD, DM_IDE, DM_PPIDE, DM_SD, DM_PRPSD, DM_PPPSD, DM_HDSK
;
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)
UARTCNT .EQU 1 ; NUMBER OF UARTS
UART0IOB .EQU $68 ; UART0 IOBASE
UART0BAUD .EQU CONBAUD ; UART0 BAUDRATE
UART0FIFO .EQU TRUE ; UART0 TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UART0AFC .EQU FALSE ; UART0 TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT
ASCI0BAUD .EQU CONBAUD ; ASCI0 BAUDRATE (IMPLEMENTED BY Z180_CNTLB0)
ASCI1BAUD .EQU CONBAUD ; ASCI1 BAUDRATE (IMPLEMENTED BY Z180_CNTLB1)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
WRTCACHE .EQU TRUE ; ENABLE WRITE CACHING IN CBIOS (DE)BLOCKING ALGORITHM
DSKTRACE .EQU FALSE ; ENABLE TRACING OF CBIOS DISK FUNCTION CALLS
;
MDENABLE .EQU TRUE ; TRUE FOR ROM/RAM DISK SUPPORT (ALMOST ALWAYS WANT THIS ENABLED)
;
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)
PPIDEIOB .EQU $60 ; PPIDE IOBASE
PPIDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPIDEENABLE = TRUE)
PPIDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
PPIDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
PPIDESLOW .EQU FALSE ; ADD DELAYS TO HELP PROBLEMATIC HARDWARE (TRY THIS IF PPIDE IS UNRELIABLE)
;
SDENABLE .EQU TRUE ; TRUE FOR SD SUPPORT
SDMODE .EQU SDMODE_PPI ; SDMODE_JUHA, SDMODE_CSIO, SDMODE_UART, SDMODE_PPI, SDMODE_DSD
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
SDCSIOFAST .EQU FALSE ; TABLE-DRIVEN BIT INVERTER
;
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
PRPSDENABLE .EQU TRUE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
PRPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PRPSDENABLE = TRUE)
PRPSDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
PRPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO)
;
PPPENABLE .EQU FALSE ; TRUE FOR PARPORTPROP SUPPORT
PPPSDENABLE .EQU TRUE ; TRUE FOR PARPORTPROP SD SUPPORT
PPPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPPENABLE = TRUE)
PPPSDCAPACITY .EQU 64 ; CAPACITY OF PPP SD DEVICE (IN MB)
PPPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO)
;
HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242
KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE = TRUE)
;
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT

View File

@@ -87,6 +87,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -87,6 +87,8 @@ 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)
;
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
;
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242

View File

@@ -266,24 +266,24 @@ diskdef interak
sectrk 20
blocksize 4096
maxdir 256
skew 1
skew 0
boottrk 2
os 2.2
end
# For 512KB ROM, less 32K for system image
# For 512KB ROM, less 64K reserved for system
diskdef rom512KB
seclen 128
tracks 14
sectrk 256
blocksize 2048
maxdir 256
skew 1
skew 0
boottrk 0
os 2.2
end
# For 1024KB ROM, less 32K for system image
# For 1024KB ROM, less 64K reserved for system
diskdef rom1024KB
seclen 128
tracks 30
@@ -295,47 +295,95 @@ diskdef rom1024KB
os 2.2
end
# For N8VEM mass storage (4 raw partitions)
diskdef hd0
# N8VEM Hard Disks, hd0 - hd3 are first 4 slices of disk
diskdef n8vem_hd0
seclen 512
tracks 65
sectrk 256
blocksize 4096
maxdir 512
skew 1
skew 0
boottrk 1
os 2.2
end
diskdef hd1
diskdef n8vem_hd1
seclen 512
tracks 130
sectrk 256
blocksize 4096
maxdir 512
skew 1
skew 0
boottrk 66
os 2.2
end
diskdef hd2
diskdef n8vem_hd2
seclen 512
tracks 195
sectrk 256
blocksize 4096
maxdir 512
skew 1
skew 0
boottrk 131
os 2.2
end
diskdef hd3
diskdef n8vem_hd3
seclen 512
tracks 260
sectrk 256
blocksize 4096
maxdir 512
skew 1
skew 0
boottrk 196
os 2.2
end
# N8VEM 720K floppy media
diskdef n8vem_fd720
seclen 512
tracks 160
sectrk 9
blocksize 2048
maxdir 128
skew 0
boottrk 4
os 2.2
end
# N8VEM 1.44M floppy media
diskdef n8vem_fd144
seclen 512
tracks 160
sectrk 18
blocksize 2048
maxdir 256
skew 0
boottrk 2
os 2.2
end
# N8VEM 360K floppy media
diskdef n8vem_fd360
seclen 512
tracks 80
sectrk 9
blocksize 2048
maxdir 128
skew 0
boottrk 4
os 2.2
end
# N8VEM 1.20M floppy media
diskdef n8vem_fd120
seclen 512
tracks 160
sectrk 15
blocksize 2048
maxdir 256
skew 0
boottrk 2
os 2.2
end

View File

@@ -149,6 +149,9 @@ HB_INITTBL:
#IF (HDSKENABLE)
.DW HDSK_INIT
#ENDIF
#IF (RFENABLE)
.DW RF_INIT
#ENDIF
#IF (PPKENABLE)
.DW PPK_INIT
#ENDIF
@@ -326,6 +329,10 @@ DIO_DISPATCH1:
#IF (HDSKENABLE)
CP DIODEV_HDSK
JP Z,HDSK_DISPATCH
#ENDIF
#IF (RFENABLE)
CP DIODEV_RF
JP Z,RF_DISPATCH
#ENDIF
CALL PANIC
;
@@ -734,6 +741,15 @@ SIZ_HDSK .EQU $ - ORG_HDSK
.ECHO " bytes.\n"
#ENDIF
#IF (RFENABLE)
ORG_RF .EQU $
#INCLUDE "rf.asm"
SIZ_RF .EQU $ - ORG_RF
.ECHO "RF occupies "
.ECHO SIZ_RF
.ECHO " bytes.\n"
#ENDIF
#IF (PPKENABLE)
ORG_PPK .EQU $
#INCLUDE "ppk.asm"

View File

@@ -524,7 +524,7 @@ dmloop:
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
jp nz,dmdone ; error, skip this drive
ld (BL_TMPLU),de ; save lu for later
ld a,b ; device/unit into a for matching below
@@ -570,6 +570,10 @@ dmloop:
cp DIODEV_HDSK ; SIMH HDSK
jr z,dmprt
ld de,str_devrf
cp DIODEV_RF ; RAM FLOPPY
jr z,dmprt
jr dmdone
dmprt:
@@ -770,6 +774,7 @@ str_devsd .DB "SD$"
str_devprpsd .DB "PRPSD$"
str_devpppsd .DB "PPPSD$"
str_devhdsk .DB "HDSK$"
str_devrf .DB "RF$"
#ENDIF
;
;==================================================================================================

View File

@@ -99,8 +99,12 @@ ifndef ROMNAME
ROMNAME := $(PLATFORM)_$(CONFIG)
endif
ifndef "windir"
CPMTOOLSPATH := ../tools/cpmtools
CPMCP := $(CPMTOOLSPATH)/cpmcp.exe
else
CPMCP := /usr/bin/cpmcp
endif
ROMDSKFILES := ../RomDsk/$(SYS)_$(ROMSIZE)KB/*.* ../RomDsk/cfg_$(PLATFORM)_$(CONFIG)/*.* ../Apps/Output/*.*
@@ -112,11 +116,16 @@ DOSBIN := zsdos.bin
CPBIN := zcprw.bin
endif
OUTDIR := ..\Output
OUTDIR := ../Output
ifndef "windir"
TASMPATH := ../tools/tasm32
TASM := $(TASMPATH)/tasm.exe
TASMTABS := $(TASMPATH)
else
TASM := /usr/local/bin/tasm
TASMTABS := /usr/local/lib
endif
export TASMTABS
ASMOPT80 := -t$(CPU) -g3
@@ -147,8 +156,9 @@ $(error Usage: make PLATFORM=[N8VEM|ZETA|N8|S2I|S100] CONFIG=<config> ROMSIZE=[5
endif
endif
all: $(OUTDIR)\$(ROMNAME).rom $(OUTDIR)\$(ROMNAME).sys $(OUTDIR)\$(ROMNAME).com
all: $(OUTDIR)/$(ROMNAME).rom $(OUTDIR)/$(ROMNAME).sys $(OUTDIR)/$(ROMNAME).com
ifndef "windir"
build.inc:
echo ; >$@
echo ; RomWBW Configured for $(PLATFORM) $(CONFIG), %date:~4,10% %time% >>$@
@@ -168,6 +178,28 @@ build.inc:
echo ; >>$@
echo #INCLUDE "config_$(PLATFORM)_$(CONFIG).asm" >>$@
echo ; >>$@
else
echo ';' >$@
echo -n '; RomWBW Configured for '$(CONFIG)'' >>$@
date >> $@
echo ';' >>$@
echo -n '#DEFINE TIMESTAMP "' >>$@
date '+%Y %m %d %H%M"' >>$@
echo ';' >>$@
echo '; INCLUDE PLATFORM SPECIFIC DEVICE DEFINITIONS' >>$@
echo ';' >>$@
echo 'ROMSIZE .EQU '$(ROMSIZE)'' >>$@
echo 'PLATFORM .EQU PLT_'$(PLATFORM)'' >>$@
echo '#IF (PLATFORM == PLT_S100)' >>$@
echo ' #INCLUDE "std-s100.inc"' >>$@
echo '#ELSE' >>$@
echo ' #INCLUDE "std-n8vem.inc"' >>$@
echo '#ENDIF' >>$@
echo ';' >>$@
echo '#INCLUDE "config_'$(PLATFORM)'_'$(CONFIG)'.asm"' >>$@
echo ';' >>$@
endif
bootrom.bin : bootrom.asm std.asm build.inc ver.inc
$(TASM) $(ASMOPT80) $< $@
@@ -192,27 +224,55 @@ 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),+,$(^)) $@
ifndef "windir"
copy /B $(subst $(SPACE),+,$(^)) "$@"
else
cat $(CPBIN) $(DOSBIN) cbios.bin >>$@
endif
rom0.bin: pgzero.bin bootrom.bin syscfg.bin loader.bin romfill.bin dbgmon.bin os.bin hbfill.bin
copy /B $(subst $(SPACE),+,$(^)) $@
ifndef "windir"
copy /B $(subst $(SPACE),+,$(^)) "$@"
else
cat pgzero.bin bootrom.bin syscfg.bin loader.bin romfill.bin dbgmon.bin os.bin hbfill.bin >>$@
endif
rom1.bin: pgzero.bin bootrom.bin syscfg.bin loader.bin hbios.bin
copy /B $(subst $(SPACE),+,$(^)) $@
ifndef "windir"
copy /B $(subst $(SPACE),+,$(^)) "$@"
else
cat pgzero.bin bootrom.bin syscfg.bin loader.bin hbios.bin >>$@
endif
$(OUTDIR)\$(ROMNAME).rom: rom0.bin rom1.bin $(ROMDISKFILES) $(OUTDIR)\$(ROMNAME).sys
$(OUTDIR)/$(ROMNAME).rom: rom0.bin rom1.bin $(ROMDISKFILES) $(OUTDIR)/$(ROMNAME).sys
ifndef "windir"
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 $@
copy /B rom0.bin+rom1.bin+RomDisk.tmp "$@"
else
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 >>$@
endif
$(OUTDIR)\$(ROMNAME).com: bootapp.bin syscfg.bin loader.bin hbios.bin dbgmon.bin os.bin
copy /B $(subst $(SPACE),+,$(^)) $@
$(OUTDIR)/$(ROMNAME).com: bootapp.bin syscfg.bin loader.bin hbios.bin dbgmon.bin os.bin
ifndef "windir"
copy /B $(subst $(SPACE),+,$(^)) "$@"
else
cat bootapp.bin syscfg.bin loader.bin hbios.bin dbgmon.bin os.bin >>$@
endif
$(OUTDIR)\$(ROMNAME).sys: prefix.bin os.bin
copy /B $(subst $(SPACE),+,$(^)) $@
$(OUTDIR)/$(ROMNAME).sys: prefix.bin os.bin
ifndef "windir"
copy /B $(subst $(SPACE),+,$(^)) "$@"
else
cat prefix.bin os.bin >>$@
endif
clean:
ifndef "windir"
if exist *.bin del *.bin
if exist *.com del *.com
if exist *.img del *.img
@@ -221,4 +281,9 @@ clean:
if exist *.exp del *.exp
if exist *.tmp del *.tmp
if exist build.inc del build.inc
if exist $(OUTDIR)\*.* erase /Q $(OUTDIR)\*.*
if exist "$(OUTDIR)/*.*" erase /Q "$(OUTDIR)/*.*"
else
rm -f *.bin *.com *.img *.rom *.lst *.exp *.tmp
rm -f build.inc
rm -f $(OUTDIR)/*.*
endif

View File

@@ -1,206 +0,0 @@
#
# 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_dph.asm ide_dph.asm ppide_dph.asm sd_dph.asm prp_dph.asm ppp_dph.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)/*.*

View File

@@ -21,12 +21,12 @@
IDELSB .EQU PPIDEIOB + 0 ; LSB
IDEMSB .EQU PPIDEIOB + 1 ; MSB
IDECTL .EQU PPIDEIOB + 2 ; CONTROL SIGNALS
PPI1CONT .EQU PPIDEIOB + 3 ; CONTROL BYTE PPI 82C55
PPICTL .EQU PPIDEIOB + 3 ; PPI (8255) CONTROL PORT
;
; 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
RD_IDE_8255 .EQU %10010010 ; IDE_8255_CTL OUT, IDE_8255_LSB/MSB INPUT
WR_IDE_8255 .EQU %10000000 ; 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
@@ -34,14 +34,14 @@ WR_IDE_8255 .EQU 10000000B ; ALL THREE PORTS OUTPUT
; 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
PPIDE_A0_LINE .EQU $01 ; DIRECT FROM 8255 TO IDE INTERFACE
PPIDE_A1_LINE .EQU $02 ; DIRECT FROM 8255 TO IDE INTERFACE
PPIDE_A2_LINE .EQU $04 ; DIRECT FROM 8255 TO IDE INTERFACE
PPIDE_CS0_LINE .EQU $08 ; INVERTER BETWEEN 8255 AND IDE INTERFACE
PPIDE_CS1_LINE .EQU $10 ; INVERTER BETWEEN 8255 AND IDE INTERFACE
PPIDE_WR_LINE .EQU $20 ; INVERTER BETWEEN 8255 AND IDE INTERFACE
PPIDE_RD_LINE .EQU $40 ; INVERTER BETWEEN 8255 AND IDE INTERFACE
PPIDE_RST_LINE .EQU $80 ; INVERTER BETWEEN 8255 AND IDE INTERFACE
;
;------------------------------------------------------------------
; MORE SYMBOLIC CONSTANTS... THESE SHOULD NOT BE CHANGED, UNLESS OF
@@ -66,24 +66,24 @@ PPIDE_ASTTS .EQU PPIDE_CS1_LINE + PPIDE_A2_LINE + PPIDE_A1_LINE + PPIDE_A0_LI
;
; 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
PPIDE_CMDRECAL .EQU $10
PPIDE_CMDREAD .EQU $20
PPIDE_CMDWRITE .EQU $30
PPIDE_CMDINIT .EQU $91
PPIDE_CMDID .EQU $EC
PPIDE_CMDSPINDOWN .EQU $E0
PPIDE_CMDSPINUP .EQU $E1
PPIDE_CMDSETFEAT .EQU $EF
;
PPIDERC_OK .EQU 0
PPIDERC_CMDERR .EQU 1
PPIDERC_RDYTO .EQU 2
PPIDERC_BUFTO .EQU 3
PPIDE_RCOK .EQU 0
PPIDE_RCCMDERR .EQU 1
PPIDE_RCRDYTO .EQU 2
PPIDE_RCBUFTO .EQU 3
;
; UNIT CONFIGURATION
;
PPIDE0_DEVICE .DB 11100000B ; LBA, MASTER DEVICE
PPIDE1_DEVICE .DB 11110000B ; LBA, SLAVE DEVICE
PPIDE_UNIT0 .DB %11100000 ; LBA, MASTER DEVICE
PPIDE_UNIT1 .DB %11110000 ; LBA, SLAVE DEVICE
;
;
;
@@ -100,17 +100,21 @@ PPIDE_DISPATCH:
CALL PANIC
;
PPIDE_RD:
JP PPIDE_XREAD
LD A,PPIDE_CMDREAD
LD (PPIDEP_CMD),A
JP PPIDE_RW
;
PPIDE_WR:
JP PPIDE_XWRITE
LD A,PPIDE_CMDWRITE
LD (PPIDEP_CMD),A
JP PPIDE_RW
;
PPIDE_ST:
JP PPIDE_STATUS
LD A,(PPIDE_STAT) ; LOAD STATUS
OR A ; SET FLAGS
RET
;
PPIDE_MED:
JP PPIDE_MEDIA
;
; PPIDE_MEDIA
;
PPIDE_MEDIA:
LD A,MID_HD
RET
;
@@ -121,6 +125,9 @@ PPIDE_INIT:
LD A,IDELSB
CALL PRTHEXBYTE
PRTS(" UNITS=2$")
#IF (PPIDE8BIT)
PRTS(" 8BIT$")
#ENDIF
#IF (PPIDESLOW)
PRTS(" SLOW$")
#ENDIF
@@ -132,59 +139,22 @@ PPIDE_INIT:
;
;
;
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,PPIDE_FEATURE ; IDE FEATURE REGISTER
LD A,01H ; VALUE := 1
CALL PPIDE_WRITE ; DO IT
LD C,PPIDE_COMMAND ; IDE COMMAND REGISTER
LD A,PPIDECMD_SETFEAT ; SET FEATURE
CALL PPIDE_WRITE ; DO IT
CALL PPIDE_WAITRDY
JP NC,PPIDE_ERR
CALL PPIDE_CHKERR ; CHECK FOR ERRORS
JP NC,PPIDE_ERR
#IF (PPIDETRACE >= 2)
CALL PPIDE_PRT
#ENDIF
#ENDIF
; NEED TO CHECK STATUS HERE!!!
PPIDE_RW0:
; 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
CALL PPIDE_WAITRDY ; WAIT FOR DRIVE READY
JP NC,PPIDE_ERR
CALL PPIDE_SETUP ; SETUP CYL, TRK, HEAD
@@ -199,7 +169,7 @@ PPIDE_RW0:
JP NC,PPIDE_ERR
LD A,(PPIDEP_CMD) ; DISPATCH TO READ OR WRITE SPECIFIC LOGIC
CP PPIDECMD_WRITE
CP PPIDE_CMDWRITE
JP Z,PPIDE_RW1
CALL PPIDE_BUFRD ; READ BUFFER
@@ -238,17 +208,55 @@ PPIDE_OK:
;
;
PPIDE_RESET:
#IF (PPIDETRACE >= 2)
CALL NEWLINE
PRTX(PPIDESTR_PREFIX)
PRTS(" RESET$")
#ENDIF
#IF (PPIDETRACE >= 2)
CALL PC_PERIOD
#ENDIF
LD C,PPIDE_CONTROL ; IDE CONTROL REGISTER
LD A,000001110B ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES
CALL PPIDE_WRITE ; DO IT
LD DE,8 ; DELAY ABOUT 200ms
CALL VDELAY
#IF (PPIDETRACE >= 2)
CALL PC_PERIOD
#ENDIF
LD C,PPIDE_CONTROL ; IDE CONTROL REGISTER
LD A,000000010B ; NO INTERRUPTS, DEASSERT RESET
CALL PPIDE_WRITE ; DO IT
XOR A ; STATUS OK
LD (PPIDE_STAT),A ; SAVE IT
#IF (PPIDE8BIT)
#IF (PPIDETRACE >= 2)
CALL PC_PERIOD
#ENDIF
CALL PPIDE_WAITRDY
#IF (PPIDETRACE >= 2)
CALL PC_PERIOD
#ENDIF
LD C,PPIDE_FEATURE ; IDE FEATURE REGISTER
LD A,01H ; VALUE := 1
CALL PPIDE_WRITE ; DO IT
#IF (PPIDETRACE >= 2)
CALL PC_PERIOD
#ENDIF
LD C,PPIDE_COMMAND ; IDE COMMAND REGISTER
LD A,PPIDE_CMDSETFEAT ; SET FEATURE
CALL PPIDE_WRITE ; DO IT
#IF (PPIDETRACE >= 2)
CALL PC_PERIOD
#ENDIF
#ENDIF
RET
;
;
@@ -273,7 +281,7 @@ PPIDE_WBSY:
SCF ; CARRY 1 = OK
RET
PPIDE_TO:
LD A,PPIDERC_RDYTO
LD A,PPIDE_RCRDYTO
LD (PPIDE_RC),A
XOR A ; CARRY 0 = TIMEOUT
RET
@@ -292,7 +300,7 @@ PPIDE_CHKERR:
CALL PPIDE_READ ; READ IT
LD (PPIDEP_ERR),A ; SAVE IT
;
LD A,PPIDERC_CMDERR ; COMMAND ERROR
LD A,PPIDE_RCCMDERR ; COMMAND ERROR
LD (PPIDE_RC),A ; SAVE IT
;
OR A ; CLEAR CF TO SIGNAL ERROR
@@ -317,7 +325,7 @@ PPIDE_WDRQ:
SCF ; CARRY 1 = OK
RET
PPIDE_TO2:
LD A,PPIDERC_BUFTO
LD A,PPIDE_RCBUFTO
LD (PPIDE_RC),A
XOR A ; CARRY 0 = TIMED OUT
RET
@@ -327,7 +335,7 @@ PPIDE_TO2:
PPIDE_BUFRD:
; SETUP PPI TO READ
LD A,RD_IDE_8255 ; READ CONFIG
OUT (PPI1CONT),A ; DO IT
OUT (PPICTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
;
; SELECT READ/WRITE IDE REGISTER
@@ -341,7 +349,7 @@ PPIDE_BUFRD:
; LOOP SETUP
LD HL,(DIOBUF) ; LOCATION OF BUFFER
LD B,0 ; 256 ITERATIONS
LD C,IDEMSB ; SETUP C WITH IO PORT (MSB)
LD C,IDELSB ; SETUP C WITH IO PORT (LSB)
;
CALL PPIDE_BUFRD1 ; FIRST PASS (FIRST 256 BYTES)
CALL PPIDE_BUFRD1 ; SECOND PASS (LAST 256 BYTES)
@@ -353,9 +361,6 @@ PPIDE_BUFRD:
RET
;
PPIDE_BUFRD1: ; START OF READ LOOP
#IF (!PPIDE8BIT)
DEC C ; MSB -> LSB
#ENDIF
LD A,D ; ASSERT READ
OUT (IDECTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
@@ -365,10 +370,14 @@ PPIDE_BUFRD1: ; START OF READ LOOP
INC C ; LSB -> MSB
INI ; GET AND SAVE NEXT BYTE
RECOVERY ; OPTIONAL SMALL DELAY
PUSH AF
DEC C ; MSB -> LSB
POP AF
#ENDIF
LD A,E ; DEASSERT READ
OUT (IDECTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
;
JR NZ,PPIDE_BUFRD1 ; LOOP UNTIL DONE
RET
;
@@ -376,22 +385,22 @@ PPIDE_BUFRD1: ; START OF READ LOOP
;
PPIDE_BUFWR:
; SETUP PPI TO WRITE
LD A,WR_IDE_8255 ; READ CONFIG
OUT (PPI1CONT),A ; DO IT
LD A,WR_IDE_8255 ; WRITE CONFIG
OUT (PPICTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
;
; SELECT READ/WRITE IDE REGISTER
LD A,PPIDE_DATA ; DATA REGISTER
OUT (IDECTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
LD E,A ; E := READ UNASSERTED
LD E,A ; E := WRITE UNASSERTED
XOR PPIDE_WR_LINE ; SWAP THE WRITE LINE BIT
LD D,A ; D := READ ASSERTED
LD D,A ; D := WRITE ASSERTED
;
; LOOP SETUP
LD HL,(DIOBUF) ; LOCATION OF BUFFER
LD B,0 ; 256 ITERATIONS
LD C,IDEMSB ; SETUP C WITH IO PORT (MSB)
LD C,IDELSB ; SETUP C WITH IO PORT (LSB)
;
CALL PPIDE_BUFWR1 ; FIRST PASS (FIRST 256 BYTES)
CALL PPIDE_BUFWR1 ; SECOND PASS (LAST 256 BYTES)
@@ -402,23 +411,26 @@ PPIDE_BUFWR:
RECOVERY ; OPTIONAL SMALL DELAY
RET
;
PPIDE_BUFWR1: ; START OF READ LOOP
#IF (!PPIDE8BIT)
DEC C ; MSB -> LSB
#ENDIF
PPIDE_BUFWR1: ; START OF WRITE LOOP
OUTI ; SEND NEXT BYTE OF BUFFER
RECOVERY ; OPTIONAL SMALL DELAY
#IF (!PPIDE8BIT)
INC C ; LSB -> MSB
OUTI ; SEND NEXT BYTE OF BUFFER
PUSH AF
DEC C ; MSB -> LSB
POP AF
RECOVERY ; OPTIONAL SMALL DELAY
#ENDIF
LD A,D ; ASSERT WRITE
;
; TOGGLE THE WRITE LINE
LD A,D ; WRITE ASSERTED VALUE
OUT (IDECTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
LD A,E ; DEASSERT WRITE
LD A,E ; WRITE UNASSERTED VALUE
OUT (IDECTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
;
JR NZ,PPIDE_BUFWR1 ; LOOP UNTIL DONE
RET
;
@@ -437,12 +449,10 @@ PPIDE_SETUP:
JP Z,PPIDE_SETUP_UNIT1
CALL PANIC
PPIDE_SETUP_UNIT0:
LD A,(PPIDE0_DEVICE)
; LD DE,(PPIDE0_OFFSET)
LD A,(PPIDE_UNIT0)
JP PPIDE_SETUP1
PPIDE_SETUP_UNIT1:
LD A,(PPIDE1_DEVICE)
; LD DE,(PPIDE1_OFFSET)
LD A,(PPIDE_UNIT1)
JP PPIDE_SETUP1
PPIDE_SETUP1:
LD C,PPIDE_HEAD ; IDE HEAD REGISTER
@@ -477,11 +487,13 @@ PPIDE_READ:
;
; SET PPI MODE TO READ CONFIGURATION
LD A,RD_IDE_8255 ; PPI MODE TO READ
OUT (PPI1CONT),A ; DO IT
OUT (PPICTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
;
; SELECT REQUESTED IDE REGISTER AND ASSERT READ
; SELECT REQUESTED IDE REGISTER, THEN ASSERT READ
LD A,C ; REGISTER SELECTION -> A
OUT (IDECTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
OR PPIDE_RD_LINE ; ASSERT READ
OUT (IDECTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
@@ -490,10 +502,16 @@ PPIDE_READ:
IN A,(IDELSB) ; READ LSB
RECOVERY ; OPTIONAL SMALL DELAY
PUSH AF ; SAVE IT FOR NOW
;
; ; DUMMY READ OF MSB
; IN A,(IDEMSB) ; READ LSB
; RECOVERY ; OPTIONAL SMALL DELAY
;
; CLEAN UP AND RETURN
XOR A ; ZERO A
OUT (IDECTL),A ; RELEASE ALL BUS SIGNALS
LD A,C ; DEASSERT READ
OUT (IDECTL),A ; DO IT
XOR A ; RELEASE ALL BUS SIGNALS
OUT (IDECTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
;
POP AF ; RECOVER THE DATA BYTE
@@ -508,15 +526,22 @@ PPIDE_WRITE:
;
; SET PPI MODE TO WRITE CONFIGURATION
LD A,WR_IDE_8255 ; PPI MODE TO WRITE
OUT (PPI1CONT),A ; DO IT
OUT (PPICTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
;
; SELECT REQUESTED IDE REGISTER
LD A,C ; REGISTER SELECTION -> A
OUT (IDECTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
; SET THE VALUE TO WRITE
POP AF ; GET VALUE BACK
OUT (IDELSB),A ; SET IDE LSB
RECOVERY ; OPTIONAL SMALL DELAY
;
; ; MSB ALWAYS GETS ZERO
; XOR A ; ZERO A
; OUT (IDELSB),A ; SET IDE MSB
; OUT (IDEMSB),A ; SET IDE MSB
; RECOVERY ; OPTIONAL SMALL DELAY
;
; PULSE THE WRITE LINE
@@ -524,10 +549,13 @@ PPIDE_WRITE:
OR PPIDE_WR_LINE ; ASSERT WRITE
OUT (IDECTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
LD A,C
OUT (IDECTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
;
; CLEAN UP AND RETURN
XOR A ; ZERO A
OUT (IDECTL),A ; RELEASE ALL BUS SIGNALS
XOR A ; RELEASE ALL BUS SIGNALS
OUT (IDECTL),A ; DO IT
RECOVERY ; OPTIONAL SMALL DELAY
;
RET ; RETURN
@@ -570,10 +598,10 @@ PPIDE_PRT:
CALL PC_LBKT
LD A,(PPIDEP_CMD)
LD DE,PPIDESTR_READ
CP PPIDECMD_READ
CP PPIDE_CMDREAD
JP Z,PPIDE_PRTCMD
LD DE,PPIDESTR_WRITE
CP PPIDECMD_WRITE
CP PPIDE_CMDWRITE
JP Z,PPIDE_PRTCMD
LD DE,PPIDESTR_UNKCMD
PPIDE_PRTCMD:
@@ -614,16 +642,16 @@ PPIDE_PRTCMD:
CALL PC_LBKT
LD A,(PPIDE_RC)
LD DE,PPIDESTR_RCOK
CP PPIDERC_OK
CP PPIDE_RCOK
JP Z,PPIDE_PRTRC
LD DE,PPIDESTR_RCCMDERR
CP PPIDERC_CMDERR
CP PPIDE_RCCMDERR
JP Z,PPIDE_PRTRC
LD DE,PPIDESTR_RCRDYTO
CP PPIDERC_RDYTO
CP PPIDE_RCRDYTO
JP Z,PPIDE_PRTRC
LD DE,PPIDESTR_RCBUFTO
CP PPIDERC_BUFTO
CP PPIDE_RCBUFTO
JP Z,PPIDE_PRTRC
LD DE,PPIDESTR_RCUNK
PPIDE_PRTRC:
@@ -664,12 +692,6 @@ 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.
@@ -690,4 +712,4 @@ PPIDEP_ERR .DB 0
; 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.
; Bit 0: ERR (Error) Set when an error occurred during the previous ATA command.

127
Source/rf.asm Normal file
View File

@@ -0,0 +1,127 @@
;
;==================================================================================================
; RAM FLOPPY DISK DRIVER
;==================================================================================================
;
;
;
RF_U0IO .EQU $A0
RF_U1IO .EQU $A4
;
; IO PORT OFFSETS
;
RF_DAT .EQU 0
RF_AL .EQU 1
RF_AH .EQU 2
RF_ST .EQU 3
;
;
;
RF_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F
JR Z,RF_READ
DEC A
JR Z,RF_WRITE
DEC A
JR Z,RF_STATUS
DEC A
JR Z,RF_MEDIA
CALL PANIC
;
; RF_MEDIA
;
RF_MEDIA:
LD A,C ; DEVICE/UNIT IS IN C
AND $0F ; ISOLATE UNIT NUM
CP 2 ; CHECK FOR MAX UNIT EXCEEDED
CALL NC,PANIC ; PANIC IF TOO HIGH
LD A,MID_RF ; SET CORRECT MEDIA VALUE
RET
;
;
;
RF_INIT:
PRTS("RF: UNITS=2$")
;
XOR A ; INIT SUCCEEDED
RET ; RETURN
;
;
;
RF_STATUS:
XOR A ; STATUS ALWAYS OK
RET
;
;
;
RF_READ:
CALL RF_SETIO
CALL RF_SETADR
LD HL,(DIOBUF)
LD B,0
LD A,(RF_IO)
OR RF_DAT
LD C,A
INIR
INIR
XOR A
RET
;
;
;
RF_WRITE:
CALL RF_SETIO
LD A,(RF_IO)
OR RF_ST
LD C,A
IN A,(C)
BIT 0,A ; CHECK WRITE PROTECT
LD A,1 ; PREPARE TO RETURN FALSE (ERROR)
RET NZ ; WRITE PROTECTED!
CALL RF_SETADR
LD HL,(DIOBUF)
LD B,0
LD A,(RF_IO)
OR RF_DAT
LD C,A
OTIR
OTIR
XOR A
RET
;
;
;
RF_SETIO:
LD A,(HSTDSK) ; GET DEVICE/UNIT
AND $0F ; ISOLATE UNIT NUM
JR NZ,RF_SETIO1
LD A,RF_U0IO
JR RF_SETIO3
RF_SETIO1:
DEC A
JR NZ,RF_SETIO2
LD A,RF_U1IO
JR RF_SETIO3
RF_SETIO2:
CALL PANIC ; INVALID UNIT
RF_SETIO3:
LD (RF_IO),A
RET
;
;
;
RF_SETADR:
LD A,(RF_IO)
OR RF_AL
LD C,A
LD A,(HSTSEC)
OUT (C),A
LD A,(HSTTRK)
INC C
OUT (C),A
RET
;
;
;
RF_IO .DB 0

30
Source/rf_dph.asm Normal file
View File

@@ -0,0 +1,30 @@
;
;==================================================================================================
; RF DISK DRIVER - DATA
;==================================================================================================
;
; RAM FLOPPY 00
;
.DB DIODEV_RF + 0
RFDPH0 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_RF
.DW RFCSV0,RFALV0
;
; RAM FLOPPY 01
;
.DB DIODEV_RF + 1
RFDPH1 .DW 0000,0000
.DW 0000,0000
.DW DIRBF,DPB_RF
.DW RFCSV1,RFALV1
;
RFCKS .EQU 0 ; CKS: 0 FOR NON-REMOVABLE MEDIA
RFALS .EQU 256 ; ALS: BLKS / 8 = 2048 / 8 = 256 (ROUNDED UP)
;
; BUFFERS
;
RFCSV0: .FILL RFCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
RFALV0: .FILL RFALS ; MAX OF 2048 DATA BLOCKS
RFCSV1: .FILL RFCKS ; NO DIRECTORY CHECKSUM, NON-REMOVABLE DRIVE
RFALV1: .FILL RFALS ; MAX OF 2048 DATA BLOCKS

View File

@@ -24,6 +24,7 @@ DIODEV_SD .EQU $50
DIODEV_PRPSD .EQU $60
DIODEV_PPPSD .EQU $70
DIODEV_HDSK .EQU $80
DIODEV_RF .EQU $90
;
; VDA DEVICES (VIDEO DISPLAY ADAPTER)
;

View File

@@ -57,6 +57,7 @@ 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
DM_RF .EQU 10 ; RAM FLOPPY PRIORITY
;
; FLOPPY DISK MEDIA SELECTIONS (ID'S MUST BE INDEX OF ENTRY IN FCD_TBL)
;
@@ -77,6 +78,7 @@ MID_FD144 .EQU 5
MID_FD360 .EQU 6
MID_FD120 .EQU 7
MID_FD111 .EQU 8
MID_RF .EQU 9
;
; FD MODE SELECTIONS
;

View File

@@ -1,7 +1,7 @@
#DEFINE RMJ 2
#DEFINE RMN 5
#DEFINE RUP 0
#DEFINE RTP 16
#DEFINE BIOSVER "2.5"
#DEFINE BIOSBLD "Build 16"
#DEFINE REVISION 412
#DEFINE RUP 4
#DEFINE RTP 20
#DEFINE BIOSVER "2.5.4"
#DEFINE BIOSBLD "Build 20"
#DEFINE REVISION 500

View File

@@ -727,8 +727,9 @@ PRINT:
;
PRIN1:
MOV A,M ;GET NEXT BYTE
ANI 7FH ;WW - CLEAR MSB
CALL CONOUT ;PRINT CHAR
ANI ~80H ;WW - CLEAR HIGH BIT
;WW CALL CONOUT ;PRINT CHAR
CNZ CONOUT ;WW - DON'T OUTPUT CHAR IF ZERO
MOV A,M ;GET NEXT BYTE AGAIN FOR TEST
INX H ;PT TO NEXT BYTE
ORA A ;SET FLAGS

Binary file not shown.

Binary file not shown.

View File

@@ -131,7 +131,7 @@ PUB cls1(c,screencolor,pcport,ascii,CR) | i,x,y
inverse := 1
statprint(36,0, string(" N8VEM ParPortProp | RomWBW v0.92"))
statprint(36,0, string(" N8VEM PropIO | RomWBW v0.94"))
inverse := 0
statprint(37,0, string(" "))
statprint(38,0, string(" "))

Binary file not shown.

View File

@@ -0,0 +1 @@
{{

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,704 @@
'' VGA_1024.spin
''
'' MODIFIED BY VINCE BRIEL FOR POCKETERM FEATURES
'' MODIIFED BY JEFF LEDGER / AKA OLDBITCOLLECTOR
''
CON
cols = 80 '128 ' number of screen columns
lcols = cols / 4 ' number of long in columns
rows = 40 '64 ' number of screen rows
chars = rows*cols ' number of screen characters
esc = $CB ' keyboard esc char
rowsnow = 36 ' adjusted for split screen effect
maxChars = rowsnow*cols ' adjusted value for split screen effect
lastChar = maxChars / 4 ' last screen position in longs adjusted for split
lastLine = (rowsnow - 1) * cols ' character position of last row
cols1 = 81 ' adjusted value for 80th character
TURQUOISE = $29
OBJ
vga : "vga_Hires_Text"
VAR
byte screen[chars] ' screen character buffer
byte tmpl[cols] ' temporary line buffer
word colors[rows] ' color specs for each screen row (see ColorPtr description above)
byte cursor[6] ' cursor info array (see CursorPtr description above)
long sync, loc, xloc, yloc ' sync used by VGA routine, others are local screen pointers
long kbdreq ' global val of kbdflag
long BR[8]
long Brate
byte inverse
byte invs
byte state ' Current state of state machine
word pos ' Current Position on the screen
word oldpos ' Previous location of cursor before update
word regionTop, regionBot ' Scroll region top/bottom
long arg0 ' First argument of escape sequence
long arg1 ' Second argument of escape sequence
byte lastc ' Last displayed char
word statpos
long vgabasepin
PUB start(BasePin) | i, char
vgabasepin := BasePin
''init screen colors to gold on blue
repeat i from 0 to rows - 1
colors[i] := $08F0 '$2804 (if you want cyan on blue)
''init cursor attributes
cursor[2] := %110 ' init cursor to underscore with slow blink
BR[0]:=300
BR[1]:=1200
BR[2]:=2400
BR[3]:=4800
BR[4]:=9600
BR[5]:=19200
BR[6]:=38400
BR[7]:=57600
BR[8]:=115200
xloc := cursor[0] := 0
yloc := cursor[1] := 0
loc := xloc + yloc*cols
pos := 0
regionTop := 0
regionBot := 35 * cols
state := 0
statpos := 37 * cols
PUB vidon
if (!vga.start(vgabasepin, @screen, @colors, @cursor, @sync))
return false
waitcnt(clkfreq * 1 + cnt) 'wait 1 second for cogs to start
PUB vidoff
vga.stop
PUB inv(c)
inverse:=c
PUB color(colorVal) | i
repeat i from 0 to rows - 1
colors[i] := $0000 | colorVal
PUB cursorset(c) | i
i:=%000
if c == 1
i:= %001
if c == 2
i:= %010
if c == 3
i:= %011
if c == 4
i:= %101
if c == 5
i:= %110
if c == 6
i:= %111
if c == 7
i:= %000
cursor[2] := i
PUB bin(value, digits)
'' Print a binary number, specify number of digits
repeat while digits > 32
outc("0")
digits--
value <<= 32 - digits
repeat digits
outc((value <-= 1) & 1 + "0")
PUB clrbtm(ColorVal) | i
repeat i from 36 to rows - 1 'was 35
colors[i] := $0000 + ColorVal
PUB cls1(c,screencolor,pcport,ascii,CR) | i,x,y
longfill(@screen[0], $20202020, chars / 4)
clrbtm(TURQUOISE)
inverse := 1
statprint(36,0, string(" N8VEM PropIO V2 | RomWBW v0.94"))
inverse := 0
statprint(37,0, string(" "))
statprint(38,0, string(" "))
statprint(39,0, string(" "))
{{
x :=xloc
y := yloc
invs := inverse
''clrbtm(TURQUOISE)
longfill(@screen, $20202020, chars/4)
xloc := 0
yloc :=0
loc := xloc + yloc*cols
repeat 80
outc(32)
xloc := 0
yloc :=36
loc := xloc + yloc*cols
inverse := 1
str(string(" propIO V 0.91 "))
inverse := 0
str(string("Baud Rate: "))
i:= BR[6]
dec(i)
str(string(" "))
xloc := 18
loc := xloc + yloc*cols
str(string("Color "))
str(string("PC Port: "))
if pcport == 1
str(string("OFF "))
if pcport == 0
str(string("ON "))
str(string(" Force 7 bit: "))
if ascii == 0
str(string("NO "))
if ascii == 1
str(string("YES "))
str(string(" Cursor CR W/LF: "))
if CR == 1
str(string("YES"))
if CR == 0
str(string("NO "))
outc(13)
outc(10)
inverse:=1
xloc := 6
loc := xloc + yloc*cols
str(string("F1"))
xloc := 19
loc := xloc + yloc*cols
str(string("F2"))
xloc := 30
loc := xloc + yloc*cols
str(string("F3"))
xloc := 46
loc := xloc + yloc*cols
str(string("F4"))
xloc := 58
loc := xloc + yloc*cols
str(string("F5"))
xloc := 70
loc := xloc + yloc*cols
str(string("F6"))
inverse := invs
xloc := cursor[0] := x 'right & left was 0
yloc := cursor[1] := y 'from top was 1
loc := xloc + yloc*cols
}}
PUB clsupdate(c,screencolor,PCPORT,ascii,CR) | i,x,y,locold
invs := inverse
locold := loc
x := xloc
y := yloc
''(TURQUOISE)
xloc := 0
yloc :=36
loc := xloc + yloc*cols
inverse := 1
str(string(" propIO V 0.81 "))
inverse := 0
xloc := 0
yloc :=37
loc := xloc + yloc*cols
str(string("Baud Rate: "))
i:= BR[6]
dec(i)
str(string(" "))
xloc := 18
loc := xloc + yloc*cols
str(string("Color "))
str(string("PC Port: "))
if pcport == 1
str(string("OFF "))
if pcport == 0
str(string("ON "))
str(string(" Force 7 bit: "))
if ascii == 0
str(string("NO "))
if ascii == 1
str(string("YES "))
str(string(" Cursor CR W/LF: "))
if CR == 1
str(string("YES"))
if CR == 0
str(string("NO "))
xloc := 0
yloc :=38
loc := xloc + yloc*cols
inverse:=1
xloc := 6
loc := xloc + yloc*cols
str(string("F1"))
xloc := 19
loc := xloc + yloc*cols
str(string("F2"))
xloc := 30
loc := xloc + yloc*cols
str(string("F3"))
xloc := 46
loc := xloc + yloc*cols
str(string("F4"))
xloc := 58
loc := xloc + yloc*cols
str(string("F5"))
xloc := 70
loc := xloc + yloc*cols
str(string("F6"))
inverse := invs
xloc := cursor[0] := x
yloc := cursor[1] := y
' loc := xloc + yloc*cols
loc := locold
PUB dec(value) | i
'' Print a decimal number
if value < 0
-value
outc("-")
i := 1_000_000_000
repeat 10
if value => i
outc(value/i + "0")
value //= i
result~~
elseif result or i == 1
outc("0")
i /= 10
PUB hex(value, digits)
'' Print a hexadecimal number, specify number of digits
repeat while digits > 8
outc("0")
digits--
value <<= (8 - digits) << 2
repeat digits
outc(lookupz((value <-= 4) & $f : "0".."9", "A".."F"))
PUB str(string_ptr)
'' Print a zero terminated string
repeat strsize(string_ptr)
process_char(byte[string_ptr++])
PUB statprint(r, c, str1) | x, ptr
ptr := r * cols + c
repeat x from 0 to STRSIZE(str1) - 1
putc(ptr++, BYTE[str1 + x])
PUB statnum(r, c, num1) | i, ptr
ptr := r * cols + c
if num1 < 0
-num1
putc(ptr++,"-")
i := 1_000_000_000
repeat 10
if num1 => i
putc(ptr++, (num1/i +"0"))
num1 //= i
result~~
elseif result or i == 1
putc(ptr++, "0")
i /= 10
PUB putc(position, c)
if inverse
c |= $80
screen[position] := c
PUB cls
longfill (@screen, $20202020, lastChar)
PUB fullcls
longfill(@screen, $20202020, 800)
PUB setInverse(val)
inverse := val
PUB setInv(c)
if c == 7
setInverse(1)
else
setInverse(0)
PUB clEOL(position) | count
count := cols - (position // cols)
bytefill(@screen + position, $20, count)
PUB clBOL(position) | count
count := position // cols
bytefill(@screen + position - count, $20, count)
PUB delLine(position) | src, count
position -= position // cols
src := position + cols
count := (maxChars - src) / 4
if count > 0
longmove(@screen + position, @screen + src, count)
longfill(@screen + lastLine, $20202020, lcols)
PUB clEOS(position)
cleol(position)
position += cols - (position // cols)
repeat while position < maxChars
longfill(@screen + position, $20202020, lcols)
pos += cols
PUB setCursorPos(position)
cursor[0] := position // cols
cursor[1] := position / cols
PUB insLine(position) | base, nxt
base := position - (position // cols)
position := lastLine
repeat while position > base
nxt := position - cols
longmove(@screen + position, @screen + nxt, lcols)
position := nxt
clEOL(base)
PUB insChar(position) | count
count := (cols - (position // cols)) - 1
bytemove(@tmpl, @screen + position, count)
screen[position] := " "
bytemove(@screen + position + 1, @tmpl, count)
PUB delChar(position) | count
count := (cols - (position // cols)) - 1
bytemove(@screen + position, @screen + position + 1, count)
screen[position + count] := " "
PRI inRegion : answer
answer := (pos => regionTop) AND (pos < regionBot)
PRI scrollUp
delLine(regionTop)
if regionBot < maxChars
insLine(regionBot)
PRI scrollDown
if regionBot < maxChars
delLine(regionBot)
insLine(regionTop)
PRI ansi(c) | x, defVal
state := 0
if (c <> "r") AND (c <> "J") AND (c <> "m") AND (c <> "K")
if arg0 == -1
arg0 := 1
if arg1 == -1
arg1 := 1
case c
"@":
repeat while arg0-- > 0
insChar(pos)
"b":
repeat while arg0-- > 0
outc(lastc)
"d":
if (arg0 < 1) OR (arg0 > rows)
arg0 := rows
pos := ((arg0 - 1) * cols) + (pos // cols)
"m":
setInv(arg0)
if arg1 <> -1
setInv(arg1)
"r":
if arg0 < 1
arg0 := 1
elseif arg0 > cols
arg0 := cols
if arg1 < 1
arg1 := 1
elseif arg1 > cols
arg1 := cols
if arg1 < arg0
arg1 := arg0
regionTop := (arg0 - 1) * cols
regionBot := arg1 * cols
pos := 0
"A":
repeat while arg0-- > 0
pos -= cols
if pos < 0
pos += cols
return
"B":
repeat while arg0-- > 0
pos += cols
if pos => maxChars
pos -= cols
return
"C":
repeat while arg0-- > 0
pos += 1
if pos => maxChars
pos -= 1
return
"D":
repeat while arg0-- > 0
pos -= 1
if pos < 0
pos := 0
return
"G":
if (arg0 < 1) OR (arg0 > cols)
arg0 := cols
pos := (pos - (pos // cols)) + (arg0 - 1)
"H", "f":
if arg0 =< 0
arg0 := 1
if arg1 =< 0
arg1 := 1
pos := (cols * (arg0 - 1)) + (arg1 - 1)
if pos < 0
pos := 0
if pos => maxChars
pos := maxChars - 1
"J":
if arg0 == 1
clBOL(pos)
x := pos - cols
x -= x // cols
repeat while x => 0
clEOL(x)
x -= cols
return
if arg0 == 2
pos := 0
clEOL(pos)
x := pos + cols
x -= (x // cols)
repeat while x < maxChars
clEOL(x)
x += cols
"K":
if arg0 == -1
clEOL(pos)
elseif arg0 == 1
clBOL(pos)
else
clEOL(pos - (pos // cols))
"L":
if inRegion
repeat while arg0-- > 0
if regionBot < maxChars
delLine(regionBot)
insLine(pos)
"M":
if inRegion
repeat while arg0-- > 0
delLine(pos)
if regionBot < maxChars
insLine(regionBot)
"P":
repeat while arg0--
delChar(pos)
PRI outc(c)
putc(pos++, lastc := c)
if pos == regionBot
scrollUp
pos -= cols
elseif pos == maxChars
pos := lastLine
PUB process_char(c)
case state
0:
if c > 127
c := $20
if c => $20
outc(c)
setCursorPos(pos)
return
if c == $1B
state := 1
return
if c == $0D
pos := pos - (pos // cols)
setCursorPos(pos)
return
if c == $0A
if inRegion
pos += cols
if pos => regionBot
scrollUp
pos -= cols
else
pos += cols
if pos => maxChars
pos -= cols
setCursorPos(pos)
return
if c == 9
pos += (8 - (pos // 8))
if pos => maxChars
pos := lastLine
delLine(0)
setCursorPos(pos)
return
if c == 8
if pos > 0
pos -= 1
setCursorPos(pos)
return
1:
case c
"[":
arg0 := arg1 := -1
state := 2
return
"P":
pos += cols
if pos => maxChars
pos -= cols
"K":
if pos > 0
pos -= 1
"H":
pos -= cols
if pos < 0
pos += cols
"D":
if inRegion
scrollUp
"M":
if inRegion
scrollDown
"G":
pos := 0
"(":
state := 5
return
state := 0
return
2:
if (c => "0") AND (c =< "9")
if arg0 == -1
arg0 := c - "0"
else
arg0 := (arg0 * 10) + (c - "0")
return
if c == ";"
state := 3
return
ansi(c)
setCursorPos(pos)
return
3:
if (c => "0") AND (c =< "9")
if arg1 == -1
arg1 := c - "0"
else
arg1 := (arg1 * 10) + (c - "0")
return
if c == ";"
state := 4
return
ansi(c)
setCursorPos(pos)
return
4:
if (c => "0") AND (c =< "9")
return
if c == ";"
return
ansi(c)
setCursorPos(pos)
return
5:
state := 0
return
return

Binary file not shown.

View File

@@ -0,0 +1,920 @@
{{
SPI interface routines for SD & SDHC & MMC cards
Jonathan "lonesock" Dummer
version 0.3.0 2009 July 19
Using multiblock SPI mode exclusively.
This is the "SAFE" version...uses
* 1 instruction per bit writes
* 2 instructions per bit reads
For the fsrw project:
fsrw.sf.net
}}
CON
' possible card types
type_MMC = 1
type_SD = 2
type_SDHC = 3
' Error codes
ERR_CARD_NOT_RESET = -1
ERR_3v3_NOT_SUPPORTED = -2
ERR_OCR_FAILED = -3
ERR_BLOCK_NOT_LONG_ALIGNED = -4
'...
' These errors are for the assembly engine...they are negated inside, and need to be <= 511
ERR_ASM_NO_READ_TOKEN = 100
ERR_ASM_BLOCK_NOT_WRITTEN = 101
' NOTE: errors -128 to -255 are reserved for reporting R1 response errors
'...
ERR_SPI_ENGINE_NOT_RUNNING = -999
ERR_CARD_BUSY_TIMEOUT = -1000
' SDHC/SD/MMC command set for SPI
CMD0 = $40+0 ' GO_IDLE_STATE
CMD1 = $40+1 ' SEND_OP_COND (MMC)
ACMD41 = $C0+41 ' SEND_OP_COND (SDC)
CMD8 = $40+8 ' SEND_IF_COND
CMD9 = $40+9 ' SEND_CSD
CMD10 = $40+10 ' SEND_CID
CMD12 = $40+12 ' STOP_TRANSMISSION
CMD13 = $40+13 ' SEND_STATUS
ACMD13 = $C0+13 ' SD_STATUS (SDC)
CMD16 = $40+16 ' SET_BLOCKLEN
CMD17 = $40+17 ' READ_SINGLE_BLOCK
CMD18 = $40+18 ' READ_MULTIPLE_BLOCK
CMD23 = $40+23 ' SET_BLOCK_COUNT (MMC)
ACMD23 = $C0+23 ' SET_WR_BLK_ERASE_COUNT (SDC)
CMD24 = $40+24 ' WRITE_BLOCK
CMD25 = $40+25 ' WRITE_MULTIPLE_BLOCK
CMD55 = $40+55 ' APP_CMD
CMD58 = $40+58 ' READ_OCR
CMD59 = $40+59 ' CRC_ON_OFF
' buffer size for my debug cmd log
'LOG_SIZE = 256<<1
{
VAR
long SPI_engine_cog
' these are used for interfacing with the assembly engine | temporary initialization usage
long SPI_command ' "t", "r", "w", 0 =>done, <0 => error | pin mask
long SPI_block_index ' which 512-byte block to read/write | cnt at init
long SPI_buffer_address ' where to get/put the data in Hub RAM | unused
'}
DAT
'' I'm placing these variables in a DAT section to make this driver a singleton.
'' If for some reason you really need more than one driver (e.g. if you have more
'' than a single SD socket), move these back into VAR.
SPI_engine_cog long 0
' these are used for interfacing with the assembly engine | temporary initialization usage
SPI_command long 0 ' "t", "r", "w", 0 =>done, <0 => error | unused
SPI_block_index long 0 ' which 512-byte block to read/write | cnt at init
SPI_buffer_address long 0 ' where to get/put the data in Hub RAM | unused
{
VAR
' for debug ONLY
byte log_cmd_resp[LOG_SIZE+1]
PUB get_log_pointer
return @log_cmd_resp
'}
PUB start( basepin )
{{
This is a compatibility wrapper, and requires that the pins be
both consecutive, and in the order DO CLK DI CS.
}}
return start_explicit( basepin, basepin+1, basepin+2, basepin+3 )
PUB readblock( block_index, buffer_address )
if SPI_engine_cog == 0
abort ERR_SPI_ENGINE_NOT_RUNNING
if (buffer_address & 3)
abort ERR_BLOCK_NOT_LONG_ALIGNED
SPI_block_index := block_index
SPI_buffer_address := buffer_address
SPI_command := "r"
repeat while SPI_command == "r"
if SPI_command < 0
abort SPI_command
PUB writeblock( block_index, buffer_address )
if SPI_engine_cog == 0
abort ERR_SPI_ENGINE_NOT_RUNNING
if (buffer_address & 3)
abort ERR_BLOCK_NOT_LONG_ALIGNED
SPI_block_index := block_index
SPI_buffer_address := buffer_address
SPI_command := "w"
repeat while SPI_command == "w"
if SPI_command < 0
abort SPI_command
PUB get_seconds
if SPI_engine_cog == 0
abort ERR_SPI_ENGINE_NOT_RUNNING
SPI_command := "t"
repeat while SPI_command == "t"
' secods are in SPI_block_index, remainder is in SPI_buffer_address
return SPI_block_index
PUB get_milliseconds : ms
if SPI_engine_cog == 0
abort ERR_SPI_ENGINE_NOT_RUNNING
SPI_command := "t"
repeat while SPI_command == "t"
' secods are in SPI_block_index, remainder is in SPI_buffer_address
ms := SPI_block_index * 1000
ms += SPI_buffer_address * 1000 / clkfreq
PUB start_explicit( DO, CLK, DI, CS ) : card_type | tmp, i
{{
Do all of the card initialization in SPIN, then hand off the pin
information to the assembly cog for hot SPI block R/W action!
}}
' Start from scratch
stop
' clear my log buffer
{
bytefill( @log_cmd_resp, 0, LOG_SIZE+1 )
dbg_ptr := @log_cmd_resp
dbg_end := dbg_ptr + LOG_SIZE
'}
' wait ~4 milliseconds
waitcnt( 500 + (clkfreq>>8) + cnt )
' (start with cog variables, _BEFORE_ loading the cog)
pinDO := DO
maskDO := |< DO
pinCLK := CLK
pinDI := DI
maskDI := |< DI
maskCS := |< CS
adrShift := 9 ' block = 512 * index, and 512 = 1<<9
' pass the output pin mask via the command register
maskAll := maskCS | (|<pinCLK) | maskDI
dira |= maskAll
' get the card in a ready state: set DI and CS high, send => 74 clocks
outa |= maskAll
repeat 4096
outa[CLK]~~
outa[CLK]~
' time-hack
SPI_block_index := cnt
' reset the card
tmp~
repeat i from 0 to 9
if tmp <> 1
tmp := send_cmd_slow( CMD0, 0, $95 )
if (tmp & 4)
' the card said CMD0 ("go idle") was invalid, so we're possibly stuck in read or write mode
if i & 1
' exit multiblock read mode
repeat 4
read_32_slow ' these extra clocks are required for some MMC cards
send_slow( $FD, 8 ) ' stop token
read_32_slow
repeat while read_slow <> $FF
else
' exit multiblock read mode
send_cmd_slow( CMD12, 0, $61 )
if tmp <> 1
' the reset command failed!
crash( ERR_CARD_NOT_RESET )
' Is this a SD type 2 card?
if send_cmd_slow( CMD8, $1AA, $87 ) == 1
' Type2 SD, check to see if it's a SDHC card
tmp := read_32_slow
' check the supported voltage
if (tmp & $1FF) <> $1AA
crash( ERR_3v3_NOT_SUPPORTED )
' try to initialize the type 2 card with the High Capacity bit
repeat while send_cmd_slow( ACMD41, |<30, $77 )
' the card is initialized, let's read back the High Capacity bit
if send_cmd_slow( CMD58, 0, $FD ) <> 0
crash( ERR_OCR_FAILED )
' get back the data
tmp := read_32_slow
' check the bit
if tmp & |<30
card_type := type_SDHC
adrShift := 0
else
card_type := type_SD
else
' Either a type 1 SD card, or it's MMC, try SD 1st
if send_cmd_slow( ACMD41, 0, $E5 ) < 2
' this is a type 1 SD card (1 means busy, 0 means done initializing)
card_type := type_SD
repeat while send_cmd_slow( ACMD41, 0, $E5 )
else
' mark that it's MMC, and try to initialize
card_type := type_MMC
repeat while send_cmd_slow( CMD1, 0, $F9 )
' some SD or MMC cards may have the wrong block size, set it here
send_cmd_slow( CMD16, 512, $15 )
' card is mounted, make sure the CRC is turned off
send_cmd_slow( CMD59, 0, $91 )
' check the status
'send_cmd_slow( CMD13, 0, $0D )
' done with the SPI bus for now
outa |= maskCS
' set my counter modes for super fast SPI operation
' writing: NCO single-ended mode, output on DI
writeMode := (%00100 << 26) | (DI << 0)
' reading
'readMode := (%11000 << 26) | (DO << 0) | (CLK << 9)
' clock
'clockLineMode := (%00110 << 26) | (CLK << 0) ' DUTY, 25% duty cycle
' clock
clockLineMode := (%00100 << 26) | (CLK << 0) ' NCO, 50% duty cycle
' how many bytes (8 clocks, >>3) fit into 1/2 of a second (>>1), 4 clocks per instruction (>>2)?
N_in8_500ms := clkfreq >> constant(1+2+3)
' how long should we wait before auto-exiting any multiblock mode?
idle_limit := 125 ' ms, NEVER make this > 1000
idle_limit := clkfreq / (1000 / idle_limit) ' convert to counts
' Hand off control to the assembly engine's cog
bufAdr := @SPI_buffer_address
sdAdr := @SPI_block_index
SPI_command := 0 ' just make sure it's not 1
' start my driver cog and wait till I hear back that it's done
SPI_engine_cog := cognew( @SPI_engine_entry, @SPI_command ) + 1
if( SPI_engine_cog == 0 )
crash( ERR_SPI_ENGINE_NOT_RUNNING )
repeat while SPI_command <> -1
' and we no longer need to control any pins from here
dira &= !maskAll
' the return variable is card_type
PUB release
{{
I do not want to abort if the cog is not
running, as this is called from stop, which
is called from start/ [8^)
}}
if SPI_engine_cog
SPI_command := "z"
repeat while SPI_command == "z"
PUB stop
{{
kill the assembly driver cog.
}}
release
if SPI_engine_cog
cogstop( SPI_engine_cog~ - 1 )
PRI crash( abort_code )
{{
In case of Bad Things(TM) happening,
exit as gracefully as possible.
}}
' and we no longer need to control any pins from here
dira &= !maskAll
' and report our error
abort abort_code
PRI send_cmd_slow( cmd, val, crc ) : reply | time_stamp
{{
Send down a command and return the reply.
Note: slow is an understatement!
Note: this uses the assembly DAT variables for pin IDs,
which means that if you run this multiple times (say for
multiple SD cards), these values will change for each one.
But this is OK as all of these functions will be called
during the initialization only, before the PASM engine is
running.
}}
' if this is an application specific command, handle it
if (cmd & $80)
' ACMD<n> is the command sequense of CMD55-CMD<n>
cmd &= $7F
reply := send_cmd_slow( CMD55, 0, $65 )
if (reply > 1)
return reply
' the CS line needs to go low during this operation
outa |= maskCS
outa &= !maskCS
' give the card a few cocks to finish whatever it was doing
read_32_slow
' send the command byte
send_slow( cmd, 8 )
' send the value long
send_slow( val, 32 )
' send the CRC byte
send_slow( crc, 8 )
' is this a CMD12?, if so, stuff byte
if cmd == CMD12
read_slow
' read back the response (spec declares 1-8 reads max for SD, MMC is 0-8)
time_stamp := 9
repeat
reply := read_slow
while( reply & $80 ) and ( time_stamp-- )
' done, and 'reply' is already pre-loaded
{
if dbg_ptr < (dbg_end-1)
byte[dbg_ptr++] := cmd
byte[dbg_ptr++] := reply
if (cmd&63) == 13
' get the second byte
byte[dbg_ptr++] := cmd
byte[dbg_ptr++] := read_slow
'}
PRI send_slow( value, bits_to_send )
value ><= bits_to_send
repeat bits_to_send
outa[pinCLK]~
outa[pinDI] := value
value >>= 1
outa[pinCLK]~~
PRI read_32_slow : r
repeat 4
r <<= 8
r |= read_slow
PRI read_slow : r
{{
Read back 8 bits from the card
}}
' we need the DI line high so a read can occur
outa[pinDI]~~
' get 8 bits (remember, r is initialized to 0 by SPIN)
repeat 8
outa[pinCLK]~
outa[pinCLK]~~
r += r + ina[pinDO]
' error check
if( (cnt - SPI_block_index) > (clkfreq << 2) )
crash( ERR_CARD_BUSY_TIMEOUT )
DAT
{{
This is the assembly engine for doing fast block
reads and writes. This is *ALL* it does!
}}
ORG 0
SPI_engine_entry
' Counter A drives data out
mov ctra,writeMode
' Counter B will always drive my clock line
mov ctrb,clockLineMode
' set our output pins to match the pin mask
mov dira,maskAll
' handshake that we now control the pins
neg user_request,#1
wrlong user_request,par
' start my seconds' counter here
mov last_time,cnt
waiting_for_command
' update my seconds counter, but also track the idle
' time so we can to release the card after timeout.
call #handle_time
' read the command, and make sure it's from the user (> 0)
rdlong user_request,par
cmps user_request,#0 wz,wc
if_be jmp #waiting_for_command
' handle our card based commands
cmp user_request,#"r" wz
if_z jmp #read_ahead
cmp user_request,#"w" wz
if_z jmp #write_behind
cmp user_request,#"z" wz
if_z jmp #release_card
' time requests are handled differently
cmp user_request,#"t" wz ' time
if_z wrlong seconds,sdAdr ' seconds goes into the SD index register
if_z wrlong dtime,bufAdr ' the remainder goes into the buffer address register
' in all other cases, clear the user's request
mov user_request,#0
wrlong user_request,par
jmp #waiting_for_command
release_card
mov user_cmd,#"z" ' request a release
neg lastIndexPlus,#1 ' reset the last block index
neg user_idx,#1 ' and make this match it
call #handle_command
mov user_request,user_cmd
wrlong user_request,par
jmp #waiting_for_command
read_ahead
rdlong user_idx,sdAdr
' if the correct block is not already loaded, load it
mov tmp1,user_idx
add tmp1,#1
cmp tmp1,lastIndexPlus wz
if_z cmp lastCommand,#"r" wz
if_z jmp #:get_on_with_it
mov user_cmd,#"r"
call #handle_command
:get_on_with_it
' copy the data up into Hub RAM
movi transfer_long,#%000010_000 'set to wrlong
call #hub_cog_transfer
' signify that the data is ready, Spin can continue
mov user_request,user_cmd
wrlong user_request,par
' request the next block
mov user_cmd,#"r"
add user_idx,#1
call #handle_command
' done
jmp #waiting_for_command
write_behind
rdlong user_idx,sdAdr
' copy data in from Hub RAM
movi transfer_long,#%000010_001 'set to rdlong
call #hub_cog_transfer
' signify that we have the data, Spin can continue
mov user_request,user_cmd
wrlong user_request,par
' write out the block
mov user_cmd,#"w"
call #handle_command
' done
jmp #waiting_for_command
{{
Set user_cmd and user_idx before calling this
}}
handle_command
' Can we stay in the old mode? (address = old_address+1) && (old mode == new_mode)
cmp lastIndexPlus,user_idx wz
if_z cmp user_cmd,lastCommand wz
if_z jmp #:execute_block_command
' we fell through, must exit the old mode! (except if the old mode was "release")
cmp lastCommand,#"w" wz
if_z call #stop_mb_write
cmp lastCommand,#"r" wz
if_z call #stop_mb_read
' and start up the new mode!
cmp user_cmd,#"w" wz
if_z call #start_mb_write
cmp user_cmd,#"r" wz
if_z call #start_mb_read
cmp user_cmd,#"z" wz
if_z call #release_DO
:execute_block_command
' track the (new) last index and command
mov lastIndexPlus,user_idx
add lastIndexPlus,#1
mov lastCommand,user_cmd
' do the block read or write or terminate!
cmp user_cmd,#"w" wz
if_z call #write_single_block
cmp user_cmd,#"r" wz
if_z call #read_single_block
cmp user_cmd,#"z" wz
if_z mov user_cmd,#0
' done
handle_command_ret
ret
{=== these PASM functions get me in and out of multiblock mode ===}
release_DO
' we're already out of multiblock mode, so
' deselect the card and send out some clocks
or outa,maskCS
call #in8
call #in8
' if you are using pull-up resistors, and need all
' lines tristated, then uncomment the following line.
' for Cluso99
'mov dira,#0
release_DO_ret
ret
start_mb_read
movi block_cmd,#CMD18<<1
call #send_SPI_command_fast
start_mb_read_ret
ret
stop_mb_read
movi block_cmd,#CMD12<<1
call #send_SPI_command_fast
call #busy_fast
stop_mb_read_ret
ret
start_mb_write
movi block_cmd,#CMD25<<1
call #send_SPI_command_fast
start_mb_write_ret
ret
stop_mb_write
call #busy_fast
' only some cards need these extra clocks
mov tmp1,#16
:loopity
call #in8
djnz tmp1,#:loopity
' done with hack
movi phsa,#$FD<<1
call #out8
call #in8 ' stuff byte
call #busy_fast
stop_mb_write_ret
ret
send_SPI_command_fast
' make sure we have control of the output lines
mov dira,maskAll
' make sure the CS line transitions low
or outa,maskCS
andn outa,maskCS
' 8 clocks
call #in8
' send the data
mov phsa,block_cmd ' do which ever block command this is (already in the top 8 bits)
call #out8 ' write the byte
mov phsa,user_idx ' read in the desired block index
shl phsa,adrShift ' this will multiply by 512 (bytes/sector) for MMC and SD
call #out8 ' move out the 1st MSB '
rol phsa,#1
call #out8 ' move out the 1st MSB '
rol phsa,#1
call #out8 ' move out the 1st MSB '
rol phsa,#1
call #out8 ' move out the 1st MSB '
' bogus CRC value
call #in8 ' in8 looks like out8 with $FF
' CMD12 requires a stuff byte
shr block_cmd,#24
cmp block_cmd,#CMD12 wz
if_z call #in8 ' 8 clocks
' get the response
mov tmp1,#9
:cmd_response
call #in8
test readback,#$80 wc,wz
if_c djnz tmp1,#:cmd_response
if_nz neg user_cmd,readback
' done
send_SPI_command_fast_ret
ret
busy_fast
mov tmp1,N_in8_500ms
:still_busy
call #in8
cmp readback,#$FF wz
if_nz djnz tmp1,#:still_busy
busy_fast_ret
ret
out8
andn outa,maskDI
'movi phsb,#%11_0000000
mov phsb,#0
movi frqb,#%01_0000000
rol phsa,#1
rol phsa,#1
rol phsa,#1
rol phsa,#1
rol phsa,#1
rol phsa,#1
rol phsa,#1
mov frqb,#0
' don't shift out the final bit...already sent, but be aware
' of this when sending consecutive bytes (send_cmd, for e.g.)
out8_ret
ret
{
in8
or outa,maskDI
mov ctra,readMode
' Start my clock
mov frqa,#1<<7
mov phsa,#0
movi phsb,#%11_0000000
movi frqb,#%01_0000000
' keep reading in my value, one bit at a time! (Kuneko - "Wh)
shr frqa,#1
shr frqa,#1
shr frqa,#1
shr frqa,#1
shr frqa,#1
shr frqa,#1
shr frqa,#1
mov frqb,#0 ' stop the clock
mov readback,phsa
mov frqa,#0
mov ctra,writeMode
in8_ret
ret
}
in8
neg phsa,#1' DI high
mov readback,#0
' set up my clock, and start it
movi phsb,#%011_000000
movi frqb,#%001_000000
' keep reading in my value
test maskDO,ina wc
rcl readback,#1
test maskDO,ina wc
rcl readback,#1
test maskDO,ina wc
rcl readback,#1
test maskDO,ina wc
rcl readback,#1
test maskDO,ina wc
rcl readback,#1
test maskDO,ina wc
rcl readback,#1
test maskDO,ina wc
rcl readback,#1
test maskDO,ina wc
mov frqb,#0 ' stop the clock
rcl readback,#1
mov phsa,#0 'DI low
in8_ret
ret
' this is called more frequently than 1 Hz, and
' is only called when the user command is 0.
handle_time
mov tmp1,cnt ' get the current timestamp
add idle_time,tmp1 ' add the current time to my idle time counter
sub idle_time,last_time ' subtract the last time from my idle counter (hence delta)
add dtime,tmp1 ' add to my accumulator,
sub dtime,last_time ' and subtract the old (adding delta)
mov last_time,tmp1 ' update my "last timestamp"
rdlong tmp1,#0 ' what is the clock frequency?
cmpsub dtime,tmp1 wc ' if I have more than a second in my accumulator
addx seconds,#0 ' then add it to "seconds"
' this part is to auto-release the card after a timeout
cmp idle_time,idle_limit wz,wc
if_b jmp #handle_time_ret ' don't clear if we haven't hit the limit
mov user_cmd,#"z" ' we can't overdo it, the command handler makes sure
neg lastIndexPlus,#1 ' reset the last block index
neg user_idx,#1 ' and make this match it
call #handle_command ' release the card, but don't mess with the user's request register
handle_time_ret
ret
hub_cog_transfer
' setup for all 4 passes
mov ctrb,clockXferMode
mov frqb,#1
rdlong buf_ptr,bufAdr
mov ops_left,#4
movd transfer_long,#speed_buf
four_transfer_passes
' sync to the Hub RAM access
rdlong tmp1,tmp1
' how many long to move on this pass? (512 bytes / 4)longs / 4 passes
mov tmp1,#(512 / 4 / 4)
' get my starting address right (phsb is incremented 1 per clock, so 16 each Hub access)
mov phsb,buf_ptr
' write the longs, stride 4...low 2 bits of phsb are ignored
transfer_long
rdlong 0-0,phsb
add transfer_long,incDest4
djnz tmp1,#transfer_long
' go back to where I started, but advanced 1 long
sub transfer_long,decDestNminus1
' offset my Hub pointer by one long per pass
add buf_ptr,#4
' do all 4 passes
djnz ops_left,#four_transfer_passes
' restore the counter mode
mov frqb,#0
mov phsb,#0
mov ctrb,clockLineMode
hub_cog_transfer_ret
ret
read_single_block
' where am I sending the data?
movd :store_read_long,#speed_buf
mov ops_left,#128
' wait until the card is ready
mov tmp1,N_in8_500ms
:get_resp
call #in8
cmp readback,#$FE wz
if_nz djnz tmp1,#:get_resp
if_nz neg user_cmd,#ERR_ASM_NO_READ_TOKEN
if_nz jmp #read_single_block_ret
' set DI high
neg phsa,#1
' read the data
mov ops_left,#128
:read_loop
mov tmp1,#4
movi phsb,#%011_000000
:in_byte
' Start my clock
movi frqb,#%001_000000
' keep reading in my value, BACKWARDS! (Brilliant idea by Tom Rokicki!)
test maskDO,ina wc
rcl readback,#8
test maskDO,ina wc
muxc readback,#2
test maskDO,ina wc
muxc readback,#4
test maskDO,ina wc
muxc readback,#8
test maskDO,ina wc
muxc readback,#16
test maskDO,ina wc
muxc readback,#32
test maskDO,ina wc
muxc readback,#64
test maskDO,ina wc
mov frqb,#0 ' stop the clock
muxc readback,#128
' go back for more
djnz tmp1,#:in_byte
' make it...NOT backwards [8^)
rev readback,#0
:store_read_long
mov 0-0,readback ' due to some counter weirdness, we need this mov
add :store_read_long,const512
djnz ops_left,#:read_loop
' set DI low
mov phsa,#0
' now read 2 trailing bytes (CRC)
call #in8 ' out8 is 2x faster than in8
call #in8 ' and I'm not using the CRC anyway
' give an extra 8 clocks in case we pause for a long time
call #in8 ' in8 looks like out8($FF)
' all done successfully
mov idle_time,#0
mov user_cmd,#0
read_single_block_ret
ret
write_single_block
' where am I getting the data? (all 512 bytes / 128 longs of it?)
movs :write_loop,#speed_buf
' read in 512 bytes (128 longs) from Hub RAM and write it to the card
mov ops_left,#128
' just hold your horses
call #busy_fast
' $FC for multiblock, $FE for single block
movi phsa,#$FC<<1
call #out8
mov phsb,#0 ' make sure my clock accumulator is right
'movi phsb,#%11_0000000
:write_loop
' read 4 bytes
mov phsa,speed_buf
add :write_loop,#1
' a long in LE order is DCBA
rol phsa,#24 ' move A7 into position, so I can do the swizzled version
movi frqb,#%010000000 ' start the clock (remember A7 is already in place)
rol phsa,#1 ' A7 is going out, at the end of this instr, A6 is in place
rol phsa,#1 ' A5
rol phsa,#1 ' A4
rol phsa,#1 ' A3
rol phsa,#1 ' A2
rol phsa,#1 ' A1
rol phsa,#1 ' A0
rol phsa,#17 ' B7
rol phsa,#1 ' B6
rol phsa,#1 ' B5
rol phsa,#1 ' B4
rol phsa,#1 ' B3
rol phsa,#1 ' B2
rol phsa,#1 ' B1
rol phsa,#1 ' B0
rol phsa,#17 ' C7
rol phsa,#1 ' C6
rol phsa,#1 ' C5
rol phsa,#1 ' C4
rol phsa,#1 ' C3
rol phsa,#1 ' C2
rol phsa,#1 ' C1
rol phsa,#1 ' C0
rol phsa,#17 ' D7
rol phsa,#1 ' D6
rol phsa,#1 ' D5
rol phsa,#1 ' D4
rol phsa,#1 ' D3
rol phsa,#1 ' D2
rol phsa,#1 ' D1
rol phsa,#1 ' D0 will be in place _after_ this instruction
mov frqb,#0 ' shuts the clock off, _after_ this instruction
djnz ops_left,#:write_loop
' write out my two (bogus, using $FF) CRC bytes
call #in8
call #in8
' now read response (I need this response, so can't spoof using out8)
call #in8
and readback,#$1F
cmp readback,#5 wz
if_z mov user_cmd,#0 ' great
if_nz neg user_cmd,#ERR_ASM_BLOCK_NOT_WRITTEN ' oops
' send out another 8 clocks
call #in8
' all done
mov idle_time,#0
write_single_block_ret
ret
{=== Assembly Interface Variables ===}
pinDO long 0 ' pin is controlled by a counter
pinCLK long 0 ' pin is controlled by a counter
pinDI long 0 ' pin is controlled by a counter
maskDO long 0 ' mask for reading the DO line from the card
maskDI long 0 ' mask for setting the pin high while reading
maskCS long 0 ' mask = (1<<pin), and is controlled directly
maskAll long 0
adrShift long 9 ' will be 0 for SDHC, 9 for MMC & SD
bufAdr long 0 ' where in Hub RAM is the buffer to copy to/from?
sdAdr long 0 ' where on the SD card does it read/write?
writeMode long 0 ' the counter setup in NCO single ended, clocking data out on pinDI
'clockOutMode long 0 ' the counter setup in NCO single ended, driving the clock line on pinCLK
N_in8_500ms long 1_000_000 ' used for timeout checking in PASM
'readMode long 0
clockLineMode long 0
clockXferMode long %11111 << 26
const512 long 512
const1024 long 1024
incDest4 long 4 << 9
decDestNminus1 long (512 / 4 - 1) << 9
{=== Initialized PASM Variables ===}
seconds long 0
dtime long 0
idle_time long 0
idle_limit long 0
{=== Multiblock State Machine ===}
lastIndexPlus long -1 ' state handler will check against lastIndexPlus, which will not have been -1
lastCommand long 0 ' this will never be the last command.
{=== Debug Logging Pointers ===}
{
dbg_ptr long 0
dbg_end long 0
'}
{=== Assembly Scratch Variables ===}
ops_left res 1 ' used as a counter for bytes, words, longs, whatever (start w/ # byte clocks out)
readback res 1 ' all reading from the card goes through here
tmp1 res 1 ' this may get used in all subroutines...don't use except in lowest
user_request res 1 ' the main command variable, read in from Hub: "r"-read single, "w"-write single
user_cmd res 1 ' used internally to handle actual commands to be executed
user_idx res 1 ' the pointer to the Hub RAM where the data block is/goes
block_cmd res 1 ' one of the SD/MMC command codes, no app-specific allowed
buf_ptr res 1 ' moving pointer to the Hub RAM buffer
last_time res 1 ' tracking the timestamp
{{
496 longs is my total available space in the cog,
and I want 128 longs for eventual use as one 512-
byte buffer. This gives me a total of 368 longs
to use for umount, and a readblock and writeblock
for both Hub RAM and Cog buffers.
}}
speed_buf res 128 ' 512 bytes to be used for read-ahead / write-behind
'fit 467
FIT 496
'' MIT LICENSE
{{
' Permission is hereby granted, free of charge, to any person obtaining
' a copy of this software and associated documentation files
' (the "Software"), to deal in the Software without restriction,
' including without limitation the rights to use, copy, modify, merge,
' publish, distribute, sublicense, and/or sell copies of the Software,
' and to permit persons to whom the Software is furnished to do so,
' subject to the following conditions:
'
' The above copyright notice and this permission notice shall be included
' in all copies or substantial portions of the Software.
'
' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
' EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
' MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
' IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
' CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
' TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
' SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
}}

View File

@@ -9,7 +9,9 @@ vdu.rom: ROM image for VDU onboard EPROM
PropIO\PropIO.eeprom: PropIO firmware for use with RomWBW
ParPortProp\ParPortProp.eeprom: ParPortProp firmware for use with RomWBWB
PropIO2\PropIO2.eeprom: PropIO V2 firmware for use with RomWBW
ParPortProp\ParPortProp.eeprom: ParPortProp firmware for use with RomWBW
ZSDOS: Directory contains updated ZSDOS distribution files (see ..\Doc\ZSystem.txt)

View File

@@ -266,24 +266,24 @@ diskdef interak
sectrk 20
blocksize 4096
maxdir 256
skew 1
skew 0
boottrk 2
os 2.2
end
# For 512KB ROM, less 32K for system image
# For 512KB ROM, less 64K reserved for system
diskdef rom512KB
seclen 128
tracks 14
sectrk 256
blocksize 2048
maxdir 256
skew 1
skew 0
boottrk 0
os 2.2
end
# For 1024KB ROM, less 32K for system image
# For 1024KB ROM, less 64K reserved for system
diskdef rom1024KB
seclen 128
tracks 30
@@ -295,47 +295,95 @@ diskdef rom1024KB
os 2.2
end
# For N8VEM mass storage (4 raw partitions)
diskdef hd0
# N8VEM Hard Disks, hd0 - hd3 are first 4 slices of disk
diskdef n8vem_hd0
seclen 512
tracks 65
sectrk 256
blocksize 4096
maxdir 512
skew 1
skew 0
boottrk 1
os 2.2
end
diskdef hd1
diskdef n8vem_hd1
seclen 512
tracks 130
sectrk 256
blocksize 4096
maxdir 512
skew 1
skew 0
boottrk 66
os 2.2
end
diskdef hd2
diskdef n8vem_hd2
seclen 512
tracks 195
sectrk 256
blocksize 4096
maxdir 512
skew 1
skew 0
boottrk 131
os 2.2
end
diskdef hd3
diskdef n8vem_hd3
seclen 512
tracks 260
sectrk 256
blocksize 4096
maxdir 512
skew 1
skew 0
boottrk 196
os 2.2
end
# N8VEM 720K floppy media
diskdef n8vem_fd720
seclen 512
tracks 160
sectrk 9
blocksize 2048
maxdir 128
skew 0
boottrk 4
os 2.2
end
# N8VEM 1.44M floppy media
diskdef n8vem_fd144
seclen 512
tracks 160
sectrk 18
blocksize 2048
maxdir 256
skew 0
boottrk 2
os 2.2
end
# N8VEM 360K floppy media
diskdef n8vem_fd360
seclen 512
tracks 80
sectrk 9
blocksize 2048
maxdir 128
skew 0
boottrk 4
os 2.2
end
# N8VEM 1.20M floppy media
diskdef n8vem_fd120
seclen 512
tracks 160
sectrk 15
blocksize 2048
maxdir 256
skew 0
boottrk 2
os 2.2
end

Binary file not shown.

Binary file not shown.

View File

@@ -145,7 +145,7 @@ computers;
<P>Syntax for zx is:
<BLOCKQUOTE>
zx <i>comfile.com</i> arg1 arg2 ...
zx <i>comfile.com</i> [-stdio] arg1 arg2 ...
</BLOCKQUOTE>
<P>The comfile is the program to run; <em>zx</em> searches the current
@@ -153,6 +153,10 @@ directory and <strong>BINDIR80</strong> for it.
<P>The arguments are parsed in this way:
<UL>
<LI>If -stdio appears as one of the arguments, zx will use buffered DOS I/O
which is useful if you want to pipe data in or out of zx. Otherwise
zx will use raw console I/O which works better when the application
is being used interactively.
<LI>Any argument starting with a - sign is passed to the CP/M program as-is,
minus the leading - sign.
<LI>Any argument starting with a + sign is parsed as a filename (see below)

BIN
Tools/zx/zxdbg.exe Normal file

Binary file not shown.