
;    /¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\
;   /       /¯¯¯¯¯¯\ /¯¯¯¯¯¯\ /¯¯¯¯¯\  /¯¯¯¯¯¯\ (¯) /¯¯¯¯¯¯\ ®     \
;  /        | /¯¯\_| | /¯¯\_| | /¯¯\ \ | |¯¯| | /¯\ | /¯¯\_|        \
; /         | |      |  ]     | |  | | |  ¯¯  / | | | |              \
; |         | \__/¯| | \__/¯| | \__/ / | |¯\ \  | | | \__/¯|         |
; |         \______/ \______/ \_____/  |_|  \_| \_/ \______/         |
; |__________________________________________________________________|
; |                                                                  |
; | Programm: Christopher Dissauer             Graphics: Miguel Marn |
; |__________________________________________________________________|
; |                                                                  |
; | Letzter Stand: 13.02.1994                                        |                                                                    |
; |                                                                  |
; |  23.01.1994 .. A1200 - Anpassung des Sourcecodes                 |
; |                (lauffähig mit mind. 1MB Chip , 1MB Fast)         |
; |  24.01.1994 .. Bug-Fix: COPJMP2 bei 64k-Override fehlerhaft      |
; |  08.02.1994 .. Energieleiste, sämtl. Zähler in der Statusleiste  |
; |                TOD, AGA-Bug beseitigt			     |
; |  09.02.1994 .. Objekte bei Einfaden gesetzt, Inventory, Auflösung|
; |		   der Münzen u. Edelsteine			     |
; |  12.02.1994 .. Bug-Fix: Münzen nehmen bei Einfaden;	Wurmtod,     |
; |		   Tropfen, spuckende Pflanze, Energie- u.Lebenssymb.|
; |  13.02.1994 .. Scrolling: AGA-Anpassung (BUTTERWEICH!!)	     |
; |  dazwischen .. Ein Arsch voll Bugs beseitigt		     | 
; |  12.03.1994 .. Level II: Stiegensteigen 			     |
; |  27.03.1994 .. Positionierung im Level, Betreten & Verlassen der |
; |		   Räume					     |
; \__________________________________________________________________/


_todisk		equ	0

; Speicher-Initialisierung - Allokation über OS

_levelno	equ	3

TRUE		equ	1
FALSE		equ	0

_xmem		equ	$84		; Startadr. des 2. 512KB-Blockes
_nmem		equ	$88		; Startadr. des 1. 512KB-Blockes
_charofs	equ	0		; 8x12-Zeichensatz
_stcharofs	equ	9600		; 8x8-Zeichensatz für Statuszeile
_waveofs	equ	14720		; Wellen-Sprites
_bigfontofs	equ	39552		; Große Zahlen
_manofs		equ	576+39552  	; Protagonisten-Sprites
_levofs		equ	$24000	 	; 512 freie Bytes + Level-Data
_roomofs	equ	$35000		; Räume
_rdatofs	equ	_roomofs-512
_ldatofs	equ	_levofs

_bgnd		equ	FALSE
_talk		equ	FALSE

_stacksize	equ	256
_progstart	equ	$e0
_scrheight	equ	240
_scrwidth	equ	46
_scrdepth	equ	4
_viewwidth	equ	36
_viewheight	equ	208
_levheight	equ	128
_levwidth	equ	512
_roomwidth	equ	512
_sysstack	equ	$80000-10
_sysstack2	equ	_sysstack-_stacksize*4
_sysstack2strt	equ	_sysstack2-_stacksize*4
_plane1		equ	_sysstack2strt-(_scrheight*_scrwidth*_scrdepth*3)-(_levwidth*2)
_plane2		equ	_plane1+_scrwidth
_plane3		equ	_plane2+_scrwidth
_bgnddat	equ	_plane1-40960
_masks		equ	_bgnddat-41000
_coltabs	equ	_masks-4*2*_viewheight
_sprite		equ	_coltabs-1000

_mskheight	equ	256
_nmeno		equ	16
_fgblkno	equ	128
_scrlxspeed	equ	2
_invsize	equ	10

_wavlen		equ	1552
_statsprlen	equ	512

;_tabofs	equ	344064

_loaderofs	equ	$7f000

_language	equ	0

_lorrymaxspeed	equ	1280
;----------------------------------------
		include	"game:includes/global.i"
;----------------------------------------
		IFEQ	_todisk
		section	"",code

initmem		move.l	4,a6
		move.l	#dosname,a1
		clr.l	d0
		jsr	-552(a6)
		move.l	d0,dosbase
		beq	fail1

		move.l	dosbase,a6
		moveq	#0,d0
		jsr	-$3c(a6)
		move.l	d0,output

		alloc	#524288,0
		tst.l	d0
		beq	fail2
		move.l	d0,_xmem
		move.l	d0,buf
		
		move.l	d0,a0
		move.l	#$1ffff,d7
.l1		clr.l	(a0)+
		subq.l	#1,d7
		bpl.s	.l1

		load	#chars,#_charofs,#9600
		load	#stchars,#_stcharofs,#5120
		
		load	#waves1,#_waveofs,#9312
		load	#waves2,#_waveofs+9312,#15520

		load	#bigfont,#_bigfontofs,#576
		
		load	#spr1,#_manofs+0,#9280
		load	#spr2,#_manofs+9280,#9280
		load	#spr3,#_manofs+18560,#9280
		load	#spr4,#_manofs+27840,#9280
		load	#spr5,#_manofs+37120,#9280
		load	#spr6,#_manofs+46400,#9280
		load	#spr7,#_manofs+55680,#9280
		load	#spr8,#_manofs+64960,#9280
		load	#spr9,#_manofs+74240,#9280
		load	#spr10,#_manofs+83520,#9280

		load	#ldat,#_levofs+512,#65536

		load	#rdat,#_roomofs+512,#65536

		bsr	shutdown

srcferror	free	buf,#524288
fail2		move.l	4,a6
		move.l	dosbase,a1
		jsr	-414(a6)
fail1		rts
;----------------------------------------
shutdown	move.l	4,a6
		lea	gfxlib(pc),a1
		moveq	#0,d0
		jsr	-552(a6)
		beq	ende
		move.l	d0,a0
		lea	oldcop(pc),a1
		move.l	38(a0),(a1)
		move.l	d0,a1
		jsr	-414(a6)

		move.w	$dff01c,d1
		or.w	#$8000,d1
		move.w	$dff002,d2
		or.w	#$8000,d2
		move.w	#$7fff,$dff09a
		move.w	#$7fff,$dff096
		
		movem.l	d0-a6,-(a7)
		jsr	prg+$ec
		movem.l	(a7)+,d0-a6

		move.l	oldcop(pc),$dff080
		move.w	#0,$dff088
		move.w	d1,$dff09a
		move.w	d2,$dff096
		move.l	d0,a1
		move.l	#262144,d0
		jsr	-210(a6)
ende		rts

gfxlib		dc.b	'graphics.library',0
		cnop	0,2
oldcop		dc.l	0
oldsp		dc.l	0

dosbase		dc.l	0
output		dc.l	0
buf		dc.l	0
srcf		dc.l	0
dosname		dc.b	'dos.library',0

chars		dc.b	'game:gfx/others/char8x12.bmp',0
stchars		dc.b	'game:gfx/others/stchar8x8.bmp',0
waves1		dc.b	'game:gfx/bobs&sprites/waves.spr',0
waves2		dc.b	'game:gfx/bobs&sprites/waves2.spr',0
bigfont		dc.b	'game:gfx/others/bigfont.bmp',0
spr1		dc.b	'game:gfx/bobs&sprites/man32x56.1.spr',0
spr2		dc.b	'game:gfx/bobs&sprites/man32x56.2.spr',0
spr3		dc.b	'game:gfx/bobs&sprites/man32x56.3.spr',0
spr4		dc.b	'game:gfx/bobs&sprites/man32x56.4.spr',0
spr5		dc.b	'game:gfx/bobs&sprites/man32x56.5.spr',0
spr6		dc.b	'game:gfx/bobs&sprites/man32x56.6.spr',0
spr7		dc.b	'game:gfx/bobs&sprites/man32x56.7.spr',0
spr8		dc.b	'game:gfx/bobs&sprites/man32x56.8.spr',0
spr9		dc.b	'game:gfx/bobs&sprites/man32x56.lev2.9.spr',0
spr10		dc.b	'game:gfx/bobs&sprites/man32x56.lev2.10.spr',0
ldat		dc.b	'game:levels/levelfirecave.dat',0
rdat		dc.b	'game:levels/roomsfirecave.dat',0

		cnop	0,2
		ENDC
;----------------------------------------
;------------------------------------------------
		section	"b",code_c

		prg_m
;------------------------------------------------
;------------------------------------------------
;------------------------------------------------
blkcopper	dc.l	$01800000
		dc.l	$01000000
		dc.l	$fffffffe

		include	"game:includes/copper_lev3.i"
;------------------------------------------------
bgnd		incbin	"game:gfx/others/background1.2.bmp"

bobs		incbin	"game:gfx/bobs&sprites/mskbobsfirecave.bmp"
nrmbobs		incbin	"game:gfx/bobs&sprites/nrmbobsfirecave.bmp"
status		incbin	"game:gfx/others/status.bmp"
statusspr	incbin	"game:gfx/bobs&sprites/status.spr"
objectspr	incbin	"game:gfx/bobs&sprites/objects.spr"
objectsprend
objectsgrey	incbin	"game:gfx/bobs&sprites/objects-grey.spr"

lgraph		incbin	"game:gfx/gfx/gfxfirecave.bmp"
		ds.b	512-((*-lgraph)&511)


samples		incbin	"game:modules/smp.ingame"
song		incbin	"game:modules/sng.ingame"
		ds.w	16


;------------------------------------------------
;------------------------------------------------
start		bra	dostart

playrout	include	"source:sound/propackplay2.s"

dostart		lea	$dff000,a6
		bsr	geta5
		move.l	$6c.w,oldirq-d(a5)
		lea	newirq(pc),a0
		move.l	a0,$6c.w
		move.l	(_nmem).w,d0
		add.l	#blkcopper,d0
		move.l	d0,$80(a6)
		move.w	#0,$88(a6)
		move.w	#$87e0,$96(a6)
		bsr	geta5
		clr.w	fadeflag-d(a5)
		bsr	init
;		bsr	drawstart
		move.l	(_nmem).w,d0
		add.l	#copper,d0
		move.l	d0,$80(a6)
		move.w	#0,$88(a6)
		move.w	#$c010,$9a(a6)

loop		tst.w	monitorflag-d(a5)
		bne.s	.mon
		tst.w	fadeflag-d(a5)
		beq.s	.c1		
		bsr	dofade
		bra.s	loop
.c1		tst.w	quitflag-d(a5)
		bne	dquit
		tst.w	resetflag-d(a5)
		bne.s	dreset
		tst.w	turnflag-d(a5)
		bne.s	.turn
		tst.w	textflag-d(a5)
		bne.s	.text
		tst.w	statusflag-d(a5)
		beq.s	.mr
		cmp.w	#4,statusflag-d(a5)
		bmi.s	.status2
		bra.s	.status
.mr		tst.w	leaveflag-d(a5)
		bne.s	.leave
		tst.w	enterflag-d(a5)
		bne.s	.enter
		bsr	mainrout
		bra.s	loop

.status2	addq.w	#1,statusflag-d(a5)
		bsr	mainrout
		bra.s	loop
.status		bsr	statrout
		bra.s	loop

.text		bsr	textprint
		bra.s	loop
.turn		
;		move.w	enterflag2-d(a5),d0
;		or.w	leaveflag2-d(a5),d0
		tst.w	statusflag-d(a5)
		beq.s	.mr
		bsr	turnback
		bra.s	loop
.mon		bsr	monrout
		bra.s	loop
.enter		bsr	enter
		bra.s	loop
.leave		bsr	leave
		bra	loop

		
dreset		dreset_m
		
dquit		dquit_m
		
qu		move.w	#$7fff,$9a(a6)
		move.w	#$7fff,$96(a6)
		move.l	oldirq-d(a5),$6c.w
		bsr	playrout+12
		rts
;------------------------------------------------
;------------------------------------------------
newirq		movem.l	d0-a6,-(a7)
		lea	$dff000,a6
		bsr	geta5
		move.w	#1,irqflag-d(a5)

		bsr	playrout+8

endirq		lea	$dff000,a6
		move.w	#$0010,$9c(a6)
		movem.l	(a7)+,d0-a6
		rte
;------------------------------------------------
;------------------------------------------------
init		bsr	geta5

		bsr	initrooms
		lea	doortab-d(a5),a1
		lea	_ldatofs,a0
		add.l	(_xmem).w,a0
		moveq	#0,d7
		bsr	initdoors
		lea	_rdatofs,a0
		add.l	(_xmem).w,a0
		moveq	#1,d7
		bsr	initdoors
		bsr	linkrooms

		bsr	initaga
		bsr	initskycols
		bsr	inittabs
		bsr	initcopper
		bsr	initbgnd
		bsr	initmusic
		bsr	initcoppos
		bsr	initstatus
		bsr	initpositions2

		move.l	#1*16,d0
		move.l	#1*16+128,d2
		move.l	#4*16,d1
		move.l	#3*16+88,d3
		bsr	setscrnpos

		bsr	calcagapos
		bsr	saveposition

		bsr	initmasks
		
		bsr	initfganim
		bsr	initbobpos
		
		bsr	initlang

		bsr	drawstart

		move.w	#224,energy-d(a5)
		bsr	showenergy
		move.l	#3,lives-d(a5)
		bsr	updcounters
		move.w	#15,intensity-d(a5)
		move.w	#2,fadeflag-d(a5)

		rts
;------------------------------------------------
saveposition	saveposition_m
;------------------------------------------------
calcagapos	calcagapos_m
;------------------------------------------------
initrooms	lea	roomtab2-d(a5),a1

		move.w	#$fc00,d5
		move.w	#$f000,d6
		
.st		lea	_rdatofs,a0
		add.l	(_xmem).w,a0
		moveq	#-1,d1
.l1		moveq	#0,d0
.l2		move.w	(a0)+,d2
		and.w	d5,d2
		cmp.w	d6,d2
		beq.s	.found
		addq.w	#2,d0
		cmp.w	#_levwidth,d0
		bne.s	.l2
		addq.w	#1,d1
		cmp.w	#_levheight,d1
		bne.s	.l1
		rts
		
.found		move.w	(a0),d7
		and.w	d5,d7
		rol.w	#6,d7
		and.w	#$3ff,(a0)
		and.w	#$3ff,-2(a0)
		moveq	#2,d3
.l3