;*---------------------------------------------------------------------------
;  :Program.	gods.asm
;  :Contents.	Slave for "Gods"
;  :Author.	WEPL
;  :History.	20.05.96
;		01.05.97 evaluated to ver 3
;			 support for second format
;			 highscores improved (now loading from disk if no file
;			 is available)
;		02.05.97 trainer added
;		04.06.97 soundtracker playback fixed
;			 Kick 3.1 bug fixed
;			 drive check disabled
;		05.06.97 better copylock fix
;  :Requires.	-
;  :Copyright.	Public Domain
;  :Language.	68000 Assembler
;  :Translator.	Barfly V1.131
;  :To Do.
;---------------------------------------------------------------------------*

crc_v1	= $baec
crc_v2	= $a12d

	INCDIR	Includes:
	INCLUDE	whdload.i

	OUTPUT	wart:gods/gods.slave
	BOPT	O+ OG+			;enable optimizing
	BOPT	w4-			;disable 64k warnings

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

.base		SLAVE_HEADER		;ws_Security + ws_ID
		dc.w	4		;ws_Version
		dc.w	WHDLF_Disk|WHDLF_NoError|WHDLF_EmulTrap	;ws_flags
		dc.l	$ff000		;ws_BaseMemSize		;$bc000
		dc.l	$f2800		;ws_ExecInstall
		dc.w	.Start-.base	;ws_GameLoader
		dc.w	0		;ws_CurrentDir
		dc.w	0		;ws_DontCache
		dc.b	$58		;ws_keydebug = F9
		dc.b	$59		;ws_keyexit = F10

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

	DOSCMD	"WDate >T:date"
		dc.b	"$VER: WEPL "
	INCBIN	"T:date"
		dc.b	0

;======================================================================
.Start	;	A0 = resident loader
;======================================================================

		lea	(_resload,pc),a1
		move.l	a0,(a1)			;save for later using

		move.l	#CACRF_EnableI,d0	;enable instruction cache
		move.l	d0,d1			;mask
		jsr	(resload_SetCACR,a0)
		
	;check disk version
		move.l	#$5aa00,d0	;offset
		move.l	#$2c00,d1	;size
		moveq	#1,d2		;disk
		lea	$1000,a0	;data
		movem.l	d1/a0,-(a7)
		move.l	(_resload),a3
		jsr	(resload_DiskLoad,a3)
		movem.l	(a7)+,d0/a0
		jsr	(resload_CRC16,a3)
		moveq	#1,d1
		cmp.w	#crc_v1,d0
		beq	.set
		moveq	#2,d1
		cmp.w	#crc_v2,d0
		beq	.set
		bra	_badver
.set		lea	_version,a0
		move.w	d1,(a0)

	;init vars
		move.l	#$80400,$2c	;exp-mem at
		move.b	#1,$1c
		lea	($1000),a5	;A5 = first part
		move.l	a5,$84

	;load part 1
		move.l	#$600,d0	;offset
		move.l	#$a00,d1	;size
		moveq	#1,d2		;disk
		move.l	a5,a0		;data
		move.l	(_resload),a3
		jsr	(resload_DiskLoad,a3)

		patch	$e2(a5),_loader
		patch	$d6(a5),_1
		jmp	(a5)

	;now starting intro
	;intro lies at a00 and will be moved to 84
_1		move.l	#$d200,d0
		patch	$a00+$1bc,_loader
		patch	$a00+$1b0,_2
		patchs	$a00-$84+$24f2,_stfix	;soundtracker
		patchs	$a00-$84+$250a,_stfix	;soundtracker
		rts

	;fix for old soundtracker playback routine
	;bad stuff:
	;		move.w	#$12c,d0	;303c 012c
	;	_loop	dbf	d0,_loop	;51c8 fffe
	;
_stfix		move.l	d1,-(a7)
		moveq	#7,d1
.1		move.b	$dff006,d0
.2		cmp.b	$dff006,d0
		beq	.2
		dbf	d1,.1
		move.l	(a7)+,d1
		addq.l	#2,(a7)
		rts

	;now starting main
	;main lies at c00 and will be moved to 84
_2		move.l	#$a280,d0		;orginal
		move.l	a0,-(a7)
	;copylock
		patch	$c00-$84+$2446,$6388
	;different versions
		move.w	(_version),-(a7)
		cmp.w	#2,(a7)+
		beq	.v2

.v1	;illegal memory read from ROM, does not work on Kick3.1
	;thanks to Harry for this
		lea	$c00-$84+$62e6,a0
		move.l	#$33fc64ff,(a0)+	;move.w	#$64ff,$1d0a6	;value from ROM1.3
		move.l	#$0001d0a6,(a0)+
		move.w	#$600a,(a0)		;bra.b	$62fa
	;checking drives
		ret	$c00-$84+$1d8f2
	;loader
		patch	$c00-$84+$1d9de,_loader
	;jmp in
		move.l	(a7)+,a0
		rts

.v2	;illegal memory read from ROM, does not work on Kick3.1
	;thanks to Harry for this
		lea	$c00-$84+$62e6,a0
		move.l	#$33fc64ff,(a0)+	;move.w	#$64ff,$1d0aa	;value from ROM1.3
		move.l	#$0001d0aa,(a0)+
		move.w	#$600a,(a0)		;bra.b	$62fa
	;checking drives
		ret	$c00-$84+$1d8f6
	;loader
		patch	$c00-$84+$1d9e2,_loader
	;jmp in
		move.l	(a7)+,a0
		rts

;--------------------------------
; d1 startblock
; d2 blockcount
; d3 mode  bit0=0 read  bit0=1 write
; a0 destination

_loader		btst	#0,d3			;read or write ?
		bne	_savehighs		;only highscores

		moveq	#1,d0
		cmp.l	d0,d1
		bne	.0
		cmp.l	d0,d2
		beq	_loadhighs
.0
		movem.l	d1-d3/a0-a2,-(a7)

		cmp.w	#$28a,d2
		bne	.22
		move.w	#$26e,d2	;let's strip the diskimage a bit (disk1)
.22
		cmp.l	#$7ba80,a0
		bne	.1
		lea	(.disk),a1
		move.w	#2,(a1)		;from this point only disk 2
.1
		mulu	#512,d1		;start on disk
		move.l	d1,d0		;offset
		mulu	#512,d2		;amount of blocks
		move.l	d2,d1		;size
		moveq	#0,d2
		move.w	(.disk),d2	;disk
		move.l	(_resload),a2
		jsr	(resload_DiskLoad,a2)

		bsr	_kinit
		
		movem.l	(a7)+,d1-d3/a0-a2
		moveq	#0,d0
		rts

.disk		dc.w	1

;--------------------------------

_loadhighs
	;copylock stuff
		move.l	#$b4863d88,$60
		move.l	#$5dc,$b04c
		clr.l	$d158
		move.w	(_version),d0
		cmp.w	#2,d0
		beq	.v2
.v1		clr.l	$f6bc
		clr.l	$107f0
		bra	.vend
.v2		clr.l	$f6bc+4
		clr.l	$107f0+4
.vend
	;highscore loading
		movem.l	d1/a0-a2,-(a7)
		lea	(_savename),a0
		move.l	(_resload),a2
		jsr	(resload_GetFileSize,a2)
		tst.l	d0
		beq	.image
.file		move.l	(4,a7),a1		;address
		lea	(_savename),a0		;filename
		jsr	(resload_LoadFile,a2)
		bra	.end
.image		move.l	#512,d0			;offset
		move.l	d0,d1			;len
		moveq	#2,d2			;disk
		move.l	(4,a7),a0		;address
		jsr	(resload_DiskLoad,a2)
.end		movem.l	(a7)+,d1/a0-a2
		moveq	#0,d0
		rts

_savehighs	movem.l	d1-d2/a0-a2,-(a7)
		move.l	#512,d0			;len
		move.l	a0,a1			;address
		lea	(_savename),a0		;filename
		move.l	(_resload),a2
		jsr	(resload_SaveFile,a2)
		movem.l	(a7)+,d1-d2/a0-a2
		moveq	#0,d0
		rts

_savename	dc.b	"highs",0

;--------------------------------

_kinit		movem.l	a0-a1,-(a7)
		lea	(_keyboard,pc),a1
		cmp.l	$68,a1
		beq	.q
		lea	(_realint68,pc),a0
		move.l	$68,(a0)
		move.l	a1,$68
.q		movem.l	(a7)+,a0-a1
		rts

_realint68	dc.l	0

_keyboard	move.l	d0,-(a7)
		move.b	$bfec01,d0
		ror.b	#1,d0
		not.b	d0

; RAW-Key-Codes:
;	ESC	$45
;	DEL	$46
;	F1..F10	$50..$59
;	HELP	$5f

		cmp.b	#$58,d0
		bne	.1
		move.l	(a7)+,d0
		move.w	(a7),(6,a7)	;sr
		move.l	(2,a7),(a7)	;pc
		clr.w	(4,a7)		;ext.l sr
		bra	_debug		;coredump & quit
.1
		cmp.b	#$59,d0
		beq	_exit		;exit
		
		cmp.b	#$5f,d0
		bne	.2
		add.l	#10000,$1fc	;some more money
.2
		move.l	(a7)+,d0
		move.l	(_realint68),-(a7)	;enter orginal rou.
		rts

;--------------------------------

_version	dc.w	0	;version of disks
_resload	dc.l	0	;address of resident loader

;--------------------------------

_badver		pea	TDREASON_WRONGVER.w
		bra	_end
_exit		pea	TDREASON_OK.w
		bra	_end
_debug		pea	TDREASON_DEBUG.w
_end		move.l	(_resload),-(a7)
		add.l	#resload_Abort,(a7)
		rts

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

	END
