mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
Reintegrate wbw -> trunk
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user