
; Type2.s by Pierluigi Montanari. © 1991 by AmigaByte

; Alcuni offset di libreria...

OPENLIBRARY:	=	-552	 ;exec.library
CLOSELIBRARY: 	=	-414
ALLOCMEM:	=	-198
FREEMEM: 	=	-210

OPEN:		=	-30	 ;dos.library
CLOSE:		=	-36
READ:		=	-42
WRITE:		=	-48
OUTPUT:		=	-60
LOCK:		=	-84
UNLOCK: 	=	-90
EXAMINE:	=	-102

bra	start

FileInfoBlock:			 ;Struttura FileInfoBlock
fib_DiskKey:	dc.l	0
fib_DirEnType:  dc.l	0	 ;0 = file, >0 = directory
fib_Filename:	blk.b 108,0	 ;Nome del file (in ogni caso max. 30 car.)
		even
fib_Protection: dc.l	0	 ;Il tipo di protezione (scrittura, lettura
				 ;e cosi' via) cui è associato il file
fib_EntryType:	dc.l	0
fib_Size: 	dc.l	0	 ;Lunghezza del file
fib_NumBlocks:	dc.l	0
fib_Date: 	dc.l	0,0,0,0	 ;Ultima modifica
fib_Comment:	blk.b	120,0
fib_Reserved: 	blk.b	36,0
		even

start:	subq.l	#2,d0		;in d0 c'e' la lunghezza della stringa di
				;comando + 1 byte: togliamo il CR
	move.l	#File_Name,a1	;l'indirizzo per il titolo completo della
				;finestra in a1
loop1:	move.b	(a0)+,(a1)+	;copiamo la stringa dove vogliamo
	dbra	d0,loop1
	move.l	4,a6		;metti l' indirizzo di execbase in a6
	moveq	#0,d0		;qualsiasi versione di sistema operativo
	move.l	#DosName,a1	;indirizzo nome libreria Dos
	jsr	openlibrary(a6) ;esegui la routine openlibrary
	cmpi.l	#0,d0		;c'e' stato qualche errore?
	beq	Close1		;se d0 = 0 ,esci.
	move.l	d0,DosBase	;salva il puntatore in DosBase
	move.l	d0,a6		;metti il puntatore alla libreria dos in a6
	jsr	output(a6)	;ottiene un handle per l' output
	move.l	d0,CliHandle	;salva l' handle
				;la sua lunghezza
	move.l	#File_name,d1	;apre il file
	move.l	#1005,d2	;MODE_OLDFILE
	move.l	DosBase,a6	;metti il puntatore alla libreria dos in a6
	jsr	Open(a6)	;apri il file
	cmpi.l	#0,d0		;errore?
	beq	err2		;si',errore numero 2
	move.l	d0,FileHandle	;metti l' handle del file in FileHandle
	move.l	#File_Name,d1	;nome del file in d1
	moveq	#-2,d2		;ACCESS_READ
	move.l	DosBase,a6	;metti il puntatore alla libreria dos in a6
	jsr	Lock(a6)	;esegui Lock
	cmpi.l	#0,d0		;e' avvenuto un errore?
	beq	Err3		;si', errore numero 3
	move.l	d0,FileLock	;metti il Lock ottenuto in FileLock
	move.l	d0,d1		;esamina il file
	move.l	#FileInfoBlock,d2	;indirizzo FileInfoBlock in d2
	move.l	DosBase,a6	;metti il puntatore alla libreria dos in a6
	jsr	Examine(a6)	;chiama la routine examine
	cmpi.l	#0,d0		;errore?
	beq	Err4		;si',errore numero 4
	move.l	fib_size,d0	;prendiamo la lunghezza del file
	addi.l	#10,d0		;aggiungiamo una decina di bytes per
				;sicurezza
	move.l	#$10001,d1	;MEMF_PUBLIC|MEMF_CLEAR
	move.l	4,a6		;indirizzo di Exec
	jsr	AllocMem(a6)	;vogliamo la memoria libera!!!
	cmpi.l	#0,d0		;non c'è memoria ??
	beq	Err5		;siamo rovinati....
	move.l	d0,Memfree	;salva il puntatore alla zona di memoria
	move.l	d0,d2		;mettilo come indirizzo del buffer
	move.l	fib_Size,d3	;lunghezza del file
	addi.l	#10,d3		;qualche byte in più per sicurezza..
	move.l	FileHandle,d1	;prendi l'Handle associato al file
	move.l	DosBase,a6	;metti il puntatore alla libreria dos in a6
	jsr	Read(a6)	;carica in memoria il file
	cmpi.l	#-1,d0		;è avvenuto un errore in lettura?
	beq	Err6		;sì, esci
	move.l	#Window,d1	;a questo punto apriamo la finestra...
	move.l	#1005,d2	;MODE_OLDFILE
	move.l	DosBase,a6	;metti il puntatore alla libreria dos in a6
	jsr	Open(a6)	;apre la finestra raw:
	cmpi.l	#0,d0		;non si riesce ad aprire la memoria??
	beq	Err7		;sì, esci
	move.l	d0,RawHandle	;salva l' handle della finestra
	move.l	d0,d1		;metti l'handle del file in d1
	move.l	MemFree,d2	;indirizzo del testo
	move.l	fib_Size,d3	;lunghezza del testo
	move.l	DosBase,a6	;metti il puntatore alla libreria dos in a6
	jsr	Write(a6)	;scrivi nella window

WaitMouse:			;aspettiamo la pressione del tasto
	btst	#6,$bfe001	;sinistro del mouse...
	bne	waitmouse
	move.l	RawHandle,d1	;chiudiamo la finestra
	move.l	DosBase,a6	;metti il puntatore alla libreria dos in a6
	jsr	Close(a6)
	move.l	MemFree,a1	;liberiamo la memoria
	move.l	fib_Size,d0
	move.l	4,a6		;metti il puntatore alla libreria
				;exec in a6
	jsr	Freemem(a6)
close4: move.l	FileLock,d1	;"sblocchiamo" il file
	move.l	DosBase,a6	;metti il puntatore alla libreria dos in a6
	jsr	Unlock(a6)
close3: move.l	FileHandle,d1	;chiudiamo il file
	move.l	DosBase,a6	;metti il puntatore alla libreria dos in a6
	jsr	Close(a6)
close2: move.l	DosBase,a1	;indirizzo dos.library in a1
	move.l	4,a6		;indirizzo di execbase in a6
	jsr	closelibrary(a6);chiudi la libreria (IMPORTANTE!!)
  exit: moveq	#0,d0		;indica al cli che tutto e' finito
	rts			;ed esce
close1: moveq	#-1,d0		;indica errore al cli
	rts			;esce...

; Qui di seguito controlliamo gli errori che possono verificarsi...

Err2:	move.l	#StrErr2,a4
	bsr	TypErr
	bra	close2
Err3:	move.l	#StrErr3,a4
	bsr	TypErr
	bra	close3
Err4:	move.l	#StrErr4,a4
	bsr	TypErr
	bra	close4
Err5:	move.l	#StrErr5,a4
	bsr	TypErr
	bra	close4
Err6:	move.l	#StrErr6,a4
	bsr	TypErr
	bra	close4
Err7:	move.l	#StrErr7,a4
	bsr	TypErr
	bra	close4

; Questa routine si occupa di stampare il messaggio di errore

TypErr:	 move.l	 a4,a5		;indirizzo del codice errore
	 moveq	 #0,d3		;a zero d3 (la lunghezza)
TypErr1: addi.b	 #1,d3		;lunghezza in d3
	 cmpi.b	 #10,(a4)+	;a4 punta al valore 10?
	 bne	 TypErr1	;no , aumenta la lunghezza della stringa
	 move.l	 CliHandle,d1	;sì, metti l' handle in d1
	 move.l	 a5,d2		;indirizzo del testo in d2
	 move.l	 DosBase,a6	;metti il puntatore alla libreria dos in a6
	 jsr	 Write(a6)	;scrivi nella window del Cli
	 rts

StrErr2: dc.b	 'Errore: non trovo il file',10
StrErr3: dc.b	 'Errore: non ottengo il lock del file',10
StrErr4: dc.b	 'Errore: non posso esaminare il file',10
StrErr5: dc.b	 'Errore: non c'è sufficiente memoria liberà,10
StrErr6: dc.b	 'Errore: non riesco a leggere il file',10
StrErr7: dc.b	 'Errore: non riesco ad aprire la finestra',10
	 even
DosName: dc.b	 'dos.library',0 ;definisce il nome della libreria
	 even			 ;indirizzo pari (da mettere sempre dopo un
				 ;dc.b)
DosBase: dc.l	 0		 ;spazio di una long
CliHandle:
	 dc.l	 0		 ;spazio per l'handle di output sul cli
RawHandle:
	 dc.l	 0		 ;spazio per l'handle di output
FileHandle:
	 dc.l	 0		 ;spazio per l'handle del file
FileLock:
	 dc.l	 0		 ;spazio per il lock del file
MemFree: dc.l	 0		 ;puntatore alla zona di memoria in cui
				 ;verrà posto il file
Window:	 dc.b	 'RAW:0/0/640/256/Displaying file '
File_Name:
	 blk.b	 40,0		 ;spazio per il nome del file
	 even


  