;demo routines

demoframe PROC NEAR
	setborder 0
	mov	dx,3dah
dwait:	in	al,dx
	test	al,8
	jz	dwait
	call	scrollborder
	call	canner ;color animation
	sti
	setborder 52
	mov	ax,4
	call	stmik_asm ;poll music player
	setborder 1
	call	scroll
	call	enablekeyboard
	setborder 9
	call	logofader
	setborder 1
	call	writer
	cmp	cs:equson,0
	je	noequs
	setborder 1
	call	equs
noequs:	setborder 15
	call	starfield
	setborder 1
	call	disablekeyboard ;just to avoid overactive users to 'crash' the demo
	setborder 0
	ret
demoframe ENDP

demobackground PROC NEAR
	ret
	;set 4 bitplane latch trasfer mode
	mov	dx,3ceh
	mov	ax,4105h
	out	dx,ax
	mov	dx,3
	mov	dx,3c4h
	mov	ax,0f02h
	out	dx,ax
	;do nothing :-)
	;clear latch trasfer mode
	mov	dx,3ceh
	mov	ax,4005h
	out	dx,ax
	ret
demobackground ENDP

demointti PROC NEAR
	;called every other frame by rasterinterrupt, must save all but AX
	push	es
	pop	es
	ret
demointti ENDP

fixword
stx	dw	32 dup(-1,-1)	;x
sty	dw	32 dup(-1,-1)	;y
stm	db	32 dup(0,0,0,0) 	;misc: color,maxcol/speed,processed,0
stox1	dw	?
stoy1	dw	?
stox2	dw	?
stoy2	dw	?
srot	dw	64

bordercnt dw	?

starfield PROC NEAR
	mov	ax,cs
	mov	ds,ax
	mov	es,ds:vram
	;calc 'rotating' center
	mov	cx,cs:drunkenstars
	mov	ax,ds:srot
	sine
	imul	cx
	mov	ax,dx
	add	ax,160
	mov	ds:stox1,ax
	sub	ax,(320-256)/2
	mov	ds:stox2,ax
	mov	ax,ds:srot
	cosine
	imul	cx
	mov	ax,dx
	add	ax,100
	mov	ds:stoy1,ax
	sub	ax,(200-128)/2
	mov	ds:stoy2,ax
	inc	ds:srot
	and	ds:srot,255
	;do stars
	mov	cx,stars
	xor	si,si
sf01:	mov	cs:stm[si+2],0
	add	si,4
	loop	sf01
	mov	cs:bordercnt,0
	mov	cx,stars
	mov	bp,0
	xor	si,si
	call	starfield2
sf02:	setborder 0
	call	getrasterline
	cmp	ax,160
	jb	sf02
	mov	cx,stars
	mov	bp,1
	xor	si,si
	setborder 15
	call	starfield2
	ret
starfield ENDP

starfield2 PROC NEAR
sf1:	push	cx
	cmp	ds:stm[si+2],0
	je	sf14
	jmp	sf3
sf14:
	mov	dx,ds:stx[si+2]
	cmp	dx,-1
	jne	sf5
	;add new
	call	rand
	and	ax,127
	mov	dx,ax
	call	rand
	and	ax,127
	add	dx,ax
	add	dx,(320-256)/2
	mov	ds:stx[si+2],dx
	call	rand
	and	ax,63
	mov	dx,ax
	call	rand
	and	ax,63
	add	dx,ax
	add	dx,(200-128)/2
	mov	ds:sty[si+2],dx
	call	rand
	and	al,15
	add	al,128+64
	mov	ds:stm[si+1],al
	mov	al,128+64+31
	mov	ds:stm[si],al
	mov	dx,ds:stx[si+2]
	mov	bx,ds:sty[si+2]
	jmp	sf2
sf5:	;undraw old
	mov	bx,ds:sty[si+2]
sf2:	cmp	bp,1
	je	sf12
	cmp	bx,70
	jnb	sf11
sf13:	jmp	sf3
sf12:	cmp	bx,70
	jnb	sf13
sf11:	mov	ds:stm[si+2],1	
	call	ospget
	cmp	al,128+64
	jb	sf4
	cmp	al,128+64+31
	ja	sf4
	mov	dx,ds:stx[si+2]
	mov	bx,ds:sty[si+2]
	xor	al,al
	call	ospset
sf4:	;move
	mov	ah,128+63
	sub	ah,ds:stm[si+1]
	add	ah,32
	xor	al,al
	mov	cl,2
	shr	ax,cl
	mov	cx,ax
	mov	ax,ds:stx[si+2]
	sub	ax,ds:stox1
	imul	cx
	add	ds:stx[si],ax
	adc	ds:stx[si+2],dx
	mov	ax,ds:sty[si+2]
	sub	ax,ds:stoy1
	imul	cx
	add	ds:sty[si],ax
	adc	ds:sty[si+2],dx
	;redraw new/check for overflow
	mov	dx,ds:stx[si+2]
	cmp	dx,320
	jb	sf9
sf10:	mov	ds:stx[si+2],-1
	jmp	sf3
sf9:	mov	bx,ds:sty[si+2]
	cmp	bx,199
	ja	sf10
	call	spget
	cmp	al,0
	jne	sf3
	mov	dx,ds:stx[si+2]
	mov	bx,ds:sty[si+2]
	mov	al,ds:stm[si]
	cmp	al,ds:stm[si+1]
	jna	sf7
	dec	al
sf7:	mov	ds:stm[si],al
	call	spset
sf3:	pop	cx
	add	si,4
	loop	sf1x
	ret
sf1x:	jmp	sf1
starfield2 ENDP

tmpcol	db	0
tmprow	dw	1

scrollmacro1 MACRO
	mov	al,es:[si]
	mov	es:[di],al
	mov	es:[di-(1280-640)/4],al
	;mov	al,es:[si+1]
	;mov	es:[di+1],al
	;mov	es:[di-(1280-640)/4+1],al
	ENDM
scrollmacro2 MACRO
	mov	al,es:[si]
	mov	es:[di],al
	;mov	al,es:[si+1]
	;mov	es:[di+1],al
	ENDM
;create one 'sprite'-line of the font
scrollmacro MACRO submac
	local	l1,l2,l3,l4,l5,l6,l7
	mov	bx,cs:charbodypos
	mov	ax,cs:charpos
	mov	dx,cs:charwidth
	cmp	ax,dx
	jb	l3
	mov	bx,cs:chartpos
	mov	al,cs:chartext[bx]
	cmp	al,1
	jne	l6
	mov	cs:wrmark,1
	mov	cs:oktofade,1
	inc	bx
	jmp	l7
l6:	or	al,al
	jnz	l4
	xor	bx,bx
l7:	mov	al,cs:chartext[bx]
l4:	inc	bx
	mov	cs:chartpos,bx
	mov	bl,al
	xor	bh,bh
	shl	bx,1
	shl	bx,1
	mov	ax,cs:fontpos[bx+2]
	shr	ax,1
	shr	ax,1
	mov	cs:charwidth,ax
	mov	ax,cs:fontpos[bx]
	mov	cs:charbodypos,ax
	mov	bx,ax
	mov	dl,cs:[bx]
	xor	ax,ax
l3:	cmp	bx,spacepos
	je	l5
	add	bx,ax
l5:	inc	ax
	mov	cs:charpos,ax
	mov	si,bx
	mov	dx,1280/4
	mov	cx,64
l1:	submac
	add	si,dx
	add	di,dx
	loop	l1
	ENDM
	
wrmark	db	0
oktofade db	0
	
chartpos dw	0
;	db	"FONTTEST!   "
;	db	"ABCDEFGHIJKLMNOPQRSTUVWXYZ!?:;., "
	
spacepos equ	80
fontpos LABEL WORD
	dw	32 dup(0,0)
	dw	spacepos,32 ;space
	dw	(80*1+320*72)+16*1,28 ; !
	dw	0,0
	dw	(80*3+320*64)+16*4-2,8 ; #
	dw	8 dup(0,0)
	dw	(80*1+320*72)+8*7,16 ; ,
	dw	0,0
	dw	(80*1+320*72)+8*8,16 ; .
	dw	0,0
	dw	10 dup(0,0)
	dw	(80*1+320*72)+8*6,16 ; :
	dw	(80*1+320*72)+8*9,16 ; ;
	dw	0,0
	dw	(80*3+320*64)+16*5-8,8 ; =
	dw	0,0
	dw	(80*1+320*72)+16*0+3,48 ; ?
	dw	0,0 ;@
	;A..Z
	dw	(80*3+320*0)+16*0,48
	dw	(80*3+320*0)+16*1,48
	dw	(80*3+320*0)+16*2,48
	dw	(80*3+320*0)+16*3,48
	dw	(80*3+320*0)+16*4,48
	dw	(80*3+320*64)+16*0,48
	dw	(80*3+320*64)+16*1,48
	dw	(80*3+320*64)+16*2,48
	dw	(80*3+320*64)+16*3,16
	dw	(80*3+320*64)+16*4,20
	dw	(80*3+320*128)+16*0,44
	dw	(80*3+320*128)+16*1,16
	dw	(80*3+320*128)+16*2,64
	dw	(80*3+320*128)+16*3,44
	dw	(80*3+320*128)+16*4,48
	dw	(80*2+320*0)+16*0,48
	dw	(80*2+320*0)+16*1,48
	dw	(80*2+320*0)+16*2,48
	dw	(80*2+320*0)+16*3,48
	dw	(80*2+320*0)+16*4,48
	dw	(80*2+320*64)+16*0,48
	dw	(80*2+320*64)+16*1,48
	dw	(80*2+320*64)+16*2,48
	dw	(80*2+320*64)+16*3,60
	dw	(80*2+320*64)+16*4,48
	dw	(80*1+320*72)+16*2,48
charbodypos dw	spacepos
charpos	dw	0
charwidth dw	0
	
scrollborder PROC NEAR
	;called in border for smooth scrolling
	;set smooth pixel pan
	mov	dx,3dah
	in	al,dx
	mov	dx,3c0h
	mov	al,13h
	out	dx,al
	mov	al,byte ptr cs:winxpos
	and	al,3
	shl	al,1
	out	dx,al
	mov	al,32
	out	dx,al
	ret
scrollborder ENDP

srcount dw	0

scroll	PROC NEAR
	mov	es,cs:vram
	;set subwindow position
	mov	ax,cs:winxpos
	mov	cs:owinxpos,ax
	;change winxpos
	add	ax,3
	cmp	cs:alternatescroll,0
	je	scr1b
	inc	cs:srcount
	inc	ax
scr1b:	add	cs:srcount,3
	cmp	ax,1280-640
	jb	scr1
	sub	ax,1280-640
scr1:	mov	cs:winxpos,ax
	cmp	cs:srcount,4
	jb	src11
	sub	cs:srcount,4
	jmp	scr6
src11:	jmp	scr3
scr6:	;draw new stuff
	jmp	scr2
scr4x:	jmp	scr4
scr2:
	;set 4 bitplane latch trasfer mode
	mov	dx,3ceh
	mov	ax,4105h
	out	dx,ax
	mov	dx,3
	mov	dx,3c4h
	mov	ax,0f02h
	out	dx,ax
	mov	si,320/4
	mov	di,1280/4*136+320/4
	mov	ax,cs:winxpos
	shr	ax,1
	shr	ax,1
	add	di,ax
	cmp	cs:winxpos,(1280-640-320)
	jb	scr4x
	scrollmacro scrollmacro1
	jmp	scr5
scr4:	scrollmacro scrollmacro2
scr5:	;clear latch trasfer mode
	mov	dx,3ceh
	mov	ax,4005h
	out	dx,ax
scr3:	;position screen
	mov	bx,1280/4*136
	mov	ax,cs:winxpos
	shr	ax,1
	shr	ax,1
	add	bx,ax
	mov	dx,03d4h
	mov	al,0ch
	mov	ah,bh
	out	dx,ax
	mov	al,0dh
	mov	ah,bl
	out	dx,ax
	ret	
scroll	ENDP

cancnt	dw	0

canner PROC NEAR
	;update palette
	cli
	mov	ax,cs
	mov	ds,ax
	mov	si,OFFSET palette+128*3
	mov	al,128
	mov	dx,3c8h
	out	dx,al
	inc	dx
	mov	cx,64*3/6
can1:	lodsb
	out	dx,al
	lodsb
	out	dx,al
	lodsb
	out	dx,al
	lodsb
	out	dx,al
	lodsb
	out	dx,al
	lodsb
	out	dx,al
	loop	can1
	sti
	;scroll colors
	inc	cs:cancnt
	test	cs:cancnt,7
	jnz	can2
	mov	ax,cs
	mov	ds,ax
	mov	es,ax
	mov	di,OFFSET palette+128*3
	mov	si,OFFSET palette+129*3
	mov	bx,ds:[di]
	mov	dl,ds:[di+2]
	mov	cx,63*3/2
	rep	movsw
	movsb
	mov	ds:[di],bx
	mov	ds:[di+2],dl
	;update writer fontcolor
	dec	cs:printcadd
	and	cs:printcadd,63
can2:	ret
canner ENDP

fixword
wrwait	dw	0
wrpos	dw	0
wrx	dw	16
wry	dw	39
wrcnt	dw	0
wrnum	dw	20
wrcx	dw	64*4 dup(0)
wrcy	dw	64*4 dup(0)
wrcc	db	64*4 dup(0,0)
wrcpnt	dw	0
wrcpnt2	dw	12*4*2

writer PROC NEAR
	inc	cs:wrcnt
	test	cs:wrcnt,1
	jz	wr1x
	jmp	wr1
wr3x:	jmp	wr3
wr1x:	cmp	cs:wrwait,30000
	jne	wr3y
	cmp	cs:wrmark,1
	jne	wr5z
	mov	cs:wrmark,0
	mov	cs:wrwait,0
	jmp	wr3x
wr5z:	mov	cs:wrwait,30001
	jmp	wr3x
wr3y:	cmp	cs:wrwait,0
	jne	wr3x
	mov	bx,cs:wrpos
	mov	al,cs:wrtext[bx]
	inc	bx
	cmp	al,0
	jne	wr5
	mov	cs:wrpos,OFFSET wrtextinit-OFFSET wrtext
	jmp	wr3
wr5:	mov	cs:wrpos,bx
	cmp	al,13
	jne	wr2
	add	cs:wry,18
	mov	cs:wrx,16
wr2:	cmp	al,10
	jne	wr22
	sub	cs:wry,18
wr22:	cmp	al,3
	jne	wr9
	mov	cs:wrwait,30001
	jmp	wr3
wr9:	cmp	al,1
	jne	wr4
	mov	cs:wrx,16
	mov	cs:wry,39
	mov	cs:wrwait,256
	jmp	wr3
wr4:	cmp	al,2
	jne	wr6
	xor	dx,dx
wr62:	mov	al,ds:wrtext[bx]
	cmp	al,13
	je	wr61
	call	getfontwidth
	add	dx,ax
	inc	bx	
	jmp	wr62
wr61:	mov	ax,314
	sub	ax,dx
	shr	ax,1
	mov	cs:wrx,ax
	jmp	wr3
wr6:	mov	bx,cs:wry
	mov	dx,cs:wrx
	mov	si,cs:wrcpnt
	mov	cs:wrcx[si],dx
	mov	cs:wrcy[si],bx
	mov	cs:wrcc[si],al
	cmp	al,'a'
	jb	wr92
	call	printc2
	jmp	wr91
wr92:	call	printc
wr91:	mov	cs:wrx,dx
	cmp	cs:wrx,320-16
	jb	wr3
	mov	cs:wrx,16
wr3:	;clear old chars
	mov	si,cs:wrcpnt
	add	si,2
	and	si,511
	mov	cs:wrcpnt,si
	mov	si,cs:wrcpnt2
	mov	dx,cs:wrcx[si]
	mov	bx,cs:wrcy[si]
	mov	al,cs:wrcc[si]
	mov	cs:wrcx[si],0
	add	si,2
	and	si,511
	mov	cs:wrcpnt2,si
	cmp	dx,0
	je	wr32
	call	printclr
wr32:	cmp	cs:wrwait,0
	je	wr1
	dec	cs:wrwait
wr1:	ret
writer ENDP

fadespd	equ	538*2
fadecount dw	fadespd+1
fadeyadd dw	80*1+320*(32+8)
fadeyad1 dw	80*1+320*(32+8)
fadeyad2 dw	80*1+320*8

logofader PROC NEAR
	cmp	cs:oktofade,0
	jne	lof5
	ret
lof5:	inc	cs:fadecount
	cmp	cs:fadecount,fadespd
	ja	lof1
	ret
lof1:	cmp	cs:fadecount,fadespd+80
	jb	lof2
	mov	cs:fadecount,0
	mov	ax,cs:fadeyad1
	xchg	cs:fadeyad2,ax
	mov	cs:fadeyad1,ax
	mov	cs:fadeyadd,ax
	ret
lof2:	;fade 
	;set 4 bitplane latch trasfer mode
	mov	dx,3ceh
	mov	ax,4105h
	out	dx,ax
	mov	dx,3
	mov	dx,3c4h
	mov	ax,0f02h
	out	dx,ax
	;fade in/out
	mov	es,cs:vram
	mov	di,cs:fadecount
	sub	di,fadespd
	mov	bp,di
	mov	si,cs:fadeyadd
	add	si,bp
	mov	cx,16
	mov	dx,640
lof3:	mov	al,es:[si]
	mov	es:[di],al
	add	si,dx
	add	di,dx
	loop	lof3
	mov	di,fadespd+79+320
	sub	di,cs:fadecount
	mov	si,cs:fadeyadd
	add	si,320+79
	sub	si,bp
	mov	cx,16
	mov	dx,640
lof4:	mov	al,es:[si]
	mov	es:[di],al
	add	si,dx
	add	di,dx
	loop	lof4
	;clear latch trasfer mode
	mov	dx,3ceh
	mov	ax,4005h
	out	dx,ax
	ret
logofader ENDP

equpnt	dw	0
equdel	db	16 dup(64 dup(0))
equlast db	64 dup(0)

equs 	PROC NEAR
	cmp	cs:nosbc,0
	je	noeq
	ret
noeq:	mov	dx,3
	mov	dx,3c4h
	mov	ax,0702h
	out	dx,ax
	;draw the equs; REMARK; the info from the player is aprx. 16 frames early!
	mov	es,cs:vram
	mov	si,word ptr cs:stmikequs[0]
	mov	ds,word ptr cs:stmikequs[2]
	mov	cx,60 ;do 16 ins bars
	mov	bx,cs:equpnt
equ12:	mov	al,ds:[si]
	mov	cs:equdel[bx],al
	sub	al,2
	jnc	equ11
	xor	al,al
equ11:	mov	ds:[si],al
	inc	bx
	inc	si
	loop	equ12
	add	bx,4
	and	bx,1023
	mov	cs:equpnt,bx
	mov	cx,40
	mov	di,20+(133)*(1280/4)
	mov	si,bx
	add	si,20
	mov	bp,20
equ1:	push	cx
	push	di
	push	si
	xor	bh,bh
	mov	bh,cs:equlast[bp]
	mov	bl,cs:equdel[si]
	cmp	bl,0
	jne	equ4
	cmp	bh,0
	jne	equ4
	jmp	equ3
equ4:	mov	cs:equlast[bp],bl
	mov	cl,2
	shr	bl,cl
	shr	bh,cl
	mov	cl,bl
	xor	ch,ch
	jcxz	equ22
	mov	al,32
equ2:	mov	es:[di],al
	sub	di,1280/4
	inc	al
	loop	equ2
equ22:	mov	cl,bh
	sub	cl,bl
	jc	equ3
	jz	equ3
	mov	al,0
equ5:	mov	es:[di],al
	sub	di,1280/4
	loop	equ5
equ3:	pop	si
	pop	di
	pop	cx
	inc	si
	inc	bp
	inc	di
	loop	equ1
	ret
equs	ENDP

