
;    /¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\
;   /       /¯¯¯¯¯¯\ /¯¯¯¯¯¯\ /¯¯¯¯¯\  /¯¯¯¯¯¯\ (¯) /¯¯¯¯¯¯\ ®     \
;  /        | /¯¯\_| | /¯¯\_| | /¯¯\ \ | |¯¯| | /¯\ | /¯¯\_|        \
; /         | |      |  ]     | |  | | |  ¯¯  / | | | |              \
; |         | \__/¯| | \__/¯| | \__/ / | |¯\ \  | | | \__/¯|         |
; |         \______/ \______/ \_____/  |_|  \_| \_/ \______/         |
; |__________________________________________________________________|
; |                                                                  |
; | 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	2

TRUE		equ	1
FALSE		equ	0

_levofs		equ	$24000	 	; 512 freie Bytes + Level-Data
_roomofs	equ	$35000		; Räume
_rdatofs	equ	_roomofs-512
_ldatofs	equ	_levofs

_bgnd		equ	TRUE
_talk		equ	TRUE
_rooms		equ	TRUE

_stacksize	equ	256
_progstart	equ	$e0
_scrheight	equ	240
_scrwidth	equ	46
_scrdepth	equ	4
_viewwidth	equ	36
_viewheight	equ	208
_levheight	equ	130
_levwidth	equ	256
_roomwidth	equ	256
_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-928

_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
;----------------------------------------
		include	"game:includes/global.i"
;----------------------------------------
		include	"game:includes/startup.i"

		IFEQ	_todisk
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
spr11		dc.b	'game:gfx/bobs&sprites/man32x56.lev2.10.spr',0
spr12		dc.b	'game:gfx/bobs&sprites/man32x56.lev2.10.spr',0
ldat		dc.b	'game:levels/levelcity.dat',0
rdat		dc.b	'game:levels/roomscity.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_lev1.i"
;------------------------------------------------
sun		incbin	"game:gfx/bobs&sprites/planet.spr"
bgnd		incbin	"game:gfx/others/background1.2.bmp"

bobs		incbin	"game:gfx/bobs&sprites/mskbobscity.bmp"
nrmbobs		incbin	"game:gfx/bobs&sprites/nrmbobscity.bmp"
status		incbin	"game:gfx/others/status.bmp"
textstatus	incbin	"game:gfx/others/textstatus.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/gfxcity.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	.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	dreset
		tst.w	turnflag-d(a5)
		bne.s	.turn
		tst.w	textflag-d(a5)
		bne.s	.text
		tst.w	stfadeflag-d(a5)
		bne.s	.fadestatus
		tst.w	dospeakflag-d(a5)
		bne.s	.dospeak
		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
.fadestatus	bsr	fadestatus
		bra.s	loop
.dospeak	bsr	dospeak
		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	loop
.mon		bsr	monrout
		bra	loop
.enter		bsr	enter
		bra	loop
.leave		bsr	leave
		bra	loop

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	initmusic
		bsr	initbgnd
		bsr	initcoppos
		bsr	initstatus
		bsr	initpositions2
		clr.w	ouchflag-d(a5)

		move.l	#22*16,d0
		move.l	#22*16+128,d2
		move.l	#117*16,d1
		move.l	#116*16+88,d3
		bsr	setscrnpos

		bsr	calcagapos
		bsr	saveposition

		bsr	initmasks
		
		bsr	initfganim
		bsr	initbobpos
		
		bsr	initlang

		bsr	drawstart

		bsr	setsun
		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	#1,d3
.l3		move.w	(a0)+,d2
		and.w	d5,d2
		cmp.w	d6,d2
		beq.s	.foundright
		addq.w	#1,d3
		cmp.w	#_levwidth,d3
		bne.s	.l3
		rts
		
.foundright	subq.l	#2,a0
		and.w	#$3ff,(a0)
		moveq	#1,d4
.l4		move.w	(a0),d2
		and.w	d5,d2
		cmp.w	d6,d2
		beq.s	.foundbottom
		add.w	#_levwidth,a0
		addq.w	#1,d4
		cmp.w	#_levheight,d4
		bne.s	.l4
		rts
		
.foundbottom	and.w	#$3ff,(a0)
		lsl.w	#3,d0
		lsl.w	#4,d1
		lsl.w	#4,d3
		lsl.w	#4,d4
		lsl.w	#3,d7
		move.w	d0,(a1,d7.w)
		move.w	d1,2(a1,d7.w)
		move.w	d3,4(a1,d7.w)
		move.w	d4,6(a1,d7.w)
		lsr.w	#3,d3
		subq.w	#2,d3
		neg.w	d3
		and.w	#$3ff,(a0,d3.w)
		bra	.st
		
;		dc.w	0*16,1*16,25*16,13*16,80,136,0*16,1*16
;------------------------------------------------
linkrooms	lea	roomtab2-d(a5),a0
		lea	roomtab-d(a5),a1
		lea	roomtabi-d(a5),a3
		lea	doortab-d(a5),a2
.l1		tst.w	(a2)
		bmi	.end
		tst.w	8(a2)
		bmi	.cont2
		
		moveq	#0,d0
		move.b	14(a2),d0
		lsl.w	#3,d0
		moveq	#0,d1
		move.b	15(a2),d1
		lsl.w	#4,d1
		move.l	(a0,d0.w),(a1,d1.w)
		move.l	4(a0,d0.w),4(a1,d1.w)

		move.w	8(a2),d2
		lsl.w	#4,d2
		move.w	d2,8(a1,d1.w)
		sub.w	#$90,d2
		move.w	(a1,d1.w),d3
		add.w	4(a1,d1.w),d3
		sub.w	#19*16,d3
		cmp.w	d3,d2
		bmi.s	.c4
		move.w	d3,d2		
.c4		cmp.w	(a1,d1.w),d2
		bpl.s	.c1
		move.w	(a1,d1.w),d2		
.c1		move.w	d2,12(a1,d1.w)
		
		move.w	10(a2),d2
		lsl.w	#4,d2
		move.w	d2,10(a1,d1.w)
		subq.w	#8,10(a1,d1.w)
		sub.w	#$40,d2
		move.w	2(a1,d1.w),d3
		add.w	6(a1,d1.w),d3
		sub.w	#13*16,d3
		cmp.w	d3,d2
		bmi.s	.c3
		move.w	d3,d2		
.c3		cmp.w	2(a1,d1.w),d2
		bpl.s	.c2
		move.w	2(a1,d1.w),d2		
.c2		move.w	d2,14(a1,d1.w)

.cont2		tst.w	4(a2)
		beq	.cont
		moveq	#0,d0
		move.b	6(a2),d0
		lsl.w	#3,d0
		moveq