*****************************************
*	SYSTEM STARTER	V 2.0		*
*  Code  written by SONNY/Darkness	*
*  Major changes by TROGLOBYTE/Darkness	*
*  Last Version Updated : 15/Ene/94	*
*****************************************
; Kickstart 1.x, 2.x and 3.x compatible.
; Probado en Amiga 500, 1200 y 4000.
; Ensamblado en :Devpac 2.08 y 3.02, Trash'M-One 1.6.

; Este SOURCE acompaņa al texto 'Ensamblando', asi que consultalo
; para mas explicaciones, comentarios y nuestra direccion en caso
; de que encuentres algun BUG o alguna mejora, o quieras darnos
; algun comentario o consejo.
; Ten en cuenta que muchos de los comentarios estan en ingles o
; en `spanglish', pero suelo comentar los sources en ingles y
; no estaba de humor para traducirlos todos.De todas formas, los
; mas importantes deben estar en espaņol.
; Este SOURCE esta sobrecomentado, asi que te recomiendo que
; borres todos los comentarios que consideres innecesariosl. 

; Lo que veas detras de estos simbolos indica :
	;   : Comentario o una linea de codigo que no necesitamos
	*   : Seguramente tendras que modificarla a tu gusto
	**  : Linea opcional; no es imprescindible.
	*** : Esta linea sobra (solo esta de prueba)

;Habitualmente aqui no tendras que cambiar nada, (salvo las instrucciones
;marcadas con un *, pero de momento ni siquiera esas) simplemente
;preparamos al sistema [OSout] para ejecutar nuestro programa [Start]
;y cuando acabamos dejamos el Amiga como estaba [OSin].
; ATENCION : ten en cuenta que esta es la parte mas delicada del programa
; y cualquier equivocacion puede dar lugar a un GURU.

	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 deberiamos poner las rutinas que queremos ejecutar
; continuamente (50 veces por segundo).Como podrian ser la musica,
; un scroll, o cualquier otra cosa

	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)

;Por esta vez no necesitamos inicializar nada mas

MAIN				; Programa Principal

;Estas lineas cambian el color de fondo por poner algo

	move	$dff006,D0	***  TEST
	move	d0,$dff180	*** COLORS

;Nuestro programa se queda cambiando el color hasta que salimos
;con el boton izquierdo del raton.

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


***************** COPPER LIST
;Aqui definimos nuestra Copper-List: numero de bit-planos [BPLS],
;tamaņo de la pantalla, direccion de los graficos y colores.

	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,$f00,$182,$f22,$184,$f44,$186,$f66	* 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
;En este caso son una especie de lineas rojiblancas (Aupa Atleti)
;Pero si los cambiaramos por la siguiente linea tendriamos un dibujo

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	df0:MiDibujo.raw

;El fichero 'MiDibujo.raw' tendria que ser un grafico de 320*256 pixels
;en 8 colores (3 planos) porque asi es la Copper-List que hemos definido
;Para un grafico de otras caracteristicas necesitariamos modificar la 
;Copper-List.
;Es importante que el grafico este en formato RAW (descomprimido), en IFF
;no nos valdria porque estaria comprimido.
;Para pasarlo a formato RAW, usa cualquier conversor de graficos de los
;muchos que hay.El grafico RAW debe de ser de 30720 bytes.
;Yo os recomiendo que este sea vuestro primer paso, intentar poner un
;grafico, y luego probar con un grafico con otro numero de planos, y
;de distinto tamaņo, distinta resolucion...Solo tendreis que hacer
;algunos cambios en la Copper y acabareis comprendiendo como van los
;graficos en el Amiga.

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

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



