ùúùú                                        		****************************************
		**				      **
		**	   3 D    E N G I N E	      **
		**				      **
		**  This version has NOT BEEN SPEEDED **
		**  Demo versione for MC68020+	      **
		**  written in about 20 hours!	      **
		**  NO BUG FIX but BUG FULL version,  **
		**  sorry, i have no time for debug   **
		**  				      **
		**				      **
		**				      **
		**				      **
		**				      **
		**  Information :		      **
		**  Screen size : 106 * 76	      **
		**  Chunky to Coppper conversion      **
		**  Copper resolution 3 x 3	      **
		**  Simple 3D routine + Zoom mode     **
		**  Double buffer mode		      **
		**  Control VBRBASE for MC60010+      **
		**  Control Keyboard		      **
		**  FAST Texture mapping engine	      **
		**				      **
		**************************************

cmpd6:	macro
	cmp.w	#360,d6
	blt.s	D6EPiuPiccolo\@
	sub.w	#360,d6
D6EPiuPiccolo\@:
	tst.w	d6
	bge.s	D6EPiuGrande\@
	add.w	#360,d6
D6EPiuGrande\@:
	endm

HeightCopper	EQU	38

	SECTION CODE,CODE
Start:
	movem.l	d0-a6,-(sp)

	move.l	$4.w,a6
	jsr	-$84(a6)		; Forbit

	moveq	#0,d0
	lea	GraphicsName(pc),a1
	jsr	-$228(a6)
	beq.w	GraphicsError
	move.l	d0,GfxBase

	MOVE.L	D0,A6
	move.l	$22(a6),OldView
	SUBA.L	A1,A1
	JSR	-$00DE(A6)
	jsr	-$10e(a6)
	jsr	-$10e(a6)
	jsr	-$e4(a6)

	lea	$DFF000,a5
	move.w	$2(a5),d0
	or.w	#$8000,d0
	lea	dmaconr(pc),a0
	move.w	d0,(a0)
	move.w	$1C(a5),d0
	or.w	#$C000,d0
	lea	Intenar(pc),a0
	move.w	d0,(a0)
	move.w	#$7FFF,$96(a5)
	move.w	#$83e0,$96(a5)
	move.w	#$7FFF,$9A(a5)
	move.w	#$7FFF,$9C(a5)
	move.w	#$C028,$9A(a5)

	move.w	#1,VariabileSpeed	; DA TOGLIERE
	bsr.w	AggiornaSpriteFPS	; DA TOGLIERE

	bsr.w	GetVbr
	lea	Interrupt(pc),a6
	move.w	#$4000,$DFF09A
	move.l	VbrBase(pc),a0
	move.l	a6,$6c(a0)
	move.w	#$C000,$DFF09A

	bsr.w	SistemaPlane
	bsr.w	CreaCopper

	move.l	#XYData,XYAddress

	lea	CopperList,a0
	move.l	a0,$80(a5)
	move.w	#$0,$88(a5)
Wait:
;	cmp.b	#-1,$dff006
;	bne.s	Wait
	tst.w	IntOk
	beq.s	Wait


	move.w	#1024,Xangle
	bsr.w	SwapCopper
	bsr.w	AggiornaSpriteFPS
	bsr.w	ControlloTasti
	bsr.w	Rotate
	bsr.w	Zoomma
	bsr.w	DrawAll
	bsr.w	CreateCopperChunky
 	bsr.w	ClearChunkyBuffer

;	move.l	XYAddress,a0
;	move.w	OrgX,(a0)+
;	move.w	ORgY,(a0)+
;	move.w	ZAngle,(a0)*
;	move.l	a0,XYAddress

	cmp.l	#XYDataEnd,a0
	beq.s	Exit

	clr.w	IntOk
	btst	#6,$bfe001
	bne.s	wait
Exit:
	move.l	VbrBase(pc),a0
	move.l	OldInter(pc),$6c(a0)

	lea	$DFF000,a5
	move.w	#$7FFF,$96(a5)
	move.w	#$7FFF,$9A(a5)
	move.w	dmaconr(pc),$96(a5)
	move.w	Intenar(pc),$9A(a5)

	move.l	GfxBase(pc),a6
	jsr	-$e4(a6)
	move.l	OldView,a1
	jsr	-$de(a6)
	jsr	-$10e(a6)
	jsr	-$10e(a6)

	move.l	$26(a6),$80(a5)
	move.w	#0,$88(a5)
	move.l	$4.w,a6
	move.l	GfxBase(pc),a1
	jsr	-$19E(a6)
GraphicsError:
	move.l	$4.w,a6
	jsr	-$8A(a6)		; Permit
	movem.l	(sp)+,d0-a6
	rts

	cnop	0,4
SwapCopper:
	move.l	Copper1,d0		; copper da vedere
	move.l	Copper2,d1		; copper da calcolare
	move.l	d0,Copper2
	move.l	d1,Copper1
	move.l	d1,$dff080
	move.w	#0,$dff088
	rts


	cnop	0,4
******************************
** Routine in interrupt $6c **
******************************
Interrupt:
	btst	#5,$dff01f
	beq.s	ende
	add.w	#1,VariabileSpeed
	move.w	#1,IntOk
ende:
	move.w	#$20,$dff09c
;	rte
	move.l	OldInter(pc),-(sp)
	rts

*******************************
** Premde il VBR in Fast Ram **
*******************************
GetVBR:
	move.l	$4.w,a6
	suba.l	a1,a1
	btst.b	#0,$129(a6)
	beq.s	IntDone		; it is a 68000!!
	lea	VBRcode(pc),a5
	jsr	-$1e(a6)	; SuperVisor 60010 or greater !!!
IntDone:
	lea	$dff000,a5
	lea	VbrBase(pc),a0
	move.l	a1,(a0)
	lea	OldInter(pc),a2
	move.l	$6c(a1),(a2)
	rts
VbrCode:
	dc.l	$4e7a9801	; movec	Vbr,a1
	rte
	
VbrBase:	dc.l	0	; Vbr address

	cnop	0,4
**********************************************
** Calcola e visualizza i Frame Per Secondo **
**********************************************
AggiornaSpriteFPS:
	move.w	VariabileSpeed,d0
	clr.w	VariabileSpeed
	moveq	#50,d1
	divs	d0,d1
	move.w	d1,FPS
	subq.w	#1,d1
	muls	#48,d1		; 48 = lunghezza dello sprite

	lea	SprData,a0
	add.w	d1,a0
;	lea	Spr,a2
	move.l	Copper2,a2
	add.l	#Spr-CopperList,a2
	move.l	a0,d0
	move.w	d0,6(a2)
	swap	d0
	move.w	d0,2(a2)
	rts

OldInter:	dc.l	0
VariabileSpeed:	dc.w	0
FPS:		dc.w	0
IntOk:		dc.w	0

	cnop	0,4
*********************
** controllo tasti **
*********************
ControlloTasti:
	moveq	#0,d0
	move.b	$bfec01,d0
	not.w	d0
	ror.b	#1,d0
	moveq	#0,d2

	cmp.b	#$4c,d0
	bne.w	NoFrecciaAltaPremuta

	moveq	#1,d2
	moveq	#0,d3

NoFrecciaAltaPremuta:
	cmp.b	#$4d,d0	
	bne.w	NoFrecciaBassaPremuta

	moveq	#1,d2
	moveq	#1,d3

NoFrecciaBassaPremuta:
	cmp.b	#$4e,d0
	bne.b	NoFrecciaDestraPremuta

	sub.w	#20,Zangle

NoFrecciaDestraPremuta:
	cmp.b	#$4f,d0
	bne.b	NoFrecciaSinistraPremuta

	add.w	#20,Zangle

NoFrecciaSinistraPremuta:
	cmp.b	#$46,d0			; delete
	bne.s	NoDel
	add.w	#10,dist
NoDel:	cmp.b	#$5f,d0			; help
	bne.s	NoHelp
	sub.w	#10,dist
NoHelp:
	tst.w	d2
	beq.w	Fine

	move.w	Zangle,d6		; calcolo da 4096 valori a 360°
	and.w	#$fff,d6
	ext.l	d6
	swap	d6
	move.l	#$b60b6,d5		; [4096 valori << 16] / 360°
	divs.l	d5,d6

	lea	RuotazionePlayer,a0
	cmpd6

	move.b	(a0,d6.w),d1		; X
	add.w	#90,d6
	cmpd6
	move.b	(a0,d6.w),d2		; Y
	ext.w	d1
	ext.w	d2
	tst.w	d3
	bne.s	Fine2
Fine3:
	move.w	OrgX,d3
	add.w	d1,d1
	move.w	d1,d4
	add.w	d1,d1
	add.w	d1,d4		; d4 = d1 * 6

	sub.w	d4,d3

	cmp.w	#600-120,d3
	bge.s	NoModifyX
	cmp.w	#-600+120,d3
	ble.s	NoModifyX

	sub.w	d4,OrgX

NoModifyX:
	move.w	OrgY,d3
	add.w	d2,d2
	move.w	d2,d4
	add.w	d2,d2
	add.w	d2,d4		; d4 = d2 * 6

	sub.w	d4,d3

	cmp.w	#0,d3
	ble.s	NoModifyY
	cmp.w	#1080-120,d3
	bge.s	NoModifyY

	sub.w	d4,OrgY
NoModifyY:

Fine:
	move.w	#8,$dff09C
	rts

Fine2:
	neg.w	d1
	neg.w	d2
	bra.s	Fine3

	cnop	0,4
**********************************
** Sistema i puntatori ai plane **
**********************************
SistemaPlane:
	lea	Plane,a0
	move.l	#RAW,d0
	moveq	#8-1,d6
Loop:
	move.w	d0,6(a0)
	swap	d0
	move.w	d0,2(a0)
	swap	d0
	add.l	#$28,d0
	add.l	#8,a0
	dbf	d6,Loop
	rts

	cnop	0,4
*********************************
** Copia i dati per copperlist **
*********************************
CreaCopper:
	lea	FreeLine,a2
	move.w	#$330f,d0		; first wait
	moveq	#HeightCopper-1-1,d4	; -1 = dbf

CreaTutteLinee:
	lea	Line+4,a0
	move.l	#[[Line2-Line]-4]-1,d6	; -4 = long per wait	-1 =dbf
	move.w	d0,(a2)+
	add.w	#$0300,d0
	move.w	#$fffe,(a2)+
Wait1:
	move.b	(a0)+,(a2)+
	dbf	d6,Wait1

	lea	Line2+4,a1
	move.l	#[[FreeLine-Line2]-4]-1,d5	; -4 = long per wait	-1 =dbf
	move.w	d0,(a2)+
	add.w	#$0300,d0
	move.w	#$fffe,(a2)+
Wait2:
	move.b	(a1)+,(a2)+
	dbf	d5,Wait2
	dbf	d4,CreaTutteLinee

	lea	CopperList,a0
	lea	CopperList2,a1
	move.l	#[CopperList2-CopperList]-1,d0
Cops:	move.b	(a0)+,(a1)+
	dbf	d0,Cops
	rts

;------------------------------------------------
ZOBS:		dc.W 1400		; Magnetics
DIST:		dc.W 940		; Asse	Z
XORG:		dc.W 106/2		; Asse	X
YORG:		dc.W 76/2		; Asse	Y
;------------------------------------------------

**********************************
** Ruota attorno tutti gli assi **
**********************************
Rotate:
	move.w	Zangle,d0
	move.w	#$fff,d4
	and.w	d4,d0
	move.w	d0,Zangle
	jsr	SinCos
	move.w	d1,Zsin
	move.w	d2,Zcos
	move.w	Yangle,d0
	and.w	d4,d0
	move.w	d0,Yangle
	jsr	SinCos
	move.w	d1,Ysin
	move.w	d2,Ycos
	move.w	Xangle,d0
	and.w	d4,d0
	move.w	d0,Xangle
	jsr	SinCos
	move.w	d1,Xsin
	move.w	d2,Xcos
	lea	Wx,a0
	lea	Wy,a1
	lea	Wz,a2
	lea	IntX,a3
	lea	IntY,a4
	lea	IntZ,a5
	move.w	#NPoints-1,d0
Zrotate:
	move.w	Zsin(pc),d1
	move.w	Zcos(pc),d2
	move.w	(a0)+,d6
	sub.w	OrgX,d6
	move.w	(a1)+,d7
	sub.w	OrgY,d7			; per muoversi nella mappa
	muls	d6,d2
	muls	d7,d1
	sub.l	d1,d2
	add.l	d2,d2
	swap	d2
	move.w	d2,d5
	move.w	Zsin(pc),d1
	move.w	Zcos(pc),d2
	muls	d6,d1
	muls	d7,d2
	add.l	d1,d2
	add.l	d2,d2
	swap	d2
	move.w	d2,d6
Yrotate:
	move.w	Ysin(pc),d1
	move.w	Ycos(pc),d2
	move.w	(a2)+,d3
	muls	d3,d2
	muls	d5,d1
	sub.l	d1,d2
	add.l	d2,d2
	swap	d2
	move.w	d2,d7
	move.w	Ysin(pc),d1
	move.w	Ycos(pc),d2
	muls	d3,d1
	muls	d5,d2
	add.l	d1,d2
	add.l	d2,d2
	swap	d2
	move.w	d2,(a3)+
Xrotate:
	move.w	Xsin(pc),d1
	move.w	Xcos(pc),d2
	muls	d6,d2
	muls	d7,d1
	sub.l	d1,d2
	add.l	d2,d2
	swap	d2
	move.w	d2,(a4)+
	move.w	Xsin(pc),d1
	move.w	Xcos(pc),d2
	muls	d6,d1
	muls	d7,d2
	add.l	d1,d2
	add.l	d2,d2
	swap	d2
	move.w	d2,(a5)+
	dbf	d0,Zrotate
	rts

	cnop	0,4
***************************
** Calcola seno e coseno **
***************************
Sincos:
	lea	SinTab,a1
	move.w	d0,d2
	add.w	d0,d0
	move.w	(a1,d0.w),d1
	move.w	#$c00,d3	; 4/3 di 360 gradi
	cmp.w	d3,d2
	blt	Plus9
	sub.w	d3,d2
	add.w	d2,d2
	move.w	(a1,d2.w),d2
	rts
Plus9:	add.w	#$400,d2		; 1/4 di 360 gradi
	add.w	d2,d2
	move.w	(a1,d2.w),d2
	rts


	cnop	0,4
*********************
** calcola lo zoom **
*********************
Zoomma:
	lea	IntX,a1
	lea	IntY,a2
	lea	IntZ,a3
	lea	IntX1,a4
	lea	IntY1,a5
	move.w	#NPoints-1,d0
	ext.l	d0
	move.w	#8,d7
Perlop:
	move.w	(a3)+,d5
	move.w	d5,d6
	move.w	dist(pc),d4
	sub.w	d5,d4
	ext.l	d4
	lsl.l	d7,d4
	move.w	Zobs(pc),d3
	ext.l	d3
	sub.l	d6,d3
	bne	Pers1
	addq.l	#2,a1
	addq.l	#2,a2
	bra	Perend1
Pers1:
	divs	d3,d4
	move.w	d4,d3
	move.w	(a1)+,d1
	move.w	d1,d2
	neg.w	d1
	muls	d1,d3
	lsr.l	d7,d3
	add.w	d3,d2
	add.w	Xorg,d2
	move.w	d2,(a4)+
	move.w	(a2)+,d1
	move.w	d1,d2
	neg.w	d1
	muls	d1,d4
	lsr.l	d7,d4
	add.w	d4,d2
	neg.w	d2
	add.w	yorg,d2
	move.w	d2,(a5)+
Perend1:dbf	d0,Perlop
	rts

***************************************
** Crea copperlist per chunky-copper **
***************************************
CreateCopperChunky:
;	lea	Line,a0
	move.l	Copper2,a0
	add.l	#Line-CopperList,a0

	move.l	a0,a3
	lea	Chunky,a1
	lea	PaletteChunky,a2
	move.l	#Line2-Line,d0		; spazio tra le linee
	moveq	#0,d1
	moveq	#[HeightCopper*2]-1,d4		; numero linee
CreaTutto:
	move.l	a3,a0
	addi.w	#10,a0			; primo colore
	moveq	#3-1,d5			; n.volte da rifare routine
CreateCopper2:
	moveq	#32-1,d6		; calcola primi 32 colori
CreateCopper1:
	move.b	(a1)+,d1
	move.w	(a2,d1.w*2),(a0)
	addq.w	#4,a0
	dbf	d6,CreateCopper1
	addq.w	#4,a0
	dbf	d5,CreateCopper2

	moveq	#10-1,d6		; calcola ultimi 10 colori
CreateCopper3:
	move.b	(a1)+,d1
	move.w	(a2,d1.w*2),(a0)
	addq.w	#4,a0
	dbf	d6,CreateCopper3
	add.l	d0,a3
	dbf	d4,CreaTutto
	rts

X1:	dc.w	0
X2:	dc.w	0
X3:	dc.w	0
X4:	dc.w	0
Y1:	dc.w	0
Y2:	dc.w	0
Y3:	dc.w	0
Y4:	dc.w	0
OldX1:	dc.w	0
OldX2:	dc.w	0

orgx:	dc.w	0
orgy:	dc.w	0
********************
** Disegna i muri **
********************
DrawAll:
	lea	IntX1,a0	; X coords
	lea	IntY1,a1	; Y coords
	lea	WLines,a2	; come unire le linee
	lea	WTexture,a4
	lea	Chunky,a6

	move.w	#NFaces,NumFaccie

DisegnaAltreFaccie:
	lea	Chunky,a6
	move.l	(a4)+,a3	; Texture Address

	moveq	#0,d0
	moveq	#0,d1
	moveq	#0,d2
	moveq	#0,d3
	moveq	#0,d4
	moveq	#0,d5
	moveq	#0,d6
	moveq	#0,d7

** prelevo coordinate
	movem.w	(a2)+,d0-d3
	move.w	(a1,d0.w*2),d4		; punto 1  .___________. punto 2
	move.w	(a1,d1.w*2),d5		;	   |	       |
	move.w	(a1,d2.w*2),d6		;	   |	       |
	move.w	(a1,d3.w*2),d7		;	   |	       |
	move.w	(a0,d0.w*2),d0		;	   |	       |
	move.w	(a0,d1.w*2),d1		;	   |	       |
	move.w	(a0,d2.w*2),d2		;	   |	       |
	move.w	(a0,d3.w*2),d3		; punto 4  .___________. punto 3

	cmp.w	#0,d1			; X > 0
	ble.w	FacciaFuoriScreen
	cmp.w	#104,d0			; X < 104
	bge.w	FacciaFuoriScreen

	movem.w	d0-d7,X1

	sub.w	d0,d1
	sub.w	d0,d2
	sub.w	d4,d5
	sub.w	d4,d6
	muls.w	d1,d6
	muls.w	d5,d2
	sub.l	d2,d6
	ble.w	SaltaFacciaNascosta	; se la faccia è nascosta...

	movem.w	X1,d0-d7

	sub.w	d0,d3
	cmp.w	#10,d3			; [X4 - X1] <> +10 or <>-10
	bge.w	FacciaFuoriScreen
	cmp.w	#-10,d3
	ble.w	FacciaFuoriScreen

	sub.w	d1,d2
	cmp.w	#10,d2			; [X3 - X2] <> +10 or <>-10
	bge.w	FacciaFuoriScreen
	cmp.w	#-10,d2
	ble.w	FacciaFuoriScreen

	cmp.w	#-40,d4			; Y1 or Y2 > -40
	ble.w	FacciaFuoriScreen
	cmp.w	#-40,d5
	ble.w	FacciaFuoriScreen
	cmp.w	#-40,d6			; Y3 or Y4 > -40
	ble.w	FacciaFuoriScreen
	cmp.w	#-40,d7
	ble.w	FacciaFuoriScreen

	move.w	X1,OldX1
	move.w	X2,OldX2

** calcolo del clipping (la faccia e' visibile)
	move.w	X1,d0
	cmp.w	#0,d0			; X0
	bge.w	NoClippingSinisto

; linea alta
	move.w	X2,d1
	move.w	Y1,d2
	move.w	Y2,d3
	ext.l	d0
	ext.l	d1
	ext.l	d2
	ext.l	d3
	moveq	#0,d4
	moveq	#0,d5
	move.w	d1,d4
	sub.w	d0,d4
	move.w	d3,d5
	sub.w	d2,d5
	swap	d5
	divs.l	d4,d5
	neg.w	d0
	muls	d0,d5
	swap	d5
	add.w	d5,Y1		; New Y  ->  X = 0
	move.w	#0,X1

; linea bassa
	move.w	X4,d0
	move.w	X3,d1
	move.w	Y4,d2
	move.w	Y3,d3
	ext.l	d0
	ext.l	d1
	ext.l	d2
	ext.l	d3
	moveq	#0,d4
	moveq	#0,d5
	move.w	d1,d4
	sub.w	d0,d4
	move.w	d3,d5
	sub.w	d2,d5
	swap	d5
	divs.l	d4,d5
	neg.w	d0
	muls	d0,d5
	swap	d5
	add.w	d5,Y4		; New Y  ->  X = 0
	move.w	#0,X4

NoClippingSinisto:
	move.w	X2,d1
	cmp.w	#105,d1			; X1
	ble.w	NoClippingSinistro

; linea alta
	move.w	X1,d0
	move.w	Y1,d2
	move.w	Y2,d3
	ext.l	d0
	ext.l	d1
	ext.l	d2
	ext.l	d3
	moveq	#0,d4
	moveq	#0,d5
	move.w	d1,d4
	sub.w	d0,d4
	move.w	d3,d5
	sub.w	d2,d5
	swap	d5
	divs.l	d4,d5		; offset
	sub.w	#106,d1
	muls	d1,d5
	swap	d5
	sub.w	d5,Y2		; New Y  ->  X = 105
	move.w	#105,X2

; linea bassa
	move.w	X4,d0
	move.w	X3,d1
	move.w	Y4,d2
	move.w	Y3,d3
	ext.l	d0
	ext.l	d1
	ext.l	d2
	ext.l	d3
	moveq	#0,d4
	moveq	#0,d5
	move.w	d1,d4
	sub.w	d0,d4
	move.w	d3,d5
	sub.w	d2,d5
	swap	d5
	divs.l	d4,d5		; offset
	sub.w	#106,d1
	muls	d1,d5
	swap	d5
	sub.w	d5,Y3		; New Y  ->  X = 105
	move.w	#105,X3

NoClippingSinistro:
** calcolo offset orizzontale
	moveq	#0,d5
	moveq	#0,d2
	move.w	X2,d2
	sub.w	X1,d2
	move.w	d2,d5			; dbf orizzontale
	move.w	OldX2,d2
	sub.w	OldX1,d2
	ext.l	d2
	move.l	#$7c0000,d3		; 124 swappato
	divs.l	d2,d3			; dimensione orizzontale TEXTURE
					; es. $0000fc80

** calcola offset per decrementare lo zoom verticale
	moveq	#0,d1
	moveq	#0,d0
	move.w	Y4,d1
	sub.w	Y1,d1
	move.w	Y3,d0
	sub.w	Y2,d0
	sub.w	d0,d1
	swap	d1
	divs.l	d5,d1			; offset decremento zoom verticale

	moveq	#0,d0
	move.w	Y4,d0
	sub.w	Y1,d0
	lsr.w	#1,d0
	divs.l	d0,d1
	move.l	d1,DecrementoZoom

** calcolo offset verticale
	moveq	#0,d1
	move.w	Y4,d1
	sub.w	Y1,d1
	move.w	d1,DbfVerticale		; dbf verticale
	move.w	d1,DbfVerticale2	; dbf verticale
	ext.l	d1
	move.l	#$7c0000,d0		; 124 swappato
	divs.l	d1,d0			; dimensione verticale TEXTURE
					; es. $0000fc80

** calcolo offset verticale per profondita'
	moveq	#0,d2
	moveq	#0,d7
	move.w	Y2,d7
	sub.w	Y1,d7
	move.w	X2,d2
	sub.w	X1,d2
	swap	d7
	divs.l	d2,d7
	move.l	d7,OffsetDiscesaLineaAlta	; offset di discesa tra le colonne
					; riga alta

	moveq	#0,d2
	moveq	#0,d7
	move.w	Y3,d7
	sub.w	Y4,d7
	move.w	X3,d2
	sub.w	X4,d2
	swap	d7
	divs.l	d2,d7
	move.l	d7,OffsetDiscesaLineaBassa	; offset di discesa tra le colonne
					; riga bassa

** calcolo dell'uscita della Texture a sinistra
	moveq	#0,d4
	move.w	OldX1,d4
	sub.w	X1,d4
	neg.w	d4
	muls.l	d3,d4
	swap	d4
	add.w	d4,a3

	clr.w	AddaA6
	clr.l	OffsetDislivelloBasso2
	moveq	#0,d4
	moveq	#0,d7
CreaLineeOrizzontali:
	move.w	DbfVerticale2,d6			; dbf
** calcolo Y e X primo punto alto a sinistra
	moveq	#0,d2
	move.w	Y1,d2
	muls	#106,d2
	add.w	X1,d2
	lea	(a6,d2.w),a5

	moveq	#0,d1
	moveq	#0,d2
CreaLineaVerticale:
	move.b	(a3,d2.w),(a5)
	lea	106(a5),a5
	swap	d1
	add.l	d0,d1			; offset verticale
	swap	d1
	move.w	d1,d2
	lsl.l	#7,d2			; * 128 = size Y Texture
	dbf	d6,CreaLineaVerticale

	addq.w	#1,a6
	sub.w	d4,a3
	swap	d4
	add.l	d3,d4			; offset orizzontale
	swap	d4
	add.w	d4,a3

	swap	d7
	add.l	OffsetDiscesaLineaAlta,d7
	swap	d7

	move.l	OffsetDiscesaLineaBassa,d1
	add.l	d1,OffsetDislivelloBasso2

	moveq	#0,d1
	move.w	DbfVerticale,d1
	sub.w	d7,d1
	add.w	OffsetDislivelloBasso2,d1
	move.w	d1,DbfVerticale2

	sub.w	AddaA6,a6
	moveq	#0,d1
	move.w	d7,d1
	muls	#106,d1
	move.w	d1,AddaA6
	add.w	d1,a6

	add.l	DecrementoZoom,d0
	dbf	d5,CreaLineeOrizzontali
SaltaFacciaNascosta:
FacciaFuoriScreen:
	sub.w	#1,NumFaccie
	tst.w	NumFaccie
	bne.w	DisegnaAltreFaccie
	rts

*************************************
** Cancellazione del buffer CHUNKY **
*************************************
ClearChunkyBuffer:
	lea	Chunky,a0
	move.l	#[[106*76]/4]-1,d0
ClearLoop:
	clr.l	(a0)+
	dbf	d0,ClearLoop
	rts


GfxBase:	dc.l	0
OldView:	dc.l	0
Dmaconr:	dc.w	0
Intenar:	dc.w	0

NumFaccie:	dc.w	0
AddaA6:		dc.w	0
DbfVerticale:	dc.w	0
DbfVerticale2:	dc.w	0
OffsetDiscesaLineaAlta:	dc.l	0
OffsetDiscesaLineaBassa:dc.l	0
DecrementoZoom:	dc.l	0
XYAddress:	dc.l	0

OffsetDislivelloBasso2:	dc.l	0

XAngle:	dc.w	0
YAngle:	dc.w	0
ZAngle:	dc.w	0
Xsin:	dc.w	0
Xcos:	dc.w	0
Ysin:	dc.w	0
Ycos:	dc.w	0
Zsin:	dc.w	0
Zcos:	dc.w	0

GraphicsName:	dc.b	"graphics.library",0

	incdir	"hd1:3D-Engine/data/"

	section	DataChip,Data_c
Raw:	incbin	"scala_3x3_corretta_raw"

	cnop	0,4

CopperList:
	dc.w	$01FC,$0003,$008E,$3081,$0090,$11bf,$0092,$0038,$0094,$00a0
	dc.w	$0102,$0000,$0104,$0024,$0106,$0020,$0108,$0118,$010A,$0118
	dc.w	$010c,$00ff

	dc.w	$0124,$0000,$0126,$0000,$0128,$0000,$012A,$0000,$012C,$0000
	dc.w	$012E,$0000,$0130,$0000,$0132,$0000,$0134,$0000,$0136,$0000
	dc.w	$0138,$0000,$013A,$0000,$013C,$0000,$013E,$0000

	dc.w	$2a09,$fffe,$0100,$0211

	dc.w	$0140,$3040,$0142,$3b00
Spr:	dc.w	$0120,$0000,$0122,$0000

Plane:	dc.w	$00E0,$0000,$00E2,$0000,$00E4,$0000,$00E6,$0000,$00E8,$0000
	dc.w	$00EA,$0000,$00EC,$0000,$00EE,$0000,$00F0,$0000,$00F2,$0000
	dc.w	$00F4,$0000,$00F6,$0000,$00F8,$0000,$00FA,$0000,$00FC,$0000
	dc.w	$00FE,$0000
	dc.w	$0106,$e020,$01a2,$0fff		; colore sprite
Line:
	dc.w	$2D0F,$FFFE
	dc.w	$0106,$0020,$0180,$0000,$0182,$0000,$0184,$0000,$0186,$0000
	dc.w	$0188,$0000,$018A,$0000,$018C,$0000,$018E,$0000,$0190,$0000
	dc.w	$0192,$0000,$0194,$0000,$0196,$0000,$0198,$0000,$019A,$0000
	dc.w	$019C,$0000,$019E,$0000,$01A0,$0000,$01A2,$0000,$01A4,$0000
	dc.w	$01A6,$0000,$01A8,$0000,$01AA,$0000,$01AC,$0000,$01AE,$0000
	dc.w	$01B0,$0000,$01B2,$0000,$01B4,$0000,$01B6,$0000,$01B8,$0000
	dc.w	$01BA,$0000,$01BC,$0000,$01BE,$0000,$0106,$2020,$0180,$0000
	dc.w	$0182,$0000,$0184,$0000,$0186,$0000,$0188,$0000,$018A,$0000
	dc.w	$018C,$0000,$018E,$0000,$0190,$0000,$0192,$0000,$0194,$0000
	dc.w	$0196,$0000,$0198,$0000,$019A,$0000,$019C,$0000,$019E,$0000
	dc.w	$01A0,$0000,$01A2,$0000,$01A4,$0000,$01A6,$0000,$01A8,$0000
	dc.w	$01AA,$0000,$01AC,$0000,$01AE,$0000,$01B0,$0000,$01B2,$0000
	dc.w	$01B4,$0000,$01B6,$0000,$01B8,$0000,$01BA,$0000,$01BC,$0000
	dc.w	$01BE,$0000,$0106,$4020,$0180,$0000,$0182,$0000,$0184,$0000
	dc.w	$0186,$0000,$0188,$0000,$018A,$0000,$018C,$0000,$018E,$0000
	dc.w	$0190,$0000,$0192,$0000,$0194,$0000,$0196,$0000,$0198,$0000
	dc.w	$019A,$0000,$019C,$0000,$019E,$0000,$01A0,$0000,$01A2,$0000
	dc.w	$01A4,$0000,$01A6,$0000,$01A8,$0000,$01AA,$0000,$01AC,$0000
	dc.w	$01AE,$0000,$01B0,$0000,$01B2,$0000,$01B4,$0000,$01B6,$0000
	dc.w	$01B8,$0000,$01BA,$0000,$01BC,$0000,$01BE,$0000,$0106,$6020
	dc.w	$0180,$0000,$0182,$0000,$0184,$0000,$0186,$0000,$0188,$0000
	dc.w	$018A,$0000,$018C,$0000,$018E,$0000,$0190,$0000,$0192,$0000
Line2:
	dc.w	$300F,$FFFE,$0106,$8020,$0180,$0000,$0182,$0000,$0184,$0000
	dc.w	$0186,$0000,$0188,$0000,$018A,$0000,$018C,$0000,$018E,$0000
	dc.w	$0190,$0000,$0192,$0000,$0194,$0000,$0196,$0000,$0198,$0000
	dc.w	$019A,$0000,$019C,$0000,$019E,$0000,$01A0,$0000,$01A2,$0000
	dc.w	$01A4,$0000,$01A6,$0000,$01A8,$0000,$01AA,$0000,$01AC,$0000
	dc.w	$01AE,$0000,$01B0,$0000,$01B2,$0000,$01B4,$0000,$01B6,$0000
	dc.w	$01B8,$0000,$01BA,$0000,$01BC,$0000,$01BE,$0000,$0106,$A020
	dc.w	$0180,$0000,$0182,$0000,$0184,$0000,$0186,$0000,$0188,$0000
	dc.w	$018A,$0000,$018C,$0000,$018E,$0000,$0190,$0000,$0192,$0000
	dc.w	$0194,$0000,$0196,$0000,$0198,$0000,$019A,$0000,$019C,$0000
	dc.w	$019E,$0000,$01A0,$0000,$01A2,$0000,$01A4,$0000,$01A6,$0000
	dc.w	$01A8,$0000,$01AA,$0000,$01AC,$0000,$01AE,$0000,$01B0,$0000
	dc.w	$01B2,$0000,$01B4,$0000,$01B6,$0000,$01B8,$0000,$01BA,$0000
	dc.w	$01BC,$0000,$01BE,$0000,$0106,$C020,$0180,$0000,$0182,$0000
	dc.w	$0184,$0000,$0186,$0000,$0188,$0000,$018A,$0000,$018C,$0000
	dc.w	$018E,$0000,$0190,$0000,$0192,$0000,$0194,$0000,$0196,$0000
	dc.w	$0198,$0000,$019A,$0000,$019C,$0000,$019E,$0000,$01A0,$0000
	dc.w	$01A2,$0000,$01A4,$0000,$01A6,$0000,$01A8,$0000,$01AA,$0000
	dc.w	$01AC,$0000,$01AE,$0000,$01B0,$0000,$01B2,$0000,$01B4,$0000
	dc.w	$01B6,$0000,$01B8,$0000,$01BA,$0000,$01BC,$0000,$01BE,$0000
	dc.w	$0106,$E020,$0180,$0000,$0182,$0000,$0184,$0000,$0186,$0000
	dc.w	$0188,$0000,$018A,$0000,$018C,$0000,$018E,$0000,$0190,$0000
	dc.w	$0192,$0000
FreeLine:
	blk.b	[FreeLine-Line]*[HeightCopper-1],0
EndCop:	dc.l	-2,-2			; end copperlist
CopperListEnd:

CopperList2:	blk.b	CopperListEnd-CopperList,0

Copper1:	dc.l	CopperList		; copper da vedere
Copper2:	dc.l	CopperList2		; copper da calcolare

SprData:	incbin	"sprite1-50"

	section	dat,data
*************************
** Dati per routine 3D **
*************************
NPOINTS=40
Nfaces=20

Wx:
	dc.w	-120,120,120,-120
	dc.w	360,360
	dc.w	-360,-360
	dc.w	600,600
	dc.w	-600,-600

	dc.w	600,600
	dc.w	600,600
	dc.w	600,600
	dc.w	600,600
	dc.w	600,600

	dc.w	-600,-600
	dc.w	-600,-600
	dc.w	-600,-600
	dc.w	-600,-600
	dc.w	-600,-600

	dc.w	-360,-360
	dc.w	-120,-120
	dc.w	120,120
	dc.w	360,360
Wy:
	dc.w	-120,-120,-120,-120
	dc.w	-120,-120
	dc.w	-120,-120
	dc.w	-120,-120
	dc.w	-120,-120

	dc.w	120,120
	dc.w	360,360
	dc.w	600,600
	dc.w	840,840
	dc.w	1080,1080

	dc.w	120,120
	dc.w	360,360
	dc.w	600,600
	dc.w	840,840
	dc.w	1080,1080

	dc.w	1080,1080
	dc.w	1080,1080
	dc.w	1080,1080
	dc.w	1080,1080
Wz:
	dc.w	-100,-100,100,100
	dc.w	-100,100
	dc.w	-100,100
	dc.w	-100,100
	dc.w	-100,100

	dc.w	-100,100
	dc.w	-100,100
	dc.w	-100,100
	dc.w	-100,100
	dc.w	-100,100

	dc.w	-100,100
	dc.w	-100,100
	dc.w	-100,100
	dc.w	-100,100
	dc.w	-100,100

	dc.w	-100,100
	dc.w	-100,100
	dc.w	-100,100
	dc.w	-100,100
WLines:
	dc.w	0,1,2,3
	dc.w	1,4,5,2
	dc.w	6,0,3,7
	dc.w	4,8,9,5
	dc.w	10,6,7,11

	dc.w	8,12,13,9
	dc.w	12,14,15,13
	dc.w	14,16,17,15
	dc.w	16,18,19,17
	dc.w	18,20,21,19

	dc.w	22,10,11,23
	dc.w	24,22,23,25
	dc.w	26,24,25,27
	dc.w	28,26,27,29
	dc.w	30,28,29,31

	dc.w	32,30,31,33
	dc.w	34,32,33,35
	dc.w	36,34,35,37
	dc.w	38,36,37,39
	dc.w	20,38,39,21
WTexture:
	dc.l	Texture1
	dc.l	Texture2
	dc.l	Texture5
	dc.l	Texture2
	dc.l	Texture1

	dc.l	Texture3
	dc.l	Texture4
	dc.l	Texture5
	dc.l	Texture4
	dc.l	Texture3

	dc.l	Texture3
	dc.l	Texture4
	dc.l	Texture5
	dc.l	Texture4
	dc.l	Texture3

	dc.l	Texture1
	dc.l	Texture2
	dc.l	Texture5
	dc.l	Texture2
	dc.l	Texture1

	cnop	0,4
sintab:		incbin	"sintab"
	cnop	0,4
intX:		blk.w	npoints,0
	cnop	0,4
intY:		blk.w	npoints,0
	cnop	0,4
intZ:		blk.w	npoints,0
	cnop	0,4
intX1:		blk.w	npoints,0
	cnop	0,4
intY1:		blk.w	npoints,0
	cnop	0,4

PaletteChunky:			; salvata con LoadRGB4
	dc.w	$0000,$0fff,$0eee,$0ddd,$0ccc,$0bbb,$0aaa,$0999,$0888,$0777
	dc.w	$0666,$0555,$0444,$0333,$0222,$0111

	dc.w	$0100,$0000,$0fff,$0888,$0888,$0888,$0999,$0999,$0999,$0999
	dc.w	$0aaa,$0aaa,$0aaa,$0aaa,$0bbb,$0bbb,$0bbb,$0bbb,$0bbb,$0ccc
	dc.w	$0ccc,$0ccc,$0ccc,$0ddd,$0ddd,$0ddd,$0ddd,$0ddd,$0eee,$0eee
	dc.w	$0eee,$0eee,$0666,$0000,$0777,$0240,$0620,$0510,$0750,$0540
	dc.w	$0350,$0030,$0256,$0133,$0035,$0024,$0744,$0522,$0731,$0632
	dc.w	$0410,$0753,$0407,$0306,$0530,$0420,$0752,$0642,$0454,$0343
	dc.w	$0253,$0032,$0111,$0777,$0ff0,$0ee0,$0dd0,$0cc0,$0bb0,$0aa0
	dc.w	$0990,$0880,$0770,$0660,$0550,$0440,$0330,$0220,$0110,$0000
	dc.w	$0f00,$0e00,$0d00,$0c00,$0b00,$0a00,$0900,$0800,$0700,$0600
	dc.w	$0500,$0400,$0300,$0200,$0100,$0000,$00f0,$00e0,$00d0,$00c0
	dc.w	$00b0,$00a0,$0090,$0080,$0070,$0060,$0050,$0040,$0030,$0020
	dc.w	$0010,$0000,$000f,$000e,$000d,$000c,$000b,$000a,$0009,$0008
	dc.w	$0007,$0006,$0005,$0004,$0003,$0002,$0001,$0000,$00ff,$00ee
	dc.w	$00dd,$00cc,$00bb,$00aa,$0099,$0088,$0077,$0066,$0055,$0044
	dc.w	$0033,$0022,$0011,$0000,$0f0f,$0e0e,$0d0d,$0c0c,$0b0b,$0a0a
	dc.w	$0909,$0808,$0707,$0606,$0505,$0404,$0303,$0202,$0101,$0000
	dc.w	$0fff,$0ffe,$0ffd,$0ffc,$0ffb,$0ffa,$0ff9,$0ff8,$0ff7,$0ff6
	dc.w	$0ff5,$0ff4,$0ff3,$0ff2,$0ff1,$0ff0,$0fff,$0eee,$0ddd,$0ccc
	dc.w	$0bbb,$0aaa,$0999,$0888,$0777,$0666,$0555,$0444,$0333,$0222
	dc.w	$0111,$0000,$0f77,$0f87,$0fa7,$0fb7,$0fc7,$0fd7,$0ff7,$0ef7
	dc.w	$0df7,$0bf7,$0af7,$09f7,$08f7,$07f8,$07f9,$07fa,$07fc,$07fd
	dc.w	$07fe,$07ef,$07df,$07cf,$07bf,$079f,$078f,$077f,$097f,$0a7f
	dc.w	$0b7f,$0c7f,$0e7f,$0f7f,$0f00,$0f20,$0f50,$0f70,$0fa0,$0fc0
	dc.w	$0fe0,$0df0,$0bf0,$08f0,$06f0,$03f0,$01f0,$00f1,$00f4,$00f6
	dc.w	$00f9,$00fb,$00fd,$00ef,$00bf,$009f,$007f,$004f,$002f,$000f
	dc.w	$030f,$050f,$080f,$0a0f,$0c0f,$0f0f

	section	data10,data
Texture1:	incbin	"Text1.chunky"

	section	data11,data
Texture2:	incbin	"Text2.chunky"

	section	data12,data
Texture3:	incbin	"Text3.chunky"

	section	data13,data
Texture4:	incbin	"Text4.chunky"

	section	data14,data
Texture5:	incbin	"Text5.chunky"

	section	data15,data
RuotazionePlayer: incbin	"sinus6"	; oscilla tra 0 e 10

	section	bss,bss
	ds.b	100000		; serve per non sporcare la memoria
Chunky:	ds.b	106*76
	ds.b	100000		; serve per non sporcare la memoria

XYData:		ds.w	3*10000
XYDataEnd:
