;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
;=						     =
;= Standard IRQ-setup for ESA Norway demos & intros. =
;=						     =
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
definitions:
     custom       = $dff000
     cop1lch      = $080
     dmacon       = $096

	BLTCON0 = $40
	BLTCON1 = $42
	BLTAMOD = $64
 	BLTBMOD = $62
 	BLTCMOD = $60
	BLTDMOD = $66
	BLTADAT = $74
	BLTBDAT = $72
	BLTCDAT = $70
	BLTDDAT = $00
	BLTAFWM = $44
	BLTALWM = $46
	BLTAPT  = $50
	BLTBPT  = $4C
	BLTCPT  = $48
	BLTDPT  = $54
	BLTSIZE = $58

	DMACONR = $02
	DMACONW = $96
	INTREQR = $1E
	INTREQ  = $9C
	VHPOS   = $06

	IRQBASE = $6C
	LEFTMUS = $BFE001
	SWIDE = 40

prgstrt:
	lea	custom,a0		; A0 points at custom chips
	move.w	#$8180,dmacon(a0)	; Enable the 2 DMA
	move.w	#$0020,dmacon(a0)	; Disable the spr DMA
	move.l	4,a6			; Base of exec.lib
	move.l	156(a6),a1		; a1 = gfx.lib.adr.
	move.l	38(a1),sys_copper	; Stores old copper1
	move.l	a7,sys_stack		; Stores old stack
	move.l	#cop,cop1lch(a0)	; Starts new copper1

check:	btst	#6,$bfe001		; Waits for the
	beq	quit			; left mousebutton
vblank:	cmp.b	#255,vhpos(a0)		; Vertical blacking
	bne	vblank
	movem.l	d0-d7/a0-a6,-(sp)	; Sub-routines
	jsr	vector
	movem.l	(sp)+,d0-d7/a0-a6
	jmp	check

quit:	move.l	sys_stack,a7
	move.l	sys_copper,$dff080
	clr.l	d0
	lea	custom,a0		; A0 points at custom chips
	move.w	#$8020,dmacon(a0)	; Re-enable sprite DMA
	clr.l	d0
	rts

sys_stack:	dc.l	0
sys_copper:	dc.l	0
SCREEN:	DC.L 	$60000
BUFSEL:	DC.W 	$0001


vector:	movem.l 	clrbuf,d0-d7/a0-a6
	lea	custom,a5
	eor.w	#$0001,bufsel
	beq.s	buf2
	move.l	#$60000,screen
	move.w	#$05000,planer+6
	bra.s	buffer

buf2:	move.l	#$65000,screen
	move.w	#$00000,planer+6

buffer: jsr	sletscr
	bsr	sublinie
 
	addq.w	#$0002,Yvinkel
	cmp.w	#000360,Yvinkel
	ble.s	ok
	move.w	#$00000,Yvinkel

ok:	addq.w	#$0002,Xvinkel
	cmp.w	#000360,Xvinkel
	ble.s	ok1
	move.w	#$00000,Xvinkel

ok1:	addq.w	#$0003,Zvinkel
	cmp.w	#000360,Zvinkel
	ble.s	ok2
	move.w	#$00000,Zvinkel
ok2:
	rts

COP:	dc.w	$008e,$2c81,$0090,$40ff
	dc.w 	$0092,$0038,$0094,$00d0
	dc.w 	$0102,$0000
MODULO:	dc.w 	$0108,$0000
	dc.w	$0180,$0000,$0100,$0200
	dc.w	$0182,$0f0f,$0184,$0aaa
	dc.w	$0186,$0cc
PLANER:	dc.w	$00e0,$0006,$00e2,$0000
	dc.w	$3011,$fffe,$0100,$1200
	dc.w	$ffe1,$fffe
	dc.w	$2f11,$fffe
	dc.w	$0100,$0200
	dc.w	$ffff,$fffe


sublinie:
	lea	figur,a4
newlin:	move.w	(a4)+,XP
	move.w	(a4)+,YP
	move.w	(a4)+,ZP

	bsr	rotate
	bsr	k3dto2d
 
	move.w	d0,Xlin1
	move.w	d1,Ylin1
	move.w	(a4)+,XP
	move.w	(a4)+,YP
	move.w	(a4)+,ZP

	bsr	rotate
	bsr	k3dto2d

	move.w	d0,Xlin2
	move.w	d1,Ylin2
	movem.l	clrbuf,d0-d3
	move.w	Xlin1,d0

	move.w	Ylin1,d1
	move.w	Xlin2,d2
	move.w	Ylin2,d3

	cmp.w	d0,d2
	bne.s	linok
	cmp.w	d1,d3
	bne.s	linok
	bra.s	nolin
linok:	bsr	line
nolin:	cmp.w	#$8000,(a4)
	beq.s	figdraw
	bra.l	newlin

figdraw:rts

Xlin1:	dc.w	$0000
Ylin1:	dc.w	$0000
Xlin2:	dc.w	$0000
Ylin2:	dc.w	$0000
	
;	***************************
;	*** Selve linje rutinen	***
;	***************************

line:	clr.l	d4
	sub.w	d1,d3
	bge.s	dypos
	neg.w	d3
	bra.s	dyneg
dypos:	bset	#0,d4

dyneg:	sub.w	d0,d2
	bge.s	dxpos
	neg.w   d2
	bra.s	dxneg
dxpos:	bset	#1,d4

dxneg:	move.w	d2,d5
	sub.w	d3,d5
	bge.s	dxdypos
	exg	d2,d3
	bra.s	dxdyneg
dxdypos:bset	#2,d4

dxdyneg:clr.w	d5
	ror.w	#4,d0
	or.w	#$0b00,d0
	move.b	d0,d5
	move.b	#$ca,d0
	lsl.w	#1,d5
	muls	#swide,d1
	add.w	d5,d1
	add.l	screen,d1

BLITRDY:btst	#14,DMACONR(a5)
	bne.s	BLITRDY
	move.b	OCTANTS(PC,d4),d4
	add.l	d3,d3
	move.w	d3,BLTBMOD(a5)
	sub.w	d2,d3
	bge.s	DLDSPOS
	or.b	#$40,d4
DLDSPOS:move.l	d3,BLTAPT(a5)
	sub.w	d2,d3
	move.w	d3,BLTAMOD(a5)
	move.w	d4,BLTCON1(a5)
	move.w	d0,BLTCON0(a5)
	move.l	d1,BLTCPT(a5)
	move.l	d1,BLTDPT(a5)
	move.w	#SWIDE,BLTCMOD(a5)
	move.w	#SWIDE,BLTDMOD(a5)
	move.w	#$8000,BLTADAT(a5)
	move.w	#$ffff,BLTAFWM(a5)
	move.w	MASKE,BLTBDAT(a5)
	asl.w	#6,d2
	add.w	#2,d2
	move.w	d2,BLTSIZE(a5)
	rts

MASKE:	dc.w	$ffff

;	*** Octants tabel for alm. linjer ***

OCTANTS:dc.b	$03*4+1
	dc.b	$02*4+1
	dc.b	$01*4+1
	dc.b	$00*4+1
	dc.b	$07*4+1
	dc.b	$05*4+1
	dc.b	$06*4+1
	dc.b	$04*4+1
	
ROTATE:	movem.l	CLRBUF,d0-d3
	move.w	XP,d0
	move.w	YP,d1
	move.w	ZP,d2
	sub.w	C1,d0
	sub.w	C2,d1
	sub.w	C3,d2
	move.w	d0,XP
	move.w	d1,YP
	move.w	d2,ZP

	move.w	C1,d0
	move.w	C2,d1
	move.w	C3,d2
	add.w	d0,XP
	add.w	d1,YP
	add.w	d2,ZP
	rts
	
X0:	dc.w	00
Y0:	dc.w	00

X:	dc.w	00
Y:	dc.w	00

XP:	dc.w	000

YP:	dc.w	000
ZP:	dc.w	000
C1:	dc.w	159
C2:	dc.w	100
C3:	dc.w	100
	
XVINKEL:dc.w	10
YVINKEL:dc.w	00
ZVINKEL:dc.w	00
		
SINV:	dc.w	00
COSV:	dc.w	00

;***********************
;*** Fortegns tabell ***
;***********************

EXORTAB:dc.w	$0000,$0000
	dc.w	$ffff,$ffff
	dc.w	$0000,$0000
	dc.w	$ffff,$ffff

;*******************************
;*** Sinus og Cosinus tabell ***
;*******************************

SINTAB:
dc.b	0,1,2,3,4,6,7,8,9,10,11,12,13,14,15,17,18,19,20,21,22,23
dc.b	24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,39,40,41
dc.b	42,43,44,44,45,46,47,48,48,49,50,50,51,52,52,53,54,54,55
dc.b	55,56,57,57,58,58,58,59,59,60,60,61,61,61,62,62,62,62,63
dc.b	63,63,63,63,64,64,64,64,64,64,64
dc.b	64,64,64,64,64,64,64,64,63,63,63,63
dc.b	63,62,62,62,62,61,61,61,60,60,59,59,58,58,58,57,57,56,55
dc.b	55,54,54,53,52,52,51,50,50,49,48,48,47,46,45,44,44,43,42
dc.b	41,40,39,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24
dc.b	23,22,21,20,19,18,17,15,14,13,12,11,10,9,8,7,6,4,3,2,1

COSTAB:
dc.b	64,64,64,64,64,64,64,64,63,63,63,63
dc.b	63,62,62,62,62,61,61,61,60,60,59,59,58,58,58,57,57,56,55
dc.b	55,54,54,53,52,52,51,50,50,49,48,48,47,46,45,44,44,43,42
dc.b	41,40,39,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24
dc.b	23,22,21,20,19,18,17,15,14,13,12,11,10,9,8,7,6,4,3,2,1,0
dc.b	-1,-2,-3,-4,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-17,-18
dc.b	-19,-20,-21,-22,-23,-24,-25,-26,-27,-28,-29,-30,-31,-32,-33
dc.b	-34,-35,-36,-37,-38,-39,-39,-40,-41,-42,-43,-44,-44,-45,-46
dc.b	-47,-48,-48,-49,-50,-50,-51,-52,-52,-53,-54,-54,-55,-55,-56
dc.b	-57,-57,-58,-58,-58,-59,-59,-60,-60,-61,-61,-61,-62,-62,-62
dc.b	-62,-63,-63,-63,-63,-63,-64,-64,-64,-64,-64,-64,-64

EVEN

;*********************************************************
;*** Konvertering fra 3 dimensjoner til  2 dimensjoner ***
;*********************************************************

K3DTO2D:movem.l	CLRBUF,d0-d3
	move.w	XP,d0
	move.w	YP,d1
	move.w	ZP,d2
	bne.s	ZOK
	moveq	#$0001,d2
ZOK:	sub.w	C1,d0
	sub.w	C2,d1
	muls	ZOOM,d0
	muls	ZOOM,d1
	divs	d2,d0
	divs	d2,d1
	add.w	C1,d0
	add.w	C2,d1
	rts

ZOOM:	dc.w	00100

;	********************
;	*** Slett screen ***
;	********************

SLETSCR:move.l	SCREEN,a0
	move.l	#2550,d0
CLEAR:	clr.l	(a0)+
	dbf	d0,CLEAR
	rts 
CLRBUF:blk.l	20,$0000000

figur:	dc.w	150,117,90
	dc.w	150,137,90

	dc.w	150,117,90
	dc.w	170,117,90

	dc.w	150,137,90
	dc.w	170,137,90

	dc.w	170,117,90
	dc.w	170,137,90

	dc.w	150,117,110
	dc.w	150,137,110

	dc.w	150,117,110
	dc.w	170,117,110

	dc.w	150,137,110
	dc.w	170,137,110

	dc.w	170,117,110
	dc.w	170,137,110

	dc.w	170,117,110
	dc.w	170,117,90

	dc.w	170,137,110
	dc.w	170,137,90

	dc.w	150,117,110
	dc.w	150,117,90

	dc.w	150,137,110
	dc.w	150,137,90

	dc.w	$8000
