******************************************************************************
;    680X0 & AGA STARTUP BY FABIO CIUCCI - Livello di complessita' 2
******************************************************************************

MAINCODE:
	movem.l	d0-d7/a0-a6,-(SP)	; Salva i registri nello stack
	move.l	4.w,a6			; ExecBase in a6
	LEA	DosName(PC),A1		; Dos.library
	JSR	-$198(A6)		; OldOpenlib
	MOVE.L	D0,DosBase
	BEQ.w	EXIT3			; Se zero, esci! Errore!
	LEA	GfxName(PC),A1		; Nome libreria da aprire
	JSR	-$198(A6)		; OldOpenLibrary - apri la lib
	MOVE.L	d0,GfxBase
	BEQ.w	EXIT2			; Se si, esci! Errore!
	LEA	IntuiName(PC),A1	; Intuition.library
	JSR	-$198(A6)		; OldOpenlib
	MOVE.L	D0,IntuiBase
	BEQ.w	EXIT1			; Se zero, esci! Errore!

	MOVE.L	d0,A0
	CMP.W	#39,$14(A0)	  ; Versione 39 o maggiore? (kick3.0+)
	BLT.s	VecchiaIntui
	BSR.w	ResettaSpritesV39 ; se kick3.0+ allora resetta sprites
VecchiaIntui:

; Salviamo il color0

	MOVE.L	IntuiBase(PC),A6
	move.l	$3c(a6),a0	; Ib_FirstScreen (Schermo in "primo piano!")
	LEA	$2c(A0),A0	;  vp  =  A pointer to a ViewPort structure.
	move.l	a0,VPfirstScreen
	move.l	4(a0),a0	;  colormap = la colormap di questo viewport
	MOVEQ	#0,D0		; entry - vogliamo avere il color0! (sfondo)
	MOVE.L	GfxBase(PC),A6
	JSR	-$246(A6)	; GetRGB4 - prendi il valore del color0
				; dalla ColorMap dello schermo (-1 se error!)
	move.w	d0,SavedColor0

; E anneriamolo!

	move.l	VPfirstScreen(PC),a0
	LEA	colore0(PC),A1	; colore $0RGB
	MOVEQ	#1,D0		; count - solo il colore di sfondo da cambiare
	JSR	-$C0(A6)	; LoadRGB4

; Resettiamo lo schermo (con colore di sfondo annerito!)

	MOVE.L	$22(A6),WBVIEW	; Salva il WBView attuale di sistema
	SUB.L	A1,A1		; View nullo per azzerare il modo video
	JSR	-$DE(A6)	; LoadView nullo - modo video azzerato
	SUB.L	A1,A1		; View nullo
	JSR	-$DE(A6)	; LoadView (due volte per sicurezza...)
	JSR	-$10E(A6)	; WaitOf ( Queste due chiamate a WaitOf    )
	JSR	-$10E(A6)	; WaitOf ( servono a resettare l'interlace )
	JSR	-$10E(A6)	; Altre due, vah!
	JSR	-$10E(A6)

	bsr.w	InputOff	; Disabilita l'input di intuition (ossia non
				; legge piu' il mouse e la tastiera)

	MOVE.L	4.w,A6
	SUB.L	A1,A1		; NULL task - trova questo task
	JSR	-$126(A6)	; findtask (Task(name) in a1, -> d0=task)
	MOVE.L	D0,A1		; Task in a1
	move.l	d0,ThisTask
	MOVE.L	$B8(A1),pr_Win	; A questo offset è presente l' address
				; della window dalla quale è stato
				; caricato il programma e che serve al
				; DOS per sapere dove aprire i Reqs.
	MOVE.L	#-1,$B8(A1)	; Settandolo a -1 il DOS non apre Reqs
				; Infatti se ci fossero errori nell'apertura
				; di files con la dos.lib, il sistema
				; proverebbe ad aprire un requester, ma con
				; il blitter disabilitato (OwnBlit), non lo
				; potrebbe disegnare, bloccando tutto!
	MOVEQ	#-1,D0		; Priorita' in d0 (-128, +127) - in attesa
	JSR	-$12C(A6)	; LVOSetTaskPri (d0=priorita', a1=task)

	LEA	$DFF006,A5	; VhPosr
	lea	$bfe001,a4
	moveq	#6,d2
	MOVE.w	#$dd,D0		; Linea da attendere
	MOVE.w	#WaitDisk,D1	; Quanto attendere... (Per essere sicuri che
WaitaLoop:			; disk drives o Hard Disk abbiano finito).
	btst.b	d2,(a4)		; btst #6,$bfe001 -> aspetta il left mouse
	beq.s	SkippaWait
	CMP.B	(A5),D0
	BNE.S	WaitaLoop
Wait2:
	CMP.B	(A5),D0
	Beq.s	Wait2
	dbra	D1,WaitaLoop
SkippaWait:
	btst.b	d2,(a4)		; btst #6,$bfe001 -> lasciamo il left mouse!
	beq.s	SkippaWait


	MOVE.L	4.w,A6
	move.l	thistask(PC),a1	; Task in a1
	MOVEQ	#127,D0		; Priorita' in d0 (-128, +127) - MASSIMA!
	JSR	-$12C(A6)	; LVOSetTaskPri (d0=priorita', a1=task)

	MOVE.L	GfxBase(PC),A6
	jsr	-$1c8(a6)	; OwnBlitter, che ci da l'esclusiva sul blitter
				; impedendone l'uso al sistema operativo.
	jsr	-$E4(A6)	; WaitBlit - Attende la fine di ogni blittata
	JSR	-$E4(A6)	; WaitBlit

	move.l	4.w,a6		; ExecBase in A6
	JSR	-$84(a6)	; FORBID - Disabilita il Multitasking
	JSR	-$78(A6)	; DISABLE - Disabilita anche gli interrupt
				;	    del sistema operativo

	bsr.w	HEAVYINIT	; Ora puoi eseguire la parte che opera
				; sui registri hardware

	move.l	4.w,a6		; ExecBase in A6
	JSR	-$7E(A6)	; ENABLE - Abilita System Interrupts
	JSR	-$8A(A6)	; PERMIT - Abilita il multitasking

	move.l	thistask(PC),a1	; Task in a1
	MOVE.L	pr_Win(PC),$B8(A1) ; ripristina l'address della window
	MOVEQ	#0,D0		   ; Priorita' in d0 (-128, +127) - NORMALE
	JSR	-$12C(A6)	   ; LVOSetTaskPri (d0=priorita', a1=task)

	MOVE.L	GfxBase(PC),A6	; GfxBase in A6
	jsr	-$E4(A6)	; Aspetta la fine di eventuali blittate
	JSR	-$E4(A6)	; WaitBlit
	jsr	-$1ce(a6)	; DisOwnBlitter, il sistema operativo ora
				; puo' nuovamente usare il blitter

	MOVE.L	IntuiBase(PC),A0
	CMP.W	#39,$14(A0)	; V39+?
	BLT.s	Vecchissima
	BSR.w	RimettiSprites
Vecchissima:

; RiPristina il Color0

	MOVE.L	GfxBase(PC),A6	; GfxBase in A6
	move.l	VPfirstScreen(PC),a0
	LEA	Savedcolor0(PC),A1 ; colore0 originale
	MOVEQ	#1,D0		; count - solo il colore di sfondo da cambiare
	MOVE.L	GfxBase(PC),A6
	JSR	-$C0(a6)	; LoadRGB4 - vecchio color0

	MOVE.L	WBVIEW(PC),A1	; Vecchio WBVIEW in A1
	JSR	-$DE(A6)	; loadview - rimetti il vecchio View
	JSR	-$10E(A6)	; WaitOf ( Risistema l'eventuale interlace)
	JSR	-$10E(A6)	; WaitOf
	MOVE.W	#$11,$DFF10C	; Questo non lo ripristina da solo..!
	MOVE.L	$26(a6),$dff080	; COP1LC - Punta la vecchia copper1 di sistema
	MOVE.L	$32(a6),$dff084	; COP2LC - Punta la vecchia copper2 di sistema

	bsr.w	InputOn		; Rispristina l'input di intuition

	MOVE.L	IntuiBase(PC),A6
	JSR	-$186(A6)	; _LVORethinkDisplay - Ridisegna tutto il
				; display, comprese ViewPorts e eventuali
				; modi interlace o multisync.
	MOVE.L	A6,A1		; IntuiBase in a1 per chiudere la libreria
	move.l	4.w,a6		; ExecBase in A6
	jsr	-$19E(a6)	; CloseLibrary - intuition.library CHIUSA
EXIT1:
	MOVE.L	GfxBase(PC),A1	; GfxBase in A1 per chiudere la libreria
	jsr	-$19E(a6)	; CloseLibrary - graphics.library CHIUSA
EXIT2:
	MOVE.L	DosBase(PC),A1	; DosBase in A1 per chiudere la libreria
	jsr	-$19E(a6)	; CloseLibrary - dos.library CHIUSA
EXIT3:
	movem.l	(SP)+,d0-d7/a0-a6 ; Riprendi i vecchi valori dei registri
	RTS			  ; Torna all'ASMONE o al Dos/WorkBench

pr_Win:
	dc.l	0
colore0:
	dc.w	$012
SavedColor0:
	dc.w	0
VPfirstScreen:
	dc.l	0
ThisTask:
	dc.l	0
*******************************************************************************
;	Resetta la risoluzione degli sprite "legalmente"
*******************************************************************************

ResettaSpritesV39:
	MOVE.L	IntuiBase(PC),A6
	LEA	Workbench(PC),A0 ; Nome schermo del Workbench (per lock) in a0
	JSR	-$1FE(A6)	; _LVOLockPubScreen - "blocchiamo" lo schermo
				; (il cui nome e' in a0).
	MOVE.L	D0,SchermoWBLocckato
	BEQ.s	ErroreSchermo
	MOVE.L	D0,A0		; Struttura Screen in a0
	MOVE.L	$30(A0),A0	; sc_ViewPort+vp_ColorMap: in a0 ora abbiamo
				; la struttura ColorMap dell schermo, che ci
				; serve (in a0) per eseguire un "video_control"
				; della graphics.library.
	LEA	GETVidCtrlTags(PC),A1	; In a1 la TagList per la routine
					; "Video_control" - la richiesta che
					; facciamo a questa routine e' di
					; VTAG_SPRITERESN_GET, ossia di sapere
					; la risoluzione attuale degli sprite.
	MOVE.L	GfxBase(PC),A6
	JSR	-$2C4(A6)	; Video_Control (in a0 la cm e in a1 i tags)
				; riporta nella taglist, nella long
				; "risoluzione", la risoluzione attuale degli
				; sprite in quello schermo.

; Ora salviamo la risoluzione anche dell'eventuale schermo "in primo piano",
; ad esempio la schermata dell'assemblatore:

	MOVE.L	IntuiBase(PC),A6
	move.l	$3c(a6),a0	; Ib_FirstScreen (Schermo in "primo piano!")
	MOVE.L	$30(A0),A0	; struttura sc_ViewPort+vp_ColorMap in a0
	LEA	GETVidCtrlTags2(PC),A1	; In a1 la TagList GET
	MOVE.L	GfxBase(PC),A6
	JSR	-$2C4(A6)	; Video_Control (in a0 la cm e in a1 i tags)

; Ora chiediamo alla routine VideoControl di settare la risoluzione.
; SPRITERESN_140NS -> ossia lowres!

	MOVE.L	SchermoWBLocckato(PC),A0
	MOVE.L	$30(A0),A0	; struttura sc_ViewPort+vp_ColorMap in a0
	LEA	SETVidCtrlTags(PC),A1	; TagList che resetta gli sprite.
	MOVE.L	GfxBase(PC),A6
	JSR	-$2C4(A6)	; video_control... resetta gli sprite!

	move.L	IntuiBase(PC),A6
	move.l	$3c(a6),a0	; Ib_FirstScreen - "pesca" lo schermo in
				; primo piano (ad es. ASMONE)
	move.L	$30(A0),A0	; struttura sc_ViewPort+vp_ColorMap in a0
	LEA	SETVidCtrlTags(PC),A1	; TagList che resetta gli sprite.
	move.L	GfxBase(PC),A6
	JSR	-$2C4(A6)	; video_control... resetta gli sprite!

	move.L	SchermoWBLocckato(PC),A0
	move.L	IntuiBase(PC),A6
	JSR	-$17A(A6)	; _LVOMakeScreen - occorre rifare lo schermo
	move.l	$3c(a6),a0	; Ib_FirstScreen - "pesca" lo schermo in
				; primo piano (ad es. ASMONE)
	JSR	-$17A(A6)	; _LVOMakeScreen - occorre rifare lo schermo
				; per essere sicuri del reset: ossia occorre
				; chiamare MakeScreen, seguito da...
	JSR	-$186(A6)	; _LVORethinkDisplay - che ridisegna tutto il
				; display, comprese ViewPorts e eventuali
ErroreSchermo:			; modi interlace o multisync.
	RTS

; Ora dobbiamo risettare gli sprites alla risoluzione di partenza.

RimettiSprites:
	MOVE.L	SchermoWBLocckato(PC),D0 ; Indirizzo strutt. Screen
	BEQ.S	NonAvevaFunzionato	 ; Se = 0, allora peccato...
	MOVE.L	D0,A0
	MOVE.L	OldRisoluzione(PC),OldRisoluzione2 ; Rimetti vecchia risoluz.
	LEA	SETOldVidCtrlTags(PC),A1
	MOVE.L	$30(A0),A0	; Struttura ColorMap dello screen
	MOVE.L	GfxBase(PC),A6
	JSR	-$2C4(A6)	; _LVOVideoControl - Risetta la risoluzione

; Ora dello schermo in primo piano (eventuale)...

	MOVE.L	IntuiBase(PC),A6
	move.l	$3c(a6),a0	; Ib_FirstScreen - "pesca" lo schermo in
				; primo piano (ad es. ASMONE)
	MOVE.L	OldRisoluzioneP(PC),OldRisoluzione2 ; Rimetti vecchia risoluz.
	LEA	SETOldVidCtrlTags(PC),A1
	MOVE.L	$30(A0),A0	; Struttura ColorMap dello screen
	MOVE.L	GfxBase(PC),A6
	JSR	-$2C4(A6)	; _LVOVideoControl - Risetta la risoluzione

	move.L	IntuiBase(PC),A6
	move.L	SchermoWBLocckato(PC),A0
	JSR	-$17A(A6)	; RethinkDisplay - "ripensiamo" il display
	move.l	$3c(a6),a0	; Ib_FirstScreen - schermo in primo piano
	JSR	-$17A(A6)	; RethinkDisplay - "ripensiamo" il display
	MOVE.L	SchermoWBLocckato(PC),A1
	SUB.L	A0,A0		; null
	move.L	IntuiBase(PC),A6
	JSR	-$204(A6)	; _LVOUnlockPubScreen - e "sblocchiamo" lo
NonAvevaFunzionato:		; screen del workbench.
	RTS

SchermoWBLocckato:
	dc.l	0

; Questa e' la struttura per usare Video_Control. La prima long serve per
; CAMBIARE (SET) la risoluzione degli sprite o per sapere (GET) quella vecchia.

GETVidCtrlTags:
	dc.l	$80000032	; GET
OldRisoluzione:
	dc.l	0	; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
	dc.l	0,0,0	; 3 zeri per TAG_DONE (terminare la TagList)

GETVidCtrlTags2:
	dc.l	$80000032	; GET
OldRisoluzioneP:
	dc.l	0	; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
	dc.l	0,0,0	; 3 zeri per TAG_DONE (terminare la TagList)

SETVidCtrlTags:
	dc.l	$80000031	; SET
	dc.l	1	; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
	dc.l	0,0,0	; 3 zeri per TAG_DONE (terminare la TagList)

SETOldVidCtrlTags:
	dc.l	$80000031	; SET
OldRisoluzione2:
	dc.l	0	; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
	dc.l	0,0,0	; 3 zeri per TAG_DONE (terminare la TagList)

; Nome schermo del WorkBench

Workbench:
	dc.b	'Workbench',0

; *****************************************************************************
; QUESTA ROUTINE BLOCCA INTUITION CREANDO UNA MESSAGE-PORT AD UN LIVELLO
; DI PRIORITA' PIU' ALTO DI QUELLO DI INTUITION, COSICCHE' TUTTI I MESSAGGI
; RELATIVI AD INTUITION VENGONO INVIATI A QUESTA MESSAGE-PORT (NULLAFACENTE).
; *****************************************************************************

InputOFF:
	LEA	INPUTMPORT(PC),A1	; port da creare
	BSR.w	CREATEPORT
	CMP.L	#-1,D0
	BEQ.w	INTUIERROR
	MOVE.L	#INPUTMPORT,inputioST	; MN_REPLYPORT+inputio
	LEA	INPUTDEVICE(PC),A0	; DevName: input.device
	MOVEQ	#0,D0			; Unit Number
	LEA	INPUTIO(PC),A1		; iORequest block da inizializzare
	MOVEQ	#0,D1			; flags: nessuno
	MOVE.L	4.w,A6
	JSR	-$1BC(A6)		; OpenDevice - inizializza inputio
	TST.L	D0			; Se d0=0 nessun errore
	BNE.S	INTUITIONON1		; Altrimenti esci disperato

; Ora occorre che il nostro input handler abbia priorita' maggiore di
; intuition, che ha priorita' 50. Basta mettere priorita' 51!

	MOVE.B	#51,LN_PRI	   ; Priorita' nostro inputhandler = 51
	CLR.L	IS_DATA		   ; IS_DATA dell'inputhandler = 0
	MOVE.L	#READINPUT,IS_CODE ; Come codice solo moveq #0,d0 & rts.
	MOVE.W	#9,IO_COMMAND	   ; comando: ND_ADDHANDLER
	MOVE.L	#INPUTHANDLER,IO_DATA
	LEA	INPUTIO(PC),A1	; iOrequest
	MOVE.L	4.w,A6
	JSR	-$1C8(A6)	; DoIo
	RTS

; Routine che mettiamo nel nostro input handler... non fa molto, eh!?

READINPUT:
	MOVEQ	#0,D0		; non passiamo input a Intuition
	RTS

; *****************************************************************************
; Routine che ripristina l'input/output di intuition
; *****************************************************************************

InputON:
	TST.B	InputErrFlag	; errore in InputOFF?
	BNE.S	EsciInputON	; se si, niente da fare qua
	MOVE.W	#10,IO_COMMAND	; comando: IND_REMHANDLER (rimuovi handler)
	MOVE.L	#INPUTHANDLER,IO_DATA
	LEA	INPUTIO(PC),A1	; iORequest
	MOVE.L	4.w,A6
	JSR	-$1C8(A6)	; DoIo
	LEA	INPUTIO(PC),A1	; iORequest
	MOVE.L	4.w,A6
	JSR	-$1C2(A6)	; CloseDevice
INTUITIONON1:
	LEA	INPUTMPORT(PC),A1
	BSR.s	FREEUPPORT
INTUIERROR:
	MOVE.B	#$FF,InputErrFlag	; segna l'errore
EsciInputON:
	RTS

InputErrFlag:
	dc.w	0

; a1=address of port. In uscita se d0=-1 allora c'e' un errore

CREATEPORT:
	MOVE.L	A1,-(SP)
	MOVEQ	#-1,D0		; SignalNum -1 (uno qualsiasi)
	MOVE.L	4.w,A6
	JSR	-$14A(A6)	; AllocSignal
	MOVEQ	#-1,D1
	CMP.L	D1,D0		; Errore?
	BEQ.S	FREEUPPORT1
	MOVE.L	(SP),A0		; Port in a0
	MOVE.B	#0,9(A0)	; LN_PRI
	MOVE.B	#4,8(A0)	; NT_MSGPORT, LN_TYPE
	MOVE.B	#0,14(A0)	; PA_SIGNAL, MP_FLAGS
	MOVE.B	D0,15(A0)	; MP_SIGBIT
	SUBA.L	A1,A1
	MOVE.L	4.w,A6
	JSR	-$126(A6)	; FindTask (trova questo task)
	MOVE.L	(SP),A1
	MOVE.L	D0,$10(A1)	; d0,MP_SIGTASK
	LEA	$14(A1),A0	; MP_MSGLIST,a0
	MOVE.L	A0,(A0)		; NEWLIST a0
	ADDQ.L	#4,(A0)		; 
	CLR.L	4(A0)		; 
	MOVE.L	A0,8(A0)	;
CREATEPORTEXIT:
	MOVE.L	(SP)+,D0
	RTS

; a1=address of port

FREEUPPORT:
	MOVE.L	A1,-(SP)
	MOVE.B	15(A1),D0	; MP_SIGBIT,d0 (SignalNum)
	MOVE.L	4.w,A6
	JSR	-$150(A6)	; FreeSignal
FREEUPPORT1:
	MOVE.L	(SP)+,A1
	RTS

INPUTMPORT:
	ds.b	34	; MP_SIZE

INPUTIO:
	ds.b	14
inputioST:
	ds.b	14
IO_COMMAND:
	ds.b	12
IO_DATA:
	ds.b	8

INPUTHANDLER:
	ds.b	9
LN_PRI:
	ds.b	5
IS_DATA:
	dc.l	0
IS_CODE:
	dc.l	0

INPUTDEVICE:
	dc.b	'input.device',0,0

******************************************************************************
;	Da qua in avanti si puo' operare sull'hardware in modo diretto
******************************************************************************

HEAVYINIT:
	LEA	$DFF000,A5		; Base dei registri CUSTOM per Offsets
	MOVE.W	$2(A5),OLDDMA		; Salva il vecchio status di DMACON
	MOVE.W	$1C(A5),OLDINTENA	; Salva il vecchio status di INTENA
	MOVE.W	$10(A5),OLDADKCON	; Salva il vecchio status di ADKCON
	MOVE.W	$1E(A5),OLDINTREQ	; Salva il vecchio status di INTREQ
	MOVE.L	#$80008000,d0		; Prepara la maschera dei bit alti
					; da settare nelle word dove sono
					; stati salvati i registri
	OR.L	d0,OLDDMA	; Setta il bit 15 di tutti i valori salvati
	OR.L	d0,OLDADKCON	; dei registri hardware, indispensabile per
				; rimettere tali valori nei registri.

	MOVE.L	#$7FFF7FFF,$9A(a5)	; DISABILITA GLI INTERRUPTS & INTREQS
	MOVE.L	#0,$144(A5)		; SPR0DAT - ammazza il puntatore!
	MOVE.W	#$7FFF,$96(a5)		; DISABILITA I DMA
	MOVE.L	#0,$144(A5)

	move.l	4.w,a6		; ExecBase in a6
	btst.b	#0,$129(a6)	; Testa se siamo su un 68010 o superiore
	beq.s	IntOK		; E' un 68000! Allora la base e' sempre zero.
	lea	SuperCode(PC),a5 ; Routine da eseguire in supervisor
	jsr	-$1e(a6)	; LvoSupervisor - esegui la routine
	bra.s	IntOK		; Abbiamo il valore del VBR, continuiamo...

;**********************CODICE IN SUPERVISORE per 68010+ **********************
SuperCode:
	dc.l  	$4e7a9801	; Movec Vbr,A1 (istruzione 68010+).
				; E' in esadecimale perche' non tutti gli
				; assemblatori assemblano il movec.
	move.l	a1,BaseVBR	; Label dove salvare il valore del VBR
	RTE			; Ritorna dalla eccezione
;*****************************************************************************

BaseVBR:		; Se non modificato, rimane zero! (per 68000).
	dc.l	0

IntOK:
	move.l	BaseVBR(PC),a0	 ; In a0 il valore del VBR
	move.l	$64(a0),OldInt64 ; Sys int liv 1 salvato (softint,dskblk)
	move.l	$68(a0),OldInt68 ; Sys int liv 2 salvato (I/O,ciaa,int2)
	move.l	$6c(a0),OldInt6c ; Sys int liv 3 salvato (coper,vblanc,blit)
	move.l	$70(a0),OldInt70 ; Sys int liv 4 salvato (audio)
	move.l	$74(a0),OldInt74 ; Sys int liv 5 salvato (rbf,dsksync)
	move.l	$78(a0),OldInt78 ; Sys int liv 6 salvato (exter,ciab,inten)

	bsr.w	ClearMyCache

	lea	$dff000,a5	; Custom register in a5
	bsr.w	START		; Esegui il programma.

	bsr.w	ClearMyCache

	LEA	$dff000,a5	; Custom base per offsets
	MOVE.W	#$8240,$96(a5)	; dmacon - abilita blit
	BTST.b	#6,2(a5)	; WaitBlit via hardware...
Wblittez:
	BTST.b	#6,2(a5)
	BNE.S	Wblittez

	MOVE.W	#$7FFF,$96(A5)		; DISABILITA TUTTI I DMA
	MOVE.L	#$7FFF7FFF,$9A(A5)	; DISABILITA GLI INTERRUPTS & INTREQS
	MOVE.W	#$7fff,$9E(a5)		; Disabilita i bit di ADKCON

	move.l	BaseVBR(PC),a0	     ; In a0 il valore del VBR
	move.l	OldInt64(PC),$64(a0) ; Sys int liv1 salvato (softint,dskblk)
	move.l	OldInt68(PC),$68(a0) ; Sys int liv2 salvato (I/O,ciaa,int2)
	move.l	OldInt6c(PC),$6c(a0) ; Sys int liv3 salvato (coper,vblanc,blit)
	move.l	OldInt70(PC),$70(a0) ; Sys int liv4 salvato (audio)
	move.l	OldInt74(PC),$74(a0) ; Sys int liv5 salvato (rbf,dsksync)
	move.l	OldInt78(PC),$78(a0) ; Sys int liv6 salvato (exter,ciab,inten)

	MOVE.W	OLDADKCON(PC),$9E(A5)	; ADKCON
	MOVE.W	OLDDMA(PC),$96(A5)	; Rimetti il vecchio status DMA
	MOVE.W	OLDINTENA(PC),$9A(A5)	; INTENA STATUS
	MOVE.W	OLDINTREQ(PC),$9C(A5)	; INTREQ
	RTS

;	Dati salvati dalla startup

WBVIEW:			; Indirizzo del View del WorkBench
	DC.L	0
GfxName:
	dc.b	'graphics.library',0,0
IntuiName:
	dc.b	'intuition.library',0
DosName:
	dc.b	"dos.library",0
GfxBase:		; Puntatore alla Base della Graphics Library
	dc.l	0
IntuiBase:		; Puntatore alla Base della Intuition Library
	dc.l	0
DosBase:		; Puntatore alla Base della Dos Library
	dc.l	0
OLDDMA:			; Vecchio status DMACON
	dc.w	0
OLDINTENA:		; Vecchio status INTENA
	dc.w	0
OLDADKCON:		; Vecchio status ADKCON
	DC.W	0
OLDINTREQ:		; Vecchio status INTREQ
	DC.W	0

; Vecchi interrupt di sistema

OldInt64:
	dc.l	0
OldInt68:
	dc.l	0
OldInt6c:
	dc.l	0
OldInt70:
	dc.l	0
OldInt74:
	dc.l	0
OldInt78:
	dc.l	0

; Routine da chiamare in caso di codice automodificante, modifica di tabelle
; in fast ram, caricamento da disco, ecc.

ClearMyCache:
	movem.l	d0-d7/a0-a6,-(SP)
	move.l	4.w,a6
	MOVE.W	$14(A6),D0	; lib version
	CMP.W	#37,D0		; e' V37+? (kick 2.0+)
	blo.s	nocaches	; Se kick1.3, il problema e' che non puo'
				; nemmeno sapere se e' un 68040, per cui
				; e' rischioso.. e si spera che uno
				; stupido che ha un 68020+ su un kick1.3
				; abbia anche le caches disabilitate!
	jsr	-$27c(a6)	; cache cleaR U (per load, modifiche ecc.)
nocaches:
	movem.l	(sp)+,d0-d7/a0-a6
	rts

