*----------------------------------------------------------------------------
*
*	Programm: Drive-Music
*			
*	-=mb=- Mai-88
*
*	mit Aztec-C V3.6a Assembler
*
*----------------------------------------------------------------------------

	FAR	CODE
	FAR	DATA

*********************************************************************
*	CUSTOM-REGISTER
*********************************************************************
CUSTOM		EQU	$DFF000
INTREQR		EQU	$01E
DSKPT		EQU	$020
DSKLEN		EQU	$024
DSKSYNC		EQU	$07E
DMACON		EQU	$096
INTENA		EQU	$09A
INTREQ		EQU	$09C
ADKCON		EQU	$09E
********************************************************************
*	DMA BITS
*********************************************************************
DMAF_SETCLR    EQU   $8000
DMAF_DISK      EQU   $0010
********************************************************************
*	INTERRUPT BITS
*********************************************************************
INTF_DSKBLK    EQU   (1<<1)

*********************************************************************
*	Betriebssystem-Funktionen
*********************************************************************
ExecBase	EQU	4
*****	exec - library
Disable		EQU	-120
Enable		EQU	-126
CloseLibrary	EQU	-414	;A1		library
OpenLibrary	EQU	-552	;A1,D0		libname,version
*****	dos - library
Open		EQU	-30	;D1/D2		name,accessMode
Close		EQU	-36	;D1		file
Write		EQU	-48	;D1/D2/D3	file,buffer,length
Output		EQU	-60

*	spezielle Konstanten
SEEKDELAY	EQU	5000

*----------------------------------------------------------------------------
*	MAIN - Program
*----------------------------------------------------------------------------
Start:
		MOVEM.L	D1-D7/A0-A6,-(A7)

		MOVE.B	(A0),D0
		SUB.B	#'0',D0
		BCS	Usage
		CMP.B	#4,D0
		BCC	Usage
		AND.L	#3,D0
		MOVE.L	D0,drive

		BSR	OpenDos

		BSR	WriteString
		DC.B	"Drive-Music V1.0",$0a,0

*	Wir gehen direkt auf die Hardware, deshalb Multitasking abschalten
		MOVE.L	4,A6
		JSR	Disable(A6)
		MOVE.W	#DMAF_SETCLR+DMAF_DISK,CUSTOM+DMACON
		MOVE.W	#$7f00,CUSTOM+ADKCON	;Diskformatparameter setzen
		MOVE.W	#$8500,CUSTOM+ADKCON
		MOVE.W	#$4489,DSKSYNC+CUSTOM	;Syncwort setzen

*----------------------------------------------------------------------------
*	Track 0 suchen
		MOVE.L	drive,D0
		BSR	MotorOn
		BSR	Seek0
		MOVE.L	D0,oldcyl		;Alten Zylinder merken
*----------------------------------------------------------------------------
*	Kopf von Spur 0 bis 79 fahren
		MOVE.L	#0,D7			;Aktueller Zylinder
MusicL1:
		MOVE.L	drive,D0
		MOVE.L	D7,D1
		BSR	SeekCyl

		ADD.L	#1,D7
		CMP.L	#80,D7
		BNE	MusicL1
*----------------------------------------------------------------------------
*	Aufraeumen
CleanUp:
		MOVE.L	drive,D0
		MOVE.L	oldcyl,D1
		BSR	SeekCyl
		BSR	DeSelect

		MOVE.L	4,A6
		JSR	Enable(A6)

		BSR	WriteString
		DC.B	"Fertig !!!",$0a,0
		BRA	CloseDosJ1
Usage:
		BSR	OpenDos
		BSR	WriteString
		DC.B	"Aufruf: DriveMusic Laufwerk-#",$0a,0
		DS.W	0
CloseDosJ1:
		BSR	CloseDos
		MOVEM.L	(A7)+,D1-D7/A0-A6
		CLR.L	D0
		RTS
*----------------------------------------------------------------------------
Select:
*----------------------------------------------------------------------------
*	Laufwerk selektieren
*	D0: Laufwerk-Nr
		MOVE.L	D0,-(A7)
		ADD.L	#3,D0
		OR.B	#%01111000,$BFD100
		BCLR	D0,$BFD100
SelectL1:
		BTST	#5,$BFE001
		BNE	SelectL1
		MOVE.L	(A7)+,D0
		RTS
*----------------------------------------------------------------------------
DeSelect:
*----------------------------------------------------------------------------
*	Laufwerk deselektieren
*	D0: Laufwerk-Nr
		MOVE.L	D0,-(A7)
		ADD.L	#3,D0
		BSET	D0,$BFD100
		MOVE.L	(A7)+,D0
		RTS
*----------------------------------------------------------------------------
MotorOn:
*----------------------------------------------------------------------------
*	Motor einschalten
*	D0: Laufwerk-Nr
		BSR	DeSelect
		BCLR	#7,$BFD100
		BSR	Select
		RTS
*----------------------------------------------------------------------------
Seek0:
*----------------------------------------------------------------------------
*	Faehrt Kopf auf Zylinder 0
		MOVEM.L	A0/D0-D2,-(A7)

		BSR	Select
		BSET	#1,$BFD100		;fahre nach aussen
		CLR.L	D2
Seek0L1:
		MOVE.W	#SEEKDELAY,D1
Seek0L2:
		DBF	D1,Seek0L2
		BTST	#4,$BFE001		;auf cyl 0 ?
		BEQ	Seek0End

		BCLR	#0,$BFD100		;Kopf einen Schritt bewegen
		NOP
		NOP
		BSET	#0,$BFD100
		ADD.L	#1,D2
		BRA	Seek0L1
Seek0End:
		EXT.L	D2
		MOVE.L	D2,(A7)			;Returncode = Alter Cylinder
		LEA	cylinders,A0
		MOVE.B	#0,(A0,D0)

		MOVEM.L	(A7)+,A0/D0-D2
		RTS
*----------------------------------------------------------------------------
SeekCyl:
*----------------------------------------------------------------------------
*	Kopf auf bestimmte Spur fahren
*	D0: Laufwerk
*	D1: gewuenschter Zylinder
		MOVEM.L	A0/D0-D2,-(A7)

		BSR	Select
		LEA	cylinders,A0
		MOVE.B	(A0,D0),D2
		MOVE.B	D1,(A0,D0)

		BSET	#1,$BFD100		;fahre nach aussen
		SUB.B	D1,D2			;alter Zyl > neuer Zyl ?
		BPL	MH1

		BCLR	#1,$BFD100		;fahre nach innen
		NEG.B	D2
MH1:
		TST.B	D2
		BEQ	MH3

		MOVE.W	#SEEKDELAY,D1
MH2:
		DBF	D1,MH2
		BCLR	#0,$BFD100		;Kopf einen Schritt bewegen
		NOP
		NOP
		BSET	#0,$BFD100

		SUB.B	#1,D2
		BRA	MH1
MH3:
		MOVEM.L	(A7)+,A0/D0-D2

		RTS
*----------------------------------------------------------------------------
*	DOS-Library oeffnen und Standard-Ausgabekanal oeffnen
*----------------------------------------------------------------------------
OpenDos:
		LEA	DosName,A1		;Open DOS Library
		CLR.L	D0
		MOVE.L	4,A6
		JSR	OpenLibrary(A6)
		MOVE.L	D0,DosBase		;Save DosBase for later

		MOVE.L	DosBase,A6
		JSR	Output(A6)
		MOVE.L	D0,FileHandle		;Filehandle fuer Ausgabe

		RTS
CloseDos:
		MOVE.L	DosBase,A1		;Be a good boy ...
		MOVE.L	4,A6
		JSR	CloseLibrary(A6)

		RTS
*----------------------------------------------------------------------------
WriteString:
*----------------------------------------------------------------------------
*	WriteString schreibt einen String auf Bildschirm
		MOVE.L	(A7),A0
		MOVE.L	A0,D2		;Buffer
WriteStringL1:
		TST.B	(A0)+
		BNE	WriteStringL1
		MOVE.L	A0,D3
		SUB.L	#1,D3
		MOVE.L	D3,D0
		SUB.L	D2,D3		;Length
		BCLR	#0,D0		;gerade Bytegrenze
		ADD.L	#2,D0
		MOVE.L	D0,(A7)
		MOVE.L	FileHandle,D1
		MOVE.L	DosBase,A6
		JMP	Write(A6)
*----------------------------------------------------------------------------
*	Daten
*----------------------------------------------------------------------------

	DSEG
DosBase:	DS.L	1
FileHandle:	DS.L	1
oldcyl:		DS.L	1
cylinders:	DS.B	4
drive:		DC.L	0
DosName:	DC.B	"dos.library",0

	END
