
; Directoryn latausohjelma (C) 1988 by TM


	include	"jmplibs.i"
	include	"numeric.i"
	include	"exec/types.i"
	include	"dos.i"
	include	"exec.xref"
	include	"dos.xref"

BUFFER	equ	16384			;Puskurin koko
FIB	equ	260			;FileInfoBlockin koko


; Pääohjelma

begin	openlib	Dos,clean		;Avaa Dos

	move.l	#BUFFER+FIB,d0		;Tavumäärä
	moveq	#0,d1			;Tyyppi
	lib	Exec,AllocMem		;Varaa muistia
	move.l	d0,mem			;Tallenna osoite
	beq	clean			;Ei muistia: virhe

	move.l	mem(pc),a0		;Jaa muisti
	move.l	a0,buffer		; nimipuskurin
	lea	BUFFER(a0),a0		; ja
	move.l	a0,fib			; FileInfoBlockin kesken

	bsr	asknam			;Kysy hakemiston nimi
	bsr	loaddir			;Lataa hakemisto
	bsr	typedir			;Tulosta hakemisto

clean	move.l	mem(pc),d0
	beq	clean1			;Muistia ei oltu saatu; ei vapauteta
	move.l	d0,a1			;Osoitin
	move.l	#BUFFER+FIB,d0		;Tavumäärä
	lib	Exec,FreeMem		;Vapauta muisti
	clr.l	buffer

clean1	closlib	Dos			;Sulje Dos
	moveq	#0,d0
	rts				;Poistu


; Aliohjelmat

asknam	print	<'Hakemiston nimi: '>	;Tulosta kysymys
	lib	Dos,Input		;Input File Handle
	move.l	d0,d1			;-> d1
	lea	inpbuf(pc),a0		;Puskurin osoite
	move.l	a0,d2			;-> d2
	moveq	#40,d3			;Maksimipituus -> d3
	lib	Dos,Read
	move.l	d2,a0
	clr.b	-1(a0,d0.l)		;Loppuun NULL
	rts

print10	push	all			;Tämä tulostaa 10-järjestelmän
	lea	inpbuf(pc),a0		; luvun D0:sta.
	numlib	put10
	lea	inpbuf(pc),a0
	printa	a0
	pull	all
	rts

loaddir	move.l	buffer(pc),a2		;Puskurin osoite
	clr.b	(a2)
	moveq.l	#0,d7			;Nollataan yhteispituus
	lea	inpbuf(pc),a0		;Nimen osoite
	move.l	a0,d1			;-> d1
	moveq	#ACCESS_READ,d2
	lib	Dos,Lock		;Lockataan hakemisto
	move.l	d0,lock
	bne	lddir1			;Ei virhettä
	print	<'Ei onnistu!',10>	;Virhe, valita
	rts
lddir1	move.l	lock(pc),d1		;Lock
	move.l	fib(pc),d2		;FileInfoBlock
	lib	Dos,Examine		;Saadaan hakemiston tiedot
	move.l	d2,a0			;fib -> a0
	tst.l	fib_DirEntryType(a0)	;Nimen tyyppi
	bpl	lddir2			;Directory, jatketaan
	print	<'Tämähän on tiedosto!',10>
	bra	lddir6			;tämä on tiedosto -> poistutaan

lddir2	move.l	lock(pc),d1		;Lock
	move.l	fib(pc),d2		;FileInfoBlock
	lib	Dos,ExNext		;Ensimmäinen nimi
	tst.l	d0
	beq	lddir6			;->Nimet loppuivat
	move.l	d2,a0			;fib -> a0
	add.l	fib_Size(a0),d7		;lisätään yhteispituuteen
	lea	fib_FileName(a0),a1	;Nimen osoite -> a1
lddir3	move.b	(a1)+,(a2)+		;Nimi puskuriin
	bne	lddir3
	tst.l	fib_DirEntryType(a0)	;Nimen tyyppi
	bmi	lddir5			;Ei directory, lis. vain rivinvaihto
	subq.l	#1,a2			;Nimi ei lopukaan
	lea	text1(pc),a1
lddir4	move.b	(a1)+,(a2)+		;Lisää nimeen " (dir)"
	bne	lddir4
lddir5	move.b	#10,-1(a2)		;Lisää nimen loppuun rivinvaihto...
	clr.b	(a2)+			; ja nolla
	bra	lddir2			;Seuraava nimi
lddir6	clr.b	(a2)			;Lisää puskurin loppuun ylim. NULL
	move.l	lock(pc),d1
	lib	Dos,UnLock		;Vapauta Lock
	move.l	d7,len			;Tallenna yhteispituus
	rts

typedir	move.l	buffer(pc),a2		;Puskurin alkuosoite
typdir1	move.l	a2,a0
	tst.b	(a0)			;Lisää nimiä?
	beq	typdir3			;Ei, lopeta
	printa	a0			;Tulosta teksti
typdir2	tst.b	(a2)+			;Etsi nimen loppu
	bne	typdir2
	bra	typdir1			;Seuraava
typdir3	print	<10,'Tiedostojen yhteispituus on '>
	move.l	len(pc),d0
	bsr	print10
	print	<' tavua.',10>
	rts

	numlib				;luvuntulostusrutiinikirjasto

; Muuttujat

mem	dc.l	0	;varatun muistin alku
buffer	dc.l	0	;nimipuskurin osoite
fib	dc.l	0	;FileInfoBlock-osoitin
lock	dc.l	0	;Lock-osoitin
len	dc.l	0	;yhteispituus

inpbuf	ds.b	44	;väliaikainen puskuri


; Tekstit

text1	dc.b	' (dir)',0
text2	dc.b	10,0

	libnames
	end


