
	include 'exec/execbase.i'
	include 'libraries/reqtools.i'
	include 'lvo/dos_lib.i'
	include 'lvo/exec_lib.i'
	include 'lvo/reqtools_lib.i'

Test	=	0	; 0 - off ; 1 - on

DosBase		=	0*4
ReqBase		=	1*4
FileReqL	=	2*4
FileHandles	=	3*4
ReadedBytes	=	4*4

	Section Main_Code,Code

	include	'dh1:sources/sources/easystart.i'

OpenIt
	lea	Variables(pc),a5

;open dos.library

	moveq	#0,d0
	lea	DosName(pc),a1
	move.l	4.w,a6
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,DosBase(a5)
	beq.b	ErrorOpenDos

;open reqtools.library

	moveq	#38,d0		;version 38
	lea	ReqName(pc),a1
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,ReqBase(a5)
	beq.b	ErrorOpenReq

;przydzielenie struktury dla file requesterow

	moveq	#0,d0
	sub.l	a0,a0
	move.l	ReqBase(a5),a6
	jsr	_LVOrtAllocRequestA(a6)
	move.l	d0,FileReqL(a5)
	beq.b	ErrorAllocReqL

	bsr.b	Main

	move.l	FileReqL(a5),a1
	move.l	ReqBase(a5),a6
	jsr	_LVOrtFreeRequest(a6)
ErrorAllocReqL
	move.l	ReqBase(a5),a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
ErrorOpenReq
	move.l	DosBase(a5),a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
ErrorOpenDos
	moveq	#0,d0
	rts

**************************************************************************

Main
	lea	About(pc),a1
	moveq	#0,D0
	bsr.w	Request

	lea	FileReqNameLoad(pc),a3
	bsr.w	ChooseFile
	tst.l	d0
	beq	Quit

	bsr.w	LoadFile
	tst.l	d0
	beq	Quit

	lea	WhichD3(pc),a1
	moveq	#1,D0
	bsr.w	Request
	move.w	D0,ValueD3
	beq.b	.zero
	move.w	#$100F,ValueD3
.zero
	lea	WhatSYNCUsed(pc),a1
	moveq	#-1,D0
	bsr.w	Request
	move.w	D0,OriginalSYNC
	beq.b	.original

	lea	InsertAnyDOSDisk(pc),a1
	moveq	#0,D0
	bsr.w	Request
	bra.b	.go
.original
	lea	InsertOriginalDisk(pc),a1
	moveq	#0,D0
	bsr.w	Request
.go
	bsr.w	Decode
	lea	Variables(pc),a5
	tst.l	d0
	beq.b	wrong

	lea	FileReqNameSave(pc),a3
	bsr.b	ChooseFile
	tst.l	d0
	beq.b	Quit

	move.l	#SaveBufor,d7
	move.l	DestDecode,d0
	sub.l	d7,d0
	move.l	ReadedBytes(a5),d6
	sub.l	d0,d6
	move.l	d0,ReadedBytes(a5)
	bsr.w	SaveFile
	tst.l	d0
	beq.b	Quit

	tst.w	Again
	beq.b	.skip

	lea	FileReqNameSave(pc),a3
	bsr.b	ChooseFile
	tst.l	d0
	beq.b	Quit

	move.l	#Bufor,d7
	add.l	ReadedBytes(a5),d7
	move.l	d6,ReadedBytes(a5)
	bsr.w	SaveFile
	tst.l	d0
	beq.b	Quit

	bsr.w	DisplayRegs
.skip
	lea	Complete(pc),a1
	moveq	#0,D0
	bsr.w	Request

	bra.b	Quit
wrong
	lea	WrongStack(pc),a1
	moveq	#0,D0
	bsr.w	Request
Quit
	rts

**************************************************************************

ChooseFile
	lea	TagsLoad(pc),a0
	move.l	FileReqL(a5),a1
	lea	FileNameL,a2
	move.l	ReqBase(a5),a6
	jsr	_LVOrtFileRequestA(a6)

	tst.l	d0
	beq.b	Cancel

	lea	FileNameL,a0
	lea	FullNameL,a1
	move.l	FileReqL(a5),a2
	move.l	$10(a2),a2
	tst.b	(a2)
	beq.b	_Petla2
_Petla:
	move.b	(a2)+,(a1)+
	bne.b	_Petla
	subq.l	#2,a1
	move.b	(a1)+,d0
	cmp.b	#':',d0
	beq.s	_Petla2
	move.b	#'/',(a1)+
_Petla2:
	move.b	(a0)+,(a1)+
	bne.b	_Petla2
	move.b	#0,(a1)+

	moveq	#1,D0
Cancel
	rts


LoadFile
	lea	FullNameL,a0
	move.l	a0,d1
	move.l	#MODE_OLDFILE,d2
	move.l	DosBase(a5),a6
	jsr	_LVOOpen(a6)
	move.l	d0,FileHandles(a5)
	beq.b	.ErrorOpenFile

	move.l	FileHandles(a5),d1
	move.l	#Bufor,d2
	move.l	#$50000,d3
	move.l	DosBase(a5),a6
	jsr	_LVORead(a6)
	move.l	D0,ReadedBytes(A5)
	beq.b	.ErrorOpenFile

	move.l	FileHandles(a5),d1
	move.l	DosBase(a5),a6
	jsr	_LVOClose(a6)

	moveq	#1,D0
.ErrorOpenFile
	rts

SaveFile
	lea	FullNameL,a0
	move.l	a0,d1
	move.l	#MODE_NEWFILE,d2
	move.l	DosBase(a5),a6
	jsr	_LVOOpen(a6)
	move.l	d0,FileHandles(a5)
	beq.b	.ErrorOpenFile

	move.l	FileHandles(a5),d1
	move.l	d7,d2
	move.l	ReadedBytes(A5),d3
	move.l	DosBase(a5),a6
	jsr	_LVOWrite(a6)
	tst.l	d0
	beq.b	.ErrorOpenFile

	move.l	FileHandles(a5),d1
	move.l	DosBase(a5),a6
	jsr	_LVOClose(a6)

	moveq	#1,D0
.ErrorOpenFile
	rts

***************************************************************************

Request
	lea	RequesterTags(pc),a0
	tst.l	D0
	beq.b	.skip
	bpl.b	.skip3
	lea	RequesterGad2(pc),a2
	bra.b	.skip2
.skip
	lea	RequesterGad(pc),a2
	bra.b	.skip2
.skip3
	lea	RequesterGad3(pc),a2
.skip2
	sub.l	a3,a3
	sub.l	a4,a4
	move.l	ReqBase(a5),a6
	jsr	_LVOrtEZRequestA(a6)

	rts

**************************************************************************

DisplayRegs
;	tst.w	OriginalSYNC
;	bne.b	.skip

	lea	AllRegsText(pc),a1
	lea	Registers6(pc),a4
.go
	lea	RequesterTags(pc),a0
	lea	RequesterGad(pc),a2
	sub.l	a3,a3
	move.l	ReqBase(a5),a6
	jsr	_LVOrtEZRequestA(a6)

	rts
;.skip
;	lea	RegsText(pc),a1
;	lea	Registers6+4(pc),a4
;	bra.b	.go

**************************************************************************

GetVBR
	OPT P=68020
	movec	VBR,d0
	OPT P=68000
	rte
IllegalTrap
	or.w	#$0700,SR
	move.l	$10.w,-(a7)
	rts
TraceTrap
	move.l	$24.w,-(a7)
	rts

Decode
	moveq	#0,D0
	lea	lbC000036(pc),a0
	lea	Bufor,a1
	lea	(a1),a2
	add.l	#$50000,a2
.loop
	cmp.l	A1,A2
	beq	not_found_stack
	cmp.w	#$2F3C,(A1)+
	bne.b	.loop
	subq.l	#2,A1
	moveq	#14,D1
.loop2
	cmp.l	(A0)+,(A1)+
	bne	wrong_stack
	dbf	D1,.loop2

.loop3
	cmp.l	A1,A2
	beq	not_found_lock
	cmp.l	#$21CF0024,(A1)		; used in Indy Heat
	beq.b	.skip
	cmp.w	#$23CF,(A1)+
	bne.b	.loop3
	cmp.l	#$00000024,(A1)
	bne.b	.loop3
	subq.l	#2,A1			; start lock
.skip
	move.l	A1,SourceDecode
	move.l	A1,Jumper
	lea	Bufor,A0
	sub.l	A0,A1
	move.l	A1,D0
	add.l	D0,DestDecode

	lea	GetVBR(pc),a5
	move.l	4.w,a6
	jsr	_LVOSupervisor(a6)
	move.l	d0,a0
	tst.l	d0
	beq.b	.zero

	pea	IllegalTrap(pc)
	move.l	(a7)+,$10(a0)
	pea	TraceTrap(pc)
	move.l	(a7)+,$24(a0)
.zero
	moveq	#0,d0
	moveq	#~(CACRB_EnableI|CACRB_EnableD),d1
	move.l	4.w,a6
	jsr	_LVOCacheControl(a6)
	move.l	d0,-(a7)

	sub.l	A0,A0
	movem.l	(A0),D0-D7/A1-A2
	lea	PageZero,A0
	movem.l	D0-D7/A1-A2,(A0)
	move.l	$60.w,PageZero+$28

	moveq	#0,D0
	moveq	#0,D1
	moveq	#0,D2
	moveq	#0,D3
	move.w	ValueD3,D3
	moveq	#0,D4
	moveq	#0,D5
	moveq	#0,D6
	moveq	#0,D7
	sub.l	A0,A0
	sub.l	A1,A1
	sub.l	A2,A2
	sub.l	A3,A3
	sub.l	A4,A4
	sub.l	A5,A5
	sub.l	A6,A6

	bsr.s	CopyLock

	lea	PageZero,A0
	movem.l	(A0),D0-D7/A1-A2
	sub.l	A0,A0
	movem.l	D0-D7/A1-A2,(A0)
	move.l	PageZero+$28,$60.w

	move.l	(a7)+,d0
	move.l	d0,d1
	move.l	4.w,a6
	jsr	_LVOCacheControl(a6)

	moveq	#1,D0
not_found_lock
wrong_stack
not_found_stack
	rts

CopyLock
	pea	lbC00000C(PC)
	move.l	(SP)+,$10.w
	illegal
lbC00000C:
	movem.l	D0-D7/A0-A7,-(SP)
;	pea	lbC00002E(PC)
;	move.l	(SP)+,$10.w
;	movea.l	SP,A0

;	OPT P=68020

;	movec	CACR,D0
;	move.l	D0,$3C(SP)

	clr.l	$3C(a7)

;	andi.l	#$7FFF7EFE,D0
;	movec	D0,CACR

;	OPT P=68000

lbC00002E:
;	movea.l	A0,SP
	movem.l	lbC000036(PC),D0-D7/A0-A6
	bra.b	skip
lbC000036
	move.l	#$4E730000,-(SP)
	move.l	#$10,-(SP)
	move.l	#$4DDB9,-(SP)
	move.l	#$BD96BDAE,-(SP)
	move.l	#$B386B586,-(SP)
	move.l	#$D046D246,-(SP)
	move.l	#$246A71F,-(SP)
	move.l	#$23C17,-(SP)
	move.l	#$42C6F,-(SP)
	move.l	#$BD96BDAE,-(SP)
skip
	move.l	(A7),StackMem
	move.l	4(A7),StackMem+4

	move.l	#$4E730000,-(SP)

	pea	stack2(pc)
	move.w	#$4EB9,-(A7)

;	move.l	#$10,-(SP)
;	move.l	#$4DDB9,-(SP)		; add.l D6,$10

	move.w	#$4,-(A7)
	move.l	#$BD96BDAE,-(SP)
	move.l	#$B386B586,-(SP)
	move.l	#$D046D246,-(SP)
	move.l	#$246A71F,-(SP)
	move.l	#$23C17,-(SP)
	move.w	#$2C6F,-(A7)

;	move.l	#$42C6F,-(SP)		; eor.l D6,(A6)
;	move.l	#$BD96BDAE,-(SP)	; eor.l D6,4(A6)

	pea	stack(pc)
	move.w	#$4EB9,-(A7)

	move.l	Jumper(pc),-(a7)

	ifne	Test

.m	move.w	$DFF006,$DFF180
	bra.b	.m

	endc

	rts
Jumper
	dc.l	0

; wykonywane podczas zakodowywania instrukcji - stos 1

stack
	movem.l	D0/A5-A6,Regs

	move.l	SourceDecode(pc),A5	; begin address instrukcji wykonanej
	move.l	2+4(A7),A6		; begin address instrukcji do wykonania
	sub.l	A5,A6
	move.l	A6,D0			; instruction length
	move.l	DestDecode(pc),A6
	subq.l	#1,D0
.loop
	move.b	(A5)+,(A6)+
	dbf	D0,.loop
	move.l	A5,SourceDecode
	move.l	A6,DestDecode

	ifne	Test

	sub.l	#SaveBufor,a6
	cmp.l	#$EE0,a6
	blo.b	.skip

.m	move.w	$DFF006,$DFF180
	bra.b	.m
.skip
	endc

	movem.l	Regs(pc),D0/A5-A6

	eor.l	D6,(A6)			; zakodowanie wykonanej instrukcji
	eor.l	D6,4(A6)

	rts

stack1
	movem.l	D0/A5-A6,Regs

	move.l	RegA6(pc),A6
	eor.l	D6,(A6)			; odkodowanie instrukcji
	eor.l	D6,4(A6)

	move.l	SourceDecode(pc),A5	; adres poczatkowy instrukcji wykonanej
	move.l	2+4(A7),A6		; adres poczatkowy instrukcji do wykonania
	sub.l	A5,A6
	move.l	A6,D0			; instruction length
	move.l	DestDecode(pc),A6
	subq.l	#1,D0
.loop
	move.b	(A5)+,(A6)+
	dbf	D0,.loop
	move.l	A5,SourceDecode
	move.l	A6,DestDecode

	move.l	RegA6(pc),A6
	eor.l	D6,(A6)			; zakodowanie wykonanej instrukcji
	eor.l	D6,4(A6)

	movem.l	Regs(pc),D0/A5-A6

	move.w	4(A7),D6
	andi.w	#$A71F,D6

	move.w	#$4EB9,0+$10(A7)		; jsr stack
	pea	stack(pc)
	move.l	(A7)+,2+$10(A7)

	move.w	#$3C17,$A+$10(A7)		; move.w (A7),D6
	move.l	#$0246A71F,$C+$10(A7)		; andi.w #$A71F,D6

	rts

; wykonywane podczas odkodowywania instrukcji - stos 1

stack2

; wykonane podczas wyjscia z copylock'a - stos 3

	cmp.l	#$487A0014,6+$10(A7)		; pea ...(pc) ; stos 3 ; adres powrotu z illegal instruction
	bne	.sk1
	cmp.l	#$23CF0000,(A6)			; move.l A7,$24 ; last instruction in copylock
	bne	.sk1
	cmp.w	#$0024,4(A6)
	bne	.sk1

	ifne	Test

.m	move.w	$DFF006,$DFF180
	bra.b	.m

	endc

	move.l	A0,Regs
	move.l	DestDecode(pc),A0
	move.l	(A6),(A0)+			; copy instruction
	move.w	4(A6),(A0)+			; move.l A7,$24
	move.l	A0,DestDecode
	move.l	Regs(pc),A0

	move.w	#$4EB9,0+$10(A7)		; jsr stack6
	pea	stack6(pc)
	move.l	(A7)+,2+$10(A7)			; instead of eor.l D6,(A6)
						; eor.l D6,4(A6)

	cmp.l	#$4E7B0002,$18+$10(A7)		; movec D0,CACR
	bne.b	.not_cacr

	move.l	#$4E714E71,$18+$10(A7)
.not_cacr
	cmp.l	#$4CDF01FF,$44+$10(A7)		; movem.l (A7)+,D0-D7/A0
	bne.b	.sk_ip2

	move.w	#$4EF9,$44+$10(A7)
	pea	.FixStack(pc)			; for Indy Heat ?
	move.l	(a7)+,$46+$10(A7)

	bra	.sk_end
.FixStack
	move.l	a4,$42(a7)
	movem.l	(a7)+,d0-a6
	addq.w	#4,a7
	and.w	#$7FFF,(a7)
	rte

.sk_ip2
	cmp.l	#$3EBC2700,$4E+$10(A7)		; move.w #$2700,(A7)
	bne.b	.sk_ip

	move.l	#$02577FFF,$4E+$10(A7)		; -> andi.w #$7FFF,(A7) in game RoboCop

.sk_ip
	cmp.l	#$2D7C0000,$40+$10(A7)		; move.l #$500,$C2(A6)
	bne	.sk_end
	cmp.l	#$050000C2,$44+$10(A7)		; return address from game Gods
	bne	.sk_end

	move.l	#$4E714E71,$40+$10(A7)		; normal return address from copylock
	move.l	#$2D4C00C2,$44+$10(A7)		; move.l A4,$C2(A6)

	bra	.sk_end

; wykonane podczas wejscia do proc. odczytu z dysku - stos 1

.sk1
	cmp.l	#$4E714E71,6+$10(A7)		; stos 2
	bne.b	.sk0
	cmp.l	#$23CF0000,(A6)			; move.l A7,$24
	bne.b	.sk0
	cmp.w	#$0024,4(A6)
	bne.b	.sk0

	ifne	Test

.m1	move.w	$DFF006,$DFF180
	bra.b	.m1

	endc

	move.w	#$4EB9,0+$10(A7)		; jsr stack
	pea	stack(pc)
	move.l	(A7)+,2+$10(A7)			; instead of eor.l D6,(A6)
						; eor.l D6,4(A6)

	move.w	#$4EB9,$1E+$10(A7)		; jsr stack4
	pea	stack4(pc)
	move.l	(A7)+,$20+$10(A7)		; instead of add.l $8,D0

	move.w	#$4EB9,$36+$10(A7)		; jsr stack5
	pea	stack5(pc)
	move.l	(A7)+,$38+$10(A7)		; instead of add.l $8,D0

	move.l	A6,SourceCounter
	addq.l	#6,SourceCounter		; 6 bytes - instruction length move.l A7,$24
	move.l	DestDecode(pc),DestCounter
	addq.l	#6,DestCounter

	bra	.sk_end

.sk0
	cmp.l	#$90AF001C,(A6)			; sub.l $1C(A7),D0
	bne.b	.sk2

	move.l	#$DDB90000,$1E+$10(A7)		; add.l D6,$10
	move.l	#$00104EB9,$22+$10(A7)		; jsr stack3
	pea	stack3(pc)
	move.l	(A7)+,$26+$10(A7)
	move.l	#$4E730000,$2A+$10(A7)		; rte
	addq.l	#6,(A7)

	bra	.sk_end

.sk2
	cmp.l	#$2F7C0004,(A6)			; move.l #$00042C6F,4(A7)
	bne.b	.sk3
	cmp.l	#$2C6F0004,4(A6)
	bne.b	.sk3

	move.w	#$BD96,0+$10(A7)		; eor.l D6,(A6)
	move.l	#$BDAE0004,2+$10(A7)		; eor.l D6,4(A6)
	move.w	#$4EB9,$A+$10(A7)		; jsr stack1
	pea	stack1(pc)
	move.l	(A7)+,$C+$10(A7)

	bra	.sk_end

.sk3
	cmp.l	#$2F7C0000,(A6)			; move.l #$10,$20(A7)
	bne.b	.sk4
	cmp.l	#$00100020,4(A6)
	bne.b	.sk4

	move.l	#$DDB90000,$1E+$10(A7)		; add.l D6,$10
	move.l	#$00104EB9,$22+$10(A7)		; jsr stack3
	pea	stack3(pc)
	move.l	(A7)+,$26+$10(A7)
	move.l	#$4E730000,$2A+$10(A7)		; rte
	addq.l	#6,(A7)

	bra	.sk_end

.sk4
	cmp.l	#$90AF0004,(A6)			; sub.l 4(A7),D0
	bne.b	.sk5

	move.w	#$BD96,0+$10(A7)		; eor.l D6,(A6)
	move.l	#$BDAE0004,2+$10(A7)		; eor.l D6,4(A6)
	move.w	#$4EB9,$A+$10(A7)		; jsr stack1
	pea	stack1(pc)
	move.l	(A7)+,$C+$10(A7)

	bra	.sk_end

.sk5
	cmp.l	#$90AF0024,(A6)			; sub.l $24(A7),D0
	bne.b	.sk6

	move.w	#$4EB9,$1E+$10(A7)		; jsr stack2
	pea	stack2(pc)
	move.l	(A7)+,$20+$10(A7)
	move.l	#$4E730000,$24+$10(A7)		; rte

	move.l	StackMem(pc),$28+$10(A7)
	move.l	StackMem+4(pc),$2C+$10(A7)

	bra	.sk_end

.sk6
	cmp.l	#$2F7C0004,(A6)			; move.l #$4DDB9,$1C(A7)
	bne.b	.sk7
	cmp.l	#$DDB9001C,4(A6)
	bne.b	.sk7

	move.l	#$DDB90000,$1E+$10(A7)		; add.l D6,$10
	move.l	#$00104EB9,$22+$10(A7)		; jsr stack3
	pea	stack3(pc)
	move.l	(A7)+,$26+$10(A7)
	move.l	#$4E730000,$2A+$10(A7)		; rte
	addq.l	#6,(A7)

	bra.b	.sk_end

.sk7
	cmp.l	#$2F7CBD96,(A6)			; move.l #$BD96BDAE,0(A7)
	bne.b	.sk8
	cmp.l	#$BDAE0000,4(A6)
	bne.b	.sk8

	move.w	#$BD96,0+$10(A7)		; eor.l D6,(A6)
	move.l	#$BDAE0004,2+$10(A7)		; eor.l D6,4(A6)
	move.w	#$4EB9,$A+$10(A7)		; jsr stack1
	pea	stack1(pc)
	move.l	(A7)+,$C+$10(A7)

.sk8
; used in game Steg The Slug

	cmp.l	#$90AF0020,(A6)			; sub.l $20(A7),D0
	bne.b	.sk9

	move.l	#$DDB90000,$1E+$10(A7)		; add.l D6,$10
	move.l	#$00104EB9,$22+$10(A7)		; jsr stack3
	pea	stack3(pc)
	move.l	(A7)+,$26+$10(A7)
	move.l	#$4E730000,$2A+$10(A7)		; rte
	addq.l	#6,(A7)
.sk9

.sk_end
	add.l	D6,$10.w
	move.l	A6,RegA6
	rts

stack3
	move.w	#$4EB9,$1E+$10(A7)		; jsr stack2
	pea	stack2(pc)
	move.l	(A7)+,$20+$10(A7)
	move.l	#$4E730000,$24+$10(A7)		; rte

	move.l	StackMem(pc),$28+$10(A7)	; odtworzenie gory stosu 1
	move.l	StackMem+4(pc),$2C+$10(A7)

	subq.l	#6,(A7)

	rts

; stos 3

stack6
	eor.l	D6,(A6)
	eor.l	D6,4(A6)

	move.l	SourceDecode(pc),A1
	addq.l	#6,a1
	move.l	DestDecode(pc),A2
.loop
	cmp.l	A0,A1
	beq.b	.skip
	addq.l	#2,a1
	move.w	#$4E71,(A2)+		; wstawiam nop, ale copylock
	bra.b	.loop			; niekoniecznie jest tym zakonczony
.skip
	move.l	a1,SourceDecode
	move.l	a2,DestDecode

	move.l	A0,A1
	sub.l	A2,A2
	sub.l	A3,A3
	lea	.sk(pc),A4		; return address from copylock
					; set to rts
.sk
	rts

; w stosie 2 zamiast add.l $8,D0 , zakodowanie programu copylock'a

stack4
	add.l	8.w,D0

	cmp.b	#1,Change
	bne.b	.1

	move.w	#$4E6E,(A0)
.1

	tst.w	OriginalSYNC
	beq.b	_89

	cmp.b	#2,Change
	bne.b	.2

	move.w	#$8914,2(A0)
.2
	cmp.b	#3,Change
	bne.b	.3

	move.w	#$8911,2(A0)
.3
	cmp.b	#4,Change
	bne.b	.4

	move.w	#$8912,2(A0)
.4
	cmp.b	#5,Change
	bne.b	.5

	move.w	#$8951,2(A0)
.5
	cmp.b	#6,Change
	bne.b	.6

	move.w	#$8915,2(A0)
.6
	clr.b	Change

_89

	cmp.l	#$10,A0			; czy to pierwsze wejscie do stosu 2 ?
	bne.b	.skip2			; if = 0 tak

	move.w	#$BD96,0+$18(A7)	; eor.l D6,(A6) ; wstawienie na poczatku stosu 2
	move.l	#$BDAE0004,2+$18(A7)	; eor.l D6,4(A6)

	bra.b	.skip
.skip2
	tst.b	NotCopy			; czy instrukcja juz skopiowana ?
	bne.b	.skip			; if <> 0 tak

	movem.l	D0/A0-A1,Regs

	move.l	10+4(A7),A1		; A1 - adres poczatkowy instrukcji do wykonania
	sub.l	A0,A1			; A0 - adres poczatkowy instrukcji wykonanej
	move.l	A1,D0			; dlugosc instrukcji wykonanej w bajtach
	move.l	A0,A1
	sub.l	SourceCounter(pc),A1	; offset od poczatku copylock'a
	add.l	DestCounter(pc),A1
	subq.l	#1,D0
.loop
	move.b	(A0)+,(A1)+
	dbf	D0,.loop

	move.l	A0,SourceDecode
	move.l	A1,DestDecode

	movem.l	Regs(pc),D0/A0-A1
.skip
	rts

; w stosie 2 zamiast add.l $8,D0 , odkodowanie programu copylock'a

stack5
	add.l	8.w,D0

	eor.l	D0,(A0)+		; odkodowanie nastepnej instrukcji
	eor.l	D0,(A0)
	addq.l	#4,(A7)			; ominiecie ponownego dekodowania
					; gdyz przed chwila to zrobilem

	movem.l	D0/A0-A1,Regs
	subq.l	#4,A0

	clr.b	NotCopy

	move.w	(A0),D0
	and.w	#$F0FF,D0
	cmp.w	#$6000,D0		; bsr.b ... or bra.b
	bne.b	NotLongJump

	st	NotCopy

	move.l	A0,A1
	sub.l	SourceCounter(pc),A1
	add.l	DestCounter(pc),A1
	move.l	(A0),(A1)

	bra	Exit
NotLongJump
	lsr.w	#8,D0
	cmp.b	#$60,D0			; bsr.b ... or bra.b
	bne.b	NotJump

	st	NotCopy
	
	move.l	A0,A1
	sub.l	SourceCounter(pc),A1
	add.l	DestCounter(pc),A1
	move.w	(A0),(A1)

	bra	Exit
NotJump
	cmp.w	#$4E75,(A0)		; rts
	bne.b	NotRts

	st	NotCopy
	
	move.l	A0,A1
	sub.l	SourceCounter(pc),A1
	add.l	DestCounter(pc),A1
	move.w	(A0),(A1)

	bra	Exit
NotRts
	move.w	(A0),D0
	and.w	#$F0FF,D0
	cmp.w	#$50C8,D0		; dbcc D?,...
	bcs.b	NotDbcc
	cmp.w	#$50CF,D0
	bcc.b	NotDbcc

	st	NotCopy
	
	move.l	A0,A1
	sub.l	SourceCounter(pc),A1
	add.l	DestCounter(pc),A1
	move.l	(A0),(A1)

	bra	Exit
NotDbcc
	cmp.w	#$4E6E,(A0)		; move.l USP,A6
	bne.b	NotUSPtoA6

	move.b	#1,Change
	
	move.w	#$4E71,(A0)

	bra	Exit
NotUSPtoA6
	tst.w	OriginalSYNC
	beq	_89_2

	cmp.l	#$303C8914,(A0)		; move.w #$8914,D0
	bne.b	NotSYNC

	move.b	#2,Change

	move.w	#$4489,2(A0)

	bra	Exit
NotSYNC
	cmp.l	#$303C8911,(A0)		; move.w #$8911,D0
	bne.b	NotSYNC2

	move.b	#3,Change

	move.w	#$4489,2(A0)

	bra	Exit
NotSYNC2
	cmp.l	#$303C8912,(A0)		; move.w #$8912,D0
	bne.b	NotSYNC3

	move.b	#4,Change

	move.w	#$4489,2(A0)

	bra	Exit
NotSYNC3
	cmp.l	#$303C8951,(A0)		; move.w #$8951,D0
	bne.b	NotSYNC4

	move.b	#5,Change

	move.w	#$4489,2(A0)

	bra	Exit
NotSYNC4
	cmp.l	#$3D7C8915,(A0)		; move.w #$8915,-8(A6)
	bne.b	NotSYNC5

	move.b	#6,Change

	move.w	#$4489,2(A0)

	bra	Exit
NotSYNC5
	cmp.l	#$3D7C8914,(A0)		; move.w #$8914,-6(A6)
	bne.b	NotSYNC6

	move.b	#2,Change

	move.w	#$4489,2(A0)

	bra	Exit
NotSYNC6
	cmp.l	#$3D7C8911,(A0)		; move.w #$8911,-4(A6)
	bne.b	NotSYNC7

	move.b	#3,Change

	move.w	#$4489,2(A0)

	bra	Exit
NotSYNC7
	cmp.l	#$3D7C8912,(A0)		; move.w #$8912,-2(A6)
	bne.b	NotSYNC8

	move.b	#4,Change

	move.w	#$4489,2(A0)

	bra	Exit
NotSYNC8
	cmp.w	#$B0BC,(A0)		; cmp.l #$A573632C,D0
	bne.b	NotCMP

	move.l	2(A0),4(A7)

	bra	Exit
NotCMP
	cmp.w	#$0C50,(A0)		; cmpi.w #$2A91,(A0)
	bne.b	NotCMP2			; cmpi.w #$AA92,(A0)
					; cmpi.w #$AA94,(A0)
	move.l	8(A7),A1		; A0
	move.w	2(A0),(A1)

	bra	Exit
NotCMP2
	cmp.w	#$9081,(A0)		; sub.l D1,D0
	bne.b	NotSub2

	move.l	#$25,4(A7)		; D0=$25
	moveq	#$12,D1

	bra.b	Exit
NotSub2
	cmp.l	#$B07C03AC,(A0)		; cmp.w #$03AC,D0
	bne.b	NotCMP3

	move.l	#$400,4(A7)		; D0=$400

	bra.b	Exit
NotCMP3
	cmp.w	#$0C98,(A0)		; cmpi.l #$552AAAA5,(A0)+
	bne.b	NotCMP4
	cmp.l	#$552AAAA5,2(A0)
	bne.b	NotCMP4

	move.l	8(A7),A1		; A0
	move.l	2(A0),(A1)

	bra.b	Exit
NotCMP4
	cmp.w	#$0C98,(A0)		; cmpi.l #$55292AA9,(A0)+
	bne.b	NotCMP5
	cmp.l	#$55292AA9,2(A0)
	bne.b	NotCMP5

	move.l	8(A7),A1		; A0
	move.l	2(A0),(A1)

	bra.b	Exit
NotCMP5
	cmp.l	#$B07C0054,(A0)		; cmp.w #$54,d0
	bne.b	NotCmp

	move.l	#$55,4(A7)		; D0=$55

	bra.b	Exit
NotCmp
;	cmp.w	#$2006,(A0)		; move.l D6,D0
;	bne.b	NotID

_89_2
	tst.w	Again
	bne.b	NotID

	cmp.w	#$DDFC,(A0)		; adda.l #$???,A6
	bne.b	NotID

	st	Again

; if you wish decode copylock+file, but you have not original game disk,
; set one value below

;	move.l	#$A3EF1306,4(A7)	;ID value from Advanced Ski Simulator
;	move.l	#$E55A6DD8,4(A7)	;ID value from Defender 2
;	move.l	#$EB3D7FF7,4(A7)	;ID value from Die Hard 2
;	move.l	#$9EA62DB3,4(A7)	;ID value from Graham Goohes Cricket
;	move.l	#$,4(A7)	;ID value from Guardian Angel
;	move.l	#$8290FFC1,4(A7)	;ID value from Insects In Space
;	move.l	#$4C41AE40,4(A7)	;ID value from Italy 1990
;	move.l	#$E55A6DD8,4(A7)	;ID value from Munsters
;	move.l	#$A3EF1306,4(A7)	;ID value from Nitroboost Challenge
;	move.l	#$704BCE83,4(A7)	;ID value from Paradroid 90
;	move.l	#$7C3369C9,4(A7)	;ID value from Photon Storm
;	move.l	#$DC84624B,4(A7)	;ID value from Power Drift
;	move.l	#$32734940,4(A7)	;ID value from Resolution 101
;	move.l	#$9884514B,4(A7)	;ID value from RoboCop
;	move.l	#$9EA62DB3,4(A7)	;ID value from Spellfire The Sorcerer
;	move.l	#$5C80675B,4(A7)	;ID value from Steg The Slug
;	move.l	#$32734940,4(A7)	;ID value from Thunderstrike
;	move.l	#$9B50CBE8,4(A7)	;ID value from Total Recall

	lea	Registers6(pc),a0

;	tst.w	OriginalSYNC
;	bne.b	.skip

	move.l	4(A7),(a0)+
;	bra.b	.go
;.skip
;	addq.l	#4,a0
;.go
	move.l	d1,(a0)+
	move.l	d2,(a0)+
	move.l	d3,(a0)+
	move.l	d4,(a0)+
	move.l	d5,(a0)
NotID

Exit
	movem.l	Regs(pc),D0/A0-A1
	rts

**************************************************************************

DosName		dc.b	'dos.library',0
ReqName		dc.b	'reqtools.library',0

About		dc.b	'Wanted Team',10,10
		dc.b	'presents',10,10
		dc.b	'Rob Northen Copylock decoder V1.34',10,10
		dc.b	'Code: Mr.Larmer',10,10
		dc.b	'Release date: 30 January 2000',0
WrongStack
		dc.b	"Stack in your file isn't",10
		dc.b	'the same as in my procedure',10
		dc.b	"(loaded file isn't copylock)",0
WhatSYNCUsed
		dc.b	'If you use original key disk',10
		dc.b	'choose SYNC $89??',0
WhichD3
		dc.b	'Which value of D3 register',10
		dc.b	'you want to use ?',0
InsertOriginalDisk
		dc.b	'Insert original key disk with',10
		dc.b	'Rob Northen Copylock',10
		dc.b	'in drive df0:',0
InsertAnyDOSDisk
		dc.b	'Insert any DOS disk',10
		dc.b	'in drive df0:',0
FileReqNameLoad
		dc.b	'Choose Copylock program to load',0
FileReqNameSave
		dc.b	'Choose Copylock decoded to save',0

Complete	dc.b	'Decode complete',0
RequesterGad
		dc.b	'Ok',0
RequesterGad2
		dc.b	'$4489|$89??',0
RequesterGad3
		dc.b	'$100F|$0000',0
AllRegsText
		dc.b	'Registers used for decode file',10,10
		dc.b	'D0 = $%08lx , D1 = $%08lx',10
		dc.b	'D2 = $%08lx , D3 = $%08lx',10
		dc.b	'D4 = $%08lx , D5 = $%08lx',0
;RegsText
;		dc.b	'Registers used for decode file',10,10
;		dc.b	'D0 =  unknown  , D1 = $%08lx',10
;		dc.b	'D2 = $%08lx , D3 = $%08lx',10
;		dc.b	'D4 = $%08lx , D5 = $%08lx',0

		CNOP 0,2
TagsLoad
		dc.l	RT_ReqPos,REQPOS_CENTERSCR
		dc.l	0
RequesterTags
		dc.l	RT_ReqPos,REQPOS_CENTERSCR
		dc.l	RTEZ_Flags,EZREQF_CENTERTEXT
		dc.l	0

StackMem	ds.l	2
Regs		ds.l	3
RegA6		dc.l	0
SourceDecode	dc.l	0
DestDecode	dc.l	SaveBufor
SourceCounter	dc.l	0
DestCounter	dc.l	0
NotCopy		dc.b	0
Change		dc.b	0
OriginalSYNC	dc.w	0
ValueD3		dc.w	0
Again		dc.w	0
Registers6	ds.l	6

Variables	ds.l	5

	section data,bss_c
Bufor		ds.b	$50004
	section data2,bss
FileNameL	ds.b	108
FullNameL	ds.b	256
PageZero	ds.b	$2C
SaveBufor	ds.b	$50004
