	include	'exec/types.i'
	include	'exec/memory.i'
	include	'exec/interrupts.i'
	include	'exec/io.i'
	include	'exec/libraries.i'
	include 'exec/execbase.i'
	include	'exec/exec_lib.i'
	include	'graphics/gfxbase.i'
	include	'graphics/displayinfo.i'
	include	'intuition/intuition.i'
	include 'intuition/intuition_lib.i'
	include	'devices/audio.i'
	include	'devices/scsidisk.i'
	include	'hardware/custom.i'
	include	'hardware/intbits.i'
	include	'hardware/dmabits.i'
	include	'hardware/adkbits.i'
	include	'hardware/cia.i'
	include	'graphics/graphics_lib.i'
	include	'dos/dos.i'
	include	'dos/dos_lib.i'
	include	'audio_driver.i'
	include	'libraries/gadtools.i'
	include	'libraries/gadtools_lib.i'
		
	include	'resource.i'

	section audio_code,code

;**********************************************************************

	XDEF	_StartResource
	XDEF	@StartResource
	
_StartResource
@StartResource
StartResource:

	movem.l	d0-d1/a0-a1,-(sp)
	bsr	ActivateNewResource
	lea	intuition_name(pc),a1
	moveq	#37,d0
	moveq	#E_PLACE|E_FATALERROR,d1
	bsr	R_OpenLibrary
	move.l	d0,_IntuitionBase
	lea	dos_name(pc),a1
	moveq	#37,d0
	moveq	#E_PLACE|E_FATALERROR,d1
	bsr	R_OpenLibrary
	move.l	d0,_DOSBase
	lea	graphics_name(pc),a1
	moveq	#37,d0
	moveq	#E_PLACE|E_FATALERROR,d1
	bsr	R_OpenLibrary
	move.l	d0,_GfxBase
	lea	gadtools_name(pc),a1
	moveq	#37,d0
	moveq	#E_PLACE|E_FATALERROR,d1
	bsr	R_OpenLibrary
	move.l	d0,_GadToolsBase	
	movem.l	(sp)+,d0-d1/a0-a1
	rts
	
graphics_name	dc.b	'graphics.library',0
intuition_name	dc.b	'intuition.library',0
dos_name	dc.b	'dos.library',0
gadtools_name	dc.b	'gadtools.library',0


;**********************************************************************

	;Global Variables

	cnop	0,4

_IntuitionBase	dc.l	0
_DOSBase	dc.l	0
_GfxBase	dc.l	0
_GadToolsBase	dc.l	0

originalStack	dc.l	0
	
mainList	dc.l	0
resList		dc.l	0
resNext		dc.l	0


;**********************************************************************

	cnop	0,4
	
_LVOAllocBitMap	EQU	-$396
_LVOFreeBitMap	EQU	-$39C
	
	;d0	=	width
	;d1	=	height
	;d2	=	depth
	;d3	=	flags

	XDEF	_R_AllocBitMap
	XDEF	@R_AllocBitMap

_R_AllocBitMap	
@R_AllocBitMap
R_AllocBitMap
	
	movem.l	d4-d7/a0-a1/a6,-(sp)
	move.l	d0,d4
	move.l	d1,d5
	move.l	d2,d6
	move.w	d3,d7
	move.l	_GfxBase(pc),a6
R_ABM1	moveq	#11,d3
	suba.l	a0,a0
	jsr	_LVOAllocBitMap(a6)
	move.l	d0,d2
	bne	R_ABM2
	lea	r_abmErr(pc),a0
	move.l	d7,d0
	bsr	ProduceError
	tst.w	d0
	beq	R_ABM3
	move.l	d4,d0
	move.l	d5,d1
	move.l	d6,d2
	bra	R_ABM1
R_ABM2	andi.w	#E_PLACE,d7
	moveq	#R_BITMAP,d0
	moveq	#rl_SIZEOF,d1
	bsr	Res_PlaceList
R_ABM3	move.l	d2,d0
	movem.l	(sp)+,d4-d7/a0-a1/a6
	rts
	
r_abmErr	dc.b	'Could not create bitmap.',0

;**********************************************************************

	cnop	0,4
	
	;a0	=	Screen Name
	;d0	=	flags
	;return	=	d0

	XDEF	_R_LockPubScreen
	XDEF	@R_LockPubScreen
	
@R_LockPubScreen
_R_LockPubScreen
R_LockPubScreen

	movem.l	d1-d3/a5-a6,-(sp)
	move.l	a0,a5
	move.l	d0,d3
	move.l	_IntuitionBase,a6
RLS_1	jsr	_LVOLockPubScreen(a6)
	move.l	d0,d2
	bne	RLS_2
	lea	r_lpsErr(pc),a0
	move.l	d3,d0
	bsr	ProduceError
	tst.l	d0
	beq	RLS_3
	move.l	a5,a0
	bra	RLS_1
RLS_2	andi.b	#E_PLACE,d3
	beq	RLS_3
	moveq	#R_LOCKSCREEN,d0
	moveq	#rl_SIZEOF,d1
	bsr	Res_PlaceList
RLS_3	move.l	d2,d0
	movem.l	(sp)+,d1-d3/a5-a6
	rts
	
r_lpsErr	dc.b	'Could not lock screen.',0

;**********************************************************************

	cnop	0,4
	
	;a0	=	Window
	;a1	=	Menu structure
	;d0	=	flags
	;no return
	
	XDEF	_R_SetMenuStrip
	XDEF	@R_SetMenuStrip
	
_R_SetMenuStrip
@R_SetMenuStrip

	movem.l	d1-d3/a4-a6,-(sp)
	move.l	d0,d3
	move.l	a0,a4
	move.l	a1,a5
	move.l	_IntuitionBase(pc),a6
RSM_1	jsr	_LVOSetMenuStrip(a6)
	tst.l	d0
	bne	RSM_2
	lea	r_smsErr(pc),a0
	move.l	d3,d0
	bsr	ProduceError
	tst.l	d0
	beq	RSM_3
	move.l	a4,a0
	move.l	a5,a1
	bra	RSM_1
RSM_2	andi.w	#E_PLACE,d3
	beq	RSM_3
	move.l	a5,d2
	moveq	#R_MENUSTRIP,d0
	moveq	#rl_SIZEOF,d1
	bsr	Res_PlaceList
RSM_3	movem.l	(sp)+,d1-d3/a4-a6
	rts
	
r_smsErr	dc.b	'Could not set menu to window.',0

;**********************************************************************

	cnop	0,4
	
	;a0	=	NewWindow
	;a1	=	TagList
	;d0	=	flags
	;return	=	d0
	
	XDEF	_R_OpenWindowTags
	XDEF	@R_OpenWindowTags
	
_R_OpenWindowTags
@R_OpenWindowTags

	movem.l	d1-d3/a4-a6,-(sp)
	move.l	a0,a4
	move.l	a1,a5
	move.l	d0,d3
	move.l	_IntuitionBase(pc),a6
ROW_1	jsr	_LVOOpenWindowTagList(a6)
	move.l	d0,d2
	bne	ROW_2
	lea	R_owErr(pc),a0
	move.l	d3,d0
	bsr	ProduceError
	tst.l	d0
	beq	ROW_3
	move.l	a4,a0
	move.l	a5,a1
	bra	ROW_1
ROW_2	andi.w	#E_PLACE,d3
	moveq	#R_WINDOW,d0
	moveq	#rl_SIZEOF,d1
	bsr	Res_PlaceList
ROW_3	move.l	d2,d0
	movem.l	(sp)+,d1-d3/a4-a6
	rts

R_owErr		dc.b	'Could not open window.',0
	
;**********************************************************************

	cnop	0,4
	
	;a0	=	Screen
	;a1	=	TagList
	;d0	=	flags
	;return	=	d0
	
	XDEF	_R_GetVisualInfo
	XDEF	@R_GetVisualInfo
	
_R_GetVisualInfo
@R_GetVisualInfo

	movem.l	d1-d3/a4-a6,-(sp)
	move.l	a0,a4
	move.l	a1,a5
	move.l	d0,d3
	move.l	_GadToolsBase(pc),a6
RGV_1	jsr	_LVOGetVisualInfoA(a6)
	move.l	d0,d2
	bne	RGV_2
	lea	R_gviErr(pc),a0
	move.l	d3,d0
	bsr	ProduceError
	tst.l	d0
	beq	RGV_3
	move.l	a4,a0
	move.l	a5,a1
	bra	RGV_1
RGV_2	andi.w	#E_PLACE,d3
	beq	RGV_3
	moveq	#R_VISUAL,d0
	moveq	#rl_SIZEOF,d1
	bsr	Res_PlaceList
RGV_3	move.l	d2,d0
	movem.l	(sp)+,d1-d3/a4-a6
	rts
	
R_gviErr	dc.b	'Could not get Visual Information.',0

;**********************************************************************

	cnop	0,4
	
	;a0	=	newMenu
	;a1	=	TagList
	;d0	=	flags
	;return	=	d0
	
	XDEF	_R_CreateMenus
	XDEF	@R_CreateMenus
	
_R_CreateMenus
@R_CreateMenus

	movem.l	d1-d3/a4-a6,-(sp)
	move.l	a0,a4
	move.l	a1,a5
	move.l	d0,d3
	move.l	_GadToolsBase(pc),a6
RCM_1	jsr	_LVOCreateMenusA(a6)
	move.l	d0,d2
	bne	RCM_2
	lea	R_cmErr(pc),a0
	move.l	d3,d0
	bsr	ProduceError
	tst.l	d0
	beq	RCM_2
	move.l	a4,a0
	move.l	a5,a1
	bra	RCM_1
RCM_2	andi.w	#E_PLACE,d3
	beq	RCM_3
	moveq	#R_MENU,d0
	moveq	#rl_SIZEOF,d1
	bsr	Res_PlaceList
RCM_3	move.l	d2,d0
	movem.l	(sp)+,d1-d3/a4-a6
	rts
	
R_cmErr		dc.b	'Could not menu structure.',0

;**********************************************************************

	cnop	0,4
	
	XDEF	_OpenFile
	XDEF	@OpenFile
	
_OpenFile
@OpenFile
OpenFile:

	;d1	=	fileName
	;d2	=	accessMode
	;d3	=	flags
	
	movem.l	d4-d5/a0-a1/a6,-(sp)
	move.l	d1,d4
	move.l	d2,d5
	move.l	_DOSBase(pc),a6
OF_3	jsr	_LVOOpen(a6)
	move.l	d0,d2
	bne	OF_1
	lea	OF_err1(pc),a0
	lea	textArea,a1
	bsr	StrCpy
	move.l	d4,a0
	bsr	StrCpy
	lea	OF_err2(pc),a0
	bsr	StrCpy
	lea	textArea,a0
	bsr	ProduceError
	tst.w	d0
	beq	OF_2
	move.l	d4,d1
	move.l	d5,d2
	bra	OF_3
OF_1	andi.b	#E_PLACE,d3
	beq	OF_2
	moveq	#R_FILE,d0
	moveq	#rl_SIZEOF,d1
	bsr	Res_PlaceList
OF_2	move.l	d2,d0
	movem.l	(sp)+,d4-d5/a0-a1/a6
	rts


OF_err1		dc.b	'Could not open file "',0
OF_err2		dc.b	'".',0

;**********************************************************************

	cnop	0,4

	;d0=memSize
	;d1=memType
	;d2.w=memFlags
	
	;return = d0
	
	;scrap registers d0,d1

	XDEF	_GetMem
	XDEF	@GetMem
	
_GetMem
@GetMem
GetMem:

	movem.l	d2/d5-d6/a0-a1/a6,-(sp)
	move.l	d0,d5
	move.l	d1,d6
	move.l	4.w,a6
GM_1	jsr	_LVOAllocMem(a6)
	exg	d0,d2
	tst.l	d2
	bne.b	GM_2
	move.w	d0,d2
	lea	GM_errorMsg(pc),a0
	bsr	ProduceError
	tst.w	d0
	beq	GM_3
	move.l	d5,d0
	move.l	d6,d1
	bra.b	GM_1
GM_2	andi.b	#E_PLACE,d0
	beq.b	GM_3
	moveq	#R_MEMORY,d0
	moveq	#rmr_SIZEOF,d1
	bsr	Res_PlaceList
	move.l	d5,rm_memSize(a0)
GM_3	move.l	d2,d0
	movem.l	(sp)+,d2/d5-d6/a0-a1/a6
	rts
	
GM_errorMsg	dc.b	'Could not allocate enough memory.',0

;**********************************************************************

	;a1	=	libName
	;d0	=	version No.
	;d1.w	=	Flags
	;return	=	d0
	
	XDEF	_R_OpenLibrary
	XDEF	@R_OpenLibrary
	
_R_OpenLibrary
@R_OpenLibrary
R_OpenLibrary:

	movem.l	d2-d5/a0/a6,-(sp)
	move.l	d0,d3
	move.w	d1,d5
	move.l	a1,d4
	move.l	4.w,a6
R_OP1a	jsr	_LVOOpenLibrary(a6)
	move.l	d0,d2
	bne	R_OP1
	lea	R_OP_msg1(pc),a0
	lea	textArea,a1
	bsr	StrCpy
	move.l	d4,a0
	bsr	StrCpy
	lea	R_OP_msg2(pc),a0
	bsr	StrCpy
	move.l	d3,d0
	bsr	itoa
	lea	R_OP_msg3(pc),a0
	bsr	StrCpy
	clr.b	(a1)
	lea	textArea,a0
	move.w	d5,d0
	bsr	ProduceError
	tst.w	d0
	beq	R_OP2
	move.l	d3,d0
	move.l	d4,a1
	bra	R_OP1a
R_OP1	andi.w	#E_PLACE,d5
	beq	R_OP2
	moveq	#R_LIBRARY,d0
	moveq	#rl_SIZEOF,d1
	bsr	Res_PlaceList
R_OP2	move.l	d2,d0
	movem.l	(sp)+,a0/d2-d5/a6
	rts

R_OP_msg1	dc.b	'Could not open library "',0
R_OP_msg2	dc.b	'" V',0
R_OP_msg3	dc.b	'.',0

;**********************************************************************
	
	cnop	0,4
	
	;d0	=	msgFlags
	;return =	d0
	
	XDEF	_R_NewMsgPort
	XDEF	@R_NewMsgPort
		
_R_NewMsgPort
@R_NewMsgPort
R_NewMsgPort:

	movem.l	d1-d3/a0-a1/a6,-(sp)
	move.w	d0,d3
	move.l	4.w,a6
R_NMP3	jsr	_LVOCreateMsgPort(a6)
	move.l	d0,d2
	bne	R_NMP1
	lea	R_NMP_errorMsg(pc),a0
	move.l	d3,d0
	bsr	ProduceError
	tst.l	d0
	beq	R_NMP2
	bra	R_NMP3
R_NMP1	andi.b	#E_PLACE,d3
	beq	R_NMP2
	moveq	#R_MSGPORT,d0
	moveq	#rl_SIZEOF,d1
	bsr	Res_PlaceList
R_NMP2	move.l	d2,d0
	movem.l	(sp)+,d1-d3/a0-a1/a6
	rts

R_NMP_errorMsg	dc.b	'Could not allocate message port.',0

;**********************************************************************

	cnop	0,4
	
	;a0	=	MsgPort
	;d0	=	size
	;d1	=	ioFlags
	;return	=	d0
	
	XDEF	_R_NewIORequest
	XDEF	@R_NewIORequest
	
_R_NewIORequest
@R_NewIORequest
R_NewIORequest:

	movem.l	d2-d4/a1-a2/a6,-(sp)
	move.l	a0,a2
	move.l	d0,d3
	move.w	d1,d4
	move.l	4.w,a6
R_NIO1	jsr	_LVOCreateIORequest(a6)
	move.l	d0,d2
	bne	R_NIO2
	lea	R_NIO_errorMsg(pc),a0
	move.l	d4,d0
	bsr	ProduceError
	tst.l	d0
	beq	R_NIO3
	move.l	a2,a0
	move.l	d3,d0
	bra	R_NIO1
R_NIO2	andi.b	#E_PLACE,d4
	beq	R_NIO3
	moveq	#R_IOREQUEST,d0
	moveq	#rl_SIZEOF,d1
	bsr	Res_PlaceList
R_NIO3	move.l	d2,d0
	movem.l	(sp)+,d2-d4/a1-a2/a6
	rts
	
R_NIO_errorMsg	dc.b	'Could not create IO port',0
	

;**********************************************************************
	
	;a0	=	device name
	;d0	=	device unit
	;a1	=	ioRequest
	;a2	=	devF
	;d1	=	device flags
	;d2	=	flags

	cnop	0,4

	XDEF	_OpenDeviceRes
	XDEF	@OpenDeviceRes
	
_OpenDeviceRes
@OpenDeviceRes
OpenDeviceRes:

	movem.l	d3-d5/a3-a4/a6,-(sp)
	move.l	a0,a4
	move.l	a1,a3
	move.l	d0,d3
	move.l	d1,d4
	move.l	4.w,a6
ODR_1	jsr	_LVOOpenDevice(a6)
	move.l	d0,d5
	beq	ODR_2
	lea	textArea,a1
	lea	ODR_msg1(pc),a0
	bsr	StrCpy
	move.l	a4,a0
	bsr	StrCpy
	lea	ODR_msg2(pc),a0
	bsr	StrCpy
	move.l	d3,d0
	bsr	itoa
	lea	ODR_msg3(pc),a0
	bsr	StrCpy
	clr.b	(a1)
	lea	textArea,a0
	move.l	d2,d0
	bsr	ProduceError
	tst.l	d0
	beq	ODR_3
	move.l	a4,a0
	move.l	a3,a1
	move.l	d3,d0
	move.l	d4,d1
	bra	ODR_1
ODR_2	andi.b	#E_PLACE,d2
	beq	ODR_3
	moveq	#R_DEVICE,d0
	moveq	#rd_SIZEOF,d1
	move.l	a3,d2
	bsr	Res_PlaceList
	move.l	a2,rd_checkFlag(a0)
ODR_3	move.l	d5,d0
	movem.l	(sp)+,d3-d5/a3-a4/a6
	rts

ODR_msg1	dc.b	'Could not open "',0
ODR_msg2	dc.b	'" unit-',0
ODR_msg3	dc.b	'.',0
	
;**********************************************************************

	cnop	0,4
	
	;d0	=	signalNum
	;d1	=	flags
	;return	=	d0
	
	XDEF	_NewSignal
	XDEF	@NewSignal
	
_NewSignal
@NewSignal
NewSignal:

	movem.l	d2-d4/a0-a1/a6,-(sp)
	move.w	d0,d3
	move.w	d1,d4
	move.l	4.w,a6
NS_1	jsr	_LVOAllocSignal(a6)
	move.l	d0,d2
	tst.b	d0
	bpl	NS_2
	lea	NS_errorMsg(pc),a0
	move.l	d4,d0
	bsr	ProduceError
	tst.w	d0
	beq	NS_3
	move.w	d3,d0
	bra	NS_1
NS_2	andi.b	#E_PLACE,d4
	beq	NS_3
	moveq	#R_SIGNAL,d0
	moveq	#rl_SIZEOF,d1
	bsr	Res_PlaceList
NS_3	move.l	d2,d0
	movem.l	(sp)+,d2-d4/a0-a1/a6
	rts
	
NS_errorMsg	dc.b	'Could not allocate signal bit',0

;**********************************************************************

	cnop	0,4

	;d0	=	byteSize
	;d1	=	attributes
	;d2	=	flag
	;return	=	d0
	
	XDEF	_GetVec
	XDEF	@GetVec
	
_GetVec
@GetVec
GetVec:

	movem.l	d3-d5/a0-a1/a6,-(sp)
	move.l	d0,d3
	move.l	d1,d4
	move.w	d2,d5
	move.l	4.w,a6
GV_1	jsr	_LVOAllocVec(a6)
	move.l	d0,d2
	bne	GV_2
	lea	GV_errorMsg(pc),a0
	move.l	d5,d0
	bsr	ProduceError
	tst.w	d0
	beq	GV_3
	move.l	d3,d0
	move.l	d4,d1
	bra	GV_1
GV_2	andi.w	#E_PLACE,d5
	beq	GV_3
	moveq	#R_VEC,d0
	moveq	#rl_SIZEOF,d1
	bsr	Res_PlaceList
GV_3	move.l	d2,d0
	movem.l	(sp)+,d3-d5/a0-a1/a6
	rts

GV_errorMsg	dc.b	'Not enough memory aviable.',0
	
;**********************************************************************


	cnop	0,4
		
	;a0	=	source
	;a1	=	destination
	
StrCpy:
	move.b	(a0)+,d0
	beq	ST_E
	move.b	d0,(a1)+
	bra	StrCpy
ST_E	rts

;**********************************************************************

	;d0.l	=	number
	;a1	=	string buffer
	
itoa:	movem.l	d1-d2/a0,-(sp)
	lea	textAreaB,a0
	tst.l	d0
	bpl	itoa_1a
	move.b	#'-',(a1)+
itoa_1a	moveq	#0,d2
itoa_1	divul.l	#10,d1:d0
	addi.b	#$30,d1
	move.b	d1,(a0)+
	addq.w	#1,d2
	tst.l	d0
	bne	itoa_1
	subq.w	#1,d2
itoa_2	move.b	-(a0),(a1)+
	dbra	d2,itoa_2
	movem.l	(sp)+,d1-d2/a0
	rts

;**********************************************************************

	;d0	=	type
	;d1	=	sizeof
	;d2.l	=	item
	;return	=	a0

	;scrap d0,d1

	XDEF	_Res_PlaceList
	XDEF	@Res_PlaceList
	
_Res_PlaceList
@Res_PlaceList	
Res_PlaceList:

	movem.l	d3-d4/a1,-(sp)
	move.w	d0,d3
	move.l	d2,d4
	move.l	d1,d0
	moveq	#1,d1
	move.w	#E_RETRYERROR,d2
	bsr	GetMem
	move.l	d0,a0
	tst.l	d0
	beq.w	RPL_1
	tst.l	resList(pc)
	bne	RPL_1a
	move.l	d0,resList
	clr.l	rl_prev(a0)
	bra.w	RPL_3
RPL_1a	move.l	resNext(pc),a1
	move.l	d0,rl_next(a1)
	move.l	a1,rl_prev(a0)
RPL_3	move.l	a0,resNext
	clr.l	rl_next(a0)
	move.w	d3,rl_type(a0)
	move.l	d4,rl_item(a0)
	bra.b	RPL_4
RPL_1	lea	RPL_errorMsg(pc),a0
	bsr	FatalError
RPL_4	move.l	d4,d2
	movem.l	(sp)+,a1/d3-d4
	rts

RPL_errorMsg	dc.b	'Not enough memory available.',0

;**********************************************************************

	cnop	0,4
	
	XDEF	_ActivateNewResource
	XDEF	@ActivateNewResource
	
_ActivateNewResource
@ActivateNewResource
ActivateNewResource:

	bsr	AllocResource
	bsr	ActivateResource
	rts

;**********************************************************************

	XDEF	_AllocResource
	XDEF	@AllocResource
	
_AllocResource
@AllocResource
AllocResource:

	movem.l	d1-d2/a0-a1,-(sp)
	moveq	#rma_SIZEOF,d0
	move.l	#MEMF_PUBLIC|MEMF_CLEAR,d1
	moveq	#E_FATALERROR,d2
	bsr	GetMem
	move.l	d0,a1
	moveq	#rma_SIZEOF,d0
	move.l	#MEMF_PUBLIC|MEMF_CLEAR,d1
	moveq	#E_FATALERROR,d2
	bsr	GetMem
	move.l	mainList(pc),a0
	tst.l	a0
	beq	AR_1
AR_1a	move.l	rma_next(a0),d1
	beq	AR_1b
	move.l	d1,a0
	bra	AR_1a
AR_1b	move.l	a0,rma_prev(a1)
	move.l	a1,rma_next(a0)
	bra	AR_2
AR_1	move.l	a1,mainList
AR_2	move.l	d0,rma_resList(a1)
	move.l	d0,a0
	move.w	#R_BLANK,rl_type(a0)
	movem.l	(sp)+,d1-d2/a0-a1
	rts

;**********************************************************************

	;d0	=	oldList

	XDEF	_RemoveResource
	XDEF	@RemoveResource
	
_RemoveResource
@RemoveResource
RemoveResource:

	movem.l	d1-d3/a0-a2/a6,-(sp)
	move.l	mainList(pc),a2
	tst.l	a2
	beq	RR_E
RR_1	cmp.l	rma_resList(a2),d0
	bne	RR_3
	move.l	resList(pc),d2
	move.l	resNext(pc),d3
	bsr	ActivateResource
	bsr	Res_FreeResource
	move.l	rma_prev(a2),a0
	move.l	rma_next(a2),a1
	tst.l	a1
	beq	RR_4
	move.l	a0,rma_prev(a1)
RR_4	tst.l	a0
	beq	RR_5
	move.l	a1,rma_next(a0)
RR_5	move.l	4.w,a6
	move.l	a2,a1
	moveq	#rma_SIZEOF,d0
	jsr	_LVOFreeMem(a6)
	move.l	d2,resList
	move.l	d3,resNext
	bra	RR_E
RR_3	move.l	rma_next(a2),a2
	tst.l	a2
	bne	RR_1
RR_E	movem.l	(sp)+,d1-d3/a0-a2/a6
	rts

;**********************************************************************

	;d0	=	actList
	
	XDEF	_ActivateResource
	XDEF	@ActivateResource
	
_ActivateResource
@ActivateResource
ActivateResource:

	movem.l	d0/a0,-(sp)
	move.l	mainList(pc),a0
	tst.l	a0
	beq	ARe_E
ARe_1	cmp.l	rma_resList(a0),d0
	bne	ARe_2
	move.l	rma_resList(a0),a0
	move.l	a0,resList
ARe_4	move.l	rl_next(a0),d0
	beq	ARe_3
	move.l	d0,a0
	bra	ARe_4
ARe_3	move.l	a0,resNext
	bra	ARe_E
ARe_2	move.l	rma_next(a0),a0
	tst.l	a0
	bne	ARe_1
ARe_E	movem.l	(sp)+,d0/a0
	rts

;**********************************************************************

	XDEF	_FreeAll
	XDEF	@FreeAll
	
_FreeAll
@FreeAll
FreeAll:

	movem.l	d0-d1/a0-a2/a6,-(sp)
	move.l	4.w,a6
	move.l	mainList(pc),a2
	tst.l	a2
	beq	FA_E
FA_1	move.l	rma_next(a2),d0
	beq	FA_2
	move.l	d0,a2
	bra	FA_1
FA_2	move.l	rma_resList(a2),d0
	bsr	ActivateResource
	bsr	Res_FreeResource
	move.l	a2,a1
	move.l	rma_prev(a1),a2
	moveq	#rma_SIZEOF,d0
	jsr	_LVOFreeMem(a6)
	tst.l	a2
	bne	FA_2
FA_E	movem.l	(sp)+,d0-d1/a0-a2/a6
	rts

;**********************************************************************

	XDEF	_Res_FreeResource
	XDEF	@Res_FreeResource
	
_Res_FreeResource
@Res_FreeResource
Res_FreeResource:

	movem.l	d0-d1/a0-a3/a6,-(sp)
	move.l	resNext(pc),a2
	lea	R_jmpTab(pc),a3
R_1	tst.l	a2
	beq	R_E
	move.l	4.w,a6
	move.w	rl_type(a2),d0
	move.l	(d0.w*4,a3),d0
R_jmp	jmp	(pc,d0.l)
R_mem	move.l	rl_item(a2),a1
	move.l	rm_memSize(a2),d0
	jsr	_LVOFreeMem(a6)
	moveq	#rmr_SIZEOF,d0
	bra	R_2
R_scr	move.l	_IntuitionBase(pc),a6
	move.l	rl_item(a2),a0
	jsr	_LVOCloseScreen(a6)
	moveq	#rl_SIZEOF,d0
	bra	R_2
R_lib	move.l	rl_item(a2),a1
	jsr	_LVOCloseLibrary(a6)
	moveq	#rl_SIZEOF,d0
	bra	R_2
R_bla	moveq	#rl_SIZEOF,d0
	bra	R_2
R_msg	move.l	rl_item(a2),a0
	jsr	_LVODeleteMsgPort(a6)
	moveq	#rl_SIZEOF,d0
	bra	R_2
R_ior	move.l	rl_item(a2),a0
	jsr	_LVODeleteIORequest(a6)
	moveq	#rl_SIZEOF,d0
	bra	R_2
R_dev	move.l	rd_checkFlag(a2),a1
	tst.b	(a1)
	beq	R_dev1
	move.l	rl_item(a2),a1
	jsr	_LVOCheckIO(a6)
	tst.l	d0
	bne	R_dev1
	move.l	rl_item(a2),a1
	jsr	_LVOAbortIO(a6)
	move.l	rl_item(a2),a1
	jsr	_LVOWaitIO(a6)
R_dev1	move.l	rl_item(a2),a1
	jsr	_LVOCloseDevice(a6)
	moveq	#rd_SIZEOF,d0
	bra	R_2
R_fun	move.l	rl_item(a2),a1
	jsr	(a1)
	moveq	#rl_SIZEOF,d0
	bra	R_2
R_vec	move.l	rl_item(a2),a1
	jsr	_LVOFreeVec(a6)
	moveq	#rl_SIZEOF,d0
	bra	R_2
R_sig	move.l	rl_item(a2),d0
	jsr	_LVOFreeSignal(a6)
	moveq	#rl_SIZEOF,d0
	bra	R_2
	
R_clo	move.l	rl_item(a2),d1
	move.l	_DOSBase(pc),a6
	jsr	_LVOClose(a6)
	moveq	#rl_SIZEOF,d0
	bra	R_2
	
R_vis	move.l	rl_item(a2),a0
	move.l	_GadToolsBase(pc),a6
	jsr	_LVOFreeVisualInfo(a6)
	moveq	#rl_SIZEOF,d0
	bra	R_2
	
R_men	move.l	rl_item(a2),a0
	move.l	_GadToolsBase(pc),a6
	jsr	_LVOFreeMenus(a6)
	moveq	#rl_SIZEOF,d0
	bra	R_2
	
R_win	move.l	rl_item(a2),a0
	move.l	_IntuitionBase(pc),a6
	jsr	_LVOCloseWindow(a6)
	moveq	#rl_SIZEOF,d0
	bra	R_2
	
R_mes	move.l	rl_item(a2),a0
	move.l	_IntuitionBase(pc),a6
	jsr	_LVOClearMenuStrip(a6)
	moveq	#rl_SIZEOF,d0
	bra	R_2

R_unl	move.l	rl_item(a2),a1
	suba.l	a0,a0
	move.l	_IntuitionBase(pc),a6
	jsr	_LVOUnlockPubScreen(a6)
	moveq	#rl_SIZEOF,d0
	bra	R_2
	
R_bmp	move.l	rl_item(a2),a1
	suba.l	a0,a0
	move.l	_GfxBase(pc),a6
	jsr	_LVOFreeBitMap(a6)
	moveq	#rl_SIZEOF,d0
	bra	R_2

R_2	move.l	a2,a1
	move.l	rl_prev(a1),a2
	move.l	4.w,a6
	jsr	_LVOFreeMem(a6)
	bra	R_1
R_E	movem.l	(sp)+,d0-d1/a0-a3/a6
	rts

R_jmpTab	dc.l	R_mem-R_jmp-2
		dc.l	R_scr-R_jmp-2
		dc.l	R_lib-R_jmp-2
		dc.l	R_bla-R_jmp-2
		dc.l	R_msg-R_jmp-2
		dc.l	R_ior-R_jmp-2
		dc.l	R_dev-R_jmp-2
		dc.l	R_fun-R_jmp-2
		dc.l	R_vec-R_jmp-2
		dc.l	R_sig-R_jmp-2
		dc.l	R_clo-R_jmp-2
		dc.l	R_vis-R_jmp-2
		dc.l	R_men-R_jmp-2
		dc.l	R_win-R_jmp-2
		dc.l	R_mes-R_jmp-2
		dc.l	R_unl-R_jmp-2
		dc.l	R_bmp-R_jmp-2

;**********************************************************************
	
	cnop	0,4
	
	;d0	=	errorFlags
	;a0	=	errorMsg Ptr.
	;d0	=	return( 0=DON'T TRY AGAIN , 1=TRY AGAIN )

	XDEF	_ProduceError
	XDEF	@ProduceError
	
_ProduceError
@ProduceError
ProduceError:

	move.l	d1,-(sp)
	move.w	d0,d1
	andi.b	#E_NOTIFYERROR,d1
	beq	PE_1
	bsr	NotifyError
	moveq	#0,d0
	bra	PE_E
PE_1	move.w	d0,d1
	andi.b	#E_RETRYERROR,d1
	beq	PE_2
	bsr	RetryError
	bra	PE_E
PE_2	andi.b	#E_FATALERROR,d0
	beq	PE_3
	bsr	FatalError
PE_3	moveq	#0,d0
PE_E	move.l	(sp)+,d1
	rts
	
;**********************************************************************

	;a0	=	errorMsg
	;return	=	d0

	XDEF	_RetryError
	XDEF	@RetryError

_RetryError
@RetryError
RetryError:

	movem.l	d1/a1-a3/a6,-(sp)
	move.l	_IntuitionBase(pc),a6
	tst.l	a6
	beq	RE_E
	lea	RE_easy(pc),a1
	move.l	a0,12(a1)
	suba.l	a0,a0
	suba.l	a2,a2
	suba.l	a3,a3
	jsr	_LVOEasyRequestArgs(a6)
RE_E	movem.l	(sp)+,d1/a1-a3/a6
	rts
	
RE_easy		dc.l	20,0,RE_title,0,RE_msg
RE_title	dc.b	'Error',0
RE_msg		dc.b	'Retry|Cancel',0
	

;**********************************************************************

	cnop	0,4
	
	XDEF	_NotifyError
	XDEF	@NotifyError
	
_NotifyError
@NotifyError
NotifyError:

	movem.l	d1/a1-a3/a6,-(sp)
	move.l	_IntuitionBase(pc),a6
	tst.l	a6
	beq	NE_E
	lea	NE_easy(pc),a1
	move.l	a0,12(a1)
	suba.l	a0,a0
	suba.l	a2,a2
	suba.l	a3,a3
	jsr	_LVOEasyRequestArgs(a6)
NE_E	movem.l	(sp)+,d1/a1-a3/a6
	rts

NE_easy		dc.l	20,0,NE_title,0,NE_msg
NE_title	dc.b	'Message',0
NE_msg		dc.b	'OK',0


;**********************************************************************
	
	cnop	0,4
	
	XDEF	_FatalError
	XDEF	@FatalError
	
_FatalError
@FatalError
FatalError:

	movem.l	d0-d1/a1-a3/a6,-(sp)
	move.l	_IntuitionBase(pc),a6
	tst.l	a6
	beq	FE_1
	lea	FE_easy(pc),a1
	move.l	a0,12(a1)
	suba.l	a0,a0
	suba.l	a2,a2
	suba.l	a3,a3
	jsr	_LVOEasyRequestArgs(a6)
	bsr	FreeAll
FE_1	move.l	originalStack(pc),d0
	beq	FE_2
	move.l	d0,sp
	rts
FE_2	lea	FE_dosname(pc),a1
	moveq	#0,d0
	moveq	#E_RETRYERROR,d1
	bsr	R_OpenLibrary
	tst.l	d0
	beq	FE_3
	move.l	d0,a6
	moveq	#-1,d0
	jsr	_LVOExit(a6)
FE_3	movem.l	(sp)+,d0-d1/a1-a3/a6
	rts
	

FE_easy		dc.l	20,0,FE_title,0,FE_msg
FE_title	dc.b	'Fatal Error',0
FE_msg		dc.b	'OK',0
FE_dosname	dc.b	'dos.library',0

;**********************************************************************


	section resource_data,bss
	
textArea	ds.b	200
textAreaB	ds.b	100