;*---------------------------------------------------------------------------
;  :Program.	wildwestworld.asm
;  :Contents.	Slave for "Wild West World" from Software 2000
;  :Author.	Wepl
;  :Original	v1 
;  :Version.	$Id: wildwestworld.asm 1.5 2002/08/05 21:37:42 wepl Exp wepl $
;  :History.	07.08.00 started
;		03.08.01 some steps forward ;)
;		30.01.02 final beta
;		24.04.02 final
;		24.07.02 setmap added (v2.0)
;		05.08.02 1.1 release
;  :Requires.	-
;  :Copyright.	Public Domain
;  :Language.	68000 Assembler
;  :Translator.	Devpac 3.14, Barfly 2.9
;  :To Do.
;---------------------------------------------------------------------------*

	INCDIR	Includes:
	INCLUDE	whdload.i
	INCLUDE	whdmacros.i
	INCLUDE	lvo/dos.i

	IFD BARFLY
	OUTPUT	"wart:w/wildwestworld 1.2/WildWestWorld.Slave"
	OUTPUT	"wart:w/wildwestworld 2.0/WildWestWorld.Slave"
	BOPT	O+				;enable optimizing
	BOPT	OG+				;enable optimizing
	BOPT	ODd-				;disable mul optimizing
	BOPT	ODe-				;disable mul optimizing
	BOPT	w4-				;disable 64k warnings
	SUPER
	ENDC

;============================================================================

CHIPMEMSIZE	= $100000
FASTMEMSIZE	= $0000
NUMDRIVES	= 1
WPDRIVES	= %0000

;BLACKSCREEN
;DEBUG
;DISKSONBOOT
DOSASSIGN
HDINIT
;HRTMON
IOCACHE		= 10000
;MEMFREE	= $200
;NEEDFPU
;SETPATCH

;============================================================================

KICKSIZE	= $40000			;34.005
BASEMEM		= CHIPMEMSIZE
EXPMEM		= KICKSIZE+FASTMEMSIZE

;============================================================================

_base		SLAVE_HEADER			;ws_Security + ws_ID
		dc.w	15			;ws_Version
		dc.w	WHDLF_NoError|WHDLF_EmulPriv|WHDLF_Examine	;ws_flags
		dc.l	BASEMEM			;ws_BaseMemSize
		dc.l	0			;ws_ExecInstall
		dc.w	_boot-_base		;ws_GameLoader
		dc.w	_data-_base		;ws_CurrentDir
		dc.w	0			;ws_DontCache
_keydebug	dc.b	0			;ws_keydebug
_keyexit	dc.b	$59			;ws_keyexit = F10
_expmem		dc.l	EXPMEM			;ws_ExpMem
		dc.w	_name-_base		;ws_name
		dc.w	_copy-_base		;ws_copy
		dc.w	_info-_base		;ws_info

;============================================================================

	IFD BARFLY
	DOSCMD	"WDate  >T:date"
	ENDC

	CNOP 0,4
_disk1		dc.b	3,"df0",0
_name		dc.b	"Wild West World",0
_copy		dc.b	"1990 Software 2000",0
_info		dc.b	"adapted by Wepl",10
		dc.b	"Version 1.1 "
	IFD BARFLY
		INCBIN	"T:date"
	ENDC
		dc.b	0
_data		dc.b	"data",0
_program	dc.b	"www_start",0
_program2	dc.b	"wildwestworld",0
_args		dc.b	10
_args_end	dc.b	0
_setmap		dc.b	"setmap d",10,0
	EVEN

;============================================================================

_bootdos	move.l	(_resload),a2		;A2 = resload

	;open doslib
		lea	(_dosname,pc),a1
		move.l	(4),a6
		jsr	(_LVOOldOpenLibrary,a6)
		move.l	d0,a6			;A6 = dosbase

	;assigns
		lea	(_disk1),a0
		sub.l	a1,a1
		bsr	_dos_assign

	;load exe
		lea	_program,a0
		move.l	a0,d1
		jsr	(_LVOLoadSeg,a6)
		move.l	d0,d7			;D7 = segment
		beq	.end

	;patch
		lea	_pl1,a0
		move.l	d7,a1
		jsr	(resload_PatchSeg,a2)

	IFD DEBUG
	;set debug
		clr.l	-(a7)
		move.l	d7,-(a7)
		pea	WHDLTAG_DBGSEG_SET
		move.l	a7,a0
		jsr	(resload_Control,a2)
		add.w	#12,a7
	ENDC

	;call
		move.l	d7,a1
		add.l	a1,a1
		add.l	a1,a1
		moveq	#_args_end-_args,d0
		lea	(_args,pc),a0
		move.l	(4,a7),d2		;D2 = stacksize
		sub.l	#5*4,d2			;required for MANX stack check
		movem.l	d2/d7/a2/a6,-(a7)
		jsr	(4,a1)
		movem.l	(a7)+,d2/d7/a2/a6

	;remove exe
		move.l	d7,d1
		jsr	(_LVOUnLoadSeg,a6)

	;load exe
		lea	_program2,a0
		move.l	a0,d1
		jsr	(_LVOLoadSeg,a6)
		move.l	d0,d7			;D7 = segment
		beq	.end

	;check version
		lea	_program2,a0
		move.l	a0,d1
		move.l	#MODE_OLDFILE,d2
		jsr	(_LVOOpen,a6)
		move.l	d0,d1
		move.l	#300,d3
		sub.l	d3,a7
		move.l	a7,d2
		jsr	(_LVORead,a6)
		move.l	d3,d0
		move.l	a7,a0
		move.l	(_resload),a2
		jsr	(resload_CRC16,a2)
		add.l	d3,a7
		
		moveq	#0,d2
		lea	(_pl2_12),a0
		cmp.w	#$6687,d0
		beq	.p
		moveq	#1,d2
		lea	(_pl2_20),a0
		cmp.w	#$7303,d0
		beq	.p
		pea	TDREASON_WRONGVER
		jmp	(resload_Abort,a2)
		
	;patch
.p		move.l	d7,a1
		jsr	(resload_PatchSeg,a2)

	;setmap
		tst.l	d2
		beq	.nosetmap
		lea	_setmap,a0
		move.l	a0,d1
		moveq	#0,d2
		moveq	#0,d3
		jsr	(_LVOExecute,a6)
.nosetmap

	IFD DEBUG
	;set debug
		clr.l	-(a7)
		move.l	d7,-(a7)
		pea	WHDLTAG_DBGSEG_SET
		move.l	a7,a0
		jsr	(resload_Control,a2)
		add.w	#12,a7
	ENDC

	;call
		move.l	d7,a1
		add.l	a1,a1
		add.l	a1,a1
		moveq	#_args_end-_args,d0
		lea	(_args,pc),a0
		move.l	(4,a7),d2		;D2 = stacksize
		sub.l	#5*4,d2			;required for MANX stack check
		movem.l	d2/d7/a2/a6,-(a7)
		jsr	(4,a1)
		movem.l	(a7)+,d2/d7/a2/a6

		pea	TDREASON_OK
		jmp	(resload_Abort,a2)

	IFEQ 1
	;remove exe
		move.l	d7,d1
		jsr	(_LVOUnLoadSeg,a6)
	ENDC

.end		moveq	#0,d0
		rts

_pl1		PL_START
		PL_PS	$d16,_dbffix
		PL_W	$d16+6,$32c
		PL_PS	$d2c,_dbffix
		PL_W	$d2c+6,$32c
		PL_END

_pl2_12
_pl2_20		PL_START
		PL_P	$926,_smc1
		PL_PS	$b2c,_dbffix
		PL_W	$b2c+6,$1f4
		PL_END

_smc1		move.b	#6,(a4)			;original
		bra	_flushcache

_dbffix		movem.l	d0-d1/a0,-(a7)
		move.l	(12,a7),a0
		moveq	#0,d0
		move.w	(a0)+,d0
		divu	#34,d0
.1		move.b	$dff006,d1
.2		cmp.b	$dff006,d1
		beq	.2
		dbf	d0,.1
		movem.l	(a7)+,d0-d1/a0
		addq.l	#2,(a7)
		rts

;============================================================================

	INCLUDE	Sources:whdload/kick13.s

;============================================================================

	END
