SinScroll:

;Kodowaî:	 Dariusz Czyţ "THORON"
;		 ul. Mielczarskiego 1/49
;		 97-200 Tomaszów Maz.

;Przed pierwszym wywoîaniem SinScroll trzeba wywoîaç SinSInit koniecznie!
;W a6 musi byc $dff000
;Teksty musza zaczynac sie od etykiety SinSTekst i konczyc sie zerem
;SinSBuf musi znajdowaç sie w pamięci CHIP i posiadaç dîugoőç  700 (672) bajty


	bsr.w	SinSLicz
	btst	#6,2(a6)	;Kasowanie obszaru gdzie wstawiany jest Scroll
	bne.s	*-6
	move.l	SinSAEkr(pc),$54(a6)
	move.l	#$01000000,$40(a6)
	move.l	#$0010,$66(a6)
	move.w	#96*64+20,$58(a6)	;Kasowanie 320x96
	bsr.w	SinSWstawiaj
SinSPrzesun:
	move.w	SinSKBZ(pc),d0
	beq.s	SinSNowyZnak	;Czy przesunięto caîy znak
	subq.w	#1,SinSKBZ
SinSPrzesun1:
	btst	#6,2(a6)
	bne.s	SinSPrzesun1
	move.l	#SinSBuf+670,d0
	move.l	d0,$50(a6)
	move.l	d0,$54(a6)
	move.l	#$ffff7fff,$44(a6)
	move.l	#$19f00002,$40(a6)
	move.l	#$00000000,$64(a6)
	move.w	#$0415,$58(a6)		;przesunięcie zawaroőci SinSBuf
	rts
SinSNowyZnak:
	move.w	SinSPP(pc),SinSKBZ
	move.l	SinSWT(pc),a0
	move.b	(a0)+,d0
	bne.s	SinSNowyZnak1
	move.l	#SinSTekst,SinSWT	;Ustaw wskaűnik tekstu na poczćtek
	bra.s	SinSNowyZnak
SinSNowyZnak1:
	move.l	a0,SinSWT
	add.w	d0,d0
	add.w	d0,d0		;numer znaku *4 (wskaűnik na adres znaku)
	lea	SinSTAZ(pc),a0
	move.l	(a0,d0.w),d1	;weű adres znaku
SinSNowyZnak2:
	btst	#6,2(a6)
	bne.s   SinSNowyZnak2
	move.l	d1,$50(a6)
	move.l	#SinSbuf+40,$54(a6)
	move.l	#$ffffffff,$44(a6)
	move.l	#$09f00000,$40(a6)
	move.l	#$00260028,$64(a6)
	move.w	#$0401,$58(a6)
	bra.w	SinSPrzesun1

SinSWstawiaj:
	lea	SinSTabB(pc),a0
	move.w	#159,d0			;dîugoőç fali 160*2=320
SinSWstawiaj1:
	btst	#6,2(a6)
	bne.s	SinSWstawiaj1
	move.l	(a0)+,$50(a6)		;Skćd pobieraç
	move.l	(a0),$54(a6)		;Gdzie wstawiaç
	move.l	(a0)+,$4c(a6)
	move.w	(a0)+,$44(a6)		;Maska znaku (BLTAFWM)
	move.w	#$ffff,$46(a6)
	move.l	#$0dfc0000,$40(a6)	;D=A+B
	move.l	#$00280026,$64(a6)
	move.w	#$0026,$62(a6)
	move.w	#$0401,$58(a6)		;Przesîanie 16x16
	subq	#1,d0
SinSWstawiaj2:
	btst	#6,2(a6)
	bne.s	SinSWstawiaj2
	move.l	(a0)+,$50(a6)
	move.l	(a0),$54(a6)
	move.l	(a0)+,$4c(a6)
	move.w	(a0)+,$44(a6)
	move.w	#$0401,$58(a6)
	dbf	d0,SinSWstawiaj2
	rts

SinSLicz:
	move.l	#SinSBuf,d6		;adres bufora
	move.l	SinSAEkr(pc),d4		;adres ekranu lewy górny róg
	move.w	#159,d3
	lea	SinSTab(pc),a0
	move.l	#$c000,d2
	lea	SinSTabB(pc),a2
	move.w	SinSK(pc),d5
	addq.w	#1,d5
	and.w	#127,d5
	move.w	d5,SinSK
	add.w	d5,d5
SinSLicz1:
	moveq	#0,d1
	move.w	(a0,d5),d1
	addq.w	#2,d5
	and.w	#127*2,d5
	add.l	d4,d1
	move.l	d6,(a2)+
	move.l	d1,(a2)+
	move.w	d2,(a2)+
	ror.w	#2,d2
	cmp.w	#$c000,d2
	bne.s	SinSLicz2
 	addq.l	#2,d6
	addq.l	#2,d4
SinSLicz2:
	dbf	d3,SinSLicz1
	rts

SinSInt:
	move.l	#EkranSinS,SinSAEkr
	lea	SinSTab(pc),a0
	moveq	#127,d1		;Iloőç danych fali
SinSInt1:
	moveq	#0,d0
	move.w	(a0),d0
	add.w	#39,d0		;Tylko wartoőci dodatnie
	mulu	#40,d0		;pomnoţenie przez szerokoőç bitplanu
	move.w	d0,(a0)+
	dbf	d1,SinSInt1
	move.l	#SinSGenZnak,d0

SinSAZNAKOW:

SinSIZWL:	equ	20	;Iloőç znaków w linii
SinSILZ:	equ	4	;Ile linii znaków
SinSIBNZ:	equ	2	;Ile bajtów na znak
SinSWZ:		equ	16	;Wysokoőç znaków

;Wejscie
;	d0 - adres pierwszego znaku w zestawie


	moveq	#0,d7
	moveq	#0,d6
	lea	SinSTAZ(pc),a5	;w a5 adres tablicy adresow znakow

SinSAZNAK1:
	move.w	#SinSIZWL*SinSWZ*SinSIBNZ,d5
	mulu	d7,d5
	moveq	#0,d4
	move.w	d6,d4
	mulu	#SinSIBNZ,d4
	add.l	d0,d4
	add.l	d5,d4
	move.l	d4,(a5)+
	addq.b	#1,d6
	cmp.b	#SinSIZWL,d6
	bne.b	SinSAZNAK1
	moveq	#0,d6
	addq.b	#1,d7
	cmp.b	#SinSILZ,d7
	bne.B	SinSAZNAK1
	rts
SinSKBZ:
	dc.w	0	;Który bit znaku jest przesuwany
SinSPP:
	dc.w	15	;Prędkoőç przesuwania przepisywana do SinSKBZ
SinSWt:
	dc.l	0	;Wskaűnik na tekst
SinSK:
	dc.w	0	;Krok dla fali sinusa
SinSAEkr:
	dc.l	0	;Adres bitmapy dla wstawiania sinus scrolla 320*16+x

SinSTab:
	DC.W	$0000,$0001,$0003,$0005,$0007,$0009,$000B,$000D,$000E,$0010
	DC.W	$0012,$0014,$0015,$0017,$0018,$001A,$001B,$001C,$001E,$001F
	DC.W	$0020,$0021,$0022,$0023,$0024,$0024,$0025,$0025,$0026,$0026
	DC.W	$0026,$0026,$0027,$0026,$0026,$0026,$0026,$0025,$0025,$0024
	DC.W	$0024,$0023,$0022,$0021,$0020,$001F,$001E,$001C,$001B,$001A
	DC.W	$0018,$0017,$0015,$0014,$0012,$0010,$000E,$000D,$000B,$0009
	DC.W	$0007,$0005,$0003,$0001,$0000,$FFFF,$FFFD,$FFFB,$FFF9,$FFF7
	DC.W	$FFF5,$FFF3,$FFF2,$FFF0,$FFEE,$FFEC,$FFEB,$FFE9,$FFE8,$FFE6
	DC.W	$FFE5,$FFE4,$FFE2,$FFE1,$FFE0,$FFDF,$FFDE,$FFDD,$FFDC,$FFDC
	DC.W	$FFDB,$FFDB,$FFDA,$FFDA,$FFDA,$FFDA,$FFD9,$FFDA,$FFDA,$FFDA
	DC.W	$FFDA,$FFDB,$FFDB,$FFDC,$FFDC,$FFDD,$FFDE,$FFDF,$FFE0,$FFE1
	DC.W	$FFE2,$FFE4,$FFE5,$FFE6,$FFE8,$FFE9,$FFEB,$FFEC,$FFEE,$FFF0
	DC.W	$FFF2,$FFF3,$FFF5,$FFF7,$FFF9,$FFFB,$FFFD,$FFFF
SinSTabB:
	blk.b	2000,0
SinSTAZ:
	blk.l	SinSIZWL*SinSILZ+1,0
SinSTekst:
	dc.b	0	;Tekst zakończony zerem
	even

	section	SinS_1,bss_c
SinSBuf:
	ds.b	672	;bufor