mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-08 07:23:14 -06:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c3352d708c | ||
|
|
2e4eb2fb1b | ||
|
|
63b624fa0c | ||
|
|
7c547f515a | ||
|
|
762f325e10 | ||
|
|
b030913abd | ||
|
|
ff5bf3c669 |
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
@@ -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
|
||||
@@ -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
|
||||
|
||||
BIN
RomDsk/cfg_n8vem_rf/1200.COM
Normal file
BIN
RomDsk/cfg_n8vem_rf/1200.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_n8vem_rf/38400.COM
Normal file
BIN
RomDsk/cfg_n8vem_rf/38400.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_n8vem_rf/9600.COM
Normal file
BIN
RomDsk/cfg_n8vem_rf/9600.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_n8vem_rf/FLASHZ.COM
Normal file
BIN
RomDsk/cfg_n8vem_rf/FLASHZ.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_n8vem_rf/LDTIM.COM
Normal file
BIN
RomDsk/cfg_n8vem_rf/LDTIM.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_n8vem_rf/RTC.COM
Normal file
BIN
RomDsk/cfg_n8vem_rf/RTC.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_n8vem_rf/T5.COM
Normal file
BIN
RomDsk/cfg_n8vem_rf/T5.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_n8vem_rf/VT3.COM
Normal file
BIN
RomDsk/cfg_n8vem_rf/VT3.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_n8vem_rf/XM.COM
Normal file
BIN
RomDsk/cfg_n8vem_rf/XM.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_n8vem_rf/XM5.COM
Normal file
BIN
RomDsk/cfg_n8vem_rf/XM5.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_zeta_ppisd/1200.COM
Normal file
BIN
RomDsk/cfg_zeta_ppisd/1200.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_zeta_ppisd/38400.COM
Normal file
BIN
RomDsk/cfg_zeta_ppisd/38400.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_zeta_ppisd/9600.COM
Normal file
BIN
RomDsk/cfg_zeta_ppisd/9600.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_zeta_ppisd/FDTST.COM
Normal file
BIN
RomDsk/cfg_zeta_ppisd/FDTST.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_zeta_ppisd/FLASHZ.COM
Normal file
BIN
RomDsk/cfg_zeta_ppisd/FLASHZ.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_zeta_ppisd/LDTIM.COM
Normal file
BIN
RomDsk/cfg_zeta_ppisd/LDTIM.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_zeta_ppisd/RTC.COM
Normal file
BIN
RomDsk/cfg_zeta_ppisd/RTC.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_zeta_ppisd/SURVEY.COM
Normal file
BIN
RomDsk/cfg_zeta_ppisd/SURVEY.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_zeta_ppisd/XM.COM
Normal file
BIN
RomDsk/cfg_zeta_ppisd/XM.COM
Normal file
Binary file not shown.
BIN
RomDsk/cfg_zeta_ppisd/XM5.COM
Normal file
BIN
RomDsk/cfg_zeta_ppisd/XM5.COM
Normal file
Binary file not shown.
14
RomList.txt
14
RomList.txt
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
103
Source/config_n8vem_rf.asm
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
103
Source/config_zeta_ppisd.asm
Normal file
103
Source/config_zeta_ppisd.asm
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
;
|
||||
;==================================================================================================
|
||||
|
||||
@@ -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
|
||||
@@ -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)/*.*
|
||||
266
Source/ppide.asm
266
Source/ppide.asm
@@ -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
127
Source/rf.asm
Normal 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
30
Source/rf_dph.asm
Normal 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
|
||||
@@ -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)
|
||||
;
|
||||
|
||||
@@ -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
|
||||
;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
@@ -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(" "))
|
||||
|
||||
BIN
Support/PropIO2/PropIO2.eeprom
Normal file
BIN
Support/PropIO2/PropIO2.eeprom
Normal file
Binary file not shown.
1
Support/PropIO2/Spin/E555_SPKEngine.spin
Normal file
1
Support/PropIO2/Spin/E555_SPKEngine.spin
Normal file
@@ -0,0 +1 @@
|
||||
{{
|
||||
BIN
Support/PropIO2/Spin/Keyboard.spin
Normal file
BIN
Support/PropIO2/Spin/Keyboard.spin
Normal file
Binary file not shown.
BIN
Support/PropIO2/Spin/Parallax Serial Terminal.spin
Normal file
BIN
Support/PropIO2/Spin/Parallax Serial Terminal.spin
Normal file
Binary file not shown.
BIN
Support/PropIO2/Spin/PropIO2.spin
Normal file
BIN
Support/PropIO2/Spin/PropIO2.spin
Normal file
Binary file not shown.
704
Support/PropIO2/Spin/VGA_1024.spin
Normal file
704
Support/PropIO2/Spin/VGA_1024.spin
Normal 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
|
||||
BIN
Support/PropIO2/Spin/VGA_HiRes_Text.spin
Normal file
BIN
Support/PropIO2/Spin/VGA_HiRes_Text.spin
Normal file
Binary file not shown.
920
Support/PropIO2/Spin/safe_spi.spin
Normal file
920
Support/PropIO2/Spin/safe_spi.spin
Normal 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.
|
||||
}}
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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.
BIN
Tools/zx/zx.exe
BIN
Tools/zx/zx.exe
Binary file not shown.
@@ -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
BIN
Tools/zx/zxdbg.exe
Normal file
Binary file not shown.
Reference in New Issue
Block a user