	*************************************************
	*						*
	*	DHAM_SHOW V0.91 -- © 1991 By Dreamer	*
	*						*
	*************************************************

; --> Version dates

; V0.9  --  19.12.1991
; V0.91 --  03.01.1992

	Include "DSDATA/mymacro_new.i"
	Include "DSDATA/myliboffsets.i"

PRINT:	MACRO
	move.l	OutHandle(pc),d1
	ADR	\1,d2
	move.l	#\1.E-\1,d3
	LIBC	Write
ENDM


MyAlloc: MACRO
	move.l	#\1,d1
	jsr	MyAllocR(pc)
ENDM

MyFree: MACRO
	jsr	MyFreeR(pc)
ENDM

CLSFree: MACRO	; Vapauta jos muistipaikassa ei ole nollaa
		; Ja nollaa muistipaikka.
	lea	\1(pc),a0
	jsr	CLSFreeR(pc)
ENDM

FALSE		= 0
TRUE		= -1
MEMF_PUBLIC	= 1
MEMF_CHIP	= 2
MEMF_FAST	= 4
MEMF_CLEAR	= $10000
MEMF_LARGEST	= $20000
NULL		= 0
MODE_READWRITE	= 1004
MODE_OLD	= 1005


	SECTION	DShow,code

Start:
	; A0.L: Osoite commandlineen
	; D0.L: Commandlinen pituus

	movem.l	d0/a0,ComSave
	OPENLIB	DosName
	tst.l	d0
	beq.w	NoDos
	PUT.L	d0,DosBase
	OPENLIB	GfxName
	tst.l	d0
	beq.w	NOGfx
	PUT.L	d0,GfxBase

	DOS2	Output
	PUT.L	d0,OutHandle
	tst.l	d0
	beq.w	Exit
	LIBC	Input
	PUT.L	d0,InHandle
	tst.l	d0
	beq.w	Exit

	movem.l	ComSave(pc),d0/a0
	clr.b	-1(a0,d0.l)
	bsr.w	ComLine			; Mitkä optionit päällä
	move.l	a0,a1
	PUT.L	d0,ComData
	tst.l	d0
	bne.s	EiHelp
	DOS
 	PRINT	HelpText
	bra.w	Exit
EiHelp:
	PUT.L	a1,FirstName
	moveq	#-2,d0
	move.l	a1,d1
	ADRL	FBlock,d2
	DOS2	Lock
	tst.l	d0
	beq.w	Exit
	PUT.L	d0,FileLock
	move.l	d0,d1
	ADRL	FBlock,d2
	LIBC	Examine
	tst.l	d0
	bne.s	ExamOk
UnLockFile:
	move.l	FileLock(pc),d1
	LIBC	UnLock
	bra.w	Exit
ExamOk:
	tst.l	FBlock+4			; File vai directory
	bpl.w	DirScan
; --> Vain yksi file
	PRINT	First
	move.l	OutHandle(pc),d1		; Printtaa filen nimi
	ADRL	FBlock+8,d2
	move.l	d2,a0
	moveq	#0,d3
Loop03:
	addq.l	#1,d3
	tst.b	(a0)+
	bne.s	Loop03
	LIBC	Write
	PRINT	Colon

	move.l	FirstName(pc),d1		; Lataa file
	LIBC	LoadSeg
	tst.l	d0
	beq.w	NopeDHAM3
	PUT.L	d0,Segment
	add.l	d0,d0
	add.l	d0,d0
	move.l	d0,a0
	addq.w	#4,a0
	bsr.w	CheckFile
	tst.l	d0
	beq.w	NopeDHAM
	cmp.l	#1,d0			; Onko lyhyt DHAM-HEADER
	beq.s	LongDHAM
; --> ShortDHAM
	PRINT	DHAMPic
	bsr.w	PrintSize
	PRINT	DHAM2
	move.l	CopListNow(pc),a2
	move.l	BitmapNow(pc),a4
	move.l	CopNow(pc),a5
	move.l	KuvaData(pc),a3
	move.l	RouNow(pc),a0
	subq.w	#4,a0
	bra.s	ShortDHAM
LongDHAM:
	PRINT	DHAMPic
	bsr.w	PrintSize
	PRINT	DHAM1
	move.l	SegMent(pc),a0
	add.l	a0,a0
	add.l	a0,a0
ShortDHAM:
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	GfxBase(pc),a6
	jsr	4(a0)			; Käynnistä file
	movem.l	(sp)+,d0-d7/a0-a6
UnAlloc:
	move.l	Segment(pc),d1
	LIBC	UnLoadSeg
	bra.w	UnLockFile
NopeDHAM:
	PRINT	NoDHAMPic
	bra.s	UnAlloc
NopeDHAM3:
	PRINT	NODHAMPic
	bra.w	UnLockFile

DirScan:	; Katso kaikki filet directorystä
	move.l	FileLock(pc),d1
	LIBC	CurrentDir
	PUT.L	d0,OldLock
DirScanCont:
	clr.w	DifNow
	clr.w	DifNow2
	clr.w	DifNow3
	clr.w	DifNow4
	move.l	FileLock(pc),d1
	ADRL	FBlock,d2
	LIBC	ExNext
	tst.l	d0
	beq.w	ExitScan

	PRINT	First
	move.l	OutHandle(pc),d1		; Printtaa filen nimi
	ADRL	FBlock+8,d2
	move.l	d2,a0
	moveq	#0,d3
Loop04:
	addq.l	#1,d3
	tst.b	(a0)+
	bne.s	Loop04
	LIBC	Write
	PRINT	Colon

	ADRL	FBlock+8,d1
	LIBC	LoadSeg
	tst.l	d0
	bne.s	ExeOk
	PRINT	NoDHAMPic
	bra.w	DirScanCont
ExeOk:
	PUT.L	d0,Segment
	add.l	d0,d0
	add.l	d0,d0
	move.l	d0,a0
	addq.w	#4,a0
	bsr.w	CheckFile
	tst.l	d0
	beq.w	NopeDHAM2

	cmp.l	#2,d0			; Onko lyhyt DHAM-HEADER
	bne.s	LongDHAM2
	PRINT	DHAMPic
	bsr.w	PrintSize
	PRINT	DHAM2
	move.l	CopListNow(pc),a2
	move.l	BitmapNow(pc),a4
	move.l	CopNow(pc),a5
	move.l	KuvaData(pc),a3
	move.l	RouNow(pc),a0
	subq.w	#4,a0
	bra.s	ShortDHAM2
LongDHAM2:
	PRINT	DHAMPic
	bsr.w	PrintSize
	PRINT	DHAM1
	move.l	SegMent(pc),a0
	add.l	a0,a0
	add.l	a0,a0
ShortDHAM2:
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	GfxBase(pc),a6
	jsr	4(a0)				; Käynnistä file
	movem.l	(sp)+,d0-d7/a0-a6
UnAlloc2:
	move.l	Segment(pc),d1
	LIBC	UnLoadSeg
	bra.w	DirScanCont
NopeDHAM2:
	PRINT	NoDHAMPic
	bra.s	UnAlloc2

ExitScan:
	move.l	OldLock(pc),d1
	LIBC	CurrentDir
Exit:
	move.l	GfxBase(pc),a1
	EXEC2	CloseLibrary
NoGfx:
	move.l	DosBase(pc),a1
	EXEC2	CloseLibrary
NoDos:
	moveq	#0,d0
	rts

xSize:		dc.w	0
ySize:		dc.w	0
MaxLow:		dc.w	285		; Screenin suurin koko
RouNow:		dc.l	0		; Osoite näyttö rutiiniin
CopNow:		dc.l	0		; Copperi
CopListNow:	dc.l	0		; BSS hunkin coplista area
BitmapNow:	dc.l	0		; Bitmapit
KuvaData:	dc.l	0		; Osoite DHAMV2:sen kuvadatoihin
SegMent:	dc.l	0		; Osoite filen 1. segmenttiin
OldLock:	dc.l	0
FileLock:	dc.l	0
OutHandle:	dc.l	0
InHandle:	dc.l	0
ComData:	dc.l	0		; Commandlinen optionit
FirstName:	dc.l	0		; Osoite commandlinen nimeen
ComSave:	blk.l	2,0
DosBase:	dc.l	0
GfxBase:	dc.l	0
DosName:	dc.b	'dos.library',0
GfxName:	dc.b	'graphics.library',0
HelpText:	incbin	'DSdata/HelpText2'
HelpText.E:
First:		dc.b	'Showing '
First.E:
Colon:		dc.b	'	-->	'
Colon.E:
NoDHAMPic:	dc.b	'Not DHAM V1 or V2 picture.',$a
NoDHAMPic.E:
DHAMPic:	dc.b	'SIZE: '
DHAMPic.E:
DHAM1:		dc.b	'(DHAM V1)',$a
DHAM1.E:
DHAM2:		dc.b	'(DHAM V2)',$a
DHAM2.E:
		EVEN

	SECTION DShow2,BSS
FBlock:		ds.b	260		; FileInfoBlock
AsciiBuf:	ds.b	16
SizeText:	ds.b	32
	SECTION	DShow,code

; --> Lataus etc. rutiinit

ComLine:	; Katso löytyykö optioneja
	; INPUT	A0.L: Missä commandline (päättyy nollaan)
	;	D0.L: Monta merkkiä commandlinessä
	; OUPUT	D0.L: 0 = Näytä helppi
	;	      1 = FileName on
	;	      2 = Ei filechekkiä
	;	      4 = Lace (Ei valmis)
	;	      6 = NoLace (Ei valmis)
	;	A0.L: Osoite Pathin/Nimen alkuun
	movem.l	d2-d7/a1-a6,-(sp)
	lea	0(a0,d0.l),a1		; Linen loppuun
	tst.b	(a0)
	beq.s	Nothing

	subq.l	#1,d0
Loop01:
	cmp.b	#20,-(a1)
	beq.s	FirstFound
	dbf	d0,Loop01
	subq.l	#1,a1
FirstFound:
	move.l	a1,a0
	addq.l	#1,a0
	movem.l	(sp)+,d2-d7/a1-a6
	moveq	#%00001,d0
	rts
Nothing:
	movem.l	(sp)+,d2-d7/a1-a6
	moveq	#%00000,d0
	rts

CheckFile:	; Katso onko file DHAMia (jos on niin initoi datat)
	; INPUT	A0.L: Osoite ensimmäiseen segmenttiin
	; OUPUT	D0.L: 0 = Ei ole DHAM kuva
	;	      1 = DHAMV1 (FULL HEADER)
	;	      2 = DHAMV2 (SHORT HEADER)
	movem.l	d1-d7/a1-a6,-(sp)
	lea	-4(a0),a2		; Next segment
	cmp.l	#'DHAM',4(a0)		; Onko DHAMV2 File
	bne.w	CheckV1
	cmp.w	#'V2',8(a0)
	bne.w	CheckV1
	lea	18(a0),a1
	PUT.L	a1,KuvaData
	move.l	a1,a3
	cmp.w	#$6a00,48(a1)
	beq.w	NoLace3
NoLace3:
	PUT.W	-2(a1),ySize
	move.w	8(a1),d0
	mulu	#8,d0
	PUT.W	d0,xSize
	move.l	(a2),a2
	add.l	a2,a2
	add.l	a2,a2
	lea	4(a2),a1
	PUT.L	a1,CopNow		; Copperit
	move.l	(a2),a2
	add.l	a2,a2
	add.l	a2,a2
	lea	4(a2),a1
	PUT.L	a1,BitmapNow		; Bitmapit
	move.l	(a2),a2
	add.l	a2,a2
	add.l	a2,a2
	lea	4(a2),a1
	PUT.L	a1,CopListNow
; --> Initoi mahdollinen ruudun ulkopuolinen data
	move.l	a3,a1
	PUT.W	-4(a1),SSize3		; Ruudun x-koko
	PUT.W	-4(a1),SSize4
	cmp.w	#$6a00,48(a1)
	bne.s	LaceDo
	move.w	ySize(pc),d0
	sub.w	MaxLow(pc),d0
	tst.w	d0
	bpl.s	MoveRou1
	moveq	#0,d0
	move.w	-4(a1),d1
	move.w	8(a1),d2
	cmp.w	d1,d2
	bhi.s	MoveRou1
	PUT.L	#Routine1,RouNow
	bra.s	OkDok
MoveRou1:
	PUT.W	d0,OutLine
	PUT.L	#Routine3,RouNow
	bra.s	OkDok
LaceDo:	; Lacen kanssa
	move.w	ySize(pc),d0
	move.w	MaxLow(pc),d1
	add.w	d1,d1
	sub.w	d1,d0
	tst.w	d0
	bpl.s	MoveRou2
	moveq	#0,d0
	move.w	-4(a1),d1
	move.w	8(a1),d2
	cmp.w	d1,d2
	bhi.s	MoveRou2
	PUT.L	#Routine2,RouNow
	bra.s	OkDok
MoveRou2:
	PUT.W	d0,OutLine2
	PUT.L	#Routine4,RouNow
OkDok:
	movem.l	(sp)+,d1-d7/a1-a6
	moveq	#2,d0
	rts
CheckV1:
	move.l	-8(a0),d0
	subq.l	#6,d0
	cmp.l	#4096,d0
	bhi.w	NoDHAM
Loop02:
	cmp.b	#'D',(a0)+
	dbeq	d0,Loop02
	tst.w	d0
	bmi.w	NoDHAM
	cmp.b	#'H',(a0)
	bne.s	Loop02
	cmp.b	#'A',1(a0)
	bne.s	Loop02
	cmp.b	#'M',2(a0)
	bne.s	Loop02
	cmp.b	#'V',3(a0)
	bne.s	Loop02
	cmp.b	#'1',4(a0)
	bne.s	Loop02
	addq.w	#8,a0			; Lea (pc) käsky
	move.w	a0,d0
	btst	#0,d0			; Pariton kielletty
	bne.s	NoDHAM
	cmp.w	#$47fa,-2(a0)		; Onko Lea?
	bne.s	NoDHAM
	add.w	(a0),a0			; Missä datatable
	move.w	a0,d0
	btst	#0,d0			; Pariton kielletty
	bne.s	NoDHAM
	move.l	a0,a1
	move.l	4(a1),d0		; Vanha vai uusi DHAMV1
	and.l	#$00ffffff,d0
	cmp.l	#$00e1fffe,d0
	beq.s	NewDHAMV1
	move.w	2(a1),d0
	addq.w	#1,d0
	cmp.w	#$6a00,52(a1)
	beq.s	NoLace
	add.w	d0,d0
NoLace:
	add.w	(a1),d0
	PUT.W	d0,ySize
	move.w	12(a1),d0
	mulu	#8,d0
	PUT.W	d0,xSize
	bra.s	SameGO
NewDHAMV1:
	move.w	2(a1),d0
	addq.w	#1,d0
	cmp.w	#$6a00,48(a1)
	beq.s	NoLace2
	add.w	d0,d0
NoLace2:
	add.w	(a1),d0
	PUT.W	d0,ySize
	move.w	8(a1),d0
	mulu	#8,d0
	PUT.W	d0,xSize
SameGo:
	movem.l	(sp)+,d1-d7/a1-a6
	moveq	#1,d0
	rts
NoDHAM:
	movem.l	(sp)+,d1-d7/a1-a6
	moveq	#0,d0
	rts

PrintSize:
	move.w	xSize(pc),d0
	ext.l	d0
	lea	SizeText,a0
	move.l	a0,a1
	bsr.w	DoAscii
	lea	0(a1,d0.w),a0
	move.b	#' ',(a0)+
	move.b	#'x',(a0)+
	move.b	#' ',(a0)+
	move.l	a0,a1
	move.w	ySize(pc),d0
	ext.l	d0
	bsr.s	DoAscii
	lea	0(a1,d0.w),a0
	move.b	#' ',(a0)+
	sub.l	#SizeText,a0		; Tekstin pituus

	move.l	OutHandle(pc),d1	; Printtaa size
	ADRL	SizeText,d2
	move.l	a0,d3
	LIBC	Write
	rts

; --> Rutiinit

MyAllocR:	; Oma muistin varaus rutiini rutiini
	; INPUT	 D0.L: Size
	;	 D1.L: Ehdot
	; OUTPUT D0.L: 0=Error, muuten osoite muistiin
	movem.l	d2/a0-a1/a6,-(sp)
	addq.l	#4,d0			; Size +4
	move.l	d0,d2
	EXEC2	AllocMem
	tst.l	d0
	beq.s	MemError
	move.l	d0,a0
	move.l	d2,(a0)			; Talleta Koko
	addq.l	#4,d0			; Käyttäjän muisti
MemError:	
	movem.l	(sp)+,d2/a0-a1/a6
	rts

MyFreeR:	; Oma muistin vapautus rutiini rutiini
	; INPUT	 A1.L: Osoite Varatun tilan alkuun
	movem.l	d1/a0/a6,-(sp)
	move.l	-(a1),d0		; Paljon varattu
	EXEC2	FreeMem
	movem.l	(sp)+,d1/a0/a6
	rts

CLSFreeR:	; Oma muistin vapautus rutiini
	; INPUT	 A0.L: Osoite Muistipaikkaan jossa osoite vapautettavaan
	;	       muistipaikkaan. Jos 0 niin ei vapautusta.
	;	       Nollaa muistipaikan samalla.
	movem.l	d0-d1/a1/a6,-(Sp)
	tst.l	(a0)
	beq.s	AlreadyFree
	move.l	(a0),a1			; Mistä vapautetaan
	clr.l	(a0)			; Nollaa muistipaikka
	move.l	-(a1),d0		; Paljon varattu
	EXEC2	FreeMem
AlReadyFree:
	movem.l	(sp)+,d0-d1/a1/a6
	rts

DoAscii:	; Tee numerosta Ascii
	; INPUT	 D0.L: Numero
	;	 A0.L: Osoite mihin ascii muoto laitetaan
	; OUTPUT D0.W: Monta numeroa Ascii-Muodossa
	movem.l	d1-d3/a1-a2,-(sp)
	lea	AsciiBuf,a1		; Jaa luku desimaaleiksi
	lea	Ascii(pc),a2

	moveq	#10-1,d3
MathLoop:
	move.l	(a2)+,d1
	moveq	#0,d2
Ok1:
	cmp.l	d0,d1
	bhi.s	GetIt1
	sub.l	d1,d0
	addq.w	#1,d2
	bra.s	Ok1
GetIt1:
	move.b	d2,(a1)+
	dbf	d3,MathLoop

	lea	AsciiBuf,a1		; Missä AsciiBuf
	moveq	#1,d0			; Monta numeroa tulee...
	moveq	#10-1,d1
Loop91:
	move.b	(a1)+,d2		; Onko nollaa alussa
	beq.s	ZeroBegin
	bra.s	RealNum2
ZeroBegin:
	dbf	d1,Loop91
	move.b	#$30,(a0)+
	bra.s	RealEnd
RealNum:
	addq.w	#1,d0
	move.b	(a1)+,d2
RealNum2:
	add.b	#$30,d2
	move.b	d2,(a0)+
	dbf	d1,RealNum
RealEnd:
	movem.l	(sp)+,d1-d3/a1-a2
	rts

Ascii:		dc.l	1000000000,100000000,10000000,1000000,100000
		dc.l	10000,1000,100,10,1

; --> Kuvien näyttö rutiinit

Routine1:	; ShowRutiini (Ilman interlacea)
	; INPUT	A4: Osoite Bitmappeihin
	;	A5: Osoite Copperiin
	;	A6: GfxBase
	;	A2: Minne coplista
	move.l	a2,d6
	lea	14(a3),a1
	moveq	#10-1,d0
Loop201:
	move.l	(a1)+,(a2)+		; CopperKäskyjä
	dbf	d0,Loop201
	moveq	#6-1,d0			; BitMapit
Loop202:
	move.l	a4,d1
	move.w	(a1)+,(a2)+		; Low
	move.w	d1,(a2)+
	move.w	(a1)+,(a2)+		; Hi
	swap	d1
	move.w	d1,(a2)+
	add.w	8(a3),a4
	dbf	d0,Loop202

	move.w	2(a3),d0		; Monta riviä
	move.l	4(a3),d1		; CopWait
Loop203:
	move.l	d1,(a2)+		; WaitMeOhMightyGod
	move.w	#$0182,d2
	move.w	d2,(a2)+
	move.b	(a5)+,(a2)+		; Col1
	move.b	(a5)+,(a2)+
	moveq	#7-1,d3
Loop204:
	addq.w	#2,d2
	move.w	d2,(a2)
	addq.w	#2,d2
	move.w	d2,4(a2)
	move.b	(a5)+,3(a2)		; LowBit A
	move.b	(a5)+,7(a2)		; LowBit B
	move.b	(a5)+,d4		; HiBits
	move.b	d4,d5
	lsr.b	#4,d4
	move.b	d4,2(a2)		; HiBit A
	and.b	#$0f,d5
	move.b	d5,6(a2)		; HiBit B
	addq.w	#8,a2
	dbf	d3,Loop204
	add.l	#$01000000,d1		; NextCopLine
	dbf	d0,Loop203
	move.l	#$ffffFFFE,(a2)+	; TerminateCopList

	lea	$dff000,a2
	move.l	d6,$80(a2)
	move.w	#0,$88(a2)
WaitRight:
	move.w	#$0020,$96(a2)
	move.l	#0,$144(a2)
	LIBC	WaitTOF
	btst	#10,$16(a2)
	bne.s	WaitRight
; --> Copper Takaisin
	move.l	38(a6),$80(a2)		; Vanha Copper
	move.w	#0,$88(a2)
	move.w	#$8020,$96(a2)
	rts

Routine2:	; ShowRutiini (Interlace)
	; INPUT	A4: Osoite Bitmappeihin
	;	A5: Osoite Copperiin
	;	A6: GfxBase
	;	A2: Minne coplista
	move.l	a2,d6
	bsr.W	CopHeader
	move.w	2(a3),d0		; Monta riviä
	bsr.W	ColorDo
	lea	12(a2),a0
	move.l	a0,d0
	bsr.W	DoCopJmp		; +EndDo

	tst.w	(a3)
	beq.s	NoDiwChange
	sub.w	#$0100,20(a3)		; DiwYstop pienemmäksi
NoDiwChange:
	move.w	8(a3),d0
	mulu	#6,d0
	add.w	d0,a4			; BitMap Next
	bsr.W	CopHeader
	add.w	#23,a5			; Copper Next
	move.w	2(a3),d0
	sub.w	(a3),d0			; Vähennä jos odd-frame
	bsr.W	ColorDo
	move.l	d6,d0
	bsr.b	DoCopJmp		; +EndDo

	lea	$dff000,a2		; Odota Oikeaa Framea
	move.w	#$0180,$96(a2)
	move.l	d6,$80(a2)
	move.w	#0,$88(a2)
	bclr	#7,$2a(a2)
ShortFrame_2:
	move.l	$04(a2),d0
	and.l	#$1ff00,d0
	cmpi.l	#$13700,d0
	bne.b	ShortFrame_2
	move.w	#$8180,$96(a2)

WaitRightx:
	move.w	#$0020,$96(a2)
	move.l	#0,$144(a2)
	LIBC	WaitTOF
	btst	#10,$16(a2)
	bne.s	WaitRightx
; --> Copper Takaisin
	move.l	38(a6),$80(a2)		; Vanha Copper
	move.w	#0,$88(a2)
	move.w	#$8020,$96(a2)
ShortMem_2:
	rts

DoCopJmp:	; Tee CopperJumppi Copperlistaan
	; INPUT: D0.L: HyppyOsoite
	move.w	(a1)+,(a2)+		; CopJmp
	move.w	d0,(a2)+		; Lo
	move.w	(a1)+,(a2)+
	swap	d0
	move.w	d0,(a2)+		; Hi
	move.l	#$ffffFFFE,(a2)+
	rts

CopHeader:	; Copperin StandardiOsa
	; INPUT	A4.L: Missä ensimmäinen bitmappi
	lea	14(a3),a1
	moveq	#10-1,d0
Loop201x:
	move.l	(a1)+,(a2)+		; CopperKäskyjä
	dbf	d0,Loop201x
	move.l	a4,a0
	moveq	#6-1,d0			; BitMapit
Loop202x:
	move.l	a0,d1
	move.w	(a1)+,(a2)+
	move.w	d1,(a2)+		; Lo
	move.w	(a1)+,(a2)+
	swap	d1
	move.w	d1,(a2)+		; Hi
	add.w	8(a3),a0
	dbf	d0,Loop202x
	rts

ColorDo:	; Värit Copperiin
	; INPUT	D0.W: Monta copper riviä
	;	A5.L: Ensimmäinen copperrivi
	move.l	a5,a0
	move.l	4(a3),d1		; CopWait
Loop211:
	move.l	d1,(a2)+		; WaitMeOhMightyGod
	move.w	#$0182,d2
	move.w	d2,(a2)+
	move.b	(a0)+,(a2)+		; Col1
	move.b	(a0)+,(a2)+		; Col1
	moveq	#7-1,d3
Loop210:
	addq.w	#2,d2
	move.w	d2,(a2)
	addq.w	#2,d2
	move.w	d2,4(a2)
	move.b	(a0)+,3(a2)		; LowBit A
	move.b	(a0)+,7(a2)		; LowBit B
	move.b	(a0)+,d4		; HiBits
	move.b	d4,d5
	lsr.b	#4,d4
	move.b	d4,2(a2)		; HiBit A
	and.b	#$0f,d5
	move.b	d5,6(a2)		; HiBit B
	addq.w	#8,a2
	dbf	d3,Loop210
	add.l	#$01000000,d1		; NextCopLine
	add.w	#23,a0			; Väriline
	dbf	d0,Loop211
	rts

Routine3:	; ShowRutiini+MouseControlilla (Ilman interlacea)
	; INPUT	A4: Osoite Bitmappeihin
	;	A5: Osoite Copperiin
	;	a6: GfxBase
	;	A2: Minne coplista
	move.l	a2,d6
	lea	14(a3),a1
	moveq	#10-1,d0
Loop209:
	move.l	(a1)+,(a2)+		; CopperKäskyjä
	dbf	d0,Loop209
	moveq	#6-1,d0			; BitMapit
Loop220:
	move.l	a4,d1
	move.w	(a1)+,(a2)+		; Low
	move.w	d1,(a2)+
	move.w	(a1)+,(a2)+		; Hi
	swap	d1
	move.w	d1,(a2)+
	add.w	8(a3),a4
	dbf	d0,Loop220

	move.w	2(a3),d0		; Monta riviä
	move.l	4(a3),d1		; CopWait
	move.l	a5,a0
Loop231:
	move.l	d1,(a2)+		; WaitMeOhMightyGod
	move.w	#$0182,d2
	move.w	d2,(a2)+
	move.b	(a0)+,(a2)+		; Col1
	move.b	(a0)+,(a2)+
	moveq	#7-1,d3
Loop232:
	addq.w	#2,d2
	move.w	d2,(a2)
	addq.w	#2,d2
	move.w	d2,4(a2)
	move.b	(a0)+,3(a2)		; LowBit A
	move.b	(a0)+,7(a2)		; LowBit B
	move.b	(a0)+,d4		; HiBits
	move.b	d4,d5
	lsr.b	#4,d4
	move.b	d4,2(a2)		; HiBit A
	and.b	#$0f,d5
	move.b	d5,6(a2)		; HiBit B
	addq.w	#8,a2
	dbf	d3,Loop232
	add.l	#$01000000,d1		; NextCopLine
	dbf	d0,Loop231
	move.l	#$ffffFFFE,(a2)+	; TerminateCopList

	lea	$dff000,a2
	move.l	d6,$80(a2)
	move.w	#0,$88(a2)

	PUT.W	$dff00a,Counts
MouseLoop2:
	move.w	#$0020,$96(a2)
	move.l	#0,$144(a2)
	LIBC	WaitTOF
	moveq	#0,d0
	moveq	#0,d1
	moveq	#0,d2
	moveq	#0,d3
	lea	Counts(pc),a0
	move.b	$a(a2),d0	; Vert
	move.b	(a0),d2
	sub.b	d0,d2
	ext.w	d2
	move.b	d0,(a0)
	move.b	$b(a2),d0	; Hor
	move.b	1(a0),d3
	sub.b	d0,d3
	ext.w	d3
	move.b	d0,1(a0)
				; OUPUT	D2.W: y-muutos
				;	D3.W: x-muutos
; --> y-muutos
	move.w	d3,-(sp)

	move.w	OutLine(pc),d1		; Monta riviä ulkona
	lea	DifNow(pc),a0
	tst.w	d2
	beq.w	XMake2
	neg.w	d2
	move.w	(a0),d0
	add.w	d2,d0
	bpl.s	MoveDirect3
	move.w	(a0),d0
	neg.w	d0
	clr.w	(a0)
	bra.s	DoMove3
MoveDirect3:
	cmp.w	d1,d0
	bls.s	CalcMove3
	move.w	d1,d0
	sub.w	(a0),d0
	move.w	d1,(a0)
	bra.s	DoMove3
CalcMove3:
	move.w	d0,(a0)
	move.w	d2,d0
DoMove3:
	muls	#6,d0
	muls	8(a3),d0
	move.l	d6,a0
	add.w	#42,a0
	moveq	#6-1,d1
Loop722:
	move.w	4(a0),d2
	swap	d2
	move.w	(a0),d2
	add.l	d0,d2
	move.w	d2,(a0)
	swap	d2
	move.w	d2,4(a0)
	addq.w	#8,a0
	dbf	d1,Loop722
; --> Tee copperi [NOLACE]
	move.l	d6,a0
	add.w	#94,a0			; First väridefinaation
	move.l	a5,a1
	move.w	DifNow(pc),d0
	mulu	#23,d0
	add.w	d0,a1
	move.w	2(a3),d0
	moveq	#$0f,d1
Loop734:
	move.b	(a1)+,(a0)+		; Col1
	move.b	(a1)+,(a0)+
	addq.w	#2,a0
	moveq	#7-1,d3
Loop735:
	move.b	(a1)+,1(a0)		; LowBit A
	move.b	(a1)+,5(a0)		; LowBit B
	move.b	(a1)+,d4		; HiBits
	move.b	d4,d5
	lsr.b	#4,d4
	move.b	d4,(a0)			; HiBit A
	and.b	d1,d5
	move.b	d5,4(a0)		; HiBit B
	addq.w	#8,a0
	dbf	d3,Loop735
	addq.w	#4,a0
	dbf	d0,Loop734
; --> x-muutos
XMake2:
	move.w	(sp)+,d3
	tst.w	d3
	beq.b	NoPicMove2
	neg.w	d3
	ext.l	d3
	divs	#4,d3
	asl.w	#1,d3			; *2
	lea	DifNow2(pc),a0
	move.w	(a0),d0
	add.w	d3,d0
	bpl.s	MoveDirect4
	move.w	(a0),d0
	neg.w	d0
	clr.w	(a0)
	bra.s	DoMove4
MoveDirect4:
	move.w	8(a3),d1
	sub.w	SSize3(pc),d1			; Liikkumisvara
	cmp.w	d1,d0
	bls.s	CalcMove4
	move.w	d1,d0
	sub.w	(a0),d0
	move.w	d1,(a0)
	bra.s	DoMove4
CalcMove4:
	move.w	d0,(a0)
	move.w	d3,d0
DoMove4:
	ext.l	d0
	move.l	d6,a0
	add.w	#42,a0
	moveq	#6-1,d1
Loop741:
	move.w	4(a0),d2
	swap	d2
	move.w	(a0),d2
	add.l	d0,d2
	move.w	d2,(a0)
	swap	d2
	move.w	d2,4(a0)
	addq.w	#8,a0
	dbf	d1,Loop741

NoPicMove2:
	btst	#10,$dff016
	bne.w	MouseLoop2

; --> Copper Takaisin
	move.l	38(a6),$80(a2)		; Vanha Copper
	move.w	#0,$88(a2)
	move.w	#$8020,$96(a2)
ShortMem3:
	rts
Counts:		dc.w	0
OutLine:	dc.w	0		; Monta riviä ei näy (INITOI)
DifNow:		dc.w	0		; Missä kuva on juuri nyt (y)
DifNow2:	dc.w	0		; x
SSize3:		dc.w	0

Routine4:	; ShowRutiini+MouseControlilla (INTERLACE)
	; INPUT	A4: Osoite Bitmappeihin
	;	A5: Osoite Copperiin
	;	a6: GfxBase
	;	A2: Minne coplista
	move.l	a2,d6
	bsr.W	CopHeader2
	move.w	2(a3),d0		; Monta riviä
	bsr.W	ColorDo2
	lea	12(a2),a0
	move.l	a0,d0
	bsr.W	DoCopJmp2		; +EndDo

	PUT.L	a2,CList2
	move.w	8(a3),d0
	mulu	#6,d0
	add.w	d0,a4			; BitMap Next
	bsr.W	CopHeader2
	add.w	#23,a5			; Copper Next
	move.w	2(a3),d0
	bsr.W	ColorDo2
	move.l	d6,d0
	bsr.w	DoCopJmp2		; +EndDo

	lea	$dff000,a2		; Odota Oikeaa Framea
	move.w	#$0180,$96(a2)
	move.l	d6,$80(a2)
	move.w	#0,$88(a2)
	bclr	#7,$2a(a2)
ShortFrame_4:
	move.l	$04(a2),d0
	and.l	#$1ff00,d0
	cmpi.l	#$13700,d0
	bne.b	ShortFrame_4
	move.w	#$8180,$96(a2)

	PUT.W	$dff00a,Counts2
MouseLoop4:
	LIBC	WaitTOF
	move.w	#$0020,$96(a2)
	move.l	#0,$144(a2)
	moveq	#0,d0
	moveq	#0,d1
	moveq	#0,d2
	moveq	#0,d3
	lea	Counts2(pc),a0
	move.b	$a(a2),d0	; Vert
	move.b	(a0),d2
	sub.b	d0,d2
	ext.w	d2
	move.b	d0,(a0)
	move.b	$b(a2),d0	; Hor
	move.b	1(a0),d3
	sub.b	d0,d3
	ext.w	d3
	move.b	d0,1(a0)
				; OUPUT	D2.W: y-muutos
				;	D3.W: x-muutos
; --> y-muutos
	move.w	d3,-(sp)

	move.w	OutLine2(pc),d1		; Monta riviä ulkona
	lea	DifNow3(pc),a0
	tst.w	d2
	beq.w	XMake4
	neg.w	d2
	move.w	(a0),d0
	add.w	d2,d0
	bpl.s	MoveDirect5
	move.w	(a0),d0
	neg.w	d0
	clr.w	(a0)
	bra.s	DoMove5
MoveDirect5:
	cmp.w	d1,d0
	bls.b	CalcMove5
	move.w	d1,d0
	sub.w	(a0),d0
	move.w	d1,(a0)
	bra.s	DoMove5
CalcMove5:
	move.w	d0,(a0)
	move.w	d2,d0
DoMove5:
	muls	#6,d0
	muls	8(a3),d0
	move.l	d6,a0
	add.w	#42,a0
	move.l	Clist2(pc),a1
	add.w	#42,a1
	moveq	#[6*2]-1,d1
Loop762:
	move.w	4(a0),d2
	swap	d2
	move.w	(a0),d2
	add.l	d0,d2
	move.w	d2,(a0)
	swap	d2
	move.w	d2,4(a0)
	addq.w	#8,a0
	exg	a0,a1
	dbf	d1,Loop762
; --> Tee copperi [LACE]
	move.l	d6,a0
	add.w	#94,a0			; First väridefinaation
	move.l	Clist2(pc),a4
	add.w	#94,a4
	move.l	a5,a1
	sub.w	#23,a1
	move.w	DifNow3(pc),d0
	mulu	#23,d0
	add.w	d0,a1
	move.w	2(a3),d0
	add.w	d0,d0
	moveq	#$0f,d1
Loop764:
	move.b	(a1)+,(a0)+		; Col1
	move.b	(a1)+,(a0)+
	addq.w	#2,a0
	moveq	#7-1,d3
Loop765:
	move.b	(a1)+,1(a0)		; LowBit A
	move.b	(a1)+,5(a0)		; LowBit B
	move.b	(a1)+,d4		; HiBits
	move.b	d4,d5
	lsr.b	#4,d4
	move.b	d4,(a0)			; HiBit A
	and.b	d1,d5
	move.b	d5,4(a0)		; HiBit B
	addq.w	#8,a0
	dbf	d3,Loop765
	addq.w	#4,a0
	exg	a0,a4
	dbf	d0,Loop764
; --> x-muutos
XMake4:
	move.w	(sp)+,d3
	tst.w	d3
	beq.b	NoPicMove4
	neg.w	d3
	ext.l	d3
	divs	#4,d3
	asl.w	#1,d3			; *2
	lea	DifNow4(pc),a0
	move.w	(a0),d0
	add.w	d3,d0
	bpl.b	MoveDirect6
	move.w	(a0),d0
	neg.w	d0
	clr.w	(a0)
	bra.s	DoMove6
MoveDirect6:
	move.w	8(a3),d1
	sub.w	SSize4(pc),d1			; Liikkumisvara
	cmp.w	d1,d0
	bls.s	CalcMove6
	move.w	d1,d0
	sub.w	(a0),d0
	move.w	d1,(a0)
	bra.s	DoMove6
CalcMove6:
	move.w	d0,(a0)
	move.w	d3,d0
DoMove6:
	ext.l	d0
	move.l	d6,a0
	add.w	#42,a0
	move.l	Clist2(pc),a1
	add.w	#42,a1
	moveq	#[6*2]-1,d1
Loop771:
	move.w	4(a0),d2
	swap	d2
	move.w	(a0),d2
	add.l	d0,d2
	move.w	d2,(a0)
	swap	d2
	move.w	d2,4(a0)
	addq.w	#8,a0
	exg	a0,a1
	dbf	d1,Loop771

NoPicMove4:
	btst	#10,$16(a2)
	bne.w	MouseLoop4

; --> Copper Takaisin
	move.l	38(a6),$80(a2)		; Vanha Copper
	move.w	#0,$88(a2)
	move.w	#$8020,$96(a2)
ShortMem_4:
	rts

DoCopJmp2:	; Tee CopperJumppi Copperlistaan
	; INPUT: D0.L: HyppyOsoite
	move.w	(a1)+,(a2)+		; CopJmp
	move.w	d0,(a2)+		; Lo
	move.w	(a1)+,(a2)+
	swap	d0
	move.w	d0,(a2)+		; Hi
	move.l	#$ffffFFFE,(a2)+
	rts

CopHeader2:	; Copperin StandardiOsa
	; INPUT	A4.L: Missä ensimmäinen bitmappi
	lea	14(a3),a1
	moveq	#10-1,d0
Loop211x:
	move.l	(a1)+,(a2)+		; CopperKäskyjä
	dbf	d0,Loop211x
	move.l	a4,a0
	moveq	#6-1,d0			; BitMapit
Loop212x:
	move.l	a0,d1
	move.w	(a1)+,(a2)+
	move.w	d1,(a2)+		; Lo
	move.w	(a1)+,(a2)+
	swap	d1
	move.w	d1,(a2)+		; Hi
	add.w	8(a3),a0
	dbf	d0,Loop212x
	rts

ColorDo2:	; Värit Copperiin
	; INPUT	D0.W: Monta copper riviä
	;	A5.L: Ensimmäinen copperrivi
	move.l	a5,a0
	move.l	4(a3),d1		; CopWait
Loop261:
	move.l	d1,(a2)+		; WaitMeOhMightyGod
	move.w	#$0182,d2
	move.w	d2,(a2)+
	move.b	(a0)+,(a2)+		; Col1
	move.b	(a0)+,(a2)+		; Col1
	moveq	#7-1,d3
Loop250:
	addq.w	#2,d2
	move.w	d2,(a2)
	addq.w	#2,d2
	move.w	d2,4(a2)
	move.b	(a0)+,3(a2)		; LowBit A
	move.b	(a0)+,7(a2)		; LowBit B
	move.b	(a0)+,d4		; HiBits
	move.b	d4,d5
	lsr.b	#4,d4
	move.b	d4,2(a2)		; HiBit A
	and.b	#$0f,d5
	move.b	d5,6(a2)		; HiBit B
	addq.w	#8,a2
	dbf	d3,Loop250
	add.l	#$01000000,d1		; NextCopLine
	add.w	#23,a0			; Väriline
	dbf	d0,Loop261
	rts
Clist2:		dc.l	0
Counts2:	dc.w	0
OutLine2:	dc.w	0		; INITOI!
DifNow3:	dc.w	0
DifNow4:	dc.w	0
SSize4:		dc.w	0
