* Il programma 'Hello World' scritto in Assembler 68000
* La versione in C è a pagina 2-10 dello Intuition Manual

* Questo codice sorgente è copyright 1987 della HiSoft

* Per Devpac Amiga versione 2 sono stati cambiati i seguenti
* simboli, ad evitare collisioni con i nuovi files di inclusione:
* Screen->MyScreen, NewScreen->MyNewScreen
* Window->MyWindow, NewWindow->MyNewWindow

	opt	c+,d+

	incdir	":include/"

	include	exec/exec_lib.i
	include	intuition/intuition.i
	include	intuition/intuition_lib.i
	include	graphics/graphics_lib.i
	include	graphics/text.i

INTUITION_REV	equ	33		v1.2
GRAPHICS_REV	equ	33		v1.2

* Apre libreria Intuition

	moveq	#100,d4			Codice di errore di default

	moveq	#INTUITION_REV,d0	Versione
	lea	int_name(pc),a1
	CALLEXEC OpenLibrary
	tst.l	d0
	beq	exit_false		Se fallito, esci
	move.l	d0,_IntuitionBase	Altrimenti salva il puntatore

	moveq	#GRAPHICS_REV,d0
	lea	graf_name(pc),a1
	CALLEXEC OpenLibrary
	tst.l	d0
	beq	exit_closeint		Se fallito, chiudi Intuition
	move.l	d0,_GfxBase

	lea	MyNewScreen(pc),a0
	CALLINT	OpenScreen		Apre schermo
	tst.l	d0
	beq	exit_closeall		Se fallito, chiudi ed esci
	move.l	d0,MyScreen

* Ora inizializziamo una struttura NewWindow. E' ovviamente più
* semplice ricorrere a linee con dc.w e dc.l, ma abbiamo fatto in
* questo modo per confronto con la versione C originale.

	lea	MyNewWindow(pc),a0	Buon posto per iniziare
	move.w	#20,nw_LeftEdge(a0)
	move.w	#20,nw_TopEdge(a0)
	move.w	#300,nw_Width(a0)
	move.w	#100,nw_Height(a0)
	move.b	#0,nw_DetailPen(a0)
	move.b	#1,nw_BlockPen(a0)
	move.l	#window_title,nw_Title(a0)

_temp	set	WINDOWCLOSE!SMART_REFRESH!ACTIVATE!WINDOWSIZING

	move.l	#_temp!WINDOWDRAG!WINDOWDEPTH,nw_Flags(a0)
	move.l	#CLOSEWINDOW,nw_IDCMPFlags(a0)
	move.w	#CUSTOMSCREEN,nw_Type(a0)
	clr.l	nw_FirstGadget(a0)
	clr.l	nw_CheckMark(a0)
	move.l	MyScreen(pc),nw_Screen(a0)
	clr.l	nw_BitMap(a0)
	move.w	#100,nw_MinWidth(a0)
	move.w	#25,nw_MinHeight(a0)
	move.w	#640,nw_MaxWidth(a0)
	move.w	#200,nw_MaxHeight(a0)

* Tutto a posto, ora apriamo la finestra (a0=nuova finestra)
	CALLINT	OpenWindow
	tst.l	d0
	beq	exit_closescr			Se fallito esci
	move.l	d0,MyWindow			salvalo

	move.l	d0,a1				finestra
	move.l	wd_RPort(a1),a1			rastport
	moveq	#20,d0				X
	moveq	#20,d1				Y
	CALLGRAF Move				Muove cursore

	move.l	MyWindow(pc),a0
	move.l	wd_RPort(a0),a1			rastport
	lea	hello_message(pc),a0
	moveq	#11,d0
	CALLGRAF Text				Scrive qualcosa

	move.l	MyWindow(pc),a0
	move.l	wd_UserPort(a0),a0
	move.b	MP_SIGBIT(a0),d1		(stampato male nel manuale)
	moveq	#0,d0
	bset	d1,d0				fai scorrere
	CALLEXEC Wait

	moveq	#0,d4				codice di ritorno

* Varie routines di uscita che effettuano pulizia e ritornano in D4

	move.l	MyWindow(pc),a0
	CALLINT CloseWindow

exit_closescr
	move.l	MyScreen(pc),a0
	CALLINT CloseScreen

exit_closeall
	move.l	_GfxBase(pc),a1
	CALLEXEC CloseLibrary

exit_closeint
	move.l	_IntuitionBase(pc),a1
	CALLEXEC CloseLibrary

exit_false
	move.l	d4,d0			codice di ritorno
	rts

* La definizione dello schermo, si noti che in Assembler è necessario
* specificare la dimensione dei campi correttamente. Perciò bisogna
* consultare gli header di files ed il Rom Kernel Manual.

MyNewScreen	dc.w	0,0		sinistra, sopra
		dc.w	320,200		larghezza, altezza
		dc.w	2		profondità in bitplanes
		dc.b	0,1		penne foreg., backg.
		dc.w	0		viewmodes
		dc.w	CUSTOMSCREEN	tipi
		dc.l	MyFont		fonte
		dc.l	screen_title	titolo
		dc.l	0		gadgets
		dc.l	0		bitmap

* Definizione della fonte standard
MyFont	dc.l	font_name
	dc.w	TOPAZ_SIXTY
	dc.b	FS_NORMAL
	dc.b	FPF_ROMFONT

* Le variabili
_IntuitionBase	dc.l	0		Puntatore Intuition lib
_GfxBase	dc.l	0		Puntatore Graphics lib
MyScreen	dc.l	0
MyWindow	dc.l	0
MyNewWindow	ds.b	nw_SIZE		Un buffer


* Alcune stringhe di lavoro
int_name	INTNAME
graf_name	GRAFNAME
hello_message	dc.b	'Ciao Bello!'

* Queste sono stringhe C, che devono terminare con un NULL
screen_title	dc.b	'Mio schermo',0
font_name	dc.b	'topaz.font',0
window_title	dc.b	'Mia finestra',0
		even
		end
		

