Reintegrate wbw -> trunk

This commit is contained in:
wayne
2013-06-25 23:54:23 +00:00
parent bf778fafe3
commit ff5bf3c669
7 changed files with 239 additions and 361 deletions

View File

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

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
#DEFINE RMJ 2
#DEFINE RMN 5
#DEFINE RUP 0
#DEFINE RTP 16
#DEFINE BIOSVER "2.5"
#DEFINE BIOSBLD "Build 16"
#DEFINE RUP 1
#DEFINE RTP 17
#DEFINE BIOSVER "2.5.1"
#DEFINE BIOSBLD "Build 17"
#DEFINE REVISION 412