
;
;Hmm... by Zeeball
;
;Complaints at: <zeeball@interia.pl>
;


	incbin	Start-4000.bin

ile=28

Algebor:
	moveq	#ile-3,d3	;make equations till n=28
	
	moveq	#3,d7		;count from n=3

	lea.l	ValTable(pc),a5

.mainloop

;now a5=old table pointer...

	move.l	d7,d6
	mulu.w	#3*4,d6		;3*2*n

;now d6=length of prev table...

	lea.l	(a5,d6.w),a4

;now a4=new table pointer...

	move.l	d6,d5
	add.l	#3*4,d5		;one element more...

;now d5=new table length...

	move.l	d7,d0		;n
	asr.l	#1,d0		;n/2

;now d0 gives (n/2)+1 repeats of DBF...

	movem.l	d0-a6,-(sp)

;first element:

	move.l	#1,(a4)
	move.l	d7,4(a4)
	clr.l	8(a4)
	lea.l	12(a4),a4

	move.l	d7,d4		;n
	subq.l	#1,d4		;n-1
.loop
	move.l	(a5),d1		;coeff_1+
	add.l	12(a5),d1	;+coeff_2=
	move.l	d1,(a4)		;=newcoeff_1

	move.l	d4,4(a4)	;power of a
	
	move.l	d7,d1		;n-
	sub.l	d4,d1		;- power of a=
	move.l	d1,8(a4)	;= power of b

	lea.l	12(a5),a5	;prep for next element...
	lea.l	12(a4),a4
	subq.l	#1,d4
	
	dbf	d0,.loop

	movem.l	(sp)+,d0-a6


	move.l	d7,d0		;n
	asr.l	#1,d0		;n/2


;now d0 gives (n/2)+1 repeats of DBF...

	movem.l	d0-a6,-(sp)

	move.l	a4,a5		;end of old table
	lea.l	(a4,d5.w),a4	;end of new table

;last element = 1*a^0*b^n

	move.l	#1,-12(a4)
	clr.l	-8(a4)
	move.l	d7,-4(a4)
	lea.l	-12(a4),a4

	move.l	d7,d4		;n
	subq.l	#1,d4		;n-1
.loop2
	move.l	-12(a5),d1	;coeff_1+
	add.l	-24(a5),d1	;+coeff_2=
	move.l	d1,-12(a4)	;=newcoeff_1

	move.l	d4,-4(a4)	;power of a
	
	move.l	d7,d1		;n-
	sub.l	d4,d1		;- power of a=
	move.l	d1,-8(a4)	;= power of b

	lea.l	-12(a5),a5	;prep for next element...
	lea.l	-12(a4),a4
	subq.l	#1,d4
	
	dbf	d0,.loop2

	movem.l	(sp)+,d0-a6

	move.l	a4,a5
	lea.l	(a4,d5.w),a4
	addq.l	#1,d7

	dbra	d3,.mainloop

	move.l	4.w,a6
	lea.l	DosName(pc),a1
	jsr	-408(a6)	;OldOpenLibrary
	move.l	d0,a6

	jsr	-$3c(a6)	;Output


	move.l	d0,d7		;d7=out filehandle
	lea.l	ValTable(pc),a5

	move.l	#ile-2,d6	;number of print outs

	moveq	#3,d5		;number of elements

.printnext

	pea	Equat(pc)
	move.l	(sp)+,d2
	bsr.w	PrintText

	move.l	d5,d0
	subq.l	#1,d0

	bsr.w	_Number2Ascii

	pea.l	Buffer(pc)
	move.l	(sp)+,d2
	bsr.w	PrintText

	pea.l	Equat_b(pc)
	move.l	(sp)+,d2
	bsr.w	PrintText


	move.l	d5,-(sp)
	subq.l	#1,d5
	bra.b	.noplus
	
.nextel
	pea	plus(pc)
	move.l	(sp)+,d2
	bsr.w	PrintText
.noplus


	move.l	(a5),d0			;print coefficient
	cmp.l	#1,d0
	beq.b	.skip
	bsr.w	_Number2Ascii
	pea.l	Buffer(pc)
	move.l	(sp)+,d2
	bsr.b	PrintText
.skip:

	tst.l	4(a5)			;a^0=1, skip
	beq.b	.skip2
	
	pea	_a(pc)			;print a
	move.l	(sp)+,d2
	bsr.b	PrintText
	
	cmp.l	#1,4(a5)		;a^1=a, skip
	beq.b	.skip2
	
	pea	Pow(pc)			;print ^x
	move.l	(sp)+,d2
	bsr.b	PrintText
	move.l	4(a5),d0
	bsr.w	_Number2Ascii
	pea.l	Buffer(pc)
	move.l	(sp)+,d2
	bsr.b	PrintText
.skip2:


	tst.l	8(a5)			;b^0=1, skip
	beq.b	.skip3
	
	pea	_b(pc)			;print b
	move.l	(sp)+,d2
	bsr.b	PrintText
	
	cmp.l	#1,8(a5)		;b^1=b, skip
	beq.b	.skip3

	pea	Pow(pc)
	move.l	(sp)+,d2
	bsr.b	PrintText
	move.l	8(a5),d0
	bsr.w	_Number2Ascii
	pea.l	Buffer(pc)
	move.l	(sp)+,d2
	bsr.b	PrintText

.skip3:

	lea.l	12(a5),a5

	dbra	d5,.nextel


	move.l	(sp)+,d5
	addq.l	#1,d5

	dbra	d6,.printnext

	pea.l	EndLine(pc)
	move.l	(sp)+,d2
	bra.w	PrintText

PrintText:
	move.l	d2,a0
.look
	tst.b	(a0)+
	bne.b	.look
	sub.l	d2,a0
	move.l	a0,d3
	subq.l	#1,d3

	move.l	d7,d1
	jmp	-48(a6)		;Write



DosName:
	dc.b	"dos.library",0

Equat:
	dc.b	10,10,"(a+b)^",0
Equat_b:
	dc.b	"=",0

_a:
	dc.b	"a",0
_b:
	dc.b	"b",0
Pow:
	dc.b	"^",0
Plus:
	dc.b	"+",0

Endline:
	dc.b	10,10,0

	cnop	0,4

_Number2Ascii:
	movem.l	d0-a6,-(sp)
	bsr.b	Number2Ascii
	movem.l	(sp)+,d0-a6
	rts


Number2Ascii:
	;make decimalascii from num

;d0-numb

	lea.l	Buffer(pc),a0
	clr.l	(a0)
	clr.l	4(a0)
	clr.l	8(a0)
	clr.l	12(a0)
	lea.l	DIVTab(pc),a1
	lea.l	DIVTabEnd(pc),a2
	tst.l	d0
	beq.b	.ZERO
.t1:	sub.l	(a1),d0
	bcc.b	.t2
	add.l	(a1)+,d0
	bra.b	.t1
.t2:	moveq	#0,d1
.t3:	addq.w	#1,d1
	sub.l	(a1),d0
	bcc.b	.t3
	add.l	(a1)+,d0
	addi.b	#"0",d1
	move.b	d1,(a0)+
	cmpa.l	a2,a1
	beq.b	.t5
.t4:	sub.l	(a1),d0
	bcc.b	.t2
	add.l	(a1)+,d0
	move.b	#"0",(a0)+
	cmpa.l	a2,a1
	bne.b	.t4
.t5:	rts
.ZERO:	move.b	#"0",(a0)+
	rts
DivTAB:	dc.l	10000000,1000000,100000,10000,1000,100,10,1
DivTABEnd:

	cnop	0,8
ValTable:
	dc.l	1,2,0
	dc.l	2,1,1
	dc.l	1,0,2	;n=2
	
	ds.l	[3+1]*3
	ds.l	[4+1]*3
	ds.l	[5+1]*3
	ds.l	[6+1]*3
	ds.l	[7+1]*3
	ds.l	[8+1]*3
	ds.l	[9+1]*3
	ds.l	[10+1]*3
	ds.l	[11+1]*3
	ds.l	[12+1]*3
	ds.l	[13+1]*3
	ds.l	[14+1]*3
	ds.l	[15+1]*3
	ds.l	[16+1]*3
	ds.l	[17+1]*3
	ds.l	[18+1]*3
	ds.l	[19+1]*3
	ds.l	[20+1]*3
	ds.l	[21+1]*3
	ds.l	[22+1]*3
	ds.l	[23+1]*3
	ds.l	[24+1]*3
	ds.l	[25+1]*3
	ds.l	[26+1]*3
	ds.l	[27+1]*3
	ds.l	[28+1]*3
	ds.l	[29+1]*3
	ds.l	[30+1]*3

Buffer:	ds.b	16

