;*---------------------------------------------------------------------------
;  :Program.	turrican2.asm
;  :Contents.	Slave for "Turrican II"
;  :Author.	BJ
;  :History.	09.07.96
;  :Requires.	-
;  :Copyright.	Public Domain
;  :Language.	68000 Assembler
;  :Translator.	Barfly V1.131
;  :To Do.
;---------------------------------------------------------------------------*

	INCDIR	Includes:
	INCLUDE	hardware/custom.i
	INCLUDE	whdload.i

	OUTPUT	wart:turrican2/turrican2.slave

;createfiles	;save all files form orginal disk
;createimage	;create diskimage from orginaldisk
;logfile

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

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

.base		SLAVE_HEADER		;ws_Security + ws_ID
		dc.w	1		;ws_Version
		dc.w	WHDLF_Disk	;ws_flags
		dc.l	$80000		;ws_BaseMemSize
		dc.l	1		;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)
		
	;	QUITVBI
		
	IFND createfiles
	IFND createimage
	
		lea	_60000,a0
		lea	$60000,a1
		move.l	a1,a2
		bsr	_Load
		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
		bsr	_LoadDisk
		move.l	(a7)+,d2
		moveq	#0,d0
		rts

_60000		dc.b	"60000",0

_loadhighs	movem.l	d0-d1/a0-a1,-(a7)
		bsr	_crypt
		lea	_highsname,a0
		lea	$25e,a1
		bsr	_Load
		bsr	_crypt
		movem.l	(a7)+,d0-d1/a0-a1
		rts

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

_highsname	dc.b	"highs",0

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


	IFEQ 1
		lea	_main,a0	;name
		lea	$c0,a1		;dest adr
		move.l	a1,a2
		bsr	_Load
		patch	$638(a2),_loader
		nops	2,$11d0(a2)	;disk init
		moveq	#0,d0		;exp mem
		moveq	#-1,d1		;head position
		jmp	(a2)

_loader		bsr	_kinit
		lea	_main,a0
		move.l	d0,(a0)
		move.l	d1,a1
		bsr	_Load
		cmp.l	#"MUS0",(a0)	;einzigstes file das nicht gepackt ist
		beq	.q
		move.l	a1,a0
		move.l	a2,-(a7)
		lea	$78650,a2	;tmp buffer ?
		jsr	$c0+$d0c	;decrunching
		move.l	(a7)+,a2
.q		moveq	#0,d0
		rts
		
_main		dc.b	"MAIN",0,0
	ENDC

	ENDC
	ENDC
	IFD createfiles
	;create files from orginal disk

	;eigenlichen Loader laden
		MOVE.L	#$00060000,a0	;adr
		MOVE.L	#$00000800,d1	;size
		MOVE.L	#$00000400,d0	;offset
		moveq	#1,d2		;disk
		bsr	_LoadDisk
		
	;Inhaltsverzeichnis der Diskette lesen
		move.l	#1024,d0	;size
		move.l	#2,d1		;starttrack
		move.l	#0,d2		;byteoffset
		lea	_buffer,a0
		lea	$dff000,a6
		jsr	$60394
		
	;speichere Inhaltsverzeichnis
		move.l	#_dirname-_buffer,d0
		lea	_dirname,a0
		lea	_buffer,a1
		bsr	_Save
		
	;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	$400,a0		;destination
		movem.l	d0-a6,-(a7)
		jsr	$60394		;load file
		movem.l	(a7)+,d0-a6
		move.l	8(a3),d0	;size
		move.l	a3,a0		;name
		lea	$400,a1		;adr
		bsr	_Save
		add	#$10,a3		;next entry
		dbf	d7,_2
		illegal

_buffer		ds.b	1024
_dirname	dc.b	".directory",0,0
	ENDC
	IFD createimage
	;create disk image from orginal disk

	;eigenlichen Loader laden
		MOVE.L	#$00060000,a0	;adr
		MOVE.L	#$00000800,d1	;size
		MOVE.L	#$00000400,d0	;offset
		moveq	#1,d2		;disk
		bsr	_LoadDisk
		
	;Inhaltsverzeichnis der Diskette lesen
		move.l	#$1e0,d0	;size
		move.l	#2,d1		;starttrack
		move.l	#0,d2		;byteoffset
		lea	_buffer,a0
		lea	$dff000,a6
		jsr	$60394
		
		move.l	#$1e0,d0	;size of directory
		lea	_buffer+8,a0
		moveq	#$1d,d1
.lp		add.l	(a0),d0		;calculate image size
		add.w	#16,a0
		dbf	d1,.lp
		
	;Image lesen
		move.l	#2,d1		;starttrack
		move.l	#0,d2		;byteoffset
		lea	$90000,a0	;***DANGER***
		move.l	a0,a5
		move.l	d0,d5		;size
		move.l	d5,d6
		lea	$dff000,a6
		move.l	#6800*10,d4	;skip

.2		move.l	d4,d0
		cmp.l	d4,d6
		bhi	.1
		move.l	d6,d0
.1		movem.l	d0-a6,-(a7)
		jsr	$60394		;loader is too stupid for large files !!!
		movem.l	(a7)+,d0-a6
		add.l	#10,d1
		add.l	d0,a0
		sub.l	d0,d6
		bne	.2
		
	;speichere Image
		move.l	d5,d0
		lea	_imagename,a0
		move.l	a5,a1
		bsr	_Save
.i		illegal
		
_buffer		ds.b	$1e0
_imagename	dc.b	".diskimage",0,0
	
	ENDC
	
;--------------------------------

_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
		bra	_debug			;coredump & quit
.1
		cmp.b	#$59,d0
		beq	_exit			;exit

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

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

_resload	dc.l	0		;address of resident loader

;--------------------------------
; IN:	a0 = name  a1 = location
; OUT:	d0 = size

_Load		movem.l	d1-d2/a0-a2,-(a7)
		move.l	(_resload),a2
		jsr	(resload_LoadFileDecrunch,a2)
		tst.l	d1
		bne	.err
		tst.l	d0		;filesize = 0 ??
		beq	.err
		movem.l	(a7)+,d1-d2/a0-a2
		rts
.err		move.l	d1,d0
		movem.l	(a7)+,d1-d2/a0-a2
		move.l	a0,-(a7)		;filename
		move.l	d0,-(a7)		;doserror
		move.l	#TDREASON_DOSREAD,-(a7)
		move.l	(_resload),-(a7)
		add.l	#resload_Abort,(a7)
		rts

;--------------------------------
; IN:	d0 = length  a0 = name  a1 = location
; OUT:  d0 = succ

_Save		movem.l	d1-d2/a0-a2,-(a7)
		move.l	(_resload),a2
		jsr	(resload_SaveFile,a2)
		tst.l	d0
		beq	.err
		movem.l	(a7)+,d1-d2/a0-a2
		rts
.err		move.l	d1,d0
		movem.l	(a7)+,d1-d2/a0-a2
		move.l	a0,-(a7)		;filename
		move.l	d0,-(a7)		;doserror
		move.l	#TDREASON_DOSWRITE,-(a7)
		move.l	(_resload),-(a7)
		add.l	#resload_Abort,(a7)
		rts

;--------------------------------
; IN:	d0=offset d1=size d2=disk a0=dest
; OUT:	d0=success

_LoadDisk	movem.l	d0-d2/a0-a2,-(a7)
	IFD logfile
		move.l	_logptr,a2
		movem.l	d0-d2/a0,(a2)
		add.l	#16,_logptr		;NOT pc-relativ !!!
	ENDC
		move.l	(_resload),a2
		jsr	(resload_DiskLoad,a2)
		tst.l	d0
		beq	.err
		movem.l	(a7)+,d0-d2/a0-a2
		moveq	#-1,d0
		rts
		
.err		move.l	d1,-(a7)
		movem.l	(4,a7),d0-d2/a0-a2
		move.l	d2,(4+5*4,a7)		;disk number
		move.l	(a7),(4+4*4,a7)		;doserror
		add.w	#4+4*4,a7
		move.l	#TDREASON_DISKLOAD,-(a7)
		bra	_end
		
	IFD logfile
_log		ds.b	2048
_logptr		dc.l	_log			;NOT pc-relativ !!!
_logname	dc.b	".logfile",0
	EVEN
	ENDC

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

_exit		pea	TDREASON_OK
		bra	_end
_debug		clr.l	-(a7)
		clr.l	-(a7)
		pea	TDREASON_DEBUG
_end
	IFD logfile
		movem.l	d0-d1/a0-a2,-(a7)
		lea	_logname,a0
		lea	_log,a1
		move.l	#_logptr-_log,d0
		move.l	(_resload),a2
		jsr	(resload_SaveFile,a2)
		movem.l	(a7)+,d0-d1/a0-a2
	ENDC
		move.l	(_resload,pc),-(a7)
		add.l	#resload_Abort,(a7)
		rts

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

	END
