;*---------------------------------------------------------------------------
;  :Program.	stateoftheart.asm
;  :Contents.	Slave for "State of the art" from Spaceballs
;  :Author.	WEPL
;  :History.	26.11.96
;		30.12.96 blitter bug causing missing first sequence fixed
;  :Requires.	-
;  :Copyright.	Public Domain
;  :Language.	68000 Assembler
;  :Translator.	Barfly V1.131
;  :To Do.
;---------------------------------------------------------------------------*

	INCDIR	Includes:
	INCLUDE	whdload.i

	OUTPUT	"dwart:stateoftheart/stateoftheart.slave"
	BOPT	O+ OG+			;enable optimizing
	BOPT	w4-			;disable 64k warnings
	SUPER

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

.base		SLAVE_HEADER		;ws_Security + ws_ID
		dc.w	1		;ws_Version
		dc.w	WHDLF_Disk	;ws_flags
		dc.l	$fc000		;ws_BaseMemSize
		dc.l	$400		;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)			;save for later use
		
;---------------

_start		lea	$600,a7		;stackpointer
		lea	_custom,a6	;A6 = custom

		CLR.L	$100(a6)

L_74		MOVE.W	#$0FFF,$00020292.L
		MOVE.W	#$0,$0007FFF0.L
		LEA	L_2C0(PC),A0
		lea	$400,a1
		MOVE.L	A1,$080(a6)
		move.l	(a0)+,(a1)+
		move.l	(a0)+,(a1)+
		move.l	(a0)+,(a1)+
		move.l	(a0)+,(a1)+
		tst.w	$88(a6)
		MOVE.W	#-$7C40,$096(a6)
L_9C		BTST	#$000E,2(a6)
		BNE.B	L_9C
	;this stuff let the blitter hang ??
	;	MOVE.L	#$01000000,$040(a6)
	;	MOVE.L	#$FFFFFFFF,$044(a6)
	;	MOVE.W	#0,$066(a6)
	;	MOVE.L	#$00060000,$054(a6)
	;	MOVE.W	#-1,$058(a6)
;	move.w	#65,_custom+bltsize

		MOVEA.L	#$0003EC00,A0
		MOVE.W	#0,D0
		MOVEQ	#2,D1
		bsr	_trackload

		lea	$3f000,a6
		
		move.l	a6,a0
		lea	($400,a0),a1
		moveq	#0,d0
.add		add.l	(a0)+,d0
		cmp.l	a0,a1
		bne	.add
		cmp.l	#$665f435c,d0		;the install works with the 1MB ChipMem version only !!!
		bne	_exit
		
		patch	$d4(a6),_trackload
		patch	$e4(a6),_trackload

		patch	$2ce(a6),_part2

	;init keyboard
		bsr	_KeyboardInit
;		and.w	#~INTF_PORTS,$dc0(a6)	;preserve int on

		move.w	#65,_custom+bltsize
		jmp	(a6)

L_2C0		DC.W	$109	;bplmod ?
		DC.W	-2
		DC.W	$180	;color00
		DC.W	$FFF
		DC.W	$100	;bplcon0
		DC.W	$200
		DC.W	-1
		DC.W	-2

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

_part2		lea	$52000,a6
		and.w	#~INTF_PORTS,$826(a6)	;preserve int on
		patch	$53a(a6),_trackload
		patch	$4c(a6),_part3
		jmp	(a6)

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

_part3		lea	$3e000,a6
		and.w	#~INTF_PORTS,$4d2(a6)	;preserve int on
		move.w	#INTF_VERTB,$260(a6)	;otherwise masterint will disabled
		patch	$48(a6),_trackload
		patch	$58(a6),_trackload
		patch	$2da(a6),_part4
		jmp	$12(a6)

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

_part4		lea	$50000,a6
		patch	$80(a6),_trackload
		patch	$26a(a6),_part5
	;music system at $1000
		and.w	#~INTF_PORTS,$102e	;preserve int on
		jmp	(a6)

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

_part5		lea	$40000,a6
		patch	$cda(a6),_trackload
		patch	$226(a6),_part6
		jmp	$1fa(a6)

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

_part6		lea	$45000,a6
		patch	$b4(a6),_trackload
		patch	$c4(a6),_trackload
		patch	$7a(a6),_part7
		jmp	(a6)

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

_part7		lea	$50000,a6
		patch	$128(a6),_trackload
		patch	$88(a6),_part8
		jmp	(a6)

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

_part8		lea	$40000,a6
		patch	$ce(a6),_trackload
		patch	$88(a6),_part9
		jmp	(a6)

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

_part9		lea	$50000,a6
		patch	$248(a6),_part10
		jmp	$1fa(a6)

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

_part10		lea	$45000,a6
		patch	$8e(a6),_trackload
		patch	$282(a6),_part11
		jmp	$12(a6)

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

_part11		lea	$50000,a6
		patch	$b0(a6),_trackload
		patch	$86(a6),_part12
		jmp	(a6)

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

_part12		lea	$40000,a6
		patch	$a2(a6),_trackload
		patch	$78(a6),_part13
		jmp	(a6)

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

_part13		lea	$4c000,a6
		patch	$4e(a6),_trackload
		patch	$23a(a6),_part14
		jmp	(a6)

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

_part14		lea	$40000,a6
		patch	$a0(a6),_trackload
		patch	$86(a6),_part15
		jmp	(a6)

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

_part15		lea	$4f000,a6
		patch	$1c8(a6),_trackload
		patch	$1d8(a6),_trackload
		patch	$82(a6),_part16
		jmp	(a6)

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

_part16		lea	$40000,a6
		move.w	#$4e40,$f0(a6)	;trap #0
		lea	_restart,a0
		move.l	a0,$80		;trap #0
		jmp	$12(a6)

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

_restart	waitvb
		move.w	#INTF_SETCLR|INTF_INTEN|INTF_PORTS,_custom+intena
		move.w	#INTF_PORTS,_custom+intreq
		move.w	#5*50,d0	;wait n secs
.w		waitvb
		dbf	d0,.w
		move.w	#$7fff,_custom+dmacon
		move.w	#$7fff,_custom+intena
		bra	_start

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

_trackload	;d0 = starttrack
		;d1 = amount tracks
		;a0 = address
		mulu	#11*512,d0	;offset
		mulu	#11*512,d1	;size
		moveq	#1,d2		;disk
		bsr	_LoadDisk
		add.l	d1,a0

	IFEQ 1
		divu	#11*512/18,d1	;wait ca. 18/50 secs per track
.w		waitvb
		dbf	d1,.w
	ENDC
		
		move.w	#INTF_SETCLR|INTF_INTEN|INTF_PORTS,_custom+intena
		rts

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

_KeyboardInit	lea	_IntLevel2,a0
		move.l	a0,$68
		move.b  #CIAICRF_SP,(ciaicr+_ciaa)      ;nur tastatur
		move.w  #INTF_SETCLR|INTF_INTEN|INTF_PORTS,(intena+_custom)
		move.b  #~%00000011,(ciapra+_ciaa)
		move.w  #INTF_PORTS,(intreq+_custom)
		rts

_IntLevel2	movem.l d0/a1,-(a7)
		lea     (_ciaa),a1
		btst    #CIAICRB_SP,(ciaicr,a1)
		beq     .exit
                
		moveq   #0,d0
		move.b  (ciasdr,a1),d0               ;read ~(raw-code)

		clr.b   (ciasdr,a1)                  ;ausgabe LOW
		or.b    #CIACRAF_SPMODE,(ciacra,a1)  ;auf ausgabe
        
		not.b   d0
		ror.b   #1,d0
		bmi     .keyup

; RAW-Key-Codes:
;	ESC	$45
;	DEL	$46
;	F1..F10	$50..$59
;	HELP	$5f

.keydown	cmp.b	#$58,d0
		bne	.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
.1
		cmp.b	#$45,d0
		beq	_exit			;exit
		cmp.b	#$59,d0
		beq	_exit			;exit

.keyup
.done		move.b  #-1,(ciasdr,a1)              ;ausgabe HIGH
		and.b   #~(CIACRAF_SPMODE),(ciacra,a1);wieder auf eingabe

.exit		move.w  #INTF_PORTS,(intreq+_custom)
		movem.l (a7)+,d0/a1
		rte

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

_resload	dc.l	0		;address of resident loader

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

_LoadDisk	movem.l	d0-d2/a0-a2,-(a7)
		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)
		move.l	(_resload),-(a7)
		add.l	#resload_Abort,(a7)
		rts

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

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

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

	END
