Homebrew:Tetris

From veswiki
Jump to: navigation, search

Two players in a game of Tetris.

Peter Trauner wrote this excellent Tetris clone, a few minor details are missing but unfortunately Peter hasn't done any more updates. The Channel F's twistable knob makes it excellent for Tetris!

E5frog has changed the graphics of the score-digits to make them more visible in this release v7: Tetris v7 edited (.zip, 1.98kB)

There is some source code available for an earlier version (v 5) released under GPL:

; Tetris by Peter Trauner
; minor changes by e5frog

	processor f8
	include "ves.h"

	org	$800

player1:	equ $2800
p1next:	equ	$28e4
p1fig:	equ $28ec
p1activ: equ $28fd
p1bonus: equ $28f5
p1penalty: equ $28f6
p1score: equ $28f7 ; 8 9
p1delay: equ $28fb
p1delay_counter: equ $28fc
p1randomnext: equ $28fe
p1random: equ $28ff
p1borderc1: equ $2a80
p1borderc2: equ $2a81
p1fieldposy: equ $2a82
p1fieldposx: equ $2a83
p1blockc1: equ $2a84
p1blockc2: equ $2a85
p1scoreparam: equ $2a86
p1nextparam: equ $2a8a
; equ $2a8e

player2:	equ $2900
p2next:	equ	$29e4
p2fig:	equ $29ec
p2activ: equ $29fd
p2bonus: equ $29f5
p2penalty: equ $29f6
p2score: equ $29f7
p2delay: equ $29fb
p2delay_counter: equ $29fc
p2randomnext: equ $29fe
p2random: equ $29ff
p2borderc1: equ $2a90
p2borderc2: equ $2a91
p2fieldposy: equ $2a92
p2fieldposx: equ $2a93
p2blockc1: equ $2a94
p2blockc2: equ $2a95
p2scoreparam: equ $2a96
p2nextparam: equ $2a9a
; equ $2a9e

; player structure layout
; 19 lines a 12 columns
; ec next figure
; ed figure (0..6, $ff for none)
; ee rotation
; ef x
; f0 y
; f5 bonus
; f6 penalty
; f7 score changed
; f8/f9	score
; fa	counter until speed change
; fb	speed/delay
; fc	speed/delay counter
; fd activ
; fe next randomnumber
; ff actual randomnumber

randomnumber:	equ	$2a00
gamemode:	equ	$2a01
palvideomode:	equ	$2a02
;shownextfigure: equ	$2a03

		db	$55	; cartridge id
		db	$2b	; unknown
entry:
		pi 	clearscreen
		dci	gamemode
		lis	0
		st
		dci	palvideomode
		lis	1
		st
;		dci	shownextfigure
;		lis	0
;		st

; load videomode constants
		dci	palvideomode
		lm
		dci	pal
		ci	0
		bt	4,vmodepal
		dci	ntsc
vmodepal:	li	$10
		lr	is,a
		li	28
		lr	8,a
vmode1:		lm
		lr	(is),a
		lr	a,is
		ai	1
		lr	is,a
		ds	8
		bf	4,vmode1
		li	$10
		lr	is,a
		lis	14
		lr	8,a
		dci	p1borderc1
vmode2:		lr	a,(is)
		st
		lr	a,is
		ai	1
		lr	is,a
		ds	8
		bf	4,vmode2
		lis	14
		lr	8,a
		dci	p2borderc1
vmode3:		lr	a,(is)
		st
		lr	a,is
		ai	1
		lr	is,a
		ds	8
		bf	4,vmode3

		dci	p1fig
		lis	0
		st
		dci	p2fig
		st
		dci	p1activ
		st
		dci	p2activ
		st

		dci	player1
		pi	clearfield
		dci	player2
		pi	clearfield

		dci	p1borderc1
		lm
		lr	4,a
		lm
		lr	5,a
		lm
		lr	0,a
		lm
		lr	1,a
		dci	player1
		pi	drawfield

		dci	p2borderc1
		lm
		lr	4,a
		lm
		lr	5,a
		lm
		lr	0,a
		lm
		lr	1,a
		dci	player2
		pi	drawfield

		dci	copyright
		pi	drawansistringv

		dci	thanx
		pi	drawansistring

		li	$13
		lr	is,a
		li	$30
		lr	(is)-,a
		lr	(is)-,a
		lr	(is)-,a
		lr	(is),a
		dci	p1scoreparam
		lm
		lr	1,a
		lm
		lr	2,a
		lm	
		lr	3,a
		lm
		lr	4,a
		lis	4
		lr	9,a
		pi	drawstring

		li	$10
		lr	is,a
		dci	p2scoreparam
		lm
		lr	1,a
		lm
		lr	2,a
		lm	
		lr	3,a
		lm
		lr	4,a
		lis	4
		lr	9,a
		pi	drawstring

		dci	p1fig
		lm	
		lr	0,a
		lis	0
		lr	1,a
		pi	getfigure

		li	$31
		lr	is,a
		dci	p1next
		lr	a,(is)+
		st
		lr	a,(is)+
		st
		li	$35
		lr	is,a
		lr	a,(is)+
		st
		lr	a,(is)+
		st		
		li	$39
		lr	is,a
		lr	a,(is)+
		st
		lr	a,(is)+
		st
		li	$3d
		lr	is,a
		lr	a,(is)+
		st
		lr	a,(is)+
		st
		
		dci	p1nextparam
		lm
		lr	0,a
		lm
		lr	1,a
		lm
		lr	4,a
		lm
		lr	5,a
		dci	p1next
		pi	drawnext

		dci	p1fig
		lm	
		lr	0,a
		lis	0
		lr	1,a
		pi	getfigure

		li	$31
		lr	is,a
		dci	p2next
		lr	a,(is)+
		st
		lr	a,(is)+
		st
		li	$35
		lr	is,a
		lr	a,(is)+
		st
		lr	a,(is)+
		st		
		li	$39
		lr	is,a
		lr	a,(is)+
		st
		lr	a,(is)+
		st
		li	$3d
		lr	is,a
		lr	a,(is)+
		st
		lr	a,(is)+
		st

		dci	p2nextparam
		lm
		lr	0,a
		lm
		lr	1,a
		lm
		lr	4,a
		lm
		lr	5,a
		dci	p2next
		pi	drawnext		

gameover:	pi	random

		li	$10
		outs	0
		ins	0
		ni	1
		bf	4,gameover1
		dci	gamemode
		lis	1
		st

gameover1:	lis	0
		outs	4
		ins	4
		ni	$80
		bf	4,gameover2
		dci	gamemode
		lis	2
		st

gameover2:	lis	0
		outs	1
		ins	1
		ni	$80
		bf	4,gameover3
		dci	gamemode
		lis	3
		st

gameover3:	dci	gamemode	
		lm
		ci	0
		bt	4,gameover

		dci	gamemode
		lm
		ci	1
		bf	4,start1
		dci	player1
		pi	clearfield
		dci	player2
		pi	clearfield
		lis	1
		dci	p1activ
		st
		dci	p2activ
		st
		jmp	playing1
start1:	ci	2
		bf	4,start2
		dci	player1
		pi	clearfield
		lis	1
		dci	p1activ
		st
		jmp	playing1
start2:	dci	player2
		pi	clearfield
		lis	1
		dci	p2activ
		st
playing1:	lis	0
		dci	gamemode
		st

		dci	p1activ
		lm
		ci	0
		bt	4,playingx
		dci	p1borderc1
		lm
		lr	4,a
		lm
		lr	5,a
		lm
		lr	0,a
		lm
		lr	1,a
		dci	player1
		pi	drawfield

		dci	p1nextparam
		lm
		lr	0,a
		lm
		lr	1,a
		lm
		lr	4,a
		lm
		lr	5,a
		dci	p1next
		pi	drawnext

playingx:	dci	p2activ
		lm
		ci	0
		bt	4,playingy
		dci	p2borderc1
		lm
		lr	4,a
		lm
		lr	5,a
		lm
		lr	0,a
		lm
		lr	1,a
		dci	player2
		pi	drawfield

		dci	p2nextparam
		lm
		lr	0,a
		lm
		lr	1,a
		lm
		lr	4,a
		lm
		lr	5,a
		dci	p2next
		pi	drawnext

playingy:
playing:	li	$10
		outs	0

		dci	p1activ
		lm
		ci	0
		bf	4,playing1b
waste1a:	jmp	waste1
playing1b:
		lis	0
		outs	4
		ins	4
		ni	4
		bt	4,playing1a

		dci	p1delay_counter		; subtract one from the delay counter
		lm	
		ai	$ff
		dci	p1delay_counter
		st
		ci	0				; compare A with 0
		bf	4,waste1a			; if not zero go to "waste1a"
playing1a:	dci	p1delay

		lm
		st

		lis	0
		outs	4
		ins	4
		lr	9,a
		dci	p1fig
		pi	move

		dci	p1bonus
		lm
		ci	0
		bt	4,playing1x
		ai	$ff
		dci	p2penalty
		am
		dci	p2penalty
		st
		lis	0
		dci	p1bonus
		st

playing1x:	dci	p1fieldposy
		lm
		lr	0,a
		lm
		lr	1,a
		lm
		lr	4,a
		lm
		lr	5,a
		dci	player1
		pi	drawfielddiff

		dci	p1nextparam
		lm
		lr	0,a
		lm
		lr	1,a
		lm
		lr	4,a
		lm
		lr	5,a
		dci	p1next
		pi	drawnextdiff


		dci	p1score
		lm
		ci	1
		bf	4,playing1c
		li	$13
		lr	is,a
		lm
		lr	0,a
		ni	$f
		oi	$30
		lr	(is)-,a
		lr	a,0
		sr	4
		oi	$30
		lr	(is)-,a
		lm
		lr	0,a
		ni	$0f
		oi	$30
		lr	(is)-,a
		lr	a,0
		sr	4
		oi	$30
		lr	(is),a
		dci	p1scoreparam
		lm
		lr	1,a
		lm
		lr	2,a
		lm	
		lr	3,a
		lm
		lr	4,a
		lis	4
		lr	9,a
		pi	drawstring

		dci	p1score
		lis	0
		st

playing1c:	dci	p1activ
		lm
		ci	0
		bf	4,playing2
		dci	p2activ
		lm
		ci	0
		bt	4,playing1d
		dci	p2activ
		lis	0
		st
		dci	player2won
		bf	0,playing1e
playing1d:	dci	strgameover1
playing1e:	pi	drawansistring
		bf	0,playing2
waste1:	pi	random

playing2:	li	$10
		outs	0

		dci	p2activ
		lm
		ci	0
		bf	4,playing2b
waste2a:	jmp	waste2
playing2b:	lis	0
		outs	1
		ins	1
		ni	4
		bt	4,playing2a

		dci	p2delay_counter
		lm	
		ai	$ff
		dci	p2delay_counter
		st
		ci	0
		bf	4,waste2a
playing2a:	dci	p2delay
		lm
		st

		lis	0
		outs	1
		ins	1
		lr	9,a
		dci	p2fig
		pi	move

		dci	p2bonus
		lm
		ci	0
		bt	4,playing2x
		ai	$ff
		dci	p1penalty
		am
		dci	p1penalty
		st
		lis	0
		dci	p2bonus
		st

playing2x:	dci	p2fieldposy
		lm
		lr	0,a
		lm
		lr	1,a
		lm
		lr	4,a
		lm
		lr	5,a
		dci	player2
		pi	drawfielddiff

		dci	p2nextparam
		lm
		lr	0,a
		lm
		lr	1,a
		lm
		lr	4,a
		lm
		lr	5,a
		dci	p2next
		pi	drawnextdiff

		dci	p2score
		lm
		ci	1
		bf	4,playing2c
		li	$13
		lr	is,a
		lm
		lr	0,a
		ni	$f
		oi	$30
		lr	(is)-,a
		lr	a,0
		sr	4
		oi	$30
		lr	(is)-,a
		lm
		lr	0,a
		ni	$0f
		oi	$30
		lr	(is)-,a
		lr	a,0
		sr	4
		oi	$30
		lr	(is),a
		dci	p2scoreparam
		lm
		lr	1,a
		lm
		lr	2,a
		lm	
		lr	3,a
		lm
		lr	4,a
		lis	4
		lr	9,a
		pi	drawstring

		dci	p2score
		lis	0
		st

playing2c:	dci	p2activ
		lm
		ci	0
		bf	4,game
		dci	p1activ
		lm
		ci	0
		bt	4,playing2d
		dci	p1activ
		lis	0
		st
		dci	player1won
		bf	0,playing2e
playing2d:	dci	strgameover2
playing2e:	pi	drawansistring
		bf	0,game
waste2:		pi	random
game:
; avoid standing random number if no key pressed
		dci	randomnumber
		lm
		dci	randomnumber
		ai	1
		st
		dci	p1random
		lm
		dci	p1random
		ai	1
		st
		dci	p2random
		lm
		dci	p2random
		ai	1
		st

		pi	random
		dci	p1activ
		lm
		dci	p2activ
		om
		bt	4,playing3
		jmp	playing
playing3:	jmp	gameover

; dci	address
; r0 video row
; r1 video col
; r4 color
; r5 color 2
drawfield:	lr	k,p
		li	19
		lr	6,a
		lr	a,1
		lr	8,a
dfloopl:	li	12
		lr	7,a
		
dfloopc:	lm
		ci	0
		bf	4,dfset
		li	$c0
		lr	2,a
		lr	3,a
		jmp	dfcont
dfset:		lr	a,4
		lr	2,a
		lr	a,5
		lr	3,a
dfcont:		pi	drawblock
		lr	a,1
		ai	$fd
		lr	1,a
		ds	7
		bf	4,dfloopc
		lr	a,8
		lr	1,a
		lr	a,0
		ai	$fd
		lr	0,a
		ds	6
		bf	4,dfloopl
		lr	p,k
		pop

; dci	address
; r0 video row
; r1 video col
; r4 color
; r5 color 2
drawfielddiff:	lr	k,p
		li	19
		lr	6,a
		lr	a,1
		lr	8,a
		lr	q,dc
dfdloopl:	li	12
		lr	7,a
		
dfdloopc:	lm
		ni	$ff
		bt	1,dfdnot
		ni	$7f
		bf	4,dfdset
		lr	dc,q
		st
		li	$c0
		lr	2,a
		lr	3,a
		jmp	dfdcont
dfdset:		lr	dc,q
		st
		lr	a,4
		lr	2,a
		lr	a,5
		lr	3,a
dfdcont:	pi	drawblock
dfdnot:		lr	q,dc
		lr	a,1
		ai	$fd
		lr	1,a
		ds	7
		bf	4,dfdloopc
		lr	a,8
		lr	1,a
		lr	a,0
		ai	$fd
		lr	0,a
		ds	6
		bf	4,dfdloopl
		lr	p,k
		pop

; dci	address
; r0 video row
; r1 video col
; r4 color
; r5 color 2
drawnext:	lr	k,p
		lis	4
		lr	6,a
		lr	a,1
		lr	8,a
dfnloopl:	lis	2
		lr	7,a
		
dfnloopc:	lm
		ci	0
		bf	4,dfnset
		lis	0
		lr	2,a
		lr	3,a
		jmp	dfncont
dfnset:		lr	a,4
		lr	2,a
		lr	a,5
		lr	3,a
dfncont:	pi	drawblock
		lr	a,1
		ai	$fd
		lr	1,a
		ds	7
		bf	4,dfnloopc
		lr	a,8
		lr	1,a
		lr	a,0
		ai	$fd
		lr	0,a
		ds	6
		bf	4,dfnloopl
		lr	p,k
		pop


; dci	address
; r0 video row
; r1 video col
; r4 color
; r5 color 2
drawnextdiff:	lr	k,p
		lis	4
		lr	6,a
		lr	a,1
		lr	8,a
		lr	q,dc
dndloopl:	lis	2
		lr	7,a
		
dndloopc:	lm
		ni	$ff
		bt	1,dndnot
		ni	$7f
		bf	4,dndset
		lr	dc,q
		st
		lis	0
		lr	2,a
		lr	3,a
		jmp	dndcont
dndset:		lr	dc,q
		st
		lr	a,4
		lr	2,a
		lr	a,5
		lr	3,a
dndcont:	pi	drawblock
dndnot:		lr	q,dc
		lr	a,1
		ai	$fd
		lr	1,a
		ds	7
		bf	4,dndloopc
		lr	a,8
		lr	1,a
		lr	a,0
		ai	$fd
		lr	0,a
		ds	6
		bf	4,dndloopl
		lr	p,k
		pop

; dci address		
clearfield:	lr	h,dc
		li	228
		lr	0,a
		li	0
cfloop:		st
		ds	0
		bf	4,cfloop
		lr	dc,h
		li	18
		lr	0,a
		li	1
cfloop1:	st
		li	10
		adc
		li	1
		st
		ds	0
		bf	4,cfloop1
		st
		st
		st
		st
		st
		st
		st
		st
		st
		st
		st
		st
		lis	0
		cm		; playing $2[89]e4
		cm
		cm
		cm
		cm
		cm
		cm
		cm
		cm		; $2[89]ec
		li	$ff
		st		; no figure
		lr	h,dc
		li	$f5
		lr	11,a
		lr	dc,h
		lis	0
		st
		st
		st
		st
		st
		lis	1
		st
		lis	10
		st
		lis	1
		st
		pop

; dci field
; r9 keys
move:		lr	k,p
		lr	q,dc
		lm
;		ci	0
;		bf	4,moveend1
;		jmp	moveend
moveend1:	lm
		ci	$ff
		bf	4,next1
		jmp	next
next1:		lr	0,a
		lm
		lr	1,a
		lm	
		lr	2,a
		lm	
		lr	3,a
		pi	getfigure
		pi	fieldpos
		pi	clearfigure
		lr	a,9
		ni	$1
		bf	4,nmoveright
		lr	a,2
		ai	1
		lr	2,a
nmoveright:	lr	a,9
		ni	$2
		bf	4,nmoveleft
		lr	a,2
		ai	$ff
		lr	2,a
nmoveleft:	lr	a,9
		ni	$10
		bf	4,nmovecc
		lr	a,1
		ai	1
		ni	3
		lr	1,a
nmovecc:	lr	a,9
		ni	$20
		bf	4,nmovec
		lr	a,1
		ai	$ff
		ni	3
		lr	1,a
nmovec:		pi	getfigure
		pi	fieldpos
		pi	testfigure
		ci	0
		bt	4,nreload
		lr	dc,q
		lm
		lm
		lr	0,a
		lm
		lr	1,a
		lm
		lr	2,a
		lm
		lr	3,a
		pi	getfigure
nreload:	lr	dc,q
		lm
		lr	a,0
		st
		lr	a,1
		st
		lr	a,2
		st
		lr	a,3
		st
		lr	a,3
		ai	1
		lr	3,a
		pi	fieldpos
		pi	testfigure
		lr	9,a
		ci	0
		bf	4,nmovedown
		lr	dc,q
		lm
		lm
		lm
		lm
		lr	a,3
		st
nmovedown:	lr	dc,q
		lm
		lm
		lm
		lm
		lm
		lr	3,a
		pi	fieldpos
		pi	setfigure
		lr	a,9
		ci	0
		bf	4,nmovedown1
		jmp	moveend
nmovedown1:	pi	findlines
		lr	dc,q
		lr	h,dc
		li	$f6
		lr	11,a
		lr	dc,h
		lm
		ci	0
		bt	4,next
		lr	4,a
		lr	dc,h
		lis	0
		st
mpen:		pi	penalty
		ds	4
		bf	4,mpen
next:		lr	dc,q
		lr	h,dc
		li	$fa
		lr	11,a
		lr	dc,h
		lm	
		ai	1
		lr	dc,h
		st
		ci	$50
		bf	4,next2
		lr	dc,h
		lis	0
		st
		lm
		ci	1
		bt	4,next2
		ai	$ff
		lr	dc,h
		cm
		st
next2:		lr	dc,q
		lm
		st
		lr	dc,q
		lr	h,dc
		li	$fe
		lr	11,a
		lr	dc,h
		lm
		lm
		ni	7
		ci	7
		bf	4,nextloop
		lis	0
nextloop:	lr	0,a
		lr	dc,h
		lm
		st
		lr	dc,q
		lm
		st
		lr	dc,q
		lr	a,0
		st
		cm
		li	0	; rotation
		lr	1,a
		st
		li	$4	; x
		lr	2,a
		st
		li	$0	; y
		lr	3,a
		st
		lr	dc,q
		cm
		lm	
		lr	0,a
		lm	
		lr	1,a
		pi	getfigure
		lr	dc,q
		pi	fieldpos
		pi	testfigure
		ci	0
		bt	4, nextend
		; end of game
		lr	dc,q
		lr	h,dc
		li	$fd
		lr	11,a
		lr	dc,h
		li	$0
		st
		lr	dc,q
nextend:	lr	h,dc
		li	$f7
		lr	11,a
		lr	dc,h
		lis	1
		st
		li	$67
		amd	
		lr	4,a
		li	$66
		lnk
		amd
		lr	5,a
		lr	dc,h
		cm
		lr	a,4
		st
		lr	a,5
		st		
		pi	fieldpos
		pi	setfigure


		lr	dc,q
		lm	
		lr	0,a
		lis	0
		lr	1,a
		pi	getfigure

		li	$31
		lr	is,a		
		lr	h,dc
		li	$e4
		lr	11,a
		lr	dc,h
		lr	a,(is)+
		oi	$80
		st
		lr	a,(is)+
		oi	$80
		st
		li	$35
		lr	is,a
		lr	a,(is)+
		oi	$80
		st
		lr	a,(is)+
		oi	$80
		st		
		li	$39
		lr	is,a
		lr	a,(is)+
		oi	$80
		st
		lr	a,(is)+
		oi	$80
		st
		li	$3d
		lr	is,a
		lr	a,(is)+
		oi	$80
		st
		lr	a,(is)+
		oi	$80
		st

moveend:	lr	p,k
		pop

; r0 figure
; r1 rotation
getfigure:	lr	h,dc
		dci	figures
		lr	a,0
		ci	0
		bt	4,gfn
		lr	4,a
		li	$40
gfn1:		adc
		ds	4
		bf	4,gfn1
gfn:		lr	a,1
		ci	0
		bt	4,gff
		lr	4,a
		li	$10
gff1:		adc
		ds	4
		bf	4,gff1
gff:		li	$30
		lr	is,a
		li	$10
		lr	4,a
gfloop:		lm
		lr	(is),a
		lr	a,is
		ai	1
		lr	is,a
		ds	4
		bf	4,gfloop
		lr	dc,h
		pop


findlines:
		lr	h,dc
		li	205		; 17*(1+10+1)+1
		lr	11,a		; hl
fl2:		lr	dc,h
		li	9
		lr	8,a
		lm
fl1:		nm
		ds	8
		bf	4,fl1
		ni	1
		bf	4,fl3
fl1c:		lr	a,11
		ai	244		; -12
		lr	11,a
		ci	1
		bf	4,fl2		
		pop
	; row found
fl3:		lr	a,11
		lr	9,a
		li	$f5
		lr	11,a
		lr	dc,h
		lm
		ai	1
		lr	dc,h
		st
		lr	a,9
		lr	11,a
fl1d:		lr	a,11
		ai	244
		lr	11,a
		ci	1
		bf	4,fl1e
		lr	a,9
		lr	11,a
		jmp	fl2
fl1e:		lr	dc,h		
		li	$30
		lr	is,a
		li	10
		lr	8,a
fl1a:		lm
		lr	(is),a
		lr	a,is
		ai	1
		lr	is,a
		ds	8
		bf	4,fl1a
		lm
		lm
		li	$30
		lr	is,a
		li	10
		lr	8,a
fl1b:		lr	a,(is)
		; probably doing check to only redraw changed blocks
		oi	$80
		st
		lr	a,is
		ai	1
		lr	is,a
		ds	8
		bf	4,fl1b
		jmp	fl1d

penalty:	li	17
		lr	6,a
		lis	13
		lr	dc,q
		lr	h,dc
		lr	11,a
penalty3:	lr	dc,h
		lis	10
		lr	5,a
		li	$30
		lr	is,a
penalty1:	lm
		lr	(is),a
		lr	a,is
		ai	1
		lr	is,a
		ds	5
		bf	4,penalty1
		lr	a,11
		ai	$f4		; -12
		lr	11,a
		lr	dc,h
		li	$30
		lr	is,a
		lis	10
		lr	5,a
penalty2:	lr	a,(is)
		oi	$80
		st
		lr	a,is
		ai	1
		lr	is,a
		ds	5
		bf	4,penalty2
		lr	a,11
		ai	24
		lr	11,a
		ds	6
		bf	4,penalty3
		lr	a,11
		ai	$f4
		lr	11,a
		lr	dc,h
		lis	10
		lr	5,a
		li	$81
penalty5:	st
		ds	5
		bf	4,penalty5
		li	$ff
		lr	11,a
		lr	dc,h
		lm
		ni	7
		ai	206	;12*17+1+1
		lr	11,a
		lr	dc,h
		li	$80
		st
		pop
; r2 x
; r3 y
; dci
fieldpos:	lr	h,dc
		lr	a,2
		lr	$b,a
		ni	$ff
		bt	1,fieldpos3
		ds	$a
fieldpos3:	lr	dc,h
		lr	a,3
		ci	0
		bt	4, fieldpos1
		lr	4,a
		li	12
fieldpos2:	adc
		ds	4
		bf	4, fieldpos2
fieldpos1:	
		pop

; r0 figure
; r1 rotation
; r2 x
; r3 y
; dci field
testfigure:	lr	h,dc
		li	4
		lr	4,a
		li	$30
		lr	is,a
tpy:		li	4
		lr	5,a
tpx:		lr	a,(is)
		ci	0
		bt	4,tpnothing
		lm
		ni	$7f
		bt	4,tpcont
		lr	dc,h
		li	1	; something in it
		pop
tpnothing:	cm	
tpcont:		lr	a,is
		ai	1
		lr	is,a
		ds	5
		bf	4,tpx
		li	8
		adc
		ds	4
		bf	4,tpy
		lr	dc,h
		li	0
		pop

; r2 x
; r2 y
; dci field
clearfigure:	lr	h,dc
		li	4
		lr	4,a
		li	$30
		lr	is,a
		
cfy:		li	4
		lr	5,a
cfx:		lr	a,(is)
		ci	0
		bt	4,cfnothing
		li	$80
		st
		jmp	cfc
cfnothing:	cm
cfc:		lr	a,is
		ai	1
		lr	is,a
		ds	5
		bf	4,cfx
		li	8
		adc
		ds	4
		bf	4,cfy
		lr	dc,h
		pop

; dci field
setfigure:	lr	h,dc
		li	4
		lr	4,a
		li	$30
		lr	is,a
		
sfy:		li	4
		lr	5,a
sfx:		lr	a,(is)
		ci	0
		bt	4,sfnothing
		li	$81
		st
		jmp	sfc
sfnothing:	cm
sfc:		lr	a,is
		ai	1
		lr	is,a
		ds	5
		bf	4,sfx
		li	8
		adc
		ds	4
		bf	4,sfy
		lr	dc,h
		pop

; pseudo random number generation
; (f3853 timer not used; irqs generally difficult to use with subroutines)
; so if user presses a key in while loop simply its counter is taken
; (random number from 0 to 255)
; I expect a 50% change him to press
; 0 has several clocks more, so its more likely to come
random:		
		li	$10
		outs	0
		ins	0
		lr	2,a
		lis	0
		outs	4
		ins	4
		lr	3,a
		lis	0
		outs	1
		ins	1
		lr	4,a
		lis	0
		lr	1,a
random1:	
; currently not needed
;		ins	0
;		xs	2
;		bt	4,random1a
;		xs	2
;		lr	2,a
;		dci	randomnumber
;		lr	a,1
;		st
random1a:	ins	4
		xs	3	
		bt	4,random1b
		xs	3
		lr	3,a
		dci	p1randomnext
		lr	a,1
		st
random1b:	ins	1
		xs	4	
		bt	4,random1c
		xs	4
		lr	4,a
		dci	p2randomnext
		lr	a,1
		st
random1c:	ds	1
		bf	4,random1
		pop

; r0 video row
; r1 video col
; r2 color
; r3 color 2
drawblock:	li	$50
		outs	0
		ins	5
		ni	$c0
		xs	0
		outs	5
		ins	4
		ni	$80
		xs	1
		outs	4
		lr	a,2
		outs	1
		li	$60	; p 0/0
		outs	0
		li	$50
		outs	0
		li	$ff
		lr	10,a
dbdelay1:	ds	10
		bf	4,dbdelay1
		ins	4
		ai	$ff
		outs	4
		li	$60	; p 1/0
		outs	0
		li	$50
		outs	0
		lis	6
		lr	10,a
dbdelay2:	ds	10
		bf	4,dbdelay2
		ins	4
		ai	$ff
		outs	4
		li	$60	; p 2/0
		outs	0
		li	$50
		outs	0
		lis	6
		lr	10,a
dbdelay3:	ds	10
		bf	4,dbdelay3
		ins	5
		ai	$ff
		outs	5
		li	$60	; p 2/1
		outs	0
		li	$50
		outs	0
		lis	6
		lr	10,a
dbdelay4:	ds	10
		bf	4,dbdelay4
		ins	4
		inc
		outs	4
		lr	a,3
		outs	1
		li	$60	; p 1/1
		outs	0
		li	$50
		outs	0
		lis	6
		lr	10,a
dbdelay5:	ds	10
		bf	4,dbdelay5
		ins	4
		inc
		outs	4
		lr	a,2
		outs	1
		li	$60	; p 0/1
		outs	0
		li	$50
		outs	0
		lis	6
		lr	10,a
dbdelay6:	ds	10
		bf	4,dbdelay6
		ins	5
		ai	$ff
		outs	5
		li	$60	; p 0/2
		outs	0
		li	$50
		outs	0
		lis	6
		lr	10,a
dbdelay7:	ds	10
		bf	4,dbdelay7
		ins	4
		ai	$ff
		outs	4
		li	$60	; p 1/2
		outs	0
		li	$50
		outs	0
		lis	6
		lr	10,a
dbdelay8:	ds	10
		bf	4,dbdelay8
		ins	4
		ai	$ff
		outs	4
		li	$60	; p 2/2
		outs	0
		li	$50
		outs	0
		lis	6
		lr	10,a
dbdelay9:	ds	10
		bf	4,dbdelay9
		pop

clearscreen:	lis	0
		outs	1
		li	$3f
		lr	0,a
csloopl:	lr	a,0
		outs	5
		li	$7f
		lr	1,a
csloopc:	lr	a,1
		outs	4
		li	$60
		outs	0
		li	$50
		outs	0
		lis	6	; in bowling 4
		lr	4,a
csdelay:	ds	4
		bf	4,csdelay
		ds	1
		bt	2,csloopc
		ds	0
		bt	2,csloopl	
		pop

; 7 figures
; in 4 rotations
; 4x4 size
figures:	

		db	0,0,0,0
		db	1,1,1,1
		db	0,0,0,0
		db	0,0,0,0

		db	0,1,0,0
		db	0,1,0,0
		db	0,1,0,0
		db	0,1,0,0

		db	0,0,0,0
		db	1,1,1,1
		db	0,0,0,0
		db	0,0,0,0

		db	0,1,0,0
		db	0,1,0,0
		db	0,1,0,0
		db	0,1,0,0

;
		
		db	0,1,1,0
		db	1,1,0,0
		db	0,0,0,0
		db	0,0,0,0

		db	0,1,0,0
		db	0,1,1,0
		db	0,0,1,0
		db	0,0,0,0
		
		db	0,1,1,0
		db	1,1,0,0
		db	0,0,0,0
		db	0,0,0,0

		db	0,1,0,0
		db	0,1,1,0
		db	0,0,1,0
		db	0,0,0,0

;

		db	1,1,0,0
		db	0,1,1,0
		db	0,0,0,0
		db	0,0,0,0

		db	0,0,1,0
		db	0,1,1,0
		db	0,1,0,0
		db	0,0,0,0

		db	1,1,0,0
		db	0,1,1,0
		db	0,0,0,0
		db	0,0,0,0

		db	0,0,1,0
		db	0,1,1,0
		db	0,1,0,0
		db	0,0,0,0

;

		db	0,1,0,0
		db	1,1,1,0
		db	0,0,0,0
		db	0,0,0,0
		
		db	0,1,0,0
		db	1,1,0,0
		db	0,1,0,0
		db	0,0,0,0

		db	0,0,0,0
		db	1,1,1,0
		db	0,1,0,0
		db	0,0,0,0

		db	0,1,0,0
		db	0,1,1,0
		db	0,1,0,0
		db	0,0,0,0

;

		db	0,0,1,0
		db	1,1,1,0
		db	0,0,0,0
		db	0,0,0,0

		db	1,1,0,0
		db	0,1,0,0
		db	0,1,0,0
		db	0,0,0,0

		db	0,0,0,0
		db	1,1,1,0
		db	1,0,0,0
		db	0,0,0,0

		db	0,1,0,0
		db	0,1,0,0
		db	0,1,1,0
		db	0,0,0,0

;

		db	1,0,0,0
		db	1,1,1,0
		db	0,0,0,0
		db	0,0,0,0

		db	0,1,0,0
		db	0,1,0,0
		db	1,1,0,0
		db	0,0,0,0

		db	0,0,0,0
		db	1,1,1,0
		db	0,0,1,0
		db	0,0,0,0

		db	0,1,1,0
		db	0,1,0,0
		db	0,1,0,0
		db	0,0,0,0

;

		db	0,1,1,0
		db	0,1,1,0
		db	0,0,0,0
		db	0,0,0,0

		db	0,1,1,0
		db	0,1,1,0
		db	0,0,0,0
		db	0,0,0,0

		db	0,1,1,0
		db	0,1,1,0
		db	0,0,0,0
		db	0,0,0,0

		db	0,1,1,0
		db	0,1,1,0
		db	0,0,0,0
		db	0,0,0,0


pal:	; score on the outsides	
	; player 1
	db	$40,$80		; block border color border, mid
	db	$3a,$70		; fieldpos y, x
	db	$40,0			; block color border, mid
	db	$3a,$74,$40,0	; score pos x,y,foreground, backgroundcolor
	db	$0d,$77,$40,$0	; next figure: x,y, color border, color of center

	; player 2
	db	$80,$40		; block border color border, mid
	db	$3a,$40		; fieldpos y, x
	db	$80,0			; block color border, mid
	db	$3a,$1b,$80,0	; score pos x,y,foreground, backgroundcolor
	db	$0d,$1b,$80,$0	; next figure: x,y, color border, color of center

ntsc:	; score between playfields
	; player 1	left player RED
	db	$40,$80		; color of block border, color of center
	db	$3a,$72		; fieldpos y, x
	db	$40,0			; block color border, mid
	db	$3a,$4b,$40,$c0	; score pos y,x,foreground, backgroundcolor
	db	$1d,$48,$40,$0	; next figure: y, x, color border, color of center

	; player 2	right player BLUE
	db	$80,$40		; block border color border, mid
	db	$3a,$3e		; fieldpos y, x
	db	$80,0			; block color border, mid
	db	$3a,$44,$80,$c0	; score pos y,x,foreground, backgroundcolor
	db	$0d,$48,$80,$0	; next figure: y, x, color border, color of center

ascii:	db	0,0,0,0,0,0,0,0 
	db	0,0,0,0,0,0,0,0 
	db	0,0,0,0,0,0,0,0 
	db	0,0,0,0,0,0,0,0 
	db	36,0,0,0,0,0,0,0 
	db	0,0,0,0,0,0,0,0 
	db	0,1,2,3,4,5,6,7
	db	8,9,0,0,0,0,0,0
	db	37,10,11,12,13,14,15,16
	db	17,18,19,20,21,22,23,24
	db	25,26,27,28,29,30,31,32
	db	33,34,35

font:	db	$e0,$a0,$a0,$a0,$e0	; 0
	db	$40,$c0,$40,$40,$e0	; 1
	db	$e0,$20,$e0,$80,$e0	; 2
	db	$e0,$20,$e0,$20,$e0	; 3
	db	$a0,$a0,$e0,$20,$20	; 4
	db	$e0,$80,$e0,$20,$e0	; 5
	db	$e0,$80,$e0,$a0,$e0	; 6
	db	$e0,$20,$40,$40,$40	; 7
	db	$e0,$a0,$e0,$a0,$e0	; 8
	db	$e0,$a0,$e0,$20,$e0	; 9
	db	$e0,$a0,$e0,$a0,$a0	; A
	db	$c0,$a0,$c0,$a0,$c0	; B
	db	$60,$80,$80,$80,$60	; C
	db	$c0,$a0,$a0,$a0,$c0
	db	$e0,$80,$e0,$80,$e0
	db	$e0,$80,$e0,$80,$80
	db	$60,$80,$a0,$a0,$60
	db	$a0,$a0,$e0,$a0,$a0
	db	$40,$40,$40,$40,$40
	db	$40,$40,$40,$40,$80
	db	$a0,$c0,$80,$c0,$a0
	db	$80,$80,$80,$80,$e0
	db	$a0,$e0,$a0,$a0,$a0
	db	$c0,$a0,$a0,$a0,$a0
	db	$40,$a0,$a0,$a0,$40	; O
	db	$c0,$a0,$a0,$c0,$80
	db	$40,$c0,$c0,$c0,$60
	db	$c0,$a0,$a0,$c0,$a0
	db	$60,$80,$40,$20,$c0
	db	$e0,$40,$40,$40,$40
	db	$a0,$a0,$a0,$a0,$60
	db	$a0,$a0,$a0,$a0,$40
	db	$a0,$a0,$a0,$e0,$a0
	db	$a0,$a0,$40,$a0,$a0
	db	$a0,$a0,$40,$40,$40
	db	$e0,$20,$40,$80,$e0
	db	0,0,0,0,0
	db	$60,$a0,$a0,$60,$a0	; tetris R

	
; r0 char as ascii
; r1 row
; r2 column
; r3 foreground color
; r4 background color
drawchar0:
		dci	ascii
		lr	a,0
		adc	
		lm
		dci	font
		adc
		adc
		adc
		adc
		adc
		li	5
		lr	10,a
		ins	5
		ni	$c0
		xs	1
		outs	5
drawchar1:	lm
		lr	5,a
		lr	a,2
		ins	4
		ni	$80
		xs	2
		outs	4
		lis	3
		lr	8,a
dcl4:
		lr	a,5
		ni	$80
		bf	4,dcl1
		lr	a,4
		bf	0,dcl2
dcl1:		lr	a,3
dcl2:		outs	1
		li	$60
		outs	0
		li	$50
		outs	0
		lis	6
		lr	6,a
dcl3:		ds	6
		bf	4,dcl3
		lr	a,5
		sl	1
		lr	5,a
		ins	4
		ai	$ff
		outs	4
		ds	8
		bf	4,dcl4
		ins	5
		ai	$ff
		outs	5
		ds	10
		bf	4,drawchar1

		pop

; is string
; r1 row
; r2 column
; r3 foreground color
; r4 background color
; r9 count
drawstring:
		lr	k,p
drawstring1:	lr	a,(is)
		lr	0,a
		pi	drawchar0
		lr	a,is
		ai	1
		lr	is,a
		lr	a,1
		ai	$fa
		lr	1,a
		ds	9
		bf	4,drawstring1
		lr	p,k
		pop

; dc string
drawansistringv:
		lr	k,p
drawstring3v:	lm
		lr	q,dc
		lr	0,a
		ci	0
		bt	4,drawstring4v
		ci	1
		bf	4,drawstring5v
		lm
		lr	1,a
		lm
		lr	2,a
		bf	0,drawstring3v
drawstring5v:	ci	2
		bf	4,drawstring6v
		lm
		lr	3,a
		lm
		lr	4,a
		bf	0,drawstring3v
drawstring6v:	pi	drawchar0
		lr	a,is
		ai	1
		lr	is,a
		lr	a,1
		ai	$fa
		lr	1,a
		lr	dc,q
		jmp	drawstring3v

drawstring4v:	lr	p,k
		pop

; dc string
drawansistring:
		lr	k,p
drawstring3:	lm
		lr	q,dc
		lr	0,a
		ci	0
		bt	4,drawstring4
		ci	1
		bf	4,drawstring5
		lm
		lr	1,a
		lm
		lr	2,a
		bf	0,drawstring3
drawstring5:	ci	2
		bf	4,drawstring6
		lm
		lr	3,a
		lm
		lr	4,a
		bf	0,drawstring3
drawstring6:	pi	drawchar0
		lr	a,is
		ai	1
		lr	is,a
		lr	a,2
		ai	$fc
		lr	2,a
		lr	dc,q
		jmp	drawstring3

drawstring4:	lr	p,k
		pop

thanx:
		db	1,$3a,$3a
		db	1,$34,$3a
		db	2,$40,$c0
		db	$20,$48,$41,$4c,$4c,$4f
		db	1,$2e,$3a
		db	1,$28,$3a
		db	2,$80,$c0
		db	$20,$46,$52,$41,$4e,$4b
		db	1,$22,$3a
		db	1,$1c,$3a
		db	2,$00,$c0
		db	$46,$52,$45,$44,$52,$49,$43
		db	1,$16,$3a
		db	1,$10,$38
		db	2,$40,$c0
		db	$20,$53,$45,$41,$4e
		db	1,$0a,$3a
		db	0

strgameover1:	
		db	2,$80,$c0
		db	1,$23,$6f
		db	$20,$47,$41,$4d,$45,$20
		db	1,$1d,$68
		db	$20,$4f,$56,$45,$52,$20
		db	0
strgameover2:	
		db	2,$40,$c0
		db	1,$23,$3b
		db	$20,$47,$41,$4d,$45,$20
		db	1,$1d,$34
		db	$20,$4f,$56,$45,$52,$20
		db	0

player1won:	
		db	2,$80,$c0
		db	1,$20,$66
		db	$57,$4f,$4e
		db	2,$40,$c0
		db	1,$20,$34
		db	$4c,$4f,$53,$54
		db	0

player2won:
		db	2,$80,$c0
		db	1,$20,$68
		db	$4c,$4f,$53,$54
		db	2,$40,$c0
		db	1,$20,$32
		db	$57,$4f,$4e
		db	0

copyright:
		db	2,$80,$0
		db	1,$37,$6d
		db	$20,$54,$45,$54,$40,$49,$53,$20
		db	2,$40,$c0
		db	1,$3a,$68
		db	$43,$4f,$50,$59,$52,$49,$47,$48,$54
		db	2,$40,$0
		db	1,$2b,$64
		db	$32,$30,$30,$34
		db	1,$25,$5f
		db	2,$40,$c0
		db	$42,$59
		db	1,$3a,$5a
		db	2,$00,$c0
		db	$20,$20,$50,$45,$54,$45,$52
		db	1,$3a,$56
		db	2,$80,$c0
		db	$20,$54,$52,$41,$55,$4e,$45,$52
		db	0