;*---------------------------------------------------------------------------
;  :Program.	turrican2.asm
;  :Contents.	Slave for "Turrican II"
;  :Author.	BJ
;  :History.	09.07.96 initial
;		14.12.96 rework for public installion release
;		23.12.96 installation improved / using new whdload functions
;  :Requires.	-
;  :Copyright.	Public Domain
;  :Language.	68000 Assembler
;  :Translator.	Barfly V1.131
;  :To Do.
;---------------------------------------------------------------------------*

;install	;create install slave
;files		;create files
 IFND files
image		;create diskimage
 ENDC

	INCDIR	Includes:
	INCLUDE	whdload.i

 IFND install
	OUTPUT	wart:turrican2/turrican2.slave
 ELSE
	OUTPUT	wart:turrican2/install.slave
 ENDC
	BOPT	O+ OG+			;enable optimizing
	BOPT	w4-			;disable 64k warnings
	SUPER

; verwendetes DiskFormat:
; Track 0-1 std (512 byte/sec,11 sec/track = 5632 byte/track)
; Track 2-159	(6800 byte/track)

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

.base		SLAVE_HEADER		;ws_Security + ws_ID
		dc.w	2		;ws_Version
		dc.w	WHDLF_Disk|WHDLF_NoError	;ws_flags
		dc.l	$80000		;ws_BaseMemSize
		dc.l	$20698		;ws_ExecInstall
		dc.w	.Start-.base	;ws_GameLoader
		dc.w	0		;ws_CurrentDir
		dc.w	0		;ws_DontCache

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

		lea	(_resload,pc),a1
		move.l	a0,(a1)

		move.l	#CACRF_EnableI,d0
		move.l	d0,d1
		jsr	(resload_SetCACR,a0)
		
	IFND install
	
		lea	_60000,a0
		lea	$60000,a1
		move.l	a1,a2
		move.l	(_resload),a3
		jsr	(resload_LoadFile,a3)
		patch	$c0(a2),_1
		patch	$394(a2),_loadbygeo
		patchs	$5a(a2),_wait
		moveq	#0,d0		;expmem
		jmp	(a2)

_wait
		move.w	#300,d2
.w		waitvb			;wait for end of logo
		dbf	d2,.w
		move.w	#$7fff,$dff09a
		addq.l	#2,(a7)
		rts

_1		lea	$c0,a0
		patch	$922(a0),_loadbygeo
		patch	$b20(a0),_loadhighs
		patch	$b9e(a0),_savehighs
		jmp	(a0)
		
	;d0 = size in bytes
	;d1 = start track
	;d2 = offset track in bytes
	;a0 = address
_loadbygeo	bsr	_kinit

		move.l	d2,-(a7)
		subq.w	#2,d1		;image starts at track 2
		mulu	#6800,d1
		add.l	d2,d1		;offset
		exg.l	d0,d1
		moveq	#1,d2		;disk
		move.l	a3,-(a7)
		move.l	(_resload),a3
		jsr	(resload_DiskLoad,a3)
		move.l	(a7)+,a3
		move.l	(a7)+,d2
		moveq	#0,d0
		rts

	ENDC

	IFD install	;create installation slave

_buffer	= $400	;space for disk directory information
dirsize = $1e0	;size of directory information

		lea	$dff000,a6		;A6 = _custom
		move.l	(_resload),a5		;A5 = _resload
		lea	$61000,a4		;A4 = Picture start
		moveq	#3,d4			;D4 = Picture depth
		
		lea	_disk1,a0
		move.l	a4,a1
		jsr	(resload_Decrunch,a5)
		lea	(a4,d0.l),a1		;a1 copperlist
		divu	d4,d0			;d0 size of bitplane
		move.w	#bplpt,d1
		move.l	a1,(cop1lc,a6)
		move.l	a4,d2
		move.l	d4,d3

.mcl		move.w	d1,(a1)+
		addq.w	#2,d1
		swap	d2
		move.w	d2,(a1)+
		move.w	d1,(a1)+
		addq.w	#2,d1
		swap	d2
		move.w	d2,(a1)+
		add.l	d0,d2
		subq.w	#1,d3
		bne	.mcl
		moveq	#-2,d0
		move.l	d0,(a1)+
		tst.w	(copjmp1,a6)
		waitvb
		move.w	#DMAF_SETCLR|DMAF_MASTER|DMAF_COPPER,(dmacon,a6)
		
		lea	_colors,a0
		lea	(color,a6),a1
		moveq	#1,d0
		lsl.w	d4,d0
.mc		move.w	(a0)+,(a1)+
		subq.w	#1,d0
		bne	.mc
		
		move.l	#$2981f1c1,(diwstrt,a6)		; 320x200
		move.l	#$003800d0,(ddfstrt,a6)
		move.w	d4,d0			;depth
		ror.w	#4,d0
		or.w	#$0200,d0
		move.w	d0,(bplcon0,a6)
		clr.w	(bplcon1,a6)
		clr.l	(bpl1mod,a6)

		waitvb
		move.w	#DMAF_SETCLR|DMAF_MASTER|DMAF_RASTER,(dmacon,a6)

		waitbutton

		lea	_wait,a0
		move.l	a4,a1
		jsr	(resload_Decrunch,a5)

		lea	.vbi,a0
		move.l	a0,$6c
		bra	.g
.vbi		btst	#6,$bfe001
		beq	_exit
		move.w	#INTF_VERTB,_custom+intreq
		rte
.g		move.w	#INTF_SETCLR|INTF_INTEN|INTF_VERTB,_custom+intena
		move.w	#INTF_VERTB,_custom+intreq
	
	;eigenlichen Loader laden / speichern
		MOVE.L	#$00060000,a0	;adr
		MOVE.L	#$00000800,d1	;size
		MOVE.L	#$00000400,d0	;offset
		sub.l	a1,a1		;taglist
		movem.l	d1/a0,-(a7)
		move.l	(_resload),a2
		jsr	(resload_DiskLoadDev,a2)
		movem.l	(a7)+,d0/a1
		lea	(_60000),a0
		jsr	(resload_SaveFile,a2)

	IFD files
	;create files from orginal disk
	;Inhaltsverzeichnis der Diskette lesen
		move.l	#dirsize,d0	;size
		move.l	#2,d1		;starttrack
		move.l	#0,d2		;byteoffset
		lea	_buffer,a0
		lea	$dff000,a6
		jsr	$60394
		
	;speichere Inhaltsverzeichnis
		move.l	#dirsize,d0
		lea	_dirname,a0
		lea	_buffer,a1
		move.l	(_resload),a2
		jsr	(resload_SaveFile,a2)
		
	;alle files lesen und auf HD schreiben
		lea	_buffer,a3
		moveq	#$1d,d7		;amount of files
_2		move.l	8(a3),d0	;size
		move.w	4(a3),d1	;starttrack
		moveq	#0,d2
		move.w	6(a3),d2	;byteoffset
		lea	$1000,a0	;destination
		movem.l	d0-a6,-(a7)
		jsr	$60394		;load file
		movem.l	(a7)+,d0-a6
					;d0 = size
		move.l	a0,a1		;adr
		move.l	a3,a0		;name
		move.l	(_resload),a2
		jsr	(resload_SaveFile,a2)
		add	#$10,a3		;next entry
		dbf	d7,_2
		bra	_highs

_dirname	dc.b	".directory",0,0

	ENDC
	IFD image
	;create disk image from orginal disk
	;Inhaltsverzeichnis der Diskette lesen
		move.l	#dirsize,d0	;size
		move.l	#2,d1		;starttrack
		move.l	#0,d2		;byteoffset
		lea	_buffer,a0
		lea	$dff000,a6
		jsr	$60394

		move.l	#dirsize,d0	;size of directory
		lea	_buffer+8,a0
		moveq	#dirsize/16-1,d1
.lp		add.l	(a0),d0		;calculate image size
		add.w	#16,a0
		dbf	d1,.lp
		
	;Image lesen
		move.l	#2,d1		;d1 = starttrack
		move.l	#0,d2		;d2 = byteoffset
		lea	$1000,a0	;a0 = address
		move.l	d0,d5		;d5 = image size
		lea	$dff000,a6	;a6 = custom
		move.l	#53,d3		;d3 = part tracks
		move.l	d3,d4
		mulu	#6800,d4	;d4 = part size

.2		move.l	d4,d0
		cmp.l	d4,d5
		bhi	.1
		move.l	d5,d0
.1		movem.l	d0-a6,-(a7)
		jsr	$60394		;loader is too stupid for large files !!!
		movem.l	(a7),d0-a6
		move.l	a0,a1		;address
		lea	(_imagename),a0	;name
		addq.b	#1,(1,a0)
		move.l	(_resload),a2
		jsr	(resload_SaveFile,a2)
		movem.l	(a7)+,d0-a6
		add.l	d3,d1		;skip read tracks
		sub.l	d0,d5		;correct
		bne	.2

		bra	_highs
		
_imagename	dc.b	"d0",0,0
	
	ENDC

	;highscores laden
_highs		move.l	#"MAIN",d0	;name
		move.l	#$c0,d1		;address
		moveq	#1,d2
		jsr	$60164		;load by name
		jsr	$c0+$b20	;load highs
		bsr	_savehighs
		bra	_exit

_disk1		INCBIN	pics/pic_disk1.bin
_wait		INCBIN	pics/pic_wait.bin
_colors		INCLUDE	pics/pic_colors.i

	ENDC
	
;--------------------------------

	IFND install

_loadhighs	movem.l	d0-d1/a0-a2,-(a7)
		move.l	(_resload),a2
		lea	_highsname,a0
		jsr	(resload_GetFileSize,a2)
		tst.l	d0
		beq	.end
		bsr	_crypt
		lea	_highsname,a0
		lea	$25e,a1
		jsr	(resload_LoadFile,a2)
		bsr	_crypt
.end		movem.l	(a7)+,d0-d1/a0-a2
		rts

	ENDC

_savehighs	movem.l	d0-d1/a0-a1,-(a7)
		bsr	_crypt
		move.l	#$61*4,d0
		lea	_highsname,a0
		lea	$25e,a1
		move.l	(_resload),a2
		jsr	(resload_SaveFile,a2)
		bsr	_crypt
		movem.l	(a7)+,d0-d1/a0-a1
		rts

_crypt		lea	$25e,a0
		move.w	#$61*4-1,d0
.lp		eor.b	d0,(a0)+
		dbf	d0,.lp
		rts

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

	IFND install

_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

		move.l	(a7)+,d0
		move.l	(_realint68),-(a7)	;enter orginal rou.
		rts

	ENDC
	
;--------------------------------

_60000		dc.b	"60000",0
_highsname	dc.b	"highs",0
_resload	dc.l	0		;address of resident loader

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

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

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

	END
