diff options
| author | marco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2008-01-26 23:18:37 +0000 |
|---|---|---|
| committer | marco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2008-01-26 23:18:37 +0000 |
| commit | d30d150d8fc93e1cf9411593b37780921117b4ae (patch) | |
| tree | 16af31a31fa49c1c316aaef3962765a4adde21b1 | |
| parent | a22e3577225befb5b2458df6c140958661966cd2 (diff) | |
| download | fpc-d30d150d8fc93e1cf9411593b37780921117b4ae.tar.gz | |
* cdrom
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@10001 3ad0048d-3df7-0310-abae-a5850022a9f2
| -rw-r--r-- | packages/cdrom/Makefile | 2450 | ||||
| -rw-r--r-- | packages/cdrom/Makefile.fpc | 26 | ||||
| -rw-r--r-- | packages/cdrom/examples/getdiscid.pp | 43 | ||||
| -rw-r--r-- | packages/cdrom/examples/showcds.pp | 22 | ||||
| -rw-r--r-- | packages/cdrom/fpmake.pp | 45 | ||||
| -rw-r--r-- | packages/cdrom/src/cdrom.pp | 39 | ||||
| -rw-r--r-- | packages/cdrom/src/cdromioctl.pp | 168 | ||||
| -rw-r--r-- | packages/cdrom/src/cdromlin.inc | 136 | ||||
| -rw-r--r-- | packages/cdrom/src/cdromw32.inc | 50 | ||||
| -rw-r--r-- | packages/cdrom/src/discid.pp | 69 | ||||
| -rw-r--r-- | packages/cdrom/src/lincd.pp | 1203 | ||||
| -rw-r--r-- | packages/cdrom/src/major.pp | 162 | ||||
| -rw-r--r-- | packages/cdrom/src/scsidefs.pp | 293 | ||||
| -rw-r--r-- | packages/cdrom/src/wincd.pp | 511 | ||||
| -rw-r--r-- | packages/cdrom/src/wnaspi32.pp | 259 |
15 files changed, 5476 insertions, 0 deletions
diff --git a/packages/cdrom/Makefile b/packages/cdrom/Makefile new file mode 100644 index 0000000000..57ab618ecf --- /dev/null +++ b/packages/cdrom/Makefile @@ -0,0 +1,2450 @@ +# +# Don't edit, this file is generated by FPCMake Version 2.0.0 [2008/01/26] +# +default: all +MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded +BSDs = freebsd netbsd openbsd darwin +UNIXs = linux $(BSDs) solaris qnx +LIMIT83fs = go32v2 os2 emx watcom +OSNeedsComspecToRunBatch = go32v2 watcom +FORCE: +.PHONY: FORCE +override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH))) +ifneq ($(findstring darwin,$(OSTYPE)),) +inUnix=1 #darwin +SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH))) +else +ifeq ($(findstring ;,$(PATH)),) +inUnix=1 +SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH))) +else +SEARCHPATH:=$(subst ;, ,$(PATH)) +endif +endif +SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE)))) +PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH)))) +ifeq ($(PWD),) +PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH)))) +ifeq ($(PWD),) +$(error You need the GNU utils package to use this Makefile) +else +PWD:=$(firstword $(PWD)) +SRCEXEEXT= +endif +else +PWD:=$(firstword $(PWD)) +SRCEXEEXT=.exe +endif +ifndef inUnix +ifeq ($(OS),Windows_NT) +inWinNT=1 +else +ifdef OS2_SHELL +inOS2=1 +endif +endif +else +ifneq ($(findstring cygdrive,$(PATH)),) +inCygWin=1 +endif +endif +ifdef inUnix +SRCBATCHEXT=.sh +else +ifdef inOS2 +SRCBATCHEXT=.cmd +else +SRCBATCHEXT=.bat +endif +endif +ifdef COMSPEC +ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),) +RUNBATCH=$(COMSPEC) /C +endif +endif +ifdef inUnix +PATHSEP=/ +else +PATHSEP:=$(subst /,\,/) +ifdef inCygWin +PATHSEP=/ +endif +endif +ifdef PWD +BASEDIR:=$(subst \,/,$(shell $(PWD))) +ifdef inCygWin +ifneq ($(findstring /cygdrive/,$(BASEDIR)),) +BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR)) +BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR))) +BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR)) +endif +endif +else +BASEDIR=. +endif +ifdef inOS2 +ifndef ECHO +ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(ECHO),) +ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(ECHO),) +ECHO=echo +else +ECHO:=$(firstword $(ECHO)) +endif +else +ECHO:=$(firstword $(ECHO)) +endif +endif +export ECHO +endif +override DEFAULT_FPCDIR=../.. +ifndef FPC +ifdef PP +FPC=$(PP) +endif +endif +ifndef FPC +FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH)))) +ifneq ($(FPCPROG),) +FPCPROG:=$(firstword $(FPCPROG)) +ifneq ($(CPU_TARGET),) +FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB) +else +FPC:=$(shell $(FPCPROG) -PB) +endif +ifneq ($(findstring Error,$(FPC)),) +override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH))))) +endif +else +override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH))))) +endif +endif +override FPC:=$(subst $(SRCEXEEXT),,$(FPC)) +override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT) +FOUNDFPC:=$(strip $(wildcard $(FPC))) +ifeq ($(FOUNDFPC),) +FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH)))) +ifeq ($(FOUNDFPC),) +$(error Compiler $(FPC) not found) +endif +endif +ifndef FPC_COMPILERINFO +FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO) +endif +ifndef FPC_VERSION +FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO)) +endif +export FPC FPC_VERSION FPC_COMPILERINFO +unexport CHECKDEPEND ALLDEPENDENCIES +ifndef CPU_TARGET +ifdef CPU_TARGET_DEFAULT +CPU_TARGET=$(CPU_TARGET_DEFAULT) +endif +endif +ifndef OS_TARGET +ifdef OS_TARGET_DEFAULT +OS_TARGET=$(OS_TARGET_DEFAULT) +endif +endif +ifneq ($(words $(FPC_COMPILERINFO)),5) +FPC_COMPILERINFO+=$(shell $(FPC) -iSP) +FPC_COMPILERINFO+=$(shell $(FPC) -iTP) +FPC_COMPILERINFO+=$(shell $(FPC) -iSO) +FPC_COMPILERINFO+=$(shell $(FPC) -iTO) +endif +ifndef CPU_SOURCE +CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO)) +endif +ifndef CPU_TARGET +CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO)) +endif +ifndef OS_SOURCE +OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO)) +endif +ifndef OS_TARGET +OS_TARGET:=$(word 5,$(FPC_COMPILERINFO)) +endif +FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET) +FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE) +ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),) +TARGETSUFFIX=$(OS_TARGET) +SOURCESUFFIX=$(OS_SOURCE) +else +TARGETSUFFIX=$(FULL_TARGET) +SOURCESUFFIX=$(FULL_SOURCE) +endif +ifneq ($(FULL_TARGET),$(FULL_SOURCE)) +CROSSCOMPILE=1 +endif +ifeq ($(findstring makefile,$(MAKECMDGOALS)),) +ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),) +$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first) +endif +endif +ifneq ($(findstring $(OS_TARGET),$(BSDs)),) +BSDhier=1 +endif +ifeq ($(OS_TARGET),linux) +linuxHier=1 +endif +export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE +ifdef FPCDIR +override FPCDIR:=$(subst \,/,$(FPCDIR)) +ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),) +override FPCDIR=wrong +endif +else +override FPCDIR=wrong +endif +ifdef DEFAULT_FPCDIR +ifeq ($(FPCDIR),wrong) +override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR)) +ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),) +override FPCDIR=wrong +endif +endif +endif +ifeq ($(FPCDIR),wrong) +ifdef inUnix +override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION) +ifeq ($(wildcard $(FPCDIR)/units),) +override FPCDIR=/usr/lib/fpc/$(FPC_VERSION) +endif +else +override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH)))))) +override FPCDIR:=$(FPCDIR)/.. +ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),) +override FPCDIR:=$(FPCDIR)/.. +ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),) +override FPCDIR:=$(BASEDIR) +ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),) +override FPCDIR=c:/pp +endif +endif +endif +endif +endif +ifndef CROSSBINDIR +CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX)) +endif +ifndef BINUTILSPREFIX +ifndef CROSSBINDIR +ifdef CROSSCOMPILE +BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)- +endif +endif +endif +UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX)) +ifeq ($(UNITSDIR),) +UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET)) +endif +PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra) +override PACKAGE_NAME=cdrom +override PACKAGE_VERSION=2.0.0 +ifeq ($(FULL_TARGET),i386-linux) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-go32v2) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-win32) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-os2) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-freebsd) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-beos) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-netbsd) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-solaris) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-qnx) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-netware) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-openbsd) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-wdosx) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-darwin) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-emx) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-watcom) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-netwlibc) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-wince) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-embedded) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-symbian) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),m68k-linux) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),m68k-freebsd) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),m68k-netbsd) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),m68k-amiga) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),m68k-atari) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),m68k-openbsd) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),m68k-palmos) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),m68k-embedded) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),powerpc-linux) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),powerpc-netbsd) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),powerpc-amiga) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),powerpc-macos) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),powerpc-darwin) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),powerpc-morphos) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),powerpc-embedded) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),sparc-linux) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),sparc-netbsd) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),sparc-solaris) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),sparc-embedded) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),x86_64-linux) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),x86_64-freebsd) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),x86_64-darwin) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),x86_64-win64) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),x86_64-embedded) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),arm-linux) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),arm-palmos) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),arm-wince) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),arm-gba) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),arm-nds) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),arm-embedded) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),arm-symbian) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),powerpc64-linux) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),powerpc64-darwin) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),powerpc64-embedded) +override TARGET_UNITS+=cdrom discid +endif +ifeq ($(FULL_TARGET),i386-linux) +override TARGET_IMPLICITUNITS+=major lincd +endif +ifeq ($(FULL_TARGET),i386-win32) +override TARGET_IMPLICITUNITS+=scsidefs wnaspi32 cdromioctl wincd +endif +ifeq ($(FULL_TARGET),m68k-linux) +override TARGET_IMPLICITUNITS+=major lincd +endif +ifeq ($(FULL_TARGET),powerpc-linux) +override TARGET_IMPLICITUNITS+=major lincd +endif +ifeq ($(FULL_TARGET),sparc-linux) +override TARGET_IMPLICITUNITS+=major lincd +endif +ifeq ($(FULL_TARGET),x86_64-linux) +override TARGET_IMPLICITUNITS+=major lincd +endif +ifeq ($(FULL_TARGET),arm-linux) +override TARGET_IMPLICITUNITS+=major lincd +endif +ifeq ($(FULL_TARGET),powerpc64-linux) +override TARGET_IMPLICITUNITS+=major lincd +endif +ifeq ($(FULL_TARGET),i386-linux) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-go32v2) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-win32) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-os2) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-freebsd) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-beos) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-netbsd) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-solaris) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-qnx) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-netware) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-openbsd) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-wdosx) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-darwin) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-emx) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-watcom) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-netwlibc) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-wince) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-embedded) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),i386-symbian) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),m68k-linux) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),m68k-freebsd) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),m68k-netbsd) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),m68k-amiga) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),m68k-atari) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),m68k-openbsd) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),m68k-palmos) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),m68k-embedded) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),powerpc-linux) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),powerpc-netbsd) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),powerpc-amiga) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),powerpc-macos) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),powerpc-darwin) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),powerpc-morphos) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),powerpc-embedded) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),sparc-linux) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),sparc-netbsd) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),sparc-solaris) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),sparc-embedded) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),x86_64-linux) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),x86_64-freebsd) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),x86_64-darwin) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),x86_64-win64) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),x86_64-embedded) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),arm-linux) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),arm-palmos) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),arm-wince) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),arm-gba) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),arm-nds) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),arm-embedded) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),arm-symbian) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),powerpc64-linux) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),powerpc64-darwin) +override TARGET_EXAMPLES+=showcds getdiscid +endif +ifeq ($(FULL_TARGET),powerpc64-embedded) +override TARGET_EXAMPLES+=showcds getdiscid +endif +override INSTALL_FPCPACKAGE=y +ifeq ($(FULL_TARGET),i386-linux) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-go32v2) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-win32) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-os2) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-freebsd) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-beos) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-netbsd) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-solaris) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-qnx) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-netware) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-openbsd) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-wdosx) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-darwin) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-emx) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-watcom) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-netwlibc) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-wince) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-embedded) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-symbian) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),m68k-linux) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),m68k-freebsd) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),m68k-netbsd) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),m68k-amiga) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),m68k-atari) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),m68k-openbsd) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),m68k-palmos) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),m68k-embedded) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),powerpc-linux) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),powerpc-netbsd) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),powerpc-amiga) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),powerpc-macos) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),powerpc-darwin) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),powerpc-morphos) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),powerpc-embedded) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),sparc-linux) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),sparc-netbsd) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),sparc-solaris) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),sparc-embedded) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),x86_64-linux) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),x86_64-freebsd) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),x86_64-darwin) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),x86_64-win64) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),x86_64-embedded) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),arm-linux) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),arm-palmos) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),arm-wince) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),arm-gba) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),arm-nds) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),arm-embedded) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),arm-symbian) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),powerpc64-linux) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),powerpc64-darwin) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),powerpc64-embedded) +override COMPILER_INCLUDEDIR+=src +endif +ifeq ($(FULL_TARGET),i386-linux) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-go32v2) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-win32) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-os2) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-freebsd) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-beos) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-netbsd) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-solaris) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-qnx) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-netware) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-openbsd) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-wdosx) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-darwin) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-emx) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-watcom) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-netwlibc) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-wince) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-embedded) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),i386-symbian) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),m68k-linux) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),m68k-freebsd) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),m68k-netbsd) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),m68k-amiga) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),m68k-atari) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),m68k-openbsd) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),m68k-palmos) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),m68k-embedded) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),powerpc-linux) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),powerpc-netbsd) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),powerpc-amiga) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),powerpc-macos) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),powerpc-darwin) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),powerpc-morphos) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),powerpc-embedded) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),sparc-linux) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),sparc-netbsd) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),sparc-solaris) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),sparc-embedded) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),x86_64-linux) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),x86_64-freebsd) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),x86_64-darwin) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),x86_64-win64) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),x86_64-embedded) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),arm-linux) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),arm-palmos) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),arm-wince) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),arm-gba) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),arm-nds) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),arm-embedded) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),arm-symbian) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),powerpc64-linux) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),powerpc64-darwin) +override COMPILER_SOURCEDIR+=src tests +endif +ifeq ($(FULL_TARGET),powerpc64-embedded) +override COMPILER_SOURCEDIR+=src tests +endif +ifdef REQUIRE_UNITSDIR +override UNITSDIR+=$(REQUIRE_UNITSDIR) +endif +ifdef REQUIRE_PACKAGESDIR +override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR) +endif +ifdef ZIPINSTALL +ifneq ($(findstring $(OS_TARGET),$(UNIXs)),) +UNIXHier=1 +endif +else +ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),) +UNIXHier=1 +endif +endif +ifndef INSTALL_PREFIX +ifdef PREFIX +INSTALL_PREFIX=$(PREFIX) +endif +endif +ifndef INSTALL_PREFIX +ifdef UNIXHier +INSTALL_PREFIX=/usr/local +else +ifdef INSTALL_FPCPACKAGE +INSTALL_BASEDIR:=/pp +else +INSTALL_BASEDIR:=/$(PACKAGE_NAME) +endif +endif +endif +export INSTALL_PREFIX +ifdef INSTALL_FPCSUBDIR +export INSTALL_FPCSUBDIR +endif +ifndef DIST_DESTDIR +DIST_DESTDIR:=$(BASEDIR) +endif +export DIST_DESTDIR +ifndef COMPILER_UNITTARGETDIR +ifdef PACKAGEDIR_MAIN +COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX) +else +COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX) +endif +endif +ifndef COMPILER_TARGETDIR +COMPILER_TARGETDIR=. +endif +ifndef INSTALL_BASEDIR +ifdef UNIXHier +ifdef INSTALL_FPCPACKAGE +INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION) +else +INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME) +endif +else +INSTALL_BASEDIR:=$(INSTALL_PREFIX) +endif +endif +ifndef INSTALL_BINDIR +ifdef UNIXHier +INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin +else +INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin +ifdef INSTALL_FPCPACKAGE +ifdef CROSSCOMPILE +ifdef CROSSINSTALL +INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX) +else +INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX) +endif +else +INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX) +endif +endif +endif +endif +ifndef INSTALL_UNITDIR +INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX) +ifdef INSTALL_FPCPACKAGE +ifdef PACKAGE_NAME +INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME) +endif +endif +endif +ifndef INSTALL_LIBDIR +ifdef UNIXHier +INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib +else +INSTALL_LIBDIR:=$(INSTALL_UNITDIR) +endif +endif +ifndef INSTALL_SOURCEDIR +ifdef UNIXHier +ifdef BSDhier +SRCPREFIXDIR=share/src +else +ifdef linuxHier +SRCPREFIXDIR=share/src +else +SRCPREFIXDIR=src +endif +endif +ifdef INSTALL_FPCPACKAGE +ifdef INSTALL_FPCSUBDIR +INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME) +else +INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME) +endif +else +INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION) +endif +else +ifdef INSTALL_FPCPACKAGE +ifdef INSTALL_FPCSUBDIR +INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME) +else +INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME) +endif +else +INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source +endif +endif +endif +ifndef INSTALL_DOCDIR +ifdef UNIXHier +ifdef BSDhier +DOCPREFIXDIR=share/doc +else +ifdef linuxHier +DOCPREFIXDIR=share/doc +else +DOCPREFIXDIR=doc +endif +endif +ifdef INSTALL_FPCPACKAGE +INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME) +else +INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION) +endif +else +ifdef INSTALL_FPCPACKAGE +INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME) +else +INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc +endif +endif +endif +ifndef INSTALL_EXAMPLEDIR +ifdef UNIXHier +ifdef INSTALL_FPCPACKAGE +ifdef BSDhier +INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME) +else +ifdef linuxHier +INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples +else +INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME) +endif +endif +else +ifdef BSDhier +INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION) +else +ifdef linuxHier +INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION) +else +INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION) +endif +endif +endif +else +ifdef INSTALL_FPCPACKAGE +INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME) +else +INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples +endif +endif +endif +ifndef INSTALL_DATADIR +INSTALL_DATADIR=$(INSTALL_BASEDIR) +endif +ifndef INSTALL_SHAREDDIR +INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib +endif +ifdef CROSSCOMPILE +ifndef CROSSBINDIR +CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX)) +ifeq ($(CROSSBINDIR),) +CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE)) +endif +endif +else +CROSSBINDIR= +endif +BATCHEXT=.bat +LOADEREXT=.as +EXEEXT=.exe +PPLEXT=.ppl +PPUEXT=.ppu +OEXT=.o +ASMEXT=.s +SMARTEXT=.sl +STATICLIBEXT=.a +SHAREDLIBEXT=.so +SHAREDLIBPREFIX=libfp +STATICLIBPREFIX=libp +IMPORTLIBPREFIX=libimp +RSTEXT=.rst +ifeq ($(findstring 1.0.,$(FPC_VERSION)),) +ifeq ($(OS_TARGET),go32v1) +STATICLIBPREFIX= +SHORTSUFFIX=v1 +endif +ifeq ($(OS_TARGET),go32v2) +STATICLIBPREFIX= +SHORTSUFFIX=dos +endif +ifeq ($(OS_TARGET),watcom) +STATICLIBPREFIX= +OEXT=.obj +ASMEXT=.asm +SHAREDLIBEXT=.dll +SHORTSUFFIX=wat +endif +ifeq ($(OS_TARGET),linux) +BATCHEXT=.sh +EXEEXT= +HASSHAREDLIB=1 +SHORTSUFFIX=lnx +endif +ifeq ($(OS_TARGET),freebsd) +BATCHEXT=.sh +EXEEXT= +HASSHAREDLIB=1 +SHORTSUFFIX=fbs +endif +ifeq ($(OS_TARGET),netbsd) +BATCHEXT=.sh +EXEEXT= +HASSHAREDLIB=1 +SHORTSUFFIX=nbs +endif +ifeq ($(OS_TARGET),openbsd) +BATCHEXT=.sh +EXEEXT= +HASSHAREDLIB=1 +SHORTSUFFIX=obs +endif +ifeq ($(OS_TARGET),win32) +SHAREDLIBEXT=.dll +SHORTSUFFIX=w32 +endif +ifeq ($(OS_TARGET),os2) +BATCHEXT=.cmd +AOUTEXT=.out +STATICLIBPREFIX= +SHAREDLIBEXT=.dll +SHORTSUFFIX=os2 +ECHO=echo +endif +ifeq ($(OS_TARGET),emx) +BATCHEXT=.cmd +AOUTEXT=.out +STATICLIBPREFIX= +SHAREDLIBEXT=.dll +SHORTSUFFIX=emx +ECHO=echo +endif +ifeq ($(OS_TARGET),amiga) +EXEEXT= +SHAREDLIBEXT=.library +SHORTSUFFIX=amg +endif +ifeq ($(OS_TARGET),morphos) +EXEEXT= +SHAREDLIBEXT=.library +SHORTSUFFIX=mos +endif +ifeq ($(OS_TARGET),atari) +EXEEXT=.ttp +SHORTSUFFIX=ata +endif +ifeq ($(OS_TARGET),beos) +BATCHEXT=.sh +EXEEXT= +SHORTSUFFIX=be +endif +ifeq ($(OS_TARGET),solaris) +BATCHEXT=.sh +EXEEXT= +SHORTSUFFIX=sun +endif +ifeq ($(OS_TARGET),qnx) +BATCHEXT=.sh +EXEEXT= +SHORTSUFFIX=qnx +endif +ifeq ($(OS_TARGET),netware) +EXEEXT=.nlm +STATICLIBPREFIX= +SHORTSUFFIX=nw +endif +ifeq ($(OS_TARGET),netwlibc) +EXEEXT=.nlm +STATICLIBPREFIX= +SHORTSUFFIX=nwl +endif +ifeq ($(OS_TARGET),macos) +BATCHEXT= +EXEEXT= +DEBUGSYMEXT=.xcoff +SHORTSUFFIX=mac +endif +ifeq ($(OS_TARGET),darwin) +BATCHEXT=.sh +EXEEXT= +HASSHAREDLIB=1 +SHORTSUFFIX=dwn +endif +ifeq ($(OS_TARGET),gba) +EXEEXT=.gba +SHAREDLIBEXT=.so +SHORTSUFFIX=gba +endif +ifeq ($(OS_TARGET),symbian) +SHAREDLIBEXT=.dll +SHORTSUFFIX=symbian +endif +else +ifeq ($(OS_TARGET),go32v1) +PPUEXT=.pp1 +OEXT=.o1 +ASMEXT=.s1 +SMARTEXT=.sl1 +STATICLIBEXT=.a1 +SHAREDLIBEXT=.so1 +STATICLIBPREFIX= +SHORTSUFFIX=v1 +endif +ifeq ($(OS_TARGET),go32v2) +STATICLIBPREFIX= +SHORTSUFFIX=dos +endif +ifeq ($(OS_TARGET),watcom) +STATICLIBPREFIX= +SHORTSUFFIX=wat +endif +ifeq ($(OS_TARGET),linux) +BATCHEXT=.sh +EXEEXT= +HASSHAREDLIB=1 +SHORTSUFFIX=lnx +endif +ifeq ($(OS_TARGET),freebsd) +BATCHEXT=.sh +EXEEXT= +HASSHAREDLIB=1 +SHORTSUFFIX=fbs +endif +ifeq ($(OS_TARGET),netbsd) +BATCHEXT=.sh +EXEEXT= +HASSHAREDLIB=1 +SHORTSUFFIX=nbs +endif +ifeq ($(OS_TARGET),openbsd) +BATCHEXT=.sh +EXEEXT= +HASSHAREDLIB=1 +SHORTSUFFIX=obs +endif +ifeq ($(OS_TARGET),win32) +PPUEXT=.ppw +OEXT=.ow +ASMEXT=.sw +SMARTEXT=.slw +STATICLIBEXT=.aw +SHAREDLIBEXT=.dll +SHORTSUFFIX=w32 +endif +ifeq ($(OS_TARGET),os2) +BATCHEXT=.cmd +PPUEXT=.ppo +ASMEXT=.so2 +OEXT=.oo2 +AOUTEXT=.out +SMARTEXT=.sl2 +STATICLIBPREFIX= +STATICLIBEXT=.ao2 +SHAREDLIBEXT=.dll +SHORTSUFFIX=os2 +ECHO=echo +endif +ifeq ($(OS_TARGET),amiga) +EXEEXT= +PPUEXT=.ppu +ASMEXT=.s +OEXT=.o +SMARTEXT=.sl +STATICLIBEXT=.a +SHAREDLIBEXT=.library +SHORTSUFFIX=amg +endif +ifeq ($(OS_TARGET),atari) +PPUEXT=.ppu +ASMEXT=.s +OEXT=.o +SMARTEXT=.sl +STATICLIBEXT=.a +EXEEXT=.ttp +SHORTSUFFIX=ata +endif +ifeq ($(OS_TARGET),beos) +BATCHEXT=.sh +PPUEXT=.ppu +ASMEXT=.s +OEXT=.o +SMARTEXT=.sl +STATICLIBEXT=.a +EXEEXT= +SHORTSUFFIX=be +endif +ifeq ($(OS_TARGET),solaris) +BATCHEXT=.sh +PPUEXT=.ppu +ASMEXT=.s +OEXT=.o +SMARTEXT=.sl +STATICLIBEXT=.a +EXEEXT= +SHORTSUFFIX=sun +endif +ifeq ($(OS_TARGET),qnx) +BATCHEXT=.sh +PPUEXT=.ppu +ASMEXT=.s +OEXT=.o +SMARTEXT=.sl +STATICLIBEXT=.a +EXEEXT= +SHORTSUFFIX=qnx +endif +ifeq ($(OS_TARGET),netware) +STATICLIBPREFIX= +PPUEXT=.ppu +OEXT=.o +ASMEXT=.s +SMARTEXT=.sl +STATICLIBEXT=.a +SHAREDLIBEXT=.nlm +EXEEXT=.nlm +SHORTSUFFIX=nw +endif +ifeq ($(OS_TARGET),netwlibc) +STATICLIBPREFIX= +PPUEXT=.ppu +OEXT=.o +ASMEXT=.s +SMARTEXT=.sl +STATICLIBEXT=.a +SHAREDLIBEXT=.nlm +EXEEXT=.nlm +SHORTSUFFIX=nwl +endif +ifeq ($(OS_TARGET),macos) +BATCHEXT= +PPUEXT=.ppu +ASMEXT=.s +OEXT=.o +SMARTEXT=.sl +STATICLIBEXT=.a +EXEEXT= +DEBUGSYMEXT=.xcoff +SHORTSUFFIX=mac +endif +endif +ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),) +FPCMADE=fpcmade.$(SHORTSUFFIX) +ZIPSUFFIX=$(SHORTSUFFIX) +ZIPCROSSPREFIX= +ZIPSOURCESUFFIX=src +ZIPEXAMPLESUFFIX=exm +else +FPCMADE=fpcmade.$(TARGETSUFFIX) +ZIPSOURCESUFFIX=.source +ZIPEXAMPLESUFFIX=.examples +ifdef CROSSCOMPILE +ZIPSUFFIX=.$(SOURCESUFFIX) +ZIPCROSSPREFIX=$(TARGETSUFFIX)- +else +ZIPSUFFIX=.$(TARGETSUFFIX) +ZIPCROSSPREFIX= +endif +endif +ifndef ECHO +ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(ECHO),) +ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(ECHO),) +ECHO= __missing_command_ECHO +else +ECHO:=$(firstword $(ECHO)) +endif +else +ECHO:=$(firstword $(ECHO)) +endif +endif +export ECHO +ifndef DATE +DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(DATE),) +DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(DATE),) +DATE= __missing_command_DATE +else +DATE:=$(firstword $(DATE)) +endif +else +DATE:=$(firstword $(DATE)) +endif +endif +export DATE +ifndef GINSTALL +GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(GINSTALL),) +GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(GINSTALL),) +GINSTALL= __missing_command_GINSTALL +else +GINSTALL:=$(firstword $(GINSTALL)) +endif +else +GINSTALL:=$(firstword $(GINSTALL)) +endif +endif +export GINSTALL +ifndef CPPROG +CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(CPPROG),) +CPPROG= __missing_command_CPPROG +else +CPPROG:=$(firstword $(CPPROG)) +endif +endif +export CPPROG +ifndef RMPROG +RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(RMPROG),) +RMPROG= __missing_command_RMPROG +else +RMPROG:=$(firstword $(RMPROG)) +endif +endif +export RMPROG +ifndef MVPROG +MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(MVPROG),) +MVPROG= __missing_command_MVPROG +else +MVPROG:=$(firstword $(MVPROG)) +endif +endif +export MVPROG +ifndef MKDIRPROG +MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(MKDIRPROG),) +MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(MKDIRPROG),) +MKDIRPROG= __missing_command_MKDIRPROG +else +MKDIRPROG:=$(firstword $(MKDIRPROG)) +endif +else +MKDIRPROG:=$(firstword $(MKDIRPROG)) +endif +endif +export MKDIRPROG +ifndef ECHOREDIR +ifndef inUnix +ECHOREDIR=echo +else +ECHOREDIR=$(ECHO) +endif +endif +ifndef COPY +COPY:=$(CPPROG) -fp +endif +ifndef COPYTREE +COPYTREE:=$(CPPROG) -Rfp +endif +ifndef MKDIRTREE +MKDIRTREE:=$(MKDIRPROG) -p +endif +ifndef MOVE +MOVE:=$(MVPROG) -f +endif +ifndef DEL +DEL:=$(RMPROG) -f +endif +ifndef DELTREE +DELTREE:=$(RMPROG) -rf +endif +ifndef INSTALL +ifdef inUnix +INSTALL:=$(GINSTALL) -c -m 644 +else +INSTALL:=$(COPY) +endif +endif +ifndef INSTALLEXE +ifdef inUnix +INSTALLEXE:=$(GINSTALL) -c -m 755 +else +INSTALLEXE:=$(COPY) +endif +endif +ifndef MKDIR +MKDIR:=$(GINSTALL) -m 755 -d +endif +export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR +ifndef PPUMOVE +PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(PPUMOVE),) +PPUMOVE= __missing_command_PPUMOVE +else +PPUMOVE:=$(firstword $(PPUMOVE)) +endif +endif +export PPUMOVE +ifndef FPCMAKE +FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(FPCMAKE),) +FPCMAKE= __missing_command_FPCMAKE +else +FPCMAKE:=$(firstword $(FPCMAKE)) +endif +endif +export FPCMAKE +ifndef ZIPPROG +ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(ZIPPROG),) +ZIPPROG= __missing_command_ZIPPROG +else +ZIPPROG:=$(firstword $(ZIPPROG)) +endif +endif +export ZIPPROG +ifndef TARPROG +TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(TARPROG),) +TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(TARPROG),) +TARPROG= __missing_command_TARPROG +else +TARPROG:=$(firstword $(TARPROG)) +endif +else +TARPROG:=$(firstword $(TARPROG)) +endif +endif +export TARPROG +ASNAME=$(BINUTILSPREFIX)as +LDNAME=$(BINUTILSPREFIX)ld +ARNAME=$(BINUTILSPREFIX)ar +RCNAME=$(BINUTILSPREFIX)rc +ifneq ($(findstring 1.0.,$(FPC_VERSION)),) +ifeq ($(OS_TARGET),win32) +ifeq ($(CROSSBINDIR),) +ASNAME=asw +LDNAME=ldw +ARNAME=arw +endif +endif +endif +ifndef ASPROG +ifdef CROSSBINDIR +ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT) +else +ASPROG=$(ASNAME) +endif +endif +ifndef LDPROG +ifdef CROSSBINDIR +LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT) +else +LDPROG=$(LDNAME) +endif +endif +ifndef RCPROG +ifdef CROSSBINDIR +RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT) +else +RCPROG=$(RCNAME) +endif +endif +ifndef ARPROG +ifdef CROSSBINDIR +ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT) +else +ARPROG=$(ARNAME) +endif +endif +AS=$(ASPROG) +LD=$(LDPROG) +RC=$(RCPROG) +AR=$(ARPROG) +PPAS=ppas$(SRCBATCHEXT) +ifdef inUnix +LDCONFIG=ldconfig +else +LDCONFIG= +endif +ifdef DATE +DATESTR:=$(shell $(DATE) +%Y%m%d) +else +DATESTR= +endif +ifndef UPXPROG +ifeq ($(OS_TARGET),go32v2) +UPXPROG:=1 +endif +ifeq ($(OS_TARGET),win32) +UPXPROG:=1 +endif +ifdef UPXPROG +UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH)))) +ifeq ($(UPXPROG),) +UPXPROG= +else +UPXPROG:=$(firstword $(UPXPROG)) +endif +else +UPXPROG= +endif +endif +export UPXPROG +ZIPOPT=-9 +ZIPEXT=.zip +ifeq ($(USETAR),bz2) +TAROPT=vj +TAREXT=.tar.bz2 +else +TAROPT=vz +TAREXT=.tar.gz +endif +override REQUIRE_PACKAGES=rtl +ifeq ($(FULL_TARGET),i386-linux) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-go32v2) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-win32) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-os2) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-freebsd) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-beos) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-netbsd) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-solaris) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-qnx) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-netware) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-openbsd) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-wdosx) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-darwin) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-emx) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-watcom) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-netwlibc) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-wince) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-embedded) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),i386-symbian) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),m68k-linux) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),m68k-freebsd) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),m68k-netbsd) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),m68k-amiga) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),m68k-atari) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),m68k-openbsd) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),m68k-palmos) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),m68k-embedded) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),powerpc-linux) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),powerpc-netbsd) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),powerpc-amiga) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),powerpc-macos) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),powerpc-darwin) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),powerpc-morphos) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),powerpc-embedded) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),sparc-linux) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),sparc-netbsd) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),sparc-solaris) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),sparc-embedded) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),x86_64-linux) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),x86_64-freebsd) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),x86_64-darwin) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),x86_64-win64) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),x86_64-embedded) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),arm-linux) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),arm-palmos) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),arm-wince) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),arm-gba) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),arm-nds) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),arm-embedded) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),arm-symbian) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),powerpc64-linux) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),powerpc64-darwin) +REQUIRE_PACKAGES_RTL=1 +endif +ifeq ($(FULL_TARGET),powerpc64-embedded) +REQUIRE_PACKAGES_RTL=1 +endif +ifdef REQUIRE_PACKAGES_RTL +PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR)))))) +ifneq ($(PACKAGEDIR_RTL),) +ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),) +UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX) +else +UNITDIR_RTL=$(PACKAGEDIR_RTL) +endif +ifdef CHECKDEPEND +$(PACKAGEDIR_RTL)/$(FPCMADE): + $(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE) +override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE) +endif +else +PACKAGEDIR_RTL= +UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR))))) +ifneq ($(UNITDIR_RTL),) +UNITDIR_RTL:=$(firstword $(UNITDIR_RTL)) +else +UNITDIR_RTL= +endif +endif +ifdef UNITDIR_RTL +override COMPILER_UNITDIR+=$(UNITDIR_RTL) +endif +endif +ifndef NOCPUDEF +override FPCOPTDEF=$(CPU_TARGET) +endif +ifneq ($(OS_TARGET),$(OS_SOURCE)) +override FPCOPT+=-T$(OS_TARGET) +endif +ifneq ($(CPU_TARGET),$(CPU_SOURCE)) +override FPCOPT+=-P$(CPU_TARGET) +endif +ifeq ($(OS_SOURCE),openbsd) +override FPCOPT+=-FD$(NEW_BINUTILS_PATH) +endif +ifndef CROSSBOOTSTRAP +ifneq ($(BINUTILSPREFIX),) +override FPCOPT+=-XP$(BINUTILSPREFIX) +endif +ifneq ($(BINUTILSPREFIX),) +override FPCOPT+=-Xr$(RLINKPATH) +endif +endif +ifdef UNITDIR +override FPCOPT+=$(addprefix -Fu,$(UNITDIR)) +endif +ifdef LIBDIR +override FPCOPT+=$(addprefix -Fl,$(LIBDIR)) +endif +ifdef OBJDIR +override FPCOPT+=$(addprefix -Fo,$(OBJDIR)) +endif +ifdef INCDIR +override FPCOPT+=$(addprefix -Fi,$(INCDIR)) +endif +ifdef LINKSMART +override FPCOPT+=-XX +endif +ifdef CREATESMART +override FPCOPT+=-CX +endif +ifdef DEBUG +override FPCOPT+=-gl +override FPCOPTDEF+=DEBUG +endif +ifdef RELEASE +ifneq ($(findstring 2.0.,$(FPC_VERSION)),) +ifeq ($(CPU_TARGET),i386) +FPCCPUOPT:=-OG2p3 +endif +ifeq ($(CPU_TARGET),powerpc) +FPCCPUOPT:=-O1r +endif +else +FPCCPUOPT:=-O2 +endif +override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n +override FPCOPTDEF+=RELEASE +endif +ifdef STRIP +override FPCOPT+=-Xs +endif +ifdef OPTIMIZE +override FPCOPT+=-O2 +endif +ifdef VERBOSE +override FPCOPT+=-vwni +endif +ifdef COMPILER_OPTIONS +override FPCOPT+=$(COMPILER_OPTIONS) +endif +ifdef COMPILER_UNITDIR +override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR)) +endif +ifdef COMPILER_LIBRARYDIR +override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR)) +endif +ifdef COMPILER_OBJECTDIR +override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR)) +endif +ifdef COMPILER_INCLUDEDIR +override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR)) +endif +ifdef CROSSBINDIR +override FPCOPT+=-FD$(CROSSBINDIR) +endif +ifdef COMPILER_TARGETDIR +override FPCOPT+=-FE$(COMPILER_TARGETDIR) +ifeq ($(COMPILER_TARGETDIR),.) +override TARGETDIRPREFIX= +else +override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/ +endif +endif +ifdef COMPILER_UNITTARGETDIR +override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR) +ifeq ($(COMPILER_UNITTARGETDIR),.) +override UNITTARGETDIRPREFIX= +else +override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/ +endif +else +ifdef COMPILER_TARGETDIR +override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR) +override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX) +endif +endif +ifdef CREATESHARED +override FPCOPT+=-Cg +ifeq ($(CPU_TARGET),i386) +override FPCOPT+=-Aas +endif +endif +ifeq ($(findstring 2.0.,$(FPC_VERSION)),) +ifeq ($(OS_TARGET),linux) +ifeq ($(CPU_TARGET),x86_64) +override FPCOPT+=-Cg +endif +endif +endif +ifdef LINKSHARED +endif +ifdef OPT +override FPCOPT+=$(OPT) +endif +ifdef FPCOPTDEF +override FPCOPT+=$(addprefix -d,$(FPCOPTDEF)) +endif +ifdef CFGFILE +override FPCOPT+=@$(CFGFILE) +endif +ifdef USEENV +override FPCEXTCMD:=$(FPCOPT) +override FPCOPT:=!FPCEXTCMD +export FPCEXTCMD +endif +override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET) +override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE) +ifneq ($(AFULL_TARGET),$(AFULL_SOURCE)) +override ACROSSCOMPILE=1 +endif +ifdef ACROSSCOMPILE +override FPCOPT+=$(CROSSOPT) +endif +override COMPILER:=$(FPC) $(FPCOPT) +ifeq (,$(findstring -s ,$(COMPILER))) +EXECPPAS= +else +ifeq ($(FULL_SOURCE),$(FULL_TARGET)) +ifdef RUNBATCH +EXECPPAS:=@$(RUNBATCH) $(PPAS) +else +EXECPPAS:=@$(PPAS) +endif +endif +endif +.PHONY: fpc_units +ifneq ($(TARGET_UNITS)$(TARGET_IMPLICITUNITS),) +override ALLTARGET+=fpc_units +override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS)) +override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITUNITS)) +override INSTALLPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES) +override CLEANPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES) +endif +fpc_units: $(COMPILER_UNITTARGETDIR) $(UNITPPUFILES) +ifdef TARGET_RSTS +override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS)) +override CLEANRSTFILES+=$(RSTFILES) +endif +.PHONY: fpc_examples +ifneq ($(TARGET_EXAMPLES),) +HASEXAMPLES=1 +override EXAMPLESOURCEFILES:=$(wildcard $(addsuffix .pp,$(TARGET_EXAMPLES)) $(addsuffix .pas,$(TARGET_EXAMPLES)) $(addsuffix .lpr,$(TARGET_EXAMPLES)) $(addsuffix .dpr,$(TARGET_EXAMPLES))) +override EXAMPLEFILES:=$(addsuffix $(EXEEXT),$(TARGET_EXAMPLES)) +override EXAMPLEOFILES:=$(addsuffix $(OEXT),$(TARGET_EXAMPLES)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_EXAMPLES))) $(addprefix $(IMPORTLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_EXAMPLES))) +override CLEANEXEFILES+=$(EXAMPLEFILES) $(EXAMPLEOFILES) +ifeq ($(OS_TARGET),os2) +override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_EXAMPLES)) +endif +ifeq ($(OS_TARGET),emx) +override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_EXAMPLES)) +endif +endif +ifneq ($(TARGET_EXAMPLEDIRS),) +HASEXAMPLES=1 +endif +fpc_examples: all $(EXAMPLEFILES) $(addsuffix _all,$(TARGET_EXAMPLEDIRS)) +.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared +$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET) + @$(ECHOREDIR) Compiled > $(FPCMADE) +fpc_all: $(FPCMADE) +fpc_smart: + $(MAKE) all LINKSMART=1 CREATESMART=1 +fpc_debug: + $(MAKE) all DEBUG=1 +fpc_release: + $(MAKE) all RELEASE=1 +.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .rc .res +$(COMPILER_UNITTARGETDIR): + $(MKDIRTREE) $(COMPILER_UNITTARGETDIR) +$(COMPILER_TARGETDIR): + $(MKDIRTREE) $(COMPILER_TARGETDIR) +%$(PPUEXT): %.pp + $(COMPILER) $< + $(EXECPPAS) +%$(PPUEXT): %.pas + $(COMPILER) $< + $(EXECPPAS) +%$(EXEEXT): %.pp + $(COMPILER) $< + $(EXECPPAS) +%$(EXEEXT): %.pas + $(COMPILER) $< + $(EXECPPAS) +%$(EXEEXT): %.lpr + $(COMPILER) $< + $(EXECPPAS) +%$(EXEEXT): %.dpr + $(COMPILER) $< + $(EXECPPAS) +%.res: %.rc + windres -i $< -o $@ +vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR) +vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR) +vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR) +vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR) +vpath %.inc $(COMPILER_INCLUDEDIR) +vpath %$(OEXT) $(COMPILER_UNITTARGETDIR) +vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR) +.PHONY: fpc_shared +override INSTALLTARGET+=fpc_shared_install +ifndef SHARED_LIBVERSION +SHARED_LIBVERSION=$(FPC_VERSION) +endif +ifndef SHARED_LIBNAME +SHARED_LIBNAME=$(PACKAGE_NAME) +endif +ifndef SHARED_FULLNAME +SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT) +endif +ifndef SHARED_LIBUNITS +SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS) +override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS)) +endif +fpc_shared: +ifdef HASSHAREDLIB + $(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1 +ifneq ($(SHARED_BUILD),n) + $(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR) +endif +else + @$(ECHO) Shared Libraries not supported +endif +fpc_shared_install: +ifneq ($(SHARED_BUILD),n) +ifneq ($(SHARED_LIBUNITS),) +ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),) + $(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR) +endif +endif +endif +.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall +ifdef INSTALL_UNITS +override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS)) +endif +ifdef INSTALL_BUILDUNIT +override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES)) +endif +ifdef INSTALLPPUFILES +override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) +ifneq ($(UNITTARGETDIRPREFIX),) +override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES))) +override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES)))) +endif +override INSTALL_CREATEPACKAGEFPC=1 +endif +ifdef INSTALLEXEFILES +ifneq ($(TARGETDIRPREFIX),) +override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES))) +endif +endif +fpc_install: all $(INSTALLTARGET) +ifdef INSTALLEXEFILES + $(MKDIR) $(INSTALL_BINDIR) +ifdef UPXPROG + -$(UPXPROG) $(INSTALLEXEFILES) +endif + $(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR) +endif +ifdef INSTALL_CREATEPACKAGEFPC +ifdef FPCMAKE +ifdef PACKAGE_VERSION +ifneq ($(wildcard Makefile.fpc),) + $(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc + $(MKDIR) $(INSTALL_UNITDIR) + $(INSTALL) Package.fpc $(INSTALL_UNITDIR) +endif +endif +endif +endif +ifdef INSTALLPPUFILES + $(MKDIR) $(INSTALL_UNITDIR) + $(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR) +ifneq ($(INSTALLPPULINKFILES),) + $(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR) +endif +ifneq ($(wildcard $(LIB_FULLNAME)),) + $(MKDIR) $(INSTALL_LIBDIR) + $(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR) +ifdef inUnix + ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME) +endif +endif +endif +ifdef INSTALL_FILES + $(MKDIR) $(INSTALL_DATADIR) + $(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR) +endif +fpc_sourceinstall: distclean + $(MKDIR) $(INSTALL_SOURCEDIR) + $(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR) +fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS)) +ifdef HASEXAMPLES + $(MKDIR) $(INSTALL_EXAMPLEDIR) +endif +ifdef EXAMPLESOURCEFILES + $(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR) +endif +ifdef TARGET_EXAMPLEDIRS + $(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR) +endif +.PHONY: fpc_distinstall +fpc_distinstall: install exampleinstall +.PHONY: fpc_zipinstall fpc_zipsourceinstall fpc_zipexampleinstall +ifndef PACKDIR +ifndef inUnix +PACKDIR=$(BASEDIR)/../fpc-pack +else +PACKDIR=/tmp/fpc-pack +endif +endif +ifndef ZIPNAME +ifdef DIST_ZIPNAME +ZIPNAME=$(DIST_ZIPNAME) +else +ZIPNAME=$(PACKAGE_NAME) +endif +endif +ifndef FULLZIPNAME +FULLZIPNAME=$(ZIPCROSSPREFIX)$(ZIPPREFIX)$(ZIPNAME)$(ZIPSUFFIX) +endif +ifndef ZIPTARGET +ifdef DIST_ZIPTARGET +ZIPTARGET=DIST_ZIPTARGET +else +ZIPTARGET=install +endif +endif +ifndef USEZIP +ifdef inUnix +USETAR=1 +endif +endif +ifndef inUnix +USEZIPWRAPPER=1 +endif +ifdef USEZIPWRAPPER +ZIPPATHSEP=$(PATHSEP) +ZIPWRAPPER=$(subst /,$(PATHSEP),$(DIST_DESTDIR)/fpczip$(SRCBATCHEXT)) +else +ZIPPATHSEP=/ +endif +ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR)) +ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR)) +ifdef USETAR +ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(TAREXT) +ZIPCMD_ZIP:=$(TARPROG) cf$(TAROPT) $(ZIPDESTFILE) * +else +ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEXT) +ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) * +endif +fpc_zipinstall: + $(MAKE) $(ZIPTARGET) INSTALL_PREFIX=$(PACKDIR) ZIPINSTALL=1 + $(MKDIR) $(DIST_DESTDIR) + $(DEL) $(ZIPDESTFILE) +ifdef USEZIPWRAPPER +ifneq ($(ECHOREDIR),echo) + $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDPACK))" > $(ZIPWRAPPER) + $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_ZIP))" >> $(ZIPWRAPPER) + $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDBASE))" >> $(ZIPWRAPPER) +else + echo $(ZIPCMD_CDPACK) > $(ZIPWRAPPER) + echo $(ZIPCMD_ZIP) >> $(ZIPWRAPPER) + echo $(ZIPCMD_CDBASE) >> $(ZIPWRAPPER) +endif +ifdef inUnix + /bin/sh $(ZIPWRAPPER) +else +ifdef RUNBATCH + $(RUNBATCH) (ZIPWRAPPER) +else + $(ZIPWRAPPER) +endif +endif + $(DEL) $(ZIPWRAPPER) +else + $(ZIPCMD_CDPACK) ; $(ZIPCMD_ZIP) ; $(ZIPCMD_CDBASE) +endif + $(DELTREE) $(PACKDIR) +fpc_zipsourceinstall: + $(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall ZIPSUFFIX=$(ZIPSOURCESUFFIX) +fpc_zipexampleinstall: +ifdef HASEXAMPLES + $(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall ZIPSUFFIX=$(ZIPEXAMPLESUFFIX) +endif +fpc_zipdistinstall: + $(MAKE) fpc_zipinstall ZIPTARGET=distinstall +.PHONY: fpc_clean fpc_cleanall fpc_distclean +ifdef EXEFILES +override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES)) +endif +ifdef CLEAN_UNITS +override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS)) +endif +ifdef CLEANPPUFILES +override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) +ifdef DEBUGSYMEXT +override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES)) +endif +override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES)) +override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES))) +endif +fpc_clean: $(CLEANTARGET) +ifdef CLEANEXEFILES + -$(DEL) $(CLEANEXEFILES) +endif +ifdef CLEANPPUFILES + -$(DEL) $(CLEANPPUFILES) +endif +ifneq ($(CLEANPPULINKFILES),) + -$(DEL) $(CLEANPPULINKFILES) +endif +ifdef CLEANRSTFILES + -$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES)) +endif +ifdef CLEAN_FILES + -$(DEL) $(CLEAN_FILES) +endif +ifdef LIB_NAME + -$(DEL) $(LIB_NAME) $(LIB_FULLNAME) +endif + -$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE) + -$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT) +fpc_cleanall: $(CLEANTARGET) +ifdef CLEANEXEFILES + -$(DEL) $(CLEANEXEFILES) +endif +ifdef COMPILER_UNITTARGETDIR +ifdef CLEANPPUFILES + -$(DEL) $(CLEANPPUFILES) +endif +ifneq ($(CLEANPPULINKFILES),) + -$(DEL) $(CLEANPPULINKFILES) +endif +ifdef CLEANRSTFILES + -$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES)) +endif +endif + -$(DELTREE) units + -$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT) +ifneq ($(PPUEXT),.ppu) + -$(DEL) *.o *.ppu *.a +endif + -$(DELTREE) *$(SMARTEXT) + -$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE) + -$(DEL) *_ppas$(BATCHEXT) +ifdef AOUTEXT + -$(DEL) *$(AOUTEXT) +endif +ifdef DEBUGSYMEXT + -$(DEL) *$(DEBUGSYMEXT) +endif +fpc_distclean: cleanall +.PHONY: fpc_baseinfo +override INFORULES+=fpc_baseinfo +fpc_baseinfo: + @$(ECHO) + @$(ECHO) == Package info == + @$(ECHO) Package Name..... $(PACKAGE_NAME) + @$(ECHO) Package Version.. $(PACKAGE_VERSION) + @$(ECHO) + @$(ECHO) == Configuration info == + @$(ECHO) + @$(ECHO) FPC.......... $(FPC) + @$(ECHO) FPC Version.. $(FPC_VERSION) + @$(ECHO) Source CPU... $(CPU_SOURCE) + @$(ECHO) Target CPU... $(CPU_TARGET) + @$(ECHO) Source OS.... $(OS_SOURCE) + @$(ECHO) Target OS.... $(OS_TARGET) + @$(ECHO) Full Source.. $(FULL_SOURCE) + @$(ECHO) Full Target.. $(FULL_TARGET) + @$(ECHO) SourceSuffix. $(SOURCESUFFIX) + @$(ECHO) TargetSuffix. $(TARGETSUFFIX) + @$(ECHO) + @$(ECHO) == Directory info == + @$(ECHO) + @$(ECHO) Required pkgs... $(REQUIRE_PACKAGES) + @$(ECHO) + @$(ECHO) Basedir......... $(BASEDIR) + @$(ECHO) FPCDir.......... $(FPCDIR) + @$(ECHO) CrossBinDir..... $(CROSSBINDIR) + @$(ECHO) UnitsDir........ $(UNITSDIR) + @$(ECHO) PackagesDir..... $(PACKAGESDIR) + @$(ECHO) + @$(ECHO) GCC library..... $(GCCLIBDIR) + @$(ECHO) Other library... $(OTHERLIBDIR) + @$(ECHO) + @$(ECHO) == Tools info == + @$(ECHO) + @$(ECHO) As........ $(AS) + @$(ECHO) Ld........ $(LD) + @$(ECHO) Ar........ $(AR) + @$(ECHO) Rc........ $(RC) + @$(ECHO) + @$(ECHO) Mv........ $(MVPROG) + @$(ECHO) Cp........ $(CPPROG) + @$(ECHO) Rm........ $(RMPROG) + @$(ECHO) GInstall.. $(GINSTALL) + @$(ECHO) Echo...... $(ECHO) + @$(ECHO) Shell..... $(SHELL) + @$(ECHO) Date...... $(DATE) + @$(ECHO) FPCMake... $(FPCMAKE) + @$(ECHO) PPUMove... $(PPUMOVE) + @$(ECHO) Upx....... $(UPXPROG) + @$(ECHO) Zip....... $(ZIPPROG) + @$(ECHO) + @$(ECHO) == Object info == + @$(ECHO) + @$(ECHO) Target Loaders........ $(TARGET_LOADERS) + @$(ECHO) Target Units.......... $(TARGET_UNITS) + @$(ECHO) Target Implicit Units. $(TARGET_IMPLICITUNITS) + @$(ECHO) Target Programs....... $(TARGET_PROGRAMS) + @$(ECHO) Target Dirs........... $(TARGET_DIRS) + @$(ECHO) Target Examples....... $(TARGET_EXAMPLES) + @$(ECHO) Target ExampleDirs.... $(TARGET_EXAMPLEDIRS) + @$(ECHO) + @$(ECHO) Clean Units......... $(CLEAN_UNITS) + @$(ECHO) Clean Files......... $(CLEAN_FILES) + @$(ECHO) + @$(ECHO) Install Units....... $(INSTALL_UNITS) + @$(ECHO) Install Files....... $(INSTALL_FILES) + @$(ECHO) + @$(ECHO) == Install info == + @$(ECHO) + @$(ECHO) DateStr.............. $(DATESTR) + @$(ECHO) ZipName.............. $(ZIPNAME) + @$(ECHO) ZipPrefix............ $(ZIPPREFIX) + @$(ECHO) ZipCrossPrefix....... $(ZIPCROSSPREFIX) + @$(ECHO) ZipSuffix............ $(ZIPSUFFIX) + @$(ECHO) FullZipName.......... $(FULLZIPNAME) + @$(ECHO) Install FPC Package.. $(INSTALL_FPCPACKAGE) + @$(ECHO) + @$(ECHO) Install base dir..... $(INSTALL_BASEDIR) + @$(ECHO) Install binary dir... $(INSTALL_BINDIR) + @$(ECHO) Install library dir.. $(INSTALL_LIBDIR) + @$(ECHO) Install units dir.... $(INSTALL_UNITDIR) + @$(ECHO) Install source dir... $(INSTALL_SOURCEDIR) + @$(ECHO) Install doc dir...... $(INSTALL_DOCDIR) + @$(ECHO) Install example dir.. $(INSTALL_EXAMPLEDIR) + @$(ECHO) Install data dir..... $(INSTALL_DATADIR) + @$(ECHO) + @$(ECHO) Dist destination dir. $(DIST_DESTDIR) + @$(ECHO) Dist zip name........ $(DIST_ZIPNAME) + @$(ECHO) +.PHONY: fpc_info +fpc_info: $(INFORULES) +.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \ + fpc_makefile_dirs +fpc_makefile: + $(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc +fpc_makefile_sub1: +ifdef TARGET_DIRS + $(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS)) +endif +ifdef TARGET_EXAMPLEDIRS + $(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS)) +endif +fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS)) +fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2 +fpc_makefiles: fpc_makefile fpc_makefile_dirs +all: fpc_all +debug: fpc_debug +smart: fpc_smart +release: fpc_release +units: fpc_units +examples: fpc_examples +shared: fpc_shared +install: fpc_install +sourceinstall: fpc_sourceinstall +exampleinstall: fpc_exampleinstall +distinstall: fpc_distinstall +zipinstall: fpc_zipinstall +zipsourceinstall: fpc_zipsourceinstall +zipexampleinstall: fpc_zipexampleinstall +zipdistinstall: fpc_zipdistinstall +clean: fpc_clean +distclean: fpc_distclean +cleanall: fpc_cleanall +info: fpc_info +makefiles: fpc_makefiles +.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles +ifneq ($(wildcard fpcmake.loc),) +include fpcmake.loc +endif +.NOTPARALLEL: diff --git a/packages/cdrom/Makefile.fpc b/packages/cdrom/Makefile.fpc new file mode 100644 index 0000000000..5245bba854 --- /dev/null +++ b/packages/cdrom/Makefile.fpc @@ -0,0 +1,26 @@ +# +# Makefile.fpc for cdrom +# + +[package] +name=cdrom +version=2.0.0 + +[target] +units=cdrom discid +implicitunits_win32=scsidefs wnaspi32 cdromioctl wincd +implicitunits_linux=major lincd +examples=showcds getdiscid + +[install] +fpcpackage=y + +[compiler] +includedir=src +sourcedir=src tests + +[default] +fpcdir=../.. + +[rules] +.NOTPARALLEL: diff --git a/packages/cdrom/examples/getdiscid.pp b/packages/cdrom/examples/getdiscid.pp new file mode 100644 index 0000000000..cd5d5ddf59 --- /dev/null +++ b/packages/cdrom/examples/getdiscid.pp @@ -0,0 +1,43 @@ +{ + Copyright (c) 1999-2000 by Michael Van Canneyt + + Demonstrates DiscID unit usage. + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} + +program getdiscid; + +uses cdrom,discid; + +Var + TheDiscID : cardinal; + Tracks, i : Integer; + Entries : Array[1..100] of TTocEntry; + Device : string; + +begin + Case ParamCount of + 0 : Device:='/dev/cdrom'; + 1 : Device:=Paramstr(1); + else + Writeln('Usage: getdiscid [devicefile]'); + halt(1); + end; + Tracks := ReadCDTOC(Device,Entries); + If Tracks<0 then + Writeln('Error reading TOC of device ',device) + else + begin + Writeln('Disk has ',tracks,' tracks.'); + TheDiscID := CDDBDiscID(Entries,Tracks); + Writeln('Disc ID : ',lowercase(HexStr(theDiscID,8))); + Writeln('CDDB Query : ',GetCDDBQueryString(Entries,Tracks)); + end; +end. diff --git a/packages/cdrom/examples/showcds.pp b/packages/cdrom/examples/showcds.pp new file mode 100644 index 0000000000..d9b41aef2a --- /dev/null +++ b/packages/cdrom/examples/showcds.pp @@ -0,0 +1,22 @@ +program showcds; + +{$mode objfpc} +{$h+} + +uses cdrom,sysutils; + +Var + Drives : Array[1..10] of String; + I,Count : Integer; + +begin + Try + Count:=GetCDRomDevices(Drives); + Writeln('This PC has ',count,' CD-ROM drives'); + For I:=1 to count do + Writeln('Drive ',i,' on device: ',Drives[i]); + Except + On E : exception do + Writeln(E.ClassName,' exception caught with message: ',E.Message); + end; +end. diff --git a/packages/cdrom/fpmake.pp b/packages/cdrom/fpmake.pp new file mode 100644 index 0000000000..4047ab930e --- /dev/null +++ b/packages/cdrom/fpmake.pp @@ -0,0 +1,45 @@ +{$ifndef ALLPACKAGES} +{$mode objfpc}{$H+} +program fpmake; + +uses fpmkunit; + +Var + P : TPackage; + T : TTarget; +begin + With Installer do + begin +{$endif ALLPACKAGES} + + P:=AddPackage('cdrom'); +{$ifdef ALLPACKAGES} + P.Directory:='cdrom'; +{$endif ALLPACKAGES} + P.Version:='2.0.0'; + P.SourcePath.Add('src'); + + T:=P.Targets.AddUnit('cdrom.pp'); + with T.Dependencies do + begin + AddInclude('cdromlin.inc'); + AddUnit('lincd'); + end; + T:=P.Targets.AddUnit('discid.pp'); + with T.Dependencies do + begin + AddUnit('cdrom'); + end; + T:=P.Targets.AddUnit('lincd.pp'); + with T.Dependencies do + begin + AddUnit('major'); + end; + T:=P.Targets.AddUnit('major.pp'); + + +{$ifndef ALLPACKAGES} + Run; + end; +end. +{$endif ALLPACKAGES} diff --git a/packages/cdrom/src/cdrom.pp b/packages/cdrom/src/cdrom.pp new file mode 100644 index 0000000000..03bc62144e --- /dev/null +++ b/packages/cdrom/src/cdrom.pp @@ -0,0 +1,39 @@ +{ + Copyright (c) 1999-2000 by Michael Van Canneyt + + Unit to read a CDROM disc TOC and get a list of CD Rom devices + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} +unit cdrom; + +{$mode objfpc} +{$h+} + + +interface + +Type + TTocEntry = Record + min, sec, frame : Integer; + end; + PTocEntry = ^TTocEntry; + +Function ReadCDTOC(Device : String; Var CDTOC : Array of TTocEntry) : Integer; +Function GetCDRomDevices(Var Devices : Array of string) : Integer; + +Implementation + +{$ifdef linux} +{$i cdromlin.inc} +{$else} +{$i cdromw32.inc} +{$endif} + +end. diff --git a/packages/cdrom/src/cdromioctl.pp b/packages/cdrom/src/cdromioctl.pp new file mode 100644 index 0000000000..70fa8da351 --- /dev/null +++ b/packages/cdrom/src/cdromioctl.pp @@ -0,0 +1,168 @@ +unit cdromioctl; +{$mode objfpc} +interface + +uses windows; + +{ + Automatically converted by H2Pas 0.99.15 from cdromioctl.h + The following command line parameters were used: + cdromioctl.h +} + +{$PACKRECORDS C} + + { + distilled information from various header files from Microsoft's + DDK for Windows NT 4.0 + } + + type + + SCSI_PASS_THROUGH = record + Length : USHORT; + ScsiStatus : UCHAR; + PathId : UCHAR; + TargetId : UCHAR; + Lun : UCHAR; + CdbLength : UCHAR; + SenseInfoLength : UCHAR; + DataIn : UCHAR; + DataTransferLength : ULONG; + TimeOutValue : ULONG; + DataBufferOffset : ULONG; + SenseInfoOffset : ULONG; + Cdb : array[0..15] of UCHAR; + end; + PSCSI_PASS_THROUGH = ^SCSI_PASS_THROUGH; + + SCSI_PASS_THROUGH_DIRECT = record + Length : USHORT; + ScsiStatus : UCHAR; + PathId : UCHAR; + TargetId : UCHAR; + Lun : UCHAR; + CdbLength : UCHAR; + SenseInfoLength : UCHAR; + DataIn : UCHAR; + DataTransferLength : ULONG; + TimeOutValue : ULONG; + DataBuffer : PVOID; + SenseInfoOffset : ULONG; + Cdb : array[0..15] of UCHAR; + end; + PSCSI_PASS_THROUGH_DIRECT = ^SCSI_PASS_THROUGH_DIRECT; + + SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER = record + spt : SCSI_PASS_THROUGH_DIRECT; + Filler : ULONG; + ucSenseBuf : array[0..31] of UCHAR; + end; + PSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER = ^SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER; + { + method codes + } + + const + METHOD_BUFFERED = 0; + METHOD_IN_DIRECT = 1; + METHOD_OUT_DIRECT = 2; + METHOD_NEITHER = 3; + { + file access values + } + FILE_ANY_ACCESS = 0; + FILE_READ_ACCESS = $0001; + FILE_WRITE_ACCESS = $0002; + IOCTL_CDROM_BASE = $00000002; + IOCTL_SCSI_BASE = $00000004; + { + constants for DataIn member of SCSI_PASS_THROUGH structures + } + SCSI_IOCTL_DATA_OUT = 0; + SCSI_IOCTL_DATA_IN = 1; + SCSI_IOCTL_DATA_UNSPECIFIED = 2; + + { + Standard IOCTL define + } + + Function CTL_CODE( ADevType, AFunction, AMethod, AAccess : Longint) : Longint; + function IOCTL_CDROM_READ_TOC : Longint; + function IOCTL_CDROM_GET_LAST_SESSION : longint; + function IOCTL_SCSI_PASS_THROUGH : longint; + function IOCTL_SCSI_MINIPORT : longint; + function IOCTL_SCSI_GET_INQUIRY_DATA : longint; + function IOCTL_SCSI_GET_CAPABILITIES : longint; + function IOCTL_SCSI_PASS_THROUGH_DIRECT : longint; + function IOCTL_SCSI_GET_ADDRESS : longint; + + +implementation + + { was #define dname def_expr } + function IOCTL_CDROM_GET_LAST_SESSION : longint; + { return type might be wrong } + begin + IOCTL_CDROM_GET_LAST_SESSION:=CTL_CODE(IOCTL_CDROM_BASE,$000E,METHOD_BUFFERED,FILE_READ_ACCESS); + end; + + { was #define dname def_expr } + function IOCTL_SCSI_PASS_THROUGH : longint; + { return type might be wrong } + begin + IOCTL_SCSI_PASS_THROUGH:=CTL_CODE(IOCTL_SCSI_BASE,$0401,METHOD_BUFFERED,FILE_READ_ACCESS or FILE_WRITE_ACCESS); + end; + + { was #define dname def_expr } + function IOCTL_SCSI_MINIPORT : longint; + { return type might be wrong } + begin + IOCTL_SCSI_MINIPORT:=CTL_CODE(IOCTL_SCSI_BASE,$0402,METHOD_BUFFERED,FILE_READ_ACCESS or FILE_WRITE_ACCESS); + end; + + { was #define dname def_expr } + function IOCTL_SCSI_GET_INQUIRY_DATA : longint; + { return type might be wrong } + begin + IOCTL_SCSI_GET_INQUIRY_DATA:=CTL_CODE(IOCTL_SCSI_BASE,$0403,METHOD_BUFFERED,FILE_ANY_ACCESS); + end; + + { was #define dname def_expr } + function IOCTL_SCSI_GET_CAPABILITIES : longint; + { return type might be wrong } + begin + IOCTL_SCSI_GET_CAPABILITIES:=CTL_CODE(IOCTL_SCSI_BASE,$0404,METHOD_BUFFERED,FILE_ANY_ACCESS); + end; + + { was #define dname def_expr } + function IOCTL_SCSI_PASS_THROUGH_DIRECT : longint; + { return type might be wrong } + begin + IOCTL_SCSI_PASS_THROUGH_DIRECT:=CTL_CODE(IOCTL_SCSI_BASE,$0405,METHOD_BUFFERED,FILE_READ_ACCESS or FILE_WRITE_ACCESS); + end; + + { was #define dname def_expr } + function IOCTL_SCSI_GET_ADDRESS : longint; + { return type might be wrong } + begin + IOCTL_SCSI_GET_ADDRESS:=CTL_CODE(IOCTL_SCSI_BASE,$0406,METHOD_BUFFERED,FILE_ANY_ACCESS); + end; + +Function CTL_CODE( ADevType, AFunction, AMethod, AAccess : Longint) : Longint; + +begin + Result:= (ADevType shl 16 ) + Or (AAccess shl 14) + Or (AFunction SHL 2) + Or AMethod; +end; + +function IOCTL_CDROM_READ_TOC : Longint; + +begin + Result:=CTL_CODE(IOCTL_CDROM_BASE, 0, METHOD_BUFFERED, FILE_READ_ACCESS ) +end; + + +end. diff --git a/packages/cdrom/src/cdromlin.inc b/packages/cdrom/src/cdromlin.inc new file mode 100644 index 0000000000..43e1b1178e --- /dev/null +++ b/packages/cdrom/src/cdromlin.inc @@ -0,0 +1,136 @@ +uses + baseunix, + unix, + lincd; + +Function ReadCDTOC(Device : String; Var CDTOC : Array of TTocEntry) : Integer; + +Var + I,Drive : Integer; + tochdr : Tcdrom_tochdr; + tocentry : tcdrom_tocentry; + +begin + drive:=fpOpen(Device, Open_RDONLY or Open_NONBLOCK); + if drive<0 then + begin + Result:=-1; + Exit; + end; + if fpioctl(drive, CDROMREADTOCHDR, @tochdr)<>0 then + begin + Result:=-1; + Exit; + end; + If (tochdr.cdth_trk1-tochdr.cdth_trk0)>High(CDToc) then + Result:=-2 + else + begin + Result:=0; + for i := tochdr.cdth_trk0 to tochdr.cdth_trk1 do + begin + tocentry.cdte_track := i; + tocentry.cdte_format := CDROM_MSF; + fpIOCtl(drive, CDROMREADTOCENTRY, @tocentry); + // We should do some error checking here actually. + With cdtoc[result] do + begin + min := tocentry.cdte_addr.msf.minute; + sec := tocentry.cdte_addr.msf.second; + frame := tocentry.cdte_addr.msf.frame; + inc(frame,min*60*75); + inc(frame,sec*75); + end; + Inc(result); + end; + tocentry.cdte_track := $AA; + tocentry.cdte_format := CDROM_MSF; + fpIOCtl(drive, CDROMREADTOCENTRY, @tocentry); + With cdtoc[Result] do + begin + Min := tocentry.cdte_addr.msf.minute; + sec := tocentry.cdte_addr.msf.second; + frame := tocentry.cdte_addr.msf.frame; + inc(frame, min*60*75); + inc(frame, sec*75); + end; + end; + fpClose(drive); +end; + +{ --------------------------------------------------------------------- + /etc/fstab scanning. + ---------------------------------------------------------------------} + +Function ExtractDevice(S : String) : String; + +Var + P,L : Integer; + +begin + Result:=''; + P:=Pos('#',S); + If P<>0 then + S:=Copy(S,1,P-1); + If Length(S)>0 then + begin + P:=1; + While (P<=Length(S)) and (S[P] in [#9,' ']) do + Inc(p); + L:=P; + While (L<=Length(S)) and (Not (S[L] in [#9,' '])) do + Inc(L); + If L>P then + Result:=Copy(S,P,L-P); + end; +end; + +Function TestFSTab(var Devices : Array of String) : Integer; + +Var + fstab : text; + Line : String; + +begin + Result:=0; + Assign(FSTab,'/etc/fstab'); + {$i-} + Reset(fstab); + {$i+} + If IOResult=0 then + begin + While Not EOF(fstab) do + begin + ReadLn(fsTab,Line); + Line:=ExtractDevice(Line); + If IsCdDevice(Line) and (Result<=High(Devices)) then + begin + Devices[Result]:=Line; + inc(Result); + end; + end; + Close(fstab); + end + else + Result:=-1; +end; + +Function GetCDRomDevices(Var Devices : Array of string) : Integer; + +Var + S : String; + +begin + Result:=TestFSTab(Devices); + If (Result<1) then + begin + S:=DetectCD; + If (S<>'') then + begin + Devices[0]:=S; + Result:=1; + end; + end +end; + + diff --git a/packages/cdrom/src/cdromw32.inc b/packages/cdrom/src/cdromw32.inc new file mode 100644 index 0000000000..578e286b18 --- /dev/null +++ b/packages/cdrom/src/cdromw32.inc @@ -0,0 +1,50 @@ +uses wincd; + + +Function ReadCDTOC(Device : String; Var CDTOC : Array of TTocEntry) : Integer; + +Var + Toc : TToc; + I,Res : Integer; + +begin + Res:=ReadTOC(Device,TOC); + If Res<0 then + Result:=Res + else + begin + If Res>High(CDTOC)+1 then + Result:=-2 + else + begin + Result:=0; + For I:=TOC.FirstTrack to Toc.LastTrack do + begin + With CDTOC[Result],TOC.TocTrack[Result] do + begin + min:=Addr[1]; + sec:=Addr[2]; + frame:=Addr[3]; // ?? tocentry.cdte_addr.msf.frame; + inc(frame,min*60*75); + inc(frame,sec*75); + end; + Inc(Result); + end; + // Lead out + With CDTOC[Result],TOC.TocTrack[Result] do + begin + min:=Addr[1]; + sec:=Addr[2]; + frame:=Addr[3]; // ?? tocentry.cdte_addr.msf.frame; + inc(frame,min*60*75); + inc(frame,sec*75); + end; + end; + end; +end; + + +Function GetCDRomDevices(Var Devices : Array of string) : Integer; +begin + Result:=enumcddrives(Devices); +end; diff --git a/packages/cdrom/src/discid.pp b/packages/cdrom/src/discid.pp new file mode 100644 index 0000000000..a8c90c794e --- /dev/null +++ b/packages/cdrom/src/discid.pp @@ -0,0 +1,69 @@ +{ + Copyright (c) 1999-2000 by Michael Van Canneyt + + Unit to read a disc TOC and get discid for a cddb query. + + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} +unit discid; + +{$mode objfpc} + +interface + +uses cdrom,sysutils; + +Function CDDBDiscID(Const CDTOC : Array of TTocEntry; Count : Integer) : integer ; +Function GetCDDBQueryString(Const Tracks : Array of TTocEntry; Count : Integer) : String; + +Implementation + +Function cddb_sum(N : Integer) : Cardinal; + +begin + Result:=0; + while (n > 0) do + begin + Inc(result,(n mod 10)); + n:=n div 10; + end; +end; + +Function cddbdiscid(Const cdtoc : Array of TTocEntry; Count : Integer) : integer ; + +Var + i,t,n : cardinal; + +begin + t:=0; + n:=0; + i:= 0; + For I:=0 to count-1 do + n := n + cddb_sum((cdtoc[i].min * 60) + cdtoc[i].sec); + t:=((cdtoc[Count].min * 60) + cdtoc[Count].sec) - + ((cdtoc[0].min * 60) + cdtoc[0].sec); + Result:=(((n mod $ff) shl 24) or (t shl 8 or count)); +end; + +Function GetCDDBQueryString(Const Tracks : Array of TTocEntry; Count : Integer) : String; + + +Var + I,TheDiscID : Integer; + +begin + TheDiscID:=cddbdiscid(Tracks,Count); + Result:=Lowercase(HexStr(TheDiscID,8))+' '+intToStr(Count); + for I:=0 to Count-1 do + Result:=Result+' '+IntToStr(tracks[i].frame); + Result:=Result+' '+IntToStr(tracks[Count].frame div 75); +end; + +end. diff --git a/packages/cdrom/src/lincd.pp b/packages/cdrom/src/lincd.pp new file mode 100644 index 0000000000..6e2b6fb3d7 --- /dev/null +++ b/packages/cdrom/src/lincd.pp @@ -0,0 +1,1203 @@ +{ + Copyright (c) 1999-2000 by Michael Van Canneyt + + Unit containing definitions from the Linux CDROM kernel interface. + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} +unit lincd; + +{$mode objfpc} + +interface + +uses + baseunix, + unix; + +{ --------------------------------------------------------------------- + cdrom.h header translation. + ---------------------------------------------------------------------} + + { Pointers to basic pascal types, inserted by h2pas conversion program.} +Type + PLongint = ^Longint; + PSmallInt = ^SmallInt; + PByte = ^Byte; + PWord = ^Word; + PDWord = ^DWord; + PDouble = ^Double; + + TU8 = Byte; + PU8 = ^TU8; + TU32 = Cardinal; + PU32 = ^TU32; + +{$PACKRECORDS C} + +const + EDRIVE_CANT_DO_THIS = ESysEOPNOTSUPP; // = 95 + CDROMPAUSE = $5301; + CDROMRESUME = $5302; + CDROMPLAYMSF = $5303; + CDROMPLAYTRKIND = $5304; + CDROMREADTOCHDR = $5305; + CDROMREADTOCENTRY = $5306; + CDROMSTOP = $5307; + CDROMSTART = $5308; + CDROMEJECT = $5309; + CDROMVOLCTRL = $530a; + CDROMSUBCHNL = $530b; + CDROMREADMODE2 = $530c; + CDROMREADMODE1 = $530d; + CDROMREADAUDIO = $530e; + CDROMEJECT_SW = $530f; + CDROMMULTISESSION = $5310; + CDROM_GET_MCN = $5311; + CDROM_GET_UPC = CDROM_GET_MCN; + CDROMRESET = $5312; + CDROMVOLREAD = $5313; + CDROMREADRAW = $5314; + CDROMREADCOOKED = $5315; + CDROMSEEK = $5316; + CDROMPLAYBLK = $5317; + CDROMREADALL = $5318; + CDROMGETSPINDOWN = $531d; + CDROMSETSPINDOWN = $531e; + CDROMCLOSETRAY = $5319; + CDROM_SET_OPTIONS = $5320; + CDROM_CLEAR_OPTIONS = $5321; + CDROM_SELECT_SPEED = $5322; + CDROM_SELECT_DISC = $5323; + CDROM_MEDIA_CHANGED = $5325; + CDROM_DRIVE_STATUS = $5326; + CDROM_DISC_STATUS = $5327; + CDROM_CHANGER_NSLOTS = $5328; + CDROM_LOCKDOOR = $5329; + CDROM_DEBUG = $5330; + CDROM_GET_CAPABILITY = $5331; + CDROMAUDIOBUFSIZ = $5382; + DVD_READ_STRUCT = $5390; + DVD_WRITE_STRUCT = $5391; + DVD_AUTH = $5392; + CDROM_SEND_PACKET = $5393; + CDROM_NEXT_WRITABLE = $5394; + CDROM_LAST_WRITTEN = $5395; + +type + Pcdrom_msf0 = ^Tcdrom_msf0; + Tcdrom_msf0 = record + minute : Tu8; + second : Tu8; + frame : Tu8; + end; + + Pcdrom_addr = ^Tcdrom_addr; + Tcdrom_addr = record + case longint of + 0 : ( msf : Tcdrom_msf0 ); + 1 : ( lba : longint ); + end; + + Pcdrom_msf = ^Tcdrom_msf; + Tcdrom_msf = record + cdmsf_min0 : Tu8; + cdmsf_sec0 : Tu8; + cdmsf_frame0 : Tu8; + cdmsf_min1 : Tu8; + cdmsf_sec1 : Tu8; + cdmsf_frame1 : Tu8; + end; + + Pcdrom_ti = ^Tcdrom_ti; + Tcdrom_ti = record + cdti_trk0 : Tu8; + cdti_ind0 : Tu8; + cdti_trk1 : Tu8; + cdti_ind1 : Tu8; + end; + + Pcdrom_tochdr = ^Tcdrom_tochdr; + Tcdrom_tochdr = record + cdth_trk0 : Tu8; + cdth_trk1 : Tu8; + end; + + Pcdrom_volctrl = ^Tcdrom_volctrl; + Tcdrom_volctrl = record + channel0 : Tu8; + channel1 : Tu8; + channel2 : Tu8; + channel3 : Tu8; + end; + + Pcdrom_subchnl = ^Tcdrom_subchnl; + Tcdrom_subchnl = record + cdsc_format : Tu8; + cdsc_audiostatus : Tu8; + flag0 : word; + cdsc_trk : Tu8; + cdsc_ind : Tu8; + cdsc_absaddr : Tcdrom_addr; + cdsc_reladdr : Tcdrom_addr; + end; + +const + bm_Tcdrom_subchnl_cdsc_adr = $F; + bp_Tcdrom_subchnl_cdsc_adr = 0; + bm_Tcdrom_subchnl_cdsc_ctrl = $F0; + bp_Tcdrom_subchnl_cdsc_ctrl = 4; +function cdsc_adr(var a : Tcdrom_subchnl) : Tu8; +procedure set_cdsc_adr(var a : Tcdrom_subchnl; __cdsc_adr : Tu8); +function cdsc_ctrl(var a : Tcdrom_subchnl) : Tu8; +procedure set_cdsc_ctrl(var a : Tcdrom_subchnl; __cdsc_ctrl : Tu8); + +type + Pcdrom_tocentry = ^Tcdrom_tocentry; + Tcdrom_tocentry = record + cdte_track : Tu8; + flag0 : tu8; + cdte_format : Tu8; + cdte_addr : Tcdrom_addr; + cdte_datamode : Tu8; + end; + +const + bm_Tcdrom_tocentry_cdte_adr = $F; + bp_Tcdrom_tocentry_cdte_adr = 0; + bm_Tcdrom_tocentry_cdte_ctrl = $F0; + bp_Tcdrom_tocentry_cdte_ctrl = 4; +function cdte_adr(var a : Tcdrom_tocentry) : Tu8; +procedure set_cdte_adr(var a : Tcdrom_tocentry; __cdte_adr : Tu8); +function cdte_ctrl(var a : Tcdrom_tocentry) : Tu8; +procedure set_cdte_ctrl(var a : Tcdrom_tocentry; __cdte_ctrl : Tu8); + +type + Pcdrom_read = ^Tcdrom_read; + Tcdrom_read = record + cdread_lba : longint; + cdread_bufaddr : Pchar; + cdread_buflen : longint; + end; + + Pcdrom_read_audio = ^Tcdrom_read_audio; + Tcdrom_read_audio = record + addr : Tcdrom_addr; + addr_format : Tu8; + nframes : longint; + buf : Pu8; + end; + + Pcdrom_multisession = ^Tcdrom_multisession; + Tcdrom_multisession = record + addr : Tcdrom_addr; + xa_flag : Tu8; + addr_format : Tu8; + end; + + Pcdrom_mcn = ^Tcdrom_mcn; + Tcdrom_mcn = record + medium_catalog_number : array[0..13] of Tu8; + end; + + Pcdrom_blk = ^Tcdrom_blk; + Tcdrom_blk = record + from : dword; + len : word; + end; + + +const + CDROM_PACKET_SIZE = 12; + CGC_DATA_UNKNOWN = 0; + CGC_DATA_WRITE = 1; + CGC_DATA_READ = 2; + CGC_DATA_NONE = 3; + +// Moved here +type + Prequest_sense = ^Trequest_sense; + Trequest_sense = record + flag0 : word; + segment_number : Tu8; + flag1 : word; + information : array[0..3] of Tu8; + add_sense_len : Tu8; + command_info : array[0..3] of Tu8; + asc : Tu8; + ascq : Tu8; + fruc : Tu8; + sks : array[0..2] of Tu8; + asb : array[0..45] of Tu8; + end; + Pcdrom_generic_command = ^Tcdrom_generic_command; + Tcdrom_generic_command = record + cmd : array[0..(CDROM_PACKET_SIZE)-1] of byte; + buffer : Pbyte; + buflen : dword; + stat : longint; + sense : Prequest_sense; + data_direction : byte; + quiet : longint; + timeout : longint; + reserved : array[0..0] of pointer; + end; + + +const + CD_MINS = 74; + CD_SECS = 60; + CD_FRAMES = 75; + CD_SYNC_SIZE = 12; + CD_MSF_OFFSET = 150; + CD_CHUNK_SIZE = 24; + CD_NUM_OF_CHUNKS = 98; + CD_FRAMESIZE_SUB = 96; + CD_HEAD_SIZE = 4; + CD_SUBHEAD_SIZE = 8; + CD_EDC_SIZE = 4; + CD_ZERO_SIZE = 8; + CD_ECC_SIZE = 276; + CD_FRAMESIZE = 2048; + CD_FRAMESIZE_RAW = 2352; + CD_FRAMESIZE_RAWER = 2646; + CD_FRAMESIZE_RAW1 = CD_FRAMESIZE_RAW - CD_SYNC_SIZE; + CD_FRAMESIZE_RAW0 = (CD_FRAMESIZE_RAW - CD_SYNC_SIZE) - CD_HEAD_SIZE; + CD_XA_HEAD = CD_HEAD_SIZE + CD_SUBHEAD_SIZE; + CD_XA_TAIL = CD_EDC_SIZE + CD_ECC_SIZE; + CD_XA_SYNC_HEAD = CD_SYNC_SIZE + CD_XA_HEAD; + CDROM_LBA = $01; + CDROM_MSF = $02; + CDROM_DATA_TRACK = $04; + CDROM_LEADOUT = $AA; + CDROM_AUDIO_INVALID = $00; + CDROM_AUDIO_PLAY = $11; + CDROM_AUDIO_PAUSED = $12; + CDROM_AUDIO_COMPLETED = $13; + CDROM_AUDIO_ERROR = $14; + CDROM_AUDIO_NO_STATUS = $15; + CDC_CLOSE_TRAY = $1; + CDC_OPEN_TRAY = $2; + CDC_LOCK = $4; + CDC_SELECT_SPEED = $8; + CDC_SELECT_DISC = $10; + CDC_MULTI_SESSION = $20; + CDC_MCN = $40; + CDC_MEDIA_CHANGED = $80; + CDC_PLAY_AUDIO = $100; + CDC_RESET = $200; + CDC_IOCTLS = $400; + CDC_DRIVE_STATUS = $800; + CDC_GENERIC_PACKET = $1000; + CDC_CD_R = $2000; + CDC_CD_RW = $4000; + CDC_DVD = $8000; + CDC_DVD_R = $10000; + CDC_DVD_RAM = $20000; + CDS_NO_INFO = 0; + CDS_NO_DISC = 1; + CDS_TRAY_OPEN = 2; + CDS_DRIVE_NOT_READY = 3; + CDS_DISC_OK = 4; + CDS_AUDIO = 100; + CDS_DATA_1 = 101; + CDS_DATA_2 = 102; + CDS_XA_2_1 = 103; + CDS_XA_2_2 = 104; + CDS_MIXED = 105; + CDO_AUTO_CLOSE = $1; + CDO_AUTO_EJECT = $2; + CDO_USE_FFLAGS = $4; + CDO_LOCK = $8; + CDO_CHECK_TYPE = $10; +{ was #define dname def_expr } +function CDSL_NONE : longint; + { return type might be wrong } + +{ was #define dname def_expr } +function CDSL_CURRENT : longint; + + +const + CD_PART_MAX = 64; + CD_PART_MASK = CD_PART_MAX - 1; + GPCMD_BLANK = $a1; + GPCMD_CLOSE_TRACK = $5b; + GPCMD_FLUSH_CACHE = $35; + GPCMD_FORMAT_UNIT = $04; + GPCMD_GET_CONFIGURATION = $46; + GPCMD_GET_EVENT_STATUS_NOTIFICATION = $4a; + GPCMD_GET_PERFORMANCE = $ac; + GPCMD_INQUIRY = $12; + GPCMD_LOAD_UNLOAD = $a6; + GPCMD_MECHANISM_STATUS = $bd; + GPCMD_MODE_SELECT_10 = $55; + GPCMD_MODE_SENSE_10 = $5a; + GPCMD_PAUSE_RESUME = $4b; + GPCMD_PLAY_AUDIO_10 = $45; + GPCMD_PLAY_AUDIO_MSF = $47; + GPCMD_PLAY_AUDIO_TI = $48; + GPCMD_PLAY_CD = $bc; + GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL = $1e; + GPCMD_READ_10 = $28; + GPCMD_READ_12 = $a8; + GPCMD_READ_CDVD_CAPACITY = $25; + GPCMD_READ_CD = $be; + GPCMD_READ_CD_MSF = $b9; + GPCMD_READ_DISC_INFO = $51; + GPCMD_READ_DVD_STRUCTURE = $ad; + GPCMD_READ_FORMAT_CAPACITIES = $23; + GPCMD_READ_HEADER = $44; + GPCMD_READ_TRACK_RZONE_INFO = $52; + GPCMD_READ_SUBCHANNEL = $42; + GPCMD_READ_TOC_PMA_ATIP = $43; + GPCMD_REPAIR_RZONE_TRACK = $58; + GPCMD_REPORT_KEY = $a4; + GPCMD_REQUEST_SENSE = $03; + GPCMD_RESERVE_RZONE_TRACK = $53; + GPCMD_SCAN = $ba; + GPCMD_SEEK = $2b; + GPCMD_SEND_DVD_STRUCTURE = $ad; + GPCMD_SEND_EVENT = $a2; + GPCMD_SEND_KEY = $a3; + GPCMD_SEND_OPC = $54; + GPCMD_SET_READ_AHEAD = $a7; + GPCMD_SET_STREAMING = $b6; + GPCMD_START_STOP_UNIT = $1b; + GPCMD_STOP_PLAY_SCAN = $4e; + GPCMD_TEST_UNIT_READY = $00; + GPCMD_VERIFY_10 = $2f; + GPCMD_WRITE_10 = $2a; + GPCMD_WRITE_AND_VERIFY_10 = $2e; + GPCMD_SET_SPEED = $bb; + GPCMD_PLAYAUDIO_TI = $48; + GPCMD_GET_MEDIA_STATUS = $da; + GPMODE_R_W_ERROR_PAGE = $01; + GPMODE_WRITE_PARMS_PAGE = $05; + GPMODE_AUDIO_CTL_PAGE = $0e; + GPMODE_POWER_PAGE = $1a; + GPMODE_FAULT_FAIL_PAGE = $1c; + GPMODE_TO_PROTECT_PAGE = $1d; + GPMODE_CAPABILITIES_PAGE = $2a; + GPMODE_ALL_PAGES = $3f; + GPMODE_CDROM_PAGE = $0d; + DVD_STRUCT_PHYSICAL = $00; + DVD_STRUCT_COPYRIGHT = $01; + DVD_STRUCT_DISCKEY = $02; + DVD_STRUCT_BCA = $03; + DVD_STRUCT_MANUFACT = $04; + +type + Pdvd_layer = ^Tdvd_layer; + Tdvd_layer = record + flag0 : longint; + start_sector : Tu32; + end_sector : Tu32; + end_sector_l0 : Tu32; + end; + +const + bm_Tdvd_layer_book_version = $F; + bp_Tdvd_layer_book_version = 0; + bm_Tdvd_layer_book_type = $F0; + bp_Tdvd_layer_book_type = 4; + bm_Tdvd_layer_min_rate = $F00; + bp_Tdvd_layer_min_rate = 8; + bm_Tdvd_layer_disc_size = $F000; + bp_Tdvd_layer_disc_size = 12; + bm_Tdvd_layer_layer_type = $F0000; + bp_Tdvd_layer_layer_type = 16; + bm_Tdvd_layer_track_path = $100000; + bp_Tdvd_layer_track_path = 20; + bm_Tdvd_layer_nlayers = $600000; + bp_Tdvd_layer_nlayers = 21; + bm_Tdvd_layer_track_density = $7800000; + bp_Tdvd_layer_track_density = 23; + bm_Tdvd_layer_linear_density = $78000000; + bp_Tdvd_layer_linear_density = 27; + bm_Tdvd_layer_bca = $80000000; + bp_Tdvd_layer_bca = 31; +function book_version(var a : Tdvd_layer) : Tu8; +procedure set_book_version(var a : Tdvd_layer; __book_version : Tu8); +function book_type(var a : Tdvd_layer) : Tu8; +procedure set_book_type(var a : Tdvd_layer; __book_type : Tu8); +function min_rate(var a : Tdvd_layer) : Tu8; +procedure set_min_rate(var a : Tdvd_layer; __min_rate : Tu8); +function disc_size(var a : Tdvd_layer) : Tu8; +procedure set_disc_size(var a : Tdvd_layer; __disc_size : Tu8); +function layer_type(var a : Tdvd_layer) : Tu8; +procedure set_layer_type(var a : Tdvd_layer; __layer_type : Tu8); +function track_path(var a : Tdvd_layer) : Tu8; +procedure set_track_path(var a : Tdvd_layer; __track_path : Tu8); +function nlayers(var a : Tdvd_layer) : Tu8; +procedure set_nlayers(var a : Tdvd_layer; __nlayers : Tu8); +function track_density(var a : Tdvd_layer) : Tu8; +procedure set_track_density(var a : Tdvd_layer; __track_density : Tu8); +function linear_density(var a : Tdvd_layer) : Tu8; +procedure set_linear_density(var a : Tdvd_layer; __linear_density : Tu8); +function bca(var a : Tdvd_layer) : Tu8; +procedure set_bca(var a : Tdvd_layer; __bca : Tu8); + +const + DVD_LAYERS = 4; + +type + Pdvd_physical = ^Tdvd_physical; + Tdvd_physical = record + _type : Tu8; + layer_num : Tu8; + layer : array[0..(DVD_LAYERS)-1] of Tdvd_layer; + end; + + Pdvd_copyright = ^Tdvd_copyright; + Tdvd_copyright = record + _type : Tu8; + layer_num : Tu8; + cpst : Tu8; + rmi : Tu8; + end; + + Pdvd_disckey = ^Tdvd_disckey; + Tdvd_disckey = record + _type : Tu8; + flag0 : word; + value : array[0..2047] of Tu8; + end; + +const + bm_Tdvd_disckey_agid = $3; + bp_Tdvd_disckey_agid = 0; +function agid(var a : Tdvd_disckey) : dword; +procedure set_agid(var a : Tdvd_disckey; __agid : dword); + +type + Pdvd_bca = ^Tdvd_bca; + Tdvd_bca = record + _type : Tu8; + len : longint; + value : array[0..187] of Tu8; + end; + + Pdvd_manufact = ^Tdvd_manufact; + Tdvd_manufact = record + _type : Tu8; + layer_num : Tu8; + len : longint; + value : array[0..2047] of Tu8; + end; + + + Pdvd_struct = ^Tdvd_struct; + Tdvd_struct = record + case longint of + 0 : ( _type : Tu8 ); + 1 : ( physical : Tdvd_physical ); + 2 : ( copyright : Tdvd_copyright ); + 3 : ( disckey : Tdvd_disckey ); + 4 : ( bca : Tdvd_bca ); + 5 : ( manufact : Tdvd_manufact ); + end; + +const + DVD_LU_SEND_AGID = 0; + DVD_HOST_SEND_CHALLENGE = 1; + DVD_LU_SEND_KEY1 = 2; + DVD_LU_SEND_CHALLENGE = 3; + DVD_HOST_SEND_KEY2 = 4; + DVD_AUTH_ESTABLISHED = 5; + DVD_AUTH_FAILURE = 6; + DVD_LU_SEND_TITLE_KEY = 7; + DVD_LU_SEND_ASF = 8; + DVD_INVALIDATE_AGID = 9; + DVD_LU_SEND_RPC_STATE = 10; + DVD_HOST_SEND_RPC_STATE = 11; + +type + + Pdvd_key = ^Tdvd_key; + Tdvd_key = Tu8; + + Pdvd_challenge = ^Tdvd_challenge; + Tdvd_challenge = Tu8; + Pdvd_lu_send_agid = ^Tdvd_lu_send_agid; + Tdvd_lu_send_agid = record + _type : Tu8; + flag0 : word; + end; + +const + bm_Tdvd_lu_send_agid_agid = $3; + bp_Tdvd_lu_send_agid_agid = 0; +function agid(var a : Tdvd_lu_send_agid) : dword; +procedure set_agid(var a : Tdvd_lu_send_agid; __agid : dword); + +type + Pdvd_host_send_challenge = ^Tdvd_host_send_challenge; + Tdvd_host_send_challenge = record + _type : Tu8; + flag0 : word; + chal : Tdvd_challenge; + end; + +const + bm_Tdvd_host_send_challenge_agid = $3; + bp_Tdvd_host_send_challenge_agid = 0; +function agid(var a : Tdvd_host_send_challenge) : dword; +procedure set_agid(var a : Tdvd_host_send_challenge; __agid : dword); + +type + Pdvd_send_key = ^Tdvd_send_key; + Tdvd_send_key = record + _type : Tu8; + flag0 : word; + key : Tdvd_key; + end; + +const + bm_Tdvd_send_key_agid = $3; + bp_Tdvd_send_key_agid = 0; +function agid(var a : Tdvd_send_key) : dword; +procedure set_agid(var a : Tdvd_send_key; __agid : dword); + +type + Pdvd_lu_send_challenge = ^Tdvd_lu_send_challenge; + Tdvd_lu_send_challenge = record + _type : Tu8; + flag0 : word; + chal : Tdvd_challenge; + end; + +const + bm_Tdvd_lu_send_challenge_agid = $3; + bp_Tdvd_lu_send_challenge_agid = 0; +function agid(var a : Tdvd_lu_send_challenge) : dword; +procedure set_agid(var a : Tdvd_lu_send_challenge; __agid : dword); + +const + DVD_CPM_NO_COPYRIGHT = 0; + DVD_CPM_COPYRIGHTED = 1; + DVD_CP_SEC_NONE = 0; + DVD_CP_SEC_EXIST = 1; + DVD_CGMS_UNRESTRICTED = 0; + DVD_CGMS_SINGLE = 2; + DVD_CGMS_RESTRICTED = 3; + +type + Pdvd_lu_send_title_key = ^Tdvd_lu_send_title_key; + Tdvd_lu_send_title_key = record + _type : Tu8; + flag0 : word; + title_key : Tdvd_key; + lba : longint; + flag1 : word; + end; + +const + bm_Tdvd_lu_send_title_key_agid = $3; + bp_Tdvd_lu_send_title_key_agid = 0; + bm_Tdvd_lu_send_title_key_cpm = $1; + bp_Tdvd_lu_send_title_key_cpm = 0; + bm_Tdvd_lu_send_title_key_cp_sec = $2; + bp_Tdvd_lu_send_title_key_cp_sec = 1; + bm_Tdvd_lu_send_title_key_cgms = $C; + bp_Tdvd_lu_send_title_key_cgms = 2; +function agid(var a : Tdvd_lu_send_title_key) : dword; +procedure set_agid(var a : Tdvd_lu_send_title_key; __agid : dword); +function cpm(var a : Tdvd_lu_send_title_key) : dword; +procedure set_cpm(var a : Tdvd_lu_send_title_key; __cpm : dword); +function cp_sec(var a : Tdvd_lu_send_title_key) : dword; +procedure set_cp_sec(var a : Tdvd_lu_send_title_key; __cp_sec : dword); +function cgms(var a : Tdvd_lu_send_title_key) : dword; +procedure set_cgms(var a : Tdvd_lu_send_title_key; __cgms : dword); + +type + Pdvd_lu_send_asf = ^Tdvd_lu_send_asf; + Tdvd_lu_send_asf = record + _type : Tu8; + flag0 : word; + end; + +const + bm_Tdvd_lu_send_asf_agid = $3; + bp_Tdvd_lu_send_asf_agid = 0; + bm_Tdvd_lu_send_asf_asf = $4; + bp_Tdvd_lu_send_asf_asf = 2; +function agid(var a : Tdvd_lu_send_asf) : dword; +procedure set_agid(var a : Tdvd_lu_send_asf; __agid : dword); +function asf(var a : Tdvd_lu_send_asf) : dword; +procedure set_asf(var a : Tdvd_lu_send_asf; __asf : dword); + +type + Pdvd_host_send_rpcstate = ^Tdvd_host_send_rpcstate; + Tdvd_host_send_rpcstate = record + _type : Tu8; + pdrc : Tu8; + end; + + Pdvd_lu_send_rpcstate = ^Tdvd_lu_send_rpcstate; + Tdvd_lu_send_rpcstate = record + flag0 : word; + region_mask : Tu8; + rpc_scheme : Tu8; + end; + +const + bm_Tdvd_lu_send_rpcstate_type = $3; + bp_Tdvd_lu_send_rpcstate_type = 0; + bm_Tdvd_lu_send_rpcstate_vra = $1C; + bp_Tdvd_lu_send_rpcstate_vra = 2; + bm_Tdvd_lu_send_rpcstate_ucca = $E0; + bp_Tdvd_lu_send_rpcstate_ucca = 5; +function get_type(var a : Tdvd_lu_send_rpcstate) : Tu8; +procedure set_type(var a : Tdvd_lu_send_rpcstate; __type : Tu8); +function get_vra(var a : Tdvd_lu_send_rpcstate) : Tu8; +procedure set_vra(var a : Tdvd_lu_send_rpcstate; __vra : Tu8); +function ucca(var a : Tdvd_lu_send_rpcstate) : Tu8; +procedure set_ucca(var a : Tdvd_lu_send_rpcstate; __ucca : Tu8); + +type + + Pdvd_authinfo = ^Tdvd_authinfo; + Tdvd_authinfo = record + case longint of + 0 : ( _type : Tu8 ); + 1 : ( lsa : Tdvd_lu_send_agid ); + 2 : ( hsc : Tdvd_host_send_challenge ); + 3 : ( lsk : Tdvd_send_key ); + 4 : ( lsc : Tdvd_lu_send_challenge ); + 5 : ( hsk : Tdvd_send_key ); + 6 : ( lstk : Tdvd_lu_send_title_key ); + 7 : ( lsasf : Tdvd_lu_send_asf ); + 8 : ( hrpcs : Tdvd_host_send_rpcstate ); + 9 : ( lrpcs : Tdvd_lu_send_rpcstate ); + end; + +const + bm_Trequest_sense_valid = $1; + bp_Trequest_sense_valid = 0; + bm_Trequest_sense_error_code = $FE; + bp_Trequest_sense_error_code = 1; + bm_Trequest_sense_reserved1 = $3; + bp_Trequest_sense_reserved1 = 0; + bm_Trequest_sense_ili = $4; + bp_Trequest_sense_ili = 2; + bm_Trequest_sense_reserved2 = $8; + bp_Trequest_sense_reserved2 = 3; + bm_Trequest_sense_sense_key = $F0; + bp_Trequest_sense_sense_key = 4; +function valid(var a : Trequest_sense) : Tu8; +procedure set_valid(var a : Trequest_sense; __valid : Tu8); +function error_code(var a : Trequest_sense) : Tu8; +procedure set_error_code(var a : Trequest_sense; __error_code : Tu8); +function reserved1(var a : Trequest_sense) : Tu8; +procedure set_reserved1(var a : Trequest_sense; __reserved1 : Tu8); +function ili(var a : Trequest_sense) : Tu8; +procedure set_ili(var a : Trequest_sense; __ili : Tu8); +function reserved2(var a : Trequest_sense) : Tu8; +procedure set_reserved2(var a : Trequest_sense; __reserved2 : Tu8); +function sense_key(var a : Trequest_sense) : Tu8; +procedure set_sense_key(var a : Trequest_sense; __sense_key : Tu8); + + +{ --------------------------------------------------------------------- + Utility functions + ---------------------------------------------------------------------} + +Function IsCDDevice(Device : String) : Boolean; +Function DetectCd : String; + +implementation + +uses major,sysutils; + +{ --------------------------------------------------------------------- + Functions from cdrom.h translation. + ---------------------------------------------------------------------} + +function cdsc_adr(var a : Tcdrom_subchnl) : Tu8; +begin + cdsc_adr:=(a.flag0 and bm_Tcdrom_subchnl_cdsc_adr) shr bp_Tcdrom_subchnl_cdsc_adr; +end; + +procedure set_cdsc_adr(var a : Tcdrom_subchnl; __cdsc_adr : Tu8); +begin + a.flag0:=a.flag0 or ((__cdsc_adr shl bp_Tcdrom_subchnl_cdsc_adr) and bm_Tcdrom_subchnl_cdsc_adr); +end; + +function cdsc_ctrl(var a : Tcdrom_subchnl) : Tu8; +begin + cdsc_ctrl:=(a.flag0 and bm_Tcdrom_subchnl_cdsc_ctrl) shr bp_Tcdrom_subchnl_cdsc_ctrl; +end; + +procedure set_cdsc_ctrl(var a : Tcdrom_subchnl; __cdsc_ctrl : Tu8); +begin + a.flag0:=a.flag0 or ((__cdsc_ctrl shl bp_Tcdrom_subchnl_cdsc_ctrl) and bm_Tcdrom_subchnl_cdsc_ctrl); +end; + +function cdte_adr(var a : Tcdrom_tocentry) : Tu8; +begin + cdte_adr:=(a.flag0 and bm_Tcdrom_tocentry_cdte_adr) shr bp_Tcdrom_tocentry_cdte_adr; +end; + +procedure set_cdte_adr(var a : Tcdrom_tocentry; __cdte_adr : Tu8); +begin + a.flag0:=a.flag0 or ((__cdte_adr shl bp_Tcdrom_tocentry_cdte_adr) and bm_Tcdrom_tocentry_cdte_adr); +end; + +function cdte_ctrl(var a : Tcdrom_tocentry) : Tu8; +begin + cdte_ctrl:=(a.flag0 and bm_Tcdrom_tocentry_cdte_ctrl) shr bp_Tcdrom_tocentry_cdte_ctrl; +end; + +procedure set_cdte_ctrl(var a : Tcdrom_tocentry; __cdte_ctrl : Tu8); +begin + a.flag0:=a.flag0 or ((__cdte_ctrl shl bp_Tcdrom_tocentry_cdte_ctrl) and bm_Tcdrom_tocentry_cdte_ctrl); +end; + +{ was #define dname def_expr } +function CDSL_NONE : longint; + { return type might be wrong } + begin + CDSL_NONE:=(longint(( not (0)) shr 1)) - 1; + end; + +{ was #define dname def_expr } +function CDSL_CURRENT : longint; + begin + CDSL_CURRENT:=longint(( not (0)) shr 1); + end; + +function book_version(var a : Tdvd_layer) : Tu8; +begin + book_version:=(a.flag0 and bm_Tdvd_layer_book_version) shr bp_Tdvd_layer_book_version; +end; + +procedure set_book_version(var a : Tdvd_layer; __book_version : Tu8); +begin + a.flag0:=a.flag0 or ((__book_version shl bp_Tdvd_layer_book_version) and bm_Tdvd_layer_book_version); +end; + +function book_type(var a : Tdvd_layer) : Tu8; +begin + book_type:=(a.flag0 and bm_Tdvd_layer_book_type) shr bp_Tdvd_layer_book_type; +end; + +procedure set_book_type(var a : Tdvd_layer; __book_type : Tu8); +begin + a.flag0:=a.flag0 or ((__book_type shl bp_Tdvd_layer_book_type) and bm_Tdvd_layer_book_type); +end; + +function min_rate(var a : Tdvd_layer) : Tu8; +begin + min_rate:=(a.flag0 and bm_Tdvd_layer_min_rate) shr bp_Tdvd_layer_min_rate; +end; + +procedure set_min_rate(var a : Tdvd_layer; __min_rate : Tu8); +begin + a.flag0:=a.flag0 or ((__min_rate shl bp_Tdvd_layer_min_rate) and bm_Tdvd_layer_min_rate); +end; + +function disc_size(var a : Tdvd_layer) : Tu8; +begin + disc_size:=(a.flag0 and bm_Tdvd_layer_disc_size) shr bp_Tdvd_layer_disc_size; +end; + +procedure set_disc_size(var a : Tdvd_layer; __disc_size : Tu8); +begin + a.flag0:=a.flag0 or ((__disc_size shl bp_Tdvd_layer_disc_size) and bm_Tdvd_layer_disc_size); +end; + +function layer_type(var a : Tdvd_layer) : Tu8; +begin + layer_type:=(a.flag0 and bm_Tdvd_layer_layer_type) shr bp_Tdvd_layer_layer_type; +end; + +procedure set_layer_type(var a : Tdvd_layer; __layer_type : Tu8); +begin + a.flag0:=a.flag0 or ((__layer_type shl bp_Tdvd_layer_layer_type) and bm_Tdvd_layer_layer_type); +end; + +function track_path(var a : Tdvd_layer) : Tu8; +begin + track_path:=(a.flag0 and bm_Tdvd_layer_track_path) shr bp_Tdvd_layer_track_path; +end; + +procedure set_track_path(var a : Tdvd_layer; __track_path : Tu8); +begin + a.flag0:=a.flag0 or ((__track_path shl bp_Tdvd_layer_track_path) and bm_Tdvd_layer_track_path); +end; + +function nlayers(var a : Tdvd_layer) : Tu8; +begin + nlayers:=(a.flag0 and bm_Tdvd_layer_nlayers) shr bp_Tdvd_layer_nlayers; +end; + +procedure set_nlayers(var a : Tdvd_layer; __nlayers : Tu8); +begin + a.flag0:=a.flag0 or ((__nlayers shl bp_Tdvd_layer_nlayers) and bm_Tdvd_layer_nlayers); +end; + +function track_density(var a : Tdvd_layer) : Tu8; +begin + track_density:=(a.flag0 and bm_Tdvd_layer_track_density) shr bp_Tdvd_layer_track_density; +end; + +procedure set_track_density(var a : Tdvd_layer; __track_density : Tu8); +begin + a.flag0:=a.flag0 or ((__track_density shl bp_Tdvd_layer_track_density) and bm_Tdvd_layer_track_density); +end; + +function linear_density(var a : Tdvd_layer) : Tu8; +begin + linear_density:=(a.flag0 and bm_Tdvd_layer_linear_density) shr bp_Tdvd_layer_linear_density; +end; + +procedure set_linear_density(var a : Tdvd_layer; __linear_density : Tu8); +begin + a.flag0:=a.flag0 or ((__linear_density shl bp_Tdvd_layer_linear_density) and bm_Tdvd_layer_linear_density); +end; + +function bca(var a : Tdvd_layer) : Tu8; +begin + bca:=(a.flag0 and bm_Tdvd_layer_bca) shr bp_Tdvd_layer_bca; +end; + +procedure set_bca(var a : Tdvd_layer; __bca : Tu8); +begin + a.flag0:=a.flag0 or ((__bca shl bp_Tdvd_layer_bca) and bm_Tdvd_layer_bca); +end; + +function agid(var a : Tdvd_disckey) : dword; +begin + agid:=(a.flag0 and bm_Tdvd_disckey_agid) shr bp_Tdvd_disckey_agid; +end; + +procedure set_agid(var a : Tdvd_disckey; __agid : dword); +begin + a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_disckey_agid) and bm_Tdvd_disckey_agid); +end; + +function agid(var a : Tdvd_lu_send_agid) : dword; +begin + agid:=(a.flag0 and bm_Tdvd_lu_send_agid_agid) shr bp_Tdvd_lu_send_agid_agid; +end; + +procedure set_agid(var a : Tdvd_lu_send_agid; __agid : dword); +begin + a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_lu_send_agid_agid) and bm_Tdvd_lu_send_agid_agid); +end; + +function agid(var a : Tdvd_host_send_challenge) : dword; +begin + agid:=(a.flag0 and bm_Tdvd_host_send_challenge_agid) shr bp_Tdvd_host_send_challenge_agid; +end; + +procedure set_agid(var a : Tdvd_host_send_challenge; __agid : dword); +begin + a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_host_send_challenge_agid) and bm_Tdvd_host_send_challenge_agid); +end; + +function agid(var a : Tdvd_send_key) : dword; +begin + agid:=(a.flag0 and bm_Tdvd_send_key_agid) shr bp_Tdvd_send_key_agid; +end; + +procedure set_agid(var a : Tdvd_send_key; __agid : dword); +begin + a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_send_key_agid) and bm_Tdvd_send_key_agid); +end; + +function agid(var a : Tdvd_lu_send_challenge) : dword; +begin + agid:=(a.flag0 and bm_Tdvd_lu_send_challenge_agid) shr bp_Tdvd_lu_send_challenge_agid; +end; + +procedure set_agid(var a : Tdvd_lu_send_challenge; __agid : dword); +begin + a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_lu_send_challenge_agid) and bm_Tdvd_lu_send_challenge_agid); +end; + +function agid(var a : Tdvd_lu_send_title_key) : dword; +begin + agid:=(a.flag0 and bm_Tdvd_lu_send_title_key_agid) shr bp_Tdvd_lu_send_title_key_agid; +end; + +procedure set_agid(var a : Tdvd_lu_send_title_key; __agid : dword); +begin + a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_lu_send_title_key_agid) and bm_Tdvd_lu_send_title_key_agid); +end; + +function cpm(var a : Tdvd_lu_send_title_key) : dword; +begin + cpm:=(a.flag1 and bm_Tdvd_lu_send_title_key_cpm) shr bp_Tdvd_lu_send_title_key_cpm; +end; + +procedure set_cpm(var a : Tdvd_lu_send_title_key; __cpm : dword); +begin + a.flag1:=a.flag1 or ((__cpm shl bp_Tdvd_lu_send_title_key_cpm) and bm_Tdvd_lu_send_title_key_cpm); +end; + +function cp_sec(var a : Tdvd_lu_send_title_key) : dword; +begin + cp_sec:=(a.flag1 and bm_Tdvd_lu_send_title_key_cp_sec) shr bp_Tdvd_lu_send_title_key_cp_sec; +end; + +procedure set_cp_sec(var a : Tdvd_lu_send_title_key; __cp_sec : dword); +begin + a.flag1:=a.flag1 or ((__cp_sec shl bp_Tdvd_lu_send_title_key_cp_sec) and bm_Tdvd_lu_send_title_key_cp_sec); +end; + +function cgms(var a : Tdvd_lu_send_title_key) : dword; +begin + cgms:=(a.flag1 and bm_Tdvd_lu_send_title_key_cgms) shr bp_Tdvd_lu_send_title_key_cgms; +end; + +procedure set_cgms(var a : Tdvd_lu_send_title_key; __cgms : dword); +begin + a.flag1:=a.flag1 or ((__cgms shl bp_Tdvd_lu_send_title_key_cgms) and bm_Tdvd_lu_send_title_key_cgms); +end; + +function agid(var a : Tdvd_lu_send_asf) : dword; +begin + agid:=(a.flag0 and bm_Tdvd_lu_send_asf_agid) shr bp_Tdvd_lu_send_asf_agid; +end; + +procedure set_agid(var a : Tdvd_lu_send_asf; __agid : dword); +begin + a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_lu_send_asf_agid) and bm_Tdvd_lu_send_asf_agid); +end; + +function asf(var a : Tdvd_lu_send_asf) : dword; +begin + asf:=(a.flag0 and bm_Tdvd_lu_send_asf_asf) shr bp_Tdvd_lu_send_asf_asf; +end; + +procedure set_asf(var a : Tdvd_lu_send_asf; __asf : dword); +begin + a.flag0:=a.flag0 or ((__asf shl bp_Tdvd_lu_send_asf_asf) and bm_Tdvd_lu_send_asf_asf); +end; + +function get_type(var a : Tdvd_lu_send_rpcstate) : Tu8; +begin + get_type:=(a.flag0 and bm_Tdvd_lu_send_rpcstate_type) shr bp_Tdvd_lu_send_rpcstate_type; +end; + +procedure set_type(var a : Tdvd_lu_send_rpcstate; __type : Tu8); +begin + a.flag0:=a.flag0 or ((__type shl bp_Tdvd_lu_send_rpcstate_type) and bm_Tdvd_lu_send_rpcstate_type); +end; + +function get_vra(var a : Tdvd_lu_send_rpcstate) : Tu8; +begin + get_vra:=(a.flag0 and bm_Tdvd_lu_send_rpcstate_vra) shr bp_Tdvd_lu_send_rpcstate_vra; +end; + +procedure set_vra(var a : Tdvd_lu_send_rpcstate; __vra : Tu8); +begin + a.flag0:=a.flag0 or ((__vra shl bp_Tdvd_lu_send_rpcstate_vra) and bm_Tdvd_lu_send_rpcstate_vra); +end; + +function ucca(var a : Tdvd_lu_send_rpcstate) : Tu8; +begin + ucca:=(a.flag0 and bm_Tdvd_lu_send_rpcstate_ucca) shr bp_Tdvd_lu_send_rpcstate_ucca; +end; + +procedure set_ucca(var a : Tdvd_lu_send_rpcstate; __ucca : Tu8); +begin + a.flag0:=a.flag0 or ((__ucca shl bp_Tdvd_lu_send_rpcstate_ucca) and bm_Tdvd_lu_send_rpcstate_ucca); +end; + +function valid(var a : Trequest_sense) : Tu8; +begin + valid:=(a.flag0 and bm_Trequest_sense_valid) shr bp_Trequest_sense_valid; +end; + +procedure set_valid(var a : Trequest_sense; __valid : Tu8); +begin + a.flag0:=a.flag0 or ((__valid shl bp_Trequest_sense_valid) and bm_Trequest_sense_valid); +end; + +function error_code(var a : Trequest_sense) : Tu8; +begin + error_code:=(a.flag0 and bm_Trequest_sense_error_code) shr bp_Trequest_sense_error_code; +end; + +procedure set_error_code(var a : Trequest_sense; __error_code : Tu8); +begin + a.flag0:=a.flag0 or ((__error_code shl bp_Trequest_sense_error_code) and bm_Trequest_sense_error_code); +end; + +function reserved1(var a : Trequest_sense) : Tu8; +begin + reserved1:=(a.flag1 and bm_Trequest_sense_reserved1) shr bp_Trequest_sense_reserved1; +end; + +procedure set_reserved1(var a : Trequest_sense; __reserved1 : Tu8); +begin + a.flag1:=a.flag1 or ((__reserved1 shl bp_Trequest_sense_reserved1) and bm_Trequest_sense_reserved1); +end; + +function ili(var a : Trequest_sense) : Tu8; +begin + ili:=(a.flag1 and bm_Trequest_sense_ili) shr bp_Trequest_sense_ili; +end; + +procedure set_ili(var a : Trequest_sense; __ili : Tu8); +begin + a.flag1:=a.flag1 or ((__ili shl bp_Trequest_sense_ili) and bm_Trequest_sense_ili); +end; + +function reserved2(var a : Trequest_sense) : Tu8; +begin + reserved2:=(a.flag1 and bm_Trequest_sense_reserved2) shr bp_Trequest_sense_reserved2; +end; + +procedure set_reserved2(var a : Trequest_sense; __reserved2 : Tu8); +begin + a.flag1:=a.flag1 or ((__reserved2 shl bp_Trequest_sense_reserved2) and bm_Trequest_sense_reserved2); +end; + +function sense_key(var a : Trequest_sense) : Tu8; +begin + sense_key:=(a.flag1 and bm_Trequest_sense_sense_key) shr bp_Trequest_sense_sense_key; +end; + +procedure set_sense_key(var a : Trequest_sense; __sense_key : Tu8); +begin + a.flag1:=a.flag1 or ((__sense_key shl bp_Trequest_sense_sense_key) and bm_Trequest_sense_sense_key); +end; + +{ --------------------------------------------------------------------- + Implementation of utility functions. + ---------------------------------------------------------------------} + + +Const + NrDevices = 16; + Devices : Array[1..NrDevices] of string = ( + '/dev/cdrom', + '/dev/cdroms/cdrom?', + '/dev/hd?', + '/dev/sg?', + '/dev/cdu31a', + '/dev/cdu535', + '/dev/sbpcd', + '/dev/sbpcd?', + '/dev/sonycd', + '/dev/mcd', + '/dev/sjcd', + '/dev/cm206cd', + '/dev/gscd', + '/dev/scd?', + '/dev/sr?', + '/dev/optcd'); + +Function DetectCD : String; + +Var + I,J,L : Integer; + S : String; + +begin + Result:=''; + I:=0; + While (Result='') and (I<NrDevices) do + begin + Inc(I); + S:=Devices[i]; + L:=Length(S); + If S[l]='?' then + begin + S:=Copy(S,1,L-1); + For J:=0 to 3 do + If IsCdDevice(S+Chr(Ord('0')+J)) then + Result:=S+Chr(Ord('0')+J) + else If IsCdDevice(S+Chr(Ord('a')+J)) then + Result:=S+Chr(Ord('a')+J) + end + else + If IsCdDevice(S) then + Result:=S; + end; +end; + +Const + IDEMajor = [IDE0_MAJOR,IDE1_MAJOR,IDE2_MAJOR,IDE3_MAJOR]; + CDMajor = [CDU31A_CDROM_MAJOR,CDU535_CDROM_MAJOR, + MATSUSHITA_CDROM_MAJOR,MATSUSHITA_CDROM2_MAJOR, + MATSUSHITA_CDROM3_MAJOR,MATSUSHITA_CDROM4_MAJOR, + SANYO_CDROM_MAJOR, + MITSUMI_CDROM_MAJOR,MITSUMI_X_CDROM_MAJOR, + OPTICS_CDROM_MAJOR,AZTECH_CDROM_MAJOR, + GOLDSTAR_CDROM_MAJOR,CM206_CDROM_MAJOR]; + +Function TestCDRomIOCTL(Device : String) : Boolean;forward; + + +Function IsCDDevice(Device : String) : Boolean; + +Var + Info : stat; + S : String; + DeviceMajor,F : Integer; + +begin +{$ifdef debug} + Writeln('Testing device : ',Device); +{$endif} + Result:=False; + If fpstat(device,info)<>0 then + exit; + if not (fpS_ISCHR(info.st_mode) or + fpS_ISBLK(info.st_mode)) then + exit; + S:=fpReadLink(Device); + If (S<>'') then + Device:=S; + If fpStat(Device,info)<>0 then + exit; + DeviceMajor:=info.st_rdev shr 8; + If DeviceMajor in [IDE0_MAJOR,IDE1_MAJOR,IDE2_MAJOR,IDE3_MAJOR] then + Result:=TestCDRomIOCTL(Device) + else + begin + Result:=DeviceMajor in CDMajor; + If Not Result then + begin + // test SCSI + end + else + begin + F:=fpOpen(Device,OPEN_RDONLY or OPEN_NONBLOCK); + Result:=(F>=0); + If Result then + fpClose(F); + end; + end; +end; + +Function TestCDRomIOCTL(Device : String) : Boolean; + +Var + F : Integer; + info : Tcdrom_volctrl; + +begin +{$ifdef debug} + Writeln('Testing for ATAPI'); +{$endif} + Result:=False; + f:=fpOpen(device,OPEN_RDONLY or OPEN_NONBLOCK); + If (f<0) then + exit; + Result:=(fpIOCtl(f,CDROMVOLREAD,@info)=0); + fpClose(f); +end; + +end. diff --git a/packages/cdrom/src/major.pp b/packages/cdrom/src/major.pp new file mode 100644 index 0000000000..4830d95722 --- /dev/null +++ b/packages/cdrom/src/major.pp @@ -0,0 +1,162 @@ +unit major; +interface + +{ + Automatically converted by H2Pas 0.99.15 from major.h + The following command line parameters were used: + major.h +} + +{$PACKRECORDS C} + + + const + MAX_CHRDEV = 255; + MAX_BLKDEV = 255; + UNNAMED_MAJOR = 0; + MEM_MAJOR = 1; + RAMDISK_MAJOR = 1; + FLOPPY_MAJOR = 2; + PTY_MASTER_MAJOR = 2; + IDE0_MAJOR = 3; + PTY_SLAVE_MAJOR = 3; + HD_MAJOR = IDE0_MAJOR; + TTY_MAJOR = 4; + TTYAUX_MAJOR = 5; + LP_MAJOR = 6; + VCS_MAJOR = 7; + LOOP_MAJOR = 7; + SCSI_DISK0_MAJOR = 8; + SCSI_TAPE_MAJOR = 9; + MD_MAJOR = 9; + MISC_MAJOR = 10; + SCSI_CDROM_MAJOR = 11; + QIC02_TAPE_MAJOR = 12; + XT_DISK_MAJOR = 13; + SOUND_MAJOR = 14; + CDU31A_CDROM_MAJOR = 15; + JOYSTICK_MAJOR = 15; + GOLDSTAR_CDROM_MAJOR = 16; + OPTICS_CDROM_MAJOR = 17; + SANYO_CDROM_MAJOR = 18; + CYCLADES_MAJOR = 19; + CYCLADESAUX_MAJOR = 20; + MITSUMI_X_CDROM_MAJOR = 20; + { ARM Linux /dev/mfm } + MFM_ACORN_MAJOR = 21; + SCSI_GENERIC_MAJOR = 21; + Z8530_MAJOR = 34; + DIGI_MAJOR = 23; + IDE1_MAJOR = 22; + DIGICU_MAJOR = 22; + MITSUMI_CDROM_MAJOR = 23; + CDU535_CDROM_MAJOR = 24; + STL_SERIALMAJOR = 24; + MATSUSHITA_CDROM_MAJOR = 25; + STL_CALLOUTMAJOR = 25; + MATSUSHITA_CDROM2_MAJOR = 26; + QIC117_TAPE_MAJOR = 27; + MATSUSHITA_CDROM3_MAJOR = 27; + MATSUSHITA_CDROM4_MAJOR = 28; + STL_SIOMEMMAJOR = 28; + ACSI_MAJOR = 28; + AZTECH_CDROM_MAJOR = 29; + { SparcLinux & Linux/68k /dev/fb } + GRAPHDEV_MAJOR = 29; + { Linux/mips, SGI /dev/shmiq } + SHMIQ_MAJOR = 85; + CM206_CDROM_MAJOR = 32; + IDE2_MAJOR = 33; + IDE3_MAJOR = 34; + { expanded storage on S/390 = "slow ram" } + XPRAM_MAJOR = 35; + { proposed by Peter } + NETLINK_MAJOR = 36; + PS2ESDI_MAJOR = 36; + IDETAPE_MAJOR = 37; + Z2RAM_MAJOR = 37; + { AP1000 Block device } + APBLOCK_MAJOR = 38; + { AP1000 DDV block device } + DDV_MAJOR = 39; + { Network block device } + NBD_MAJOR = 43; + RISCOM8_NORMAL_MAJOR = 48; + { 48..55 } + DAC960_MAJOR = 48; + RISCOM8_CALLOUT_MAJOR = 49; + MKISS_MAJOR = 55; + { DSP56001 processor device } + DSP56K_MAJOR = 55; + IDE4_MAJOR = 56; + IDE5_MAJOR = 57; + { Logical Volume Manager } + LVM_BLK_MAJOR = 58; + SCSI_DISK1_MAJOR = 65; + SCSI_DISK2_MAJOR = 66; + SCSI_DISK3_MAJOR = 67; + SCSI_DISK4_MAJOR = 68; + SCSI_DISK5_MAJOR = 69; + SCSI_DISK6_MAJOR = 70; + SCSI_DISK7_MAJOR = 71; + COMPAQ_SMART2_MAJOR = 72; + COMPAQ_SMART2_MAJOR1 = 73; + COMPAQ_SMART2_MAJOR2 = 74; + COMPAQ_SMART2_MAJOR3 = 75; + COMPAQ_SMART2_MAJOR4 = 76; + COMPAQ_SMART2_MAJOR5 = 77; + COMPAQ_SMART2_MAJOR6 = 78; + COMPAQ_SMART2_MAJOR7 = 79; + SPECIALIX_NORMAL_MAJOR = 75; + SPECIALIX_CALLOUT_MAJOR = 76; + COMPAQ_CISS_MAJOR = 104; + COMPAQ_CISS_MAJOR1 = 105; + COMPAQ_CISS_MAJOR2 = 106; + COMPAQ_CISS_MAJOR3 = 107; + COMPAQ_CISS_MAJOR4 = 108; + COMPAQ_CISS_MAJOR5 = 109; + COMPAQ_CISS_MAJOR6 = 110; + COMPAQ_CISS_MAJOR7 = 111; + ATARAID_MAJOR = 114; + { Official assignations from Peter } + DASD_MAJOR = 94; + { Official assignations from Peter } + MDISK_MAJOR = 95; + { 80->87 } + I2O_MAJOR = 80; + IDE6_MAJOR = 88; + IDE7_MAJOR = 89; + IDE8_MAJOR = 90; + IDE9_MAJOR = 91; + UBD_MAJOR = 98; + AURORA_MAJOR = 79; + JSFD_MAJOR = 99; + PHONE_MAJOR = 100; + { Logical Volume Manager } + LVM_CHAR_MAJOR = 109; + RTF_MAJOR = 150; + RAW_MAJOR = 162; + USB_ACM_MAJOR = 166; + USB_ACM_AUX_MAJOR = 167; + USB_CHAR_MAJOR = 180; + UNIX98_PTY_MASTER_MAJOR = 128; + UNIX98_PTY_MAJOR_COUNT = 8; + UNIX98_PTY_SLAVE_MAJOR = UNIX98_PTY_MASTER_MAJOR + UNIX98_PTY_MAJOR_COUNT; + { VERITAS volume i/o driver } + VXVM_MAJOR = 199; + { VERITAS volume config driver } + VXSPEC_MAJOR = 200; + { VERITAS volume multipath driver } + VXDMP_MAJOR = 201; + MSR_MAJOR = 202; + CPUID_MAJOR = 203; + { OnStream-SCx0 SCSI tape } + OSST_MAJOR = 206; + { Official allocations now } + IBM_TTY3270_MAJOR = 227; + IBM_FS3270_MAJOR = 228; + +implementation + + +end. diff --git a/packages/cdrom/src/scsidefs.pp b/packages/cdrom/src/scsidefs.pp new file mode 100644 index 0000000000..80d10ea04c --- /dev/null +++ b/packages/cdrom/src/scsidefs.pp @@ -0,0 +1,293 @@ +unit scsidefs; + +interface + +const + +{ --------------------------------------------------------------------- + TARGET STATUS VALUES + ---------------------------------------------------------------------} + + STATUS_GOOD = $00; // Status Good + STATUS_CHKCOND = $02; // Check Condition + STATUS_CONDMET = $04; // Condition Met + STATUS_BUSY = $08; // Busy + STATUS_INTERM = $10; // Intermediate + STATUS_INTCDMET = $14; // Intermediate-condition met + STATUS_RESCONF = $18; // Reservation conflict + STATUS_COMTERM = $22; // Command Terminated + STATUS_QFULL = $28; // Queue full + +{ --------------------------------------------------------------------- + SCSI MISCELLANEOUS EQUATES + ---------------------------------------------------------------------} + + MAXLUN = 7; // Maximum Logical Unit Id + MAXTARG = 7; // Maximum Target Id + MAX_SCSI_LUNS = 64; // Maximum Number of SCSI LUNs + MAX_NUM_HA = 8; // Maximum Number of SCSI HA's + +{ --------------------------------------------------------------------- + SCSI COMMAND OPCODES + ---------------------------------------------------------------------} + +{ --------------------------------------------------------------------- + Commands for all Device Types + ---------------------------------------------------------------------} + + SCSI_CHANGE_DEF = $40; // Change Definition (Optional) + SCSI_COMPARE = $39; // Compare (O) + SCSI_COPY = $18; // Copy (O) + SCSI_COP_VERIFY = $3A; // Copy and Verify (O) + SCSI_INQUIRY = $12; // Inquiry (MANDATORY) + SCSI_LOG_SELECT = $4C; // Log Select (O) + SCSI_LOG_SENSE = $4D; // Log Sense (O) + SCSI_MODE_SEL6 = $15; // Mode Select 6-byte (Device Specific) + SCSI_MODE_SEL10 = $55; // Mode Select 10-byte (Device Specific) + SCSI_MODE_SEN6 = $1A; // Mode Sense 6-byte (Device Specific) + SCSI_MODE_SEN10 = $5A; // Mode Sense 10-byte (Device Specific) + SCSI_READ_BUFF = $3C; // Read Buffer (O) + SCSI_REQ_SENSE = $03; // Request Sense (MANDATORY) + SCSI_SEND_DIAG = $1D; // Send Diagnostic (O) + SCSI_TST_U_RDY = $00; // Test Unit Ready (MANDATORY) + SCSI_WRITE_BUFF = $3B; // Write Buffer (O) + +{ --------------------------------------------------------------------- + Commands Unique to Direct Access Devices + ---------------------------------------------------------------------} + + SCSI_FORMAT = $04; // Format Unit (MANDATORY) + SCSI_LCK_UN_CAC = $36; // Lock Unlock Cache (O) + SCSI_PREFETCH = $34; // Prefetch (O) + SCSI_MED_REMOVL = $1E; // Prevent/Allow medium Removal (O) + SCSI_READ6 = $08; // Read 6-byte (MANDATORY) + SCSI_READ10 = $28; // Read 10-byte (MANDATORY) + SCSI_RD_CAPAC = $25; // Read Capacity (MANDATORY) + SCSI_RD_DEFECT = $37; // Read Defect Data (O) + SCSI_READ_LONG = $3E; // Read Long (O) + SCSI_REASS_BLK = $07; // Reassign Blocks (O) + SCSI_RCV_DIAG = $1C; // Receive Diagnostic Results (O) + SCSI_RELEASE = $17; // Release Unit (MANDATORY) + SCSI_REZERO = $01; // Rezero Unit (O) + SCSI_SRCH_DAT_E = $31; // Search Data Equal (O) + SCSI_SRCH_DAT_H = $30; // Search Data High (O) + SCSI_SRCH_DAT_L = $32; // Search Data Low (O) + SCSI_SEEK6 = $0B; // Seek 6-Byte (O) + SCSI_SEEK10 = $2B; // Seek 10-Byte (O) + SCSI_SET_LIMIT = $33; // Set Limits (O) + SCSI_START_STP = $1B; // Start/Stop Unit (O) + SCSI_SYNC_CACHE = $35; // Synchronize Cache (O) + SCSI_VERIFY = $2F; // Verify (O) + SCSI_WRITE6 = $0A; // Write 6-Byte (MANDATORY) + SCSI_WRITE10 = $2A; // Write 10-Byte (MANDATORY) + SCSI_WRT_VERIFY = $2E; // Write and Verify (O) + SCSI_WRITE_LONG = $3F; // Write Long (O) + SCSI_WRITE_SAME = $41; // Write Same (O) + +{ --------------------------------------------------------------------- + Commands Unique to Sequential Access Devices + ---------------------------------------------------------------------} + + SCSI_ERASE = $19; // Erase (MANDATORY) + SCSI_LOAD_UN = $1B; // Load/Unload (O) + SCSI_LOCATE = $2B; // Locate (O) + SCSI_RD_BLK_LIM = $05; // Read Block Limits (MANDATORY) + SCSI_READ_POS = $34; // Read Position (O) + SCSI_READ_REV = $0F; // Read Reverse (O) + SCSI_REC_BF_DAT = $14; // Recover Buffer Data (O) + SCSI_RESERVE = $16; // Reserve Unit (MANDATORY) + SCSI_REWIND = $01; // Rewind (MANDATORY) + SCSI_SPACE = $11; // Space (MANDATORY) + SCSI_VERIFY_T = $13; // Verify (Tape) (O) + SCSI_WRT_FILE = $10; // Write Filemarks (MANDATORY) + +{ --------------------------------------------------------------------- + Commands Unique to Printer Devices + ---------------------------------------------------------------------} + + SCSI_PRINT = $0A; // Print (MANDATORY) + SCSI_SLEW_PNT = $0B; // Slew and Print (O) + SCSI_STOP_PNT = $1B; // Stop Print (O) + SCSI_SYNC_BUFF = $10; // Synchronize Buffer (O) + +{ --------------------------------------------------------------------- + Commands Unique to Processor Devices + ---------------------------------------------------------------------} + + SCSI_RECEIVE = $08; // Receive (O) + SCSI_SEND = $0A; // Send (O) + +{ --------------------------------------------------------------------- + Commands Unique to Write-Once Devices + ---------------------------------------------------------------------} + + SCSI_MEDIUM_SCN = $38; // Medium Scan (O) + SCSI_SRCHDATE10 = $31; // Search Data Equal 10-Byte (O) + SCSI_SRCHDATE12 = $B1; // Search Data Equal 12-Byte (O) + SCSI_SRCHDATH10 = $30; // Search Data High 10-Byte (O) + SCSI_SRCHDATH12 = $B0; // Search Data High 12-Byte (O) + SCSI_SRCHDATL10 = $32; // Search Data Low 10-Byte (O) + SCSI_SRCHDATL12 = $B2; // Search Data Low 12-Byte (O) + SCSI_SET_LIM_10 = $33; // Set Limits 10-Byte (O) + SCSI_SET_LIM_12 = $B3; // Set Limits 10-Byte (O) + SCSI_VERIFY10 = $2F; // Verify 10-Byte (O) + SCSI_VERIFY12 = $AF; // Verify 12-Byte (O) + SCSI_WRITE12 = $AA; // Write 12-Byte (O) + SCSI_WRT_VER10 = $2E; // Write and Verify 10-Byte (O) + SCSI_WRT_VER12 = $AE; // Write and Verify 12-Byte (O) + +{ --------------------------------------------------------------------- + Commands Unique to CD-ROM Devices + ---------------------------------------------------------------------} + + SCSI_PLAYAUD_10 = $45; // Play Audio 10-Byte (O) + SCSI_PLAYAUD_12 = $A5; // Play Audio 12-Byte 12-Byte (O) + SCSI_PLAYAUDMSF = $47; // Play Audio MSF (O) + SCSI_PLAYA_TKIN = $48; // Play Audio Track/Index (O) + SCSI_PLYTKREL10 = $49; // Play Track Relative 10-Byte (O) + SCSI_PLYTKREL12 = $A9; // Play Track Relative 12-Byte (O) + SCSI_READCDCAP = $25; // Read CD-ROM Capacity (MANDATORY) + SCSI_READHEADER = $44; // Read Header (O) + SCSI_SUBCHANNEL = $42; // Read Subchannel (O) + SCSI_READ_TOC = $43; // Read TOC (O) + SCSI_STOP = $4E; + SCSI_PAUSERESUME = $4B; + +{ --------------------------------------------------------------------- + Commands Unique to Scanner Devices + ---------------------------------------------------------------------} + + SCSI_GETDBSTAT = $34; // Get Data Buffer Status (O) + SCSI_GETWINDOW = $25; // Get Window (O) + SCSI_OBJECTPOS = $31; // Object Postion (O) + SCSI_SCAN = $1B; // Scan (O) + SCSI_SETWINDOW = $24; // Set Window (MANDATORY) + +{ --------------------------------------------------------------------- + Commands Unique to Optical Memory Devices + ---------------------------------------------------------------------} + + SCSI_UpdateBlk = $3D; // Update Block (O) + +{ --------------------------------------------------------------------- + Commands Unique to Optical Medium Changer Devices + ---------------------------------------------------------------------} + + SCSI_EXCHMEDIUM = $A6; // Exchange Medium (O) + SCSI_INITELSTAT = $07; // Initialize Element Status (O) + SCSI_POSTOELEM = $2B; // Position to Element (O) + SCSI_REQ_VE_ADD = $B5; // Request Volume Element Address (O) + SCSI_SENDVOLTAG = $B6; // Send Volume Tag (O) + +{ --------------------------------------------------------------------- + Commands Unique to Optical Communication Devices + ---------------------------------------------------------------------} + + SCSI_GET_MSG_6 = $08; // Get Message 6-Byte (MANDATORY) + SCSI_GET_MSG_10 = $28; // Get Message 10-Byte (O) + SCSI_GET_MSG_12 = $A8; // Get Message 12-Byte (O) + SCSI_SND_MSG_6 = $0A; // Send Message 6-Byte (MANDATORY) + SCSI_SND_MSG_10 = $2A; // Send Message 10-Byte (O) + SCSI_SND_MSG_12 = $AA; // Send Message 12-Byte (O) + +{ --------------------------------------------------------------------- + Request Sense Data Format + ---------------------------------------------------------------------} + +type + + SENSE_DATA_FMT = record + ErrorCode, // Error Code (70H or 71H) + SegmentNum, // Number of current segment descriptor + SenseKey, // Sense Key(See bit definitions too) + InfoByte0, // Information MSB + InfoByte1, // Information MID + InfoByte2, // Information MID + InfoByte3, // Information LSB + AddSenLen, // Additional Sense Length + ComSpecInf0, // Command Specific Information MSB + ComSpecInf1, // Command Specific Information MID + ComSpecInf2, // Command Specific Information MID + ComSpecInf3, // Command Specific Information LSB + AddSenseCode, // Additional Sense Code + AddSenQual, // Additional Sense Code Qualifier + FieldRepUCode, // Field Replaceable Unit Code + SenKeySpec15, // Sense Key Specific 15th byte + SenKeySpec16, // Sense Key Specific 16th byte + SenKeySpec17, // Sense Key Specific 17th byte + AddSenseBytes : BYTE; // Additional Sense Bytes + end; + + TSENSE_DATA_FMT = SENSE_DATA_FMT; + PSENSE_DATA_FMT = ^SENSE_DATA_FMT; + +{ --------------------------------------------------------------------- + REQUEST SENSE ERROR CODE + ---------------------------------------------------------------------} + +const + + SERROR_CURRENT = $70; // Current Errors + SERROR_DEFERED = $71; // Deferred Errors + +{ --------------------------------------------------------------------- + REQUEST SENSE BIT DEFINITIONS + ---------------------------------------------------------------------} + + SENSE_VALID = $80; // Byte 0 Bit 7 + SENSE_FILEMRK = $80; // Byte 2 Bit 7 + SENSE_EOM = $40; // Byte 2 Bit 6 + SENSE_ILI = $20; // Byte 2 Bit 5 + +{ --------------------------------------------------------------------- + REQUEST SENSE SENSE KEY DEFINITIONS + ---------------------------------------------------------------------} + + KEY_NOSENSE = $00; // No Sense + KEY_RECERROR = $01; // Recovered Error + KEY_NOTREADY = $02; // Not Ready + KEY_MEDIUMERR = $03; // Medium Error + KEY_HARDERROR = $04; // Hardware Error + KEY_ILLGLREQ = $05; // Illegal Request + KEY_UNITATT = $06; // Unit Attention + KEY_DATAPROT = $07; // Data Protect + KEY_BLANKCHK = $08; // Blank Check + KEY_VENDSPEC = $09; // Vendor Specific + KEY_COPYABORT = $0A; // Copy Abort + KEY_EQUAL = $0C; // Equal (Search) + KEY_VOLOVRFLW = $0D; // Volume Overflow + KEY_MISCOMP = $0E; // Miscompare (Search) + KEY_RESERVED = $0F; // Reserved + +{ --------------------------------------------------------------------- + PERIPHERAL DEVICE TYPE DEFINITIONS + ---------------------------------------------------------------------} + + DTYPE_DASD = $00; // Disk Device + DTYPE_SEQD = $01; // Tape Device + DTYPE_PRNT = $02; // Printer + DTYPE_PROC = $03; // Processor + DTYPE_WORM = $04; // Write-once read-multiple + DTYPE_CROM = $05; // CD-ROM device + DTYPE_CDROM = DTYPE_CROM; + DTYPE_SCAN = $06; // Scanner device + DTYPE_OPTI = $07; // Optical memory device + DTYPE_JUKE = $08; // Medium Changer device + DTYPE_COMM = $09; // Communications device + DTYPE_RESL = $0A; // Reserved (low) + DTYPE_RESH = $1E; // Reserved (high) + DTYPE_UNKNOWN = $1F; // Unknown or no device type + +{ --------------------------------------------------------------------- + ANSI APPROVED VERSION DEFINITIONS + ---------------------------------------------------------------------} + + ANSI_MAYBE = $0; // Device may or may not be ANSI approved stand + ANSI_SCSI1 = $1; // Device complies to ANSI X3.131-1986 (SCSI-1) + ANSI_SCSI2 = $2; // Device complies to SCSI-2 + ANSI_RESLO = $3; // Reserved (low) + ANSI_RESHI = $7; // Reserved (high) + +implementation + +end. diff --git a/packages/cdrom/src/wincd.pp b/packages/cdrom/src/wincd.pp new file mode 100644 index 0000000000..18562c80f6 --- /dev/null +++ b/packages/cdrom/src/wincd.pp @@ -0,0 +1,511 @@ +{ +} +unit wincd; + +{$mode objfpc} +{$h+} + +interface + +uses Windows,SysUtils; + +Type + TCDAccessMethod = (camNone,camASPI,camSPTI,camIOCTL); +{$packrecords c} +TTOCTrack = packed record + rsvd, + ADR, + trackNumber, + rsvd2 : Byte; + addr : Array[0..3] of byte; +end; + +TTOC = packed Record + toclen : word; + firsttrack, + lastTrack : byte; + toctrack: Array[0..99] of TTocTrack; +end; + +Const + AccessMethodNames : Array[TCDAccessMethod] of string + = ('None','ASPI','SPTI','IOCTL'); + +Function GetCDAccessMethod : TCDAccessMethod; +Procedure SetCDAccessMethod (Value : TCDAccessMethod); +Function ReadTOC(Device : String; Var TOC : TTOc) : Integer; +Function EnumCDDrives(Var Drives : Array of String) : Integer; +Function GetNumDrives : Integer; + +implementation + +uses cdromioctl,wnaspi32,scsidefs; + +Var + CurrentAccessMethod : TCDAccessMethod; + CDOSVer : Integer; + +{ --------------------------------------------------------------------- + SPTI Defines. + ---------------------------------------------------------------------} + +Type + +{$packrecords C} + SCSI_PASS_THROUGH = record + Length : USHORT; + ScsiStatus : UCHAR; + PathId : UCHAR; + TargetId : UCHAR; + Lun : UCHAR; + CdbLength : UCHAR; + SenseInfoLength : UCHAR; + DataIn : UCHAR; + DataTransferLength : ULONG; + TimeOutValue : ULONG; + DataBufferOffset : ULONG; + SenseInfoOffset : ULONG; + Cdb : array[0..15] of UCHAR; + end; + TSCSI_PASS_THROUGH = SCSI_PASS_THROUGH; + PSCSI_PASS_THROUGH = ^TSCSI_PASS_THROUGH; + + SCSI_PASS_THROUGH_DIRECT = record + Length : USHORT; + ScsiStatus : UCHAR; + PathId : UCHAR; + TargetId : UCHAR; + Lun : UCHAR; + CdbLength : UCHAR; + SenseInfoLength : UCHAR; + DataIn : UCHAR; + DataTransferLength : ULONG; + TimeOutValue : ULONG; + DataBuffer : PVOID; + SenseInfoOffset : ULONG; + Cdb : array[0..15] of UCHAR; + end; + TSCSI_PASS_THROUGH_DIRECT = SCSI_PASS_THROUGH_DIRECT; + PSCSI_PASS_THROUGH_DIRECT = ^SCSI_PASS_THROUGH_DIRECT; + + SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER = record + spt : SCSI_PASS_THROUGH_DIRECT; + Filler : ULONG; + ucSenseBuf : array[0..31] of UCHAR; + end; + TSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER = SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER; + PSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER = ^SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER; + + +const + METHOD_BUFFERED = 0; + METHOD_IN_DIRECT = 1; + METHOD_OUT_DIRECT = 2; + METHOD_NEITHER = 3; + + FILE_ANY_ACCESS = 0; + FILE_READ_ACCESS = $0001; + FILE_WRITE_ACCESS = $0002; + IOCTL_CDROM_BASE = $00000002; + IOCTL_SCSI_BASE = $00000004; + + SCSI_IOCTL_DATA_OUT = 0; + SCSI_IOCTL_DATA_IN = 1; + SCSI_IOCTL_DATA_UNSPECIFIED = 2; + +{ --------------------------------------------------------------------- + Initialization code. + ---------------------------------------------------------------------} + +procedure InitWinCD; + +Var + TheCDOSVER : TOSVersionInfo; + +begin + TheCDOSVer.dwOSVersionInfoSize:=SizeOf(TheCDOSver); + GetVersionEx(TheCDOSVer); + CDOSVer:=TheCDOSVer.dwMajorVersion; + If AspiLoaded then + CurrentAccessMethod := camASPI + else + begin + if (CDOSver<1) then + CurrentAccessMethod := camNone + else + { + It is better to use SPTI on windows, but the problem with that + is that administrative priviledges are needed. A detection + algorithm for these priviledges here would be nice. + } + CurrentAccessMethod := camSPTI; + end; +end; + +{ --------------------------------------------------------------------- + Actual reading of table of contents. + ---------------------------------------------------------------------} + +{ --------------------------------------------------------------------- + 1. SPTI + ---------------------------------------------------------------------} + +Function sptiReadTOC(Device : String; var TOC: TToC) : Integer; + +Var + DriveHandle : THandle; + len : Cardinal; + buf : Array[0..31] of char; + ID,retVal : Integer; + Returned,Flags : Cardinal; + swb : TSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER; +begin + Flags := Cardinal(GENERIC_READ); + if (CDOSVer>4) then + Flags:=Flags or Cardinal(GENERIC_WRITE); + Device:=Upcase('\\.\'+Device); + DriveHandle:=CreateFile(pchar(Device),Flags,FILE_SHARE_READ, + nil,OPEN_EXISTING, 0, 0 ); + if (DriveHandle=INVALID_HANDLE_VALUE) then + begin + Result:=-1; + Exit; + end; + Try + Returned:= 0; + len:= sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER); + FillChar(swb, len ,0); + With swb.spt do + begin + Length := sizeof(swb.spt); // SCSI_PASS_THROUGH); + CdbLength := 10; + DataIn := SCSI_IOCTL_DATA_IN; + DataTransferLength := SizeOf(tOC); + TimeOutValue := 5; + DataBuffer := @TOC; + SenseInfoOffset := @swb.ucSenseBuf[0]-pbyte(@swb.spt); + Cdb[0] := $43; // read TOC + Cdb[1] := $02; // MSF mode + Cdb[7] := $03; + Cdb[8] := $24; + end; + if (Not DeviceIoControl(DriveHandle, + IOCTL_SCSI_PASS_THROUGH_DIRECT, + @swb, + len, + @swb, + len, + @Returned, + Nil)) then + begin + Result:=-1; + Exit; + end; + With TOC do + Result:=LastTrack-FirstTrack+1; + finally + CloseHandle(DriveHandle); + end; +end; + +{ --------------------------------------------------------------------- + 2. ASPI + ---------------------------------------------------------------------} + +Function AspiGetNumAdapters : Integer; + +Var + D : DWORD; + Count, Status : Byte; + +begin + d:= GetASPI32SupportInfo(); + Count:=D and $FF; + Status:=(D shr 8) and $ff; + if (Status<>SS_COMP) and (Status<>SS_NO_ADAPTERS) then + Result:=-1 + else + Result:=Count; +end; + +Function DriveToSCSIParm (Device : String; Var HID,TGT,LUN : Byte) : Boolean; + +Var + Code : Integer; + +begin + Result:=False; + Code:=Pos('[',Device); + if Code<>0 then + begin + Delete(Device,1,Code); + Code:=Pos(';',Device); + HID:=StrToIntDef(Copy(Device,1,Code-1),-1); + Result:=HID<>-1; + If result then + begin + Delete(DEvice,1,Code); + Code:=Pos(';',Device); + Tgt:=StrToIntDef(Copy(Device,1,Code-1),-1); + Result:=tgt<>-1; + If result then + begin + Delete(DEvice,1,Code); + Code:=Pos(']',Device); + Lun:=StrToIntDef(Copy(Device,1,Code-1),-1); + Result:=Lun<>-1; + end; + end; + end; +end; + +Var + Atoc : TTOc; + +Function AspiReadTOC(Device : String; Var TOC : TTOC) : Integer; + +Var + HAID,TGT,LUN : Byte; + Status : DWord; + S,T : SRB_ExecSCSICmd; + HEvent : THANDLE; + +begin + If Not DriveToSCSIParm(Device,HAID,TGT,lun) then + begin + Result:=-1; + Exit; + end; + Writeln('About to read toc from ',haid,' ',tgt,' ',lun); + hEvent:=CreateEvent( nil, TRUE, FALSE, nil ); + Writeln('Resetting event'); + ResetEvent(hEvent); + Writeln('Reset event'); + Try + FillChar(S,sizeof(s),0); + s.SRB_Cmd := SC_EXEC_SCSI_CMD; + s.SRB_HaID := HaID; + s.SRB_Target := Tgt; + s.SRB_Lun := lun; + s.SRB_Flags := SRB_DIR_IN or SRB_EVENT_NOTIFY; + s.SRB_BufLen := SizeOf(Toc); + s.SRB_BufPointer := @TOC; + s.SRB_SenseLen := SENSE_LEN; + s.SRB_CDBLen := $0A; + s.SRB_PostProc := LPVOID(hEvent); + s.CDBByte[0] := SCSI_READ_TOC; // read TOC command + s.CDBByte[1] := $02; // MSF mode + s.CDBByte[7] := HiByte(Word(S.SRB_BufLen)); // high-order byte of buffer len + s.CDBByte[8] := LoByte(Word(S.SRB_BUFLEN)); // low-order byte of buffer len + Writeln('Sending Command'); + SendASPI32Command(LPSRB(@s)); + Writeln('Sent Command'); + Status:=S.SRB_STATUS; + Writeln('Command status,',Status); + if (Status=SS_PENDING ) then + begin + Writeln('Waiting for object'); + WaitForSingleObject( hEvent, 10000 ); // wait up to 10 secs + Writeln('Waiting ended'); + end; + Finally + CloseHandle( hEvent ); + end; + if (S.SRB_Status<>SS_COMP ) then + begin + Result:=-1; + Exit; + end; + Writeln('Command completed'); + With TOC do + Result:=LastTrack-FirstTrack+1; +end; + +{ --------------------------------------------------------------------- + 3. IOCTL + ---------------------------------------------------------------------} + +Function ioctlReadTOC(Device : String; Var TOC : TTOC) : Integer; + +Var + DriveHandle : Thandle; + Retval : Longint; + Returned : DWord; + Flags : Cardinal; + +begin + Flags:=Cardinal(GENERIC_READ); + device:=Upcase('\\.\'+device); + DriveHandle:=CreateFile(PChar(Device), Flags, + FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0 ); + if (DriveHandle = INVALID_HANDLE_VALUE) then + begin + result:=-1; + exit; + end; + Try + Returned := 0; + FillChar(Toc, sizeof(TOC),0 ); + if Not DeviceIoControl(DriveHandle, + IOCTL_CDROM_READ_TOC, + Nil, + 0, + @TOC, + sizeof(TTOC), + @Returned, + NiL) then + begin + Result:=-1; + exit; + end; + With TOC do + Result:=LastTrack-FirstTrack+1; + Finally + CloseHandle(DriveHandle); + end; +end; + + +Function NtDriveInfo(CopyDrives : Boolean;Var CDDrives : Array of string): Integer; + +var + I : Integer; + Drives : Array[0..105] of char; + P : PChar; + +begin + FillChar(Drives,SizeOf(Drives),0); + GetLogicalDriveStrings(105,Drives); + P:=@Drives[0]; + Result:=0; + While P[0]<>#0 do + begin + If GetDriveType(p)=DRIVE_CDROM then + begin + If CopyDrives and (Result<High(CDDrives)) then + CDDrives[Result]:=Upcase(P[0])+':'; + Inc(Result); + end; + P:=P+Strlen(P)+1; + end; +end; + +Function NTGetNumDrives: Integer; + +Var A : Array[1..1] of string; + +begin + Result:=NTDriveInfo(False,A); +end; + +Function ioctlEnumDrives(Var Drives : Array of string) : Integer; + +begin + result:=NTDriveInfo(True,Drives); +end; + +{ --------------------------------------------------------------------- + 3. Generic + ---------------------------------------------------------------------} + +Function ReadTOC(Device : String; Var TOC : TTOc) : Integer; + +begin + Case CurrentAccessMethod of + camNone : Result:=-1; + camASPI : Result:=AspiReadTOC(Device,TOC); + camSPTI : Result:=SptiReadTOC(Device,TOC); + camIOCTL : Result:=IOCTLReadTOC(Device,TOC); + end; +end; + +Function GetCDAccessMethod : TCDAccessMethod; + +begin + Result:=CurrentAccessMethod; +end; + +Procedure SetCDAccessMethod (Value : TCDAccessMethod); + +begin + CurrentAccessMethod:=Value; +end; + + +Function ASPIDriveInfo(CopyInfo : Boolean; Var Drives : Array of string) : Integer; + +var + sh : SRB_HAInquiry; + sd : SRB_GDEVBlock; + numAdapters, maxTgt : Byte; + i, j, k : byte; + idx : Integer; + +begin + Result:=0; + numAdapters := AspiGetNumAdapters; + if (numAdapters=0) then + exit; + For I:=0 to NumAdapters-1 do + begin + FillChar(sh,sizeof(sh),0); + sh.SRB_Cmd := SC_HA_INQUIRY; + sh.SRB_HaID := i; + SendASPI32Command(LPSRB(@sh)); + if (sh.SRB_Status=SS_COMP) then + begin + maxTgt:=sh.HA_Unique[3]; + if (maxTgt=0) then + maxTgt:=MAXTARG; + For J:=0 to Maxtgt-1 do + For k:=0 to MAXLUN-1 do + begin + FillChar(sd,sizeof(sd),0); + sd.SRB_Cmd := SC_GET_DEV_TYPE; + sd.SRB_HaID := i; + sd.SRB_Target := j; + sd.SRB_Lun := k; + SendASPI32Command(LPSRB(@sd)); + if (sd.SRB_Status=SS_COMP) and + (sd.SRB_DeviceType=DTYPE_CDROM) then + begin + If CopyInfo and (Result<High(Drives)) then + Drives[Result]:=Format('ASPI[%d;%d;%d]',[I,J,K]); + Inc(Result); + end; + end; + end; + end; +end; + +Function ASPIGetNumDrives: Integer; + +Var + A : Array[1..1] of string; + +begin + Result:=AspiDriveInfo(False,A); +end; + + +Function GetNumDrives : Integer; + +begin + If CurrenTAccessMethod=camASPI then + Result:=AspiGetNumDrives + else + Result:=NTGetNumDrives; +end; + +Function EnumCDDrives(Var Drives : Array of String) : Integer; + +begin + If CurrenTAccessMethod=camASPI then + Result:=AspiDriveInfo(True,Drives) + else + Result:=ioctlEnumDrives(Drives); +end; + +Initialization + InitWinCD; +end. diff --git a/packages/cdrom/src/wnaspi32.pp b/packages/cdrom/src/wnaspi32.pp new file mode 100644 index 0000000000..0fa6f22952 --- /dev/null +++ b/packages/cdrom/src/wnaspi32.pp @@ -0,0 +1,259 @@ +unit wnaspi32; + +{$mode objfpc} + +interface + +uses Windows; + +type + LPSRB = Pointer; + +const +{ $packrecords c} + + SENSE_LEN = 14; // Default sense buffer length + SRB_DIR_SCSI = $00; // Direction determined by SCSI command + SRB_DIR_IN = $08; // Transfer from SCSI target to host + SRB_DIR_OUT = $10; // Transfer from host to SCSI target + SRB_POSTING = $01; // Enable ASPI posting + SRB_EVENT_NOTIFY = $40; // Enable ASPI event notification + SRB_ENABLE_RESIDUAL_COUNT = $04; // Enable residual byte count reporting + SRB_DATA_SG_LIST = $02; // Data buffer points to scatter-gather list + + WM_ASPIPOST = $4D42; // ASPI Post message + +{ --------------------------------------------------------------------- + ASPI Command Definitions + ---------------------------------------------------------------------} + + SC_HA_INQUIRY = $00; // Host adapter inquiry + SC_GET_DEV_TYPE = $01; // Get device type + SC_EXEC_SCSI_CMD = $02; // Execute SCSI command + SC_ABORT_SRB = $03; // Abort an SRB + SC_RESET_DEV = $04; // SCSI bus device reset + SC_GET_DISK_INFO = $06; // Get Disk information + +{ --------------------------------------------------------------------- + SRB Status + ---------------------------------------------------------------------} + + SS_PENDING = $00; // SRB being processed + SS_COMP = $01; // SRB completed without error + SS_ABORTED = $02; // SRB aborted + SS_ABORT_FAIL = $03; // Unable to abort SRB + SS_ERR = $04; // SRB completed with error + + SS_INVALID_CMD = $80; // Invalid ASPI command + SS_INVALID_HA = $81; // Invalid host adapter number + SS_NO_DEVICE = $82; // SCSI device not installed + + SS_INVALID_SRB = $E0; // Invalid parameter set in SRB + SS_FAILED_INIT = $E4; // ASPI for windows failed init + SS_ASPI_IS_BUSY = $E5; // No resources available to execute cmd + SS_BUFFER_TO_BIG = $E6; // Buffer size to big to handle! + SS_NO_ADAPTERS = $E8; // No adapters. + +{ --------------------------------------------------------------------- + Host Adapter Status + ---------------------------------------------------------------------} + + HASTAT_OK = $00; // Host adapter did not detect an // error + HASTAT_SEL_TO = $11; // Selection Timeout + HASTAT_DO_DU = $12; // Data overrun data underrun + HASTAT_BUS_FREE = $13; // Unexpected bus free + HASTAT_PHASE_ERR = $14; // Target bus phase sequence // failure + HASTAT_TIMEOUT = $09; // Timed out while SRB was waiting to beprocessed. + HASTAT_COMMAND_TIMEOUT = $0B; // While processing the SRB, the adapter timed out. + HASTAT_MESSAGE_REJECT = $0D; // While processing SRB, the // adapter received a MESSAGE // REJECT. + HASTAT_BUS_RESET = $0E; // A bus reset was detected. + HASTAT_PARITY_ERROR = $0F; // A parity error was detected. + HASTAT_REQUEST_SENSE_FAILED = $10; // The adapter failed in issuing + +{ --------------------------------------------------------------------- + SRB - HOST ADAPTER INQUIRY - SC_HA_INQUIRY + ---------------------------------------------------------------------} + +type + + SRB_HAInquiry = record + SRB_Cmd : Byte; // ASPI command code = SC_HA_INQUIRY + SRB_Status : Byte; // ASPI command status byte + SRB_HaId : Byte; // ASPI host adapter number + SRB_Flags : Byte; // ASPI request flags + SRB_Hdr_Rsvd : DWORD; // Reserved, MUST = 0 + HA_Count : Byte; // Number of host adapters present + HA_SCSI_ID : Byte; // SCSI ID of host adapter + HA_ManagerId : array[0..15] of Byte; // String describing the manager + HA_Identifier : array[0..15] of Byte; // String describing the host adapter + HA_Unique : array[0..15] of Byte; // Host Adapter Unique parameters + HA_Rsvd1 : Word; + end; + + PSRB_HAInquiry = ^SRB_HAInquiry; + TSRB_HAInquiry = SRB_HAInquiry; + +{ --------------------------------------------------------------------- + SRB - GET DEVICE TYPE - SC_GET_DEV_TYPE + ---------------------------------------------------------------------} + + SRB_GDEVBlock = record + SRB_Cmd, // ASPI command code = SC_GET_DEV_TYPE + SRB_Status, // ASPI command status byte + SRB_HaId, // ASPI host adapter number + SRB_Flags : BYTE; // Reserved + SRB_Hdr_Rsvd : DWORD; // Reserved + SRB_Target, // Target's SCSI ID + SRB_Lun, // Target's LUN number + SRB_DeviceType, // Target's peripheral device type + SRB_Rsvd1 : BYTE; + end; + + TSRB_GDEVBlock = SRB_GDEVBlock; + PSRB_GDEVBlock = ^SRB_GDEVBlock; + +{ --------------------------------------------------------------------- + SRB - EXECUTE SCSI COMMAND - SC_EXEC_SCSI_CMD + ---------------------------------------------------------------------} + + SRB_ExecSCSICmd = record + SRB_Cmd, // ASPI command code = SC_EXEC_SCSI_CMD + SRB_Status, // ASPI command status byte + SRB_HaId, // ASPI host adapter number + SRB_Flags : BYTE; // ASPI request flags + SRB_Hdr_Rsvd : DWORD; // Reserved + SRB_Target, // Target's SCSI ID + SRB_Lun : BYTE; // Target's LUN number + SRB_Rsvd1 : WORD; // Reserved for Alignment + SRB_BufLen : DWORD; // Data Allocation Length + SRB_BufPointer : Pointer; // Data Buffer Pointer + SRB_SenseLen, // Sense Allocation Length + SRB_CDBLen, // CDB Length + SRB_HaStat, // Host Adapter Status + SRB_TargStat : BYTE; // Target Status + SRB_PostProc, // Post routine + SRB_Rsvd2 : Pointer; // Reserved + SRB_Rsvd3, // Reserved for alignment + CDBByte : array[0..15] of byte; // SCSI CDB + SenseArea : array[0..SENSE_LEN + 1] of byte; // Request Sense buffer + end; + + TSRB_ExecSCSICmd = SRB_ExecSCSICmd; + PSRB_ExecSCSICmd = ^SRB_ExecSCSICmd; + + +{ --------------------------------------------------------------------- + SRB - ABORT AN SRB - SC_ABORT_SRB + ---------------------------------------------------------------------} + + SRB_Abort = record + SRB_Cmd, // ASPI command code = SC_EXEC_SCSI_CMD + SRB_Status, // ASPI command status byte + SRB_HaId, // ASPI host adapter number + SRB_Flags : BYTE; // Reserved + SRB_Hdr_Rsvd : DWORD; // Reserved + SRB_ToAbort : Pointer; // Pointer to SRB to abort + end; + + TSRB_Abort = SRB_Abort; + PSRB_Abort = ^SRB_Abort; + +{ --------------------------------------------------------------------- + SRB - BUS DEVICE RESET - SC_RESET_DEV + ---------------------------------------------------------------------} + + SRB_BusDeviceReset = record + SRB_Cmd, // ASPI command code = SC_EXEC_SCSI_CMD + SRB_Status, // ASPI command status byte + SRB_HaId, // ASPI host adapter number + SRB_Flags : BYTE; // Reserved + SRB_Hdr_Rsvd : DWORD; // Reserved + SRB_Target, // Target's SCSI ID + SRB_Lun : BYTE; // Target's LUN number + SRB_Rsvd1 : array[0..11] of byte; // Reserved for Alignment + SRB_HaStat, // Host Adapter Status + SRB_TargStat : BYTE; // Target Status + SRB_PostProc, // Post routine + SRB_Rsvd2 : Pointer; // Reserved + SRB_Rsvd3, // Reserved + CDBByte : array[0..15] of byte; // SCSI CDB + end; + + TSRB_BusDeviceReset = SRB_BusDeviceReset; + PSRB_BusDeviceReset = ^SRB_BusDeviceReset; + +{ --------------------------------------------------------------------- + SRB - GET DISK INFORMATION - SC_GET_DISK_INFO + ---------------------------------------------------------------------} + + SRB_GetDiskInfo = record + SRB_Cmd, // ASPI command code = SC_EXEC_SCSI_CMD + SRB_Status, // ASPI command status byte + SRB_HaId, // ASPI host adapter number + SRB_Flags : BYTE; // Reserved + SRB_Hdr_Rsvd : DWORD; // Reserved + SRB_Target, // Target's SCSI ID + SRB_Lun, // Target's LUN number + SRB_DriveFlags, // Driver flags + SRB_Int13HDriveInfo, // Host Adapter Status + SRB_Heads, // Preferred number of heads translation + SRB_Sectors : BYTE; // Preferred number of sectors translation + SRB_Rsvd1 : array[0..9] of byte; // Reserved + end; + + TSRB_GetDiskInfo = SRB_GetDiskInfo; + PSRB_GetDiskInfo = ^SRB_GetDiskInfo; + +type + TSendASPI32Command = function( LPSRB : Pointer ) : DWORD; cdecl; + TGetASPI32SupportInfo = function : DWORD; cdecl; + +Const + SendASPI32Command : TSendASPI32Command = nil; + GetASPI32SupportInfo : TGetASPI32SupportInfo = nil; + +Function ASPILoaded : Boolean; +Procedure CheckASPI; +procedure UnloadASPI; + +implementation + +const + HWNASPI : THandle = 0; + WNASPI : pchar = 'wnaspi32.dll'; + +Function ASPILoaded : Boolean; + +begin + Result:=HWNASPI<>0; +end; + +Procedure CheckASPI; + +begin + HWNASPI:=LoadLibrary(WNASPI); + if (HWNASPI<>0) then + begin + SendASPI32Command:=TSendASPI32Command(GetProcAddress(HWNASPI,'SendASPI32Command')); + GetASPI32SupportInfo:=TGetASPI32SupportInfo(GetProcAddress(HWNASPI,'GetASPI32SupportInfo')); + end +end; + +procedure UnloadASPI; + +begin + if (HWNASPI<>0) then + begin + FreeLibrary(HWNASPI); + HWNASPI:=0; + SendASPI32Command:=nil; + GetASPI32SupportInfo:=nil; + end; +end; + +initialization + CheckAspi; + +finalization + UnloadASPI; +end. |
