org  $40000
load $40000

RASTER = $ff
BEGIN = 90

WIDTH = 20
HIGH = 150

Xc = [WIDTH*4]
Yc = [HIGH/2]
SIZE = WIDTH*HIGH
DEEP = 3

BASE = $0007
BPL1 = $0000
BPL2 = BPL1 + SIZE
BPL3 = BPL2 + SIZE
DATA = $7ff00

D = 720
K = 240

C = 126

;------------------------------------------------------------------------

START:		dc.b	'DOS',0
		dc.l	0
		dc.l	880

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

		clr.l	36(a1)
		move.w	#9,28(a1)
		jsr	-456(a6)

		lea	GFX(pc),a1
		jsr	-408(a6)
		move.l	d0,a0
		move.l	$26(a0),-(sp)
		move.w	#'do',5(a1)

		lea 	$dff000,a6
		lea	COPPER(pc),a0
		move.w	#$7fff,$96(a6)
		move.l	a0,$80(a6)
		clr.w	$88(a6)
		move.w	#$83c0,$96(a6)

		lea	DATA,a5
		moveq	#BASE,d0
		swap	d0
		move.l	d0,(a5)

LOOP:		bsr.s	FLIP
		bsr	CLS
		bsr	CUBE
		bsr.s	FILL
		btst	#6,$bfe001
		bne.s	LOOP

		bsr	BLT
		move.l	(sp)+,$80(a6)
		clr.w	$88(a6)
		clr.w	$100(a6)
		move.w	#$83f0,$96(a6)

		movem.l	(sp)+,a0-a6/d0-d7
		lea	DOS(pc),a1
		jsr	-96(a6)
		move.l	d0,a0
		move.l	22(a0),a0
		moveq	#0,d0
		rts

;------------------------------------------------------------------------

FLIP:		cmpi.b	#RASTER,$6(a6)
		bne.s	FLIP
		move.l	(a5),d0
		move.w	#SIZE,d1
		lea	LIST(pc),a0
		move.w	d0,(a0)
		add.w	d1,d0
		move.w	d0,4(a0)
		add.w	d1,d0
		move.w	d0,8(a0)
		add.w	d1,d0
		cmpi.w	#[SIZE*DEEP]*3,d0
		bne.s	FLIP1
		clr.w	d0
FLIP1:		move.l	d0,(a5)
		rts

;------------------------------------------------------------------------

FILL:		move.l	(a5),d0
		addi.w	#[SIZE*DEEP]-2,d0
		move.l	#$09f0000a,d1
		bra.s	BLITTER

CLS:		move.l	(a5),d0
		addi.w	#[SIZE*DEEP],d0
		cmpi.w	#[SIZE*DEEP]*3,d0
		bne.s	CLS1
		clr.w	d0
CLS1:		move.l	#$01000000,d1

BLITTER:	bsr.s	BLT
		move.l	d0,$50(a6)
		move.l	d0,$54(a6)
		clr.l	$64(a6)
		move.l	d1,$40(a6)
		move.w	#[DEEP*HIGH*64]+[WIDTH/2],$58(a6)
		rts

;------------------------------------------------------------------------

BLT:		btst	#6,$2(a6)
		bne.s	BLT
		rts

;------------------------------------------------------------------------

; d0		reserved

LINEINIT:	bsr.s	BLT
		moveq	#-1,d0
		move.l	d0,$44(a6)
		move.w	#$8000,d0
		move.l	d0,$72(a6)
		rts

; d0-d1	:	(x1,y1)
; d2-d3	:	(x2,y2)
; d4-d5	:	reserved
; a0	:	screen

LINEDRAW:	cmp.w	d1,d3
		bne.s	LINE1
		rts
LINE1:		blt.s	LINE2
		exg	d2,d0
		exg	d3,d1
LINE2:		addq.w	#1,d3
		moveq	#0,d4
		sub.w	d1,d3
		bpl.s	LINE3
		neg.w	d3
		bra.s	LINE4
LINE3:		ori.b	#1,d4
LINE4:		sub.w	d0,d2
		bpl.s	LINE5
		neg.w	d2
		bra.s	LINE6
LINE5:		ori.b	#2,d4
LINE6:		move.w	d2,d5
		sub.w	d3,d5
		bpl.s	LINE7
		exg	d3,d2
		bra.s	LINE8
LINE7:		ori.b	#4,d4
LINE8:		ror.w	#4,d0
		ori.w	#$0b00,d0
		moveq	#0,d5
		move.b	d0,d5
		add.w	d5,d5
		move.b	#$4a,d0
		mulu	#WIDTH,d1
		add.w	d5,d1
		add.w	d1,a0
		move.b	TABLE(pc,d4.w),d4
		add.w	d3,d3
		bsr.s	BLT
		move.w	d3,$62(a6)
		sub.w	d2,d3
		bpl.s	LINE9
		ori.b	#$42,d4
LINE9:		move.w	d4,$42(a6)
		move.l	d3,$50(a6)
		sub.w	d2,d3
		move.w	d3,$64(a6)
		move.w	d0,$40(a6)
		move.l	a0,$48(a6)
		move.l	a0,$54(a6)
		moveq	#WIDTH,d0
		move.w	d0,$60(a6)
		move.w	d0,$66(a6)
		asl.w	#6,d2
		addi.w	#64+2,d2
		move.w	d2,$58(a6)
		rts

TABLE:		dc.b	15,11,07,03,31,23,27,19

;------------------------------------------------------------------------

; d0-d2		(x,y,z)
; d3		sin
; d4		cos
; d5-d6		reserved
; a0		sin table

ROTATION:	lea	SINUS(pc),a0
		move.b	Alpha-DATA(a5),d5
		bsr.s	ROTATION1
		move.b	Beta-DATA(a5),d5
		bsr.s	ROTATION1
		move.b	Gamma-DATA(a5),d5

ROTATION1:	bsr.s	ROTATION2
		move.w	d6,d3
		addi.b	#$40,d5
		bsr.s	ROTATION2
		move.w	d6,d4

		move.w	d0,d5
		move.w	d1,d6
		muls	d4,d5
		muls	d3,d6
		add.l	d5,d6
		asr.l	#8,d6
		move.w	d0,d5
		move.w	d6,d0
		move.w	d1,d6
		muls	d3,d5
		muls	d4,d6
		sub.l	d5,d6
		asr.l	#8,d6
		move.w	d6,d1
		exg	d1,d2
		exg	d0,d1
		rts

ROTATION2:	move.b	d5,d6
		andi.w	#$007f,d6
		move.b	(a0,d6.w),d6
		tst.b	d5
		bpl.s	ROTATION3
		neg.w	d6
ROTATION3:	rts

SINUS:		dc.b	0,6,12,18,25,31,37,43,49,56,62,68,74,80,86,92,97
		dc.b	103,109,115,120,126,131,136,142,147,152,157,162
		dc.b	167,171,176,181,185,189,193,197,201,205,209,212
		dc.b	216,219,222,225,228,231,234,236,238,241,243,244
		dc.b	246,248,249,251,252,253,254,254,255,255,255,255
		dc.b	255,255,255,254,254,253,252,251,249,248,246,244
		dc.b	243,241,238,236,234,231,228,225,222,219,216,212
		dc.b	209,205,201,197,193,189,185,181,176,171,167,162
		dc.b	157,152,147,142,136,131,126,120,115,109,103,97
		dc.b	92,86,80,74,68,62,56,49,43,37,31,25,18,12,6

;------------------------------------------------------------------------

; d0-d2	:	(x,y,z)
; d3	:	reserved

PROJECTION:	move.w	#K,d3
		addi.w	#D,d2			; z+D
		ble.s	PROJECTION1
		muls	d3,d0			; x*K
		muls	d3,d1			; y*K
		divs	d2,d0			; x' = x*K / z+D
		divs	d2,d1			; y' = y*K / z+D
		addi.w	#Xc,d0
		addi.w	#Yc,d1
PROJECTION1:	rts

;------------------------------------------------------------------------

CUBE:		addq.b	#1,Alpha-DATA(a5)
		addq.b	#2,Beta-DATA(a5)
		subq.b	#1,Gamma-DATA(a5)

		movem.w	Palette-DATA(a5),d1/d2/d4
		moveq	#$0,d0
		move.l	d2,d3
		move.l	d4,d5
		move.l	d4,d6
		move.l	d4,d7
		movem.w	d0-d7,$180(a6)

		lea	COORDS(pc),a1
		lea	Points-DATA(a5),a2
		move.l	a2,a3
		lea	Z-DATA(a5),a4
		moveq	#7,d7
CUBE1:		move.b (a1)+,d0
		move.b (a1)+,d1
		move.b (a1)+,d2
		ext.w	d0
		ext.w	d1
		ext.w	d2
		bsr	ROTATION
		move.l	d2,(a4)+
		bsr.s	PROJECTION
		movem.w	d0/d1,(a2)
		addq.w	#4,a2
		dbf	d7,CUBE1

		pea	Palette-DATA(a5)

		lea	FACES(pc),a1
		move.l	(a5),a4
		moveq	#%01010100,d7
	
CUBE2:		lea	Buffer-DATA(a5),a0
		move.l	a0,a2
		moveq	#0,d0
		moveq	#4-1,d1
CUBE3:		move.b	(a1)+,d0
		move.l	(a3,d0.w),(a0)
		addq.w	#4,a0
		dbf	d1,CUBE3
		move.l	(a2),(a0)

		movem.w	(a2),d0-d5
		sub.w	d0,d2			; x2-x1
		sub.w	d0,d4			; x3-x1
		sub.w	d1,d3			; y2-y1
		sub.w	d1,d5			; y3-y1
		muls	d5,d2			; (y3-y1)*(x2-x1)
		muls	d4,d3			; (x3-x1)*(y2-y1)
		sub.l	d2,d3
		ble.s	CUBE6

		lea	Z-DATA(a5),a0
		moveq	#0,d2
		move.b	-1(a1),d2
		move.l	(a0,d2.w),d0
		move.b	-3(a1),d2
		move.l	(a0,d2.w),d1
		add.w	d1,d0
		bge.s	CUBE4
		neg.w	d0
CUBE4:		lsr.w	#4,d0
		move.l	(sp),a0
		move.w	d0,(a0)
	
		bsr	LINEINIT
		moveq	#4-1,d6
CUBE5:		movem.w	(a2),d0-d3
		move.l	a4,a0
		bsr	LINEDRAW
		addq.w	#4,a2
		dbf	d6,CUBE5

CUBE6:		add.b	d7,d7
		bcc.s	CUBE7
		addq.l	#2,(sp)
		add.w	#SIZE,a4
CUBE7:		tst.b	d7
		bne	CUBE2
		addq.l	#4,sp
		rts

;------------------------------------------------------------------------

COPPER:		dc.w	$008e
		dc.b	BEGIN
		dc.b	$d1
		dc.w	$0090
		dc.b	BEGIN + HIGH
		dc.b	$71
		dc.w	$0092,$0060
		dc.w	$0094,$00a8
		dc.w	$00e0,BASE
		dc.w	$00e4,BASE
		dc.w	$00e8,BASE
		dc.w	$00e2
LIST:		dc.w	BPL1
		dc.w	$00e6,BPL2
		dc.w	$00ea,BPL3
		dc.w	$0100,$3000
		dc.l	-2

COORDS:		dc.b	 C, C, C
		dc.b	 C,-C, C
		dc.b	 C,-C,-C
		dc.b	 C, C,-C
		dc.b	-C, C, C
		dc.b	-C,-C, C
		dc.b	-C,-C,-C
		dc.b	-C, C,-C

FACES:		dc.b	0,4,8,12
		dc.b	20,16,28,24
		dc.b	0,12,28,16
		dc.b	8,4,20,24
		dc.b	0,16,20,4
		dc.b	28,12,8,24

		dc.b	'*'
GFX:		dc.b	"graph"
DOS:		dc.b	"ics.library",0
		dc.b	169,"sep92 Z-One"
x:
;------------------------------------------------------------------------

org DATA
load DATA
Screen:		dc.l	0

Palette:	dc.w	0
		dc.w	0
		dc.w	0

Z:		dc.l	0
		dc.l	0
		dc.l	0
		dc.l	0
		dc.l	0
		dc.l	0
		dc.l	0
		dc.l	0

Points:		dc.l	0
		dc.l	0
		dc.l	0
		dc.l	0
		dc.l	0
		dc.l	0
		dc.l	0
		dc.l	0

Buffer:		dc.l	0
		dc.l	0
		dc.l	0
		dc.l	0
		dc.l	0

Alpha:		dc.b	0
Beta:		dc.b	0
Gamma:		dc.b	0
