*************************************************************************
*									*
* Include-tiedostot, joissa on määritelty käyttöjärjestelmärutiineihin	*
* liittyviä struktuureja ja vakioita.  Struktuurit ovat tässä tapauk-	*
* sessa vain eri alkioiden offset-arvoja struktuurin alkuun verattuna.	*
*									*
*************************************************************************

	include "exec/types.i"
	include "exec/nodes.i"
	include "exec/lists.i"
	include "exec/memory.i"
	include	"graphics/gfx.i"
	include	"graphics/gfxbase.i"
	include	"graphics/text.i"
	include	"intuition/intuition.i"
	include	"intuition/screens.i"

*************************************************************************
*									*
* Määritellään kutsuttavat käyttöjärjestelmärutiinit, jolloin BLink	*
* osaa korvata sumboliset nimet oikeilla offset-arvoilla.		*
* BLink saa offset-arvot amiga.lib-tiedostosta.				*
*									*
*************************************************************************

 xref _LVOOpenLibrary,_LVOCloseLibrary,_LVOGetMsg,_LVOReplyMsg
 xref _LVOOpenScreen,_LVOCloseScreen,_LVOOpenWindow,_LVOCloseWindow
 xref _LVOLoadRGB4,_LVOMove,_LVOText,_LVOWaitTOF,_LVOScrollRaster

intuibase	equ	-4	; tila Intuition-kirjaston osoittimelle
gfxbase		equ	-8	; tila Graphics-kirjaston osoittimelle
Naytto		equ	-12	; tila Screen-osoittimelle
Ikkuna		equ	-16	; tila Window-osoittimelle
rp		equ	-20	; tila RastPort-osoittimelle

*************************************************************************
*									*
* Itse ohjelma: Aluksi avataan kirjastot ja näyttö.			*
*									*
*************************************************************************

scroll	link	a4,#-20			; varataan muuttujatilaa
	lea	gfxnimi(pc),a1		; grafiikkakirjaston nimi
	moveq	#0,d0			; kirjastoversio (mikä tahansa)
	move.l	4,a6			; exec-kirjaston perusosoite
	jsr	_LVOOpenLibrary(a6)	; kutsutaan OpenLibrary()ä
	move.l	d0,gfxbase(a4)		; talletetaan gfx:n perusosoite
	beq	cleanup			; jos kirjastoa ei ole, pois!

	lea	intuinimi(pc),a1	; Intuition-kirjaston nimi
	moveq	#0,d0			; kirjastoversio (mikä tahansa)
	jsr	_LVOOpenLibrary(a6)	; kutsutaan OpenLibrary()ä
	move.l	d0,intuibase(a4)	; talletetaan I:n perusosoite
	beq	cleanup			; jos kirjastoa ei ole, pois!

	lea	UusiNaytto(pc),a0	; näytön struktuurin osoite
	move.l	intuibase(a4),a6	; Intuitionin perusosoite
	jsr	_LVOOpenScreen(a6)	; kutsutaan OpenScreen()iä
	move.l	d0,Naytto(a4)		; talletetaan osoitin
	beq	cleanup			; jos ei auennut, pois!

*************************************************************************
*									*
* Seuraavaksi asetetaan näytön värit (kynät 0, 1, 2 ja 3) käyttäen	*
* LoadRGB4()-rutiinia, jolle annetaan väritaulukko.			*
*									*
*************************************************************************

	move.l	d0,a0			; Screen-struktuurin osoite
	lea.l	sc_ViewPort(a0),a0	; ViewPort-struktuurin osoite
	lea.l	Varit(pc),a1		; väritaulukon alkuosoite
	move.l	gfxbase(a4),a6		; grafiikkakirjaston perusosoite
	moveq	#4,d0			; värien määrä
	jsr	_LVOLoadRGB4(a6)	; asettaa värit

*************************************************************************
*									*
* Avataan ikkuna ja otetaan ikkunan RastPort-struktuurin osoite.	*
*									*
*************************************************************************

	lea	UusiIkkuna(pc),a0	; NewWindow-struktuurin osoite
	move.l	Naytto(a4),nw_Screen(a0); asetetaan näytön osoitin
	move.l	intuibase(a4),a6	; Intuitionin perusosoite
	jsr	_LVOOpenWindow(a6)	; kutsutaan OpenWindow()ia
	move.l	d0,Ikkuna(a4)		; talletetaan Window:n osoite
	beq.s	cleanup			; jos ei auennut, pois!
	move.l	d0,a0
	move.l	wd_RPort(a0),rp(a4)	; otetaan RastPortin osoite

*************************************************************************
*									*
* Varsinainen tekstin vieritys tapahtuu tässä.  Silmukoita on vain	*
* kaksi, koska teksti on yhtenä nollaan päättyvänä merkkijonona.	*
* Ulompi silmukka käsittelee kaikki tekstin merkit, sisempi merkin	*
* pikselisarakkeet.							*
*									*
*************************************************************************

	lea	teksti(pc),a2		; tekstin alkuosoite
silmu1	moveq	#9,d7			; pikselin numero

silmu2	move.l	Ikkuna(a4),a0		; oman ikkunan osoitin
	move.l	wd_UserPort(a0),a0	; ikkunan viestiportti
	move.l	4,a6			; Execbase
	jsr	_LVOGetMsg(a6)		; tutkitaan, onko tullut viestejä
	tst.l	d0
	bne.s	nappula			; joku painoi hiiren nappia!
	move.l	d7,d0
	add.l	#309,d0			; x-koordinaatti
	moveq	#78,d1			; y-koordinaatti
	move.l	rp(a4),a1		; RastPort-osoitin
	move.l	gfxbase(a4),a6
	jsr	_LVOMove(a6)		; Move(rp,310+k,78)
	move.l	a2,a0			; tekstin osoitin
	moveq	#1,d0			; tulostettava pituus 1 merkki
	move.l	rp(a4),a1		; RastPort-osoitin
	jsr	_LVOText(a6)		; gfxbase on jo a6:ssa
	jsr	_LVOWaitTOF(a6)		; odotellaan
	moveq	#1,d0			; dx (scrollausmäärä x-suunn.)
	moveq	#0,d1			; dy (scrollausmäärä y-suunn.)
	moveq	#0,d2			; minx (alueen vasen yläkulma)
	moveq	#70,d3			; miny (alueen vasen yläkulma)
	move.l	#319,d4			; maxx (alueen oikea alakulma)
	moveq	#80,d5			; maxy (alueen oikea alakulma)
	move.l	rp(a4),a1
	jsr	_LVOScrollRaster(a6)	; gfxbase on jo a6:ssa
	dbf	d7,silmu2		; tulostetaan kaikki pikselit

	addq.l	#1,a2			; kasvatetaan tekstiosoitinta
	tst.b	(a2)			; tekstin loppu?
	bne.s	silmu1			; ei -> jatketaan
	bra.s	cleanup

nappula	move.l	d0,a1			; viestin osoitin
	jsr	_LVOReplyMsg(a6)	; vastataan kiltisti viestiin

*************************************************************************
*									*
* cleanup, joka sulkee kirjastot, näytön ja ikkunat.  On huomattava,	*
* että kirjaston sulkemisen jälkeen siinä olevia rutiineja ei enää saa	*
* kutsua.  Siksi kirjastot suljetaan viimeisenä.			*
* Näytössä olevat ikkunat on suljettava ennen näytön sulkemista.	*
*									*
*************************************************************************

cleanup	move.l	Ikkuna(a4),d0		; jos ikkuna auki, suljetaan se
	beq.s	clean1
	move.l	d0,a0
	move.l	intuibase(a4),a6
	jsr	_LVOCloseWindow(a6)

clean1	move.l	Naytto(a4),d0		; jos näyttö auki, suljetaan se
	beq.s	clean2
	move.l	d0,a0
	move.l	intuibase(a4),a6
	jsr	_LVOCloseScreen(a6)

clean2	move.l	gfxbase(a4),d0		; jos graphics auki, suljetaan
	beq.s	clean3
	move.l	d0,a1
	move.l	4,a6
	jsr	_LVOCloseLibrary(a6)

clean3	move.l	intuibase(a4),d0	; jos intuition auki, suljetaan
	beq.s	clean4
	move.l	d0,a1
	move.l	4,a6
	jsr	_LVOCloseLibrary(a6)

clean4	unlk	a4			; vapautetaan pinoalue
	rts				; jatketaan boottia

*************************************************************************
*									*
* Struktuurit, joissa määritellään avattavan näytön ja ikkunan ominai-	*
* suudet sekä fontti.							*
*									*
*************************************************************************

UusiNaytto	dc.w	0,0		; näytön koordinaatit
		dc.w	320,256		; koko (x,y)
		dc.w	2		; bittitasojen määrä (4 väriä)
		dc.b	0,1		; kynät, joilla näyttö piirretään
		dc.w	0		; moodi (HIRES, HAM, DUALPF jne)
		dc.w	CUSTOMSCREEN	; näytön tyyppi
		dc.l	0		; käytettävä oletusfontti
		dc.l	0		; näytön otsikkopalkin teksti
		dc.l	0		; gadgetteja ei käytetä
		dc.l	0		; custom bitmappia ei käytetä

UusiIkkuna	dc.w	0,0		; ikkunan koordinaatit (x,y)
		dc.w	320,256		; ikkunan koko (x,y)
		dc.b	2,3		; kynien värit
		dc.l	MOUSEBUTTONS	; IDCMP vahtii hiiren nappuloita
		dc.l	NOCAREREFRESH!ACTIVATE!BORDERLESS!RMBTRAP ; liput
		dc.l	0		; ei gadgetteja
		dc.l	0		; ei omaa checkmarkkia
		dc.l	0		; ei ikkunan otsikkopalkin tekstiä
		dc.l	0		; näytön osoitin, asetetaan myöhemmin
		dc.l	0		; ei BitMap-osoitinta
		dc.w	0,0		; minimikoko (ei vaikuta tässä)
		dc.w	0,0		; maksimikoko (ei vaikuta tässä)
		dc.w	CUSTOMSCREEN	; näytön tyyppi

Varit		dc.w	$0000,$000f,$00f0,$0f00

*************************************************************************
*									*
* ASCII-merkkijonot.  Näiden EI tarvitse alkaa parillisista osoitteista	*
* kuten muiden muuttujien, koska nämä ovat tavumuotoista tietoa.	*
*									*
*************************************************************************

dosnimi		dc.b	"dos.library",0
gfxnimi		dc.b	"graphics.library",0
intuinimi	dc.b	"intuition.library",0

teksti	dc.b	"Huomio!  Tässä kokeillaan C=Lehden boottiscrollirutiinia.  "
	dc.b	"Teksti on tallennettu sellaisenaan muistiin.  "
	dc.b	"Tekstirivejä voi lisätä haluamansa määrän ilman, että "
	dc.b	"muuta ohjelmaa tarvitsee muuttaa.  Ohjelman on tietysti "
	dc.b	"mahduttava boot-blokkiin...  Viimeisenä on oltava "
	dc.b	"nollatavu, josta ohjelma tietää tekstin päättyvän. "
	dc.b	"Greetings to JC and (-: PPP :-)                    "
	dc.b	"                          ",0	LOPPUMERKKI!

	end

