.z80
cseg
;       Version    2.0 / gh87

;Dieses Programm "patcht" die CP/M Plus Systemdatei

;Fuer Besitzer von 3 Laufwerken, oder 80 Track Drives wurden
;die BIOS-Patches aus dem Artikel von Holger Merk "CPC ruft Lauf-
;werk C:" (c't 6/87) uebernommen. Im Listing sind diese Aende-
;rungen mit einem "*" markiert.

;Fuer die einzelnen Laufwerke muessen die DPB's am Ende des
;Listings angepasst werden: dpb_b fuer Drive B:, dpb_fd3 fuer's
;dritte Laufwerk.

;Floppy Parameter
;---------------------------------------------------------------------
bigdrives    equ    1			;80 Track Laufwerke B: (und 3. Laufw.)
floppy3	     equ    1			;3 Floppies am CPC

;nur wichtig, wenn bigdrives <> 0:
fd3drv       equ   'C'			;3. Floppy log. Bezeichnung
Step_B       equ    4			;Steprate B:
Step_C       equ    8			;Steprate vom 3. Laufwerk (hier C:)

;RAM Disk Parameter
;---------------------------------------------------------------------
rddrv        equ   'M'			;logische Drive Bezeichnung
tracks       equ   23			;Anzahl der Spuren (Baenke),
								;Kapazitaet=tracks*16 KB
track0       equ    8			;CP/M Bank Nr. des 1. Tracks
sector0      equ    4000h		;Adresse des 1. Sektors
dirblks      equ    2			;Anzahl der Directory-Bloecke
al0	     equ    11000000b		;Position der Dir-Bloecke auf der Disk
al1	     equ    00000000b

rddirb       equ    9000h		;RAM Disk Directory-Puffer Adresse
rddirs       equ    20			;und Laenge in Sektoren

;Puffer Parameter
;---------------------------------------------------------------------
fdsecsz      equ    512			;Floppy Sektorengroesse
fddirb       equ    9a00h		;Floppy Directory-Puffer Adresse
fddirs       equ    8			;und Laenge

fdbnk1      equ    2			;Floppy Datenpuffer 1. Bank
fdatb1      equ    5480h		;Adresse
fdats1      equ    21			;und Laenge

fdbnk2      equ    7			;Floppy Datenpuffer 2. Bank
fdatb2      equ    4000h		;Adresse
fdats2      equ    32			;und Laenge

fdbnk3      equ    0			;Floppy Datenpuffer 3. Bank
fdatb3      equ    0000h		;Adresse
fdats3      equ    00			;und Laenge

;BIOS Variablen / Vektoren:
;---------------------------------------------------------------------
bios		 equ	0FC00h		;Adresse der BIOS Sprungleiste
selbnk		 equ	bios+3*27	;F 27: Bank selektieren
xmove		 equ 	bios+3*29	;F 29: extended move
bmove		 equ	0FCCBh		;F 25: Move (nicht ueber SySTEM Call)
system		 equ	0FD1Ch		;Amstrad Call System Vektor
adrv		 equ	0BEF0h		;abs. Laufwerknr.
usr1scb		 equ	0FBA2h		;Byte 6 im SCB (A: intern o. extern)
usr2scb		 equ	0FBA3h		;Byte 7 im SCB (Schriftart bei invers :
					;                  0 : schmal
					;		   1 : invertiert
wrchar		 equ	0BDD4h          ;Vektor TXT Write CHAR
stmap		 equ	0BDF5h		;Vektor KM Update Key State
trk		 equ	0BEF2h		;Spurnr.
sec		 equ	0BEF4h		;Sektornr.
dma		 equ	0BEF6h		;DMA Adresse
dmabnk		 equ	0BEF9h		;DMA Bank
sendmsg		 equ	00572h		;BIOS Einschaltmeldung ausgeben

;Zusaetzliche Parameter
;---------------------------------------------------------------------
unitC		equ		3

B_Login		equ		00h
C_Login		equ		00h

dpb_A		equ		0FF64h
dpb_R		equ		0FF7Fh

DefDrv		equ		(rddrv-'A')
Suchpfad	equ		1
Tempfile	equ		1
Submit		equ		1
	
;Parameter des Installationsprogramms
;---------------------------------------------------------------------
ramdsk		 equ	6c00h		;Adr des RAM-Disk-Treibers im SYS-File
boot		 equ	0			;CP/M warm
bdos		 equ	5			;BDOS
fcb1		 equ	5ch			;File Control Block 1
lf			 equ	10			;ASCII Konstanten:
cr			 equ	13

patch macro ident				;ein Makro zum Patchen des SYS-Files
	 	ld 		hl,ident&src
		ld		de,ident&dst
		ld		bc,ident&end-ident&src
		ldir
		endm

;RAM Disk Installationsprogramm:
;---------------------------------------------------------------------
instal:	
		ld		(oldsp),sp		;Stack einrichten
		ld		sp,stack
		ld 		de,hallo		;Begruessung
		call	print
		call	open			;System-File oeffnen
		call	sysread			;lesen
		call	sysptch			;patchen
		call 	open
		call	syswrte			;schreiben
		call	close			;und dann schliessen

exit:
		ld		sp,(oldsp)		;Stack restaurieren
		jp		boot			;und fertig ...

sysread:						;System-File an die Adr c00h einlesen:
		ld		de,0c00h		;also DMA auf c00h setzen
		call	setdma
		ld		e,128			;die ersten 128 Records
		call	multis			;lesen
		xor		a
		ld		(fcb1+32),a		;Current Record = 0
		call	readsq
		ld		de,0c00h+128*128
		call	setdma			;dann die restlichen 72
		ld		e,72
		call	multis
		jp		readsq

syswrte:						;gepatchtes System-File speichern:
		ld		de,0c00h		;DMA = c00h
		call	setdma
		ld		e,128			;zuerst 128 Records
		call 	multis
		xor		a
		ld		(fcb1+32),a		;Current Record = 0
		call	writesq			;schreiben
		ld		de,0c00h+128*128
		call	setdma			;dann den Rest
		ld		e,72
		call	multis
		jp		writesq

sysptch:						;System-File patchen
		patch	lodr			;CP/M Plus Loader
		patch	dtrd			;RAM Disk ins Drive Table
		patch	seld			;Select Disc
		patch	rdc				;RAM Disc Controller
		patch 	buffr			;BCBs
		patch 	mesg			;Einschaltmeldung ...

	if  bigdrives
		patch	ptch1			;2. Head Check
		patch	ptch2			;Seek Track
	endif

	if	floppy3
		patch	dtfd3			;Floppy3 ins Drive Table
	endif
		patch	ptc4
		patch	ptc5

if unitC EQ 1
		patch	ptc6
endif

		patch	ptc7

if Suchpfad
		patch	ptc8
endif

if Tempfile
		patch	ptc9
endif

if Submit
		patch	ptcS
endif
	
		ret

;BDOS Funktionsaufrufe
;---------------------------------------------------------------------
print:
		ld		c,9				;Print String
		jp		bdos

open:
		ld		de,fcb1			;Open File
		xor		a
		ld 		(fcb1+12),a		;extent = 0
		ld 		c,15
		jp		exec

close:
		ld		de,fcb1			;Close File
		ld 		c,16
		jp		exec

readsq:
		ld		de,fcb1			;Read Sequential
		ld 		c,20
		jp		exec

writesq:
		ld		de,fcb1			;Write Sequential
		ld		c,21
exec:
		call	bdos
		or		a
		jp		nz,exit			;bei Error raus
		ret

setdma:
		ld		c,26			;Set DMA Adress
		jp		bdos

multis:
		ld		c,44			;Set Multi-Sector Count
		jp		bdos

hallo:  db	   	cr,lf,'RAM Disc Installer V 2.0/ gh 87',cr,lf,lf
		db		'RAM disc drive: ',rddrv,':',cr,lf,lf,'$'

oldsp:							;Stackbereich
		ds		64
stack:

;CP/M 3 System File Patches
;---------------------------------------------------------------------
lodrsrc:						;die CPC Versions-Pruefroutine
lodrdst		equ		0cd5h		;muss dem RAM Disc Loader Platz machen
		.phase		lodrdst
		ld		hl,ramdsk		;Der RAM Disc Controller wird an die
		ld		de,0aa00h		;Adr. AA00h geschoben ...
		ld		bc,rdcend-rdcsrc
		ldir
		ret
		.dephase
lodrend:

dtrddst		aset	262fh+2*(rddrv-'A')		;RAM Disc DPH ins
dtrdsrc:						;Drive-Table eintragen
		dw		dph_rd
dtrdend:

	if floppy3
											;wenn vorhanden
dtfd3dst	aset	262fh+2*(fd3drv-'A')	;Floppy 3 ins DPH eintragen
dtfd3src:
		dw		dph_fd3
dtfd3end:

	endif

	if bigdrives

ptch1dst	aset	1a1ah		;Patch in der Resultphasen-
ptch1src:						;auswertung
		call	TwoInOne
ptch1end:


ptch2dst	aset	18c7h		;Patch in der Seek-Track
ptch2src:						;Routine
		jp		Steprate
ptch2end:

	endif


selddst		aset	3057h
seldsrc:						;SelDisc umbiegen
		call	seldsk
seldend:

buffrdst	aset	0e5ah		;Init BCB umbiegen
buffrsrc:
		.phase	buffrdst
		jp		initbuf
		.dephase
buffrend:

mesgsrc:						;Zusatz bei der Einschaltmeldung
mesgdst		equ	1d5fh			;als 31. Eintrag in der Message-Tabelle
		db		'RAM disc drive '
		db		0fdh,' '		;FDh= Inh. von Reg C ausgeben (DriveNr)
		db		0f9h,' KB'		;F9h= Inh. con DE ausgeben (Kapazitaet)
		db		cr,lf,lf,0ffh
mesgend:

ptc4src:
ptc4dst		equ		190Ch
.phase		0C4Ch
		ld		de,2Eh
		and		0F0h
		rrca
		rrca
		rrca
		cp		8
		jr		nz,ptchA1
		ld		a,1

;-->

		ld		de,2Ch
		ld		h,a
		ld		a,8
		dec		h
		jr		z,ptchA1
		ld		a,2*0Ch
		ld		e,2Eh
ptchA1: call	GetDPB
		ld		a,h
		or		l
		jr		z,0C7Fh

.dephase
ptc4end:

ptc5src:
ptc5dst		equ		02ec3h
		defw		dpb_A
		defw		0BF7Ah
		defw		B_Alloc
ptc5end:

ptc6src:
ptc6dst		equ		2F55h
		dec		a
ptc6end:

;
ptc7src:
ptc7dst		equ		28DAh
		defb		DefDrv
ptc7end:

ptc8src:
ptc8dst		equ		28E8h
		defb		DefDrv+1
		defb		0
		defb		1,2
ptc8end:

ptc9src:
ptc9dst		equ		28ECh
		defb		DefDrv+1
ptc9end:

ptcSsrc:
ptcSdst		equ		28B4h
		defb		Submit*8
ptcSend:

;RAM Disk
;---------------------------------------------------------------------
rdcsrc:
rdcdst		aset	ramdsk
		.phase	0aa00h

read00:  defw	LAST


read:							;Sektor lesen
		call	gettrk			;Spurnummer holen und
		call	xmove			;bankuebergreifendes Kopieren vorber.
		call	getsec			;Basisadr. aus der Sektornr. berechnen
		call	bmove			;und Sektor kopieren ...
		xor		a				;A = 0 d.h. alles O.K.
		ret

write:							;Sektor Schreiben:
		call 	gettrk
		ld		a,c
		ld		c,b
		ld		b,a
		call	xmove
		call	getsec
		ex		de,hl
		call	bmove
		xor		a
		ret

login:
		ex		de,hl
		ld		a,(bootflg)
		or		a
		ret		z
		xor		a
		ld		(bootflg),a
		push	hl
		push	de
		push	bc
		ld		a,track0
		call	selbnk
		ld		hl,sector0+1
		ld		b,8

checkd:	ld		a,(hl)
		cp		' '
		jr		z,nxtchk
		cp		'0'
		jr		c,newdir
		cp		'9'+1
		jr		c,nxtchk
		cp		'A'
		jr		c,newdir
		cp		'Z'+1
		jr		nc,newdir
nxtchk: inc		hl
		djnz	checkd
		jr		exlogn

newdir:
		ld		hl,sector0
		ld		d,h
		ld		e,l
		inc		de
		ld		bc,dirblks*2048
		ld		(hl),0e5h
		ldir

exlogn:
		xor		a
		call	selbnk
		pop		bc
		pop		de
		pop		hl
		ret

gettrk:

		ld		a,(trk)
		add		a,track0
		ld		c,a
		ld		a,(dmabnk)
		ld		b,a
		ret

getsec:
		ld		hl,(sec-1)
		ld		l,0
		srl		h
		rr		l
		ld		de,sector0
		add		hl,de
		ex		de,hl
		ld		hl,(dma)
		ld		bc,80h
		ret


;BIOS Aenderungen
;---------------------------------------------------------------------

seldsk:
rout:	ld		(merke),a
		ld		a,(usr1scb)
		or		a
		jr		z,l3
		ld		a,(merke)
		jr		l2	
l3:		ld		a,(merke)
		or		a				; ist Laufwerk A: ?
		jr		nz,l1			; wenn nein, Sprung nach l1
		ld		a,1				; wenn ja, => Laufwerk wird B:
		jr		l2				; zurueck zum BIOS
l1:		ld		a,(merke)		; Selektiertes Laufwerk
		cp		01				; ist Laufwerk B: ?
		jr		nz,l2			; wenn nein, zurueck zum BIOS
		ld		a,0				; wenn ja, => Laufwerk bird A:
l2:		
		ld		(adrv),a
		ld		hl,dpbidnt
		cp		(hl)
		ret		z
		cp		3
		ret		nc
		push	bc
		push	de
		push	af
		ld		e,a
		ld		a,(hl)
		ld		(hl),e
		call	swapDPB

		ld		a,(dpbidnt)
		call	swapDPB
		pop		af
		pop		de
		pop		bc
		ret

swapDPB:
		or		a
		ret		z
		ld		hl,DPB_B
		cp		1
		jr		z,swap1
           if floppy3
		ld		hl,dpb_fd3
    	   endif
swap1:
		ld		de,dpb_A
		ld		bc,27
swap2:	ld		a,(de)
		ldi
		dec		hl
		ld		(hl),a
		inc		hl
		jp		pe,swap2
		ret
initbuf:
		ld		bc,rddirs*256
		ld		de,rddirb
		ld		hl,8a00h
		ld		a,1
		ld		(dirbcbv),hl
		call	initbcb
		dec		hl
		ld		(hl),b
		dec		hl
		ld		(hl),b
		inc		hl
		inc		hl

		ld		bc,fddirs*256
		ld		de,fddirb
		ld		a,fdsecsz/80h
		push	hl
		call	initbcb
		dec		hl
		ld		(hl),b
		dec		hl
		ld		(hl),b
		inc		hl
		inc		hl

		push	hl
		ld		bc,fdats1*256+fdbnk1
		ld		de,fdatb1
		call	initbcb
		ld		bc,fdats2*256+fdbnk2
		ld		de,fdatb2
		call	initbcb
		ld		bc,fdats3*256+fdbnk3
		ld	 	de,fdatb3
		call	initbcb
		dec		hl
		ld		(hl),b
		dec		hl
		ld		(hl),b

		ld		hl,bcbpars
		ld		de,0ffe8h
		ld		bc,bcbpend-bcbpars
		ldir
		call	initmsg
		ld		de,scrn
		ld		(wrchar),de
		ld		de,caps
		ld		(stmap),de
		ld		de,dpb_R
		ld		hl,dpb_rd
		ld		bc,27
		ldir
	
	if bigdrives
		ld		a,255
		ld		(0be40h),a
		ld		a,1
		ld		(3fb5h),a
	endif

		pop		hl
		pop		de
		ret

initbcb:
;
;
;
;

		inc		b
		dec		b
		ret		z
		push	hl
		ld		h,a
		srl		h
		ld		l,0
		rr		l
		ex		(sp),hl
		
bcbloop:
		push	de
		ld		(hl),0ffh
		ld		de,0fh
		add		hl,de
		ld		d,h
		ld		e,l
		dec		hl
		ld		(hl),d
		dec		hl
		ld		(hl),e
		dec		hl
		ld		(hl),c
		ex		de,hl
		ex		(sp),hl
		ex		de,hl
		dec		hl
		ld		(hl),d
		dec		hl
		ld		(hl),e
		pop		hl
		ex		(sp),hl
		ex		de,hl
		add		hl,de
		ex		de,hl
		ex		(sp),hl
		djnz	bcbloop
		inc		sp
		inc		sp
		ret

	if bigdrives

TwoInOne:
		ld		a,c
		res		2,a
		or		20h
		ret

Steprate:
		add		iy,bc
		push	hl
		srl		c
		ld		hl,Steptab
		add		hl,bc
		ld		a,(hl)
		ld		hl,0b0f1h
		cp		(hl)
		jr		z,stimmt
		ld		(hl),a
		ld		hl,0ad5h
		call	0af2h
stimmt:
		pop		hl
		pop		bc
		ret

Steptab:
		db		12
		db		Step_B
		db		0
		db		Step_C

	endif

initmsg:
		ld		c,rddrv-'A'
		ld		de,tracks*16
		ld		a,31
		jp		sendmsg

bcbpars:
		db		0
		dw		fddirb
		dw		2469h

		db		fdbnk1
		dw		fdatb1
		dw		2f80h
		db		0ffh
bcbpend:

;XDPHs und DPHs
;---------------------------------------------------------------------

;RAM Disk:
merke:		db		0
xdph_rd:
		dw		write
		dw		read
		dw		login
		dw		0

		db		2
		db		0

dph_rd:
		dw		0
		db		0,0,0
		db		0,0,0
		db		0,0,0
		db		0
		dw		0ff7fh
		dw		0
		dw		alv_rd
		dw		dirbcbv
		dw		datbcv
		dw		05280h
		db		2

dpb_rd:
		dw		128
		db		4
		db		15
		db		0
		dw		tracks*8-1
		dw		dirblks*64-1
		db		al0,al1
		dw		0
		dw		0
		db		0
		db		0

		db		0,0,0,0,0,0,0,0,0
		defb	0FFh

;*************************************
;*   Multi Login      Murphy 1987    *
;*************************************

GetDPB:
		add		a,Low DPBTab
		ld		l,a
		ld		h,High DPBTab
		jr		nc,$+3
		inc		h
		jp		03FE0h

DPBTab:

		defw	Form01
		defw	Form11
		defw	Form21
		defw	Form31
		defw	0C0Bh
		defw	0
		defw	0
		defw	0
		defw	Form81
		defw	0
		defw	0
		defw	0
		defw	0C25h
		defw	0
		defw	FormE0
		defw	0

;; Macros zur Berechnung der DPB's

log2	Macro	arglog
;--------------------------------------------------
		ans		aset	0
		log		aset	arglog
		rept 100
		  log aset	log shr 1
		  if log EQ 0
			 exitm
		  endif
		  ans aset  ans + 1
		endm
		endm


DPB		Macro	dpbnr
;-------------------------------------------------------------
; Erzeugt einen DPB aus den bekannten Groessen mit definierten
; Labels, denen &dpbnr angehaengt wird
;-------------------------------------------------------------

		frpb&dpbnr	equ	flen&dpbnr * fspb&dpbnr / 128

		defw	flen&dpbnr * fspt&dpbnr / 128

		log2	frpb&dpbnr
		defb	ans

		defb	frpb&dpbnr-1
		defb	fspb&dpbnr * flen&dpbnr / 1024 - 1

		defw	(fhds&dpbnr*ftrk&dpbnr-offs&dpbnr)*fspt&dpbnr/fspb&dpbnr-1

		defw	fdir&dpbnr - 1

		count	aset	fdir&dpbnr / (frpb&dpbnr * 4)
		alloc	aset	0
		rept	count
		   alloc   aset   80h + alloc / 2
		endm
		defw	alloc

		defw	fdir&dpbnr / 4

		defw	offs&dpbnr

		log2	(flen&dpbnr/128)
		defb	ans

		defb	(flen&dpbnr/128) - 1


		defb	fhds&dpbnr - 1
		defb	ftrk&dpbnr
		defb	fspt&dpbnr
		defb	fsk1&dpbnr
		defw	200h
		defb	gap3&dpbnr / 2
		defb	gap3&dpbnr
		defb	dens&dpbnr
		endm


; Bildschirm-Beschleunigungs-Routine
; ==================================
scrn:	push	hl
		ld		e,a
		ld		hl,08000h
		ld		d,0
		ex		de,hl
		add		hl,hl
		add		hl,hl
		add		hl,hl
		add		hl,de
		ex		de,hl
		pop		hl
		push	de
		ld		e,h
		ld		d,0
		push	de
		ld		h,d
		ld		e,l
		add		hl,hl
		add		hl,hl
		add		hl,de
		add		hl,hl
		add		hl,hl
		add		hl,hl
		add		hl,hl
		pop		de
		add		hl,de
		ld		de,(0b7c4h)
		add		hl,de
		ld		a,h
		and		07
		ld		h,a
		ld		a,(0b7c6h)
		add		a,h
		ld		h,a
		ld		a,(0b730h)
		ld		c,a
		or		a
		jr		nz,inv
		ld		b,8
		pop		de
loop:	ld		a,(de)
		ld		(hl),a
		ld		a,h
		add		a,8
		ld		h,a
		inc		e
		djnz	loop
		ret
inv:	ld		a,(usr2scb)
		and		a
		jr		nz,invers
		ld		b,8
		pop		de
schmal:	ld		a,(de)
		ex		de,hl
		srl		a
		and		(hl)
		ex		de,hl
		ld		(hl),a
		ld		a,h
		add		a,8
		ld		h,a
		inc		e
		djnz	schmal
		ret
invers:	ld		b,8
		pop		de
i1:		ld		a,(de)
		xor		c
		ld		(hl),a
		ld		a,h
		add		a,8
		ld		h,a
		inc		e
		djnz	i1
		ret
; CAPS LOCK Routine
; Gibt Border eine hellere Toenung
; wenn CAPS LOCK Flag gesetzt ist
; ================================
caps:		ld		a,(0b632h)
		or		4
		cp		4
		jr		z,sprng1
		ld		a,24
sprng1:		ld		(0b7d4h),a
		ld		(0b7e5h),a
		ld		a,0ffh
		ld		(0fff3h),a
		jp		01d40h
scrnend:

;------------------------------------------------------------
; Tabelle der verfuegbaren Formate; Basissektoren muessen mit
; der Stellung in DPBTab korespondieren
;------------------------------------------------------------

Form01:  ;Vortex

		ftrk_0		equ		80
		offs_0		equ		2
		fhds_0		equ		2
		flen_0		equ		512
		fspt_0		equ		9
		fspb_0		equ		8
		fsk1_0		equ		01h
		gap3_0		equ		052h
		dens_0		equ		060h
		fdir_0		equ		128
		DPB			_0

Form11:  ;11/10!/0 - Hw   800k Format mit 512 Byte Sektoren

		ftrk_1		equ		160
		offs_1		equ		0
		fhds_1		equ		1
		flen_1		equ		512
		fspt_1		equ		10
		fspb_1		equ		8
		fsk1_1		equ		011h
		gap3_1		equ		020h
		dens_1		equ		060h
		fdir_1		equ		128
		DPB			_1

Form21:  ;21/10/0 - 83    828k Format mit 512 Byte Sektoren

		ftrk_2		equ		83
		offs_2		equ		0
		fhds_2		equ		2
		flen_2		equ		512
		fspt_2		equ		10
		fspb_2		equ		8
		fsk1_2		equ		021h
		gap3_2		equ		020h
		dens_2		equ		060h
		fdir_2		equ		128
		DPB			_2

Form31:  ;31/9/0 - Hardware Stepteilung

		ftrk_3		equ		160
		offs_3		equ		0
		fhds_3		equ		1
		flen_3		equ		512
		fspt_3		equ		9
		fspb_3		equ		8
		fsk1_3		equ		031h
		gap3_3		equ		052h
		dens_3		equ		060h
		fdir_3		equ		128
		DPB			_3

Form81:  ;81/9/0*2

		ftrk_8		equ		80
		offs_8		equ		0
		fhds_8		equ		2
		flen_8		equ		512
		fspt_8		equ		9
		fspb_8		equ		8
		fsk1_8		equ		081h
		gap3_8		equ		052h
		dens_8		equ		060h
		fdir_8		equ		128
		DPB			_8

FormE0:  ;E0/10/0 - 828k Format mit 512 Byte Sektoren

		ftrk_E		equ		83
		offs_E		equ		0
		fhds_E		equ		2
		flen_E		equ		512
		fspt_E		equ		10
		fspb_E		equ		8
		fsk1_E		equ		0E0h
		gap3_E		equ		020h
		dens_E		equ		060h
		fdir_E		equ		128
		DPB			_E

dirbcbv:
		dw		0
datbcv:
		dw		datbcb

datbcb:
		db		0ffh
		ds		3
		db		0
		db		0
		dw		0
		dw		0
		dw		datbuf
		db		0
		dw		0

	if floppy3

;3. Laufwerk
xdph_fd3:
		dw		03f1ch
		dw		03f17h
		dw		03ed6h
		dw		03ecbh
		db		UnitC
		db		0
dph_fd3:
		dw		0
		db		0,0,0,0,0,0,0,0,0

		db		0
		defw	dpb_A
		dw		csv_fd3
		dw		alv_fd3
		dw		0befbh
		dw		0befdh
		dw		5080h
		db		2


dpb_fd3:
		DPB	_8				;
		db		C_Login

        endif

;Drive B:
dpb_B:
		DPB	_0
		db		B_Login


dpbidnt:
		db		0
bootflg:
		db		0ffh
	Filemax::

;
;

alv_rd:
		ds		(tracks*8-1)/4+2	;
B_Alloc:
		defs	66					;
datbuf:
		ds		128

if floppy3
csv_fd3:ds		33					;

alv_fd3:ds		66					;
endif

LAST::

Grenze		equ		Read00 + 400h	;
public Grenze
		
		.dephase

rdcend:

 	end


	al