;*---------------------------------------------------------------------------
;  :Program.	9finger.asm
;  :Contents.	Slave for "9 finger's" from Spaceballs
;  :Author.	WEPL
;  :History.	13.11.96 - 24.11.96
;		28.11.96 trackloader delay changed ('60)
;  :Requires.	-
;  :Copyright.	Public Domain
;  :Language.	68000 Assembler
;  :Translator.	Barfly V1.131
;  :To Do.
;---------------------------------------------------------------------------*

	INCDIR	Includes:
	INCLUDE	whdload.i
	INCLUDE	graphics/gfxbase.i
	INCLUDE	lvo/exec.i

	OUTPUT	"dwart:9 finger's/9finger.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	$fb000		;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
		
		move.l	#CACRF_EnableI,d0	;enable instruction cache
		move.l	d0,d1    		;mask
		jsr	(resload_SetCACR,a0)

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

 IFEQ 1
	;bootblock
		lea	$1000,a6	;A6 bootblock address
		
		moveq	#0,d0		;offset
		move.l	#2*512,d1	;size
		moveq	#1,d2		;disk
		lea	-12(a6),a0
		bsr	_LoadDisk
		
		moveq	#0,d0
		lea	$80000,a0

		nops	2,$3e(a6)	;exp mem check
		
		patch	$198(a6),_trackload
		patch	$150(a6),_trackload_bad
		
		patch	$148(a6),_1
		jmp	$26(a6)
 ENDC
 
;---------------

_start		lea	$80000,a6	;exp mem
		
		move.l	a6,a0
		moveq	#1,d0
		moveq	#16,d1
		bsr	_trackload
		
		lea	$7fff0,a0
		move.l	a6,(a0)+	;exp mem
		clr.l	(a0)+		;???
		move.w	#-1,(a0)+	;???
		
		lea	$1e00,a7
		
;---------------

_1		jsr	$80008		;decrunch
		lea	$2000,a6	;address of main exe

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

		patch	$5f8(a6),_trackload	;loader
		patch	$4f2(a6),_disk2		;disk 2 check and wait
;	ill	$2b6(a6)
;	ill	$2ce(a6)
;	ill	$2ec(a6)
;	ill	$300(a6)
;	ill	$3fa(a6)
;	ill	$43e(a6)
		patch	$430(a6),_restart
		jmp	(a6)

_restart	lea	_disk,a0
		move.w	#1,(a0)
		move.w	#$7fff-INTF_PORTS,_custom+intena
		move.w	#4*50,d0	;wait n secs
.w		waitvb
		dbf	d0,.w
		bra	_start

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

_disk2		lea	_disk,a0
		addq.w	#1,(a0)
		rts

_disk		dc.w	1

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

;_trackload_bad	addq.w	#1,d1
_trackload	;d0 = starttrack
		;d1 = amount tracks
		;a0 = address
		mulu	#11*512,d0
		mulu	#11*512,d1
		move.w	(_disk),d2
		cmp.l	#200000,d1
		blo	.2
		lsr.l	#1,d1
		bsr	_LoadDisk
		add.l	d1,d0
		add.l	d1,a0

		move.l	d1,-(a7)
		divu	#11*512/18,d1	;wait ca. 18/50 secs per track
.w		waitvb
		dbf	d1,.w
		move.l	(a7)+,d1

.2		bsr	_LoadDisk
		add.l	d1,a0
		rts

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

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