*** Supermix V(ersuch) 1.21 ***

;alle Variablen liegen in einem Block ab (a5)
;VORSICHT: die Routine cls wird bei MODIFY modifiziert !

LAENGE:		equ	8
MAXWORTE:	equ	1000
**********************************************************************
ExecBase:	equ	4
CALLEXEC:	macro
		move.l	ExecBase,a6
		jsr	?1(a6)
		endm

CALLINT:	macro
		move.l	IntBase(pc),a6
		jsr	?1(a6)
		endm

CALLGFX:	macro
		move.l	GfxBase(pc),a6
		jsr	?1(a6)
		endm

CALLDOS:	macro
		move.l	DosBase(pc),a6
		jsr	?1(a6)
		endm

OpenLibrary:	equ	-552
OPENLIB:	macro
		move.l	ExecBase,a6
		clr.l	d0
		lea	?1(pc),a1
		jsr	OpenLibrary(a6)
		tst.l	d0
		endm

CloseLibrary:	equ	-414
CLOSELIB:	macro
		move.l	ExecBase,a6
		move.l	?1(pc),a1
		jsr	CloseLibrary(a6)
		endm

PRINTHEAD:	macro
		move.l	IntBase(pc),a6
		move.l	v_RPort(a5),a0
		lea	HeadTxt(pc),a1
		move.w	#?1,d0
		move.w	#?2,d1
		jsr	PrintIText(a6)
		endm

ITEXT:	macro
	move.l	IntBase(pc),a6
	move.l	v_RPort(a5),a0
	lea	?1(pc),a1
	moveq	#3,d0
	moveq	#11,d1
	jsr	PrintIText(a6)
	endm

MAKERND:macro
	move.w	$dff006,d0
	divu	#?1,d0
	clr.w	d0
	swap	d0
	endm
**********************************************************************
;diverse System-Konstanten:

NULL:		equ	0
FindTask:	equ	-294
pr_CLI:		equ	$ac
pr_MsgPort:	equ	$5c
wd_UserPort:	equ	$56
wd_RPort:	equ	$32
mp_SigBit:	equ	$f
Wait:		equ	-318
WaitPort:	equ	-384
GetMsg:		equ	-372
ReplyMsg:	equ	-378
im_Class:	equ	$14
im_Code:	equ	$18
im_IAddress:	equ	$1c
im_Qualifier:	equ	$1a
GADGETUP:	equ	$40
MENUPICK:	equ	$100
VANILLAKEY:	equ	$200000
MENUNULL:	equ	$ffff
Delay:		equ	-198
AllocMem:	equ	-198
FreeMem:	equ	-210
OpenWindow:	equ	-204
CloseWindow:	equ	-72
SizeWindow:	equ	-288
SetWindowTitles:equ	-276
PrintIText:	equ	-216
DrawImage:	equ	-114
SetMenuStrip:	equ	-264
MENUENABLED:	equ	1
CHECKIT:	equ	1
ITEMTEXT:	equ	2
COMMSEQ:	equ	4
MENUTOGGLE:	equ	8
ITEMENABLED:	equ	16
HIGHCOMP:	equ	64
CHECKED:	equ	256
B_CHECKED:	equ	8	;Bit-Nummer
SetAPen:	equ	-342
SetBPen:	equ	-348
SetDrMd:	equ	-354
JAM1:		equ	0
JAM2:		equ	1
Move:		equ	-240
Text:		equ	-60
WritePixel:	equ	-324
Draw:		equ	-246
RectFill:	equ	-306
Open:		equ	-30
Close:		equ	-36
Read:		equ	-42
**********************************************************************
;Rahmen-Programm, welches die Libraries öffnet und eine ordnungsgemäße
;Rückkehr gewährleistet:

	sub.l	a1,a1		;a1=0->eigener Task
	CALLEXEC FindTask	;Wo darf man denn nachschauen ?
	move.l	d0,a4
	tst.l	pr_CLI(a4)	;von CLI oder WB aus gestartet ?
	bne	fromCLI
;von WB aus:
	lea	pr_MsgPort(a4),a0
	CALLEXEC WaitPort	;auf Start-Message warten
	lea	pr_MsgPort(a4),a0
	CALLEXEC GetMsg		;muß nachher beantwortet werden
	move.l	d0,WBenchMsg
;Libraries öffnen:
fromCLI:OPENLIB	IntName
	beq	ende
	move.l	d0,IntBase
	OPENLIB	GfxName
	beq	CloseInt
	move.l	d0,GfxBase
	OPENLIB	DosName
	beq	CloseGfx
	move.l	d0,DosBase
;Speicher für Variablen erzeugen
	move.l	#v_SIZEOF,d0
	moveq	#1,d1		;MEMF_PUBLIC
	CALLEXEC AllocMem
	tst.l	d0
	beq	CloseDos
	move.l	d0,a5
        add.l	#v_wort,d0
	move.l	d0,toinsertword
;Das Hauptprogramm aufrufen:
	bsr	main
;Speicher freigeben
	move.l	#v_SIZEOF,d0
	move.l	a5,a1
	CALLEXEC FreeMem
;die Libraries schließen
CloseDos:CLOSELIB DosBase
CloseGfx:CLOSELIB GfxBase
CloseInt:CLOSELIB IntBase
;und wieder zurück
ende:	tst.l	WBenchMsg	;war da was ?
	beq	toCLI		;na dann halt nicht
;Message zur WB zurück
	move.l	WBenchMsg,a1
	CALLEXEC ReplyMsg
toCLI:	clr.l	d0		;keine Fehler
	rts

WBenchMsg:	dc.l	0
IntBase:dc.l	0
GfxBase:dc.l	0
DosBase:dc.l	0
IntName:dc.b	"intuition.library",0
GfxName:dc.b	"graphics.library",0
DosName:dc.b	"dos.library",0
	even

main:	bsr	init	;Window öffnen, Titel, Erklärung und Wahl der
			;Vertauschungen (falls möglich)
games:	move.b	#3,LetterTxt
	bsr	start	;ein Wort auswählen und mischen
			;sowie den Bildschirm aufbauen
	move.b	#3,v_cursorspalte(a5)
;oranger Cursor:
	move.w	#1,cm1		;Bitmuster ist eine Plane tief
	move.w	#$0102,cm2	;Bitmuster wird in Plane 0 geschrieben,
				;Plane 1 wird gefüllt
	bsr	CursorZeigen
;Schleife bis Spielende/Aufgabe
game:	bsr	WaitChar
	cmp.b	#"4",d0
	beq	CursorLinks
	cmp.b	#"6",d0
	beq	CursorRechts
	cmp.b	#"5",d0
	beq	ReiheRunter
	cmp.b	#"8",d0
	beq	ReiheRauf
	cmp.b	#"T",d0
	beq	Tauschen
	cmp.b	#"A",d0
	beq	OtherWord
	cmp.b	#"E",d0
	bne	game
	bra	goodbye

;anderes Wort:
OtherWord:
	bsr	CursorLoeschen
	btst	#B_CHECKED,Item01+12
	beq	games
	ITEXT	OtherTxt
	bsr	WaitChar
	bra	games

;testen, ob Wort gefunden und ggf. Spiel beenden
TestEnd:lea	v_wort(a5),a0
	lea	v_spielfeld+16(a5),a1	;16=2*LAENGE
	moveq	#LAENGE-1,d0
compare:cmpm.b	(a0)+,(a1)+
	bne	game
	dbra	d0,compare

;Lösung gefunden:
Solved:	bsr	CursorLoeschen
	move.b	#1,LetterTxt
	moveq	#0,d4
	lea	v_spielfeld+16(a5),a4	;16=2*LAENGE
solv:	move.w	d4,d0
	moveq	#2,d1
	move.b	(a4)+,d2
	bsr	DisplayLetter
	addq.b	#1,d4
	cmp.b	#LAENGE,d4
	blt	solv
	ITEXT	SolveTxt

;Fragen, ob noch ein Spiel
Repeat:	ITEXT	RepeatQuest
;Entscheidung darüber:
deciderepeat:
	bsr	WaitChar
	cmp.b	#"J",d0
	beq	games
	cmp.b	#"N",d0
	bne	deciderepeat

goodbye:moveq	#2,d0
	move.l	v_RPort(a5),a1
	CALLGFX	SetAPen
	moveq	#47,d0
	move.w	#127,d1
	move.w	#270,d2
	move.w	#144,d3
	move.l	v_RPort(a5),a1
	jsr	RectFill(a6)
	ITEXT	GoodByeTxt
	move.l	#150,d1
	CALLDOS	Delay

;Window schließen
endmain:move.l	ArrowPtr,a1
	moveq	#DataSize,d0
	CALLEXEC FreeMem
noMem:	move.l	v_Window(a5),a0
	CALLINT	CloseWindow
exit:	rts
**********************************************************************
;Window (möglichst) öffnen, Worte einlesen, Titel, Erklärung und Wahl
;der Vertauschungen
;Bei Fehler: Sprung zur Rahmenroutine, so daß das Window nicht
;geschloßen wird
init:	lea	NewWindow(pc),a0
	CALLINT	OpenWindow
	move.l	d0,v_Window(a5)
	bne	c_init
;das war's schon
	tst.l	(sp)+	;Rückkehradresse zu "main" löschen
	rts		;ab zum Rahmen
;weiter mit dem Window:
c_init:	move.l	d0,a1
	move.l	wd_RPort(a1),a1
	move.l	a1,v_RPort(a5)
;eigenen Screen-Titel !
	move.l	v_Window(a5),a0
	lea	win_titel(pc),a1	;unnötig, aber ohne moveq ...
	move.l	a1,a2
	jsr	SetWindowTitles(a6)

**** die Image-Daten ins Chip-Memory verlegen ****
	moveq	#DataSize,d0
	moveq	#2,d1		;MEMF_CHIP
	CALLEXEC AllocMem
	tst.l	d0
	bne	gotMem
;kein Chip-Speicher frei
	tst.l	(sp)+		;Return-Adresse zu "main" löschen
	bra	noMem
;Adresse merken und Daten kopieren
gotMem:	move.l	ArrowPtr,a0	;von
	move.l	d0,ArrowPtr
	move.l	d0,a1		;nach
	moveq	#DataSize-1,d0
copyimg:move.b	(a0)+,(a1)+
	dbra	d0,copyimg
*********
;Vokabular einlesen (über Puffer !)
	move.l	#9000,d0	;(LAENGE+1)*MAXWORTE
	moveq	#1,d1		;MEMF_PUBLIC
	CALLEXEC AllocMem
	tst.l	d0
	bne	c_ini2
;wieder eine Pleite
noFile:	tst.l	(sp)+
	bra	endmain
c_ini2:	move.l	d0,a4
	move.l	#FileName,d1
	move.l	#1005,d2	;MODE_OLDFILE
	CALLDOS	Open
	move.l	d0,d4
	bne	FileExists
	move.l	#FileName2,d1
	move.l	#1005,d2
	jsr	Open(a6)
	move.l	d0,d4
	beq	noFile
;alles, was in den Wortpuffer paßt, auf einmal lesen
FileExists:
	move.l	d4,d1
	move.l	a4,d2
	move.l	#9000,d3	;(LAENGE+1)*MAXWORTE
	jsr	Read(a6)
	tst.l	d0
	beq	noFile
	move.l	d0,d7
;Datei zu
	move.l	d4,d1
	jsr	Close(a6)
;die Trennzeichen herausschmeißen und dabei nach "worte" umkopieren
	move.l	a4,a0		;da kommt's her
	lea	v_worte(a5),a1	;da geht's lang
	move.l	d7,d5		;soviel maximal
	clr.w	d4		;Wortzähler
reorg:	cmp.l	#LAENGE,d5	;noch genug auf Lager ?
	blt	endgot
	moveq	#LAENGE-1,d6	;soviele Buchstaben
copy:	move.b	(a0)+,(a1)+
	dbra	d6,copy
	addq	#1,a0		;Trenner überlesen
	sub.l	#LAENGE+1,d5
	addq	#1,d4		;wieder ein Wort
	bra	reorg
;Ende der Datei:
endgot:	move.w	d4,v_wort_anzahl(a5)
;Speicher wieder freigeben
	move.l	a4,a1
	move.l	#9000,d0
	CALLEXEC FreeMem
**** Titelbildschirm ****
	bsr	cls
	PRINTHEAD 3,59
	ITEXT	TitelTxt
	bsr	WaitSpace
**** 1. Seite der Erklärung ****
	bsr	cls
	ITEXT	Page1_1
	bsr	WaitSpace
**** 2. Seite der Erklärung ****
	bsr	cls
	ITEXT	Page2_1
;1..4 -> 5..20 Vertauschungen:
	moveq	#1,d7
;*5:
page2n:	moveq	#5,d0
	mulu	d7,d0
;10er
	divu	#10,d0
	tst.b	d0
	beq	ones		;kein "05" !
	add.b	#"0",d0
	move.b	d0,decidenum
;*5/1er
ones:	swap	d0
	add.b	#"0",d0
	move.b	d0,decidenum+1
;selbst eintragen:
	moveq	#"0",d0
	add.b	d7,d0
	move.b	d0,character
;Ausgabe
	move.l	v_RPort(a5),a0
	lea	DecideTxt(pc),a1
	clr.w	d0
	move.l	d7,d1
	mulu	#16,d1
	CALLINT	PrintIText
;Schleifenende:
	addq.b	#1,d7
	cmp.b	#5,d7
	blt	page2n
**** Abfrage der Vertauschungen ****
howmany:bsr	WaitChar
	cmp.b	#"1",d0
	blt	howmany
	cmp.b	#"4",d0
	bgt	howmany
	sub.b	#"0",d0
	clr.w	d1
	move.b	d0,d1
	mulu	#5,d0
	subq.b	#1,d0		;wird nur für dbra benutzt
	move.b	d0,v_vertauschungen(a5)
;Vertauschungen im Menu mit CHECKED markieren
	lea	Item10+12-Item_Size(pc),a0	;-Item_Size, da 1..4
	mulu	#34,d1			;#Item_Size geht nicht
	or.w	#CHECKED,0(a0,d1.w)

;ab jetzt darf das Window etwas kleiner sein !
	clr.w	d0
	moveq	#-50,d1
	move.l	v_Window(a5),a0
	CALLINT	SizeWindow
	sub.w	#50,MODIFY	;damit cls jetzt nicht zuweit geht

;Menu integrieren
	move.l	v_Window(a5),a0
	lea	Menu0(pc),a1
	CALLINT	SetMenuStrip
	rts

FileName2:dc.b	"Supermix/"
FileName:dc.b	"Worte",0
	even
**********************************************************************
cls:	moveq	#2,d0
	move.l	v_RPort(a5),a1
	CALLGFX	SetAPen
	moveq	#2,d0
	moveq	#10,d1
	move.w	#323,d2
	move.w	#198,d3
MODIFY:	equ	*-2
	jmp	RectFill(a6)
**********************************************************************
;Botschaft für das Fenster lesen und beantworten:
;Ergebnisse:	d0=Class,d1=code,d2=id,d3=qual
GetMessage:	move.l	v_Window(a5),a0
		move.l	wd_UserPort(a0),a0
		CALLEXEC GetMsg
		tst.l	d0
		bne	react_msg
;es gab gar keine Message:
		clr.l	d0
		rts
;Message lesen
react_msg:	move.l	d0,a0
		move.l	im_Class(a0),d0
		move.w	im_Code(a0),d1
		move.l	im_IAddress(a0),d2
		move.w	im_Qualifier(a0),d3
;Antwort:
		movem.l	d0-d3,-(sp)
		move.l	a0,a1
		jsr	ReplyMsg(a6)
		movem.l	(sp)+,d0-d3
		rts
**********************************************************************
;warten, bis im eigenen Window ein Zeichen eingetippt wurde und dieses
;zurückgeben
WaitChar:bsr	GetMessage
	tst.l	d0
        bne	alreadygot
	move.l	v_Window(a5),a0
	move.l	wd_UserPort(a0),a0
	move.b	mp_SigBit(a0),d1
	clr.l	d0
	bset	d1,d0
	CALLEXEC Wait
	bsr	GetMessage
alreadygot:
	cmp.l	#MENUPICK,d0
	beq	DecodeMenu
	cmp.l	#VANILLAKEY,d0
	bne	WaitChar
	clr.l	d0
	move.b	d1,d0
;UPCASE
	cmp.b	#"z",d0
	bgt	isupper
	cmp.b	#"a",d0
	blt	isupper
	sub.b	#" ",d0
;CR -> SPACE
isupper:cmp.b	#13,d0
	bne	gotkey
	moveq	#" ",d0
gotkey:	rts
;Menu-Anwahl verarbeiten:
DecodeMenu:
	cmp.l	#MENUNULL,d1	;irgendwas angewählt ?
	beq	WaitChar
	move.l	d1,d0
	and.l	#31,d0		;Menu-Nummer
	lsr.l	#5,d1
	and.l	#63,d1		;Item-Nummer
	tst.l	d0
	bne	menu_1
;Menu "Programm":
	cmp.b	#1,d1
	beq	WaitChar
	lea	menutab0(pc),a0
	move.b	0(a0,d1.w),d0
	rts
menutab0:	dc.b	"A-E"
	even
menu_1:	cmp.l	#1,d0
	bne	WaitChar
;Menu "Vertauschungen"
	addq.w	#1,d1
	mulu	#5,d1
	move.b	d1,v_vertauschungen(a5)
	bra	WaitChar
**********************************************************************
;mit Botschaft auf Space warten:
WaitSpace:ITEXT	WaitTxt
WaitSpc:bsr	WaitChar
	cmp.b	#' ',d0
	bne	WaitSpc
	rts
**********************************************************************
;Wort auswählen und mischen sowie das Spielfeld aufbauen:
start:	clr.l	d0
	move.w	$dff006,d0
	divu	v_wort_anzahl(a5),d0
	clr.w	d0
	swap	d0
;auf Adresse umrechnen
	mulu	#LAENGE,d0
	lea	v_worte(a5),a0
	add.l	d0,a0
;in "wort" und "spielfeld" kopieren (und den Rest des Spielfeldes löschen)
	lea	v_wort(a5),a1
	lea	v_spielfeld(a5),a2
	moveq	#LAENGE-1,d1
	moveq	#" ",d2
copylop:move.b	(a0)+,d0
	move.b	d0,(a1)+
	move.b	d2,4*LAENGE(a2)
	move.b	d2,3*LAENGE(a2)
	move.b	d0,2*LAENGE(a2)
	move.b	d0,LAENGE(a2)
	move.b	d0,(a2)+
	dbra	d1,copylop
;Vertauschungen ausführen
	clr.l	d7
	move.b	v_vertauschungen(a5),d7
;waagerecht:
mix_lop:moveq	#2*LAENGE,d6
hor_mix:move.l	a5,a3
	add.l	d6,a3
	MAKERND	LAENGE
	move.w	d0,d1
	MAKERND	LAENGE
	move.b	0(a3,d0.w),d2
	move.b	0(a3,d1.w),0(a3,d0.w)
	move.b	d2,0(a3,d1.w)
	tst.l	d6
	beq	vert
	sub.l	#LAENGE,d6
	bra	hor_mix
;senkrecht:
vert:	moveq	#LAENGE-1,d6
vert_mix:
	MAKERND	3
	mulu	#LAENGE,d0
	move.l	a5,a3
	add.l	d0,a3
	MAKERND	3
	mulu	#LAENGE,d0
	move.l	a5,a2
	add.l	d0,a2
	move.b	0(a3,d6.w),d2
	move.b	0(a2,d6.w),0(a3,d6.w)
	move.b	d2,0(a2,d6.w)
	dbra	d6,vert_mix

	dbra	d7,mix_lop

**** Speilfeld aufbauen ****
	bsr	cls
	move.l	v_RPort(a5),a4
	ITEXT	GamePage1
	move.l	a4,a1
	moveq	#3,d0
	CALLGFX	SetAPen
;Rahmen
	moveq	#10,d4
frm1:	move.l	a4,a1
	move.l	d4,d0
	moveq	#24,d1
	jsr	Move(a6)
	move.l	a4,a1
	move.l	d4,d0
	moveq	#93,d1
	jsr	Draw(a6)
	add.w	#24,d4
	cmp.w	#203,d4
	blt	frm1
	move.w	#94,d5
frm2:	move.l	a4,a1
	moveq	#10,d0
	move.w	d5,d1
	jsr	Move(a6)
	move.l	a4,a1
	move.w	#202,d0
	move.w	d5,d1
	jsr	Draw(a6)
	sub.w	#14,d5
	cmp.w	#16,d5
	bgt	frm2
	move.l	a4,a1
	moveq	#1,d0
	jsr	SetAPen(a6)
	moveq	#9,d0
	moveq	#51,d1
	jsr	Move(a6)
	move.l	a4,a1
	move.w	#203,d0
	moveq	#51,d1
	jsr	Draw(a6)
	move.l	a4,a1
	move.w	#203,d0
	moveq	#67,d1
	jsr	Draw(a6)
	move.l	a4,a1
	moveq	#9,d0
	moveq	#67,d1
	jsr	Draw(a6)
	move.l	a4,a1
	moveq	#9,d0
	moveq	#51,d1
	jsr	Draw(a6)
;Buchstaben einsetzen
	lea	v_spielfeld(a5),a4
	clr.w	d5
lett1:	clr.w	d4
lett2:	move.w	d4,d0
	move.w	d5,d1
	move.b	(a4)+,d2
	bsr	DisplayLetter
	addq	#1,d4
	cmp.b	#LAENGE,d4
	blt	lett2
	addq	#1,d5
	cmp.b	#3,d5
	blt	lett1
	rts
**********************************************************************
;Buchstaben im Spielfeld ausgeben.
;Parameter: d0=x-Position, d1=y-Position, d2=Zeichen
DisplayLetter:
	move.b	d2,character
	mulu	#24,d0
	mulu	#14,d1
	move.l	v_RPort(a5),a0
	lea	LetterTxt(pc),a1
	CALLINT	PrintIText
	rts
**********************************************************************
;Cursor anzeigen
;keine Parameter (wird alles über Variablen geregelt)
CursorZeigen:
	clr.l	d0
	move.b	v_cursorspalte(a5),d0
	mulu	#24,d0
	clr.w	d1
	move.l	v_RPort(a5),a0
	lea	Arrow(pc),a1
	CALLINT	DrawImage
	rts
**********************************************************************
;Cursor löschen. keine Parameter
CursorLoeschen:
	moveq	#2,d0
	move.l	v_RPort(a5),a1
	CALLGFX	SetAPen
	clr.l	d0
	move.b	v_cursorspalte(a5),d0
	mulu	#24,d0
	add.w	#18,d0
	moveq	#105,d1
	move.w	d0,d2
	addq.w	#8,d2
	move.w	d1,d3
	addq.w	#4,d3
	move.l	v_RPort(a5),a1
	jmp	RectFill(a6)
**********************************************************************
;Cursor nach links bewegen:
CursorLinks:
	bsr	CursorLoeschen
	tst.b	v_cursorspalte(a5)
	bne	noRollover_l
;ueberspringen nach rechts:
	move.b	#LAENGE,v_cursorspalte(a5)
noRollover_l:
	sub.b	#1,v_cursorspalte(a5)
	bsr	CursorZeigen
	bra	game
**********************************************************************
;Cursor nach rechts bewegen:
CursorRechts:
	bsr	CursorLoeschen
	cmp.b	#LAENGE-1,v_cursorspalte(a5)
	blt	noRollover_r
;ueberspringen nach links:
	move.b	#-1,v_cursorspalte(a5)
noRollover_r:
	add.b	#1,v_cursorspalte(a5)
	bsr	CursorZeigen
	bra	game
**********************************************************************
;eine Spalte abwärts verschieben, falls möglich
ReiheRunter:
	clr.l	d4
	move.b	v_cursorspalte(a5),d4
	lea	v_spielfeld(a5,d4.l),a4
	cmp.b	#" ",4*LAENGE(a4)
	bne	game		;nicht, wenn unten schon was ist !
;Verschieben:
	move.b	3*LAENGE(a4),4*LAENGE(a4)
	move.b	2*LAENGE(a4),3*LAENGE(a4)
	move.b	LAENGE(a4),2*LAENGE(a4)
	move.b	(a4),LAENGE(a4)
	move.b	#" ",(a4)
	bsr	DisplaySpalte
	bra	TestEnd
**********************************************************************
;eine Spalte anzeigen (zerstört d5 !) Parameter:
;d4=Spaltennummer, a4=Adresse des ersten Buchstaben der Spalte
DisplaySpalte:
	clr.w	d5
displin:move.w	d4,d0
	move.w	d5,d1
	move.b	(a4),d2
	bsr	DisplayLetter
	add.l	#LAENGE,a4
	addq.b	#1,d5
	cmp.b	#5,d5
	blt	displin
	rts
**********************************************************************
;eine Spalte aufwärts verschieben, falls möglich
ReiheRauf:
	clr.l	d4
	move.b	v_cursorspalte(a5),d4
	lea	v_spielfeld(a5,d4.l),a4
	cmp.b	#" ",(a4)
	bne	game		;nicht, wenn oben schon was ist !
;Verschieben:
	move.b	LAENGE(a4),(a4)
	move.b	2*LAENGE(a4),LAENGE(a4)
	move.b	3*LAENGE(a4),2*LAENGE(a4)
	move.b	4*LAENGE(a4),3*LAENGE(a4)
	move.b	#" ",4*LAENGE(a4)
	bsr	DisplaySpalte
	bra	TestEnd
**********************************************************************
;zwei Spalten vertauschen:
Tauschen:
	move.b	v_cursorspalte(a5),v_altspalte(a5)
;weißer Cursor:
	move.w	#2,cm1		;Bitmuster ist 2 Planes tief
	move.w	#$0300,cm2	;Bitmuster in Planes 0 und 1 schreiben,
				;keine Plane füllen
	cmp.b	#4,v_cursorspalte(a5)
	blt	c_right
;2. Cursor links vom 1.
	subq.b	#1,v_cursorspalte(a5)
	bra	shownewcursor
;2. Cursor rechts vom 1.
c_right:addq.b	#1,v_cursorspalte(a5)
shownewcursor:
	bsr	CursorZeigen
	ITEXT	TauschTxt
tauschlop:
	bsr	WaitChar
	cmp	#"6",d0
	beq	tRechts
	cmp	#"4",d0
	beq	tLinks
	cmp	#" ",d0
	bne	tauschlop
	bsr	CursorLoeschen
;Tausch ausführen:
	lea	v_spielfeld(a5),a4
	move.l	a4,a3
	clr.l	d4
	move.b	v_cursorspalte(a5),d4
	add.l	d4,a4
	clr.l	d5
	move.b	v_altspalte(a5),d5
	add.l	d5,a3
	moveq	#LAENGE,d3
	moveq	#4,d7
tausch:	move.b	(a4),d0
	move.b	(a3),(a4)
	move.b	d0,(a3)
	add.l	d3,a4
	add.l	d3,a3
	dbra	d7,tausch
	move.l	d5,d7
	sub.l	#5*LAENGE,a4
	bsr	DisplaySpalte
	move.l	d7,d4
	move.l	a3,a4
	sub.l	#5*LAENGE,a4
	bsr	DisplaySpalte
;alles wiederherstellen
	move.b	#3,TauschTxt3
	ITEXT	TauschTxt3
	moveq	#2,d0
	move.l	v_RPort(a5),a0
	CALLGFX	SetAPen
	move.b	#1,TauschTxt3
	moveq	#20,d0
	moveq	#119,d1
	move.w	#307,d2
	move.w	#135,d3
	move.l	v_RPort(a5),a0
	jsr	RectFill(a6)
	move.b	v_altspalte(a5),v_cursorspalte(a5)
;oranger Cursor
	move.w	#1,cm1		;Bitmuster ist 1 Plane tief, wird in
	move.w	#$0102,cm2	;Plane 0 geschrieben; Plane 1 wird
				;gefüllt
	bra	TestEnd
***********************************
;Cursor nach links bewegen: (speziell für Tausch)
tLinks:	bsr	CursorLoeschen
tli:	tst.b	v_cursorspalte(a5)
	bne	noRO_l
;ueberspringen nach rechts:
	move.b	#LAENGE,v_cursorspalte(a5)
noRO_l:	sub.b	#1,v_cursorspalte(a5)
	move.b	v_cursorspalte(a5),d0
	cmp.b	v_altspalte(a5),d0
	beq	tli
	bsr	CursorZeigen
	bra	tauschlop
***********************************
;Cursor nach rechts bewegen: (speziell für Tausch)
tRechts:bsr	CursorLoeschen
tre:	cmp.b	#LAENGE-1,v_cursorspalte(a5)
	blt	noRO_r
;ueberspringen nach links:
	move.b	#-1,v_cursorspalte(a5)
noRO_r:	add.b	#1,v_cursorspalte(a5)
	move.b	v_cursorspalte(a5),d0
	cmp.b	v_altspalte(a5),d0
	beq	tre
	bsr	CursorZeigen
	bra	tauschlop
**********************************************************************
;Variablen-Offsets
v_spielfeld:	equ	0
v_worte:	equ	v_spielfeld+LAENGE*5
v_wort:		equ	v_worte+[LAENGE*MAXWORTE]
v_Window:	equ	v_wort+LAENGE+1+1	;2. "+1": EVEN !
v_RPort:	equ	v_Window+4
v_wort_anzahl:	equ	v_RPort+4
v_vertauschungen:equ	v_wort_anzahl+2
v_cursorspalte:	equ	v_vertauschungen+1
v_altspalte:	equ	v_cursorspalte+1
v_SIZEOF:	equ	v_altspalte+1
**********************************************************************
;Konstanten
	even
NewWindow:
	dc.w	100,10,326,200
	dc.b	-1,-1
	dc.l	GADGETUP!MENUPICK!VANILLAKEY
	dc.l	$1006	;WINDOWDRAG|WINDOWDEPTH|SMART_REFRESH|ACTIVATE
	dc.l	NULL,NULL,win_titel,NULL,NULL
	dc.w	0,0,640,512
	dc.w	1	;WBENCHSCREEN
win_titel:
	dc.b	"Supermix",NULL

;Zeichensätze:
TOPAZ_SIXTY:	equ	9
TOPAZ_EIGHTY:	equ	8
FSF_BOLD:	equ	2
FS_NORMAL:	equ	0
FPF_ROMFONT:	equ	1
		even
fat_fnt:dc.l	topaz_name
	dc.w	TOPAZ_SIXTY
	dc.b	FSF_BOLD,FPF_ROMFONT
fnt_80:	dc.l	topaz_name
	dc.w	TOPAZ_EIGHTY
	dc.b	FS_NORMAL,FPF_ROMFONT
fnt_60:	dc.l	topaz_name
	dc.w	TOPAZ_SIXTY
	dc.b	FS_NORMAL,FPF_ROMFONT
topaz_name:	dc.b	"topaz.font",0

;Kopfzeile:
	even
HeadTxt:dc.b	3,2,JAM1,0
	dc.w	86,0
	dc.l	fat_fnt,headtx,NULL
headtx:	dc.b	"S U P E R M I X",NULL

;diverse Texte:
	even
TitelTxt:dc.b	3,2,JAM1,0
	dc.w	4,104
	dc.l	fnt_60,titeltx,NULL
titeltx:dc.b	"written 1989 by Arnold Schommer",NULL
WaitTxt:dc.b	1,0,JAM1,0
	dc.w	29,180
	dc.l	fnt_60,waittx,NULL
waittx:	dc.b	"Weiter mit der Leertaste !",NULL
	even
Page1_1:dc.b	3,2,JAM1,0
	dc.w	3,16
	dc.l	fnt_80,p1_1,Page1_2
Page1_2:dc.b	3,2,JAM1,0
	dc.w	3,24
	dc.l	fnt_80,p1_2,Page1_3
Page1_3:dc.b	3,2,JAM1,0
	dc.w	3,32
	dc.l	fnt_80,p1_3,Page1_4
Page1_4:dc.b	3,2,JAM1,0
	dc.w	3,40
	dc.l	fnt_80,p1_4,Page1_5
Page1_5:dc.b	3,2,JAM1,0
	dc.w	3,48
	dc.l	fnt_80,p1_5,Page1_6
Page1_6:dc.b	3,2,JAM1,0
	dc.w	3,56
	dc.l	fnt_80,p1_6,Page1_7
Page1_7:dc.b	3,2,JAM1,0
	dc.w	3,64
	dc.l	fnt_80,p1_7,Page1_8
Page1_8:dc.b	3,2,JAM1,0
	dc.w	3,80
	dc.l	fnt_80,p1_8,Page1_9
Page1_9:dc.b	3,2,JAM1,0
	dc.w	3,88
	dc.l	fnt_80,p1_9,Pag1_10
Pag1_10:dc.b	3,2,JAM1,0
	dc.w	3,96
	dc.l	fnt_80,p1_10,Pag1_11
Pag1_11:dc.b	3,2,JAM1,0
	dc.w	3,112
	dc.l	fnt_80,p1_11,Pag1_12
Pag1_12:dc.b	3,2,JAM1,0
	dc.w	3,120
	dc.l	fnt_80,p1_12,Pag1_13
Pag1_13:dc.b	3,2,JAM1,0
	dc.w	3,128
	dc.l	fnt_80,p1_13,Pag1_14
Pag1_14:dc.b	3,2,JAM1,0
	dc.w	3,136
	dc.l	fnt_80,p1_14,Pag1_15
Pag1_15:dc.b	3,2,JAM1,0
	dc.w	3,144
	dc.l	fnt_80,p1_15,Pag1_16
Pag1_16:dc.b	3,2,JAM1,0
	dc.w	3,152
	dc.l	fnt_80,p1_16,Pag1_17
Pag1_17:dc.b	3,2,JAM1,0
	dc.w	3,160
	dc.l	fnt_80,p1_17,HeadTxt
p1_1:	dc.b	"Bei diesem Spiel  sollen Sie ein durch-",NULL
p1_2:	dc.b	"einander geratenes Wort  wieder  in die",NULL
p1_3:	dc.b	"richtige Reihenfolge bringen.",NULL
p1_4:	dc.b	"Erschwert  wird dies  dadurch,  daß der",NULL
p1_5:	dc.b	"gesuchte  Begriff   dreimal  erscheint,",NULL
p1_6:	dc.b	"aber jede Zeile gemischt wurde und dann",NULL
p1_7:	dc.b	"noch jede Spalte !",NULL
p1_8:	dc.b	"Die Steuerung  erfolgt mit den Ziffern-",NULL
p1_9:	dc.b	"tasten,  dazu kommen noch  einige Buch-",NULL
p1_10:	dc.b	"staben,  deren Funktion angezeigt wird.",NULL
p1_11:	dc.b	"Um zwei Spalten zu vertauschen, bewegen",NULL
p1_12:	dc.b	"Sie erst  den Cursor  (den Pfeil  unter",NULL
p1_13:	dc.b	"dem  Spielfeld)  auf  die erste  der zu",NULL
p1_14:	dc.b	"tauschenden   Spalten,   drücken   »T«,",NULL
p1_15:	dc.b	"bewegen  den  neu erschienenen  zweiten",NULL
p1_16:	dc.b	"Cursor  unter  die  andere  Spalte  und",NULL
p1_17:	dc.b	"bestätigen mit »SPACE«.",NULL
	even
Page2_1:dc.b	3,2,JAM1,0
	dc.w	12,32
	dc.l	fnt_80,p2_1,Page2_2
Page2_2:dc.b	3,2,JAM1,0
	dc.w	12,40
	dc.l	fnt_80,p2_2,Page2_3
Page2_3:dc.b	3,2,JAM1,0
	dc.w	12,48
	dc.l	fnt_80,p2_3,Page2_4
Page2_4:dc.b	3,2,JAM1,0
	dc.w	12,56
	dc.l	fnt_80,p2_4,Page2_5
Page2_5:dc.b	3,2,JAM1,0
	dc.w	12,152
	dc.l	fnt_80,p2_5,HeadTxt
p2_1:	dc.b	"Um das Spiel angemessen schwierig zu",NULL
p2_2:	dc.b	"gestalten, können Sie nun die Anzahl",NULL
p2_3:	dc.b	"der  Vertauschungen   je  Zeile  und",NULL
p2_4:	dc.b	"Spalte bestimmen.",NULL
p2_5:	dc.b	"Bitte drücken Sie die Kennziffer !",NULL
	even
DecideTxt:	dc.b	3,2,JAM1,0
		dc.w	67,75
		dc.l	fnt_80,decidetx,DecideTxt2
DecideTxt2:	dc.b	1,0,JAM1,0
		dc.w	39,75
		dc.l	fat_fnt,character,NULL
decidetx:	dc.b	"= jeweils "
decidenum:	dc.b	" 5 Vertauschungen",NULL
character:	dc.b	0,0	;für die Ausgabe einzelner Zeichen
		even
LetterTxt:	dc.b	3,2,JAM2,0
		dc.w	16,28
		dc.l	fat_fnt,character,NULL
		even
GamePage1:	dc.b	3,2,JAM1,0
		dc.w	206,17
		dc.l	fnt_80,gp1,GamePage2
GamePage2:	dc.b	3,2,JAM1,0
		dc.w	206,31
		dc.l	fnt_80,gp2,GamePage3
GamePage3:	dc.b	3,2,JAM1,0
		dc.w	206,45
		dc.l	fnt_80,gp3,GamePage4
GamePage4:	dc.b	3,2,JAM1,0
		dc.w	206,59
		dc.l	fnt_80,gp4,GamePage5
GamePage5:	dc.b	3,2,JAM1,0
		dc.w	206,73
		dc.l	fnt_80,gp5,HeadTxt
gp1:	dc.b	"4 Pfeil links",NULL
gp2:	dc.b	"6 Pfeil rechts",NULL
gp3:	dc.b	"8 Reihe rauf",NULL
gp4:	dc.b	"5 Reihe runter",NULL
gp5:	dc.b	"T Tauschen",NULL
		even
TauschTxt:	dc.b	3,2,JAM1,0
		dc.w	16,108
		dc.l	fnt_60,tauschtx1,TauschTxt2
TauschTxt2:	dc.b	3,2,JAM1,0
		dc.w	40,117
		dc.l	fnt_60,tauschtx2,TauschTxt3
TauschTxt3:	dc.b	1,2,JAM1,0
		dc.w	222,73
		dc.l	fnt_80,gp5+2,NULL
tauschtx1:	dc.b	"Mit welcher Spalte tauschen ?",NULL
tauschtx2:	dc.b	"(mit Space bestätigen !)",NULL
		even
SolveTxt:	dc.b	3,2,JAM1,0
		dc.w	16,90
		dc.l	fnt_60,solvetx1,SolveTxt2
SolveTxt2:	dc.b	3,2,JAM1,0
		dc.w	56,99
		dc.l	fnt_60,solvetx2,NULL
solvetx1:	dc.b	"Ja ! Sie haben es geschafft !",NULL
solvetx2:	dc.b	"Das ist die Lösung !",NULL
		even
RepeatQuest:	dc.b	3,2,JAM1,0
		dc.w	47,117
		dc.l	fnt_60,repeat1,RepeatQuest2
RepeatQuest2:	dc.b	3,2,JAM1,0
		dc.w	60,126
		dc.l	fnt_60,repeat2,RepeatQuest3
RepeatQuest3:	dc.b	1,2,JAM1,0
		dc.w	168,126
		dc.l	fnt_60,repeat3,RepeatQuest4
RepeatQuest4:	dc.b	3,2,JAM1,0
		dc.w	178,126
		dc.l	fnt_60,repeat4,RepeatQuest5
RepeatQuest5:	dc.b	1,2,JAM1,0
		dc.w	197,126
		dc.l	fnt_60,repeat5,RepeatQuest6
RepeatQuest6:	dc.b	3,2,JAM1,0
		dc.w	207,126
		dc.l	fnt_60,repeat6,NULL
repeat1:	dc.b	"Wollen Sie noch einmal",NULL
repeat2:	dc.b	"spielen ? (",NULL
repeat3:	dc.b	"J",NULL
repeat4:	dc.b	"a/",NULL
repeat5:	dc.b	"N",NULL
repeat6:	dc.b	"ein)",NULL
		even
GoodByeTxt:	dc.b	1,0,JAM2,0
		dc.w	65,129
		dc.l	fat_fnt,goodbyetx,NULL
goodbyetx:	dc.b	"Auf Wiedersehen !"
		even
OtherTxt:	dc.b	3,2,JAM1,0
		dc.w	6,90
		dc.l	fnt_60,othertx,OtherTxt2
OtherTxt2:	dc.b	1,2,JAM1,0
		dc.w	110,100
		dc.l	fat_fnt
toinsertword:	dc.l	NULL,OtherTxt3
OtherTxt3:	dc.b	3,2,JAM1,0
		dc.w	114,129
		dc.l	fnt_60,othertx3,NULL
othertx:	dc.b	"Schade.Die Lösung wäre gewesen:",NULL
othertx3:	dc.b	"(Taste)",NULL

		even
;Daten für den Cursor:
Arrow:		dc.w	18,105,9,5
cm1:		dc.w	1
ArrowPtr:	dc.l	ArrowData
cm2:		dc.b	1,2
		dc.l	NULL
ArrowData:	dc.w	7168,15872,32512,65408,65408
		dc.w	58367,49663,33023,127,127
DataSize:	equ	*-ArrowData

;Daten für das Menu
Menu0:	dc.l	Menu1
	dc.w	1,0,72,10,MENUENABLED
	dc.l	menutx0,Item00
	dc.w	0,0,0,0
Item00:	dc.l	Item01
	dc.w	0,0,136,8,ITEMTEXT!ITEMENABLED!COMMSEQ!HIGHCOMP
	dc.l	NULL,ItemTxt00,NULL
	dc.b	"A",0
	dc.l	NULL
	dc.w	0
Item02:	dc.l	NULL
	dc.w	0,26,136,8,ITEMTEXT!ITEMENABLED!COMMSEQ!HIGHCOMP
	dc.l	NULL,ItemTxt02,NULL
	dc.b	"E",0
	dc.l	NULL
	dc.w	0
Item01:	dc.l	Item02
	dc.w	0,9,136,16
	dc.w	ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT!MENUTOGGLE
	dc.l	NULL,ItemTxt01,NULL
	dc.b	0,0
	dc.l	NULL
	dc.w	0
Menu1:	dc.l	NULL
	dc.w	80,0,120,10,MENUENABLED
	dc.l	menutx1,Item10
	dc.w	0,0,0,0
Item10:	dc.l	Item11
	dc.w	0,0,76,8
	dc.w	CHECKIT!ITEMTEXT!ITEMENABLED!COMMSEQ!HIGHCOMP!MENUTOGGLE
	dc.l	30,ItemTxt10,NULL
	dc.b	"1",0
	dc.l	NULL
	dc.w	0
Item_Size:	equ	*-Item10
Item11:	dc.l	Item12
	dc.w	0,9,76,8
	dc.w	CHECKIT!ITEMTEXT!ITEMENABLED!COMMSEQ!HIGHCOMP!MENUTOGGLE
	dc.l	29,ItemTxt11,NULL
	dc.b	"2",0
	dc.l	NULL
	dc.w	0
Item12:	dc.l	Item13
	dc.w	0,18,76,8
	dc.w	CHECKIT!ITEMTEXT!ITEMENABLED!COMMSEQ!HIGHCOMP!MENUTOGGLE
	dc.l	27,ItemTxt12,NULL
	dc.b	"3",0
	dc.l	NULL
	dc.w	0
Item13:	dc.l	Item14
	dc.w	0,27,76,8
	dc.w	CHECKIT!ITEMTEXT!ITEMENABLED!COMMSEQ!HIGHCOMP!MENUTOGGLE
	dc.l	23,ItemTxt13,NULL
	dc.b	"4",0
	dc.l	NULL
	dc.w	0
Item14:	dc.l	NULL
	dc.w	0,36,76,8
	dc.w	CHECKIT!ITEMTEXT!ITEMENABLED!COMMSEQ!HIGHCOMP!MENUTOGGLE
	dc.l	15,ItemTxt14,NULL
	dc.b	"5",0
	dc.l	NULL
	dc.w	0

ItemTxt00:	dc.b	0,1,JAM2,0
		dc.w	0,0
		dc.l	NULL,itemtx00,NULL
ItemTxt02:	dc.b	0,1,JAM2,0
		dc.w	0,0
		dc.l	NULL,itemtx02,NULL
ItemTxt01:	dc.b	0,1,JAM2,0
		dc.w	18,0
		dc.l	NULL,itemtx01,ItemTxt01_
ItemTxt01_:	dc.b	0,1,JAM2,0
		dc.w	26,8
		dc.l	NULL,itemtx01_,NULL
ItemTxt10:	dc.b	0,1,JAM2,0
		dc.w	18,0
		dc.l	NULL,itemtx10,NULL
ItemTxt11:	dc.b	0,1,JAM2,0
		dc.w	18,0
		dc.l	NULL,itemtx11,NULL
ItemTxt12:	dc.b	0,1,JAM2,0
		dc.w	18,0
		dc.l	NULL,itemtx12,NULL
ItemTxt13:	dc.b	0,1,JAM2,0
		dc.w	18,0
		dc.l	NULL,itemtx13,NULL
ItemTxt14:	dc.b	0,1,JAM2,0
		dc.w	18,0
		dc.l	NULL,itemtx14,NULL

menutx0:	dc.b	"Programm",NULL
itemtx00:	dc.b	"anderes Wort",NULL
itemtx02:	dc.b	"Spielende",NULL
itemtx01:	dc.b	"nicht erratene",NULL
itemtx01_:	dc.b	"Worte zeigen",NULL
menutx1:	dc.b	"Vertauschungen",NULL
itemtx10:	dc.b	"5",NULL
itemtx11:	dc.b	"10",NULL
itemtx12:	dc.b	"15",NULL
itemtx13:	dc.b	"20",NULL
itemtx14:	dc.b	"25",NULL
