;***********************************
;
; HIRES SINUS SCROLL
; MADE BY SIMON JONASSEN (2014)
;
; THIS VERSION WORKS ON PAL & NTSC
;
; THIS WILL NUKE YOUR DOS AS THE 
; SCREEN OFFSET HASN*T BEEN ADJUSTED
;
;***********************************
start	org	$3f00

scrofs	equ	$1e00

	orcc	#$50
	jsr	setup
	jsr	makeit		;first set of tops get calced
	sta	$ffd7

vsync
	lda	$ff03
	bpl	vsync
	lda	$ff02

	sta	$ffd9		;fast poke
	jsr 	scroll		;scroll invisible area 1px
	jsr	makeit		;calc new tops
	sta	$ffd8		;fast off

	jsr	plotter		;plot chars

	lda	zzz+2
	adda	#3		;Amplitude
	sta	zzz+2


	jmp	vsync	


;***********************************
;MAKE A NEW SET OF COORDINATES
;FOR THE NEXT FRAME (ONLY TOPS)
;***********************************
makeit	ldx	#tops
spos	ldb	sintab
	lda	#32
doit	mul
	addd	#$700	
	std	,x++
	lda	spos+2
	adda	#-2		;Frequency
	sta	spos+2
	cmpx	#tops+64
	bne	spos
zzz	ldd	#sintab
	std	spos+1

	rts	

;***********************************
; SCROLL THE INVISIBLE AREA 1PX
; USING ROL (CARRY FALLS OFF)
;***********************************

scroll	ldx	#scrofs		
	ldb	#$f
rolit
	andcc	#$fe		;nuke carry for the scroll
	rol	31,x
	rol	30,x
	rol	29,x
	rol	28,x
	rol	27,x
	rol	26,x
	rol	25,x
	rol	24,x
	rol	23,x
	rol	22,x
	rol	21,x
	rol	20,x
	rol	19,x
	rol	18,x
	rol	17,x
	rol	16,x
	rol	15,x
	rol	14,x
	rol	13,x
	rol	12,x
	rol	11,x
	rol	10,x
	rol	9,x
	rol	8,x
	rol	7,x
	rol	6,x
	rol	5,x
	rol	4,x
	rol	3,x
	rol	2,x
	rol	1,x
	rol	,x
	leax	32,x
	decb
	bne	rolit

	dec	xptr
	bne	out

	lda	#16
	sta	xptr
	jsr	newchar
out	rts


;***********************************
; PLOT A NEW CHAR FROM THE TEXT
; WHEN 16 PIXELS ARE DONE
;***********************************

newchar
	ldx	#chars
tptr	ldb	text
	cmpb	#$ff		;end of scroll
	bne	nxt

	ldd	#text
	std	tptr+1
	bra	tptr
	
nxt	subb	#32
	aslb	
	abx

	ldu	#scrofs+30
l0	ldd	,x
	std	,u

l1	ldd	120,x
	std	32,u

l2	ldd	240,x
	std	64,u

l3	ldd	360,x
	std	96,u

l4	ldd	480,x
	std	128,u

l5	ldd	600,x
	std	160,u

l6	ldd	720,x
	std	192,u


l7	ldd	840,x
	std	224,u

l8	ldd	960,x
	std	256,u

l9	ldd	1080,x
	std	288,u

la	ldd	1200,x
	std	320,u

lb	ldd	1320,x
	std	352,u

lc	ldd	1440,x
	std	384,u

ld	ldd	1560,x
	std	416,u

le	ldd	1680,x
	std	448,u

lf	ldd	1800,x
	std	480,u

	inc	tptr+2
	rts

;***********************************
; SETUP CLS ETC
;***********************************
setup
	lda	#$f8
	sta	$ff22
	sta	$ffc3
	sta	$ffc5
	sta	$ffd7
	
	ldx	#$400
	ldd	#0
cls	std	,x++	
	cmpx	#$2000
	bne	cls

	rts

;***********************************
;VARS
;***********************************
xptr	fcb	16
tops	rmb	64

;***********************************
; PAGE ALIGNED 256 BYTE SINUSTABLE
;***********************************

	org	$4100	

sintab	fcb		32,32,33,34,35,35,36,37,38,38,39,40,41,41,42,43
	fcb		44,44,45,46,46,47,48,48,49,50,50,51,51,52,53,53
	fcb		54,54,55,55,56,56,57,57,58,58,59,59,59,60,60,60
	fcb		61,61,61,61,62,62,62,62,62,63,63,63,63,63,63,63
	fcb		63,63,63,63,63,63,63,63,62,62,62,62,62,61,61,61
	fcb		61,60,60,60,59,59,59,58,58,57,57,56,56,55,55,54
	fcb		54,53,53,52,51,51,50,50,49,48,48,47,46,46,45,44
	fcb		44,43,42,41,41,40,39,38,38,37,36,35,35,34,33,32

	fcb		32,31,30,29,28,28,27,26,25,25,24,23,22,22,21,20
	fcb		19,19,18,17,17,16,15,15,14,13,13,12,12,11,10,10
	fcb		9,9,8,8,7,7,6,6,5,5,4,4,4,3,3,3
	fcb		2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1
	fcb		1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2
	fcb		2,3,3,3,4,4,4,5,5,6,6,7,7,8,8,9
	fcb		9,10,10,11,12,12,13,13,14,15,15,16,17,17,18,19
	fcb		19,20,21,22,22,23,24,25,25,26,27,28,28,29,30,31

;***********************************
; MASSIVE PLOT ROUTINE
;***********************************
	org	$4200

plotter	ldu	#scrofs
	ldb	#0

	
dypp	macro
	ldx	tops+\1*2
	stb	\1-96,x		;3px space above chars
	stb	\1-64,x		;so plot/delete at the 
	stb	\1-32,x		;same time

	lda	\1,u
	sta	\1,x
	lda	\1+32,u
	sta	\1+32,x
	lda	\1+64,u
	sta	\1+64,x
	lda	\1+96,u
	sta	\1+96,x
	lda	\1+128,u
	sta	\1+128,x
	lda	\1+160,u
	sta	\1+160,x
	lda	\1+192,u
	sta	\1+192,x
	lda	\1+224,u
	sta	\1+224,x
	lda	\1+256,u
	sta	\1+256,x
	lda	\1+288,u
	sta	\1+288,x
	lda	\1+320,u
	sta	\1+320,x
	lda	\1+352,u
	sta	\1+352,x
	lda	\1+384,u
	sta	\1+384,x
	lda	\1+416,u
	sta	\1+416,x
	lda	\1+448,u
	sta	\1+448,x
	lda	\1+480,u
	sta	\1+480,x

	stb	\1+512,x
	stb	\1+544,x
	endm

	dypp	0
	dypp	1	
	dypp	2	
	dypp	3	
	dypp	4	
	dypp	5	
	dypp	6	
	dypp	7	
	dypp	8	
	dypp	9	
	dypp	10	
	dypp	11	
	dypp	12	
	dypp	13	
	dypp	14	
	dypp	15	
	dypp	16	
	dypp	17	
	dypp	18	
	dypp	19	
	dypp	20	
	dypp	21	
	dypp	22	
	dypp	23	
	dypp	24	
	dypp	25	
	dypp	26	
	dypp	27	
	dypp	28	
	dypp	29	
	dypp	30
	dypp	31

	rts


;***********************************
; CHARSET 16*16 px
;***********************************

chars	fcb	0,0,3,192,14,56,0,0,1,192,0,4,0,0,1,192,1,240,7,192,1,0,0,0,0,0,0,0,0,0,0,16,7,224,0,192,7,224,127,224,120,30,127,254,7,224,127,224,7,224,7,224,0,0,0,0,0,0,0,0,0,0,15,240,0,0,0,112,127,128,7,224,127,0,7,224,7,224,7,224,120,30,63,252,3,254,120,30,120,0,127,224,127,224,7,224,127,224,7,224,127,224,15,240,63,252,120,30,120,30,120,30,120,30,60,60,127,254,0,0
	fcb	0,0,7,224,31,124,0,0,1,192,28,14,6,0,3,224,3,224,3,224,3,128,3,192,0,0,0,0,0,0,0,56,31,248,3,192,31,248,127,248,120,30,127,254,31,248,127,248,31,248,31,248,0,0,0,0,0,0,0,0,0,0,63,252,7,192,1,252,127,224,31,248,127,192,31,248,31,248,31,248,120,30,63,252,3,254,120,30,120,0,127,248,127,248,31,248,127,248,31,248,127,248,63,240,63,252,120,30,120,30,123,222,120,30,60,60,127,254,0,0
	fcb	0,0,7,224,31,124,0,0,15,248,62,31,31,128,3,224,7,192,1,240,51,152,3,192,0,0,0,0,0,0,0,124,60,60,15,192,60,60,0,60,120,30,120,0,60,60,127,252,60,60,60,60,0,0,0,0,0,24,0,0,0,0,63,252,28,112,3,252,112,240,60,60,113,224,60,60,60,60,60,60,120,30,3,192,3,254,120,60,120,0,127,252,127,252,60,60,120,60,60,60,120,60,124,0,0,0,120,30,120,30,123,222,124,62,60,60,0,30,0,0
	fcb	0,0,7,224,31,124,0,0,31,252,62,62,63,192,3,224,7,192,1,240,59,184,3,192,0,0,0,0,0,0,0,254,56,28,15,192,56,30,0,28,120,30,120,0,56,28,127,252,56,28,56,28,1,192,1,192,0,24,255,254,28,112,127,254,48,24,7,30,112,112,56,28,112,112,56,28,56,28,56,28,120,30,3,192,0,30,120,124,120,0,120,60,120,60,56,28,120,30,56,28,120,30,120,0,0,0,120,30,120,30,123,222,60,60,60,60,0,60,0,0
	fcb	0,0,7,192,15,60,0,0,31,252,62,124,48,192,1,224,15,128,0,248,31,240,3,192,0,0,0,0,0,0,1,252,120,30,3,192,0,30,0,30,120,30,120,0,120,0,0,62,120,30,56,30,3,224,3,224,0,24,255,254,34,136,120,30,38,8,14,30,112,112,120,30,112,56,120,28,120,14,120,14,120,30,3,192,0,30,121,248,120,0,120,30,120,30,120,30,120,30,120,30,120,30,120,0,30,0,120,30,120,30,123,222,62,124,62,60,0,248,0,0
	fcb	0,0,7,128,6,24,0,0,29,192,28,248,48,6,0,192,15,128,0,248,15,224,3,192,0,0,0,0,0,0,3,248,120,30,3,192,0,60,0,62,120,30,120,0,124,0,0,30,124,62,60,62,3,224,3,224,0,24,255,254,89,100,0,30,108,12,28,30,112,224,120,30,112,28,120,60,120,14,120,14,120,30,3,192,0,30,127,240,120,0,123,222,120,30,120,30,120,30,120,30,120,30,120,0,30,0,120,30,120,30,123,222,31,56,31,252,3,240,0,0
	fcb	0,0,7,128,12,48,0,0,31,248,1,240,24,6,1,128,15,128,0,248,63,248,127,254,0,0,127,255,0,0,7,240,120,30,3,192,0,248,7,252,127,254,127,192,127,224,0,30,63,252,31,254,3,224,3,224,6,24,255,254,80,68,0,28,72,4,56,30,127,240,120,0,120,28,127,248,127,224,120,0,127,254,3,192,0,30,127,224,124,0,123,222,120,30,120,30,120,60,120,30,120,62,60,0,30,0,120,30,120,30,123,222,31,152,31,252,7,192,0,0
	fcb	0,0,7,128,0,0,0,0,31,252,3,224,63,238,0,0,15,128,0,248,127,252,127,254,0,0,127,255,0,0,15,224,124,30,3,192,7,240,7,240,127,254,127,248,127,248,0,30,31,248,7,254,1,192,1,192,6,24,0,0,64,4,0,60,64,4,56,30,127,248,124,0,124,30,127,240,127,224,124,254,127,254,7,192,0,62,127,128,126,0,123,222,120,30,120,30,127,248,120,30,127,252,31,224,31,0,124,30,124,30,123,222,15,192,15,252,15,0,0,0
	fcb	0,0,3,0,0,0,0,0,15,252,7,192,63,236,0,0,15,128,0,248,63,248,127,254,3,128,127,255,0,0,31,192,126,30,3,192,31,192,7,252,0,126,1,252,120,60,0,62,63,252,0,30,0,0,0,0,6,120,255,254,32,8,3,248,64,4,120,30,124,60,126,0,124,30,127,192,126,0,126,254,126,30,15,192,0,126,127,224,126,0,123,222,120,30,120,30,127,224,124,222,127,248,7,248,31,128,126,30,62,60,120,30,7,240,3,188,30,0,0,0
	fcb	0,0,0,0,0,0,62,56,1,220,15,156,120,28,0,0,15,128,0,248,15,224,127,254,7,192,127,255,0,0,63,128,126,30,3,192,62,0,0,126,0,126,0,126,120,60,0,126,120,30,120,30,1,192,1,192,6,248,255,254,16,16,3,224,96,12,124,30,124,30,126,30,124,30,124,0,126,0,126,30,126,30,15,192,120,126,127,240,126,0,123,222,120,30,124,30,126,0,124,254,127,240,0,124,31,128,126,30,63,124,120,62,51,248,0,124,62,0,0,0
	fcb	0,0,0,0,0,0,51,108,31,252,31,62,120,28,0,0,15,128,0,248,31,240,3,192,7,192,0,0,3,128,127,0,126,62,3,192,60,0,0,126,0,126,0,62,120,60,0,126,120,30,120,62,3,224,3,224,6,248,255,254,8,32,0,0,32,40,126,30,124,30,126,62,124,62,126,0,126,0,126,62,126,30,15,192,124,126,120,248,126,0,123,222,124,30,124,62,126,0,124,124,126,248,0,62,31,252,126,62,31,248,127,254,57,252,0,252,62,0,0,0
	fcb	0,0,3,0,0,0,51,108,31,252,62,62,127,252,0,0,7,192,1,240,59,184,3,192,7,192,0,0,7,192,254,0,63,252,31,248,127,254,127,252,0,126,127,254,63,252,0,126,63,252,63,252,3,224,3,224,30,112,255,254,4,64,3,192,48,24,126,30,127,254,63,252,127,252,63,254,126,0,63,252,126,62,63,252,63,252,120,124,63,254,123,222,126,30,63,252,126,0,63,252,126,124,127,254,15,252,63,252,15,240,127,252,124,252,63,248,127,254,0,0
	fcb	0,0,7,128,0,0,59,56,15,248,124,62,63,254,0,0,7,192,1,240,51,152,3,192,3,192,0,0,7,192,124,0,63,252,31,248,127,254,127,252,0,126,127,254,63,252,0,126,63,252,63,252,3,224,3,224,62,0,0,0,2,128,3,192,28,112,127,222,127,254,63,252,127,252,63,254,126,0,63,252,126,62,63,252,63,252,120,124,63,254,123,222,126,30,63,252,126,0,63,252,126,62,127,252,15,252,63,252,7,224,127,252,126,126,63,248,127,254,0,0
	fcb	0,0,7,128,0,0,59,0,1,192,56,28,63,246,0,0,3,224,3,224,3,128,3,192,1,128,0,0,7,192,56,0,31,248,31,248,127,254,127,248,0,126,127,252,31,248,0,126,31,248,31,248,1,192,1,224,62,0,0,0,1,0,3,192,7,192,127,222,127,252,31,248,127,248,31,254,126,0,31,248,126,62,63,252,31,248,120,62,31,254,123,222,126,30,31,248,126,0,31,254,126,62,127,248,7,252,31,248,3,192,127,248,124,62,63,240,127,254,0,0
	fcb	0,0,3,0,0,0,59,124,1,192,16,0,15,230,0,0,1,240,7,192,1,0,3,192,3,0,0,0,3,128,16,0,7,224,31,248,127,254,127,224,0,126,127,240,7,224,0,126,7,224,7,224,0,0,0,192,28,0,0,0,0,0,3,192,0,0,63,222,127,240,7,224,127,224,7,254,126,0,7,224,126,62,63,252,7,224,120,62,7,254,123,222,126,30,7,224,126,0,7,142,126,62,127,224,3,252,7,224,1,128,127,224,124,62,63,192,127,254,0,0
	fcb	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

;***********************************
; PAGE ALIGNED TEXT STRING
;***********************************
	org	$5b00
text	fcc	"          MY FIRST SINSCROLL ON A COCO II............             "
	fcb	$ff,$ff
;***********************************
;END DIRECTIVE
;***********************************
	end	start