;
;[1m[32m        ____     ___        ___     ___ ___ ___ ___ ____      ___ ___ ___[0m
;[1m[32m         /  /__//_         /__ /  //_ //__ /  //_    /  / / //_ //__//_  [0m
;[1m[32m        /  /  //__        ___//__//__/___//__//     /  /_/_//  //  \/__  [0m
;
;[1m[32m-----------------------------------------------------------------------------[0m
;   - FOR ABO'S CONTACT US AT:   BP:28 1170 WATERMAEL-BOITSFORT 1 BELGIUM!!...
;
;[1m[32m-----------------------------------------------------------------------------[0m
;                           - DON'T SEND ANY DISKS -
;
;[1m[32m-----------------------------------------------------------------------------[0m
;
;
;
;                      [33m THE LEGENDARY >> SUBSOFTWARE << IN 87/88/89/90/91!!...
;                      [1m[32m ------------------------------------------------------
;

	incdir	"include:"
	include	"libraries/dos.i"
	include	"libraries/dosextens.i"
	include	"libraries/filehandler.i"
	include	"libraries/dos_lib.i"
	include	"exec/exec_lib.i"

	opt	o+,ow-

; *****	Macros
EXEC	MACRO
	move.l	$4.w,a6
	jsr	_LVO\1(a6)
	ENDM

DOS	MACRO
	move.l	(a5),a6
	jsr	_LVO\1(a6)
	ENDM

; *****	Définition des variables
	rsreset
DosBase	rs.l	1
stdin	rs.l	1
stdout	rs.l	1
devinfo	rs.l	1
VARSIZE	rs.w	0

; *****	C'est parti !
Start	lea	VARS(pc),a5
	moveq	#RETURN_FAIL,d7

	lea	dosname(pc),a1
	moveq	#0,d0
	EXEC	OpenLibrary
	move.l	d0,(a5)
	beq.s	NoDos

	DOS	Input
	move.l	d0,stdin(a5)
	beq.s	Exit

	DOS	Output
	move.l	d0,stdout(a5)
	beq.s	Exit

	move.l	(a5),a0	; DosLibrary
	move.l	dl_Root(a0),a0	; DosLibrary->RootInfo
	move.l	rn_Info(a0),a0	; RootInfo->DosInfo
	adda.l	a0,a0	; Conversion BCPL
	adda.l	a0,a0	;     ""      ""
	move.l	di_DevInfo(a0),d0	; 1er device
	beq.s	Exit	; Pas de device ?!?
	lsl.l	#2,d0	; Conversion BCPL
	move.l	d0,devinfo(a5)

	bsr.s	ListDevices
	bsr	ListDirectories
	bsr	ListVolumes

	moveq	#RETURN_OK,d7

Exit	move.l	(a5),a1
	EXEC	CloseLibrary

NoDos	move.l	d7,d0
	rts

; *****	Liste les devices de type DLT_DEVICE
ListDevices:
	lea	msg1(pc),a0
	bsr	PrintBSTR

	move.l	devinfo(a5),a2
DevicesLoop:
	bsr	CheckBreak

	cmpi.l	#DLT_DEVICE,dn_Type(a2)
	bne.s	NextDevice

	movea.l	dn_Name(a2),a0	; Nom du device dans a0
	adda.l	a0,a0	; Conversion BPCL
	adda.l	a0,a0	;     ""      ""
	bsr	PrintBSTR	; Affiche le nom

	lea	tab(pc),a0
	bsr	PrintBSTR

	move.l	dn_Handler(a2),d0
	beq.s	NoHandler	; Certains n'ont pas de Handler
	lsl.l	#2,d0
	movea.l	d0,a0
	bsr	PrintBSTR
	bra.s	NewLine

NoHandler:
	move.l	dn_Startup(a2),d0
	cmpi.l	#21,d0
	bcs.s	NewLine
	lsl.l	#2,d0
	move.l	d0,a0
	move.l	fssm_Device(a0),a0
	adda.l	a0,a0
	adda.l	a0,a0
	bsr	PrintBSTR

NewLine	lea	crlf(pc),a0	; Passage à la ligne
	bsr	PrintBSTR

NextDevice:
	move.l	dn_Next(a2),d0	; Device suivant dans d0
	lsl.l	#2,d0	; Conversion BCPL
	movea.l	d0,a2
	bne.s	DevicesLoop	; Boucle jusqu'au dernier

LastDevice:
	rts

; *****	Liste les devices de type DLT_DIRECTORY
ListDirectories:
	lea	msg2(pc),a0
	bsr	PrintBSTR

	move.l	devinfo(a5),a2
DirectoriesLoop:
	bsr.s	CheckBreak

	cmpi.l	#DLT_DIRECTORY,dn_Type(a2)
	bne.s	NextDirectory	; Pas celui demandé

	movea.l	dn_Name(a2),a0	; Nom du device dans a0
	adda.l	a0,a0	; Conversion BPCL
	adda.l	a0,a0	;     ""      ""
	bsr.s	PrintBSTR	; Affiche le nom

	lea	crlf(pc),a0
	bsr.s	PrintBSTR

NextDirectory:
	move.l	dn_Next(a2),d0	; Device suivant dans d0
	lsl.l	#2,d0
	movea.l	d0,a2
	bne.s	DirectoriesLoop	; Boucle jusqu'au dernier

LastDirectory:
	rts

; *****	Liste les devices de type DLT_VOLUME
ListVolumes:
	lea	msg3(pc),a0
	bsr.s	PrintBSTR

	move.l	devinfo(a5),a2
VolumesLoop:
	bsr.s	CheckBreak

	cmpi.l	#DLT_VOLUME,dn_Type(a2)
	bne.s	NextVolume	; Pas celui demandé

	movea.l	dn_Name(a2),a0	; Nom du device dans a0
	adda.l	a0,a0	; Conversion BPCL
	adda.l	a0,a0	;     ""      ""
	bsr.s	PrintBSTR	; Affiche le nom

	lea	crlf(pc),a0	; Passage à la ligne
	bsr.s	PrintBSTR

NextVolume:
	move.l	dn_Next(a2),d0	; Device suivant dans d0
	lsl.l	#2,d0
	movea.l	d0,a2
	bne.s	VolumesLoop	; Boucle jusqu'au dernier

LastVolume:
	rts

; *****	Vérifie si CTRL/C est pressé
CheckBreak:
	moveq	#0,d0
	move.l	d0,d1
	EXEC	SetSignal
	andi.l	#SIGBREAKF_CTRL_C,d0
	bne.s	Broken
	rts

Broken	addq.l	#8,sp	; Corrige la pile (2 fois bsr)
	lea	msg4(pc),a0	; Affiche le message 'BREAK'
	bsr.s	PrintBSTR
	moveq	#RETURN_WARN,d7	; Code d'erreur dans d7
	bra	Exit	; Saut à 'Exit'

; *****	Affiche une chaine BCPL pointée par a0
PrintBSTR:
	moveq	#0,d3
	move.b	(a0)+,d3
	move.l	a0,d2
	move.l	stdout(a5),d1
	DOS	Write
	rts

; *****	Domaine des variables
VARS	dcb.b	VARSIZE,0

dosname	DOSNAME

msg1	dc.b	m1end-m1str
m1str	dc.b	$9b,"1m",$9b,"4m"
	dc.b	"Devices 'physiques' (DLT_DEVICE) :"
	dc.b	$9b,"0m",10
m1end	even

msg2	dc.b	m2end-m2str
m2str	dc.b	10,$9b,"1m",$9b,"4m"
	dc.b	"Devices 'logiques' (DLT_DIRECTORY) :"
	dc.b	$9b,"0m",10
m2end	even

msg3	dc.b	m3end-m3str
m3str	dc.b	10,$9b,"1m",$9b,"4m"
	dc.b	"Devices 'volumes' (DLT_VOLUME) :"
	dc.b	$9b,"0m",10
m3end	even

msg4	dc.b	m4end-m4str
m4str	dc.b	10,"*** Break",10
m4end	even

tab	dc.b	1,9
crlf	dc.b	1,10

