


;*-----------------T------------T----------------------------------------T------T-------T-------T-------T
;*
;* (C)opyright 1997 by Sunbeam/Shelter.
;*
;* Date     : .06.97
;* Assembler: SNMA, PhxAss
;* Includes : 40.15+
;* Font     : thinpaz/8
;*-------------------------------------------------------------------------------------------------------

STOP	EQU	1	;scroll stop flag in text
SCROLLSTOP	EQU	70	;scroll stop delay
SCROLLDELAY	EQU	2	;scroll blit delay
FLASHDELAY	EQU	1	;yellow-flash delay
MOUSEDELAY	EQU	35	;mouse-barmove delay
MOUSEMASK	EQU	%1111000000000000
		;YYYYYYYYXXXXXXXX

	INCLUDE	"hardinc.i"
	INCLUDE	"exec/execbase.i"
	INCLUDE	"exec/memory.i"
	INCLUDE	"dos/dosextens.i"
	INCLUDE	"hardware/dmabits.i"
	INCLUDE	"hardware/intbits.i"
	INCLUDE	"graphics/gfxbase.i"
	INCLUDE	"lvo/exec.i"
	INCLUDE	"lvo/graphics.i"

	structure	VBASE,0	;types.i emulated!
	  long	WBStartup
	  long	VectorBase
	  long	GraphicsBase
	  long	viewSave     ;loadview save
	  long	level3Save   ;autolevel3 save
	  long	customSave   ;dmacon&intena save
	  long	Bitplane
	  word	ColCount     ;yellow-flash color counter
	  word	TrainLineNum ;active trainer line (0,1...)
	  word	MousePos     ;y-mouse position
	  byte	MouseDelay
	  byte	FlashDelay
	  byte	ScrollDelay
	  byte	ScrollStop
	  word	ScrollPos
	label	VBase_SIZEOF

	SECTION	MAIN,CODE

;*-------------------------------------------------------------------------------------------------------
;* Startup Code
;*-------------------------------------------------------------------------------------------------------

Main	lea	VBase(pc),a5	;handle workbench/shell startup
	move.l	SysBase.w,a6
	move.l	ThisTask(a6),a4
	tst.l	pr_CLI(a4)
	bne.s	ShellStart

	lea	pr_MsgPort(a4),a0
	CALL	WaitPort
	lea	pr_MsgPort(a4),a0
	CALL	GetMsg
	move.l	d0,WBStartup(a5)

ShellStart	moveq	#OS204,d0	;check system
	cmp.w	LIB_VERSION(a6),d0
	bgt	SysFail
	btst	#AFB_68020,AttnFlags+1(a6)
	beq	SysFail
	lea	custom,a4
	move.w	deniseid(a4),d0
	cmp.b	#$F8,d0
	bne	SysFail

	move.l	a5,-(sp)
	lea	VBRCode-VBase(a5),a5	;get vectorbase
	CALL	Supervisor
	move.l	(sp)+,a5
	move.l	d0,VectorBase(a5)
	move.l	d0,a0
	move.l	tp_Trap0(a0),-(sp)	;entering supervisor mode
	lea	TrapCode-VBase(a5),a1
	move.l	a1,tp_Trap0(a0)
	trap	#CT_TRAP0
	move.l	VectorBase(a5),a0
	move.l	(sp)+,tp_Trap0(a0)
	rts

;*-------------------------------------------------------------------------------------------------------
;* Hardware Inits
;*-------------------------------------------------------------------------------------------------------

TrapCode	lea	GraphicsName-VBase(a5),a1	;open graphics.library
	CALL	OldOpenLibrary
	move.l	d0,GraphicsBase(a5)
	beq	SysFailSV
	move.l	d0,a6
	move.l	gb_ActiView(a6),viewSave(a5)

	move.l	Main-4-VBase(a5),a3	;init bitplane ptr's
	add.l	a3,a3
	add.l	a3,a3
	addq.w	#4,a3
	lea	BitplanePtr-CoppList(a3),a0
	lea	BitplaneR-CoppList(a3),a1
	move.l	a1,Bitplane(a5)
	move.l	a1,d0
	moveq	#8-1,d1
	move.l	#640*256/8,d2
InitBplLoop	move.w	d0,6(a0)
	swap	d0
	move.w	d0,2(a0)
	swap	d0
	add.l	d2,d0
	addq.w	#2*4,a0
	dbra	d1,InitBplLoop

	sub.l	a1,a1	;reset screen
	CALL	LoadView
	CALL	WaitTOF
	CALL	WaitTOF
	move.l	SysBase.w,a6
	moveq	#VBF_PAL,d0
	cmp.b	VBlankFrequency(a6),d0
	beq.s	IsPAL
	move.w	#%0000000000100000,beamcon0(a4)

IsPAL	addq.b	#1,TDNestCnt(a6)	;stop multitasking
	or.w	#1<<6,SysFlags(a6)
	CALL	Disable

	move.w	joy0dat(a4),d0	;pre-init vars
	and.w	#MOUSEMASK,d0
	move.w	d0,MousePos(a5)
	move.b	#FLASHDELAY,FlashDelay(a5)
	move.b	#MOUSEDELAY,MouseDelay(a5)
	move.b	#SCROLLDELAY,ScrollDelay(a5)

	move.w	dmaconr(a4),d0	;init custom chips / irq
	swap	d0
	move.w	intenar(a4),d0
	or.l	#$80008000,d0
	move.l	d0,customSave(a5)
	move.l	#$7fff7fff,d0
	move.w	d0,dmacon(a4)
	move.l	d0,intena(a4)

	move.l	VectorBase(a5),a0
	move.l	tp_AutoLevel3(a0),level3Save(a5)
	lea	Level3IRQ-VBase(a5),a1
	move.l	a1,tp_AutoLevel3(a0)

	move.w	#DMAF_SETCLR!DMAF_COPPER!DMAF_RASTER!DMAF_MASTER!DMAF_AUDIO!DMAF_BLITTER,dmacon(a4)
	move.w	#INTF_SETCLR!INTF_INTEN!INTF_VERTB,intena(a4)
	move.l	a3,cop1lc(a4)
	clr.w	copjmp1(a4)

	lea	mt_data-CoppList(a3),a0
	bsr	mt_init
	lea	MainString-VBase(a5),a0
	bsr	Print
	lea	ciaa,a6

;*-------------------------------------------------------------------------------------------------------
;* Main Loop
;*-------------------------------------------------------------------------------------------------------

Wait	cmp.b	#255,vhposr(a4)
	bne.s	Wait
	bsr.s	CheckMouse	;check mouse moves
	bsr	GetKey	;keyboard handler
	moveq	#KEY_UP,d1
	cmp.b	d1,d0
	beq	CLineUp
	moveq	#KEY_DOWN,d1
	cmp.b	d1,d0
	beq	CLineDown
	moveq	#KEY_LEFT,d1
	cmp.b	d1,d0
	beq	MenuToggleOn
	moveq	#KEY_RIGHT,d1
	cmp.b	d1,d0
	beq	MenuToggleOff
	btst	#CIAB_GAMEPORT0,(a6)	;check toggle on/off
	beq	MenuToggleOn
	btst	#2,potinp(a4)
	beq	MenuToggleOff
	bra.s	Wait

Level3IRQ	move.w	#INTF_VERTB,intreq(a4)
	bsr	mt_music
	bsr.s	FlashLine
	bsr	ScrollText
	rte

;*-------------------------------------------------------------------------------------------------------
;* Trainer Handler
;*-------------------------------------------------------------------------------------------------------

FlashLine	subq.b	#1,FlashDelay(a5)	;flash actual line
	bne.s	1$
	move.b	#FLASHDELAY,FlashDelay(a5)
	move.w	ColCount(a5),d0
	lea	TrainCols-VBase(a5),a0
	lea	TrainLinesCOP-CoppList(a3),a1
	add.w	TrainPos-VBase(a5),a1
	move.w	(a0,d0.w*2),(a1)	;set color from table
	lea	ColCount(a5),a0
	addq.w	#1,(a0)
	moveq	#30,d0
	cmp.w	(a0),d0
	bne.s	1$
	clr.w	(a0)
1$	rts


CheckMouse	subq.b	#1,MouseDelay(a5)	;check mouse Y-moves
	bne.s	1$
	move.b	#MOUSEDELAY,MouseDelay(a5)
	move.w	joy0dat(a4),d0
	and.w	#MOUSEMASK,d0
	cmp.w	MousePos(a5),d0
	bgt.s	MLineDown
	blt.s	MLineUp
1$	rts


MLineUp	move.w	d0,MousePos(a5)
	bra.s	LineUp	;mouse controlled
MLineDown	move.w	d0,MousePos(a5)
	bra.s	LineDown
CLineDown	bsr.s	LineDown	;cursor controlled
	bra	Wait
CLineUp	bsr.s	LineUp
	bra	Wait


LineUp	move.w	TrainLineNum(a5),d0	;move bar up/down
	beq.s	NoLineMove
	subq.w	#1,d0
	bra.s	SetColor
LineDown	move.w	TrainLineNum(a5),d0
	addq.w	#1,d0
SetColor	lea	TrainLines-VBase(a5),a0
	moveq	#-1,d1
	cmp.w	(a0,d0.w*2),d1	;check end/begin of line table
	beq.s	NoLineMove
	move.w	d0,TrainLineNum(a5)
	lea	TrainLinesCOP-CoppList(a3),a1
	add.w	TrainPos-VBase(a5),a1
	clr.w	(a1)	;set old text color
	move.w	(a0,d0.w*2),TrainPos-VBase(a5)	;set new active line
NoLineMove	rts


MenuToggleOn	cmp.w	#TLine9,TrainPos-VBase(a5)	;toggle on/off (lmb/rmb)
	beq.s	Quit
	move.w	TrainLineNum(a5),d0
	lea	TrainArray(pc,d0.w),a0
	st	(a0)
PrintToggle	move.l	PosArray(pc,d0.w*4),d0
	bsr	PrintOption
	bra	Wait

MenuToggleOff	cmp.w	#TLine9,TrainPos-VBase(a5)
	beq	Wait
	move.w	TrainLineNum(a5),d0
	lea	TrainArray(pc,d0.w),a0
	clr.b	(a0)
	bra.s	PrintToggle

TrainArray			;train options sorted from text array
Lives	dc.b	0
Energy	dc.b	0
Time	dc.b	0
Bombs	dc.b	0
PosArray	dc.l	3*(80*7)+80*3+51	;toggle string positions
	dc.l	4*(80*7)+80*3+80+51	;(last + is line column!)
	dc.l	5*(80*7)+80*3+80+80+51
	dc.l	6*(80*7)+80*3+80+80+80+51
	dc.w	-1
TrainLines	dc.w	TLine4,TLine5,TLine6,TLine7,TLine9,-1	;available trainer lines
TrainPos	dc.w	TLine4	;active line on start

;*-------------------------------------------------------------------------------------------------------
;* Quit
;*-------------------------------------------------------------------------------------------------------

Quit	move.w	#$7fff,intena(a4)
	move.l	VectorBase(a5),a0
	move.l	level3Save(a5),tp_AutoLevel3(a0)
	bsr	mt_end
	move.l	GraphicsBase(a5),a6
	move.l	gb_copinit(a6),cop1lc(a4)
	move.w	customSave(a5),dmacon(a4)
	move.w	customSave+2(a5),intena(a4)
	move.l	GraphicsBase(a5),a6
	move.l	viewSave(a5),a1
	CALL	LoadView
	move.l	a6,a1
	move.l	SysBase.w,a6
	CALL	CloseLibrary
	subq.b	#1,TDNestCnt(a6)
	and.w	#%1111111110111111,SysFlags(a6)
	CALL	Enable
SysFailSV	bsr.s	SysFail
	rte		;supervisor mode!

SysFail	move.l	WBStartup(a5),d0
	beq.s	1$
	move.l	d0,a1
	addq.b	#1,IDNestCnt(a6)
	JUMP	ReplyMsg
1$	moveq	#0,d0
	rts

;*-------------------------------------------------------------------------------------------------------
;* Misc Routines
;*-------------------------------------------------------------------------------------------------------

Print	movem.l	d0-d3/a0-a3,-(sp)	;a:a0=strptr
	move.l	Bitplane(a5),a1
	lea	14*(80*7)(a1),a1
	move.l	Bitplane(a5),a3
	lea	640*256/8(a3),a3
	lea	(13*(80*7))+80*8(a3),a3
	moveq	#0,d2	;char counter
PrintLoop	moveq	#0,d1
	move.b	(a0)+,d1
	beq.s	PrintDone
	moveq	#9,d3
	sub.b	d3,d1
	bne.s	NoTab
	moveq	#8-1,d0
	moveq	#0,d1
MakeTab	bsr.s	PrintChar
	dbra	d0,MakeTab
	bra.s	PrintLoop
NoTab	subq.b	#1,d1
	bne.s	NoLinefeed
	lea	80*7(a1),a1
	lea	80*7(a3),a3
	moveq	#80,d3
	sub.w	d2,d3
	add.w	d3,a1
	add.w	d3,a3
	moveq	#0,d2
	bra.s	PrintLoop
NoLinefeed	moveq	#32-9-1,d3
	sub.b	d3,d1
	pea	PrintLoop-VBase(a5)
PrintChar	lsl.l	#3,d1
	lea	Font-VBase(a5),a2
	add.l	d1,a2
	moveq	#8-1,d1
	movem.l	a1/a3,-(sp)
1$	move.b	(a2),(a3)
	move.b	(a2)+,(a1)
	lea	80(a1),a1
	lea	80(a3),a3
	dbra	d1,1$
	movem.l	(sp)+,a1/a3
	addq.w	#1,a1
	addq.w	#1,a3
	addq.w	#1,d2
	rts
PrintDone	movem.l	(sp)+,d0-d3/a0-a3
	rts


PrintOption	movem.l	d0-d3/a0-a3,-(sp)	;a:a0=trainoption, d0=print pos
	tst.b	(a0)
	beq.s	1$
	lea	OnString-VBase(a5),a0
	bra.s	2$
1$	lea	OffString-VBase(a5),a0
2$	move.l	Bitplane(a5),a1
	lea	14*(80*7)(a1),a1
	add.l	d0,a1
	move.l	Bitplane(a5),a3
	lea	640*256/8(a3),a3
	lea	(13*(80*7))+80*8(a3),a3
	add.l	d0,a3
	moveq	#3-1,d0
	moveq	#32,d3
3$	moveq	#0,d1
	move.b	(a0)+,d1
	sub.b	d3,d1
	bsr.s	PrintChar
	dbra	d0,3$
	movem.l	(sp)+,d0-d3/a0-a3
	rts


GetKey	move.b	ciaicr(a6),d0	;r:d0=rawkey
	btst	#CIAICRB_SP,d0
	bne.s	1$
	btst	#CIAICRB_TA,d0
	beq.s	2$
	move.b	#CIACRAF_RUNMODE,ciacra(a6)
	rts
1$	move.b	ciasdr(a6),d0
	ror.b	#1,d0
	not.b	d0
	or.b	#CIACRAF_SPMODE,ciacra(a6)
	clr.b	ciatalo(a6)
	move.b	#1,ciatahi(a6)
2$	rts

VBRCode	movec	VBR,d0
	rte

	INCLUDE	"TEMP:Fixes/.GlobIncludes/ptreplay020.asm"

;*-------------------------------------------------------------------------------------------------------
;* Text Scroller
;*-------------------------------------------------------------------------------------------------------

ScrollText	movem.l	d0-d1/a0-a1,-(sp)
	tst.b	ScrollStop(a5)	;scroller stopped?
	beq.s	NoScrollStop
	subq.b	#1,ScrollStop(a5)
	bra	ScrollDone
NoScrollStop	subq.b	#1,ScrollDelay(a5)
	bne.s	WaitBlit
	move.b	#SCROLLDELAY,ScrollDelay(a5)
1$	lea	ScrollString-VBase(a5),a0
	add.w	ScrollPos(a5),a0
	move.b	(a0)+,d0
	bne.s	CheckStop
	clr.w	ScrollPos(a5)
	bra.s	1$
CheckStop	addq.w	#1,ScrollPos(a5)
	subq.b	#STOP,d0
	bne.s	2$
	move.b	#SCROLLSTOP,ScrollStop(a5)
	bra.s	ScrollDone
2$	moveq	#32-STOP,d1
	sub.b	d1,d0
	move.l	Bitplane(a5),a1
	lea	31*(80*7)-1(a1),a1
	lea	ScrollFont-VBase(a5),a0
	ext.w	d0
	lsl.w	#3,d0
	add.w	d0,a0
	moveq	#8-1,d0
3$	move.b	(a0)+,(a1)
	lea	80(a1),a1
	dbra	d0,3$

WaitBlit	btst	#DMAB_BLITTER,dmaconr(a4)
	bne.s	WaitBlit

	clr.l	bltamod(a4)
	move.w	#%1100100111110000,bltcon0(a4)
	clr.w	bltcon1(a4)
	moveq	#-1,d0
	move.l	d0,bltafwm(a4)	;+bltafwm
	move.l	Bitplane(a5),a0
	lea	36*(80*6)(a0),a0
	move.l	a0,bltapt(a4)
	subq.w	#1,a0
	move.l	a0,bltdpt(a4)
	move.w	#6*64,bltsize(a4)
ScrollDone	movem.l	(sp)+,d0-d1/a0-a1
	rts

;*-------------------------------------------------------------------------------------------------------
;* Data Section
;*-------------------------------------------------------------------------------------------------------

VBase	ds.b	VBase_SIZEOF
GraphicsName	dc.b	"graphics.library",0
OnString	dc.b	"yep"
OffString	dc.b	"no "
Font	INCBIN	"TEMP:Asm-Work/.Fonts/nemesis.fnt"
ScrollFont	INCBIN	"TEMP:Asm-Work/.Fonts/potnoodle.fnt"
MainString	INCBIN	"trainer.txt"
	dc.b	0
	cnop	0,4
TrainCols	dc.w	$FF0,$EE0,$DD0,$CC0,$BB0,$AA0,$990,$880,$770,$660,$550,$440,$330,$220,$110
	dc.w	$000,$110,$220,$330,$440,$550,$660,$770,$880,$990,$AA0,$BB0,$CC0,$DD0,$EE0

ScrollString	DC.B	"                 AGAIN ANOTHER TRAINER MENU CODED BY SUNBEAM :)                ",STOP
	DC.B	"                   THIS ONE REQUIRES AGA AND AN 68020+ CPU!                    ",STOP
	DC.B	"                             - SUNBEAM 1997 -                                  ",STOP
	DC.B	"                               AND DON'T FORGET  ...................... SHELTER ROOLS!                                                                ",0


	SECTION	VISUAL,DATA_C

CoppList	dc.w	bplcon0,%1000001000010000
	dc.w	bplcon1,0
	dc.w	bplcon2,0
	dc.w	bplcon3,0
	dc.w	ddfstrt,$0038
	dc.w	ddfstop,$00D8
	dc.w	diwstrt,$2C81
	dc.w	diwstop,$2CBB
	dc.w	fmode,3
	dc.w	bpl1mod,$FFF8
	dc.w	bpl2mod,$FFF8

BitplanePtr	dc.w	bplpt+00,0 ;1
	dc.w	bplpt+02,0
	dc.w	bplpt+04,0 ;2
	dc.w	bplpt+06,0
	dc.w	bplpt+08,0 ;3
	dc.w	bplpt+10,0
	dc.w	bplpt+12,0 ;4
	dc.w	bplpt+14,0
	dc.w	bplpt+16,0 ;5
	dc.w	bplpt+18,0
	dc.w	bplpt+20,0 ;6
	dc.w	bplpt+22,0
	dc.w	bplpt+24,0 ;7
	dc.w	bplpt+26,0
	dc.w	bplpt+28,0 ;8
	dc.w	bplpt+30,0
	INCBIN	"TEMP:Fixes/.GlobIncludes/mel-shelter.pal"

	dc.w	$8A21,$FFFE	;upper bar
	dc.w	color,$640
	dc.w	$8B21,$FFFE
	dc.w	color+00,$CCC
	dc.w	color+06,0
	dc.w	color+06,0

TrainLinesCOP	dc.w	$8F21,$FFFE	;line 1
TLine1	EQU	*-TrainLinesCOP+2
	dc.w	color+02,0
	dc.w	$9621,$FFFE	;line 2
TLine2	EQU	*-TrainLinesCOP+2
	dc.w	color+02,0
	dc.w	$9F21,$FFFE	;line 3
TLine3	EQU	*-TrainLinesCOP+2
	dc.w	color+02,0
	dc.w	$A621,$FFFE	;line 4
TLine4	EQU	*-TrainLinesCOP+2
	dc.w	color+02,0
	dc.w	$AE21,$FFFE	;line 5
TLine5	EQU	*-TrainLinesCOP+2
	dc.w	color+02,0
	dc.w	$B621,$FFFE	;line 6
TLine6	EQU	*-TrainLinesCOP+2
	dc.w	color+02,0
	dc.w	$BE21,$FFFE	;line 7
TLine7	EQU	*-TrainLinesCOP+2
	dc.w	color+02,0
	dc.w	$C621,$FFFE	;line 8
TLine8	EQU	*-TrainLinesCOP+2
	dc.w	color+02,0
	dc.w	$CE21,$FFFE	;line 9
TLine9	EQU	*-TrainLinesCOP+2
	dc.w	color+02,0
	dc.w	$D621,$FFFE	;line 10
TLine10	EQU	*-TrainLinesCOP+2
	dc.w	color+02,0
	dc.w	$DE21,$FFFE	;line 11
TLine11	EQU	*-TrainLinesCOP+2
	dc.w	color+02,0
	dc.w	$E621,$FFFE	;line 12
TLine12	EQU	*-TrainLinesCOP+2
	dc.w	color+02,0
	dc.w	$EE21,$FFFE	;line 13
TLine13	EQU	*-TrainLinesCOP+2
	dc.w	color+02,0
	dc.w	$F621,$FFFE
	dc.w	color+02,0

	dc.w	$FA21,$FFFE	;lower bar
	dc.w	color,$640
	dc.w	$FB21,$FFFE
	dc.w	color+00,$FFF
	dc.w	color+02,$437
	CEND

mt_data	INCBIN	"TEMP:Fixes/.GlobIncludes/mod.secretgardens"
BitplaneR	INCBIN	"TEMP:Fixes/.GlobIncludes/mel-shelter.raw"
	END