;;#test	c:debug ram:test
;#end

vy:	equ	25
vx:	equ	40
ibufflen:	equ	1024

placex:	equ	0
placey:	equ	20

place:	equ	vx*placey
maxundo:	equ	512

excloselibrary:	equ	-$19e
rn_time:	equ	8
dl_root:	equ	$22
exopenlibrary:	equ	-$228
intclosewindow:	equ	-$48
intopenwindow:	equ	-$cc
wbenchscreen:	equ	1
windowdepth:	equ	4
smart_refresh:	equ	0
bm_sizeof:	equ	$28
pr_windowptr:	equ	$b0
exforbid:	equ	-$84
doscurrentdir:	equ	-$7e
wa_lock:	equ	0
sm_arglist:	equ	$24
pr_msgport:	equ	$5c
pr_cli:	equ	$ac
thistask:	equ	$114
iecode_rbutton:	equ	$69
gfxsetbpen:	equ	-$15c
is_size:	equ	$16
is_data:	equ	$e
intb_vertb:	equ	5
exremintserver:	equ	-$ae
nt_interrupt:	equ	2
ln_type:	equ	8
is_code:	equ	$12
exaddintserver:	equ	-$a8
bm_rows:	equ	2
bm_bytesperrow:	equ	0
rmbtrap:	equ	$10000
customscreen:	equ	$f
backdrop:	equ	$100
reportmouse:	equ	$200
memf_chip:	equ	2
bm_depth:	equ	5
borderless:	equ	$800
activate:	equ	$1000
nocarerefresh:	equ	$20000
menupick:	equ	$100
rawkey:	equ	$400
closewindow:	equ	$200
mousemove:	equ	$10
mousebuttons:	equ	8
exfreemem:	equ	-$d2
exallocmem:	equ	-$c6
intopenscreen:	equ	-$c6
memf_public:	equ	1
memf_clear:	equ	$10000
intclosescreen:	equ	-$42
nw_screen:	equ	$1e
gfxloadrgb4:	equ	-$c0
sc_viewport:	equ	$2c
sc_bitmap:	equ	$b8
bm_planes:	equ	8
wd_userport:	equ	$56
exreplymsg:	equ	-$17a
im_mousey:	equ	$22
im_mousex:	equ	$20
im_qualifier:	equ	$1a
im_code:	equ	$18
im_class:	equ	$14
exgetmsg:	equ	-$174
exwaitport:	equ	-$180
dosclose:	equ	-$24
dosread:	equ	-$2a
dosopen:	equ	-$1e
doswrite:	equ	-$30
gfxtext:	equ	-$3c
rp_cp_x:	equ	$24
rp_cp_y:	equ	$26
gfxsetapen:	equ	-$156
wd_rport:	equ	$32
esckey:	equ	$45
tabkey:	equ	$42
qkey:	equ	$10
wkey:	equ	$11
ekey:	equ	$12
rkey:	equ	$13
tkey:	equ	$14
ykey:	equ	$15
ukey:	equ	$16
ikey:	equ	$17
okey:	equ	$18
pkey:	equ	$19
akey:	equ	$20
skey:	equ	$21
dkey:	equ	$22
fkey:	equ	$23
gkey:	equ	$24
hkey:	equ	$25
jkey:	equ	$26
kkey:	equ	$27
lkey:	equ	$28
zkey:	equ	$31
xkey:	equ	$32
ckey:	equ	$33
vkey:	equ	$34
bkey:	equ	$35
nkey:	equ	$36
mkey:	equ	$37
delkey:	equ	$46
backkey:	equ	$41
helpkey:	equ	$5f
upkey:	equ	$4c
downkey:	equ	$4d
leftkey:	equ	$4f
rightkey:	equ	$4e
gfxwaittof:	equ	-$10e



	init	-$8000
	mds	execbase,4
	mds	dosbase,4
	mds	intbase,4
	mds	gfxbase,4
	mds	window,4
	mds	rport,4
	mds	uport,4
	mds	screen,4
	mds	plane0,4
	mds	plane1,4
	mds	plane2,4
	mds	plane3,4
	mds	seed,4
	mds	int1,is_size
	mds	keymap,16
	mds	down,4
	mds	isdown,1
	mds	nomoves,1
	mds	help,1
	mds	temppad,1
	mds	gfx,15*36*4*2
	mds	undos,maxundo*3
	mds	undop,2
	mds	ipnt,4
	mds	ileft,2
	mds	ibuffer,ibufflen
	mds	ihand,4
	mds	byteswide,2
	mds	bmcomp,1
	mds	bmnplanes,1
	mds	bmh,2
	mds	bmw,2
	mds	cards,64
	mds	stacks,160
	mds	hold,4
	mds	put,4
	mds	mapsave,64
	mds	abitmap,4
	mds	returnmsg,4
	mds	mytask,4
	mds	wptr,4
	mds	bm,bm_sizeof
 	label	workspace

	move.l	a0,a2
	move.l	d0,d2
	move.l	4.w,a6
	move.l	#workspace+$8000,d0
	move.l	#memf_public+memf_clear,d1
	jsr	exallocmem(a6)
	tst.l	d0
	beq	nomem
	move.l	d0,a5
	suba	#$8000,a5

	move.l	a6,execbase(a5)

	lea	gfxname(pc),a1
	moveq	#0,d0
	jsr	exopenlibrary(a6)
	move.l	d0,gfxbase(a5)
	lea	intname(pc),a1
	moveq	#0,d0
	jsr	exopenlibrary(a6)
	move.l	d0,intbase(a5)
	lea	dosname(pc),a1
	moveq	#0,d0
	jsr	exopenlibrary(a6)
	move.l	d0,dosbase(a5)


;	clr.l	returnmsg(a5)
;	move.l	thistask(a6),a4
;	moveq	#-1,d0
;	move.l	pr_windowptr(a4),wptr(a5)
;	move.l	d0,pr_windowptr(a4)
;
;	tst.l	pr_cli(a4)
;	bne.s	notwb
;	lea	pr_msgport(a4),a0
;	jsr	exwaitport(a6)
;	lea	pr_msgport(a4),a0
;	jsr	exgetmsg(a6)
;	move.l	d0,returnmsg(a5)
;
;	move.l	d0,a4
;	move.l	sm_arglist(a4),d0
;	beq.s	notwb
;	move.l	d0,a2
;	move.l	dosbase(a5),a6
;	move.l	wa_lock(a2),d1
;	jsr	doscurrentdir(a6)
;
;
;notwb:	bsr.s	do
;
;	move.l	execbase(a5),a6
;	move.l	returnmsg(a5),d4
;	beq.s	notwb2
;	jsr	exforbid(a6)
;	move.l	d4,a1
;	jsr	exreplymsg(a6)
;notwb2:

	clr.l	returnmsg(a5)
	suba.l	a1,a1
	jsr	exfindtask(a6)
	move.l	d0,mytask(a5)
	move.l	d0,a4
	moveq	#-1,d0
	move.l	pr_windowptr(a4),wptr(a5)
	move.l	d0,pr_windowptr(a4)
	tst.l	pr_cli(a4)
	bne.s	nowb
	lea	pr_msgport(a4),a0
	jsr	exwaitport(a6)
	lea	pr_msgport(a4),a0
	jsr	exgetmsg(a6)
	move.l	d0,returnmsg(a5)
	move.l	d0,a4
	move.l	sm_arglist(a4),d0
	beq.s	gogame
	move.l	d0,a2
	move.l	dosbase(a5),a6
	move.l	wa_lock(a2),d1
	jsr	doscurrentdir(a6)

nowb:

gogame:	bsr.s	do

	move.l	execbase(a5),a6
	move.l	returnmsg(a5),d4
	beq.s	nowb2
	jsr	exforbid(a6)
	move.l	d4,a1
	jsr	exreplymsg(a6)
nowb2:	move.l	mytask(a5),a4
	move.l	wptr(a5),pr_windowptr(a4)

	move.l	dosbase(a5),a1
	jsr	excloselibrary(a6)
	move.l	intbase(a5),a1
	jsr	excloselibrary(a6)
	move.l	gfxbase(a5),a1
	jsr	excloselibrary(a6)
	adda	#$8000,a5
	move.l	a5,a1
	move.l	#workspace+$8000,d0
	jsr	exfreemem(a6)

nomem:	moveq	#0,d0
	rts

do:	bsr	openstuff
	bsr	checkstuff
	beq	abort
	bsr	initstuff

	bsr	startgame

loop:	moveq	#100,d4
rlp:	bsr	rnd
	subq	#1,d4
	bne.s	rlp
	bsr	waittof
process:	bsr	getevent
	beq.s	loop
	bsr	processevent
	bra.s	process



abort:	bsr	closestuff
	rts
waittof:	move.l	gfxbase(a5),a6
	jmp	gfxwaittof(a6)

waitevent:	move.l	execbase(a5),a6
	move.l	uport(a5),a0
	jmp	exwaitport(a6)
getevent:	move.l	uport(a5),a0
	move.l	execbase(a5),a6
	jsr	exgetmsg(a6)
	tst.l	d0
	beq.s	noevent
	move.l	d0,a1
	move	im_class+2(a1),d2
	move	im_code(a1),d3
	move	im_qualifier(a1),d6
	move	im_mousex(a1),d4
	move	im_mousey(a1),d5
	jsr	exreplymsg(a6)
	moveq	#1,d0
noevent:	rts

;d4=where
blank:	bsr.s	blank1
	addq	#1,d4
	bsr.s	blank1
	addq	#1,d4
	bsr.s	blank1
	subq	#2,d4
	rts
blank1:	lea	plane0(a5),a1
	bsr.s	b1
	bsr.s	b1
	bsr	b1
b1:	move.l	(a1)+,a0
	adda	d4,a0
	clr.b	(a0)
	clr.b	vx(a0)
	clr.b	2*vx(a0)
	clr.b	3*vx(a0)
	clr.b	4*vx(a0)
	clr.b	5*vx(a0)
	clr.b	6*vx(a0)
	clr.b	7*vx(a0)
	clr.b	8*vx(a0)
	rts
back:	move	#36*4*14,d0
	bsr	tile
	move	#36*4*14+36,d0
	addq	#1,d4
	bsr	tile
	move	#36*4*14+72,d0
	addq	#1,d4
	bsr	tile
	subq	#2,d4
	rts
;d2=card, d4=where
card:	lea	cards(a5),a0
	moveq	#0,d3
	ext	d2
	adda	d2,a0
	tst.b	(a0)
	beq.s	d3fine
	move	#15*36*4,d3
d3fine:	move	d2,d0
	andi	#15,d0
	cmpi	#15,d0
	beq	back
	clr	d0
	move.b	d2,d0
	lsr	#4,d0
	mulu	#36,d0
	add	d3,d0
	bsr.s	tile
	addq	#1,d4
	move	d2,d0
	andi	#15,d0
	addq	#1,d0
	mulu	#36*4,d0
	cmpi.b	#$20,d2
	bcs.s	gotit
	addi	#36*2,d0
gotit:	add	d3,d0
	bsr.s	tile
	addq	#1,d4
	addi	#36,d0
	bsr.s	tile
	subq	#2,d4
	rts
tile:	lea	gfx(a5),a1
	adda	d0,a1
	lea	plane0(a5),a2
	bsr.s	tile1
	bsr.s	tile1
	bsr	tile1
tile1:	move.l	(a2)+,a0
	adda	d4,a0
	move.b	(a1)+,(a0)
	move.b	(a1)+,vx(a0)
	move.b	(a1)+,2*vx(a0)
	move.b	(a1)+,3*vx(a0)
	move.b	(a1)+,4*vx(a0)
	move.b	(a1)+,5*vx(a0)
	move.b	(a1)+,6*vx(a0)
	move.b	(a1)+,7*vx(a0)
	move.b	(a1)+,8*vx(a0)
	rts

openstuff:	move.l	intbase(a5),a6
	lea	newscreen(pc),a0
	jsr	intopenscreen(a6)
	move.l	d0,screen(a5)
	beq	badopen
	lea	newwindow(pc),a0
	move.l	d0,nw_screen(a0)
	jsr	intopenwindow(a6)
	move.l	d0,window(a5)
	beq.s	badopen
	lea	qgfx(pc),a0
	lea	bm(a5),a1
	bsr	readiff
	beq.s	badopen
	nop
badopen:	rts

checkstuff:	tst.l	screen(a5)
	beq.s	checkbad
	tst.l	window(a5)
	beq.s	checkbad
	tst.b	bm+bm_depth(a5)
	beq.s	checkbad
	moveq	#1,d0
checkbad:	rts


closestuff:	move.l	intbase(a5),a6
	move.l	window(a5),d0
	beq.s	cs1
	move.l	d0,a0
	clr.l	window(a5)
	jsr	intclosewindow(a6)
cs1:	move.l	screen(a5),d0
	beq.s	cs2
	move.l	d0,a0
	clr.l	screen(a5)
	jsr	intclosescreen(a6)
cs2:	lea	bm(a5),a2
	bsr	freebm
	rts

freebm:	move.l	execbase(a5),a6
	move.b	bm_depth(a2),d2
	beq.s	nobm
	clr.b	bm_depth(a2)
	move	bm_bytesperrow(a2),d3
	mulu	bm_rows(a2),d3
	lea	bm_planes(a2),a2
freebmlp:	move.l	(a2),a1
	move.l	d3,d0
	jsr	exfreemem(a6)
	clr.l	(a2)+
	subq.b	#1,d2
	bne.s	freebmlp
nobm:	rts


initstuff:	move.l	dosbase(a5),a0
	move.l	dl_root(a0),a0
	move.l	rn_time+8(a0),seed(a5)
	eori.l	#$aabacada,seed(a5)
	moveq	#0,d7
rndskip:	bsr	rnd
	subq.b	#1,d7
	bne.s	rndskip
	move.l	window(a5),a0
	move.l	wd_userport(a0),uport(a5)
	move.l	wd_rport(a0),rport(a5)
	move.l	screen(a5),a0
	lea	sc_bitmap+bm_planes(a0),a0
	lea	plane0(a5),a1
	move.l	(a0)+,(a1)+
	move.l	(a0)+,(a1)+
	move.l	(a0)+,(a1)+
	move.l	(a0)+,(a1)+
	move.l	gfxbase(a5),a6
	move.l	screen(a5),a0
	lea	sc_viewport(a0),a0
	lea	mapsave(a5),a1
	moveq	#32,d0
	jsr	gfxloadrgb4(a6)
	move.l	rport(a5),a1
	moveq	#1,d0
	jsr	gfxsetapen(a6)
	moveq	#0,d0
	move.l	rport(a5),a1
	jsr	gfxsetbpen(a6)


	lea	gfx(a5),a2
	moveq	#0,d4
	bsr.s	getgfx
	moveq	#4,d4
getgfx:	moveq	#15,d7
gy:	moveq	#4,d6
gx:	lea	bm+bm_planes(a5),a1
	moveq	#4,d2
gp:	move.l	(a1)+,a0
	adda	d4,a0
	moveq	#9,d1
gpl:	move.b	(a0),(a2)+
	adda	bm+bm_bytesperrow(a5),a0
	subq	#1,d1
	bne.s	gpl
	subq	#1,d2
	bne.s	gp
	addq	#1,d4
	subq	#1,d6
	bne.s	gx
	subq	#4,d4
	move	bm+bm_bytesperrow(a5),d0
	mulu	#9,d0
	add	d0,d4
	subq	#1,d7
	bne.s	gy
	rts

processevent:	cmpi	#rawkey,d2
	beq	arawkey
	cmpi	#mousebuttons,d2
	beq	mbuttons
	rts
mbuttons:	cmpi	#iecode_rbutton,d3
	beq	sethelp
	cmpi	#iecode_rbutton+$80,d3
	beq	clearhelp
	suba.l	a2,a2
	bsr	locate
	bmi.s	kill
	tst.b	d3
	bmi.s	doit
	move.b	d0,down(a5)
	rts
kill:	st	down(a5)
	rts
doit:	move.b	down(a5),d1
	bsr	try
	beq.s	kill
	bsr.s	dosingle1
	bsr	grab
	lea	undos(a5),a0
	adda	undop(a5),a0
	st	(a0)
	rts

;return d0=1 if no possible moves
canmove:	lea	cards(a5),a0
	moveq	#64,d0
cc2:	clr	(a0)+
	subq	#2,d0
	bne.s	cc2
	moveq	#0,d7
	tst.b	help(a5)
	beq.s	nohelp

	moveq	#0,d0
cm1:	moveq	#0,d1
cm2:	cmp.b	d0,d1
	beq.s	cmnext
	bsr	try
	beq.s	cmnext
	addq	#1,d7
	move	d1,d2
	bsr	loca0
	lea	cards(a5),a1
	move.b	(a0),d2
	st	0(a1,d2)
cmnext:	addq	#1,d1
	cmpi	#14,d1
	bne.s	cm2
	addq	#1,d0
	cmpi	#10,d0
	bne.s	cm1
nohelp:	move	d7,d0
	rts


;d0=dest,d1=source
dosingle1:	moveq	#1,d2
	bra.s	dosingleany
dosingle:	clr.b	d2
dosingleany:	lea	undos(a5),a0
	adda	undop(a5),a0
	move.b	d2,(a0)+
	move.b	d0,(a0)+
	move.b	d1,(a0)+
	addq	#3,undop(a5)

single:	move	d1,d2
	bsr	loca0
	move.b	(a0),d3
	st	(a0)
	cmpi.b	#14,d1
	bcs.s	taken
	move.b	d3,(a0)
	subq.b	#1,(a0)
taken:	move	d0,d2
	bsr	loca0
	cmpi.b	#10,d0
	bcc.s	notstack
	tst.b	(a0)
	bmi.s	noinc
	addq	#1,a0
noinc:	st	1(a0)
notstack:	move.b	d3,(a0)
placed:	rts

;d0=dest,d1=source, see if can do that move
;return Z if cannot do
try:	cmp.b	d0,d1
	beq.s	cannotdo
	move	d1,d2
	bsr	loca0
	move.b	(a0),d3
	bmi.s	cannotdo
	move	d0,d2
	bsr	loca0
	cmpi.b	#10,d0
	bcs.s	try1
	tst.b	(a0)
	bmi.s	cando
	bra.s	cannotdo
try1:	tst.b	(a0)
	bmi.s	try2
	addq	#1,d3
	cmp.b	(a0),d3
	beq.s	cando
	bra.s	cannotdo
try2:	andi	#15,d3
	cmpi	#12,d3
	bne.s	cannotdo
cando:	moveq	#1,d2
	bra.s	trydone
cannotdo:	moveq	#0,d2
trydone:	rts

;d2=where, set a0=pointer
loca0:	ext	d2
	cmpi	#10,d2
	bcs.s	loca01
	cmpi	#14,d2
	bcs.s	loca02
	lea	put-14(a5),a0
	adda	d2,a0
	bra.s	loca0done
loca02:	lea	hold-10(a5),a0
	adda	d2,a0
	bra.s	loca0done
loca01:	lsl	#4,d2
	lea	stacks(a5),a0
	adda	d2,a0
	tst.b	(a0)
	bmi.s	loca0done
stend:	tst.b	(a0)+
	bpl.s	stend
	subq	#2,a0
loca0done:	rts


;d4=x,d5=y, return d0=0-9 for stack,10-13 for hold, 14-17 for put
;return neg if nowhere
locate:	move	d4,d0
	lsr	#5,d0
	cmpi	#placey+20,d5
	bcc.s	locdone
	cmpi	#3,d0
	bcs	nowhere
	cmpi	#7,d0
	bcc	nowhere
	addi	#10-3,d0
	rts
nowhere:	moveq	#-1,d0
locdone:	rts

arawkey:	cmpi	#$45,d3
	beq	anescape
	cmpi	#$44,d3
	beq	startgame
	cmpi	#leftkey,d3
	beq	doundo
	cmpi	#rightkey,d3
	beq	doredo
	move.b	d3,d0
	andi	#$7f,d0
	lsr	#3,d0
	lea	keymap(a5),a0
	adda	d0,a0
	bset	d3,(a0)
	tst.b	d3
	bpl.s	bitset
	bclr	d3,(a0)
bitset:	rts
anescape:	addq	#4,a7
	bra	abort
ignore:	rts

sethelp:	st	help(a5)
	bra	display
clearhelp:	clr.b	help(a5)
	bra	display

doundo:	move	undop(a5),d7
	beq	ignore
	lea	undos(a5),a4
	adda	d7,a4
doundolp:	move.b	-(a4),d0
	move.b	-(a4),d1
	move.b	-(a4),d6
	subq	#3,d7
	bsr	single
	movem.l	a4/d6/d7,-(a7)
	bsr	display
	movem.l	(a7)+,a4/d6/d7
	tst.b	d6
	bne.s	undodone
	tst	d7
	bne.s	doundolp
undodone:	move	d7,undop(a5)
	rts

doredo:	move	undop(a5),d7
	lea	undos(a5),a4
	adda	d7,a4
doredolp:	move.b	(a4)+,d6
	bmi.s	redodone
	move.b	(a4)+,d0
	move.b	(a4)+,d1
	tst.b	d6
	beq.s	okredo
	cmp	undop(a5),d7
	bne.s	redodone
okredo:	addq	#3,d7
	bsr	single
	movem.l	a4/d7,-(a7)
	bsr	display
	movem.l	(a7)+,a4/d7
	bra.s	doredolp
redodone:	move	d7,undop(a5)
	rts


startgame:	clr	undop(a5)
	clr.b	nomoves(a5)
	clr.b	help(a5)
	st	undos(a5)
	lea	cards(a5),a0
	moveq	#64,d0
cc:	clr.b	(a0)+
	subq	#1,d0
	bne.s	cc
	moveq	#10,d6
	lea	stacks(a5),a4
makestacks:	moveq	#5,d4
ms:	bsr	getcard
	move.b	d0,(a4)+
	subq	#1,d4
	bne.s	ms
	st	(a4)
	adda	#11,a4
	subq	#1,d6
	bne.s	makestacks
	st	hold(a5)
	st	hold+3(a5)
	bsr	getcard
	move.b	d0,hold+1(a5)
	bsr	getcard
	move.b	d0,hold+2(a5)
	move.l	#$ff0f1f2f,put(a5)
	bsr	clear
	bsr.s	dograb
	clr	undop(a5)
	st	undos(a5)
	rts
dograb:
grab:	bsr	display
	lea	put(a5),a4
	moveq	#14-1,d4
	bsr.s	grab2
	bne.s	grab
	bsr.s	grab2
	bne.s	grab
	bsr.s	grab2
	bne.s	grab
	bsr.s	grab2
	bne.s	grab
	rts
grab2:	move.b	(a4)+,d2
	addq.b	#1,d2
	addq	#1,d4

	lea	stacks(a5),a2
	moveq	#0,d1
grablp:	tst.b	(a2)
	bmi.s	gnext
	move.l	a2,a3
glp2:	tst.b	(a3)+
	bpl.s	glp2
	subq	#2,a3
	cmp.b	(a3),d2
	beq.s	grabbed
gnext:	adda	#16,a2
	addq	#1,d1
	cmpi	#10,d1
	bne.s	grablp
	lea	hold(a5),a2
	moveq	#10,d1
ghold:	cmp.b	(a2)+,d2
	beq.s	grabbed
	addq	#1,d1
	cmpi	#14,d1
	bne.s	ghold
	rts
grabbed:	move	d4,d0
	bsr	dosingle
	moveq	#1,d2
	rts

display:	bsr	canmove
	move	#place,d4
	move.b	put(a5),d2
	bsr	card
	addq	#4,d4
	move.b	put+1(a5),d2
	bsr	card
	addq	#8,d4
	move.b	hold(a5),d2
	bsr	card
	addq	#4,d4
	move.b	hold+1(a5),d2
	bsr	card
	addq	#4,d4
	move.b	hold+2(a5),d2
	bsr	card
	addq	#4,d4
	move.b	hold+3(a5),d2
	bsr	card
	addq	#8,d4
	move.b	put+2(a5),d2
	bsr	card
	addq	#4,d4
	move.b	put+3(a5),d2
	bsr	card
	lea	stacks(a5),a4
	moveq	#10,d7
	move	#place+20*vx,d6
putstacks:	move.l	a4,a3
	move	d6,d4
ps2:	move.b	(a3)+,d2
	bmi.s	psdone
	bsr	card
	addi	#vx*10,d4
	bra.s	ps2
psdone:	bsr	blank
	adda	#16,a4
	addq	#4,d6
	subq	#1,d7
	bne.s	putstacks
	rts



clear:	lea	plane0(a5),a1
	bsr.s	cp
	bsr.s	cp
	bsr	cp
cp:	move.l	(a1)+,a0
	move	#vx*vy*8,d0
cplp:	clr	(a0)+
	subq	#2,d0
	bne.s	cplp
	rts

rnd:	move.l	seed(a5),d0
	swap	d0
	move.l	d0,d1
	rol.l	#3,d1
	eor	d0,d1
	move	d1,d0
	move.l	d0,seed(a5)
	rts
getcard:	bsr	rnd
	andi	#63,d0
	move	d0,d1
	andi	#15,d1
	cmpi	#13,d1
	bcc.s	getcard
	lea	cards(a5),a0
	adda	d0,a0
	tst.b	(a0)
	bne.s	getcard
	st	(a0)
	rts



;a0=name,a1=bitmap
;fills in bitmap and allocates planes
readiff:	move.l	a1,abitmap(a5)
	clr.b	bm_depth(a1)	
	move.l	a0,d1
	move.l	#1005,d2
	move.l	dosbase(a5),a6
	jsr	dosopen(a6)
	move.l	d0,ihand(a5)
	beq.s	badread
	clr	ileft(a5)
	move.l	a4,-(a7)
	bsr.s	doiff
	move.l	(a7)+,a4
	move.l	ihand(a5),d1
	move.l	dosbase(a5),a6
	jsr	dosclose(a6)
	moveq	#1,d0
badread:	rts

ifferror:	rts
doiff:	clr.b	bmnplanes(a5)
	bsr	readlong
	move.l	d0,d4
	bsr	readlong
	move.l	d0,d5
	cmpi.l	#'FORM',d4
	bne	ifferror
	bsr	readlong
	cmpi.l	#'ILBM',d0
	bne	ifferror
doiffloop:	pea	doiffloop(pc)
	bsr	readlong
	move.l	d0,d4
	bsr	readlong
	move.l	d0,d5
	cmpi.l	#'BMHD',d4
	beq	dobmhd
	cmpi.l	#'BODY',d4
	beq	dobody
	cmpi.l	#'CMAP',d4
	beq	docmap
skipblock:	addq.l	#1,d5
	andi	#$fffe,d5
sblp:	bsr	readbyte
	subq.l	#1,d5
	bne.s	sblp
	rts
docmap:	divu	#3,d5
	lea	mapsave(a5),a2
cmaplp:	bsr	readbyte
	rol	#4,d0
	andi	#$f00,d0
	move	d0,d3
	bsr	readbyte
	andi	#$f0,d0
	or	d0,d3
	bsr	readbyte
	ror	#4,d0
	andi	#$f,d0
	or	d0,d3
	move	d3,(a2)+
	subq	#1,d5
	bne.s	cmaplp
	rts

dobmhd:	move.l	abitmap(a5),a2
	bsr	readword	; w
	move	d0,bmw(a5)
	addq	#7,d0
	asr	#3,d0
	move	d0,byteswide(a5)
	move	d0,bm_bytesperrow(a2)
	move	d0,d2
	bsr	readword	; h
	move	d0,bmh(a5)
	move	d0,bm_rows(a2)
	mulu	d0,d2
	bsr	readlong	; x,y
	bsr	readbyte	; nplanes
	move.b	d0,bmnplanes(a5)
	move.b	d0,bm_depth(a2)
	move.b	d0,d3
	bsr	readbyte	; masking
	bsr	readbyte	; compression
	move.b	d0,bmcomp(a5)
	bsr	readbyte	; pad
	bsr	readword	; transp
	bsr	readword	; aspects
	bsr	readlong	; pw,ph
	move.l	execbase(a5),a6
	lea	bm_planes(a2),a2
allocbm:	move.l	d2,d0
	moveq	#memf_chip,d1
	jsr	exallocmem(a6)
	move.l	d0,(a2)+
;Z if no allocate, no check
	subq.b	#1,d3
	bne.s	allocbm
	move.l	dosbase(a5),a6
	rts

dobody:	moveq	#0,d1
	moveq	#0,d6	; offset in plane
	move	bmh(a5),d5
dobodyouter:	move.b	bmnplanes(a5),d7
	move.l	abitmap(a5),a3
	lea	bm_planes(a3),a3
dobodylp:	move.l	(a3)+,a2
	adda	d6,a2
	move	byteswide(a5),d4
	bsr	readline
	subq.b	#1,d7
	bne.s	dobodylp
	add	byteswide(a5),d6
	subq	#1,d5
	bne	dobodyouter
	addq	#4,a7
	rts
readline:	cmpi.b	#1,bmcomp(a5)
	beq.s	unpack
notpacked:	bsr	readbyte
	move.b	d0,(a2)+
	subq	#1,d4
	bne.s	notpacked
	rts
unpack:	bsr	readbyte
	tst.b	d0
	bpl.s	literal
	cmpi.b	#$80,d0
	beq.s	unpack
	neg.b	d0
	addq.b	#1,d0
	move.b	d0,d1
	sub	d1,d4
	bsr	readbyte
replicatelp:	move.b	d0,(a2)+
	subq.b	#1,d1
	bne.s	replicatelp
	bra.s	chklineend
literal:	addq.b	#1,d0
	move.b	d0,d1
	sub	d1,d4
literallp:	bsr	readbyte
	move.b	d0,(a2)+
	subq.b	#1,d1
	bne.s	literallp
chklineend:	tst	d4
	bne.s	unpack
	rts

readlong:	bsr.s	readword
	swap	d0
readword:	bsr.s	readbyte
	rol	#8,d0
readbyte:	subq	#1,ileft(a5)
	bcc.s	byteok
	movem.l	d0-d3/a1,-(a7)
	move.l	ihand(a5),d1
	lea	ibuffer(a5),a0
	move.l	a0,ipnt(a5)
	move.l	a0,d2
	move.l	#ibufflen,d3
	move.l	dosbase(a5),a6
	jsr	dosread(a6)
	move	d0,ileft(a5)
	movem.l	(a7)+,d0-d3/a1
	bne.s	readbyte
	rts
byteok:	move.l	ipnt(a5),a0
	move.b	(a0)+,d0
	move.l	a0,ipnt(a5)
	rts

;d2=x,d3=y, get pixel color into d0 from bm
getpixel:	lea	bm(a5),a2
	move	bm_bytesperrow(a2),d1
	mulu	d3,d1
	move	d2,d0
	lsr	#3,d0
	add	d0,d1
	move	d1,a1
	clr	d0
	clr	d1
	not	d2
	lea	bm_planes(a2),a2
gplp:	move.l	(a2)+,a0
	adda	a1,a0
	btst	d2,(a0)
	beq.s	zbit
	bset	d1,d0
zbit:	addq	#1,d1
	cmp.b	bm+bm_depth(a5),d1
	bne.s	gplp
	not	d2
	rts




newscreen:	dc	0,0,320,200,4	; left,top,width,height,depth
	dc.b	1,0		; pens
	dc	0		; viewmodes
	dc	customscreen	; type
	dc.l	0		; font
	dc.l	0		; title
	dc.l	0		; gadgets
	dc.l	0		; custombitmap
newwindow:	dc	0,0
	dc	320,200
	dc.b	30,31
	dc.l	MOUSEBUTTONS+MOUSEMOVE+CLOSEWINDOW+RAWKEY+MENUPICK	;+MENUVERIFY
	dc.l	BACKDROP+REPORTMOUSE+BORDERLESS+ACTIVATE+NOCAREREFRESH+rmbtrap
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc	0,0
	dc	0,0
	dc	CUSTOMSCREEN


dosname:	dc.b	'dos.library',0
intname:	dc.b	'intuition.library',0
gfxname:	dc.b	'graphics.library',0
qgfx:	dc.b	'cardparts',0
exfindtask:	equ	-$126
