;*---------------------------------------------------------------------------
;  :Program.	battelisle.asm
;  :Contents.	Slave for "Battle Isle" from Blue Byte
;  :Author.	Wepl
;  :Original	v1 wepl@whdload.de
;  :Version.	$Id: battleisle.asm 0.11 2002/06/05 22:16:23 wepl Exp wepl $
;  :History.	04.03.00 started
;		16.04.00 finished
;		11.05.00 support for us-version added
;		24.11.00 keyboard fixed
;		20.12.00 small change
;		03.08.01 cleanup for new kickemu
;  :Requires.	-
;  :Copyright.	Public Domain
;  :Language.	68000 Assembler
;  :Translator.	Devpac 3.14, Barfly 2.9
;  :To Do.
;---------------------------------------------------------------------------*

	INCDIR	Includes:
	INCLUDE	whdload.i
	INCLUDE	whdmacros.i

	IFD BARFLY
	OUTPUT	"wart:b/battleisle/BattleIsle.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

UPPER	MACRO
		cmp.b	#"a",\1
		blo	.l\@
		cmp.b	#"z",\1
		bhi	.l\@
		sub.b	#$20,\1
.l\@
	ENDM

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

CHIPMEMSIZE	= $66000
FASTMEMSIZE	= $49000
NUMDRIVES	= 1
WPDRIVES	= %1111

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

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

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

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

_base		SLAVE_HEADER			;ws_Security + ws_ID
		dc.w	13			;ws_Version
		dc.w	WHDLF_NoError|WHDLF_Req68020|WHDLF_EmulPriv	;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

_name		dc.b	"Battle Isle",0
_copy		dc.b	"1991-93 Blue Byte",0
_info		dc.b	"adapted by Wepl",10
		dc.b	"Version 1.5 "
	IFD BARFLY
		INCBIN	"T:date"
	ENDC
		dc.b	0
_data		dc.b	"data",0
_introe		dc.b	"intro.prg.en",0
_introd		dc.b	"intro.prg.de",0
_main		dc.b	"battle.prg",0
_desert		dc.b	"d01/battle20.prg",0
_moon		dc.b	"d02/mond.dwn",0

_extrad		dc.b	"LIB/PART.TAB",0	;only desert
		dc.b	"LIB/PATT.LIB",0

_extram		dc.b	"00.PAL",0		;both
		dc.b	"01.PAL",0
		dc.b	"AMOK.DAT",0
		dc.b	"BNIM/FAB00.ANI",0
		dc.b	"BNIM/FAB01.ANI",0
		dc.b	"GROUND.DAT",0
		dc.b	"KOCW.DAT",0
		dc.b	"LIB/PART.LIB",0
		dc.b	"LIB/PFIGHT.LIB",0
		dc.b	"MENU.PAL",0
		dc.b	"MENU.PCK",0

		dc.b	"UNIT.DAT",0		;only moon
		dc.b	"LOOSER.SND",0
		dc.b	"STATS.PCK",0
		dc.b	"WINNER.SND",0
		dc.b	"MOND.DWN",0
		dc.b	"BNIM/END.PAL",0
		dc.b	"BNIM/END.SND",0
		dc.b	"BNIM/HQ.PAL",0
		dc.b	"BNIM/TOT.ANI",0
		dc.b	"BNIM/TOT.PAL",0
		dc.b	"BNIM/END.ANI",0
		dc.b	"BNIM/HQ.SND",0
		dc.b	"BNIM/TOT.SND",0
		dc.b	"BNIM/HQ.ANI",0
		dc.b	"LIB/PBIGUNIT.LIB",0
		dc.b	"LIB/UNIT.LIB",0
		dc.b	"LIB/CURSOR.LIB",0
		dc.b	"GAME.PAL",0
		dc.b	"GAME.SND",0
		dc.b	"MAP02.LIB",0
		dc.b	"MAP04.LIB",0
		dc.b	"MAPINFO.DAT",0
		dc.b	"TITEL.TXT",0
	EVEN

_tab		dc.w	$dba2,0		;crc
		dc.w	_plie-_tab	;patch list
		dc.w	_introe-_tab	;file name

		dc.w	$eb46,0		;crc
		dc.w	_plid-_tab	;patch list
		dc.w	_introd-_tab	;file name

		dc.w	$1c05,$9a61	;crc european,us/canada
		dc.w	_pl-_tab	;patch list
		dc.w	_main-_tab	;file name

		dc.w	$7d5c,0		;crc
		dc.w	_pld-_tab	;patch list
		dc.w	_desert-_tab	;file name

		dc.w	$E442,0		;crc
		dc.w	_plm-_tab	;patch list
		dc.w	_moon-_tab	;file name

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

_bootearly	move.l	(_resload,pc),a2	;a2 = resload

	;enable cache
		move.l	#WCPUF_Base_NC|WCPUF_Exp_CB|WCPUF_Slave_CB|WCPUF_IC|WCPUF_DC|WCPUF_BC|WCPUF_SS|WCPUF_SB,d0
		move.l	#WCPUF_All,d1
		jsr	(resload_SetCPU,a2)
		
	;get tags
		lea	(_tag,pc),a0
		jsr	(resload_Control,a2)
		
		move.l	(_custom1),d0
		subq.l	#1,d0
		bmi	.badver
		cmp.l	#5,d0
		bhs	.badver
		
		mulu	#8,d0
		lea	(_tab,pc),a0
		move.l	a0,a1
		add.l	d0,a1
		movem.w	(a1)+,d5-d6		;d5/d6 = crc
		move.w	(a1)+,a3
		add.l	a0,a3			;a3 = patchlist
		move.w	(a1)+,a4
		add.l	a0,a4			;a4 = name

	;get filesize
		move.l	a4,a0
		jsr	(resload_GetFileSizeDec,a2)
		move.l	d0,d7			;d7 = length
		
	;load program
		move.l	d7,d0
		moveq	#0,d1
		move.l	(4),a6
		jsr	(_LVOAllocMem,a6)
		move.l	d0,a5			;a5 = address

		move.l	a4,a0
		move.l	a5,a1
		jsr	(resload_LoadFileDecrunch,a2)

	;check version
		move.l	d7,d0
		move.l	a5,a0
		jsr	(resload_CRC16,a2)
		cmp.w	d5,D0
		beq	.verok
		cmp.w	d6,D0
		beq	.verok
.badver		pea	TDREASON_WRONGVER
		jmp	(resload_Abort,a2)
.verok
	;disable doslib
		move.l	(4),a0
		add.w	#_LVOOpenLibrary+2,a0
		lea	_openlib_save,a1
		move.l	(a0),(a1)
		lea	_openlib,a1
		move.l	a1,(a0)

	;patch program
		move.l	a3,a0
		move.l	a5,a1
		jsr	(resload_Patch,a2)

	;disable cache
		move.l	#WCPUF_Exp_NCS,d0
		move.l	#WCPUF_Exp,d1
		jsr	(resload_SetCPU,a2)

	;start
		jsr	(a5)

	;quit
.quit		pea	TDREASON_OK
		move.l	(_resload,pc),a2
		jmp	(resload_Abort,a2)

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

_plie		PL_START
		PL_P	$5738,_load0
	;	PL_S	$5fa0,6				;blithog
		PL_PS	$6d60,_bplcon0
	;	PL_S	$7786,6				;blithog
		PL_END

_plid		PL_START
		PL_P	$5810,_load0
	;	PL_S	$6078,6				;blithog
		PL_PS	$6e38,_bplcon0
	;	PL_S	$785e,6				;blithog
		PL_END

_pl		PL_START
		PL_PS	$748,_cacheon1
		PL_P	$1ee64,_load0
		PL_P	$1f28e,_save0
		PL_PS	$852,_allocbug
	;	PL_S	$1f6c6,6			;blithog
		PL_PS	$20492,_bplcon0
		PL_PS	$4d4,_key
	;	PL_B	$10ed2,$66			;beq -> bne
	;	PL_PS	$4fa,_keyfix
	;	PL_I	$10
		PL_END

_key		lea	(_ciaa),a1
	;check if keyboard has caused interrupt
		btst	#CIAICRB_SP,(ciaicr,a1)
		beq	.end
	;read keycode
		move.b	(ciasdr,a1),d0
	;set output to low and output mode (handshake)
		clr.b	(ciasdr,a1)
		or.b	#CIACRAF_SPMODE,(ciacra,a1)
	;calculate rawkeycode
		not.b	d0
		ror.b	#1,d0
	;set raw
		move.b	(a3),(1,a3)			;save last raw
		move.b	(2,a3),(3,a3)			;save last ascii
		move.b	d0,(a3)				;new raw
		st	(4,a3)
	;set ascii
		move.l	(a7),a0
		jsr	($576-$4d4-6,a0)

	;better would be to use the cia-timer to wait, but we arn't know if
	;they are otherwise used, so using the rasterbeam
	;required minimum waiting is 75 µs, one rasterline is 63.5 µs
	;a loop of 3 results in min=127µs max=190.5µs
		moveq	#3-1,d1
.wait1		move.b	(_custom+vhposr),d0
.wait2		cmp.b	(_custom+vhposr),d0
	;move.w	$dff006,$dff180
		beq	.wait2
		dbf	d1,.wait1

	;set input mode
		and.b	#~(CIACRAF_SPMODE),(ciacra,a1)
.end		move.w	#INTF_PORTS,(intreq+_custom)
		addq.l	#4,a7
		movem.l	(a7)+,d0-a6
		rte

	IFEQ 1
_keyfix
		move.b	$bfec01,d0
		beq	.1
		btst	#0,d0			;up/down
	;	eor	#4,ccr
.1		rts

	ENDC

_pld		PL_START
		PL_PS	$748,_cacheon1
		PL_P	$1ee74,_load1
		PL_P	$1f29e,_save1
		PL_PS	$852,_allocbug
	;	PL_S	$1f6d6,6			;blithog
		PL_PS	$204a2,_bplcon0
		PL_PS	$4d4,_key
		PL_END

_plm		PL_START
		PL_PS	$746,_cacheon2
		PL_P	$1ff1c,_load2
		PL_P	$20346,_save2
		PL_PS	$850,_allocbug
	;	PL_S	$2077e,6			;blithog
		PL_PS	$2154a,_bplcon0
		PL_PS	$4d4,_key
		PL_END

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

_cacheon1	move.l	#$25a8,d0			;original

_cacheon	movem.l	d0-d1/a0-a1,-(a7)
		move.l	#WCPUF_Exp_CB,d0
		move.l	#WCPUF_Exp,d1
		move.l	_resload,a0
		jsr	(resload_SetCPU,a0)
		movem.l	(a7)+,_MOVEMREGS
		rts

_cacheon2	move.l	#$1df0,d0			;original
		bra	_cacheon

_bplcon0	move.w	(12,a6),d0			;original
		ror.w	#4,d0				;original
		or.w	#$200,d0			;enable color output
		rts

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

_load2		move.l	(8,a7),a0
		addq.l	#4,a0
		movem.l	a2,-(a7)
		cmp.l	#"MAP/",(a0)
		beq	.sub
		cmp.l	#".DAT",(2,a0)			;savegames
		beq	.sub
		moveq	#34-1,d0
		lea	(_extram),a1
.chk		move.l	a0,a2
.cmp		move.b	(a2)+,d1
		UPPER	d1
		cmp.b	(a1)+,d1
		bne	.fail
		tst.b	d1
		beq	.sub
		bra	.cmp
.fail		subq.l	#1,a1
.s		tst.b	(a1)+
		bne	.s
		dbf	d0,.chk
		movem.l	(a7)+,_MOVEMREGS
		move.l	a0,(8,a7)
		bra	_loadfile

.sub		movem.l	(a7)+,_MOVEMREGS
		move.l	#"D02/",-(a0)
		bra	_loadfile

_load1		move.l	(8,a7),a0
		addq.l	#4,a0
		movem.l	a2,-(a7)
		cmp.l	#"MAP/",(a0)
		beq	.sub
		cmp.l	#".DAT",(2,a0)			;savegames
		beq	.sub
		moveq	#13-1,d0
		lea	(_extrad),a1
.chk		move.l	a0,a2
.cmp		move.b	(a2)+,d1
		UPPER	d1
		cmp.b	(a1)+,d1
		bne	.fail
		tst.b	d1
		beq	.sub
		bra	.cmp
.fail		subq.l	#1,a1
.s		tst.b	(a1)+
		bne	.s
		dbf	d0,.chk
		movem.l	(a7)+,_MOVEMREGS
		move.l	a0,(8,a7)
		bra	_loadfile

.sub		movem.l	(a7)+,_MOVEMREGS
		move.l	#"D01/",-(a0)
		bra	_loadfile


_load0		addq.l	#4,(8,a7)			;skip "BI?:"

	;in:
	;(4,a7)  memflag (-1=any 0=chip *=memptr)
	;(8,a7)  name
	;(12,a7) buffer $2028
	;out
	;d0 = mem
	;d1 = length
_loadfile	movem.l	d2-d3/a2/a6,-(a7)
		move.l	(_resload),a2
		tst.l	(_MOVEMBYTES+4,a7)
		beq	.calc
		bpl	.load

.calc
	illegal
	ifeq 1
		moveq	#8,d0				;length
		moveq	#0,d1				;offset
		move.l	(_MOVEMBYTES+8,a7),a0		;name
		move.l	a7,a1				;dest
		jsr	(resload_LoadFileOffset,a2)
		cmp.l	#"TPWM",(a7)
		beq	.packed
		cmp.l	#"RNC"<<8+1,(a7)
		beq	.packed
		cmp.l	#"RNC"<<8+2,(a7)
		beq	.packed
		cmp.l	#"IMP!",(a7)
		beq	.packed

		move.l	(_MOVEMBYTES+8,a7),a0		;name
		jsr	(resload_GetFileSize,a2)
		bra	.getmem

.packed		move.l	(4,a7),d0			;unpacked length

.getmem		moveq	#MEMF_CHIP,d1
		tst.l	(_MOVEMBYTES+4,a7)
		beq	.alloc
		moveq	#MEMF_ANY,d1
.alloc		move.l	(4),a6
		jsr	(_LVOAllocMem,a6)
		move.l	d0,(_MOVEMBYTES+4,a7)
	endc

.load		move.l	(_MOVEMBYTES+8,a7),a0		;name
		move.l	(_MOVEMBYTES+4,a7),a1		;dest
		jsr	(resload_LoadFileDecrunch,a2)
		move.l	d0,d1				;length
		move.l	(_MOVEMBYTES+4,a7),d0		;address
		movem.l	(a7)+,_MOVEMREGS
		
.end		rts

_save2		move.l	(4,a7),a0
		move.l	#"D02/",(a0)
		bra	_savefile

_save1		move.l	(4,a7),a0
		move.l	#"D01/",(a0)
		bra	_savefile

_save0		addq.l	#4,(4,a7)			;skip "BI?:"

	;in:
	;(4,a7)  name
	;(8,a7)  buffer
	;(12,a7) length
	;out
	;d0 = rc (0=success)
_savefile	movem.l	a2,-(a7)
		move.l	(_resload),a2
		move.l	(_MOVEMBYTES+12,a7),d0
		move.l	(_MOVEMBYTES+4,a7),a0
		move.l	(_MOVEMBYTES+8,a7),a1
		jsr	(resload_SaveFile,a2)
		moveq	#0,d0
		movem.l	(a7)+,_MOVEMREGS
		rts

_openlib	cmp.l	#"dos.",(a1)
		bne	.org
		move.l	#-$10000,d0
		rts
.org		move.l	_openlib_save,-(a7)
		rts

	;game allocates same memory again and again
_allocbug	move.l	(_bugmem),d0
		bne	.already

		move.l	(4,a7),d0
		move.l	#MEMF_CLEAR,d1
		move.l	a6,-(a7)
		move.l	4,a6
		jsr	(_LVOAllocMem,a6)
		move.l	(a7)+,a6
		lea	(_bugmem),a0
		move.l	d0,(a0)
		rts

.already	move.l	d0,a0
		move.l	(4,a7),d1
.clr		clr.l	(a0)+
		clr.l	(a0)+
		subq.l	#8,d1
		bhi	.clr
		rts

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

_tag		dc.l	WHDLTAG_CUSTOM1_GET
_custom1	dc.l	0
		dc.l	0
_openlib_save	dc.l	0
_bugmem		dc.l	0

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

	INCLUDE	Sources:whdload/kick13.s

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

	END
