;*---------------------------------------------------------------------------
;  :Program.	megalomania.asm
;  :Contents.	Slave for "MegaLoMania"
;  :Author.	BJ
;  :History.	12.-13.07.96
;		31.12.96 slave version 2, strong rework
;  :Requires.	-
;  :Copyright.	Public Domain
;  :Language.	68000 Assembler
;  :Translator.	Barfly V1.131
;  :To Do.
;---------------------------------------------------------------------------*

install

 	INCDIR	Includes:
	INCLUDE	whdload.i

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

	IFD install
BASEMEM		= $80000
	ELSE
MAXPICSIZE	= 52496
UPMEMGAME	= $92710
BASEMEM		= (UPMEMGAME+MAXPICSIZE+1000+$fff)&$fffff000
	ENDC

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

.base		SLAVE_HEADER		;ws_Security + ws_ID
		dc.w	2		;ws_Version
		dc.w	WHDLF_NoError	;ws_flags
		dc.l	BASEMEM		;ws_BaseMemSize
		dc.l	$400		;ws_ExecInstall
		dc.w	.Start-.base	;ws_GameLoader
		dc.w	.dir-.base	;ws_CurrentDir
		dc.w	0		;ws_DontCache

.dir		dc.b	"data",0,0

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

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

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

	IFD install

	;LMB quitter
		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
	
_d1		lea	_disk1,a0
		bsr	_Picture

		move.w	#INTF_VERTB,_custom+intena
		waitbutton
		move.w	#INTF_SETCLR|INTF_VERTB,_custom+intena

		lea	_wait,a0
		bsr	_Picture

	;Loader laden
		lea	$1000,a0	;adr
		lea	(12,a0),a3			;a3 = bb
		MOVE.L	#$00000400,d1	;size
		MOVE.L	#$00000000,d0	;offset
		sub.l	a1,a1		;taglist
		move.l	(_resload),a2
		jsr	(resload_DiskLoadDev,a2)
		
		move.l	a3,a0
		moveq	#100,d0
		moveq	#0,d1
.add		add.l	(a0)+,d1
		dbf	d0,.add
		cmp.l	#$d979f9f7,d1		;checks for right disk/version ..
		bne	_d1
		
		patch	$ca(a3),_1
		jmp	($18,a3)		;load main
_1
STACK	= $2a000
		lea	STACK,a7

		jsr	$4c72
		bne	_d1
		bsr	_read
		
_d2		lea	_disk2,a0
		bsr	_Picture

		move.w	#INTF_VERTB,_custom+intena
		waitbutton
		move.w	#INTF_SETCLR|INTF_VERTB,_custom+intena

		lea	_wait,a0
		bsr	_Picture
		
		jsr	$4c86
		bne	_d2
		bsr	_read
		bra	_exit
		
_read		move.l	$8798,a0
		add.w	#$302a,a0		;dir
		move.w	$8716,d3		;d3 amount entries
		lea	STACK,a1
		move.l	a1,a3			;a3 actual
		lea	($800,a1),a4		;a4 address
.cp		move.l	(a0)+,(a1)+
		cmp.l	a1,a4
		bne	.cp
		
.next		cmp.l	#"keyd",(a3)
		beq	.skip
		moveq	#8,d0		;function
		move.l	a3,a0		;name
		move.l	a4,a1		;address
		movem.l	d3/a2-a6,-(a7)
		jsr	$78cc
		movem.l	(a7)+,d3/a2-a6
		move.l	d1,d0		;size
		move.l	a3,a0		;name
		move.l	a4,a1		;address
		move.l	(_resload),a2
		jsr	(resload_SaveFile,a2)
		
.skip		add.w	#$20,a3
		subq.w	#1,d3
		bne	.next
		rts

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

_Picture	movem.l	d2-d7/a2-a6,-(a7)

		lea	$dff000,a6		;A6 = _custom
		move.l	(_resload),a5		;A5 = _resload
		lea	$68000,a4		;A4 = Picture start
		moveq	#3,d4			;D4 = Picture depth
		
		move.l	a4,a1
		jsr	(resload_Decrunch,a5)
		
		lea	(.status),a0
		tst.b	(a0)
		bne	.quit
		st	(a0)
		
		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)
		bsr	_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)

		bsr	_waitvb
		move.w	#DMAF_SETCLR|DMAF_MASTER|DMAF_RASTER,(dmacon,a6)
		
.quit		movem.l	(a7)+,d2-d7/a2-a6
		rts

.status		dc.w	0

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

_waitvb		waitvb
		rts

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

_disk1		INCBIN	pics/pic_disk1.bin
_disk2		INCBIN	pics/pic_disk2.bin
_wait		INCBIN	pics/pic_wait.bin
_colors		INCLUDE	pics/pic_colors.i
		
;--------------------------------

	ELSE
		move.l	#CACRF_EnableI,d0
		move.l	d0,d1
		jsr	(resload_SetCACR,a0)
	
		lea	_main,a0
		lea	$4000,a1
		move.l	(_resload),a2
		jsr	(resload_LoadFileDecrunch,a2)

	;	patch	$782c,_cloader	;from cache
		patch	$78cc,_loader	;from disk
		patch	$7818,_gettmp
		patch	$4c72,_retz	;check for disk 1
		patch	$4c86,_retz	;check for disk 2
	;	nops	3,$6bbc		;load "mlm_select" or directory ? (jmp $4c72)
	;	move.w	#$6000,$7592	;exp mem check beq -> bra 1024k
	;	nops	($15c-$84)/2,$7584	;exp mem check 512k
	;	nops	3,$6bd4		;load "mlm_select" or directory ? (jmp $4c72)
		ret	$770e		;preload to cache
		patch	$74c6,_cl
		
	;	ret	$bb34
	;	nops	2,$5f6e
	;	sub.l	#$100,$5e90	;increase temorary stack for toggle rou
		
		jmp	$4000

_cl		move.l	#$ae3b9ce3,d0
		jmp	$7536
_retz
	;clr.l	$86e6
		moveq	#0,d0
		rts

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

_gettmp		lea	UPMEMGAME,a4
		move.l	(a4)+,d7
		cmp.w	d0,d0		;set Z flag
		rts

_loader		bsr	_kinit

		tst.w	d0		;prepare disk access
		beq	.org		;required for cursor busy off
	;	beq	_retz
		cmp.w	#8,d0		;real read file
		beq	.8
		cmp.w	#$18,d0		;get file size, start file read (first block)
		beq	.18
		cmp.w	#$20,d0		;load file, wait for end of disk activity, switch drive off
		beq	.org		;required for cursor busy off

;	bsr	.org
		illegal

	;read file (a0) to address a1 and return size in d1
	;orginal changes d0-d3/a0-a4 !
.8		movem.l	a0-a2,-(a7)
	;	move.w	(_custom+intenar),-(a7)
	;	move.w	(_custom+intreqr),-(a7)
	;	move.w	#$7fff,(_custom+intena)
		move.l	(_resload),a2
		jsr	(resload_LoadFileDecrunch,a2)
	;	move.l	(a7)+,d1
	;	or.w	#INTF_SETCLR,d1
	;	move.w	#$7fff,(_custom+intreq)
	;	move.w	d1,(_custom+intena)
	;	swap	d1
	;	move.w	d1,(_custom+intreq)
		movem.l	(a7)+,a0-a2
		move.l	d0,d1		;size
		moveq	#0,d0		;ZERO means success
		add.l	d1,a1		;end of loaded file
		rts

.18		movem.l	a2-a3,-(a7)
		lea	UPMEMGAME,a3
		lea	(4,a3),a1
		move.l	(_resload),a2
		jsr	(resload_LoadFileDecrunch,a2)
		move.l	d0,(a3)
		move.l	d0,d1		;size
		moveq	#0,d0		;success
		movem.l	(a7)+,a2-a3
		rts
	
.0
.org		tst.w	$b03a
		jmp	$78d2

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

_main		dc.b	"mlm",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	#$50,d0
	bne	.0
	bset	#0,_ciaa+ciacra
	bset	#0,_ciaa+ciacrb
.0
		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

_resload	dc.l	0		;address of resident loader

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

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

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

	END
