; ****************************************
; ** 1 PIXEL SINE SCROLL IN 1 FRAME !!! **
; **  BY  T A N G O  OF  C R Y P T I C  **
; ****************************************

	opt c-
	section blitter,code_c			Chip Ram please !!
	include	df1:definitions			Give me some hardware reggies
	include	df1:macros				Give me some macros
	
		
;LOCAL CONSTANTS

icra		equ $bfed01				
allocmem 	=-30-168				
freemem 	=-30-180				

TAKEOVER:

; KILL SYSTEM COPPER, KEYBOARD ETC.....

	LEA custom,a5		
	LEA GFXLIB(PC),a1			 Point to 'graphics.library'
	MOVEQ #0,D0					 Doesn't matter which version
 	MOVE.L 4.w,a6				 EXECBASE
	jsr	-132(a6)				 task switching off (forbid)
 	JSR -$228(a6) 				 Openlibrary
 	MOVE.L D0,GFXBASE			 Store library address

		
;Now put the graphic addresses in the CopperList 		


 	move.l	#sprite,d1			
 	move.w	d1,sp0lo+2
 	swap	d1
 	move.w	d1,sp0hi+2


 	move.l GFXBASE,d0			Move gfxbase offset to d0
 	MOVE.L D0,A6				
 	MOVE.W #$80,dmacon(a5)		Turn off copper whilst changing it
 	MOVE.L $32(A6),WBCOPPER	 	Store old (WBench) copper address
 	MOVE.L #OURCOPPER,$32(A6)	Point to new copper list (our own)
 	MOVE.W #$8080,dmacon(a5)    re-enable copper

 	MOVE.W #$8010,intena(a5)		
 	MOVE.L $6c,old				Save work bench interrupt
 	MOVE.L #LEV3,$6c			This sets up a level 3 interrupt
	move.w	intenar(a5),systemints
	move.b	#%01111111,icra		Kill keyboard
		
WAIT: 	
	BTST #6,$BFE001				This waits for the left
 	BNE.S	WAIT				mouse button to be pressed
	move.l	4.w,a6				EXECBASE
 	MOVE.L old,$6c				Restore system interrupts
	MOVE.L GFXBASE,A6
 	MOVE.W #$80,dmacon(a5)		Disable DMA
 	MOVE.L WBCOPPER,$32(A6)		Restore old copperlist
 	MOVE.W #$8080,dmacon(a5)	Enable DMA
 	move.w	systemints,d0		Systems interrupt
 	or.w	#$c000,d0
 	move.w	d0,intena(a5)		Enable OS interrupts
 	move.b	#%10011011,icra		Enable keyboard
	clr.w	$dff0a8				Clear music
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8
	move.w	#$f,$dff096
	CLR.L	D0
	rts


ERROR:	
	move.l 4.w,a6				Get EXECBASE
	jsr	-138(a6)				Permit ( multi-tasking on )
	moveq	#0,d0				Clear d0
 	RTS							Return to AmigaDOS


;This is the NEW level 3 interrupt

LEV3:
 	MOVEM.L d0-d7/a0-a6,-(sp)	Save all registers to the stack
	lea	custom,a5
	AND #$10,intreqr(a5)       	Check if interrupt is from Copper 
	BNE out
	move.w	#$8010,$9c								
	

; ** ALL ROUTINES CALLED (HOPEFULLY) EVERY VBI **

	MOVE.W #$FFF,$DFF180
	bsr	try_sin
	bsr	testscroll

 	move.l	sin_screen,d1		Bitplane memory address
	move.w	d1,bp1lo+2			Used for double buffering
 	swap	d1
 	move.w	d1,bp1hi+2

	bsr		move_stars
	MOVE.W #$000,$DFF180
	
	
out: 	
	MOVEM.L (sp)+,d0-d7/a0-a6	Restore the registers
	DC.W $4ef9					hex value for  JMP instruction
old: 	
	DC.L 0						will jump to normal interrupt


; ** Move the sprites **

move_stars:

	sub.b	#$1,x+1
	sub.b	#$2,x+9
	sub.b	#$1,x+17
	sub.b	#$3,x+25
	sub.b	#$2,x+33
	sub.b	#$4,x+41
	sub.b	#$2,x+49
	sub.b	#$1,x+57
	sub.b	#$3,x+65
	sub.b	#$1,x+73
	sub.b	#$2,x+81
	sub.b	#$4,x+89
	sub.b	#$3,x+97
	sub.b	#$2,x+105
	sub.b	#$1,x+113
	sub.b	#$4,x+121
	sub.b	#$3,x+129
	sub.b	#$3,x+137
	sub.b	#$2,x+145
	sub.b	#$4,x+153
	sub.b	#$1,x+161
	sub.b	#$3,x+169
	sub.b	#$1,x+177
	sub.b	#$2,x+185
	sub.b	#$4,x+193
	sub.b	#$1,x+201
	sub.b	#$3,x+209
	sub.b	#$1,x+217
	sub.b	#$2,x+225
	sub.b	#$2,x+233
	rts


; ** Double Buffer The Screen **

Buff:
	Eor.l	#10240,Tango				; Next screen is 10240 bytes along
	Move.l	Tango,D1
	Move.l	#SinePlane,d2
	Add.l	D1,d2
	Move.l	D2,Sin_Screen
	Rts


; ** THE SCROLL ROUTINE **

testscroll:
	tst.l	stopper
	beq.s	scroll
	sub.l	#1,stopper
	rts
scroll:
	cmp.l	#15*4,val				Blitshifted all <<<
	blo.s	coarse_scroll_it		No then get doing it !!
	bsr		blit_char				Blit letter to screen
	clr.l	val						Reset index
coarse_scroll_it:
	bsr		coarse					Scroll all line
	rts							
	
	
; ** BLIT LETTER ON THE SCREEN **

blit_char
	jsr		text
	lea		custom,a5				Get custom chip address
	move.l	screenx,a0			 	Can~t see this picture !!
	move.l	#font,a1			 	Put font in blitter source
	add.l	d1,a1
blit_test:
	btst	#14,$dff002			 	Blitter busy !!!
	bne	blit_test				 	Lets wait till she finishes !
	move.w	#$ffff,bltafwm(a5)		
	move.w	#$ffff,bltalwm(a5)		
	move.l	a0,bltdpth(a5)		 	Blitter dest D (BOTTOM OF SCREEN)
	move.l	a1,bltapth(a5)		 	Blitter source A (SCROLLING FONT)
	move.w	#38,bltamod(a5)		 	Modulo (20-1)*2
	move.w	#38,bltdmod(a5)		 	Modulo (20-1)*2
	move.w	#$9f0,bltcon0(a5)	 	Minterms D=A
	clr.w	bltcon1(a5)			 	Set Ascending mode
 	move.w	#16*64+1,bltsize(a5) 	Blit size (SIZE OF FONT)
	rts							  	Return


; ** BLITSHIFT THE ENTIRE SCROLL LINE **

coarse:
	lea		custom,a5			 	
	move.l	screenx,a0				; Can~t see this picture !!
	move.l	a0,a1
	add.l	#2,a1
blit_wait:
	btst	#14,$dff002			
	bne		blit_wait
	incl	#4,val					; (1 for slower)
	move	#15,d7					; Amount of pixels to shift(15 for slow)
	ror		#4,d7					; Set to correct bits (12-15)
	or		#%100111110000,d7		
	move.l	#-1,bltafwm(a5)
	move.l	a1,bltapth(a5)
	move.l	a0,bltdpth(a5)
	move.w	#0,bltamod(a5)
	move.w	#0,bltdmod(a5)
	move.w	d7,bltcon0(a5)	
	move.w	#80*64+20,bltsize(a5)
	rts	


; ** BLITTER CLEAR WHERE THE SINE SCROLL HAS JUST BEEN **

CLEAR:
	Move.l	Sin_Screen,a0
wate
	btst	#14,$dff002
	bne.s	wate
	Move.l	a0,Bltdpth(a5)
	Move	#0,Bltdmod(a5)
	Move.l	#$1f00000,Bltcon0(a5)
	Move	#150*64+20,Bltsize(a5)
	Rts


; ** DO THE SINEWAVE **
; BLITTER HAS TO COPY EVERY 2 PIXELS ACROSS, THATS ALOT OF WORK !!!

try_sin:
	Bsr		buff
	bsr		clear
	Move.l	Table1,A3
	Move.b	(A3),d1
	Cmp.b	#$ff,d1
	Bne		ItsOkYa
	Move.l	#SinTab,A3
ItsOkYa
	Add.l	hi_amplitude,A3
	Move.l	a3,Table1
	Move.l	A3,Table
	lea		custom,a5			 	
	MOVE.W	#$DFC,D2				; D=A+B
	LEA		BLTAFWM(A5),A2			; FWM   		IN A2
	LEA 	BLTSIZE(A5),A4			; BLITSIZE		IN A4
	LEA		BLTAPTH(A5),A6
	MOVE.W	#16*64+1,D7				;				IN D3
	move.l	screenx,a0			 	; Source A
	move.l	#20,d4					; Number of chars along screen
	clr.l	d5
	clr.l	d6
ban:
	MOVE.W	#%1000000000000000,d3	; PUT TO 1 FOR ONE PIXEL 
blit_test0:      
	BSR		BLIT_WAITMAN
	move.w	D2,bltcon0(a5)	 	
	clr.w	bltcon1(a5)			 	
	move.w	#38,bltamod(a5)		 	
	move.w	#38,bltdmod(a5)		 	
	move.w	#38,bltbmod(a5)		 	
 	REPT	16
	move.l	sin_screen,a1
	bsr		get_sinvalue
	move.w	d3,(A2)					; FWM MASK
	move.l	a1,bltdpth(a5)		 	
	move.l	a1,bltbpth(a5)		 	
	move.l	a0,(A6)
	MOVE.W	D7,(A4)					; BLITSIZE
	LSR		#1,D3
	ENDR
	add.l	#2,a0					; Get next letter along
	add.l	#2,d6
	dbf		d4,ban
	rts							  	



BLIT_WAITMAN:
	BTST	#14,$DFF002
	BNE.S	BLIT_WAITMAN
	RTS
	
	
get_sinvalue:
	Clr.l	D5
	Move.l	Table,A3
	Move.b	(A3),d5
	cmp.b	#$ff,d5
	bne		cryptic90
	Move.l	#SinTab,A3
	Move.b	(a3),d5
cryptic90
	Add.l	lo_amplitude,A3
	Move.l	A3,Table
*	mulu	#40,d5
	add.l	d5,a1
	Add.l	D6,A1
	rts
Table1:	Dc.l	SinTab	
table:	dc.l	sintab


; ** RAY SEE IF YOU CAN GET A BETTER SINUS TABLE FOR FULL SCREEN !!! **
sintab:
	DC.B 40,40,40,80,80,120,120,160,160,200,200,240,240,200
	DC.B 200,160,120,80,80,40,40,255,255,255
	EVEN

	dc.b $3C,$3F,$42,$46,$49,$4C,$50,$53,$56,$59
	dc.b $5C,$5F,$61,$64,$67,$69,$6B,$6D,$6F,$71
	dc.b $72,$73,$75,$76,$76,$77,$77,$77,$77,$77
	dc.b $77,$76,$76,$75,$73,$72,$71,$6F,$6D,$6B
	dc.b $69,$67,$64,$61,$5F,$5C,$59,$56,$53,$50
	dc.b $4C,$49,$46,$42,$3F,$3C,$38,$35,$31,$2E
	dc.b $2B,$27,$24,$21,$1E,$1B,$18,$16,$13,$10
	dc.b $E,$C,$A,$8,$6,$5,$4,$2,$1,$1
	dc.b $0,$0,$0,$0,$0,$0,$1,$1,$2,$4
	dc.b $5,$6,$8,$A,$C,$E,$10,$13,$16,$18
	dc.b $1B,$1E,$21,$24,$27,$2B,$2E,$31,$35
	dc.b $38,255
 	EVEN
 	

; ** CHARACTER DECODER ROUTINE **

text:
	move.l	acurent,a2				Get message
	clr.l	d1						
	move.b	(a2)+,d1				Update it
	move.b	d1,letter				Store in offset
	cmp.b	#255,d1					Check for end of message
	beq.w	rst_text				If equal, then reset
	cmp.b	#254,d1
	beq		stop
	sub.l	#32,d1					Subract 32 (ie space)
	asl		d1						Times by 2 
	move.l	a2,acurent				Update acurent
	CMP.B	#"4",letter				Is letter "K" or larger
	BPL.s	add_more				If larger then add on
	rts								Return
add_more:
	CMP.B	#"H",letter				Is letter "U" or larger
	BPL.S	add_more2				If larger then add on
	add.l	#40*15,d1				Get next line down (KLMNOPQRST)
	rts
add_more2:					
	add.l	#40*30,d1				Get next line down (UVWXYZ0123)
	rts
rst_text:
	move.l	#0,d1
	move.l	#message,d2				Get begining of text
	move.l	d2,acurent				Reset to begining
	rts								Return
stop:
	move.l	#0,d1
	add.l	#1,acurent
	move.l	#150,stopper
	rts

message:

; 254=STOP,255=END.

	DC.B	" 1 PIXEL   !!!!!!      IN 1 FRAME !!!!      OPTIMIZATION BY TANGO OF CRYPTIC !!!"
	DC.B	"  MULU INSTRUCTION TAKES FUKIN AGES TO EXECUTE !!!"
	DC.B	"   WRAP           ",255
	EVEN
			

; ** THE COPPERLIST **

OURCOPPER:
sp0lo:	dc.w	spr0ptl,$0000
sp0hi:	dc.w	spr0pth,$0000
		dc.w	bpl1mod,0,bpl2mod,0
		dc.w	diwstrt,$2c81+16,diwstop,$2cc1
		dc.w	bplcon0,$1200,bplcon1,$0000
		dc.w	ddfstrt,$38,ddfstop,$d0
*		dc.w	color00,$000,color01,$094
		dc.w	color16,$aaa,color17,$aaa,color18,$aaa
		dc.w	color19,$aaa,color20,$aaa
bp1lo:	dc.w	bpl1ptl,$0000
bp1hi:	dc.w	bpl1pth,$0000
		wait	$2c09,$fffe
		dc.w	color01,$f00
		wait	$2e09,$fffe
		dc.w	color01,$f11
		wait	$3009,$fffe
		dc.w	color01,$f00
		wait	$3209,$fffe
		dc.w	color01,$f11
		wait	$3409,$fffe
		dc.w	color01,$f22
		wait	$3609,$fffe
		dc.w	color01,$f33
		wait	$389,$fffe
		dc.w	color01,$f44
		wait	$3a09,$fffe
		dc.w	color01,$f55
		wait	$3c09,$fffe
		dc.w	color01,$f66
		wait	$3e09,$fffe
		dc.w	color01,$f77
		wait	$4009,$fffe
		dc.w	color01,$f88
		wait	$4209,$fffe
		dc.w	color01,$f99
		wait	$4409,$fffe
		dc.w	color01,$faa
		wait	$4609,$fffe
		dc.w	color01,$fbb
		wait	$4809,$fffe
		dc.w	color01,$fcc
		wait	$4a09,$fffe
		dc.w	color01,$fdd
		wait	$4c09,$fffe
		dc.w	color01,$fee
		wait	$4e09,$fffe
		dc.w	color01,$fff
		wait	$5109,$fffe
		dc.w	color01,$eef
		wait	$5309,$fffe
		dc.w	color01,$ddf
		wait	$5509,$fffe
		dc.w	color01,$ccf
		wait	$5709,$fffe
		dc.w	color01,$bbf
		wait	$5909,$fffe
		dc.w	color01,$aaf
		wait	$5b09,$fffe
		dc.w	color01,$99f
		wait	$5d09,$fffe
		dc.w	color01,$88f
		wait	$5f09,$fffe
		dc.w	color01,$77f
		wait	$6109,$fffe
		dc.w	color01,$66f
		wait	$6309,$fffe
		dc.w	color01,$55f
		wait	$6509,$fffe
		dc.w	color01,$44f
		wait	$6709,$fffe
		dc.w	color01,$33f
		wait	$6909,$fffe
		dc.w	color01,$22f
		wait	$6a09,$fffe
		dc.w	color01,$11f
		wait	$6c09,$fffe
		dc.w	color01,$00f
		wait	$6e09,$fffe
		dc.w	color01,$11f
		wait	$7109,$fffe
		dc.w	color01,$22f
		wait	$7309,$fffe
		dc.w	color01,$33f
		wait	$7509,$fffe
		dc.w	color01,$44f
		wait	$7709,$fffe
		dc.w	color01,$55f
		wait	$7909,$fffe
		dc.w	color01,$66f
		wait	$7a09,$fffe
		dc.w	color01,$77f
		wait	$7c09,$fffe
		dc.w	color01,$88f
		wait	$7e09,$fffe
		dc.w	color01,$99f
		wait	$8009,$fffe
		dc.w	color01,$aaf
		wait	$8209,$fffe
		dc.w	color01,$bbf
		wait	$8409,$fffe
		dc.w	color01,$ccf
		wait	$8609,$fffe
		dc.w	color01,$ddf
		wait	$8809,$fffe
		dc.w	color01,$eef
		wait	$8a09,$fffe
		dc.w	color01,$fff
		wait	$8c09,$fffe
		dc.w	color01,$fee
		wait	$8e09,$fffe
		dc.w	color01,$fdd
		wait	$9109,$fffe
		dc.w	color01,$fcc
		wait	$9309,$fffe
		dc.w	color01,$fbb
		wait	$9509,$fffe
		dc.w	color01,$faa
		wait	$9709,$fffe
		wait	$9909,$fffe
		dc.w	color01,$f99
		wait	$9b09,$fffe
		dc.w	color01,$f88
		wait	$9d09,$fffe
		dc.w	color01,$f77
		wait	$9f09,$fffe
		dc.w	color01,$f66
		end_copper
		

;LOCAL CONSTANTS

WBCOPPER:		DC.L	0
GFXLIB:			DC.B 	"graphics.library",0
GFXBASE:		DC.L	0
systemints:		dc.l	0
scroll_offset:	dc.l	0
screenx:		dc.l	picture
letter:			dc.b	0
acurent:		dc.l	message
val:			dc.l	0
lo_amplitude:	dc.l	1						; PISS AROUND WITH THESE
hi_amplitude:	dc.l	2						; PISS AROUND WITH THESE
Tango			Dc.l	0
sin_screen:		Dc.l	SinePlane
stopper:		dc.l	0


;BINARY FILES TO BE INCLUDED
	EVEN
picture	
	dcb.b	10240,0
SinePlane
	dcb.b	10240,0
	dcb.b	10240,0
font
	incbin	df1:neatfont.bin
sprite:
	include	df1:sprite.list






	
	







	
	











	
	
