;----------------------------------------
alloc		macro
		movem.l	a6,-(a7)
		move.l	4,a6
		move.l	\1,d0
		move.l	#1<<\2,d1
		jsr	-198(a6)		
		movem.l	(a7)+,a6
		endm
		
free		macro
		movem.l	a6,-(a7)
		move.l	4,a6
		move.l	\1,a1
		move.l	\2,d0
		jsr	-210(a6)
		movem.l	(a7)+,a6
		endm

open		macro
		move.l	\2,d2
		move.l	\1,d1
		jsr	-30(a6)
		beq	\3
		endm
		
close		macro
		move.l	\1,d1
		jsr	-36(a6)
		endm

read		macro
		movem.l	d0-d3,-(a7)
		move.l	\1,d1
		move.l	\2,d2
		move.l	\3,d3
		jsr	-42(a6)
		movem.l	(a7)+,d0-d3
		beq	\4
		endm

write		macro
		move.l	\1,d1
		move.l	\2,d2
		move.l	\3,d3
		jsr	-48(a6)
		beq	\4
		endm

load		macro
		move.l	dosbase,a6
		open	\1,#1005,srcferror
		move.l	d0,srcf
		move.l	buf,d4
		add.l	\2,d4
		read	srcf,d4,\3,fail\@
fail\@		close	srcf		
		endm

waitblt		macro
.waitblt\@	btst	#6,2(a6)
		bne.s	.waitblt\@
		endm

waitirq		macro
		clr.w	irqflag-d(a5)
.waitirq\@	tst.w	irqflag-d(a5)
		beq.s	.waitirq\@
		endm

vblank		macro
.vblank1\@	move.l	4(a6),d0
		and.l	#$1ff00,d0
		cmp.l	#$00100,d0
		bne.s	.vblank1\@
.vblank2\@	move.l	4(a6),d0
		and.l	#$1ff00,d0
		cmp.l	#$00100,d0
		beq.s	.vblank2\@
		endm
;------------------------------------------------
fgenable	equ	0
fgxbd		equ	_fgblkno*4
fgybd		equ	_fgblkno*4*2
fgpos		equ	_fgblkno*4*3
fgstartblk	equ	_fgblkno*4*4
fganimno	equ	_fgblkno*4*5
fganimpos	equ	_fgblkno*4*6
fganimmsk	equ	_fgblkno*4*7
fganimcnt	equ	_fgblkno*4*8
fgstartdata	equ	_fgblkno*4*9
fgpixpos	equ	_fgblkno*4*10
_fgs		equ	11

nmstartflag	equ	_nmeno*4*0
nmxpos		equ	_nmeno*4*1
nmypos		equ	_nmeno*4*2
nmdefxpos	equ	_nmeno*4*3
nmdefypos	equ	_nmeno*4*4
nmstartxpos	equ	_nmeno*4*5
nmstartypos	equ	_nmeno*4*6
nmactxpos	equ	_nmeno*4*7
nmactypos	equ	_nmeno*4*8
nmbpos11	equ	_nmeno*4*9
nmbpos12	equ	_nmeno*4*10
nmbpos21	equ	_nmeno*4*11
nmbpos22	equ	_nmeno*4*12
nmenable	equ	_nmeno*4*13	
nmdata		equ	_nmeno*4*14
nmdefdata	equ	_nmeno*4*15
nmsize1		equ	_nmeno*4*16
nmsize2		equ	_nmeno*4*17
nmxsize		equ	_nmeno*4*18
nmysize		equ	_nmeno*4*19
nmxcenter	equ	_nmeno*4*20
nmycenter	equ	_nmeno*4*21
nmdefxsize	equ	_nmeno*4*22
nmdefysize	equ	_nmeno*4*23
nmmod1		equ	_nmeno*4*24
nmmod2		equ	_nmeno*4*25
nmstartblk	equ	_nmeno*4*26
nmstartno	equ	_nmeno*4*27
nmmove		equ	_nmeno*4*28
nmlevxadd	equ	_nmeno*4*29
nmlevyadd	equ	_nmeno*4*30
nmanimpos	equ	_nmeno*4*31
nmanimcount	equ	_nmeno*4*32
nmanimpos2	equ	_nmeno*4*33
nmanimcount2	equ	_nmeno*4*34
nmxdir		equ	_nmeno*4*35
nmydir		equ	_nmeno*4*36
nmxspeed	equ	_nmeno*4*37
nmyspeed	equ	_nmeno*4*38
nmcoll		equ	_nmeno*4*39
nmdieyspd	equ	_nmeno*4*40
nmxhit		equ	_nmeno*4*41
nmyhit		equ	_nmeno*4*42
nmobj		equ	_nmeno*4*43
nmstartblk2	equ	_nmeno*4*44
nmnoreset	equ	_nmeno*4*45
_nms		equ	46
;------------------------------------------------
prg_m		macro
prg		
		IFEQ	_todisk
		ds.b	_progstart
		ENDC
		org	_progstart
		dc.l	start
		dc.l	end
		dc.l	lgraph
		bra	copyfast

clrsprite	ds.b	288

copyfast	lea	prg(pc),a1
		move.l	a1,_nmem

		move.l	_xmem,a1
		add.l	#_tabofs,a1
		move.l	#($7f000-_tabofs)/2-1,d7
.l1		clr.w	(a1)+
		subq.l	#1,d7
		bpl.s	.l1
	

		move.l	#start,d5
		move.l	#end,d6
		move.l	_nmem,a0
		add.l	d5,a0
		move.l	_xmem,a1
		add.l	#_mainprgofs,a1
		sub.l	d5,d6
		add.l	#512,d6
		lsr.l	#1,d6
		move.l	d6,d4
.l5		move.w	(a0)+,(a1)+
		subq.l	#1,d6
		bpl.s	.l5

		movem.l	a0/a1/d4,-(a7)
		move.l	_xmem,a0
		add.l	#_mainprgofs,a0
		jsr	(a0)
		movem.l	(a7)+,a0/a1/d4

.l10		move.w	-(a1),-(a0)
		subq.l	#1,d4
		bpl.s	.l10
		rts
		endm
;------------------------------------------------
dreset_m	macro
		move.l	nm-d(a5),a0
		moveq	#_nmeno-1,d7
.l1		tst.w	nmenable(a0)
		beq.s	.c1
		clr.l	nmenable(a0)
		clr.l	nmsize1(a0)
		clr.l	nmsize2(a0)
		bsr	doreset2
.c1		addq.l	#4,a4
		dbra	d7,.l1
		
		IFEQ	_todisk
		lea	lives-d(a5),a4
		tst.l	(a4)
		beq	dquit
		bsr	decnumber
		ENDC
		
		bsr	initstatus
		bsr	initpositions3
		bsr	initfganim
		bsr	initbobpos
		bsr	drawstart
		clr.w	resetflag-d(a5)
		move.w	#2,fadeflag-d(a5)
		bra	loop
		endm
		
dquit_m		macro
		clr.w	quitflag-d(a5)
		
		bsr	initfganim
		bsr	initbobpos
		endm
;------------------------------------------------
saveposition_m	macro
		lea	saveto-d(a5),a1
		lea	savestart-d(a5),a0
		move.w	#(saveend-savestart)/2-1,d7
.l1		move.w	(a0)+,(a1)+
		dbra	d7,.l1
		rts
		endm
;------------------------------------------------
calcagapos_m	macro
		move.w	manxpos-d(a5),d0
		lsl.w	#2,d0
		move.w	d0,agamanxpos-d(a5)
		move.l	absmanxpos-d(a5),d0
		lsl.l	#2,d0
		move.l	d0,agaabsmanxpos-d(a5)
		move.l	xsoftabs-d(a5),d0
		lsl.l	#2,d0
		move.l	d0,agaxsoftabs-d(a5)
		rts
		endm
;------------------------------------------------
initdoors_m	macro
		move.l	a0,a4
		moveq	#0,d1
.l2		moveq	#0,d0
.l1		move.w	(a0)+,d2
		and.w	#$fc00,d2
		cmp.w	#$0800,d2
		beq.s	.outdoor
.c1		addq.w	#1,d0
		cmp.w	\1,d0
		bmi.s	.l1
		addq.w	#1,d1
		cmp.w	\2,d1
		bmi.s	.l2

		move.l	a4,a0
		moveq	#0,d1
.l5		moveq	#0,d0
.l4		move.w	(a0)+,d2
		and.w	#$fc00,d2
		cmp.w	#$0400,d2
		beq.s	.indoor
.c2		addq.w	#1,d0
		cmp.w	\1,d0
		bmi.s	.l4
		addq.w	#1,d1
		cmp.w	\2,d1
		bmi.s	.l5

		rts
		
.outdoor	move.w	(a0),d2
		and.w	#$fc00,d2
		cmp.w	#$0800,d2
		bne.s	.c1
		move.w	_levwidth*3-2(a0),d2
		and.w	#$fc00,d2
		cmp.w	#$0800,d2
		bne.s	.c1
		
		move.w	_levwidth-2(a0),d3
		and.w	#$fc00,d3
		lsr.w	#2,d3
		
		move.w	_levwidth(a0),d2
		and.w	#$3ff,_levwidth-2(a0)
		and.w	#$3ff,_levwidth(a0)
		
		and.w	#$fc00,d2
		rol.w	#6,d2
		subq.w	#1,d2
		bmi	.c1
		move.w	d0,(a1)+
		move.w	d1,(a1)+
		move.w	d7,(a1)+
		move.w	d2,(a1)+
		or.w	d3,-2(a1)
		addq.l	#8,a1
		bra	.c1
		
.indoor		move.w	(a0),d2
		and.w	#$fc00,d2
		cmp.w	#$0400,d2
		bne.s	.c2
		move.w	_levwidth*3-2(a0),d2
		and.w	#$fc00,d2
		cmp.w	#$0400,d2
		bne.s	.c2
		
		move.w	_levwidth-2(a0),d3
		and.w	#$fc00,d3
		lsr.w	#2,d3
		
		move.w	_levwidth(a0),d2
		and.w	#$3ff,_levwidth-2(a0)
		and.w	#$3ff,_levwidth(a0)
		
		and.w	#$fc00,d2
		rol.w	#6,d2
		subq.w	#1,d2
		bmi	.c2
		
		lea	doortab-d(a5),a3
.l3		tst.w	(a3)
		bmi	.c2
		cmp.b	7(a3),d2
		beq.s	.roomfound
		lea	16(a3),a3
		bra.s	.l3
		
.roomfound	move.w	d0,8(a3)
		move.w	d1,10(a3)
		move.w	#1,12(a3)
		move.w	d2,14(a3)
		or.w	d3,14(a3)
		bra	.c2
		
		endm
;------------------------------------------------
initaga_m	macro
		move.w	#$2dac,d1
		move.w	$dff07c,d0
		btst	#2,d0
		bne.s	.c1
		btst	#1,d0
		bne.s	.c1
		move.w	#$2dad,d1
.c1		lea	diwstop+2,a0
		add.l	(_nmem).w,a0
		move.w	d1,(a0)
		rts
		endm
;------------------------------------------------
initlang_m	macro
		bsr	geta5
		lea	icontabg-d(a5),a1
		moveq	#_language,d0
		tst.w	d0
		beq.s	.c1
		lea	icontabe-d(a5),a1
.c1		lea	icontab-d(a5),a0
.l1		move.l	(a1)+,d0
		bmi.s	.c2
		move.l	d0,(a0)+
		bra.s	.l1

.c2		lea	actiontabg-d(a5),a1
		moveq	#_language,d0
		tst.w	d0
		beq.s	.c3
		lea	actiontabe-d(a5),a1
.c3		lea	actiontab-d(a5),a0
.l3		move.l	(a1)+,d0
		bmi.s	.c4
		move.l	d0,(a0)+
		bra.s	.l3

.c4		lea	msgtabg-d(a5),a1
		moveq	#_language,d0
		tst.w	d0
		beq.s	.c5
		lea	msgtabe-d(a5),a1
.c5		lea	msgtab-d(a5),a0
.l5		move.l	(a1)+,d0
		bmi.s	.c6
		move.l	d0,(a0)+
		bra.s	.l5

.c6		rts
		endm
;------------------------------------------------
initskycols_m	macro
		lea	skycolsend-d(a5),a0
		lea	_sprite,a1
		add.l	(_nmem).w,a1
;		lea	skycols1-d(a5),a0
;		lea	_skycols1,a1
		move.l	#skycolsend-skycols1,d7
		lsr.w	#1,d7
		subq.w	#1,d7
.l1		move.w	-(a0),-(a1)
		dbra	d7,.l1
		rts
		endm
;------------------------------------------------
initmasks_m	macro
		move.l	(_nmem).w,d5
		lea	$dff000,a6
		waitblt
		move.l	#_masks,a1
		add.l	d5,a1
		move.l	a1,$54(a6)
		move.l	#$01000000,$40(a6)
		move.w	#0,$66(a6)
		move.w	#64*_mskheight*2+40,$58(a6)
		waitblt
		move.l	#$ffffffff,$44(a6)
		move.l	#$00780078,$60(a6)
		move.l	#$00780078,$64(a6)
		move.l	#bobs,a0
		add.l	d5,a0
		move.l	a0,$50(a6)
		lea	40(a0),a0
		move.l	a0,$4c(a6)
		lea	40(a0),a0
		move.l	a0,$48(a6)
		move.l	a1,$54(a6)
		move.l	#$0ffe0000,$40(a6)
		move.w	#64*_mskheight+20,$58(a6)
		lea	40(a0),a0
		waitblt
		move.l	a1,$50(a6)
		move.l	a0,$4c(a6)
		move.l	a1,$54(a6)
		move.w	#$0dfc,$40(a6)
		move.w	#64*_mskheight+20,$58(a6)
		waitblt
		move.l	a1,$50(a6)
		lea	40(a1),a2
		move.l	a2,$54(a6)
		move.w	#$09f0,$40(a6)
		move.w	#64*_mskheight+20,$58(a6)
		waitblt
		move.l	a1,$50(a6)
		lea	80(a1),a2
		move.l	a2,$54(a6)
		move.w	#64*_mskheight+20,$58(a6)
		waitblt
		move.l	a1,$50(a6)
		lea	120(a1),a2
		move.l	a2,$54(a6)
		move.w	#64*_mskheight+20,$58(a6)
		waitblt
		rts
		endm

initmasks5_m	macro
		move.l	(_nmem).w,d5
		lea	$dff000,a6
		waitblt
		move.l	#_masks,a1
		add.l	d5,a1
		move.l	a1,$54(a6)
		move.l	#$01000000,$40(a6)
		move.w	#0,$66(a6)
		move.w	#64*_mskheight*2+50,$58(a6)
		waitblt
		move.l	#$ffffffff,$44(a6)
		move.l	#$00a000a0,$60(a6)
		move.l	#$00a000a0,$64(a6)
		move.l	#bobs,a0
		add.l	d5,a0
		move.l	a0,$50(a6)
		lea	40(a0),a0
		move.l	a0,$4c(a6)
		lea	40(a0),a0
		move.l	a0,$48(a6)
		move.l	a1,$54(a6)
		move.l	#$0ffe0000,$40(a6)
		move.w	#64*_mskheight+20,$58(a6)
		lea	40(a0),a0
		waitblt
		move.l	a1,$50(a6)
		move.l	a0,$4c(a6)
		move.l	a1,$54(a6)
		move.w	#$0dfc,$40(a6)
		move.w	#64*_mskheight+20,$58(a6)
		lea	40(a0),a0
		waitblt
		move.l	a1,$50(a6)
		move.l	a0,$4c(a6)
		move.l	a1,$54(a6)
		move.w	#$0dfc,$40(a6)
		move.w	#64*_mskheight+20,$58(a6)
		waitblt
		move.l	a1,$50(a6)
		lea	40(a1),a2
		move.l	a2,$54(a6)
		move.w	#$09f0,$40(a6)
		move.w	#64*_mskheight+20,$58(a6)
		waitblt
		move.l	a1,$50(a6)
		lea	80(a1),a2
		move.l	a2,$54(a6)
		move.w	#64*_mskheight+20,$58(a6)
		waitblt
		move.l	a1,$50(a6)
		lea	120(a1),a2
		move.l	a2,$54(a6)
		move.w	#64*_mskheight+20,$58(a6)
		waitblt
		move.l	a1,$50(a6)
		lea	160(a1),a2
		move.l	a2,$54(a6)
		move.w	#64*_mskheight+20,$58(a6)
		waitblt
		rts
		endm
;------------------------------------------------
initbobpos_m	macro
		bsr	geta5
		move.l	nm-d(a5),a0
		moveq	#_nmeno-1,d7
.l1		tst.w	nmenable(a0)
		beq.s	.c1
		bsr	doreset2
		clr.w	nmenable(a0)
.c1		addq.l	#4,a0
		dbra	d7,.l1
		rts
		endm
;------------------------------------------------
initstatus_m	macro
		lea	lives-d(a5),a0
		lea	status+32+35*36*4+13,a1
		add.l	(_nmem).w,a1
		moveq	#1,d7
		bsr	printbig
		rts
		endm
;------------------------------------------------
setscrnpos_m	macro
		bsr	geta5
		move.l	d2,absmanxpos-d(a5)
		move.l	d3,absmanypos-d(a5)
		sub.l	d0,d2
		move.w	d2,manxpos-d(a5)
		sub.l	d1,d3
		move.w	d3,manypos-d(a5)
		
		move.l	d0,xsoftabs-d(a5)
		mov