*****************************************
*	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)

; Aqui dentro poner las rutinas que van cada 50avo de segundo

	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)

MAIN				; Programa Principal

	move.w	#0,d0
	move.w	#0,d1
	move.w	#100,d2
	move.w	#100,d3
	bsr	linea

;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

;---------------------------------
;rutina de linea by xele 
;---------------------------------
;d0=x1   d1=y1   d2=x2   d3=y2
;---------------------------------

linea	movem.l	d0-d7/a0-a6,-(sp)
	move.w	#$8000,bltadat
	move.w	#$ffff,bltbdat
	move.w	#$ffff,bltafwm
	move.w	#$ffff,bltalwm

	; 1er calculo: dx / dy --> dx=abs(x2-x1) ; dy=abs(y2-y1)
	
caldx	move.w	d2,d4
	sub.w	d0,d4
	cmp.w	#0,d4
	bgt	caldy
	neg.w	d4
caldy	move.w	d4,dx		;primero guardamos dx
	move.w	d3,d4
	sub.w	d1,d4
	cmp.w	#0,d4
	bgt	fincal
	neg.w	d4
fincal	move.w	d4,dy		;guardamos dy

	move.w	dx,d3
	cmp.w	d3,d4
	bgt	vale
	exg.l	d3,d4
	move.w	d3,dx
	move.w	d4,dy
vale	

; 2do calculo:  ( 4*(dy-dx) )

	move.w	dy,d4
	move.w	dx,d3
	sub.w	d3,d4
	muls.w	#4,d4
	move.w	d4,bltamod

; 3er calculo	( 4*dy )

	move.w	dy,d4
	mulu.w	#4,d4
	move.w	d4,bltbmod

; ancho bitplane

	move.w	#40,bltcmod
	move.w	#40,bltdmod

; 4to calculo	(  (4*dy) - (2*dx) )

	move.w	dx,d3
	mulu.w	#2,d3
	sub.w	d3,d4
	move.l	d4,bltapth

; 5to calculo : direccion de la palabra que contiene el primer pixel  			

	move.l	#bpl1c,d6
	move.l	d1,d3
	mulu.w	#20,d3
	move.w	d0,d4
	divu.w	#16,d4
	mulu.w	#2,d4
	add.l	d4,d3
	add.l	d3,d6
	move.l	d6,bltcpth
	move.l	d6,bltdpth

; 6to calculo	( x1 modulo 15 )	(bltcon0 bits)
	
	move.w	d0,d3
	divs.w	#15,d3
	muls.w	#15,d3
	move.w	d0,d4
	sub.w	d3,d4
	ror.w	#4,d4
	move.w	d4,bltcon0
	or.w	#$0bca,bltcon0

; 7mo calculo	(bltcon1 bits)	

	move.w	#$0001,bltcon1
	move.w	bltapth,d4
	cmp.w	#0,d4
	bgt	nomenor
	move.w	#$0001,bltcon1
nomenor	

; ultimo calculo (parece increible que haya llegado hasta aqui)
; (dx+1) (bltsize bits)

	move.w	dx,d4
	add.w	#1,d4
	lsl.w	#6,d4
	or.w	#$0002,d4
	move.w	d4,bltsize


salil	movem.l	(sp)+,d0-d7/a0-a6
	rts


***************** 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
;	dc.w $00eC,$0000,$00eE,$0000	* Como solo usamos 3 planos
;	dc.w $00F0,$0000,$00F2,$0000	* no hace falta que pongamos estos
;	dc.w $00F4,$0000,$00F6,$0000	* BPL6

	dc.w $180,$a00,$182,$e00,$184,$ff0,$186,$aa0	* Colores 0-7
	dc.w $188,$f88,$18a,$faa,$18c,$fcc,$18e,$fee
;	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,$00
	dcb.b	10240,$00	; (320    *256)/8 = 10240 bytes
	dcb.b	10240,$00	; (Xpixels*Yp.)/8 = tamaņo de cada plano

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

bltcon0	equ	$dff040		
bltcon1	equ	$dff042
bltafwm	equ	$dff044
bltalwm	equ	$dff046
bltcpth	equ	$dff048
bltbpth	equ	$dff04c
bltapth	equ	$dff050
bltdpth	equ	$dff054	
bltsize	equ	$dff058
bltcmod	equ	$dff060
bltbmod	equ	$dff062
bltamod	equ	$dff064
bltdmod	equ	$dff066
bltcdat	equ	$dff070
bltbdat	equ	$dff072
bltadat	equ	$dff074


************** 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
dx		dc.w	0
dy		dc.w	0


