
	SECTION mysine,CODE_C


adr1		=	4	; wibble speed
adr2		=	8	; up down speed



; The EXEC functions used
EXECBASE	=	4

FORBID		=	-132
PERMIT		=	-138
OPEN_LIBRARY	=	-408
CLOSE_LIBRARY	=	-414
ALLOCMEM	=	-198
FREEMEM		=	-210

; Custom Chips

dmacon		=	$dff096



 	move.l EXECBASE,a6	
 	jsr FORBID(a6)

 	lea gfxname(pc),a1		
	jsr OPEN_LIBRARY(a6)


	move.l d0,a6
	move.l d0,GfxBase

	bsr GetMem

	MOVE.L bitmaparea,d1

	move.w d1,PlaneLo
	swap d1
	move.w d1,PlaneHi

	jsr makecopper
	bsr repointCOPPER



again:
	;move.l #35,d1

delay:  cmpi.b #$ff,$dff006
	bne delay

	;dbra d1,delay

 	bsr scroll


	bsr putontext



 	btst #6,$bfe001
	bne again

	bsr resetCOPPER


	bsr Freememf


	move.l GfxBase,a1
	move.l EXECBASE,a6
	jsr CLOSE_LIBRARY(a6)

	rts

GetMem:
	move.l #$65000,chararea
	move.l #$70000,bitmaparea

	move.l #$65000,a0
	move.l #$78000,a1
again2:	move.b #0,(a0)+
	cmp.l a1,a0
	bne again2


	rts


	move.l EXECBASE,a6

	move.l #42*32,d0
	move.l #$10003,d1
	
	jsr ALLOCMEM(a6)

	move.l d0,chararea


	move.l #8000,d0
	move.l #$10003,d1

	jsr ALLOCMEM(a6)

	move.l d0,bitmaparea


	rts
	
Freememf:
	rts
	
	move.l EXECBASE,a6

	move.l #42*32,d0
	move.l chararea,a1
	jsr FREEMEM(a6)	


	move.l #8000,d0
	move.l bitmaparea,a1
	jsr FREEMEM(a6)	


	rts



repointCOPPER:
		move.l	GfxBase,a1
		move.l	$32(a1),oldcopper
		move.w	#$0080,dmacon
		clr.w	$dff088
		move.l	#NewCopper,$32(a1)
		move.w	#$84a0,dmacon
		rts

resetCOPPER:

		move.w	#$0080,dmacon
		move.l	GfxBase,a0
		move.l	oldcopper,$32(a0)
		move.w	#$84a0,dmacon	
		rts

putontext:
	move.l nextsine,a0

	move.l a0,a1
	adda.l #adr2,a1			; Step value through table
					; Higher multiples of 2 faster

	cmpa.l #endsine,a1
	blt okpot

	move.l #sinetab,a1

okpot:  move.l a1,nextsine



	move.l #0,d6
	move.l #40,d5


	move.l chararea,d0
	MOVE.L bitmaparea,d1

	addi.l #40*160,d1

	move.l #$DFF000,A6

	move.w #20-1,d6

	move.w #32*64+1,d5


	; d1 = destn (middle of screen)
	; d0 = chararea


	clr.w $042(A6)


	move.w #40,$064(A6)		
	move.w #38,$062(a6)		
	move.w #38,$066(a6)

	move.l #$dff050,a5
	move.l #$dff054,a4
	move.l #$dff04c,a3
	move.l #$dff058,a2
	move.l #$dff040,a1
	move.l #$dff046,a6



blitloop:
	
	move.l d1,d7

	add.w (a0),d7

	adda.l #adr1,a0	; faster sine 

	cmpa.l #endsine,a0
	bne oknoendsine

	lea sinetab,a0

oknoendsine:




	move.l d0,(a5)	; srce 
	move.l d7,(a4)	; Dest 


	move.w #$f000,d3
	
	move.w d3,(A6)	; Set all masks on

	MOVE.W #%0000100111110000,(a1)
				

	move.w d5,(a2)


	move.w #2,d4



	MOVE.W #%0000110111111100,(a1)
		

blitloop2:

	
	move.l d1,d7
	add.w (a0),d7
	adda.l #adr1,a0	; Faster Sine


	cmpa.l #endsine,a0
	blt oknoendsine2

	lea sinetab,a0

oknoendsine2:

	move.l d0,(a5)	; srce 
	move.l d7,(a3)
	move.l d7,(a4)	; Dest 


	ror.w #4,d3
	move.w d3,(A6)	; Set all masks on

	move.w d5,(a2)

	dbra d4,blitloop2


	addq.l #2,d0
	addq.l #2,d1


	dbra d6,blitloop


	rts


	
scroll:


	move.l #$DFF000,A6

	MOVE.L chararea,d0

	move.l d0,d1
	addq.l #2,d1		; a2 points to next word

	move.l d1,$50(a6)	; srce 
	move.l d0,$54(a6)	; Dest 

	clr.w $064(A6)		; No modulos
	clr.w $066(A6)

	move.l #-1,$044(A6)	; Set all masks on

	clr.w $042(A6)

	MOVE.W #%1101100111110000,$040(a6)
				

	move.w #32*64+22,$058(a6)



	subq.b #1,charcount
	bne nocharyet
	move.b #5,charcount	


	move.l textptr,a0
	clr.l d0
	move.b (a0)+,d0
	cmpi.b #0,(a0)
	bne nottextend

	move.l #texttab,a0

nottextend:
	move.l a0,textptr
	bsr putletter

nocharyet:

	rts




	; ******************************
	; * Place letter on the screen *
	; ******************************		
putletter:


		lea fontmap,a0
	
		subi.b #32,d0
	
rndagain:	cmpi.b #20,d0		
		blt okputchar

		adda.l #40*16,a0	; Size of 1 line of chs
		subi.b #20,d0
		bra rndagain

okputchar:	rol.b #1,d0
		andi.b #$fe,d0

	add.l a0,d0



	move.l #$DFF000,A6

	move.l chararea,d1
	addi.l #42*8+40,d1
	

	move.l d0,$50(a6)
	move.l d1,$54(A6)


	MOVE.W #38,$064(A6)
	MOVE.W #40,$066(A6)

	move.l #-1,$044(A6)	; Set all masks on

	clr.w $042(A6)

	MOVE.W #%0000100111110000,$040(a6)
				

	move.w #64*16+1,$058(a6)



	RTS


gfxname:	dc.b "graphics.library",0
		EVEN
GfxBase:	ds.l 1
bitmaparea:	ds.l 1
chararea:	ds.l 1

charcount:	dc.b 16

		EVEN

oldcopper:	ds.l 1

		even

NewCopper:
	

		dc.w $0100,$1000
		dc.w $0180,0

		dc.w $008e,$2c81
		dc.w $0090,$2cc1
		dc.w $0092,$0038
		dc.w $0094,$00d0

		dc.w $180,0
		dc.w $182,$fff

		dc.w $00e0
PlaneHi:	dc.w $0007

		dc.w $00e2
PlaneLo:	dc.w $0000

copper:
	ds.b 2100 

textptr:	dc.l texttab
	

texttab:	dc.b " YYYYYOOOOO MY LATEST WICKED SINE SCROLLY !!!"
		dc.b ' TESTING TESTING 1 2 3 GREETINGS TO EVERYBODY '
		DC.B ' MY FIRST SINEYSCROLL.....'

		DC.B 'NOT BAD EH ????? '
		EVEN
		

nextsine:	dc.l sinetab


sinetab:	

	dc.w  0,40,80,120,120,160,200,240,280
	dc.w  320,320,360,400,440,440
	dc.w  480,520,560,560,600,600,640,640
 	dc.w  680,680,720,720,720,760,760,760,800,800,800,800,800,800,800
 	dc.w  800,800,800,800,760,760,760,720,720,720,680,680,640,640
	dc.w 600,600,560,560,520,480,440,440,400,360,320
 	dc.w  320,280,240,200,160,120,120,80,40,0,-40,-80,-120
 	dc.w -120,-160,-200,-240,-280,-320,-320,-360,-400,-440,-440
 	dc.w -480,-520,-560,-560,-600,-600,-640,-640,-680,-680,-720,-720
 	dc.w -720,-760,-760,-760,-800,-800,-800,-800,-800,-800,-800,-800
 	dc.w -800,-800,-800,-760,-760,-760,-720,-720,-720,-680,-680
 	dc.w -640,-640,-600,-600,-560,-560,-520,-480,-440,-440,-400
	dc.w -360,-320,-320,-280,-240,-200,-160,-120,-120,-80,-40 
		

endsine:dc.w 0

sinesize=endsine-sinetab

makecopper:
	lea copper(pc),a0
	move.w #$000f,d0 ;beam
	move.w #$0000,d1 ;colour
loop2:
	move.w d0,(a0)+
	move.w #$fffe,(a0)+
	move.w #$0182,(a0)+
	move.w d1,(a0)+
	cmpi.w #$ff0f,d0
	beq end
	add.w #$0100,d0
	add.w #$0010,d1
	jmp loop2
end:
	move.l #$fffffffe,(a0)+
	rts 

fontmap:
		incbin "df1:Font.map"

