WriteProtFlags:		;d0=ProtFlags
	move.l	d1,-(a7)
	move.l	d0,d1
	moveq	#'h',d0
	bsr.s	WriteProtFlags3
	moveq	#'s',d0
	bsr.s	WriteProtFlags3
	moveq	#'p',d0
	bsr.s	WriteProtFlags3
	moveq	#'a',d0
	bsr.s	WriteProtFlags3
	moveq	#'r',d0
	bsr.s	WriteProtFlags1
	moveq	#'w',d0
	bsr.s	WriteProtFlags1
	moveq	#'e',d0
	bsr.s	WriteProtFlags1
	moveq	#'d',d0
	bsr.s	WriteProtFlags1
	move.l	(a7)+,d1
	rts
WriteProtFlags1:
	btst	#7,d1
	beq.s	WriteProtFlags2
	moveq	#'-',d0
WriteProtFlags2:
	jsr	_WriteChar(a6)
	add.l	d1,d1
	rts
WriteProtFlags3:
	btst	#7,d1
	bne.s	WriteProtFlags2
	moveq	#'-',d0
	bra.s	WriteProtFlags2

ConvertTime:		;d0=Min,d1=Seconds*50
			;d0out=Hours,d1out=Min,d2out=Secs
	divu	#50,d1
	move.l	d1,d2
	ext.l	d2
	divu	#60,d0
	move.l	d0,d1
	swap	d1
	ext.l	d1
	ext.l	d0
	rts

ConvertTimeII:		;d0=Hours,d1=Min,d2=Secs
			;d0out=Min,d1out=Seconds*50
	mulu	#60,d0
	add.l	d1,d0
	move.l	d2,d1
	mulu	#50,d1
	rts

AttachDate:
	movem.l	d1/d2/a0,-(a7)
	move.l	d0,a0
	bsr	ReadTODDate
	bsr	ConvertDateII
	move.l	d0,$1a4(a0)	;Days since 01-01-1978
	bsr	ReadTODTime
	bsr	ConvertTimeII
	move.l	d0,$1a8(a0)	;Min+Hours*60
	move.l	d1,$1ac(a0)	;Secs*50
	movem.l	(a7)+,d1/d2/a0
	rts

ConvertDate:		;d0=Days since 01-01-1978
			;d0out=Day,d1out=Month,d2out=Year
	movem.l	d3/d4/a0,-(a7)
	and.l	#$000fffff,d0
	moveq	#$00,d3
	move.l	#1978,d2	;Year
	lea	Datecodes1(pc),a0
ConvertDate1:
	moveq	#$01,d1
ConvertDate2:
	move.b	-1(a0,d1.w),d3
	cmp.b	#28,d3
	bne.s	ConvertDate3
	move.w	d2,d4
	and.w	#$0003,d4
	bne.s	ConvertDate3
	addq.w	#1,d3		;29 days in Feb each 4th year
ConvertDate3:
	cmp.l	d0,d3
	bhi.s	ConvertDate4
	sub.l	d3,d0
	addq.w	#1,d1
	cmp.w	#13,d1
	bne.s	ConvertDate2
	addq.w	#1,d2
	bra.s	ConvertDate1
ConvertDate4:
	addq.w	#1,d0
	movem.l	(a7)+,d3/d4/a0
	rts

ConvertDateII:		;d0=Day,d1=Month,d2=Year
			;d0out=Days since 01-01-1978
	movem.l	d3/d4/a0,-(a7)
	and.l	#$000000ff,d0
	moveq	#$00,d3
	lea	Datecodes1(pc),a0
	subq.l	#1,d0
ConvertDateII1:
	cmp.w	#1978,d2
	bne.s	ConvertDateII2
	cmp.w	#1,d1
	beq.s	ConvertDateII4
ConvertDateII2:
	subq.w	#1,d1
	bne.s	ConvertDateII2a
	moveq	#12,d1
	subq.w	#1,d2
ConvertDateII2a:
	move.b	-1(a0,d1.w),d3
	cmp.b	#28,d3
	bne.s	ConvertDateII3
	move.w	d2,d4
	and.w	#$0003,d4
	bne.s	ConvertDateII3
	addq.w	#1,d3		;29 days in Feb each 4th year
ConvertDateII3:
	add.l	d3,d0
	bra.s	ConvertDateII1
ConvertDateII4:
	movem.l	(a7)+,d3/d4/a0
	rts

ReadBlocks:		;a0=address for blocks , d0=blocknr 0-1760
			;d1=number of blocks
	movem.l	d1-d7/a0-a6,-(a7)
	move.l	d1,d7
	subq.l	#1,d7
	bra.s	ReadBlock1
ReadBlock:		;a0=address for block , d0=blocknr 0-1760
	movem.l	d1-d7/a0-a6,-(a7)
	moveq	#$00,d7
ReadBlock1:
	ext.l	d0
	move.l	d0,d6
	move.w	#$01ff,d1
	move.b	$11c(a6),d2
	cmp.b	$11d(a6),d2
	bne.s	ReadBlock2
	cmp.w	$11e(a6),d0
	bne.s	ReadBlock2
	move.l	$7e(a6),a1
	bra.s	ReadBlock5
ReadBlock2:
	divu	#11,d0
	move.w	d0,d4		;d4=tracknr 0-159
	swap	d0
	move.w	d0,d5		;d5=sectornr 0-10
	move.b	$11c(a6),d0
	cmp.b	$124(a6),d0
	bne.s	ReadBlock3
	cmp.b	$125(a6),d4
	beq.s	ReadBlock4
ReadBlock3:
	bsr	WriteLastTrack
	move.w	d4,d0
	cmp.w	#$009f,d0
	bhi	ReadBlock10
	bsr	ReadTrack
ReadBlock4:
	ext.w	d5
	ext.l	d5
	lsl.w	#8,d5
	add.w	d5,d5
	move.l	$120(a6),a1
	add.l	d5,a1
ReadBlock5:
	cmp.l	#$00dfffff,a0
	bhi.s	ReadBlock7		;>$e00000
	cmp.l	#$00dfedff,a0	
	bhi	ReadBlock8
	cmp.l	#$00bfffff,a0		;>$c00000
	bhi.s	ReadBlock7
	cmp.l	#$00bfcdff,a0
	bhi	ReadBlock8
	cmp.l	#$000053ff,a0		;>$5400
	bhi.s	ReadBlock7
	cmp.l	#$000051ff,a0
	bhi	ReadBlock8
	add.l	$86(a6),a0		;<$5400
ReadBlock6:
	move.l	a0,d0
	btst	#0,d0
	bne.s	ReadBlock6b
	moveq	#$0f,d1
ReadBlock6a:
	movem.l	(a1)+,d0/d2/d3/d4/d5/a2/a3/a4
	movem.l	d0/d2/d3/d4/d5/a2/a3/a4,(a0)
	lea	$0020(a0),a0
	dbf	d1,ReadBlock6a
	sub.l	$86(a6),a0
	bra.s	ReadBlock10
ReadBlock6b:
	move.b	(a1)+,(a0)+
	dbf	d1,ReadBlock6b
	sub.l	$86(a6),a0
	bra.s	ReadBlock10
ReadBlock7:				;Ordinary Mem
	move.l	a0,d0
	btst	#0,d0
	bne.s	ReadBlock7b
	moveq	#$0f,d1
ReadBlock7a:
	movem.l	(a1)+,d0/d2/d3/d4/d5/a2/a3/a4
	movem.l	d0/d2/d3/d4/d5/a2/a3/a4,(a0)
	lea	$0020(a0),a0
	dbf	d1,ReadBlock7a
	bra.s	ReadBlock10
ReadBlock7b:
	move.b	(a1)+,(a0)+
	dbf	d1,ReadBlock7b
	bra.s	ReadBlock10
ReadBlock8:				;Special Ram
	move.b	(a1)+,d0
	jsr	_WriteMemByte(a6)
	dbf	d1,ReadBlock8
ReadBlock10:
	addq.w	#1,d6
	move.l	d6,d0
	subq.w	#1,d7
	bpl	ReadBlock1
	move.l	a0,d0
	movem.l	(a7)+,d1-d7/a0-a6
	rts

WriteBlocks:		;a0=address for blocks , d0=blocknr 0-1760
			;d1=number of blocks
	movem.l	d1-d7/a0-a6,-(a7)
	move.l	d1,d7
	subq.l	#1,d7
	bra.s	WriteBlock1
WriteBlock:		;a0=address for block , d0=blocknr 0-1760
	movem.l	d1-d7/a0-a6,-(a7)
	moveq	#$00,d7
WriteBlock1:
	ext.l	d0
	move.w	#$01ff,d1
WriteBlock2:
	move.l	d0,d6
	divu	#11,d0
	move.w	d0,d4		;d4=tracknr 0-159
	swap	d0
	move.w	d0,d5		;d5=sectornr 0-10
	move.b	$11c(a6),d0
	cmp.b	$124(a6),d0
	bne.s	WriteBlock3
	cmp.b	$125(a6),d4
	beq.s	WriteBlock4
WriteBlock3:
	bsr	WriteLastTrack
	move.w	d4,d0
	cmp.w	#$009f,d0
	bhi	WriteBlock10
	bsr	ReadTrack
WriteBlock4:
	move.w	#$1234,$138(a6)		;Write Track Buffer !
	ext.w	d5
	ext.l	d5
	lsl.w	#8,d5
	add.w	d5,d5
	move.l	$120(a6),a1
	add.l	d5,a1
WriteBlock5:
	cmp.l	#$00dfffff,a0
	bhi.s	WriteBlock7		;>$e00000
	cmp.l	#$00dfedff,a0	
	bhi	WriteBlock8
	cmp.l	#$00bfffff,a0		;>$c00000
	bhi.s	WriteBlock7
	cmp.l	#$00bfcdff,a0
	bhi	WriteBlock8
	cmp.l	#$000053ff,a0		;>$5400
	bhi.s	WriteBlock7
	cmp.l	#$000051ff,a0
	bhi	WriteBlock8
	add.l	$86(a6),a0		;<$5400
WriteBlock6:
	move.l	a0,d0
	btst	#0,d0
	bne.s	WriteBlock6b
	moveq	#$0f,d1
WriteBlock6a:
	movem.l	(a0)+,d0/d2/d3/d4/d5/a2/a3/a4
	movem.l	d0/d2/d3/d4/d5/a2/a3/a4,(a1)
	lea	$0020(a1),a1
	dbf	d1,WriteBlock6a
	sub.l	$86(a6),a0
	bra.s	WriteBlock10
WriteBlock6b:
	move.b	(a0)+,(a1)+
	dbf	d1,WriteBlock6b
	sub.l	$86(a6),a0
	bra.s	WriteBlock10
WriteBlock7:				;Ordinary Mem
	move.l	a0,d0
	btst	#0,d0
	bne.s	WriteBlock7b
	moveq	#$0f,d1
WriteBlock7a:
	movem.l	(a0)+,d0/d2/d3/d4/d5/a2/a3/a4
	movem.l	d0/d2/d3/d4/d5/a2/a3/a4,(a1)
	lea	$0020(a1),a1
	dbf	d1,WriteBlock7a
	bra.s	WriteBlock10
WriteBlock7b:
	move.b	(a0)+,(a1)+
	dbf	d1,WriteBlock7b
	bra.s	WriteBlock10
WriteBlock8:				;Special Ram
	jsr	_ReadMemByte(a6)
	move.b	d0,(a1)+
	dbf	d1,WriteBlock8
WriteBlock10:
	move.b	$11c(a6),d0
	cmp.b	$11d(a6),d0
	bne.s	WriteBlock11
	cmp.w	$11e(a6),d6	;Rootblock ?
	bne.s	WriteBlock11
	move.l	$7e(a6),a0
	lea	$fffffe00(a1),a1
	moveq	#$7f,d0
WriteBlock10a:
	move.l	(a1)+,(a0)+
	dbf	d0,WriteBlock10a
WriteBlock11:
	addq.w	#1,d6
	move.l	d6,d0
	subq.w	#1,d7
	bpl	WriteBlock1
	move.l	a0,d0
	movem.l	(a7)+,d1-d7/a0-a6
	rts

HashName:			;d0=length,a0=filename
	movem.l	d1/d2/a0,-(a7)	;OUT:d0=Hashindex*4
	move.w	d0,d2
HashName1:
	mulu	#13,d0
	moveq	#$00,d1
	move.b	(a0)+,d1
	cmp.b	#$61,d1
	bcs.s	HashName2
	cmp.b	#$7b,d1
	bcc.s	HashName2
	eor.b	#$20,d1
HashName2:
	add.w	d1,d0
	and.w	#$07ff,d0
	subq.w	#1,d2
	bne.s	HashName1
	divu	#72,d0
	clr.w	d0
	swap	d0
	add.l	d0,d0
	add.l	d0,d0
	movem.l	(a7)+,a0/d1/d2
	rts

SearchHash:			;a0=HashName,a4=Diskbuffert
				;d0=HashLength
	movem.l	d1-d3/a0-a2,-(a7)
	move.l	a0,a2
	move.l	d0,d3
	beq	SearchHash7	;No Length
	bsr	HashName
	move.w	$6(a4),$13a(a6)
	cmp.l	#$00000001,$1fc(a4)
	bne.s	SearchHash0
	move.w	#$0370,$13a(a6)
SearchHash0:
	move.w	d0,$13c(a6)
	add.w	#$0018,$13c(a6)
	move.l	$18(a4,d0.w),d0
	move.l	$7a(a6),a4
	tst.l	d0
	beq.s	SearchHash6
SearchHash1:
	move.l	a4,a0
	bsr	ReadBlock
	cmp.b	$1b0(a4),d3
	bne.s	SearchHash5
	lea	$1b1(a4),a0
	move.l	a2,a1
	move.l	d3,d2
SearchHash2:
	move.b	(a0)+,d0
	move.b	(a1)+,d1
	cmp.b	#$61,d0
	bcs.s	SearchHash3
	cmp.b	#$7b,d0
	bcc.s	SearchHash3
	eor.b	#$20,d0
SearchHash3:
	cmp.b	#$61,d1
	bcs.s	SearchHash4
	cmp.b	#$7b,d1
	bcc.s	SearchHash4
	eor.b	#$20,d1
SearchHash4:
	cmp.b	d0,d1
	bne.s	SearchHash5
	subq.w	#1,d2
	bne.s	SearchHash2
SearchHash4a:
	movem.l	(a7)+,d1-d3/a0-a2
	moveq	#$00,d0
	rts
SearchHash5:
	move.w	$6(a4),$13a(a6)
	move.w	#$01f0,$13c(a6)
	move.l	$1f0(a4),d0
	bne.s	SearchHash1
SearchHash6:
	movem.l	(a7)+,d1-d3/a0-a2
	moveq	#-1,d0			;Hash not Found
	rts
SearchHash7:
	move.l	$1f4(a4),d0
	beq.s	SearchHash6
	move.l	$7a(a6),a4
	move.l	a4,a0
	bsr	ReadBlock
	bra.s	SearchHash4a

CheckRootBlock:
	movem.l	d7/a0,-(a7)
	cmp.l	$7e(a6),a4
	bne.s	CheckRootBlock1
	cmp.w	#$ffff,$11e(a6)
	bne.s	CheckRootBlock1
	moveq	#$00,d0			;Drive 0
	move.b	d0,$11c(a6)
	move.b	d0,$11d(a6)
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	ReadBlock
	move.w	#$0370,$11e(a6)
CheckRootBlock1:
	moveq	#$02,d7
	cmp.l	#$00000002,(a4)
	bne	ErrorHandler	;Not a Dos Disk
	movem.l	(a7)+,d7/a0
	rts

ShowCurrentDir:
	movem.l	a0-a6/d1-d7,-(a7)
	move.b	$11d(a6),$11c(a6)
	move.l	$7e(a6),a4		;Rootblock
	bsr	CheckRootBlock
ShowCurrentDir1:
	moveq	#$0a,d0
	jsr	_WriteChar(a6)
	moveq	#'D',d0
	jsr	_WriteChar(a6)
	moveq	#'F',d0
	jsr	_WriteChar(a6)
	moveq	#$00,d0
	move.b	$11d(a6),d0
	jsr	_WriteNumber(a6)
	moveq	#':',d0
	jsr	_WriteChar(a6)
	cmp.l	#$00000001,$1fc(a4)
	beq.s	ShowCurrentDir4
	moveq	#$00,d0
	move.l	d0,-(a7)
ShowCurrentDir2:
	move.l	$1f4(a4),d0
	cmp.l	#$00000370,d0
	beq.s	ShowCurrentDir3
	move.l	$4(a4),-(a7)
	move.l	$7a(a6),a4
	move.l	a4,a0
	bsr	ReadBlock
	bra.s	ShowCurrentDir2
ShowCurrentDir3:
	lea	$1b0(a4),a0
	move.l	a0,d0
	bsr	WriteFileName
	move.l	(a7)+,d0
	beq.s	ShowCurrentDir4
	move.l	a4,a0
	bsr	ReadBlock
	moveq	#'/',d0
	jsr	_WriteChar(a6)
	bra.s	ShowCurrentDir3
ShowCurrentDir4:
	moveq	#$0a,d0
	jsr	_WriteChar(a6)
	movem.l	(a7)+,a0-a6/d1-d7
	rts

ChangeDirectory:				;A0 = DirectoryName
	movem.l	a0-a6/d1-d7,-(a7)
	move.l	a0,a3
	move.b	$11d(a6),$11c(a6)
	move.l	$7e(a6),a4		;Rootblock
ChangeDirectory1:
	tst.b	(a3)
	beq.s	ChangeDirectory3
ChangeDirectory1a:
	move.b	(a3)+,d0
	beq.s	ChangeDirectory2	;Last Directory
	cmp.b	#'/',d0
	beq.s	ChangeDirectory2	;Directory
	cmp.b	#':',d0
	bne.s	ChangeDirectory1a	;Drive
	move.b	-2(a3),d0
	and.b	#$03,d0
	move.b	d0,$11c(a6)
	move.l	$7a(a6),a4
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	ReadBlock
	move.l	a3,a0
	bra.s	ChangeDirectory1
ChangeDirectory2:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$05,d7
	tst.l	d0
	bmi	ErrorHandler	;Directory not found
	cmp.l	#$00000002,$1fc(a4)
	bhi	ErrorHandler	;Directory not found
	move.l	a3,a0
	tst.b	-1(a3)
	bne.s	ChangeDirectory1
ChangeDirectory3:
	bsr	CheckRootBlock
	cmp.l	#$00000001,$1fc(a4)
	bne.s	ChangeDirectory4
	move.l	#$00000370,$4(a4)
ChangeDirectory4:
	move.l	$4(a4),d0
	move.l	$7e(a6),a0
	bsr	ReadBlock
	move.w	$6(a4),$11e(a6)
	move.b	$11c(a6),$11d(a6)
	movem.l	(a7)+,a0-a6/d1-d7
	rts

ShowDirectory:				;A0 = DirectoryName
	movem.l	a0-a6/d1-d7,-(a7)
	move.l	a0,a3
	move.b	$11d(a6),$11c(a6)
	move.l	$7e(a6),a4		;Rootblock
ShowDirectory1:
	tst.b	(a3)
	beq.s	ShowDirectory2a
ShowDirectory1a:
	move.b	(a3)+,d0
	beq.s	ShowDirectory2	;Last Directory
	cmp.b	#'/',d0
	beq.s	ShowDirectory2	;Directory
	cmp.b	#':',d0
	bne.s	ShowDirectory1a	;Drive
	move.b	-2(a3),d0
	and.b	#$03,d0
	move.b	d0,$11c(a6)
	move.l	$7a(a6),a4
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	ReadBlock
	move.l	a3,a0
	bra.s	ShowDirectory1
ShowDirectory2:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$05,d7
	tst.l	d0
	bmi	ErrorHandler	;Directory not found
	cmp.l	#$00000002,$1fc(a4)
	bhi	ErrorHandler	;Directory not found
	move.l	a3,a0
	tst.b	-1(a3)
	bne.s	ShowDirectory1
ShowDirectory2a:
	bsr	CheckRootBlock
	moveq	#$0a,d0
	jsr	_WriteChar(a6)
	lea	Directorytext1(pc),a0
	jsr	_WriteString(a6)
	lea	$1b0(a4),a0	;DirectoryName
	move.l	a0,d0
	bsr	WriteFileName
	lea	Directorytext2(pc),a0
	jsr	_WriteString(a6)
	bsr	ReadTODDate
	bsr	GetDayOfWeek	;Day of week
	move.l	d0,a0
	jsr	_WriteString(a6)
	moveq	#$20,d0
	jsr	_WriteChar(a6)
	bsr	ReadTODDate
	bsr	WriteDate	;Date
	clr.l	$98(a6)		;Nr of Files
	clr.l	$9c(a6)		;Nr of Directories
	clr.l	$a0(a6)		;Nr of Blocks
	cmpa.l	$7e(a6),a4
	bne.s	ShowDirectory2c
	move.l	a4,a3
	move.l	$7a(a6),a4
	move.l	a4,a2
	moveq	#$7f,d2
ShowDirectory2b:
	move.l	(a3)+,(a2)+
	dbf	d2,ShowDirectory2b
ShowDirectory2c:
	moveq	#$00,d2
ShowDirectory3:
	move.w	#$0018,d3
	moveq	#-1,d4
ShowDirectory4:
	move.l	0(a4,d3.w),d0
	cmp.l	d2,d0
	bls.s	ShowDirectory5
	cmp.l	d0,d4
	bls.s	ShowDirectory5
	move.l	d0,d4
	lea	0(a4,d3.w),a2
ShowDirectory5:
	addq.w	#4,d3
	cmp.w	#$138,d3
	bne.s	ShowDirectory4
	tst.l	d4
	bmi	ShowDirectory11
	move.l	d4,d2
	move.l	d4,d0
ShowDirectory6:
	ext.l	d0
	divu	#11,d0
	move.w	d0,d4		;d4=tracknr 0-159
	swap	d0
	move.w	d0,d5		;d5=sectornr 0-10
	move.b	$11c(a6),d0
	cmp.b	$124(a6),d0
	bne.s	ShowDirectory7
	cmp.b	$125(a6),d4
	beq.s	ShowDirectory8
ShowDirectory7:
	move.w	d4,d0
	moveq	#$02,d7
	cmp.w	#$009f,d0
	bhi	ErrorHandler		;Load error
	bsr	ReadTrack
ShowDirectory8:
	ext.l	d5
	lsl.w	#8,d5
	add.w	d5,d5
	move.l	$120(a6),a1
	add.l	d5,a1
	move.l	$1f0(a1),d6
	lea	$1b0(a1),a0		;FileName
	moveq	#$0a,d0
	jsr	_WriteChar(a6)
	move.l	a0,d0
	bsr	WriteFileName
	move.w	#$0020,$5e(a6)
	cmp.l	#$fffffffd,$1fc(a1)
	beq.s	ShowDirectory9
	addq.l	#1,$9c(a6)		;Nr of Directories
	addq.l	#1,$a0(a6)		;Nr of Blocks
	lea	Directorytext3(pc),a0	;Directory
	jsr	_WriteString(a6)
	bra.s	ShowDirectory10
ShowDirectory9:
	addq.l	#1,$98(a6)		;Nr of Files
	move.l	$144(a1),d0		;FileLength
	move.l	d0,d7
	add.l	#$000001e7,d7
	divu	#$01e8,d7
	ext.l	d7
	add.l	d7,$a0(a6)		;Nr of Blocks
	add.l	#$00000047,d7
	divu	#$0048,d7
	ext.l	d7
	add.l	d7,$a0(a6)
	move.l	#100000,d1
	jsr	_WriteDecNumber(a6)
ShowDirectory10:
	moveq	#' ',d0
	jsr	_WriteChar(a6)
	move.l	$140(a1),d0		;ProtectionFlags
	bsr	WriteProtFlags
	moveq	#' ',d0
	jsr	_WriteChar(a6)
	move.l	d2,d7
	move.l	$1a4(a1),d0		;Date
	bsr	ConvertDate
	bsr	WriteDate
	moveq	#' ',d0
	jsr	_WriteChar(a6)
	move.l	$1a8(a1),d0		;Time
	move.l	$1ac(a1),d1
	bsr	ConvertTime
	bsr	WriteTime
	move.l	d7,d2
	lea	$148(a1),a0		;FileNote
	tst.b	(a0)
	beq.s	ShowDirectory10a
	moveq	#$0a,d0
	jsr	_WriteChar(a6)
	moveq	#$3a,d0
	jsr	_WriteChar(a6)
	moveq	#$20,d0
	jsr	_WriteChar(a6)
	move.l	a0,d0
	bsr	WriteFileName
ShowDirectory10a:
	bsr	WaitIfCtrl
	jsr	_ReadKeyboard(a6)
	cmp.b	#$1b,d0
	beq.s	ShowDirectory11
	move.l	d6,d0
	beq	ShowDirectory3
	swap	d0
	swap	d2
	move.w	d2,d0
	swap	d0
	swap	d2
	move.l	d0,(a2)
	cmp.l	d2,d0
	bhi	ShowDirectory3
	move.l	d0,d6
	move.l	d2,d7
	ext.l	d6
	ext.l	d7
	divu	#11,d6
	divu	#11,d7
	cmp.w	d6,d7
	beq	ShowDirectory6		;On same track
	move.l	d2,d0
	swap	d0
	addq.w	#1,d0
	move.w	d0,(a2)
	bra	ShowDirectory3
ShowDirectory11:
	moveq	#$0a,d0
	jsr	_WriteChar(a6)
	move.l	#1000000000,d1
	moveq	#$01,d2
	move.l	$98(a6),d0		;Nr of Files
	beq.s	ShowDirectory12
	jsr	_WriteDecNumberII(a6)
	lea	Directorytext4(pc),a0
	cmp.l	$98(a6),d2
	bne.s	ShowDirectory11a
	lea	Directorytext4a(pc),a0
ShowDirectory11a:
	jsr	_WriteString(a6)
ShowDirectory12:
	move.l	$9c(a6),d0		;Nr of Directories
	beq.s	ShowDirectory13
	jsr	_WriteDecNumberII(a6)
	lea	Directorytext5(pc),a0
	cmp.l	$9c(a6),d2
	bne.s	ShowDirectory12a
	lea	Directorytext5a(pc),a0
ShowDirectory12a:
	jsr	_WriteString(a6)
ShowDirectory13:
	move.l	$a0(a6),d0		;Nr of Blocks
	jsr	_WriteDecNumberII(a6)
	lea	Directorytext6(pc),a0
	cmp.l	$a0(a6),d2
	bne.s	ShowDirectory13a
	lea	Directorytext6a(pc),a0
ShowDirectory13a:
	jsr	_WriteString(a6)
	moveq	#$0a,d0
	jsr	_WriteChar(a6)
	movem.l	(a7)+,d1-d7/a0-a6
	rts

WriteFileName:
	movem.l	d1/a0,-(a7)
	move.l	d0,a0
	move.b	(a0)+,d1
WriteFileName1:
	tst.b	d1
	beq.s	WriteFileName2
	move.b	(a0)+,d0
	jsr	_WriteChar(a6)
	subq.b	#1,d1
	bra.s	WriteFileName1
WriteFileName2:
	movem.l	(a7)+,d1/a0
	rts

Directorytext1:
	dc.b	"Directory ",$22,0
Directorytext2:
	dc.b	$22," on ",0
Directorytext3:
	dc.b	"   Dir",0
Directorytext4:
	dc.b	" files - ",0
Directorytext4a:
	dc.b	" file - ",0
Directorytext5:
	dc.b	" directories - ",0
Directorytext5a:
	dc.b	" directory - ",0
Directorytext6:
	dc.b	" blocks used",0
Directorytext6a:
	dc.b	" block used",0
	even

ShowInfo:
	movem.l	d1-d7/a0-a6,-(a7)
	lea	Infotext1(pc),a0
	jsr	_WriteString(a6)
	moveq	#$03,d6
ShowInfo1:
	move.l	d6,-(a7)
	lea	ShowInfo2(pc),a0
	move.l	a0,$142(a6)
	move.l	a7,$146(a6)
	move.b	d6,$11c(a6)		;Drive unit
	move.l	$7a(a6),a0
	move.w	#$0370,d0		;Rootblock
	bsr	ReadBlock
	bra.s	ShowInfo4
ShowInfo2:
	move.l	$146(a6),a7
	move.l	(a7),d6
	cmp.b	#$01,d7
	beq	ShowInfo6		;Next Drive
	lea	Infotext2(pc),a0
	cmp.b	#$09,d7
	beq.s	ShowInfo3		;No Disk in drive
	lea	Infotext4(pc),a0	;Unreadable disk
	cmp.b	#$02,d7
	beq.s	ShowInfo3
	lea	Infotext5(pc),a0	;Disk not validated
ShowInfo3:
	moveq	#'D',d0
	jsr	_WriteChar(a6)
	moveq	#'F',d0
	jsr	_WriteChar(a6)
	moveq	#'0',d0
	add.l	d6,d0
	jsr	_WriteChar(a6)
	jsr	_WriteString(a6)
	bra	ShowInfo6
ShowInfo4:
	move.l	$7a(a6),a4
	lea	Infotext3(pc),a0	;Not a DOS disk
	cmp.l	#$00000002,(a4)
	bne.s	ShowInfo3
	cmp.l	#$00000001,$1fc(a4)
	bne.s	ShowInfo3
	bsr	ReadBamBlock
	move.l	(a7),d6
	moveq	#'D',d0
	jsr	_WriteChar(a6)
	moveq	#'F',d0
	jsr	_WriteChar(a6)
	moveq	#'0',d0
	add.l	d6,d0
	jsr	_WriteChar(a6)
	lea	Infotext8(pc),a0
	jsr	_WriteString(a6)
	move.w	#13,$5e(a6)
	bsr	GetNumUsedBlock
	move.l	d0,d2
	move.l	#1000,d1
	jsr	_WriteDecNumber(a6)
	move.w	#21,$5e(a6)
	move.l	#1758,d0
	sub.l	d2,d0
	jsr	_WriteDecNumber(a6)
	move.w	#26,$5e(a6)
	move.l	#100,d1
	move.l	d2,d0
	mulu	#100,d0
	divu	#1758,d0
	ext.l	d0
	jsr	_WriteDecNumber(a6)
	moveq	#'%',d0
	jsr	_WriteChar(a6)
	move.w	#33,$5e(a6)
	moveq	#'0',d0
	jsr	_WriteChar(a6)
	move.w	#36,$5e(a6)
	bsr	CheckWriteProt
	lea	Infotext6(pc),a0
	tst.l	d0
	beq.s	ShowInfo5
	lea	Infotext7(pc),a0	;WriteProt
ShowInfo5:
	jsr	_WriteString(a6)
	move.w	#47,$5e(a6)
	lea	$1b0(a4),a0
	move.l	a0,d0
	bsr	WriteFileName
	moveq	#$0a,d0
	jsr	_WriteChar(a6)
ShowInfo6:
	move.l	(a7)+,d6
	subq.l	#1,d6
	bpl	ShowInfo1
	movem.l	(a7)+,d1-d7/a0-a6
	rts

Infotext1:
	dc.b	10,"Mounted disks:",10
	dc.b	"Unit Size    Used    Free Full Errs   Status   Name"
*		 01234567890123456789012345678901234567890123456789
*			   1         2         3         4
	dc.b	10,0
Infotext2:
	dc.b	": No disk present",10,0
Infotext3:
	dc.b	": Not a DOS disk",10,0
Infotext4:
	dc.b	": Unreadable disk",10,0
Infotext5:
	dc.b	": Disk not validated",10,0
Infotext6:
	dc.b	"Read/Write",0
Infotext7:
	dc.b	"Read Only ",0
Infotext8:
	dc.b	": 880K",0
	even

InstallDisk:
	movem.l	d1/a0/a1/a6,-(a7)
	moveq	#$00,d0
	move.w	d0,d1		;d4=tracknr 0-159
	move.b	$11c(a6),d0
	cmp.b	$124(a6),d0
	bne.s	InstallDisk1
	cmp.b	$125(a6),d1
	beq.s	InstallDisk2
InstallDisk1:
	bsr	WriteLastTrack
	move.w	d1,d0
	bsr	ReadTrack
InstallDisk2:
	move.w	#$1234,$138(a6)		;Write Track Buffer !
	move.l	$120(a6),a0
	lea	InstallDiskData(pc),a1
	move.w	#$00ff,d0
InstallDisk3:
	move.l	(a1)+,(a0)+
	dbf	d0,InstallDisk3
	move.l	$120(a6),a0
	move.l	a0,d0
	bsr	CheckSumBootBlock
	bsr	WriteLastTrack
	movem.l	(a7)+,d1/a0/a1/a6
	rts
InstallDiskData:
	dc.l	$444f5300,$00000000,$00000370,$43fa0018
	dc.l	$4eaeffa0,$4a80670a,$20402068,$00167000
	dc.l	$4e7570ff,$60fa646f,$732e6c69,$62726172
	dc.l	$79000000

GetFileLength:		;a0=filename
	movem.l	a0-a6/d1-d7,-(a7)
	move.l	a0,a3
	move.b	$11d(a6),$11c(a6)
	move.l	$7e(a6),a4		;Rootblock
GetFileLength1:
	move.b	(a3)+,d0
	beq.s	GetFileLength3	;FileName
	cmp.b	#'/',d0
	beq.s	GetFileLength2	;Directory
	cmp.b	#':',d0
	bne.s	GetFileLength1	;Drive
	move.b	-2(a3),d0
	and.b	#$03,d0
	move.b	d0,$11c(a6)
	move.l	$7a(a6),a4
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	ReadBlock
	move.l	a3,a0
	bra.s	GetFileLength1
GetFileLength2:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$05,d7
	tst.l	d0
	bmi	ErrorHandler	;Directory not found
	move.l	a3,a0
	bra.s	GetFileLength1
GetFileLength3:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$04,d7
	tst.l	d0
	bmi	ErrorHandler	;File not found
	cmp.l	#$fffffffd,$1fc(a4)
	bne	ErrorHandler	;File not found
	move.l	$144(a4),d0
	movem.l	(a7)+,d1-d7/a0-a6
	rts


LoadFile:		;a0=filename, a1=startadress
			;a2=endadress(NULL=End of File)
	movem.l	a0-a6/d1-d7,-(a7)
	move.l	a0,a3
	move.b	$11d(a6),$11c(a6)
	move.l	$7e(a6),a4		;Rootblock
LoadFile1:
	move.b	(a3)+,d0
	beq.s	LoadFile3	;FileName
	cmp.b	#'/',d0
	beq.s	LoadFile2	;Directory
	cmp.b	#':',d0
	bne.s	LoadFile1	;Drive
	move.b	-2(a3),d0
	and.b	#$03,d0
	move.b	d0,$11c(a6)
	move.l	$7a(a6),a4
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	ReadBlock
	move.l	a3,a0
	bra.s	LoadFile1
LoadFile2:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$05,d7
	tst.l	d0
	bmi	ErrorHandler	;Directory not found
	move.l	a3,a0
	bra.s	LoadFile1
LoadFile3:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$04,d7
	tst.l	d0
	bmi	ErrorHandler	;File not found
	cmp.l	#$fffffffd,$1fc(a4)
	bne	ErrorHandler	;File not found
	move.l	$10(a4),d0	;first datablock
	move.l	a1,a3
	add.l	$144(a4),a3
	cmp.l	a2,a1
	bcc.s	LoadFile4
	cmp.l	a2,a3
	bcc.s	LoadFile5
LoadFile4:
	move.l	a3,a2
LoadFile5:
	move.l	a1,a0
LoadFile6:
	divu	#11,d0
	move.w	d0,d4		;d4=tracknr 0-159
	swap	d0
	move.w	d0,d5		;d5=sectornr 0-10
	move.b	$11c(a6),d0
	cmp.b	$124(a6),d0
	bne.s	LoadFile7
	cmp.b	$125(a6),d4
	beq.s	LoadFile8
LoadFile7:
	move.w	d4,d0
	moveq	#$02,d7
	cmp.w	#$009f,d0
	bhi	ErrorHandler		;Load error
	bsr	ReadTrack
LoadFile8:
	ext.w	d5
	ext.l	d5
	lsl.w	#8,d5
	add.w	d5,d5
	move.l	$120(a6),a1
	add.l	d5,a1
	move.l	$0c(a1),d1		;Block length
	move.l	$10(a1),d6		;Next block
	lea	$18(a1),a1		;Start of data
	move.l	a0,a3
	add.l	d1,a3
	cmp.l	a3,a2
	bls	LoadFile12		;Last block	
	moveq	#$02,d7
	cmp.w	#$01e8,d1
	bne	ErrorHandler		;Error in File
	subq.w	#1,d1
	cmp.l	#$00dfffff,a0
	bhi.s	LoadFile10		;>$e00000
	cmp.l	#$00dfedff,a0	
	bhi	LoadFile11
	cmp.l	#$00bfffff,a0		;>$c00000
	bhi.s	LoadFile10
	cmp.l	#$00bfcdff,a0
	bhi	LoadFile11
	cmp.l	#$000053ff,a0		;>$5400
	bhi.s	LoadFile10
	cmp.l	#$00005217,a0
	bhi	LoadFile11
	add.l	$86(a6),a0		;<$5400
LoadFile9:
	move.l	a0,d0
	btst	#0,d0
	bne.s	LoadFile9b
	moveq	#$0e,d1
LoadFile9a:
	movem.l	(a1)+,d0/d2/d3/d4/d5/a3/a4/a5	;$0f*$20=$01e0
	movem.l	d0/d2/d3/d4/d5/a3/a4/a5,(a0)
	lea	$0020(a0),a0
	dbf	d1,LoadFile9a
	move.l	(a1)+,(a0)+			;$01e0+$0008=$01e8
	move.l	(a1)+,(a0)+
	sub.l	$86(a6),a0
	bra.s	LoadFile13
LoadFile9b:
	move.b	(a1)+,(a0)+
	dbf	d1,LoadFile9b
	sub.l	$86(a6),a0
	bra.s	LoadFile13
LoadFile10:				;Ordinary Mem
	move.l	a0,d0
	btst	#0,d0
	bne.s	LoadFile10b
	moveq	#$0e,d1
LoadFile10a:
	movem.l	(a1)+,d0/d2/d3/d4/d5/a3/a4/a5	;$01e0
	movem.l	d0/d2/d3/d4/d5/a3/a4/a5,(a0)
	lea	$0020(a0),a0
	dbf	d1,LoadFile10a
	move.l	(a1)+,(a0)+			;$0008
	move.l	(a1)+,(a0)+
	bra.s	LoadFile13
LoadFile10b:
	move.b	(a1)+,(a0)+
	dbf	d1,LoadFile10b
	bra.s	LoadFile13
LoadFile11:				;Special Ram
	move.b	(a1)+,d0
	jsr	_WriteMemByte(a6)
	dbf	d1,LoadFile11
	bra.s	LoadFile13
LoadFile12:
	move.b	(a1)+,d0
	jsr	_WriteMemByte(a6)
	cmp.l	a0,a2
	bhi.s	LoadFile12
	clr.l	d6
LoadFile13:
	move.l	d6,d0
	tst.l	d0
	bne	LoadFile6
	move.l	a0,d0
	movem.l	(a7)+,a0-a6/d1-d7
	rts
	

LoadSegFile:		;a0=filename, a1=startadress
	movem.l	a0-a6/d1-d7,-(a7)
	move.l	a0,a3
	move.b	$11d(a6),$11c(a6)
	move.l	$7e(a6),a4		;Rootblock
LoadSegFile1:
	move.b	(a3)+,d0
	beq.s	LoadSegFile3	;FileName
	cmp.b	#'/',d0
	beq.s	LoadSegFile2	;Directory
	cmp.b	#':',d0
	bne.s	LoadSegFile1	;Drive
	move.b	-2(a3),d0
	and.b	#$03,d0
	move.b	d0,$11c(a6)
	move.l	$7a(a6),a4
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	ReadBlock
	move.l	a3,a0
	bra.s	LoadSegFile1
LoadSegFile2:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$05,d7
	tst.l	d0
	bmi	ErrorHandler	;Directory not found
	move.l	a3,a0
	bra.s	LoadSegFile1
LoadSegFile3:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$04,d7
	tst.l	d0
	bmi	ErrorHandler	;File not found
	cmp.l	#$fffffffd,$1fc(a4)
	bne	ErrorHandler	;File not found
	move.l	a1,d0
	and.w	#$fffc,d0
	move.l	d0,a2
	move.l	a4,a1
	bsr	LoadSegFileRL2	;Read first longword
	moveq	#$0c,d7		;Not an object module error
	tst.l	d1
	bmi	ErrorHandler
	cmp.l	#$000003f3,d0
	bne	ErrorHandler
	bsr	LoadSegFileRL1	;Start Seg Nr
	tst.l	d1
	bmi	ErrorHandler
	bsr	LoadSegFileRL1	;Tot Nr of Segs in file
	tst.l	d1
	bmi	ErrorHandler	
	tst.l	d0
	beq	ErrorHandler	;Null segs
	bsr	LoadSegFileRL1	;First Seg Nr
	tst.l	d1
	bmi	ErrorHandler
	move.l	d0,d2
	bsr	LoadSegFileRL1	;Last Seg Nr
	tst.l	d1
	bmi	ErrorHandler
	sub.l	d2,d0
	move.l	d0,d2
	bmi	ErrorHandler
	addq.l	#4,a2		;Seg NR 1
	move.l	a2,a3
LoadSegFile4:
	bsr	LoadSegFileRL1
	tst.l	d1
	bmi	ErrorHandler
	move.l	a3,a0
	add.l	d0,d0
	add.l	d0,d0
	addq.l	#8,d0
	subq.l	#4,a0
	move.l	a0,a3
	add.l	d0,a3
	jsr	_WriteMemLong(a6)
	addq.l	#4,a3
	move.l	a3,d0
	lsr.l	#2,d0
	jsr	_WriteMemLong(a6)
	dbf	d2,LoadSegFile4
	subq.l	#4,a0
	moveq	#$00,d0
	jsr	_WriteMemLong(a6)
	move.l	a2,a3
	addq.l	#4,a3
LoadSegFile5:
	bsr	LoadSegFileRL1
	tst.l	d1
	bmi	ErrorHandler
	and.l	#$3fffffff,d0
	cmp.l	#$000003e9,d0
	beq.s	LoadSegFile6	;CODE
	cmp.l	#$000003ea,d0
	beq.s	LoadSegFile6	;DATA
	cmp.l	#$000003eb,d0
	beq.s	LoadSegFile8	;BSS
	cmp.l	#$000003ec,d0
	beq.s	LoadSegFile10	;RELOCATE
	cmp.l	#$000003f2,d0
	beq	LoadSegFile14	;ENDOFSEG
	bra	ErrorHandler
LoadSegFile6:			;CODE,DATA
	bsr	LoadSegFileRL1
	tst.l	d1
	bmi	ErrorHandler
	move.l	d0,d2
	beq	ErrorHandler
	move.l	a3,a0
LoadSegFile7:
	bsr	LoadSegFileRL1
	tst.l	d1
	bmi	ErrorHandler
	jsr	_WriteMemLong(a6)
	subq.l	#1,d2
	bne.s	LoadSegFile7
	bra.s	LoadSegFile5
LoadSegFile8:			;BSS
	bsr	LoadSegFileRL1
	tst.l	d1
	bmi	ErrorHandler
	move.l	d0,d2
	beq	ErrorHandler
	move.l	a3,a0
	moveq	#$00,d0
LoadSegFile9:
	jsr	_WriteMemLong(a6)
	subq.l	#1,d2
	bne.s	LoadSegFile9
	bra	LoadSegFile5
LoadSegFile10:			;RELOCATE
	bsr	LoadSegFileRL1	;Number of changes
	tst.l	d1
	bmi	ErrorHandler
	move.l	d0,d2
	beq	LoadSegFile5
	bsr	LoadSegFileRL1	;Seg nr
	tst.l	d1
	bmi	ErrorHandler
	move.l	a2,a0
LoadSegFile11:
	tst.l	d0
	beq.s	LoadSegFile12
	move.l	d0,-(a7)
	jsr	_ReadMemLong(a6)
	move.l	d0,a0
	move.l	(a7)+,d0
	add.l	a0,a0
	add.l	a0,a0
	subq.l	#1,d0
	bra.s	LoadSegFile11
LoadSegFile12:
	move.l	a0,d0
	tst.l	d0
	beq	ErrorHandler
	addq.l	#4,a0
	move.l	a0,a4
LoadSegFile13:
	bsr.s	LoadSegFileRL1
	tst.l	d1
	bmi	ErrorHandler
	move.l	a3,a0
	add.l	d0,a0
	jsr	_ReadMemLong(a6)
	add.l	a4,d0
	subq.l	#4,a0
	jsr	_WriteMemLong(a6)
	subq.l	#1,d2
	bne.s	LoadSegFile13
	bra.s	LoadSegFile10
LoadSegFile14:			;ENDOFSEG
	movem.l	d0/a0,-(a7)
	lea	-4(a3),a0
	jsr	_ReadMemLong(a6)
	move.l	d0,a3
	movem.l	(a7)+,d0/a0
	add.l	a3,a3
	add.l	a3,a3
	move.l	a3,d0
	addq.l	#4,a3
	tst.l	d0
	bne	LoadSegFile5
	move.l	a2,d0
	movem.l	(a7)+,a0-a6/d1-d7
	rts

LoadSegFileRL1:			;Read next Longword
				;A1=Block,D1=Index
	cmp.l	$0c(a1),d1
	beq.s	LoadSegFileRL2	;Next Sector
	bhi.s	LoadSegFileRL5	;Error
	move.l	$18(a1,d1.w),d0
	addq.w	#4,d1
	rts
LoadSegFileRL2:
	move.l	$10(a1),d0	;Next block
	beq.s	LoadSegFileRL5	;Last block
	movem.l	d2/d7,-(a7)
	divu	#11,d0
	move.w	d0,d1		;d1=tracknr 0-159
	swap	d0
	move.w	d0,d2		;d2=sectornr 0-10
	move.b	$11c(a6),d0
	cmp.b	$124(a6),d0
	bne.s	LoadSegFileRL3
	cmp.b	$125(a6),d1
	beq.s	LoadSegFileRL4
LoadSegFileRL3:
	move.w	d1,d0
	moveq	#$02,d7
	cmp.w	#$009f,d0
	bhi	ErrorHandler		;Load error
	bsr	ReadTrack
LoadSegFileRL4:
	ext.l	d2
	lsl.w	#8,d2
	add.w	d2,d2
	move.l	$120(a6),a1
	add.l	d2,a1
	movem.l	(a7)+,d2/d7
	move.l	$18(a1),d0
	moveq	#$04,d1
	rts
LoadSegFileRL5:
	moveq	#$ffffffff,d1
	rts

SaveFile:		;a0=filename, a1=startadress
			;a2=endadress
	movem.l	a0-a6/d1-d7,-(a7)
	move.l	a0,a3
	move.b	$11d(a6),$11c(a6)
	move.l	$7e(a6),a4		;Rootblock
SaveFile1:
	move.b	(a3)+,d0
	beq.s	SaveFile3	;FileName
	cmp.b	#'/',d0
	beq.s	SaveFile2	;Directory
	cmp.b	#':',d0
	bne.s	SaveFile1	;Drive
	move.b	-2(a3),d0
	and.b	#$03,d0
	move.b	d0,$11c(a6)
	move.l	$7a(a6),a4
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	ReadBlock
	move.l	a3,a0
	bra.s	SaveFile1
SaveFile2:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$05,d7
	tst.l	d0
	bmi	ErrorHandler	;Directory not found
	move.l	a3,a0
	bra.s	SaveFile1
SaveFile3:
	bsr	CheckRootBlock
	move.l	$4(a4),d4
	cmp.l	#$00000001,$1fc(a4)
	bne.s	SaveFile3a
	move.l	#$00000370,d4
SaveFile3a:
	move.l	a3,d0
	sub.l	a0,d0
	move.l	a0,a3
	subq.l	#1,d0
	move.l	d0,d6
	bsr	SearchHash
	tst.l	d0
	bmi	SaveFile4	;File not found
	moveq	#$04,d7
	cmp.l	#$fffffffd,$1fc(a4)
	bne	ErrorHandler	;Not a file error!
	bsr	DeleteFile3a
SaveFile4:
	bsr	ReadBamBlock
	move.l	d0,-(a7)	;BamBlockNr
	moveq	#$7f,d0
	move.l	a4,a0
SaveFile5:
	clr.l	(a0)+
	dbf	d0,SaveFile5
	move.l	#$00000002,(a4)
	move.l	#$fffffffd,$1fc(a4)
	move.l	a4,d0
	bsr	AttachDate
	move.w	#$0371,d0
	bsr	GetFreeBlockII
	moveq	#$08,d7
	tst.l	d0
	bmi	ErrorHandler		;Disk full error
	move.l	d0,4(a4)		;BlockNr
	move.l	a2,d0
	sub.l	a1,d0
	move.l	d0,$144(a4)		;FileLength
	move.l	d4,$1f4(a4)		;ParentBlock
	move.b	d6,$1b0(a4)		;FileNameLength
	lea	$1b1(a4),a0		;FileName
	subq.l	#1,d6
SaveFile5a:
	move.b	(a3)+,(a0)+
	dbf	d6,SaveFile5a
	move.l	4(a4),d6		;FileInfoBlock
	move.w	#$036f,d0
	bsr	GetFreeBlockI
	moveq	#$08,d7
	tst.l	d0
	bmi	ErrorHandler
	move.l	d0,$10(a4)		;1st Datablock
	moveq	#$01,d3			;Number of Datablock
SaveFile5b:
	cmp.l	#$00000048,$8(a4)
	bne.s	SaveFile5d
	move.l	d0,d1
	move.l	$4(a4),d0
	bsr	GetFreeBlockII
	moveq	#$08,d7
	tst.l	d0
	bmi	ErrorHandler
	move.l	d0,$1f8(a4)
	move.l	d0,d2
	move.l	a4,d0
	bsr	CheckSumBlock
	move.l	a4,a0
	move.l	$4(a4),d0
	bsr	WriteBlock
	moveq	#$7f,d0
	move.l	a4,a0
SaveFile5c:
	clr.l	(a0)+
	dbf	d0,SaveFile5c
	move.l	#$00000010,(a4)
	move.l	#$fffffffd,$1fc(a4)
	move.l	d2,$4(a4)
	move.l	d6,$1f4(a4)
	move.l	d1,d0
SaveFile5d:
	moveq	#$47,d1
	sub.l	$8(a4),d1
	addq.l	#1,$8(a4)
	lsl.l	#2,d1
	move.l	d0,$18(a4,d1.w)
SaveFile6:
	movem.l	d0/d3/a4,-(a7)	;Current Datablock
	ext.l	d0
	divu	#11,d0
	move.w	d0,d4		;d4=tracknr 0-159
	swap	d0
	move.w	d0,d5		;d5=sectornr 0-10
	move.b	$11c(a6),d0
	cmp.b	$124(a6),d0
	bne.s	SaveFile7
	cmp.b	$125(a6),d4
	beq.s	SaveFile8
SaveFile7:
	bsr	WriteLastTrack
	move.w	d4,d0
	moveq	#$02,d7
	cmp.w	#$009f,d0
	bhi	ErrorHandler		;Save error
	bsr	ReadTrack
SaveFile8:
	move.w	#$1234,$138(a6)		;Write Track Buffer !
	ext.w	d5
	ext.l	d5
	lsl.w	#8,d5
	add.w	d5,d5
	move.l	$120(a6),a0
	add.l	d5,a0
	move.l	a2,d1
	sub.l	a1,d1
	cmp.l	#$000001e8,d1
	bls	SaveFile9
	move.l	#$000001e8,d1	
SaveFile9:
	move.l	#$00000008,(a0)
	move.l	d1,$0c(a0)		;Number of bytes
	move.l	d6,$04(a0)		;FileInfoBlock
	move.l	d3,$08(a0)		;Number of Datablock
	move.l	a0,d7
	lea	$18(a0),a0		;Start of data
	subq.w	#1,d1
	cmp.w	#$01e7,d1
	bne	SaveFile11
	cmp.l	#$00dfffff,a1
	bhi.s	SaveFile10		;>$e00000
	cmp.l	#$00dfedff,a1	
	bhi	SaveFile11
	cmp.l	#$00bfffff,a1		;>$c00000
	bhi.s	SaveFile10
	cmp.l	#$00bfcdff,a1
	bhi	SaveFile11
	cmp.l	#$000053ff,a1		;>$5400
	bhi.s	SaveFile10
	cmp.l	#$00005217,a1
	bhi	SaveFile11
	add.l	$86(a6),a1		;<$5400
	move.l	a1,d0
	btst	#0,d0
	bne.s	SaveFile9b
	moveq	#$0e,d1
SaveFile9a:
	movem.l	(a1)+,d0/d2/d3/d4/d5/a3/a4/a5	;$0f*$20=$01e0
	movem.l	d0/d2/d3/d4/d5/a3/a4/a5,(a0)
	lea	$0020(a0),a0
	dbf	d1,SaveFile9a
	move.l	(a1)+,(a0)+			;$01e0+$0008=$01e8
	move.l	(a1)+,(a0)+
	sub.l	$86(a6),a1
	bra.s	SaveFile12
SaveFile9b:
	move.b	(a1)+,(a0)+
	dbf	d1,SaveFile9b
	sub.l	$86(a6),a1
	bra.s	SaveFile12
SaveFile10:				;Ordinary Mem
	move.l	a1,d0
	btst	#0,d0
	bne.s	SaveFile10b
	moveq	#$0e,d1
SaveFile10a:
	movem.l	(a1)+,d0/d2/d3/d4/d5/a3/a4/a5	;$01e0
	movem.l	d0/d2/d3/d4/d5/a3/a4/a5,(a0)
	lea	$0020(a0),a0
	dbf	d1,SaveFile10a
	move.l	(a1)+,(a0)+			;$0008
	move.l	(a1)+,(a0)+
	bra.s	SaveFile12
SaveFile10b:
	move.b	(a1)+,(a0)+
	dbf	d1,SaveFile10b
	bra.s	SaveFile12
SaveFile11:				;Special Ram
	exg	a0,a1
	jsr	_ReadMemByte(a6)
	exg	a0,a1
	move.b	d0,(a0)+
	dbf	d1,SaveFile11
SaveFile12:
	movem.l	(a7)+,d0/d3/a4		;Current blocknr
	addq.l	#1,d3
	move.l	d7,a0
	cmp.l	a1,a2
	beq.s	SaveFile13
	bsr	GetFreeBlockI
	moveq	#$08,d7
	tst.l	d0
	bmi	ErrorHandler		;Disk full error
	move.l	d0,$10(a0)
	move.l	a0,d0
	bsr	CheckSumBlock
	move.l	$10(a0),d0
	bra	SaveFile5b
SaveFile13:
	clr.l	$10(a0)
	move.l	a0,d0
	bsr	CheckSumBlock
	move.l	a4,d0
	bsr	CheckSumBlock
	move.l	a4,a0
	move.l	$4(a4),d0
	bsr	WriteBlock
	bsr	WriteLastTrack
	move.l	a4,a0
	move.w	$13a(a6),d0
	bsr	ReadBlock
	move.w	$13c(a6),d0
	move.l	d6,0(a4,d0.w)
	move.l	a4,d0
	bsr	CheckSumBlock
	move.l	a4,a0
	move.w	$13a(a6),d0
	bsr	WriteBlock
	move.l	$13e(a6),a0
	move.l	a0,d0
	bsr	CheckSumBamBlock
	move.l	(a7)+,d0		;Write BamBlock
	bsr	WriteBlock
	bsr	WriteLastTrack
	move.l	a1,d0
	movem.l	(a7)+,a0-a6/d1-d7
	rts
	
MakeDir:		;a0=Directoryname
	movem.l	a0-a6/d1-d7,-(a7)
	move.l	a0,a3
	move.b	$11d(a6),$11c(a6)
	move.l	$7e(a6),a4		;Rootblock
MakeDir1:
	move.b	(a3)+,d0
	beq.s	MakeDir3	;Directory
	cmp.b	#'/',d0
	beq.s	MakeDir2	;Directory
	cmp.b	#':',d0
	bne.s	MakeDir1	;Drive
	move.b	-2(a3),d0
	and.b	#$03,d0
	move.b	d0,$11c(a6)
	move.l	$7a(a6),a4
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	ReadBlock
	move.l	a3,a0
	bra.s	MakeDir1
MakeDir2:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$05,d7
	tst.l	d0
	bmi	ErrorHandler	;Directory not found
	move.l	a3,a0
	bra.s	MakeDir1
MakeDir3:
	bsr	CheckRootBlock
	move.l	$4(a4),d4
	cmp.l	#$00000001,$1fc(a4)
	bne.s	MakeDir3a
	move.l	#$00000370,d4
MakeDir3a:
	move.l	a3,d0
	sub.l	a0,d0
	move.l	a0,a3
	subq.l	#1,d0
	move.l	d0,d6
	bsr	SearchHash
	tst.l	d0
	bmi	MakeDir4	;Directory not found
	moveq	#$05,d7
	cmp.l	#$00000002,$1fc(a4)
	bne	ErrorHandler	;Not a Directory error!
	bsr	DeleteFile3a
MakeDir4:
	bsr	ReadBamBlock
	move.l	d0,-(a7)	;BamBlockNr
	moveq	#$7f,d0
	move.l	a4,a0
MakeDir5:
	clr.l	(a0)+
	dbf	d0,MakeDir5
	move.l	#$00000002,(a4)
	move.l	#$00000002,$1fc(a4)
	move.l	a4,d0
	bsr	AttachDate
	move.w	#$0371,d0
	bsr	GetFreeBlockII
	moveq	#$08,d7
	tst.l	d0
	bmi	ErrorHandler		;Disk full error
	move.l	d0,4(a4)		;BlockNr
	move.l	d4,$1f4(a4)		;ParentBlock
	move.b	d6,$1b0(a4)		;FileNameLength
	lea	$1b1(a4),a0		;FileName
	subq.l	#1,d6
MakeDir6:
	move.b	(a3)+,(a0)+
	dbf	d6,MakeDir6
	move.l	4(a4),d6		;FileInfoBlock
	move.l	a4,d0
	bsr	CheckSumBlock
	move.l	a4,a0
	move.l	$4(a4),d0
	bsr	WriteBlock
	bsr	WriteLastTrack
	move.l	a4,a0
	move.w	$13a(a6),d0
	bsr	ReadBlock
	move.w	$13c(a6),d0
	move.l	d6,0(a4,d0.w)
	move.l	a4,d0
	bsr	CheckSumBlock
	move.l	a4,a0
	move.w	$13a(a6),d0
	bsr	WriteBlock
	move.l	$13e(a6),a0
	move.l	a0,d0
	bsr	CheckSumBamBlock
	move.l	(a7)+,d0		;Write BamBlock
	bsr	WriteBlock
	bsr	WriteLastTrack
	movem.l	(a7)+,a0-a6/d1-d7
	rts
	
FileNote:		;a0=Directoryname , a1=Comment
	movem.l	a0-a6/d1-d7,-(a7)
	move.l	a0,a3
	move.b	$11d(a6),$11c(a6)
	move.l	$7e(a6),a4		;Rootblock
FileNote1:
	move.b	(a3)+,d0
	beq.s	FileNote3	;File/Directory
	cmp.b	#'/',d0
	beq.s	FileNote2	;Directory
	cmp.b	#':',d0
	bne.s	FileNote1	;Drive
	move.b	-2(a3),d0
	and.b	#$03,d0
	move.b	d0,$11c(a6)
	move.l	$7a(a6),a4
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	ReadBlock
	move.l	a3,a0
	bra.s	FileNote1
FileNote2:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$05,d7
	tst.l	d0
	bmi	ErrorHandler	;Directory not found
	move.l	a3,a0
	bra.s	FileNote1
FileNote3:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$04,d7
	tst.l	d0
	bmi	ErrorHandler		;File/Directory not found
	move.l	$4(a4),d4
	cmp.l	#$00000001,$1fc(a4)
	beq	ErrorHandler
	lea	$149(a4),a0		;Comment
	moveq	#$ffffffff,d0
FileNote4:
	addq.l	#1,d0
	move.b	(a1)+,(a0)+
	bne.s	FileNote4
	move.b	d0,$148(a4)
	move.l	a4,d0
	bsr	CheckSumBlock
	move.l	a4,a0
	move.l	d4,d0
	bsr	WriteBlock
	bsr	WriteLastTrack
	movem.l	(a7)+,a0-a6/d1-d7
	rts

ProtectFile:		;a0=Filename , a1=Protect
	movem.l	a0-a6/d1-d7,-(a7)
	move.l	a0,a3
	move.b	$11d(a6),$11c(a6)
	move.l	$7e(a6),a4		;Rootblock
ProtectFile1:
	move.b	(a3)+,d0
	beq.s	ProtectFile3	;File/Directory
	cmp.b	#'/',d0
	beq.s	ProtectFile2	;Directory
	cmp.b	#':',d0
	bne.s	ProtectFile1	;Drive
	move.b	-2(a3),d0
	and.b	#$03,d0
	move.b	d0,$11c(a6)
	move.l	$7a(a6),a4
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	ReadBlock
	move.l	a3,a0
	bra.s	ProtectFile1
ProtectFile2:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$05,d7
	tst.l	d0
	bmi	ErrorHandler	;Directory not found
	move.l	a3,a0
	bra.s	ProtectFile1
ProtectFile3:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$04,d7
	tst.l	d0
	bmi	ErrorHandler		;File/Directory not found
	move.l	$4(a4),d4
	cmp.l	#$00000001,$1fc(a4)
	beq	ErrorHandler
	moveq	#$0f,d1
ProtectFile4:
	move.b	(a1)+,d0
	beq.s	ProtectFile7
	and.b	#$5f,d0
	moveq	#$07,d2
	cmp.b	#'H',d0
	beq.s	ProtectFile6
	moveq	#$06,d2
	cmp.b	#'S',d0
	beq.s	ProtectFile6
	moveq	#$05,d2
	cmp.b	#'P',d0
	beq.s	ProtectFile6
	moveq	#$04,d2
	cmp.b	#'A',d0
	beq.s	ProtectFile6
	moveq	#$03,d2	
	cmp.b	#'R',d0
	beq.s	ProtectFile5
	moveq	#$02,d2
	cmp.b	#'W',d0
	beq.s	ProtectFile5
	moveq	#$01,d2
	cmp.b	#'E',d0
	beq.s	ProtectFile5
	moveq	#$00,d2
	cmp.b	#'D',d0
	beq.s	ProtectFile5
	bra.s	ProtectFile4
ProtectFile5:
	bclr	d2,d1
	bra.s	ProtectFile4
ProtectFile6:
	bset	d2,d1
	bra	ProtectFile4
ProtectFile7:
	move.l	d1,$140(a4)		;Set Protect
	move.l	a4,d0
	bsr	CheckSumBlock
	move.l	a4,a0
	move.l	d4,d0
	bsr	WriteBlock
	bsr	WriteLastTrack
	movem.l	(a7)+,a0-a6/d1-d7
	rts
	
RenameFile:		;a0=Filename1 , a1=Filename2
	movem.l	a0-a6/d1-d7,-(a7)
	move.l	a0,a3
	move.b	$11d(a6),$11c(a6)
	move.l	$7e(a6),a4		;Rootblock
RenameFile1:
	move.b	(a3)+,d0
	beq.s	RenameFile3	;File/Directory
	cmp.b	#'/',d0
	beq.s	RenameFile2	;Directory
	cmp.b	#':',d0
	bne.s	RenameFile1	;Drive
	move.b	-2(a3),d0
	and.b	#$03,d0
	move.b	d0,$11c(a6)
	move.l	$7a(a6),a4
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	ReadBlock
	move.l	a3,a0
	bra.s	RenameFile1
RenameFile2:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$05,d7
	tst.l	d0
	bmi	ErrorHandler	;Directory not found
	move.l	a3,a0
	bra.s	RenameFile1
RenameFile3:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$04,d7
	tst.l	d0
	bmi	ErrorHandler		;File/Directory not found
	cmp.l	#$00000001,$1fc(a4)
	beq	ErrorHandler
	move.w	$13a(a6),d5
	move.w	$13c(a6),d6
	move.l	$13e(a6),a0
	move.l	$4(a4),d0
	bsr	ReadBlock
	move.l	a1,a3
	move.l	a1,a0
	move.l	$7e(a6),a4		;Rootblock
RenameFile4:
	move.b	(a3)+,d0
	beq.s	RenameFile6	;File/Directory
	cmp.b	#'/',d0
	beq.s	RenameFile5	;Directory
	cmp.b	#':',d0
	bne.s	RenameFile4	;Drive
	moveq	#$0b,d4
	move.b	-2(a3),d0
	and.b	#$03,d0
	cmp.b	$11c(a6),d0
	bne	ErrorHandler
	move.l	$7a(a6),a4
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	ReadBlock
	move.l	a3,a0
	bra.s	RenameFile4
RenameFile5:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$05,d7
	tst.l	d0
	bmi	ErrorHandler	;Directory not found
	move.l	a3,a0
	bra.s	RenameFile4
RenameFile6:
	bsr	CheckRootBlock
	move.l	$4(a4),d4
	cmp.l	#$00000001,$1fc(a4)
	bne.s	RenameFile6a
	move.l	#$00000370,d4
RenameFile6a:
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	move.l	a0,a2
	bsr	SearchHash
	moveq	#$0a,d7
	tst.l	d0
	beq	ErrorHandler		;File/Directory exists !
	move.l	$13e(a6),a3
	lea	$1b1(a3),a1
	moveq	#$ffffffff,d0
RenameFile7:
	addq.w	#1,d0
	move.b	(a2)+,(a1)+
	bne.s	RenameFile7
	move.b	d0,$1b0(a3)
	move.l	d4,$1f4(a3)
	move.w	$13a(a6),d0
	ext.l	d0
	cmp.l	$4(a3),d0
	beq.s	RenameFile8
	move.l	d5,d0
	move.l	a4,a0
	bsr	ReadBlock
	move.l	$1f0(a3),0(a4,d6.w)
	clr.l	$1f0(a3)
	move.l	a4,d0
	bsr	CheckSumBlock
	move.l	d5,d0
	move.l	a4,a0
	bsr	WriteBlock
	move.w	$13a(a6),d0
	move.l	a4,a0
	bsr	ReadBlock
	move.w	$13c(a6),d0
	move.l	$4(a3),0(a4,d0.w)
	move.l	a4,d0
	bsr	CheckSumBlock
	move.w	$13a(a6),d0
	move.l	a4,a0
	bsr	WriteBlock
RenameFile8:
	move.l	a3,d0
	bsr	CheckSumBlock
	move.l	$4(a3),d0
	move.l	a3,a0
	bsr	WriteBlock
	bsr	WriteLastTrack
	movem.l	(a7)+,a0-a6/d1-d7
	rts
	
RelabelDisk:		;a0=DiskName
	movem.l	a0-a6/d1-d7,-(a7)
	move.l	a0,a1
	move.l	$7a(a6),a4		;Rootblock
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	ReadBlock
	moveq	#$02,d7
	cmp.l	#$00000001,$1fc(a4)
	bne	ErrorHandler
	lea	$1b1(a4),a0		;Name
	moveq	#$ffffffff,d0
RelabelDisk1:
	addq.l	#1,d0
	move.b	(a1)+,(a0)+
	bne.s	RelabelDisk1
	move.b	d0,$1b0(a4)
	move.l	a4,d0
	bsr	CheckSumBlock
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	WriteBlock
	bsr	WriteLastTrack
	movem.l	(a7)+,a0-a6/d1-d7
	rts
	
TypeFile:		;a0=filename
	movem.l	a0-a6/d1-d7,-(a7)
	move.l	a0,a3
	move.b	$11d(a6),$11c(a6)
	move.l	$7e(a6),a4		;Rootblock
TypeFile1:
	move.b	(a3)+,d0
	beq.s	TypeFile3	;FileName
	cmp.b	#'/',d0
	beq.s	TypeFile2	;Directory
	cmp.b	#':',d0
	bne.s	TypeFile1	;Drive
	move.b	-2(a3),d0
	and.b	#$03,d0
	move.b	d0,$11c(a6)
	move.l	$7a(a6),a4
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	ReadBlock
	move.l	a3,a0
	bra.s	TypeFile1
TypeFile2:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$05,d7
	tst.l	d0
	bmi	ErrorHandler	;Directory not found
	move.l	a3,a0
	bra.s	TypeFile1
TypeFile3:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$04,d7
	tst.l	d0
	bmi	ErrorHandler	;File not found
	cmp.l	#$fffffffd,$1fc(a4)
	bne	ErrorHandler	;File not found
	moveq	#$0a,d0
	jsr	_WriteChar(a6)
	move.l	$10(a4),d0	;first datablock
TypeFile6:
	divu	#11,d0
	move.w	d0,d4		;d4=tracknr 0-159
	swap	d0
	move.w	d0,d5		;d5=sectornr 0-10
	move.b	$11c(a6),d0
	cmp.b	$124(a6),d0
	bne.s	TypeFile7
	cmp.b	$125(a6),d4
	beq.s	TypeFile8
TypeFile7:
	move.w	d4,d0
	moveq	#$02,d7
	cmp.w	#$009f,d0
	bhi	ErrorHandler		;Load error
	bsr	ReadTrack
TypeFile8:
	ext.w	d5
	ext.l	d5
	lsl.w	#8,d5
	add.w	d5,d5
	move.l	$120(a6),a1
	add.l	d5,a1
	move.l	$0c(a1),d1		;Block length
	beq.s	TypeFile11
	move.l	$10(a1),d6		;Next block
	lea	$18(a1),a1		;Start of data
TypeFile9:
	tst.w	$5e(a6)			;Start of Line
	bne.s	TypeFile10
	bsr	WaitIfCtrl
	jsr	_ReadKeyboard(a6)
	cmp.b	#$1b,d0
	beq.s	TypeFile12
TypeFile10:
	move.b	(a1)+,d0
	jsr	_WriteChar(a6)
	subq.w	#1,d1
	bne.s	TypeFile9	
TypeFile11:
	move.l	d6,d0
	tst.l	d0
	bne	TypeFile6
TypeFile12:
	tst.w	$5e(a6)
	beq.s	TypeFile13
	moveq	#$0a,d0
	jsr	_WriteChar(a6)
TypeFile13:
	movem.l	(a7)+,a0-a6/d1-d7
	rts

DeleteFile:			;a0=filename
	movem.l	d1/d5-d7/a0/a3/a4/a6,-(a7)
	move.l	a0,a3
	move.b	$11d(a6),$11c(a6)
	move.l	$7e(a6),a4		;Rootblock
DeleteFile1:
	move.b	(a3)+,d0
	beq.s	DeleteFile3	;FileName
	cmp.b	#'/',d0
	beq.s	DeleteFile2	;Directory
	cmp.b	#':',d0
	bne.s	DeleteFile1	;Drive
	move.b	-2(a3),d0
	and.b	#$03,d0
	move.b	d0,$11c(a6)
	move.l	$7a(a6),a4
	move.l	a4,a0
	move.w	#$0370,d0
	bsr	ReadBlock
	move.l	a3,a0
	bra.s	DeleteFile1
DeleteFile2:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$05,d7
	tst.l	d0
	bmi	ErrorHandler	;Directory not found
	move.l	a3,a0
	bra.s	DeleteFile1
DeleteFile3:
	bsr	CheckRootBlock
	move.l	a3,d0
	sub.l	a0,d0
	subq.l	#1,d0
	bsr	SearchHash
	moveq	#$04,d7
	tst.l	d0
	bmi	ErrorHandler	;File/Directory not found
	bra.s	DeleteFile3b
DeleteFile3a:			;Entry from SaveFile module
	movem.l	d1/d5-d7/a0/a3/a4/a6,-(a7)
DeleteFile3b:
	cmp.l	#$00000002,(a4)
	bne	ErrorHandler	;File/Directory not found
	bsr	ReadBamBlock
	move.l	d0,d5		;BamBlockNr
	move.l	$1f0(a4),d6	;Next Hash
DeleteFile4:
	move.l	$4(a4),d0
	bsr	FreeBlock
	cmp.l	#$00000002,$1fc(a4)
	bne	DeleteFile6	;Not Directory
	moveq	#$18,d0
	moveq	#$07,d7		;Directory not empty error
DeleteFile5:
	tst.l	0(a4,d0.w)
	bne	ErrorHandler
	addq.w	#4,d0
	cmp.w	#$138,d0
	bne.s	DeleteFile5
	bra.s	DeleteFile8
DeleteFile6:
	moveq	#$18,d1
DeleteFile7:
	move.l	0(a4,d1.w),d0
	bsr	FreeBlock
	addq.w	#4,d1
	cmp.w	#$138,d1
	bne.s	DeleteFile7
	move.l	$1f8(a4),d0
	beq.s	DeleteFile8
	move.l	a4,a0
	bsr	ReadBlock
	bra.s	DeleteFile4
DeleteFile8:
	move.l	$13e(a6),a0
	move.l	a0,d0
	bsr	CheckSumBamBlock
	move.l	d5,d0			;Write BamBlock
	bsr	WriteBlock
	move.l	a4,a0
	move.w	$13a(a6),d0
	bsr	ReadBlock
	move.w	$13c(a6),d0
	move.l	d6,0(a4,d0.w)
	move.l	a4,d0
	bsr	CheckSumBlock
	move.l	a4,a0
	move.w	$13a(a6),d0
	bsr	WriteBlock
	bsr	WriteLastTrack
	movem.l	(a7)+,d1/d5-d7/a0/a3/a4/a6
	rts

CheckSumBlock:				;d0=address of block
	movem.l	d1/a0,-(a7)
	move.l	d0,a0
	clr.l	$14(a0)
	moveq	#$7f,d0
	moveq	#$00,d1
CheckSumBlock1:
	add.l	(a0)+,d1
	dbf	d0,CheckSumBlock1
	neg.l	d1
	move.l	d1,$fffffe14(a0)
	movem.l	(a7)+,d1/a0
	rts

CheckSumBootBlock:			;d0=adress of bootblock
	movem.l	d1/a0,-(a7)
	move.l	d0,a0
	clr.l	$4(a0)
	move.w	#$00ff,d0
	moveq	#$00,d1
	moveq	#$00,d2
CheckSumBootBlock1:
	add.l	(a0)+,d1
	addx.l	d2,d1
	dbf	d0,CheckSumBootBlock1
	not.l	d1
	move.l	d1,$fffffc04(a0)
	movem.l	(a7)+,d1/a0
	rts

CheckSumBamBlock:			;d0=adress of bamblock
	movem.l	d1/a0,-(a7)
	move.l	d0,a0
	clr.l	(a0)
	moveq	#$7f,d0
	moveq	#$00,d1
CheckSumBamBlock1:
	add.l	(a0)+,d1
	dbf	d0,CheckSumBamBlock1
	neg.l	d1
	move.l	d1,$fffffe00(a0)
	movem.l	(a7)+,d1/a0
	rts

GetFreeBlockI:				;Get Free DataBlock
					;d0=First Block To Search ($36f)
					;d0out=FreeBlockNr
	movem.l	d1-d3/a0/a6,-(a7)
	move.l	$13e(a6),a0
	ext.l	d0
GetFreeBlockI1:
	move.l	d0,d1
	subq.w	#2,d1
	move.l	d1,d2
	and.w	#$001f,d1
	lsr.w	#3,d2
	and.w	#$01fc,d2
	moveq	#$00,d3
	bset	d1,d3
	and.l	4(a0,d2.w),d3
	bne.s	GetFreeBlockI2
	cmp.w	#$0371,d0
	beq.s	GetFreeBlockI3
	subq.w	#1,d0
	cmp.w	#$0001,d0
	bne.s	GetFreeBlockI1
	move.w	#$06df,d0
	bra.s	GetFreeBlockI1
GetFreeBlockI2:
	moveq	#$ffffffff,d3
	bclr	d1,d3
	and.l	d3,4(a0,d2.w)
	movem.l	(a7)+,d1-d3/a0/a6
	rts
GetFreeBlockI3:
	moveq	#$ffffffff,d0		;Disk Full
	movem.l	(a7)+,d1-d3/a0/a6
	rts
	
GetFreeBlockII:				;Get Free InfoBlock
					;d0=First Block To Search ($371)
					;d0out=FreeBlockNr
	movem.l	d1-d3/a0/a6,-(a7)
	move.l	$13e(a6),a0
	ext.l	d0
GetFreeBlockII1:
	move.l	d0,d1
	subq.w	#2,d1
	move.l	d1,d2
	and.w	#$001f,d1
	lsr.w	#3,d2
	and.w	#$01fc,d2
	moveq	#$00,d3
	bset	d1,d3
	and.l	4(a0,d2.w),d3
	bne.s	GetFreeBlockII2
	addq.w	#1,d0
	cmp.w	#$0370,d0
	beq.s	GetFreeBlockII3
	cmp.w	#$06e0,d0
	bne.s	GetFreeBlockII1
	moveq	#$02,d0
	bra.s	GetFreeBlockII1
GetFreeBlockII2:
	moveq	#$ffffffff,d3
	bclr	d1,d3
	and.l	d3,4(a0,d2.w)
	movem.l	(a7)+,d1-d3/a0/a6
	rts
GetFreeBlockII3:
	moveq	#$ffffffff,d0		;Disk Full
	movem.l	(a7)+,d1-d3/a0/a6
	rts

FreeBlock:
					;d0=BlockNr to Free
	movem.l	d1-d3/a0/a6,-(a7)
	move.l	$13e(a6),a0
	ext.l	d0
	move.l	d0,d1
	subq.w	#2,d1
	move.l	d1,d2
	and.w	#$001f,d1
	lsr.w	#3,d2
	and.w	#$01fc,d2
	moveq	#$00,d3
	bset	d1,d3
	or.l	d3,4(a0,d2.w)
	movem.l	(a7)+,d1-d3/a0/a6
	rts

GetNumUsedBlock:
	movem.l	d1-d4/a0/a6,-(a7)
	move.l	$13e(a6),a0
	moveq	#$00,d4
	moveq	#$02,d0
GetNumUsedBlock1:
	ext.l	d0
	move.l	d0,d1
	subq.w	#2,d1
	move.l	d1,d2
	and.w	#$001f,d1
	lsr.w	#3,d2
	and.w	#$01fc,d2
	moveq	#$00,d3
	bset	d1,d3
	and.l	4(a0,d2.w),d3
	bne.s	GetNumUsedBlock2
	addq.l	#1,d4
GetNumUsedBlock2:
	addq.l	#1,d0
	cmp.w	#1760,d0
	bne.s	GetNumUsedBlock1
	move.l	d4,d0
	movem.l	(a7)+,d1-d4/a0/a6
	rts

ReadBamBlock:
	movem.l	a0/a6,-(a7)
	move.l	$13e(a6),a0
	move.w	#$0370,d0		;RootBlock
	bsr	ReadBlock
	moveq	#$06,d7
	cmp.l	#$ffffffff,$138(a0)
	bne	ErrorHandler		;Disk not validated error
	move.l	$13c(a0),d0
	move.l	$13e(a6),a0
	move.l	d0,-(a7)
	bsr	ReadBlock
	move.l	(a7)+,d0
	movem.l	(a7)+,a0/a6
	rts

DiskCopy:				;Copy Disk
	movem.l	d1-d5/a6,-(a7)
	move.l	d0,d4			;Source Drive
	move.l	d1,d5			;Destin Drive
	moveq	#$0a,d0
	jsr	_WriteChar(a6)
	move.l	#1000,d1
	moveq	#$00,d3
DiskCopy1:
	clr.w	$5e(a6)
	lea	DiskCopyText1(pc),a0
	jsr	_WriteString(a6)
	move.l	d3,d0
	jsr	_WriteDecNumberII(a6)
	jsr	_ClearToEOL(a6)
	move.b 	d4,$11c(a6)
	move.l	d3,d0
	bsr	ReadTrack
	clr.w	$5e(a6)
	lea	DiskCopyText2(pc),a0
	jsr	_WriteString(a6)
	move.l	d3,d0
	jsr	_WriteDecNumberII(a6)
	jsr	_ClearToEOL(a6)
	move.b	d5,$11c(a6)
	move.l	d3,d0
	bsr	WriteTrack
	addq.w	#1,d3
	cmp.w	#$00a0,d3
	bne.s	DiskCopy1
	movem.l	(a7)+,d1-d5/a6
	rts

DiskCopyText1:
	dc.b	"* Reading Track ",0
DiskCopyText2:
	dc.b	"* Writing Track ",0
	even

FormatDisk:				;Format Disk
	movem.l	d1/a0-a2/a6,-(a7)
	move.l	d0,a2
	move.b	#$ff,$124(a6)
	move.l	$120(a6),a0		;Track buffer
	move.l	#$444f5300,d0
	move.w	#$057f,d1
FormatDisk1:
	move.l	d0,(a0)+
	addq.b	#1,d0
	dbf	d1,FormatDisk1
	moveq	#$0a,d0
	jsr	_WriteChar(a6)
	moveq	#00,d0
	move.l	#1000,d1
FormatDisk2:
	move.l	d0,-(a7)
	clr.w	$5e(a6)
	lea	FormatDiskText1(pc),a0
	jsr	_WriteString(a6)
	move.l	(a7),d0
	jsr	_WriteDecNumberII(a6)
	jsr	_ClearToEOL(a6)
	move.l	(a7)+,d0
	bsr	WriteTrack		;Clean Track
	addq.w	#1,d0
	cmp.w	#$00a0,d0
	bne.s	FormatDisk2
	move.l	$7a(a6),a0		;Blockbuffert
	move.l	a0,a1		
	moveq	#$7f,d0
FormatDisk3:
	clr.l	(a1)+
	dbf	d0,FormatDisk3
	move.l	#$00000002,(a0)
	move.l	#$00000001,$1fc(a0)
	move.l	#$00000048,$c(a0)
	move.l	#$ffffffff,$138(a0)
	move.l	#$00000371,$13c(a0)
	lea	$1b1(a0),a1
	moveq	#$ffffffff,d1
FormatDisk4:
	addq.b	#1,d1
	move.b	(a2)+,(a1)+
	bne.s	FormatDisk4
	move.b	d1,$1b0(a0)
	move.l	a0,d0
	bsr	AttachDate
	move.l	$1a4(a0),$1e4(a0)
	move.l	$1a8(a0),$1e8(a0)
	move.l	$1ac(a0),$1ec(a0)
	move.l	a0,d0
	bsr	CheckSumBlock
	move.w	#$0370,d0
	bsr	WriteBlock
	move.l	$13e(a6),a0		;Bambuffert
	move.l	a0,a1
	moveq	#$37,d0
	moveq	#$ffffffff,d1
FormatDisk5:
	move.l	d1,(a1)+
	dbf	d0,FormatDisk5
	moveq	#$47,d0
FormatDisk6:
	clr.l	(a1)+
	dbf	d0,FormatDisk6
	move.l	#$ffff3fff,$70(a0)
	move.l	#$3fffffff,$dc(a0)
	move.l	a0,d0
	bsr	CheckSumBamBlock
	move.w	#$0371,d0
	bsr	WriteBlock
	bsr	WriteLastTrack
	movem.l	(a7)+,d1/a0-a2/a6
	rts

FormatDiskText1:
	dc.b	"* Formatting Track ",0
	even

