;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
;=						     =
;= Standard IRQ-setup for ESA Norway demos & intros. =
;=						     =
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
definitions:

     custom  = $dff000
     mouse   = $bfe001
     dmaconr = $02
     dmaconw = $96
     cop1lch = $80
     vhpos   = $06
     swide   = $28
     bltcon0 = $40
     bltcon1 = $42
     bltamod = $64
     bltbmod = $62
     bltcmod = $60
     bltdmod = $66
     bltadat = $74
     bltbdat = $72
     bltcdat = $70
     bltddat = $00
     bltafwm = $04
     bltalwm = $46
     bltapt  = $50
     bltbpt  = $4c
     bltcpt  = $48
     bltdpt  = $54
     bltsize = $58

prgstrt:
	lea	custom,a0		; A0 points at custom chips
	move.w	#$8180,dmaconw(a0)	; Enable the 2 DMA
	move.w	#$0020,dmaconw(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,mouse		; 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,dmaconw(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	slet
	bsr	subline
 
	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,$0005,$00e2,$0000
	dc.w	$3011,$fffe,$0100,$1200
	dc.w	$ffe1,$fffe
	dc.w	$2f11,$fffe
	dc.w	$0100,$0200
	dc.w	$ffff,$fffe

subline:
	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
bltrdy:	btst	#14,dmaconr(a5)
	bne.s	bltrdy
	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
	
;	*****************************
;	*** Rotations beregninger ***
;	*****************************

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

slet:	move.l	screen,a0
	move.l	#2550,d0
clr:	clr.l	(a0)+
	dbf	d0,clr
	rts

clrbuf:	blk.l	20,$0000000

FIGUR:	
eq1:	dc.w	135,120,115
	dc.w	125,120,115
	dc.w	135,120,115
eq1a:	dc.w	135,120,115
	dc.w	125,120,115
eq1b:	dc.w	125,120,115
eq1c:	dc.w	125,120,115
eq1d:	dc.w	136,120,115
	
eq2:	dc.w	155,120,115
	dc.w	145,120,115
	dc.w	155,120,115
eq2a:	dc.w	155,120,115
	dc.w	145,120,115
eq2b:	dc.w	145,120,115
eq2c:	dc.w	155,120,115
eq2d:	dc.w	144,120,115
	
eq3:	dc.w	165,120,115
	dc.w	175,120,115
	dc.w	165,120,115
eq3a:	dc.w	165,120,115
	dc.w	175,120,115
eq3b:	dc.w	175,120,115
eq3c:	dc.w	165,120,115
eq3d:	dc.w	176,120,115

eq4:	dc.w	185,120,115
	dc.w	195,120,115
	dc.w	185,120,115
eq4a:	dc.w	185,120,115
	dc.w	195,120,115
eq4b:	dc.w	195,120,115
eq4c:	dc.w	185,120,115
eq4d:	dc.w	195,120,115

dun:	dc.w	200,125,115
	dc.w	120,125,115
	dc.w	200,75,115
	dc.w	120,75,115

	dc.w	200,125,115
	dc.w	200,75,115
	dc.w	120,125,115
	dc.w	120,74,115

	dc.w	180,130,115
	dc.w	180,140,115
	dc.w	185,130,115
	dc.w	185,140,115
	dc.w	180,130,115
	dc.w	185,140,115

	dc.w	187,134,115
	dc.w	187,140,115
	dc.w	187,134,115
	dc.w	192,134,115
	dc.w	187,136,115
	dc.w	190,136,115
	dc.w	187,140,115
	dc.w	192,140,115

	dc.w	194,134,115
	dc.w	194,140,115
	dc.w	194,134,115
	dc.w	199,134,115
	dc.w	194,136,115
	dc.w	197,136,115

	dc.w	$8000

