;*---------------------------------------------------------------------------
;  :Program.	rc2.asm
;  :Contents.	Slave for "RoboCop 2"
;  :Author.	BJ
;  :History.	20.05.96
;		23.-31.03.97 rework for install slave
;  :Requires.	-
;  :Copyright.	Public Domain
;  :Language.	68000 Assembler
;  :Translator.	Barfly V1.131
;  :To Do.
;---------------------------------------------------------------------------*

install

	INCDIR	Includes:
	INCLUDE	lvo/exec.i
	INCLUDE	devices/trackdisk.i
	INCLUDE	exec/io.i
	INCLUDE	whdload.i

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

;disk-format: 12 sec/track

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

.base		SLAVE_HEADER		;ws_Security + ws_ID
		dc.w	2		;ws_Version
		dc.w	WHDLF_NoError	;ws_flags
		dc.l	$80000		;size of mem required by game
		dc.l	$400		;address in BaseMem where space is for a fake ExecLibrary
					;installed by the Loader to survive a RESET
					;for example $400, required are 84 Bytes
		dc.w	_Start-.base	;start of resident loader
					;must 100% pc-relative (HD-Loader will move this
					;outside BaseMem)
					;will called in SuperVisor mode
		dc.w	.dir-.base	;directory in which the mainloader should search for files
		dc.w	0		;pattern file without caching

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

;======================================================================
_Start	;	A0 = resident loader
;======================================================================

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

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

	IFD install
	
	;install keyboard quitter
		lea	(.int2),a0
		move.l	a0,$68				;set vector
		lea	(_ciaa),a1
	;	move.b	#~(CIAICRF_SETCLR),(ciaicr,a1)
		move.b	#CIAICRF_SETCLR|CIAICRF_SP,(ciaicr,a1)	;allow ints from keyboard
		tst.b	(ciaicr,a1)			;clear all intreq
		and.b	#~(CIACRAF_SPMODE),(ciacra,a1)	;input mode
		move.w	#INTF_PORTS,(intreq+_custom)
		move.w	#INTF_SETCLR|INTF_INTEN|INTF_PORTS,(intena+_custom)
		bra	.int2_after
.int2		movem.l	d0/a1,-(a7)
		lea	(_ciaa),a1
		btst	#CIAICRB_SP,(ciaicr,a1)		;check int reason
		beq	.int2_exit
		move.b	(ciasdr,a1),d0			;read code
		clr.b	(ciasdr,a1)			;output LOW (handshake)
		or.b	#CIACRAF_SPMODE,(ciacra,a1)	;to output
		not.b	d0
		ror.b	#1,d0
		cmp.b	#$45,d0		;ESC
		beq	_exit
		cmp.b	#$59,d0		;F10
		beq	_exit
		cmp.b	#$58,d0		;F9
		bne	.int2_1
		movem.l	(a7)+,d0/a1
		move.w	(a7),(6,a7)	;sr
		move.l	(2,a7),(a7)	;pc
		clr.w	(4,a7)		;ext.l sr
		bra	_debug		;coredump & quit
.int2_1		move.b	#-1,(ciasdr,a1)			;output HIGH (handshake)
		and.b	#~(CIACRAF_SPMODE),(ciacra,a1)	;to input
.int2_exit	move.w	#INTF_PORTS,(intreq+_custom)
		movem.l	(a7)+,d0/a1
		rte
.int2_after

_d1		lea	_disk1,a0
		bsr	_Picture

		bsr	_waitbutton

		lea	_wait,a0
		bsr	_Picture

	;build simple exec
		lea	$2000,a6	;execbase/graphicsbase
		move.l	a6,4
		patch	_LVODoIO(a6),.doio
		patch	_LVOAllocMem(a6),.allocmem
		bra	.go
.doio		cmp.w	#TD_MOTOR,(IO_COMMAND,a1)
		beq	.ret
	;	cmp.w	#CMD_READ,(IO_COMMAND,a1)
	;	bne	.ret
		move.l	(IO_DATA,a1),d0
		add.l	#511,d0
		and.l	#~511,d0
		move.l	d0,a0			;destination
		move.l	(IO_OFFSET,a1),d0	;offset
		move.l	(IO_LENGTH,a1),d1	;size
		movem.l	a0-a2,-(a7)
		sub.l	a1,a1			;taglist
		move.l	(_resload),a2
		jsr	(resload_DiskLoadDev,a2)
		movem.l	(a7)+,a0-a2
		move.l	(IO_LENGTH,a1),d0
		move.l	(IO_DATA,a1),a1
.copy		move.b	(a0)+,(a1)+
		subq.l	#1,d0
		bne	.copy
.ret		rts
.allocmem	move.l	#$4000,d0
		rts
.go
	;Loader laden
		lea	$2000,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)

		patch	$1f2(a3),_1
		lea	$400,a1		;ioreq
		jmp	(a3)		;execute bb
_1
	;move loader to $400
		lea	$bf40+$6c,a0
		lea	$400,a1
		move.l	a1,a3		;a3 = loader
		move.w	#$1400/4,d0
.cp		move.l	(a0)+,(a1)+
		dbf	d0,.cp
		
	;reinit
		lea	_wait,a0
		bsr	_Picture
		lea	_custom+2,a6	;a6
		move.w	#INTF_SETCLR|INTF_INTEN|INTF_PORTS,(intena-2,a6)
	;	move.w	#0,(dsklen-2,a6)
	;	move.w	#DMAF_SETCLR|DMAF_DISK,(dmacon-2,a6)
	;	jsr	($4c0,a3)	;reset survive
	;	jsr	($4f2,a3)	;vector table
		move.w	#$6700,($250,a3)	;loader doesnt wait for disk finish
		jsr	($556,a3)	;cia init
		jsr	($5b4,a3)	;cia init
		move.b	#CIAICRF_SETCLR|CIAICRF_SP,(ciaicr+_ciaa)	;allow ints from keyboard
		
		lea	$5000,a6	;A6 = destination
		lea	$4c00,a5	;A5 = directory
		move.l	_resload,a4	;A4 = resload
		
		bsr	_ripdisk
		
.again		lea	_disk2,a0
		bsr	_Picture
		bsr	_waitbutton
		lea	_wait,a0
		bsr	_Picture

		lea	_disk2id,a0
		st	(a0)
		lea	$4c00,a5	;A5 = directory
		bsr	_ripdisk
		beq	.again
		bra	_exit
		
_ripdisk
	;get first file & directory
		lea	_dn,a0		;first file name
		move.l	a6,a1		;dest
		movem.l	a3-a6,-(a7)
		jsr	($2a,a3)	;load first & init a4-a6
		move.l	(a7),a3
		jsr	($44c,a3)	;drive on
		move.w	#$3d0,d0	;disk-offset
		jsr	($1e0,a3)
		lea	$45e8,a0
		move.l	(8,a7),a1
		moveq	#512/4-1,d0
.dc1		move.l	(a0)+,(a1)+
		dbf	d0,.dc1
		move.w	#$3d1,d0	;disk-offset
		jsr	($1e0,a3)
		lea	$45e8,a0
		move.l	(8,a7),a1
		add.w	#$200,a1
		moveq	#512/4-1,d0
.dc2		move.l	(a0)+,(a1)+
		dbf	d0,.dc2
		jsr	($456,a3)	;drive off
		movem.l	(a7)+,a3-a6
		
		move.b	(_disk2id),d0
		beq	.next
		cmp.b	#2,(a6)
		beq	.next
		moveq	#0,d0		;wrong disk
		rts

	;get all files
.next		lea	(2,a5),a0	;name
		cmp.l	#"DN"<<16,(a0)
		beq	.skip
		move.b	(_disk2id),d0
		beq	.2
		cmp.l	#"AMIG",(a0)	;skip
		beq	.skip
		cmp.l	#"HI1"<<8,(a0)
		beq	.skip
		cmp.l	#"MU1"<<8,(a0)
		beq	.skip
		cmp.l	#"PIC9",(a0)
		beq	.skip
		cmp.l	#"PUZL",(a0)
		beq	.skip
.2		move.l	a6,a1		;dest
		movem.l	a3-a6,-(a7)
		jsr	($2a,a3)
		movem.l	(a7)+,a3-a6
		move.l	($18,a5),d0	;size
		lea	(2,a5),a0	;name
		move.l	a6,a1		;address
		move.b	(_disk2id),d1
		beq	.3
		cmp.l	#"FRNG",(a0)
		bne	.3
		move.b	#"2",(4,a0)	;rename FRNG -> FRNG2
.3		jsr	(resload_SaveFile,a4)
.skip		add.w	#$20,a5
		tst.b	(2,a5)
		bne	.next
		moveq	#-1,d0
		rts
		
_dn		dc.b	"DN",0
_disk2id	dc.b	0		;if working on disk 2 = true

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

_waitbutton	waitbutton
		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	(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

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

_waitvb		waitvb
		rts

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

_disk1		INCBIN	pics/pic_disk1.bin
_disk2		INCBIN	pics/pic_disk2.bin
_wait		INCBIN	pics/pic_waitesc.bin
_colors		INCLUDE	pics/pic_colors.i
		
;======================================================================

	ELSE
	
;======================================================================

	;	move.l	#CACRF_EnableI,d0
	;	move.l	d0,d1
	;	move.l	(_resload),a0
	;	jsr	(resload_SetCACR,a0)
	
		lea	_amiga,a0
		lea	$8000,a1
		move.l	(_resload),a2
		jsr	(resload_LoadFileDecrunch,a2)
		
		lea	_amiga1,a0
		jsr	(resload_GetFileSize,a2)
		tst.l	d0
		beq	.nohighs
		lea	_amiga1,a0
		lea	$8000+$9e68,a1
		jsr	(resload_LoadFileDecrunch,a2)
		bsr	_crypt
.nohighs
		patch	$8000+$9fb8,_highscore	;highscore
		patch	$3d9c+$8000,_bltclr	;bug
		move.w	#$8380,$119a0		;bug
		lea	_loader,a0		;loader
		move.l	a0,$44
		patch	$821a+$8000,_keyboard
		ret	$9a60+$8000		;disk check
	;	ill	$9ab6+$8000
		patch	$9d20+$8000,_cop	;picture bug
	
	;	ill	$2b0+$8000

	IFEQ 1
		lea	_custom,a6
		move.w	#$3081,(diwstrt,a6)
		move.w	#$30c1,(diwstop,a6)
		move.w	#$3c,(ddfstrt,a6)
		move.w	#$d4,(ddfstop,a6)
		
		move.l	#$1800000,$300
		move.l	#-2,$304		;coplist
		move.l	#$300,(cop1lc,a6)
		tst.w	(copjmp1,a6)
		move.w	#$8280,(dmacon,a6)	;enable copper
	ENDC
	
	;otherwise strange exception
		lea	$400,a0
.clr		clr.l	(a0)+
		cmp.l	#$500,a0
		bne	.clr

		jmp	$808a

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

_cop		move.w	#$1a6b,$121ac		;diwstrt
	;	move.w	#$39ff,$121b0		;diwstop

.1		move.w	(a0)+,(a1)
		addq.l	#4,a1
		dbf	d0,.1
.l	;	move.w	#50,d0
	;	waitvb
	;	dbf	d0,.l
		rts

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

_highscore	subq.w	#1,d6
		cmp.w	#-1,d6
		beq	.1
		jmp	$9f80+$8000
.1		movem.l	d0-d1/a0-a2,-(a7)
		bsr	_crypt
		move.l	#120,d0
		lea	_amiga1,a0
		lea	$8000+$9e68,a1
		move.l	(_resload),a2
		jsr	(resload_SaveFile,a2)
		bsr	_crypt
		movem.l	(a7)+,d0-d1/a0-a2
		rts

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

_crypt		lea	$8000+$9e68,a0
		moveq	#120-1,d0
.lp		eor.b	d0,(a0)+
		dbf	d0,.lp
		rts

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

_keyboard	cmp.b	#$50,d0		;F1 ?
		beq	.f1
		CMP.B	#$45,D0		;ESC ?
		BEQ.B	_exit
		move.b	d0,$8032
		jmp	$8220+$8000

.f1		move.l	(a7)+,a0
		move.w	(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

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

_loader		move.l	a2,-(a7)
		move.l	a1,d1
		bne	.load

		move.b	(a0)+,d1
		lsl.w	#8,d1
		move.b	(a0)+,d1
		swap	d1
		move.b	(a0)+,d1
		lsl.w	#8,d1
		move.b	(a0)+,d1
		subq.l	#4,a0		;restore name
		lea	(.adrs),a2
.chk		move.l	(a2)+,a1	;destination
		cmp.l	(a2)+,d1
		bne	.chk
		
		cmp.l	#"FRNG",d1
		bne	.load
		cmp.w	#1,$8052	;disk ?
		beq	.load
		lea	.frng2,a0
		move.l	#$1ea00,a1
		
.load		move.l	(_resload),a2
		jsr	(resload_LoadFileDecrunch,a2)

		move.l	(a7)+,a2
		waitvb
		rts

		;load-address , name
.adrs		dc.l	$58850,"PERM"
		dc.l	$4b68a,"SPER"
		dc.l	$28000,"DATA"
		dc.l	$17100,"PUZL"
		dc.l	$1e980,"FRNG"
		dc.l	$45250,"MADE"

.frng2		dc.b	"FRNG2",0
		
;--------------------------------

_bltclr		tst.w	d0
		bne	.ok
		cmp.l	#$60000,a0
		blo	.ok
	illegal
.ok		tst.w	(a6)
.w1		BTST	#6,(A6)
		BNE.B	.w1
		MOVE.L	#$01000000,$003E(A6)
		MOVE.W	D1,$0064(A6)
		MOVE.L	A0,$0052(A6)
		move.w	#$83c0,$94(a6)
		MOVE.W	D0,$0056(A6)
		tst.w	(a6)
		tst.w	(a6)
L_3DB6		BTST	#6,(A6)
		BNE.B	L_3DB6
		RTS

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

_amiga		dc.b	"AMIGA",0
_amiga1		dc.b	"AMIGA1",0
	EVEN

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

	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
;======================================================================

	END
