*****************************************
*	SYSTEM STARTER	V 2.0		*
*  Code  written by SONNY/Darkness	*
*  Major changes by TROGLOBYTE/Darkness	*
*  Last Version Updated : 15/Ene/94	*
*****************************************

	SECTION Troglobyte,CODE	; Codigo (CHIP/FAST)

InitSys	bsr.s	OSout		; Quitamos el control al Amiga OS

	bsr.w	Start		; Nuestro PROGRAMA !!!

	bsr.w	OSin		; Devolvemos el control al Amiga OS
	rts			; ADIOS !!!
	DC.B	'$VER: Darkness 2.0 15/Ene/94',0	** N. Version
	even

OSout	movea.l	4.w,a6			; System Base
	lea	GfxLib,a1
	moveq	#0,d0
	jsr	-552(a6)		; OpenLibrary
	move.l	d0,GfxBase		; Save Graphics_lib base
	move.l	d0,a6
	move.l	38(a6),OldCopper	; gb_CopInit	Sys Copper
	move.l	34(a6),OldView		; gb_ActiView	Sys View
	jsr	-456(a6)		; Own Blitter
	lea	0.w,a1		;LoadView Null
	jsr	-222(a6)	;LoadView
	jsr	-270(a6)	;WaitTOF
	jsr	-270(a6)

	movea.l	4.w,a6			; System Base
	jsr	-132(a6)		; Forbid
	jsr	-150(a6)		; SuperState
	move.l	d0,SysStack		; System stack
	btst.b	#0,$129(a6)	; are we at least 68010? ($129=AttnFlags+1)
	beq.s	.68000			; nope.
	dc.w	$4e7a,$0801	;=movec.l vbr,d0 ; pero MDevPac no lo acepta
	move.l	d0,VectorBase		; Get Real VBR

.68000	move	$dff01c,IntEnaR		; Initialize custom chips
	move	$dff01e,IntReqR		; Save old valours first
	move	$dff002,DmaConR
	move	$dff010,AdkConR
	move	#%0111111111111111,$dff09a	; INTENA
	move	#%1100000000100000,$dff09a	* Enable desired IRQs
.Spr	move.l	$dff004,D0		; Wait RASTER to
	and.l	#$0001FF00,D0		; disable SPRITES
	bne.s	.Spr
	move	#%0111111111111111,$dff096	; DMACONW
	move	#%1000001111000000,$dff096	* Enable desired DMAs

	move	$dff07c,d0		;Ponerlo en/antes/despues de Copper?
	cmp.b	#$f8,d0
	bne.s	.NotAGA			; Not AGA
	move	#0,$dff1fc		* Fix AGA Res     (Ponerlo en Copper?)

.NotAGA	move.l	VectorBase,a0
	move.l	$6c(a0),Int3Save	; Save level 3 vector
	move.l	#INTER,$6c(a0)		; Set OUR! own interrupt

	move.l	#COPPER,$dff080			; Set OUR! Copper List
	rts

OSin	move.l	VectorBase,a0
	move.l	Int3Save,$6c(a0)	; Reset Interrupts
	move	IntEnaR,d7		; Reset custom chips
	bset	#$f,d7
	move	d7,$dff09a		; Reset Interrupts
	move	IntReqR,d7
	bset	#$f,d7
	move	d7,$dff09c		; Reset interrupt request
	move	DmaConR,d7
	bset	#$f,d7
	move	d7,$dff096		; Reset DMAConw
	move	AdkConR,d7
	bset	#$f,d7
	move	d7,$dff09e		; Reset ADK

	move.l	GfxBase,a6
	movea.l	OldView,a1
	jsr	-222(a6)	;LoadView
	move.l	OldCopper,$dff080	; Reset System Copper
	jsr	-462(a6)		; DisOwn Blitter

	movea.l	4.w,a6			; System Base
	move.l	GfxBase,a1	; Close Graphics_lib
	jsr	-414(a6)	; CloseLibrary
	jsr	-138(a6)		; Permit
	move.l	SysStack,d0		; Systemstack
	jsr	-156(a6)		; UserState

	moveq.l	#0,D0
	rts

***************** INTERRUPCION

INTER	movem.l	A0-A6/D0-D7,-(sp)

	sub.l	#1,contador
	cmp.l	#0,contador
	ble	salir
	lea	CopBPLS,a0
	add.l	#40,xbp1
	add.l	#40,xbp2
	add.l	#40,xbp3
	add.l	#40,xbp4
	move.l	xbp1,d0
	move	d0,6(a0)
	swap	d0
	move	d0,2(a0)
	move.l	xbp2,d0
	move	d0,14(a0)
	swap	d0
	move	d0,10(a0)
	move.l	xbp3,d0
	move	d0,22(a0)
	swap	d0
	move	d0,18(a0)
	move.l	xbp4,d0
	move	d0,30(a0)
	swap	d0
	move	d0,26(a0)

salir	move	#$20,$dff09c
	movem.l	(sp)+,A0-A6/D0-D7
	rte				

***************** PROGRAMA

Start				; Inicializamos nuestro Programa aqui
	lea	CopBPLS,a0	; Inicializamos la Copper con
	move.l	#BPL1C,d0	; las direcciones donde estan los
	move	d0,6(a0)	; graficos de los BitPlanes que usamos
	swap	d0
	move	d0,2(a0)
	move.l	#BPL2C,d0
	move	d0,14(a0)
	swap	d0
	move	d0,10(a0)
	move.l	#BPL3C,d0
	move	d0,22(a0)
	swap	d0
	move	d0,18(a0)
	move.l	#BPL4C,d0
	move	d0,30(a0)
	swap	d0
	move	d0,26(a0)
MAIN				; Programa Principal

	move.l	#BPL1C,xbp1
	move.l	#BPL2C,xbp2
	move.l	#BPL3C,xbp3
	move.l	#BPL4C,xbp4

	sub.l	#10240,xbp1
	sub.l	#10240,xbp2
	sub.l	#10240,xbp3
	sub.l	#10240,xbp4


;salimos con el boton izquierdo del raton.

LMB	btst 	#6,$bfe001	; Apreto Raton izquierdo ?
	bne.s 	LMB		; NO = Salta a MAIN
	rts			; SI = Volvemos para salir


***************** COPPER LIST

	SECTION Graficos,DATA_C		; Datos   (CHIP)

COPPER	dc.w $100,$3200			* BPLCONtrol0 [3 BPLS]
	dc.w $102,$0000,$104,$0000	* BPLCON1,BPLCON2
	dc.w $108,$0000,$10A,$0000	* BPLMODulos
	dc.w $08e,$2881,$090,$28C1	* DIWindow Size YX
	dc.w $092,$0038,$094,$00D0	* DDFetch

CopBPLS	dc.w $00e0,$0000,$00e2,$0000	* BPL1PT = BitPlane1Pointers
	dc.w $00e4,$0000,$00e6,$0000	* BPL2
	dc.w $00e8,$0000,$00eA,$0000	* BPL3
	dc.w $00eC,$0000,$00eE,$0000	* BPL4
;	dc.w $00F0,$0000,$00F2,$0000	* no hace falta que pongamos estos
;	dc.w $00F4,$0000,$00F6,$0000	* BPL6

	dc.w $180,$000,$182,$fff,$184,$f00,$186,$ff0	* Colores 0-7
	dc.w $188,$f00,$18a,$464,$18c,$353,$18e,$454
	dc.w $190,$00f,$192,$009,$194,$da7,$196,$c96	* 8-15
;	dc.w $198,$fff,$19a,$b52,$19c,$b40,$19e,$930
;	dc.w $1a0,$000,$1a2,$fff,$1a4,$b00,$1a6,$900	* 16-23
;	dc.w $1a8,$ccc,$1aa,$aaa,$1ac,$060,$1ae,$050
;	dc.w $1b0,$00f,$1b2,$009,$1b4,$da7,$1b6,$c96	* 24-31
;	dc.w $1b8,$fff,$1ba,$b52,$1bc,$b40,$1be,$930
	
	dc.w $ffff,$fffe,$ffff,$fffe	; Doble End of COPPER


;Las 3 siguientes instrucciones son los 3 BitPlanes de la pantalla
;el comando dcb.b rellena una zona de memoria con el dato que se le de

Plano1	
;	dcb.b	10240,$55	; (320    *256)/8 = 10240 bytes
;	dcb.b	10240,$33	; (Xpixels*Yp.)/8 = tamaņo de cada plano
;	dcb.b	10240,$0f	; Usamos 3 planos
	INCBIN	df1:CafeRaw
	dcb.b	40960,$00	

BPL1C	equ	Plano1		;Estos son las direcciones donde
BPL2C	equ	Plano1+10240	;comienza cada BitPlane
BPL3C	equ	Plano1+20480
BPL4C	equ	plano1+30720

************** DATAS

	SECTION FastData,DATA		; Datos (FAST/CHIP)

GfxLib		dc.b	"graphics.library",0,0
IntEnaR		dc.w	0
IntReqR		dc.w	0
DmaConR		dc.w	0
AdkConR		dc.w	0
SysStack	dc.l	0
Int3Save	dc.l	0
GfxBase		dc.l	0
OldCopper	dc.l	0
OldView		dc.l	0
VectorBase	dc.l	0
xbp1		dc.l	0
xbp2		dc.l	0
xbp3		dc.l	0
xbp4		dc.l	0
contador	dc.l	260

