********************************************************************
; SINUS_SCROLLER.ASM (ASSEMBLE ONLY WITH DEVPAC 2).
;
; WRITTEN BY RENE OLSTHOORN.
; USE IT IF YOU LIKE !! IF YOU DO, PUT ME INTO YOUR GREETINGSLIST.
; ONE INCLUDE FILE NEEDED !! (THE RAW-DATA OF THE CHARACTERS).
********************************************************************

	SECTION PROGRAMM,CODE_C 	;chip-mem.
CALLEXEC	MACRO
	move.l	(4).w,a6
	jsr	_LVO\1(a6)
	ENDM
start_sinusscroller:
	bsr	clear_registers
	move.w	#$4000,INTENA+CUSTOM
	move.l	#GRNAME,a1
	moveq	#0,d0
	CALLEXEC OpenLibrary
	move.l	d0,_GFXBASE
	CALLEXEC FORBID
	CALLEXEC DISABLE
;put the scherm into the copper.
	move.l	#scherm_geheugen,d0
	move.w	d0,BITPL+6
	swap	d0
	move.w	d0,BITPL+2
	move.w	#%0000000000101111,DMACON+CUSTOM
	move.l	#copper,COP1LCH+CUSTOM
	move.w	#0,COPJMP1+CUSTOM
	move.w	#%1000011110000000,DMACON+CUSTOM

waitraster0:	
	cmp.b	#60,VHPOSR+CUSTOM
	bne.s	waitraster0
	btst	#7,CIAAPRA
	bne.s	no_fire
	move.w	#$000f,COLOR00+CUSTOM
no_fire:
	bsr	clear_registers
	bsr	simple_scroller
	bsr	clear_registers
	move.w	#%0000010000000000,DMACON+CUSTOM
	bsr	sinus_scroller
	move.w	#%1000010000000000,DMACON+CUSTOM
	move.w	#$0000,COLOR00+CUSTOM
check_left:
	btst.b	#6,CIAAPRA
	bne.s	waitraster0	
helaas:
	bsr	clear_registers
	move.w	#$03a0,DMACON+CUSTOM
	movea.l	_GFXBASE,a6
	move.l	STARTLIJST(a6),COP1LC+CUSTOM
	move.w	#0,COPJMP1+CUSTOM
	move.w	#$83e0,DMACON+CUSTOM
	CALLEXEC PERMIT
	CALLEXEC ENABLE
	move.l	_GFXBASE,a1
	CALLEXEC CloseLibrary
	move.w	#$c000,INTENA+CUSTOM
	moveq	#0,d0
	rts

clear_registers:	
	movem.l	clean,d0-a6		;clears d0-a6.
	rts

simple_scroller:
	cmp.b	#$ff,wacht
	beq	wacht_lus
	bsr	schuif_op
	move.b	scroll_counter,d0
	subq.b	#1,d0
	bne	scroll_weg
	move.b	#8,d0
	lea.l	scroll_tekst,a0
	move.l	tekst_counter,d1
	adda.l	d1,a0
	move.b	(a0),d3
	cmp.b	#'w',d3
	bne.s	no_wait
	st	wacht
	move.b	#' ',d3
no_wait:
	sub.b	#$30,d3
	bcc.s	no_space
	move.b	#$31,d3
no_space:
	bsr	print_caracter
	add.l	#1,d1
	cmp.l	#end_scroll_tekst-scroll_tekst,d1
	bne.s	niet_einde_tekst
	moveq	#0,d1
niet_einde_tekst:
	move.l	d1,tekst_counter
scroll_weg:
	move.b	d0,scroll_counter
	rts
wacht_lus:
	cmp.b	#-1,wacht+1
	bne.s	r_wacht_lus
	clr.w	wacht
r_wacht_lus:	
	addq.b	#1,wacht+1
	rts
schuif_op:
	move.l	#-1,BLTAFWM+CUSTOM
	move.w	#%1110100111110000,BLTCON0+CUSTOM
	move.w	#0,BLTCON1+CUSTOM
	move.l	#scroll_geheugen+4,BLTAPTH+CUSTOM
	move.l	#scroll_geheugen+2,BLTDPTH+CUSTOM
	move.l	#$00020002,BLTAMOD+CUSTOM
	move.w	#16*64+25,BLTSIZE+CUSTOM
	rts
print_caracter:
	lea.l	caracters,a1
	lsl.w	#5,d3
	adda.w	d3,a1
	move.w	#%0000100111110000,BLTCON0+CUSTOM
	move.l	a1,BLTAPTH+CUSTOM
	move.l	#scroll_geheugen+50,BLTDPTH+CUSTOM
	move.w	#0,BLTAMOD+CUSTOM
	move.w	#50,BLTDMOD+CUSTOM
	move.w	#16*64+1,BLTSIZE+CUSTOM
	rts

sinus_scroller:
	bsr	clear_sinus_gedeelte
	move.w	#%0000110111111100,BLTCON0+CUSTOM
	move.w	#0,BLTCON1+CUSTOM
	move.w	#52-2,BLTAMOD+CUSTOM
	move.w	#48-2,BLTBMOD+CUSTOM
	move.w	#48-2,BLTDMOD+CUSTOM
	lea.l	s_posities,a2
	move.l	sinus_var,a1
	addq.l	#1,a1
	cmp.l	#s_pos_end-s_posities,a1
	bne.s	loop_onf
	move.l	#0,a1
loop_onf:
	move.l	a1,sinus_var
	add.l	a1,a2
	move.w	#24-1,d3
	move.l	#48,d1
sinus_loop:
	move.w	#4-1,d2
	subq.l	#2,d1
	move.l	#scroll_geheugen+2,a0
	adda.l	d1,a0
	move.l	#scherm_geheugen,d5
	add.l	d1,d5
loopje_on:
	moveq	#0,d7
	move.b	(a2)+,d7
	cmp.l	#s_pos_end,a2
	bne	loop_on
	lea.l	s_posities,a2
loop_on:
	lea.l	blit_masks,a3
	move.w	d2,d4
	lsl.w	#1,d4
	add.w	d4,a3
	move.w	(a3),a4
	move.w	a4,BLTAFWM+CUSTOM
	move.w	a4,BLTALWM+CUSTOM
	move.l	a0,BLTAPTH+CUSTOM
	mulu	#48,d7
	add.l	d7,d5
	move.l	d5,BLTBPTH+CUSTOM
	move.l	d5,BLTDPTH+CUSTOM
	sub.l	d7,d5
	move.w	#16*64+1,BLTSIZE+CUSTOM
	dbra	d2,loopje_on
	dbra	d3,sinus_loop
	rts
clear_sinus_gedeelte:
	move.l	#-1,BLTAFWM+CUSTOM
	move.w	#%0000000100000000,BLTCON0+CUSTOM	
	move.w	#0,BLTCON1+CUSTOM
	move.l	#scherm_geheugen,BLTDPTH+CUSTOM
	move.w	#0,BLTDMOD+CUSTOM
	move.w	#50*64+24,BLTSIZE+CUSTOM
blit:	btst	#14,DMACONR+CUSTOM
	bne.s	blit
	rts

	SECTION variables,DATA_C	
_GFXBASE:	dc.l	0
;----------------- scroller section ------------
tekst_counter:	dc.l	0
sinus_var:	dc.l	0
wacht:		dc.w	0
scroll_counter:	dc.b	1
GRNAME:		dc.b	"graphics.library",0

	SECTION copperlijst,DATA_C
copper:
	dc.w	DIWSTRT,$296a,DIWSTOP,$2ffa
	dc.w	BPL1MOD,0
	dc.w	BPLCON1,0,BPLCON2,$0024
	dc.w	BPLCON0,0,COLOR00,0
	dc.w	$960f,wait
BITPL:	dc.w	BPL1PTH,0,BPL1PTL,0
	dc.w	COLOR01,$000f
	dc.w	DDFSTRT,$0020,DDFSTOP,$00d8
	dc.w	$970f,wait,BPLCON0,$1000
	dc.w	$c90f,wait,BPLCON0,0
	dc.w	end,wait

	SECTION datas,DATA_C

clean:	dcb.l	15,0	;clear section for registers

blit_masks:
	dc.w	$f000,$0f00,$00f0,$000f

caracters:
	incbin "df0:characters.raw" ;raw data of characters.
	dcb.b	2*16,0

scroll_geheugen:
	dcb.b	52*16,0 ;scroll memory

scherm_geheugen:
	dcb.b	48*50,0

scroll_tekst:
 DC.B "@ THIS SINUSSCROLLER WAS WRITTEN BY RENE OLSTHOORN;  "
 DC.B "PRESS THE FIRE_BUTTON OF YOUR JOYSTICK IN PORT 2 TO SEE "
 DC.B "THE RASTERTIME NEEDED FOR THIS SINUSSCROLLER \\    <>"
 DC.B "                  "
end_scroll_tekst:

; ; = .		  [ = (	     _ = -	@ = A.
; < = square      ] = )	     ^ = ,	
; > = smile	  ` = '	     \ = !
;the other letters remain the same.

 even
s_posities:
       dc.b       16,17,18,19,19,20,21,22,23,23,24,25
       dc.b       25,26,27,27,28,28,29,29,30,30,31,31
       dc.b       31,31,32,32,32,32,32,32,32,32,32,31
       dc.b       31,31,31,30,30,29,29,28,28,27,27,26
       dc.b       25,25,24,23,23,22,21,20,19,19,18,17
       dc.b       16,15,14,13,13,12,11,10,9,9,8,7
       dc.b       7,6,5,5,4,4,3,3,2,2,1,1
       dc.b       1,1,0,0,0,0,0,0,0,0,0,1
       dc.b       1,1,1,2,2,3,3,4,4,5,5,6
       dc.b       7,7,8,9,9,10,11,12,13,13,14,15
       dc.b       16
s_pos_end:

_LVODisable	EQU	-120 
_LVOEnable	EQU	-126 
_LVOForbid	EQU	-132 
_LVOPermit	EQU	-138 
_LVOCloseLibrary	EQU	-414 
_LVOOpenLibrary	EQU	-552 

; custom addresses :
DMACONR		= $002
VHPOSR		= $006
BLTCON0		= $040
BLTCON1		= $042
BLTAFWM 	= $044
BLTALWM 	= $046
BLTCPTH		= $048
BLTCPTL 	= $04a
BLTBPTH		= $04c
BLTBPTL 	= $04e
BLTAPTH		= $050
BLTAPTL 	= $052
BLTDPTH		= $054
BLTDPTL 	= $056
BLTSIZE 	= $058
BLTCMOD		= $060
BLTBMOD		= $062
BLTAMOD		= $064
BLTDMOD		= $066
COP1LC		= $080
COP1LCH		= $080
COP1LCL		= $082
COPJMP1 	= $088
DIWSTRT		= $08e
DIWSTOP 	= $090
DDFSTRT 	= $092
DDFSTOP 	= $094
DMACON		= $096
CLXCON		= $098
INTENA  	= $09a
BPL1PTH 	= $0e0
BPL1PTL 	= $0e2
BPL2PTH 	= $0e4
BPL2PTL 	= $0e6
BPL3PTH 	= $0e8
BPL3PTL 	= $0ea
BPL4PTH 	= $0ec
BPL4PTL 	= $0ee
BPL5PTH 	= $0f0
BPL5PTL 	= $0f2
BPL6PTH 	= $0f4
BPL6PTL 	= $0f6
BPLCON0 	= $100
BPLCON1 	= $102
BPLCON2 	= $104
BPL1MOD 	= $108
BPL2MOD 	= $10a
BPL1DAT		= $110
BPL2DAT		= $112
BPL3DAT		= $114
BPL4DAT		= $116
BPL5DAT		= $118
BPL6DAT		= $11a
COLOR00 	= $180
COLOR01 	= $182
COLOR02 	= $184
COLOR03 	= $186
COLOR04 	= $188
COLOR05 	= $18a
COLOR06 	= $18c 
COLOR07 	= $18e
COLOR08 	= $190

; other important addresses :
CIAAPRA		= $bfe001
CUSTOM  	= $dff000
STARTLIJST	= 38

; copper instructions
WAIT		= $fffe
END		= $ffff
NTSC		= $ffdf


