*************************************************************************
*									*
*		   AMOS 1.3 TURBO LIBRARY	v1.6			*
*                   							*
*	Idea's and improvements may be sent to :			*
*									*
*	MANUEL ANDRE							*
*	Prins Boudewijnlaan 155/5					*
*	2610	WILRIJK							*
*									*
*	BELGIUM								*
*									*
*									*
*************************************************************************

*	ASSEMBLE AS TURBO.LIB and put it in your AMOS_SYSTEM directory.
*	SYMBOLS CASE --> INDEPENDANT !!! NO DEBUG INFO !!! EXECUTABLE !!!
*	Also modify your extension list, put TURBO.LIB as extension nr 8.

		OPT O+

ExtNb		equ	8-1	so this is extension nr 8 !!!


; Don't forget to change the INCDIR directories to your own needs...
; Do not remove the RsSet instruction!
		incdir	"dF0:include/"
		include "hardware/intbits.i"
		include "hardware/cia.i"
;		include	"hardware/custom.i"
		include	"hardware/blit.i"
		include "exec/nodes.i"
		include "exec/interrupts.i"
		include "exec/memory.i"
		include "exec/exec_lib.i"
;		incdir	"dh0:UPLOAD/EXTENSION/INCLUDES/"
 		Include	"_Equ.s"
		RsSet	DataLong
		Include "_Pointe.s"
		Include "_CEqu.s"
		Include	"_WEqu.s"
		Include	"_LEqu.s"

;   		    **CHIPS**
;
BLTCPTH     equ $48
BLTBPTH     equ $4C
BLTAPTH     equ $50
BLTDPTH     equ $54
BLTCMOD     equ $60
BLTBMOD     equ $62
BLTAMOD     equ $64
BLTDMOD     equ $66
BLTAFWM     equ $44
BLTALWM     equ $46
BLTDDAT     equ $00
BLTCDAT     equ $70
BLTBDAT     equ $72
BLTADAT     equ $74

; A usefull macro to find the address of data in the extension's own 
; datazone (see later)...
DLea		MACRO
		move.l	ExtAdr+ExtNb*16(a5),\2
		add.w	#\1-MB,\2
		ENDM

; Another macro to load the base address of the datazone...
DLoad		MACRO
		move.l	ExtAdr+ExtNb*16(a5),\1
		ENDM


******************************************************************
*	AMOS TURBO EXTENSION
;
; First, a pointer to the token list
Start	dc.l	C_Tk-C_Off
;
; Then, a pointer to the first library function
	dc.l	C_Lib-C_Tk
;
; Then to the title
	dc.l	C_Title-C_Lib
;
; From title to the end of the program
	dc.l	C_End-C_Title
;

; So, a value of 0 indicates to copy if needed only,
; A value of -1 forces the copy of the first library routine...
	dc.w	0	

******************************************************************
*	Offset to library


C_Off   dc.w (L1-L0)/2,(L2-L1)/2,(L3-L2)/2,(L4-L3)/2
        dc.w (L5-L4)/2,(L6-L5)/2,(L7-L6)/2,(L8-L7)/2
        dc.w (L9-L8)/2,(L10-L9)/2,(L11-L10)/2,(L12-L11)/2
	dc.w (L13-L12)/2,(L14-L13)/2,(L15-L14)/2,(L16-L15)/2
	dc.w (L17-L16)/2,(L18-L17)/2,(L19-L18)/2,(L20-L19)/2
	dc.w (L21-L20)/2,(L22-L21)/2,(L23-L22)/2,(L24-L23)/2
	dc.w (L25-L24)/2,(L26-L25)/2,(L27-L26)/2,(L28-L27)/2
	dc.w (L29-L28)/2,(L30-L29)/2,(L31-L30)/2,(L32-L31)/2
	dc.w (L33-L32)/2,(L34-L33)/2,(L35-L34)/2,(L36-L35)/2
	dc.w (L37-L36)/2,(L38-L37)/2,(L39-L38)/2,(L40-L39)/2
	DC.W (L41-L40)/2,(L42-L41)/2,(L43-L42)/2,(L44-L43)/2
	DC.W (L45-L44)/2,(L46-L45)/2,(L47-L46)/2,(L48-L47)/2
	DC.W (L49-L48)/2,(L50-L49)/2,(L51-L50)/2,(L52-L51)/2
	DC.W (L53-L52)/2,(L54-L53)/2,(L55-L54)/2,(L56-L55)/2
	DC.W (L57-L56)/2,(L58-L57)/2,(L59-L58)/2,(L60-L59)/2
	DC.W (L61-L60)/2,(L62-L61)/2,(L63-L62)/2,(L64-L63)/2
	DC.W (L65-L64)/2,(L66-L65)/2,(L67-L66)/2,(L68-L67)/2
	DC.W (L69-L68)/2,(L70-L69)/2,(L71-L70)/2,(L72-L71)/2	
	DC.W (L73-L72)/2,(L74-L73)/2,(L75-L74)/2,(L76-L75)/2
	DC.W (L77-L76)/2,(L78-L77)/2,(L79-L78)/2,(L80-L79)/2
	DC.W (L81-L80)/2,(L82-L81)/2,(L83-L82)/2,(L84-L83)/2
	DC.W (L85-L84)/2,(L86-L85)/2,(L87-L86)/2,(L88-L87)/2
	DC.W (L89-L88)/2,(L90-L89)/2,(L91-L90)/2,(L92-L91)/2
	DC.W (L93-L92)/2,(L94-L93)/2,(L95-L94)/2,(L96-L95)/2

; Do not forget the LAST label!!!

******************************************************************
*	TOKEN TABLE


; The next two lines needs to be unchanged...
C_Tk:	dc.w 	1,0
	dc.b 	$80,-1
	dc.w	L_MULTI_YES,-1
	dc.b	"multi ye","s"+$80,"I",-1
	dc.w	L_MULTI_NO,-1
	dc.b	"multi n","o"+$80,"I",-1
	dc.w	-1,L_LSL_B
	dc.b	"lsl.","b"+$80,"00,0",-1
	dc.w	-1,L_LSL_W
	dc.b	"lsl.","w"+$80,"00,0",-1
	dc.w	-1,L_LSL_L
	dc.b	"lsl.","l"+$80,"00,0",-1
	dc.w	-1,L_LSR_B
	dc.b	"lsr.","b"+$80,"00,0",-1
	dc.w	-1,L_LSR_W
	dc.b	"lsr.","w"+$80,"00,0",-1
	dc.w	-1,L_LSR_L
	dc.b	"lsr.","l"+$80,"00,0",-1
	dc.w	-1,L_SWAP_VAL
	dc.b	"l swa","p"+$80,"00",-1
	dc.w	-1,L_TEST_B
	dc.b	"test.","b"+$80,"00,0",-1
	dc.w	-1,L_TEST_W
	dc.b	"test.","w"+$80,"00,0",-1
	dc.w	L_VBL_WAIT,-1
	dc.b	"vbl wai","t"+$80,"I0",-1
	dc.w	L_RESERVE_CHECK,-1
	dc.b	"reserve chec","k"+$80,"I0",-1
	dc.w	L_RELEASE_CHECK,-1
	dc.b	"check eras","e"+$80,"I",-1
	dc.w	-1,L_CHECK_ZONE
	dc.b	"chec","k"+$80,"00t0,0,0",-1
	dc.w	L_CHECK_SET,-1
	dc.b	"set chec","k"+$80,"I0,0,0t0,0",-1
	dc.w	L_CHECK_DISCARD,-1
	dc.b	"reset chec","k"+$80,"I0",-1
	dc.w	-1,L_HIT_ZONE_SPRITE
	dc.b	"hit spr zon","e"+$80,"00,0,0",-1
	dc.w	-1,L_HIT_ZONE_BOB
	dc.b	"hit bob zon","e"+$80,"00,0,0",-1
	dc.w	-1,L_CHECK_SPR
	dc.b	"hit spr chec","k"+$80,"00t0,0,0,0",-1
	dc.w	-1,L_RAW_KEY
	dc.b	"raw ke","y"+$80,"00",-1
	dc.w	L_R_POS,-1
	dc.b	"r mov","e"+$80,"I0,0",-1
	dc.w	L_R_LINE,-1
	dc.b	"r dra","w"+$80,"I0,0",-1
	dc.w	L_R_BOX,-1
	dc.b	"r bo","x"+$80,"I0,0",-1
	dc.w	L_R_HOME,-1
	dc.b	"r hom","e"+$80,"I0,0",-1
	dc.w	L_R_BAR,-1
	dc.b	"r ba","r"+$80,"I0,0",-1
	dc.w	L_DEF_OBJ_CH,-1
	dc.b	"reserve object chi","p"+$80,"I0,0",-1
	dc.w	L_DEF_OBJ_FA,-1
	dc.b	"reserve object fas","t"+$80,"I0,0",-1
	dc.w	L_DEF_OBJ_DRAW,-1
	dc.b	"define dra","w"+$80,"I0,0t0,0",-1
	dc.w	L_DEF_OBJ_MOVE,-1
	dc.b	"define mov","e"+$80,"I0,0t0,0",-1
	dc.w	L_DEF_OBJ_STOP,-1
	dc.b	"define sto","p"+$80,"I0,0",-1
	dc.w	L_DEF_OBJ_ATT,-1
	dc.b	"define att","r"+$80,"I0,0t0,0",-1
	dc.w	L_OBJECT_DRAW,-1
	dc.b	"object dra","w"+$80,"I0",-1
	dc.w	L_R_OBJECT_DRAW,-1
	dc.b	"r object dra","w"+$80,"I0,0,0",-1
	dc.w	L_OBJ_MAG_DRAW,-1
	dc.b	"object mag dra","w"+$80,"I0,0",-1
	dc.w	L_R_OBJ_MAG_DRA,-1
	dc.b	"r object mag dra","w"+$80,"I0,0,0,0",-1
	dc.w	L_DISCARD_OBJECT,-1
	dc.b	"object eras","e"+$80,"I0",-1
	dc.w	L_LINE_3D,-1
	dc.b	"line 3","d"+$80,"I0,0,0t0,0,0",-1
	dc.w	L_EYE_3D,-1
	dc.b	"eye 3","d"+$80,"I0,0",-1
	dc.w	L_OBJECT_SAVE,-1
	dc.b	"object sav","e"+$80,"I2,0t0",-1
	dc.w	L_OBJECT_LOAD_CHIP,-1
	dc.b	"object load chi","p"+$80,"I2,0",-1
	dc.w	L_BLIT_STORE,-1
	dc.b	"blit store lef","t"+$80,"I0,0,0,0t0,0,0",-1
	dc.w	L_MULTI_BLIT,-1
	dc.b	"multi bli","t"+$80,"I0t0",-1
	dc.w	L_ERASE_BLIT,-1
	dc.b	"blit eras","e"+$80,"I0",-1
	dc.w	L_BLIT_SPEED,-1
	dc.b	"blit spee","d"+$80,"I0,0",-1
	dc.w	L_BLIT_LEFT,-1
	dc.b	"blit lef","t"+$80,"I0,0,0t0,0,0",-1
	dc.w	L_FAST_PLOT,-1
	dc.b	"f plo","t"+$80,"I0,0,0",-1
	dc.w	L_BLIT_CLEAR,-1
	dc.b	"blit clea","r"+$80,"I0",-1
	dc.w	-1,L_LEFT_CLICK
	dc.b	"left clic","k"+$80,"0",-1
	dc.w	L_RES_STARS,-1
	dc.b	"reserve star","s"+$80,"I0",-1
	dc.w	L_DEF_STAR,-1
	dc.b	"define sta","r"+$80,"I0,0,0,0,0",-1
	dc.w	L_DRAW_STARS,-1
	dc.b	"display star","s"+$80,"I",-1
	dc.w	L_ERASE_STARS,-1
	dc.b	"stars eras","e"+$80,"I",-1
	dc.w	L_COMPUTE_STARS,-1
	dc.b	"stars comput","e"+$80,"I0t0",-1
	dc.w	L_F_STARS,-1
	dc.b	"f star","s"+$80,"I",-1
	dc.w	L_STARS_SPEED,-1
	dc.b	"stars spee","d"+$80,"I0t0,0,0",-1
	dc.w	L_CLIP_STARS,-1
	dc.b	"stars cli","p"+$80,"I0,0,0,0",-1
	dc.w	-1,L_FAST_POINT
	dc.b	"f poin","t"+$80,"00,0",-1
	dc.w	L_F_CIRCLE,-1
	dc.b	"f circl","e"+$80,"I0,0,0,0",-1
	dc.w	-1,L_FAST_SQR
	dc.b	"f sq","r"+$80,"00",-1
	dc.w	L_STARS_INT_ON,-1
	dc.b	"stars int o","n"+$80,"I0",-1
	dc.w	L_STARS_INT_OFF,-1
	dc.b	"stars int of","f"+$80,"I",-1
	dc.w	L_BLIT_INT_ON,-1
	dc.b	"blit int o","n"+$80,"I0t0",-1
	dc.w	L_BLIT_INT_OFF,-1
	dc.b	"blit int of","f"+$80,"I",-1
	dc.w	L_FAST_DRAW,-1
	dc.b	"!f dra","w"+$80,"I0,0t0,0",-2
	dc.w	L_FAST_DRAW_TO,-1
	dc.b	$80,"I0,0",-1
	dc.w	L_SET_OBJECT_LIMIT,-1
	dc.b	"object limi","t"+$80,"I0",-1
	dc.w	L_SET_PLANES,-1
	dc.b	"set plane","s"+$80,"I0",-1
	dc.w	L_PLANE_OFFSET,-1
	dc.b	"plane offse","t"+$80,"I0,0,0,0",-1
	dc.w	L_PLANE_SWAP,-1
	dc.b	"plane swa","p"+$80,"I0,0,0",-1
	dc.w	L_PLANE_SH_UP,-1
	dc.b	"plane shift u","p"+$80,"I0,0t0",-1
	dc.w	L_PLANE_SH_DOWN,-1
	dc.b	"plane shift dow","n"+$80,"I0,0t0",-1
	dc.w	L_PLANE_UPDATE,-1
	dc.b	"plane updat","e"+$80,"I0",-1
	dc.w	F_PASTE_ICON,-1
	dc.b	"f paste ico","n"+$80,"I0,0,0",-1
	dc.w	F_32BIT_ICON,-1
	dc.b	"f 32 ico","n"+$80,"I0,0,0",-1
	dc.w	F_16BIT_ICON,-1
	dc.b	"f 16 ico","n"+$80,"I0,0,0",-1
	dc.w	F_PROC_16ICON,-1
	dc.b	"f 16proc ico","n"+$80,"I0,0,0",-1
	dc.w	F_PROC_32ICON,-1
	dc.b	"f 32proc ico","n"+$80,"I0,0,0",-1
	dc.w	-1,L_ICON_X
	dc.b	"x ico","n"+$80,"00",-1
	dc.w	-1,L_ICON_Y
	dc.b	"y ico","n"+$80,"00",-1
	dc.w	-1,L_ICON_PLANES
	dc.b	"planes ico","n"+$80,"00",-1
	dc.w	-1,L_CPU_INFO
	dc.b	"cpu inf","o"+$80,"0",-1
	dc.w	-1,L_MATH_INFO
	dc.b	"math inf","o"+$80,"0",-1
	dc.w 	0	

iii		equ	0

C_Lib
******************************************************************
*		COLD START
*


L0	movem.l	a3-a6,-(sp)

;
; Here I store the address of the extension data zone in the special area
	lea	MB(pc),a3
	move.l	a3,ExtAdr+ExtNb*16(a5)
;
; Here, I store the address of the routine called by DEFAULT, or RUN
	lea	Default(pc),a0
	move.l	a0,ExtAdr+ExtNb*16+4(a5)
;
; Here, the address of the END routine,
	lea	End(pc),a0
	move.l	a0,ExtAdr+ExtNb*16+8(a5)
	movem.l	(sp)+,a3-a6
	moveq	#ExtNb,d0		* NO ERRORS
	rts

******* SCREEN RESET

Default	RTS

******* QUIT

End	RTS


; Now follows a big chunk of data. Better disable the RBsr system...

	RDATA

*********************************************************************
*		 extension data zone
MB:	
ZONE_DEFS		DC.L	0
RESERVED_BYTES		DC.L	0
MAX_CHECK		DC.W	0
OBJECT_LIMIT		DC.W	0
OBJECT_ADRES_BASE	DC.L	0
OBJECT_POINT_BASE	DC.L	0
OBJECT_DISKNAME		DS.B	80	MAX LENGTE VAN BETANDSNAAM
OBJECT_DISK_HEADER	DC.B	"OBJE"	HEADER DEFINITIE VAN OBJECT FILE
OBJECT_DISK_COUNT	DC.W	0	HOEVEEL OBJECTEN ZIJN ER ?
OBJECT_READ_BUFFER	DS.B	8	8 BYTES OF READ BUFFER
X_VIEW			DC.W	160
Y_VIEW			DC.W	100
BLIT_DEFS		DS.L	96
STARS_ADRES		DC.L	0
STARS_COUNT		DC.W	0
OFFSET_COUNT		DC.W	0
OFFSET_ADRES		DC.L	0
COMPUTE_TO		DC.W	0
STARS_CLIP		DS.W	4	CLIPPING THE STARS
STARS_INT_SCREEN	DC.L	0 
INT_STARS_SERVER	DC.L	0
INT_BLIT_SERVER		DC.L	0
INT_BLIT_FROM		DC.W	0
INT_BLIT_TO		DC.W	0
INT_STARS_ON		DC.W	0
STARS_INT_CLEAR		DC.W	0
INT_BLIT_ON		DC.W	0
INT_STARS_NAME		DC.B	"STARS_INT",0
INT_BLIT_NAME		DC.B	"BLITTER_I",0
			EVEN
X1			DC.W	0
Y1			DC.W	0
X2			DC.W	0
Y2			DC.W	0
PLANE_OFFSETS		DS.L	48	6 OFFSETS * 8 SCREENS
ECLOGIC_SAVE		DS.L	6	\
ECPHYSIC_SAVE		DS.L	6	|-> temporary storage-> Plane Update
ECCURRENT_SAVE		DS.L	6	/
			EVEN
**********************************************************************
; Please leave 1 or two labels free for future extension. You never
; know!
L1

; Now follow all the routines.


L_MULTI_YES		EQU	2
L2	MOVE.L	A6,A2
	CALLEXEC Permit			ENABLE MULTITASKING
	MOVE.L	A2,A6
	RTS

L_MULTI_NO		EQU	3
L3	MOVE.L	A6,A2
	CALLEXEC Forbid			DISABLE MULTITASKING
	MOVE.L	A2,A6
	RTS

L_LSL_B			EQU	4
L4	MOVE.L	(A3)+,D0		SHIFT COUNT
	MOVE.L	(A3)+,D3		VALUE TO BE SHIFTED
	LSL.B	D0,D3			DO IT, AND RETURN VALUE
	MOVEQ	#0,D2			THE RETURNED VALUE IS AN INTEGER
	RTS

L_LSL_W			EQU	5
L5	MOVE.L	(A3)+,D0		SHIFT COUNT
	MOVE.L	(A3)+,D3		VALUE TO BE SHIFTED
	LSL.W	D0,D3			DO IT, AND RETURN VALUE
	MOVEQ	#0,D2			THE RETURNED VALUE IS AN INTEGER
	RTS

L_LSL_L			EQU	6
L6	MOVE.L	(A3)+,D0		SHIFT COUNT
	MOVE.L	(A3)+,D3		VALUE TO BE SHIFTED
	LSL.L	D0,D3			DO IT, AND RETURN VALUE
	MOVEQ	#0,D2			THE RETURNED VALUE IS AN INTEGER
	RTS

L_LSR_B			EQU	7
L7	MOVE.L	(A3)+,D0		SHIFT COUNT
	MOVE.L	(A3)+,D3		VALUE TO BE SHIFTED
	LSR.B	D0,D3			DO IT, AND RETURN VALUE
	MOVEQ	#0,D2			THE RETURNED VALUE IS AN INTEGER
	RTS

L_LSR_W			EQU	8
L8	MOVE.L	(A3)+,D0		SHIFT COUNT
	MOVE.L	(A3)+,D3		VALUE TO BE SHIFTED
	LSR.W	D0,D3			DO IT, AND RETURN VALUE
	MOVEQ	#0,D2			THE RETURNED VALUE IS AN INTEGER
	RTS

L_LSR_L			EQU	9
L9	MOVE.L	(A3)+,D0		SHIFT COUNT
	MOVE.L	(A3)+,D3		VALUE TO BE SHIFTED
	LSR.L	D0,D3			DO IT, AND RETURN VALUE
	MOVEQ	#0,D2			THE RETURNED VALUE IS AN INTEGER
	RTS

L_SWAP_VAL		EQU	10
L10	MOVE.L	(A3)+,D3		VALUE TO BE SWAPPED
	SWAP 	D3			DO IT, AND RETURN VALUE
	MOVEQ	#0,D2			THE RETURNED VALUE IS AN INTEGER
	RTS

L_TEST_B		EQU	11
L11	MOVEQ	#0,D3			SET FALSE
	MOVE.L	(A3)+,D0		TEST VALUE
	MOVE.L	(A3)+,D1		VALUE TO BE TESTED
	CMP.B	D0,D1			EQUAL ?
	BNE.S	NEE_B
	MOVEQ	#-1,D3			OK, IS EQUAL. RETURN TRUE
NEE_B	MOVEQ	#0,D2			THE RETURNED VALUE IS AN INTEGER
	RTS

L_TEST_W		EQU	12
L12	MOVEQ	#0,D3			SET FALSE
	MOVE.L	(A3)+,D0		TEST VALUE
	MOVE.L	(A3)+,D1		VALUE TO BE TESTED
	CMP.W	D0,D1			EQUAL ?
	BNE.S	NEE_W
	MOVEQ	#-1,D3			OK, IS EQUAL. RETURN TRUE
NEE_W	MOVEQ	#0,D2			THE RETURNED VALUE IS AN INTEGER
	RTS

L_VBL_WAIT		EQU	13
L13	MOVE.L	(A3)+,D0		LINE TO WAIT FOR
VERTIC	MOVE.B	$DFF006,D1		ACTUAL POSITION OF RASTER BEAM
	CMP.B	D0,D1			EQUAL ?
	BNE.S	VERTIC
	RTS

L_RESERVE_CHECK		EQU	14
L14		MOVE.L	(A3)+,D0	     HOW MANY CHECK ZONES
		CMP.L	#32001,D0	     MORE THAN 32000 ?
		Rbge	L_IFonc
		MOVE.W	D0,D5
		Dload	A2
		CMP.W	#0,MAX_CHECK-MB(A2)  ANY ZONES RESERVED ?
		BNE.S	IS_RESERVED	     DISPLAY ERROR MESSAGE	
		MULU	#10,D0		     10 BYTES FOR EVERY CHECK ZONE
		MOVE.L	D0,RESERVED_BYTES-MB(A2)  STORE THE RESERVED AMOUNT
		MOVE.L	#MEMF_CHIP+MEMF_CLEAR,D1
		MOVE.L	A6,-(SP)	
		CALLEXEC AllocMem	    RESERVE THE MEMORY (CHIP+CLEARED)
		MOVE.L	(SP)+,A6
		Rbeq	OUT_OF_MEM
		MOVE.L	D0,ZONE_DEFS-MB(A2) STORE THE ADRES OF THE CHECK DEFS
		MOVE.W	D5,MAX_CHECK-MB(A2) STORE THE AMOUNT OF CHECK ZONES
		RTS
IS_RESERVED	MOVEQ	#0,D0		    CHECK ALLREADY RESERVED
		Rbra	L_CUSTOM

L_RELEASE_CHECK		EQU	15
L15		Dload	A2
		CMP.W	#0,MAX_CHECK-MB(A2)   CHECK ZONES TO BE CLEARED
		BEQ.S	NO_RELEASE	      NO ! ERROR !
		MOVE.L	ZONE_DEFS-MB(A2),A1   GET THE ADRESS OF THE MEMORY
		MOVE.W	#0,MAX_CHECK-MB(A2)   CLEAR THE AMOUNT OF CHECK ZONES
		MOVE.L	RESERVED_BYTES-MB(A2),D0   HOW MANY BYTES RESERVED ?
		MOVE.L	A6,-(SP)
		CALLEXEC FreeMem	      FREE THE MEMORY USED
		MOVE.L	(SP)+,A6
		RTS
NO_RELEASE	MOVEQ	#1,D0		      CHECK ALLREADY RELEASED !
		Rbra	L_CUSTOM
		RTS

L_CHECK_ZONE		EQU	16
L16		MOVEM.L	(A3)+,D4-D7		GET PARAMETERS
		Dload	A1
		CMP.W	#0,MAX_CHECK-MB(A1)	ANY ZONES RESERVED ?
		BEQ.S	DONT_CHECK_ZONE		NO ZONES RESERVED !
		CMP.W	MAX_CHECK-MB(A1),D6
		BGT.S	ERROR_CHECK		END  > MAX CHECK ZONES
		CMP.W	#1,D7
		BLT.S	ERROR_CHECK		START < 1
		SUB.W	D7,D6
		BMI.S	ERROR_CHECK		END < START
		SUBQ	#1,D7
		MOVE.W	D7,D3
		LSL.W	#3,D7			D7 * 10 BUT FASTER !
		ADD.W	D3,D7
		ADD.W 	D3,D7
		MOVE.L	ZONE_DEFS-MB(A1),A0
		ADD.L	D7,A0
CHECK_LOOP	MOVE.W	(A0)+,D7		ZONE
		BMI.S	NO_CHECK1
		MOVEM.W	(A0)+,D0-D3	X1,X2,Y1,Y2
		CMP.W	D1,D5		\
		BGT.S	NO_CHECK	|
		CMP.W	D0,D5		|
		BLT.S	NO_CHECK	|
		CMP.W	D3,D4		|-> CHECK IT !
		BGT.S	NO_CHECK	|
		CMP.W	D2,D4		|
		BLT.S	NO_CHECK	/
		MOVE.W	D7,D3		RETURN ZONE NUMBER
		MOVEQ	#0,D2		VALUE RETURNED IS AN INTEGER
		RTS
NO_CHECK1	ADDQ.L 	#8,A0
NO_CHECK	DBRA	D6,CHECK_LOOP
		MOVEQ	#0,D3		NO ZONE FOUND
		MOVEQ	#0,D2		VALUE RETURNED IS AN INTEGER
		RTS
ERROR_CHECK	MOVEQ	#23,D0
		Rjmp	L_Error
DONT_CHECK_ZONE	MOVEQ	#1,D0
		Rbra	L_Custom

L_CHECK_SET		EQU	17
L17		MOVE.L	(A3)+,D4	Y2
		Rbmi	L_IFonc
		MOVE.L	(A3)+,D2	X2
		Rbmi	L_IFonc
		MOVE.L	(A3)+,D3	Y1
		Rbmi	L_IFonc
		MOVE.L	(A3)+,D1	X1
		Rbmi	L_IFonc
		MOVE.L	(A3)+,D0	ZONE
		Rble	L_IFonc
		Dload	A1
		CMP.W	MAX_CHECK-MB(A1),D0	ZONE TO BE INSTALLED >
		Rbhi	L_IFonc			MAX AMOUNT OF ZONES ?
		MOVE.W	D0,D5
		SUBQ	#1,D0
		MOVE.W	D0,D6
		LSL.W	#3,D0		D0 * 10 BUT FASTER
		ADD.W	D6,D0
		ADD.W 	D6,D0
		MOVE.L	ZONE_DEFS-MB(A1),A0
		ADD.L	D0,A0
		MOVE.W	D5,D0
		MOVEM.W	D0-D4,(A0)	STORE X1,Y1,X2,Y1
		RTS

L_CHECK_DISCARD		EQU	18
L18		MOVE.L	(A3)+,D0
		Dload	A1
		CMP.W	#0,MAX_CHECK-MB(A1)	ANY ZONES RESERVED ?
		BEQ.S	NOT_RESERVED		NO ! DISPLAY MESSAGE !
		SUBQ	#1,D0
		Rbmi	L_IFonc
		CMP.W	MAX_CHECK-MB(A1),D0	ZONE TO BE DISCARDED >
		Rbhi	L_IFonc			MAX AMOUNT OF ZONES ?
		MOVE.W	D0,D1
		LSL.W	#3,D0			D0 * 10 BUT FASTER
		ADD.W	D1,D0
		ADD.W	D1,D0
		MOVE.L	ZONE_DEFS-MB(A1),A0
		MOVE.W	#-1,(A0,D0.L)		DISCARD THE ZONE
		RTS
NOT_RESERVED	MOVEQ	#1,D0
		Rbra	L_Custom

L_HIT_ZONE_SPRITE	EQU	19
L19		MOVE.L	(A3)+,D1	SPRITE NUMBER
		SyCall	XYSp		GET X (D1) AND Y (D2) COORDINATES 
		ADD.L	(A3)+,D2	Y COOR TO BE CHECKED
		ADD.L	(A3)+,D1	X COOR TO BE CHECKED
		MOVEQ	#0,D3
		MOVEQ	#8,D5
		SyCall	ZoHd		CHECK THE ZONES
		MOVE.W	D1,D3		RETURN ZONE
		MOVEQ	#0,D2		VALUE RETURNED IS AN INTEGER
		RTS

L_HIT_ZONE_BOB		EQU 	20
L20		MOVE.L	(A3)+,D1	BOB NUMBER
		SyCall	XYBob		GET X (D1) AND Y (D2) COORDINATES
		ADD.L	(A3)+,D2	Y COOR TO BE CHECKED
		ADD.L	(A3)+,D1	X COOR TO BE CHECKED
		MOVEQ	#0,D3
		SyCall	ZoGr		CHECK THE ZONES
		MOVE.W	D1,D3		RETURN ZONE
		MOVEQ	#0,D2		VALUE RETURNED IS AN INTEGER
		RTS

L_CHECK_SPR		EQU	21
L21		Dload	A1
		CMP.W	#0,MAX_CHECK-MB(A1)
		BEQ.S	DONT_CHECK_SPR
		MOVE.L	(A3)+,D1	Get Sprite Number
		SyCall	XYSp		GET X (D1) AND Y (D2) COORDINATES
		ADD.L	(A3)+,D2	Y COOR TO BE CHECKED
		ADD.L	(A3)+,D1	X COOR TO BE CHECKED
		MOVEQ	#0,D3
		SyCall	XyScr		CONVERT FORM HARDWARE COORDINATES
		EXG	D2,D4		TO SCREEN COORDINATES
		EXG	D1,D5		
		MOVE.L	(A3)+,D6		GET PARAMETERS
		MOVE.L	(A3)+,D7
		CMP.W	MAX_CHECK-MB(A1),D6	END > AMOUNT RESERVED
		Rbhi	L_IFonc
		CMP.W	#1,D7
		Rblt	L_IFonc			START < 1
		SUB.W	D7,D6
		Rbmi	L_IFonc
		SUBQ	#1,D7
		MOVE.W	D7,D3
		LSL.W	#3,D7			D7 * 10 BUT FASTER
		ADD.W	D3,D7
		ADD.W 	D3,D7
		MOVE.L	ZONE_DEFS-MB(A1),A0
		ADD.L	D7,A0
CHECK_LOOP_SPR	MOVE.W	(A0)+,D7		ZONE
		BMI.S	NO_CHECK_SPR1		ZONE IS DISCARDED
		MOVEM.W	(A0)+,D0-D3		X1,X2,Y1,Y2
		CMP.W	D1,D5
		BGT.S	NO_CHECK_SPR
		CMP.W	D0,D5
		BLT.S	NO_CHECK_SPR
		CMP.W	D3,D4
		BGT.S	NO_CHECK_SPR
		CMP.W	D2,D4
		BLT.S	NO_CHECK_SPR
		MOVE.W	D7,D3			RETURN ZONE NUMBER
		MOVEQ	#0,D2			VALUE RETUNED IS AN INTEGER
		RTS
NO_CHECK_SPR1	ADDQ.L 	#8,A0
NO_CHECK_SPR	DBRA	D6,CHECK_LOOP_SPR
		MOVEQ	#0,D3			NO ZONE FOUND
		MOVEQ	#0,D2			VALUE RETURNED IS AN INTEGER
		RTS
DONT_CHECK_SPR	MOVEQ	#1,D0
		Rbra	L_Custom

L_RAW_KEY	EQU	22
L22		MOVE.L	(A3)+,D0
		LEA	$BFE001,A0
		MOVE.B	$C00(A0),D1		GET KEY
		MOVEQ	#$0,D2
		MOVE.B	D2,$E00(A0)		CLEAR BUFFER
		MOVE.B	D2,$E00(A0)		CLEAR BUFFER
		ORI.B	#$40,$E00(A0)
		NOT.B	D1
		ROR.B	#1,D1
		MOVEQ	#$64,D7
KEYW:
		DBF	D7,KEYW
		ANDI.B	#$BF,$E00(A0)
		ADD.W	#256,D1
		EXT.W	D1
		SUB.W	D0,D1
		BEQ.S	JUISTE_TOETS
		MOVEQ	#0,D3
		MOVEQ	#0,D2
		RTS
JUISTE_TOETS	MOVEQ	#-1,D3
		MOVEQ	#0,D2
		RTS
		
L_R_POS		EQU	23
L23		MOVE.L	T_Rastport(A5),A1
		MOVE.L	(A3)+,D1	DY COORD
		MOVE.L	(A3)+,D0	DX COORD
		ADD.W	D0,36(A1)	NEW X POS
		ADD.W	D1,38(A1)	NEW Y POS
		RTS

L_R_LINE	EQU	24
L24		MOVE.L	A6,A2
		MOVE.L	T_Rastport(A5),A1
		MOVE.L	T_GfxBase(a5),A6
		MOVE.L	(A3)+,D1	DY 
		MOVE.L	(A3)+,D0	DX
		MOVE.W	36(A1),D2	GET ACTUAL X POSITION OF GFX CURSOR
		MOVE.W	38(A1),D3	GET ACTUAL Y POSITION OF GFX CURSOR
		ADD.W	D2,D0		SET X COORD TO BE DRAWN TO
		ADD.W	D3,D1		SET Y COORD TO BE DRAWN TO
		JSR	-246(A6)	DRAW THE LINE
		MOVE.L	A2,A6
		RTS	

L_R_BOX		EQU	25
L25		MOVE.L	A6,A2
		MOVE.L	T_Rastport(A5),A1
		MOVE.L	T_GfxBase(A5),A6
		MOVE.L	(A3)+,D7	DY
		MOVE.L	(A3)+,D6	DX
		MOVE.W	36(A1),D4	GET ACTUAL X POSITION OF GFX CURSOR
		MOVE.W	38(A1),D5	GET ACTUAL Y POSITION OF GFX CURSOR
		ADD.W	D6,D4		ACTUAL X + DX
		MOVE.W	D4,D0		SET X COORD TO BE DRAWN TO
		MOVE.W	D5,D1		SET Y COORD TO BE DRAWN TO (ACTUAL Y)
		JSR	-246(A6)	DRAW THE LINE
		MOVE.W	D4,D0		SET X COORD TO BE DRAWN TO (ACTUAL X)		
		ADD.W	D7,D5		ACTUAL Y + DY
		MOVE.W	D5,D1		SET Y COORD TO BE DRAWN TO
		JSR	-246(A6)	DRAW THE LINE
		SUB.W	D6,D4		ACTUAL X - DX
		MOVE.W	D4,D0		SET X COORD TO BE DRAWN TO
		MOVE.W	D5,D1		SET Y COORD TO BE DRAWN TO (Y + DY)
		JSR	-246(A6)	DRAW THE LINE
		SUB.W	D7,D5		Y - DY = ACTUAL Y
		MOVE.W	D5,D1		SET Y COORD TO BE DRAWN TO
		MOVE.W	D4,D0		SET X COORD TO BE DRAWN TO (X - DX)
		JSR	-246(A6)	DRAW THE LINE
		MOVE.L	A2,A6
		RTS

L_R_HOME	EQU	26
L26		MOVE.L	T_Rastport(A5),A1
		MOVE.L	(A3)+,D1	GET Y
		MOVE.L	(A3)+,D0	GET X
		MOVE.W	D0,36(A1)	SET X POSITION OF GFX CURSOR
		MOVE.W	D1,38(A1)	SET Y POSITION OF GFX CURSOR
		RTS

L_R_BAR		EQU	27
L27		MOVE.L	A6,A2
		MOVE.L	T_Rastport(A5),A1
		MOVE.L	T_GfxBase(A5),A6
		MOVE.W	36(A1),D0	GET ACTUAL X POSITION OF GFX CURSOR
		MOVE.W	38(A1),D1	GET ACTUAL Y POSITION OF GFX CURSOR
		MOVE.L	(A3)+,D3	GET DY
		Rbmi	L_IFonc		Y1 < 0 ERROR !
		MOVE.L	(A3)+,D2	GET DX
		Rbmi	L_IFonc		X1 < 0 ERROR !
		ADD.W	D0,D2		X1 = ACTUAL X + DX
		ADD.W	D1,D3		Y1 = ACTUAL Y +	DY
		JSR	-306(A6)	RECTFILL
		MOVE.L	A2,A6
		RTS
		
L_DEF_OBJ_CH	EQU	28
L28		MOVE.L	(A3)+,D0		AMOUNT OF VECTORS
		Rble	L_IFonc			<= 0 ?  ERROR
		MOVE.L	D0,D6			SAVE AMOUNT OF VECTORS
		MOVE.L	(A3)+,D2		OBJECT NR
		DLOAD	A2
		CMP.W	OBJECT_LIMIT-MB(A2),D2
		BGT.S	OVER_LIMIT_CH
		SUBQ	#1,D2
		Rbmi	L_IFonc			< 0 ? ERROR
		MOVE.L	OBJECT_ADRES_BASE-MB(A2),A0
		ADD.L	D2,D2
		MOVE.L	D2,D7			USE FOR POINT_BASE
		ADD.L	D2,D2			USE FOR ADRES_BASE
		TST.L	(A0,D2.L)
		BNE.S	IS_SET_CH
		MOVE.L	A6,A2
		MOVE.L	$4.W,A6
		MULU	#6,D0
		MOVE.L	#MEMF_CHIP+MEMF_CLEAR,D1
		JSR	ALLOCMEM(A6)
		MOVE.L	A2,A6
		RBEQ	OUT_OF_MEM
		DLOAD	A2
		MOVE.L	OBJECT_ADRES_BASE-MB(A2),A0
		MOVE.L	D0,(A0,D2.L)		PUT ADDRESS OF OBJECT
		MOVE.L	OBJECT_POINT_BASE-MB(A2),A0
		MOVE.W	D6,(A0,D7.L)		PUT AMOUNT OF VECTORS
		RTS
IS_SET_CH	MOVEQ	#2,D0
		Rbra	L_Custom
OVER_LIMIT_CH	MOVEQ	#18,D0
		RBRA	L_CUSTOM

L_DEF_OBJ_FA	EQU	29
L29		MOVE.L	(A3)+,D0		AMOUNT OF VECTORS
		Rble	L_IFonc			<= 0 ?  ERROR
		MOVE.L	D0,D6			SAVE AMOUNT OF VECTORS
		MOVE.L	(A3)+,D2		OBJECT NR
		DLOAD	A2
		CMP.W	OBJECT_LIMIT-MB(A2),D2
		BGT.S	OVER_LIMIT_FA
		SUBQ	#1,D2
		Rbmi	L_IFonc			< 0 ? ERROR
		MOVE.L	OBJECT_ADRES_BASE-MB(A2),A0
		ADD.L	D2,D2
		MOVE.L	D2,D7			USE FOR POINT_BASE
		ADD.L	D2,D2			USE FOR ADRES_BASE
		TST.L	(A0,D2.L)
		BNE.S	IS_SET_FA
		MOVE.L	A6,A2
		MOVE.L	$4.W,A6
		MULU	#6,D0
		MOVE.L	#MEMF_FAST+MEMF_CLEAR,D1
		JSR	ALLOCMEM(A6)
		MOVE.L	A2,A6
		RBEQ	OUT_OF_MEM
		DLOAD	A2
		MOVE.L	OBJECT_ADRES_BASE-MB(A2),A0
		MOVE.L	D0,(A0,D2.L)		PUT ADDRESS OF OBJECT
		MOVE.L	OBJECT_POINT_BASE-MB(A2),A0
		MOVE.W	D6,(A0,D7.L)		PUT AMOUNT OF VECTORS
		RTS
IS_SET_FA	MOVEQ	#2,D0
		Rbra	L_Custom
OVER_LIMIT_FA	MOVEQ	#18,D0
		RBRA	L_CUSTOM

L_DEF_OBJ_DRAW	EQU	30
L30		MOVE.L	(A3)+,D1	  GET Y
		MOVE.L	(A3)+,D0	  GET X
		MOVE.L	(A3)+,D2	  GET VECTOR
		Rble	L_IFonc
		MOVE.L	(A3)+,D3	  GET OBJECT
		SUBQ	#1,D3
		BMI.S	NOT_DEF_DR	  OBJECT < 0 ? ERROR
		MOVE.L	D3,D5
		ADD.L	D5,D5
		DLOAD	A2
		MOVE.L	OBJECT_POINT_BASE-MB(A2),A0  ADRESS OF OBJECT POINTS
		CMP.W	(A0,D5.L),D2	  CHECK AMOUNT OF VECTORS
		BGT.S	TOO_MUCH_DR	  TOO MANY VECTORS --> ERROR !
		SUBQ	#1,D2
		MOVE.L	OBJECT_ADRES_BASE-MB(A2),A0
		ADD.L	D5,D5
		MOVE.L	(A0,D5.L),D5	  GET ADDRESS OF OBJECT
		BEQ.S	NOT_DEF_DR	  DEFINED ? NO --> ERROR
		MOVE.L	D5,A1
		MULU	#6,D2		  GET VECTOR POSITION
		MOVE.W	#0,(A1,D2.L)	  DEFINE IT AS A DRAW INSTRUCTION
		MOVEM.W	D0-D1,2(A1,D2.L)  STORE X AND Y TO BE DRAWN TO
		RTS
NOT_DEF_DR	MOVEQ	#3,D0
		Rbra	L_Custom
TOO_MUCH_DR	MOVEQ	#4,D0
		Rbra	L_Custom
		
L_DEF_OBJ_MOVE	EQU	31
L31		MOVE.L	(A3)+,D1	  GET Y
		MOVE.L	(A3)+,D0	  GET X
		MOVE.L	(A3)+,D2	  GET VECTOR
		Rble	L_IFonc
		MOVE.L	(A3)+,D3	  GET OBJECT
		SUBQ	#1,D3
		BMI.S	NOT_DEF_MOV	  OBJECT < 0 ? ERROR
		MOVE.L	D3,D5
		ADD.L	D5,D5
		DLOAD	A2
		MOVE.L	OBJECT_POINT_BASE-MB(A2),A0  ADRESS OF OBJECT POINTS
		CMP.W	(A0,D5.L),D2	  CHECK AMOUNT OF VECTORS
		BGT.S	TOO_MUCH_MOV	  TOO MANY VECTORS --> ERROR !
		SUBQ	#1,D2
		MOVE.L	OBJECT_ADRES_BASE-MB(A2),A0
		ADD.L	D5,D5
		MOVE.L	(A0,D5.L),D5	  GET ADDRESS OF OBJECT
		BEQ.S	NOT_DEF_MOV	  DEFINED ? NO --> ERROR
		MOVE.L	D5,A1
		MULU	#6,D2
		MOVE.W	#-1,(A1,D2.L)
		MOVEM.W	D0-D1,2(A1,D2.L)
		RTS
NOT_DEF_MOV	MOVEQ	#3,D0
		Rbra	L_Custom
TOO_MUCH_MOV	MOVEQ	#5,D0
		Rbra	L_Custom

L_DEF_OBJ_STOP	EQU	32
L32		MOVE.L	(A3)+,D2	WELK PUNT
		Rble	L_IFonc
		MOVE.L	(A3)+,D3	WELK OBJECT
		SUBQ	#1,D3
		BMI.S	NOT_DEF_STOP
		MOVE.L	D3,D5
		ADD.L	D5,D5
		DLOAD	A2
		MOVE.L	OBJECT_POINT_BASE-MB(A2),A0  ADRESS OF OBJECT POINTS
		CMP.W	(A0,D5.L),D2	  CHECK AMOUNT OF VECTORS
		BGT.S	TOO_MUCH_STOP	  TOO MANY VECTORS --> ERROR !
		SUBQ	#1,D2
		MOVE.L	OBJECT_ADRES_BASE-MB(A2),A0
		ADD.L	D5,D5
		MOVE.L	(A0,D5.L),D5	  GET ADDRESS OF OBJECT
		BEQ.S	NOT_DEF_STOP	  DEFINED ? NO --> ERROR
		MOVE.L	D5,A1
		MULU	#6,D2
		MOVE.W	#1,(A1,D2.L)
		RTS
NOT_DEF_STOP	MOVEQ	#3,D0
		Rbra	L_Custom
TOO_MUCH_STOP	MOVEQ	#5,D0
		Rbra	L_Custom

L_DEF_OBJ_ATT	EQU	33
L33		MOVE.L	(A3)+,D1	MASK
		MOVE.L	(A3)+,D0	COLOUR
		MOVE.L	(A3)+,D2	WELK PUNT
		Rble	L_IFonc
		MOVE.L	(A3)+,D3	WELK OBJECT
		SUBQ	#1,D3
		BMI.S	NOT_DEF_COL
		MOVE.L	D3,D5
		ADD.L	D5,D5
		DLOAD	A2
		MOVE.L	OBJECT_POINT_BASE-MB(A2),A0  ADRESS OF OBJECT POINTS
		CMP.W	(A0,D5.L),D2	  CHECK AMOUNT OF VECTORS
		BGT.S	TOO_MUCH_COL	  TOO MANY VECTORS --> ERROR !
		SUBQ	#1,D2
		MOVE.L	OBJECT_ADRES_BASE-MB(A2),A0
		ADD.L	D5,D5
		MOVE.L	(A0,D5.L),D5	  GET ADDRESS OF OBJECT
		BEQ.S	NOT_DEF_COL	  DEFINED ? NO --> ERROR
		MOVE.L	D5,A1
		MULU	#6,D2
		MOVE.W	#2,(A1,D2.L)
		MOVEM.W	D0-D1,2(A1,D2.L)
		RTS
NOT_DEF_COL	MOVEQ	#3,D0
		Rbra	L_Custom
TOO_MUCH_COL	MOVEQ	#6,D0
		Rbra	L_Custom


L_OBJECT_DRAW	EQU	34
L34		MOVE.L	(A3)+,D3
		SUBQ	#1,D3
		Rbmi	L_IFonc
		Dload	A0
		MOVE.L	OBJECT_ADRES_BASE-MB(A0),A1
		ADD.L	D3,D3
		MOVE.L	D3,D5
		ADD.L	D3,D3
		MOVE.L	(A1,D3.L),D0
		BEQ.S	DONT_DRAW	OBJECT NOT DEFINED ? --> ERROR !
		MOVE.L	D0,A2
		MOVE.L	OBJECT_POINT_BASE-MB(A0),A0
		MOVE.W	(A0,D5.L),D5
		SUBQ	#1,D5		--> AANTAL KEER -1
		MOVE.L	A6,-(sp)
		MOVE.L	T_RastPort(A5),A1
		MOVE.L	T_GfxBase(A5),A6
DRAW_LOOP	MOVE.W	(A2)+,D3
		BEQ.S	JUST_DRAW
		BMI.S	JUST_MOVE
		CMP.W	#1,D3
		BEQ.S	STOP
		MOVE.W	(A2)+,D0
		JSR	-342(A6)
		MOVE.W	(A2)+,D0
		JSR	-354(A6)
		DBRA	D5,DRAW_LOOP	
JUST_MOVE	MOVE.L	(A2)+,36(A1)	PUT X AND Y IN Rp STRUCT
		DBRA	D5,DRAW_LOOP
STOP		MOVE.L	(sp)+,A6
		RTS
JUST_DRAW	MOVEM.W	(A2)+,D0-1
		JSR	-246(A6)
		DBRA	D5,DRAW_LOOP
		MOVE.L	(sp)+,A6
		RTS
DONT_DRAW	MOVEQ	#3,D0
		Rbra	L_Custom

L_R_OBJECT_DRAW	EQU	35
L35		MOVE.L	(A3)+,D7	DY
		MOVE.L	(A3)+,D6	DX
		MOVE.L	(A3)+,D3
		SUBQ	#1,D3
		Rbmi	L_IFonc
		Dload	A0
		MOVE.L	OBJECT_ADRES_BASE-MB(A0),A1
		ADD.L	D3,D3
		MOVE.L	D3,D5
		ADD.L	D3,D3
		MOVE.L	(A1,D3.L),D0
		BEQ.S	DONT_R_DRAW	OBJECT NOT DEFINED ? --> ERROR !
		MOVE.L	D0,A2
		MOVE.L	OBJECT_POINT_BASE-MB(A0),A0
		MOVE.W	(A0,D5.L),D5
		SUBQ	#1,D5		--> AANTAL KEER -1
		MOVE.L	A6,-(sp)
		MOVE.L	T_RastPort(A5),A1
		MOVE.L	T_GfxBase(A5),A6
R_DRAW_LOOP	MOVE.W	(A2)+,D3
		BEQ.S	JUST_R_DRAW
		BMI.S	JUST_R_MOVE
		CMP.W	#1,D3
		BEQ.S	R_STOP
		MOVE.W	(A2)+,D0
		JSR	-342(A6)
		MOVE.W	(A2)+,D0
		JSR	-354(A6)
		DBRA	D5,R_DRAW_LOOP
JUST_R_MOVE	MOVE.W	(A2)+,D0
		MOVE.W	(A2)+,D1
		ADD.W	D6,D0
		ADD.W	D7,D1
		MOVEM.W	D0-1,36(A1)
		DBRA	D5,R_DRAW_LOOP
R_STOP		MOVE.L	(sp)+,A6
		RTS
JUST_R_DRAW	MOVE.W	(A2)+,D0
		MOVE.W	(A2)+,D1
		ADD.W	D6,D0
		ADD.W	D7,D1
		JSR	-246(A6)
		DBRA	D5,R_DRAW_LOOP
		MOVE.L	(sp)+,A6
		RTS
DONT_R_DRAW	MOVEQ	#3,D0
		Rbra	L_Custom

L_OBJ_MAG_DRAW	EQU	36
L36		MOVE.L	(A3)+,D2
		MOVE.L	(A3)+,D3
		SUBQ	#1,D3
		Rbmi	L_IFonc
		Dload	A0
		MOVE.L	OBJECT_ADRES_BASE-MB(A0),A1
		ADD.L	D3,D3
		MOVE.L	D3,D5
		ADD.L	D3,D3
		MOVE.L	(A1,D3.L),D0
		BEQ.S	DONT_MAG_DRAW	OBJECT NOT DEFINED ? --> ERROR !
		MOVE.L	D0,A2
		MOVE.L	OBJECT_POINT_BASE-MB(A0),A0
		MOVE.W	(A0,D5.L),D5
		SUBQ	#1,D5		--> AANTAL KEER -1
		MOVE.L	A6,-(sp)
		MOVE.L	T_RastPort(A5),A1
		MOVE.L	T_GfxBase(A5),A6		
		CMP.W	#0,D2
		BLT.S	DRAW_MIN
DRAW_MAG_LOOP	MOVE.W	(A2)+,D6
		BEQ.S	JUST_MAG_DRAW
		BMI.S	JUST_MAG_MOVE
		CMP.W	#1,D6
		BEQ.S	MAG_STOP
		MOVE.W	(A2)+,D0
		JSR	-342(A6)
		MOVE.W	(A2)+,D0
		JSR	-354(A6)
		DBRA	D5,DRAW_MAG_LOOP
JUST_MAG_MOVE	MOVE.W	(A2)+,D0
		MOVE.W	(A2)+,D1
		MULS	D2,D0
		MULS	D2,D1
		MOVEM.W	D0-1,36(A1)
		DBRA	D5,DRAW_MAG_LOOP
MAG_STOP	MOVE.L	(sp)+,A6
		RTS
JUST_MAG_DRAW	MOVE.W	(A2)+,D0
		MOVE.W	(A2)+,D1
		MULS	D2,D0
		MULS	D2,D1
		JSR	-246(A6)
		DBRA	D5,DRAW_MAG_LOOP
		MOVE.L	(sp)+,A6
		RTS
DONT_MAG_DRAW	MOVEQ	#3,D0
		Rbra	L_Custom
DRAW_MIN	NEG.W	D2
DRAW_MIN_LOOP	MOVE.W	(A2)+,D6
		BEQ.S	JUST_MIN_DRAW
		BMI.S	JUST_MIN_MOVE
		CMP.W	#1,D6
		BEQ.S	MIN_STOP
		MOVE.W	(A2)+,D0
		JSR	-342(A6)
		MOVE.W	(A2)+,D0
		JSR	-354(A6)
		DBRA	D5,DRAW_MIN_LOOP
JUST_MIN_MOVE	MOVEM.W	(A2)+,D0-D1
		DIVS	D2,D0
		DIVS	D2,D1
		MOVEM.W	D0-1,36(A1)
		DBRA	D5,DRAW_MIN_LOOP
MIN_STOP	MOVE.L	(sp)+,A6
		RTS
JUST_MIN_DRAW	MOVEM.W	(A2)+,D0-D1
		DIVS	D2,D0
		DIVS	D2,D1
		JSR	-246(A6)
		DBRA	D5,DRAW_MIN_LOOP
		MOVE.L	(sp)+,A6
		RTS

L_R_OBJ_MAG_DRA	EQU	37
L37		MOVEM.L	(A3)+,D2-D5
		SUBQ	#1,D5
		Rbmi	L_IFonc
		Dload	A0
		MOVE.L	OBJECT_ADRES_BASE-MB(A0),A1
		ADD.L	D5,D5
		MOVE.L	D5,D0
		ADD.L	D5,D5
		MOVE.L	(A1,D5.L),D1
		BEQ.S	DONT_MAG_DRAW	OBJECT NOT DEFINED ? --> ERROR !
		MOVE.L	D1,A2
		MOVE.L	OBJECT_POINT_BASE-MB(A0),A0
		MOVE.W	(A0,D0.L),D5
		SUBQ	#1,D5		--> AANTAL KEER -1
		MOVE.L	A6,-(sp)
		MOVE.L	T_RastPort(A5),A1
		MOVE.L	T_GfxBase(A5),A6
		CMP.W	#0,D2
		BLT.S	DRAW_R_MIN
DRAW_R_MAG_LOOP	MOVE.W	(A2)+,D6
		BEQ.S	JUST_R_MAG_DRAW
		BMI.S	JUST_R_MAG_MOVE
		CMP.W	#1,D6
		BEQ.S	R_MAG_STOP
		MOVE.W	(A2)+,D0
		JSR	-342(A6)
		MOVE.W	(A2)+,D0
		JSR	-354(A6)
		DBRA	D5,DRAW_R_MAG_LOOP
JUST_R_MAG_MOVE	MOVE.W	(A2)+,D0
		MOVE.W	(A2)+,D1
		MULS	D2,D0
		MULS	D2,D1
		ADD.W	D4,D0
		ADD.W	D3,D1
		MOVEM.W	D0-1,36(A1)
		DBRA	D5,DRAW_R_MAG_LOOP
R_MAG_STOP	MOVE.L	(sp)+,A6
		RTS
JUST_R_MAG_DRAW	MOVE.W	(A2)+,D0
		MOVE.W	(A2)+,D1
		MULS	D2,D0
		MULS	D2,D1
		ADD.W	D4,D0
		ADD.W	D3,D1
		JSR	-246(A6)
		DBRA	D5,DRAW_R_MAG_LOOP
		MOVE.L	(sp)+,A6
		RTS
DONT_R_MAG_DRAW	MOVEQ	#3,D0
		Rbra	L_Custom
DRAW_R_MIN	NEG.W	D2
DRAW_R_MIN_LOOP	MOVE.W	(A2)+,D6
		BEQ.S	JUST_R_MIN_DRAW
		BMI.S	JUST_R_MIN_MOVE
		CMP.W	#1,D6
		BEQ.S	R_MIN_STOP
		MOVE.W	(A2)+,D0
		JSR	-342(A6)
		MOVE.W	(A2)+,D0
		JSR	-354(A6)
		DBRA	D5,DRAW_R_MIN_LOOP
JUST_R_MIN_MOVE	MOVEM.W	(A2)+,D0-D1
		DIVS	D2,D0
		DIVS	D2,D1
		ADD.W	D4,D0
		ADD.W	D3,D1
		MOVEM.W	D0-1,36(A1)
		DBRA	D5,DRAW_R_MIN_LOOP
R_MIN_STOP	MOVE.L	(sp)+,A6
		RTS
JUST_R_MIN_DRAW	MOVEM.W	(A2)+,D0-D1
		DIVS	D2,D0
		DIVS	D2,D1
		ADD.W	D4,D0
		ADD.W	D3,D1
		JSR	-246(A6)
		DBRA	D5,DRAW_R_MIN_LOOP
		MOVE.L	(sp)+,A6
		RTS
		
L_DISCARD_OBJECT	EQU	38
L38		MOVE.L	(A3)+,D0
		CMP.L	#32000,D0
		RBHI	L_IFONC
		DLOAD	A0
		CMP.W	OBJECT_LIMIT-MB(A0),D0
		BGT.S	OVER_LIMIT
		SUBQ	#1,D0
		Rbmi	L_IFonc
		ADD.L	D0,D0
		MOVE.L	D0,D7			USE FOR POINT BASE
		ADD.L	D0,D0			USE FOR ADRES BASE
		MOVE.L	OBJECT_ADRES_BASE-MB(A0),A1
		MOVE.L	(A1,D0.L),D1
		BEQ.S	NOT_DEFINED
		CLR.L	(A1,D0.L)
		MOVE.L	D1,A1
		MOVE.L	OBJECT_POINT_BASE-MB(A0),A0
		MOVE.W	(A0,D7.L),D0
		MULU	#6,D0
		MOVE.L	A6,A2
		CALLEXEC FreeMem
		MOVE.L	A2,A6
		RTS
NOT_DEFINED	MOVEQ	#3,D0
		Rbra	L_Custom
OVER_LIMIT	MOVEQ	#18,D0
		RBRA	L_CUSTOM

L_OBJECT_SAVE	EQU	39
L39		MOVE.L	(A3)+,D5	TO PARAM
		MOVE.L	(A3)+,D4	FROM PARAM
		MOVE.L	(A3)+,A0
		MOVE.W	(A0)+,D0
		CMP.W	#80,D0
		BGT	NAME_TO_LONG
		MOVEM.L	A3-A6,-(SP)
		SUBQ	#1,D5
		SUBQ	#1,D4
		MOVE.W	D5,D7
		SUB.W	D4,D7		AANTAL OBJECTEN	
		SUBQ	#1,D0
		Dlea	OBJECT_DISKNAME,A1
		MOVE.L	A1,A2
PUT_NAME	MOVE.B	(A0)+,(A1)+	COPIEER NAAM + CHR$(0)
		DBRA	D0,PUT_NAME
		MOVE.L	DosBase(A5),A6
		MOVE.L	A2,D1		POINTER NAAR NAAM
		MOVE.L	#1006,D2	MODUS	--> NEW
		JSR	-30(A6)		Open
		BEQ	DISK_ERROR	FOUT BIJ OPEN
		MOVE.L	D0,A4
		Dload	A0
		MOVE.W	D7,OBJECT_DISK_COUNT-MB(A0)
		Dlea	OBJECT_DISK_HEADER,A0
		MOVE.L	D0,D1
		MOVE.L	A0,D2
		MOVEQ.L	#6,D3
		JSR	-48(A6)
		BEQ.S	SAVE_ERROR	FOUT BIJ SAVEN HEADER			
LOOP_SAVE	Dload	A0
		ADD.W	D4,D4
		ADD.W	D4,D4
		MOVE.L	OBJECT_ADRES_BASE-MB(A0),A1
		MOVE.L	(A1,D4.L),D3	GEEF ADRES VAN VECTORS OM TE SAVEN
		BEQ.S	GET_NEXT_OBJECT	NIET GEDEFINIEERD ? VOLGENDE...
		MOVE.L	D3,A2
		LSR.W	#1,D4
		MOVE.L	OBJECT_POINT_BASE-MB(A0),A1
		MOVE.W	(A1,D4.L),D6	GEEF HET AANTAL PUNTEN VAN OBJECT
		ASR.W	#1,D4
		Dlea	OBJECT_DISK_COUNT,A0
		MOVE.W	D6,(A0)
		MOVE.L	A4,D1	HANDLE IN D1
		MOVE.L	A0,D2	AANTAL VECTORS IN D2 --> BUFFER
		MOVEQ	#2,D3	AANTAL TE SAVEN BYTES
		MOVE.L	DosBase(A5),A6
		JSR	-48(A6)
		BMI.S	SAVE_ERROR
		EXT.L	D6
		MULU	#6,D6	AANTAL VECTORS * 6 --> 2 BYTES X  2 BYTES Y
		MOVE.L	A4,D1	HANDLE IN D1
		MOVE.L	A2,D2	ADRES VECTORS IN D2 --> BUFFER
		MOVE.L	D6,D3	AANTAL TE SAVEN BYTES
		MOVE.L	DosBase(A5),A6
		JSR	-48(A6)		Write	GO!!!
		BMI.S	SAVE_ERROR
GET_NEXT_OBJECT	ADDQ	#1,D4
		CMP.W	D5,D4
		BGT.S	FINISH_SAVE						
		BRA.S	LOOP_SAVE
SAVE_ERROR
FINISH_SAVE	MOVE.L	DosBase(A5),A6
		MOVE.L	A4,D1
		JSR	-36(A6)		Close !!!
DISK_ERROR
		MOVEM.L	(SP)+,A3-A6
		RTS
NAME_TO_LONG	MOVEQ	#21,D0
		Rjmp	L_Error

L_OBJECT_LOAD_CHIP EQU	40
L40		MOVE.L	(A3)+,D7	LOAD FROM WHERE PARAMETER
		MOVE.L	(A3)+,A0	POINTER STRING --> NAAM
		MOVE.W	(A0)+,D0	GET LENGTH OF STRING
		CMP.W	#80,D0
		BGT	LOAD_TO_LONG		NAAM -> 80 CHARS --> ERROR !
		MOVEM.L	A3-A6,-(SP)
		SUBQ.W	#1,D7
		SUBQ.W	#1,D0
		Dlea	OBJECT_DISKNAME,A1
		MOVE.L	A1,A2		SAVE POINTER NAAM
COPY_NAME	MOVE.B	(A0)+,(A1)+
		DBRA	D0,COPY_NAME
		MOVE.L	DosBase(A5),A6
		MOVE.L	A2,D1		POINTER NAAM IN D1
		MOVE.L	#1005,D2	MODUS --> READ
		JSR	-30(A6)		Open file
		BEQ	OPEN_ERROR
		MOVE.L	D0,A4		SAVE HANDLE !
		Dlea	OBJECT_READ_BUFFER,A3
		MOVE.L	D0,D1		HANDLE IN D1
		MOVE.L	A3,D2		BUFFER IN D2
		MOVEQ.L	#8,D3		LEES OBJECT HEADER + AANTAL OBJECTS
		JSR	-42(A6)		Read
		BEQ	READ_ERROR	SOMETHING WRONG !!!
		CMP.L	#"OBJE",(A3)	IS THIS AN OBJECT FILE ???
		BNE	NO_OBJECT_FILE	NO ? GET OUT OF HERE !!!
		MOVE.W	4(A3),D6	OBJECT COUNTER IN D6
		ADD.W	D7,D6
		DLOAD	A1
		MOVE.W	OBJECT_LIMIT-MB(A1),D4
		BEQ	LOAD_OVER_LIMIT
		SUBQ	#1,D4
		CMP.W	D4,D6
		BGT	LOAD_OVER_LIMIT
		MOVE.W	6(A3),D5	AANTAL VERTICES OBJECT 1
		EXT.L	D6		MAAK LONG -> VOOR ALLE ZEKERHEID
		EXT.L	D5
LOAD_LOOP	Dload	A1
		MOVE.L	OBJECT_ADRES_BASE-MB(A1),A1
		LSL.W	#2,D7
		MOVE.L	(A1,D7.W),D4
		BNE.S	IS_DEFINED	DEFINED ? --> ERROR !
		MOVE.L	D5,D3
		MULU	#6,D5		AANTAL TE LEZEN + TE RESERVEREN BYTES
		MOVE.W	D5,D0
		MOVE.L	#MEMF_CHIP+MEMF_CLEAR,D1
		CALLEXEC AllocMem
		BEQ	NO_LOAD_MEM
		DLOAD	A1
		MOVE.L	OBJECT_ADRES_BASE-MB(A1),A1
		MOVE.L	D0,(A1,D7.W)	SET OBJECT ADRES
		LSR.W	#1,D7
		DLOAD	A1
		MOVE.L	OBJECT_POINT_BASE-MB(A1),A1
		MOVE.W	D3,(A1,D7.W)	SET OBJECT POINTS
		MOVE.L	D0,A3		SAVE ADRES VOOR IN TE SCHRIJVEN
		LSR.W	#1,D7		TERUG D7 GEWOON !
		MOVE.L	A4,D1		HANDLE
		MOVE.L	D0,D2		BUFFER --> IS GERESERVEERD !
		MOVE.L	D5,D3		AANTAL BYTES TE LEZEN		
		MOVE.L	DosBase(A5),A6
		JSR	-42(A6)		Read
		BEQ.S	READ_ERROR	SOMETHING WRONG !!!
		ADDQ	#1,D7
		CMP.W	D6,D7
		BGT.S	FINISH_LOAD
		Dlea	OBJECT_READ_BUFFER,A3
		MOVE.L	A4,D1
		MOVE.L	A3,D2
		MOVEQ.L	#2,D3
		MOVE.L	DosBase(A5),A6
		JSR	-42(A6)
		BEQ.S	READ_ERROR
		MOVE.W	(A3)+,D5				
		BRA	LOAD_LOOP		
IS_DEFINED
READ_ERROR
FINISH_LOAD	MOVE.L	A4,D1
		MOVE.L	DosBase(A5),A6
		JSR	-36(A6)
OPEN_ERROR	MOVEM.L	(SP)+,A3-6
		RTS
LOAD_TO_LONG	MOVEQ	#21,D0
		Rjmp	L_Error
LOAD_OVER_LIMIT	MOVE.L	A4,D1
		MOVE.L	DosBase(A5),A6
		JSR	-36(A6)
		MOVEM.L	(SP)+,A3-6
		MOVEQ	#18,D0
		RBRA	L_CUSTOM
NO_OBJECT_FILE	MOVE.L	A4,D1
		MOVE.L	DosBase(A5),A6
		JSR	-36(A6)
		MOVEM.L	(SP)+,A3-6
		MOVEQ	#7,D0
		Rbra	L_Custom
NO_LOAD_MEM	MOVEM.L	(SP)+,A3-6
		Rbra	OUT_OF_MEM


L_LINE_3D	EQU 	41
L41		MOVE.L	(A3)+,D5	Z-2 COORD
		BEQ.S	DIV_BY_ZERO
		MOVE.L	(A3)+,D4	Y-2 COORD
		MOVE.L	(A3)+,D3	X-2 COORD
		MOVE.L	(A3)+,D2	Z-1 COORD
		BEQ.S	DIV_BY_ZERO
		MOVE.L	(A3)+,D1	Y-1 COORD
		MOVE.L	(A3)+,D0	X-1 COORD
		Dload	A0
		MOVE.W	X_VIEW-MB(A0),D6
		MOVE.W	Y_VIEW-MB(A0),D7
		ASL.L	#7,D0
		DIVS	D2,D0
		ADD.W	D6,D0
		ASL.L	#7,D1
		DIVS	D2,D1
		ADD.W	D7,D1
		MOVE.L	A6,A2
		MOVE.L	T_RastPort(A5),A1
		MOVE.L	T_GfxBase(A5),A6
		JSR	-240(A6)
		MOVE.L	D3,D0
		MOVE.L	D4,D1
		ASL.L	#7,D0
		DIVS	D5,D0
		ADD.W	D6,D0
		ASL.L	#7,D1
		DIVS	D5,D1
		ADD.W	D7,D1
		JSR	-246(A6)
		MOVE.L	A2,A6
		RTS
DIV_BY_ZERO	MOVEQ	#20,D0
		Rjmp	L_Error
		
L_EYE_3D	EQU	42
L42		MOVE.L	(A3)+,D1	Y EYE
		MOVE.L	(A3)+,D0	X EYE
		Dload	A0
		MOVE.W	D0,X_VIEW-MB(A0)
		MOVE.W	D1,Y_VIEW-MB(A0)
		RTS

L_BLIT_STORE	EQU	43
L43		CMP.L	#0,20(A3)
		Rble	L_IFonc
		CMP.L	#97,20(A3)
		Rbcc	L_IFonc
		Dlea	BLIT_DEFS,A1
		MOVE.L	20(A3),D1		BLIT NR
		SUBQ.W	#1,D1
		ASL.W	#2,D1
		TST.L	(A1,D1.W)		IS RESERVED
		BNE	BLIT_STORE_DEF		IF YES ERROR !
		MOVE.L	24(A3),D1		SCREEN NR
		Rjsr	L_GetEc
		MOVE.L	A0,A4			--- A4 BEZET !
		MOVE.W	EcNPlan(A0),D7		--- D7 BEZET !
		MOVE.L	D0,A2			--- A2 BEZET !
		MOVE.W	D7,D0
		EXT.L	D0
		MULU	#8,D0
		ADD.W	#20,D0
		MOVE.L	#MEMF_CHIP+MEMF_CLEAR,D1
		MOVE.L	A6,-(SP)
		CALLEXEC AllocMem
		MOVE.L	(SP)+,A6
		Rbeq	OUT_OF_MEM
		MOVEM.L	A4-6,-(SP)
		Dlea	BLIT_DEFS,A1
		MOVE.L	20(A3),D1		BLIT NR
		SUBQ.W	#1,D1
		ASL.W	#2,D1
		MOVE.L	D0,(A1,D1.W)		BLIT_DEF_ADRES
		MOVE.L	D0,A1			--- A1 BEZET !
		MOVEQ	#-1,D6
		MOVE.L	(A3)+,D5
		BMI	DESCENDING
		AND.L	#$F,D5
		Rbeq	L_IFonca
		LSL.L	D5,D6
		MOVE.W	D7,(A1)+
		MOVE.L	D6,(A1)+		BLTAFLWM
		ROR.L	#4,D5
		ADD.L	#$9F00000,D5
		MOVE.L	D5,A5			--- A5 BEZET ! BLTCON01
		MOVE.L	(A3)+,D5		Y1
		CMP.W	EcTy(A4),D5
		Rbhi	L_IFonca
		MOVE.L	(A3)+,D3		X1
		AND.W	#$FFF0,D3
		MOVE.L	(A3)+,D4		Y
		Rbmi	L_IFonca
		MOVE.L	(A3)+,D2		X
		Rbmi	L_IFonca
		AND.W	#$FFF0,D2
		CMP.W	D3,D2
		Rbge	L_IFonca
		CMP.W	D5,D4
		Rbge	L_IFonca
		MOVE.W	EcTLigne(A4),D6		BYTES PER REGEL
		ASL.W	#3,D6			PIXELS PER REGEL
		CMP.W	D3,D6
		BGT.S	NOT_OVER_A
		MOVE.W	D6,D3
NOT_OVER_A	ASR.W	#3,D6			BYTES PER REGEL
		MOVE.L	D4,D0			Y
		MULU	D6,D0			Y * BYTES REGEL
		MOVE.L	D2,D1			X
		LSR.L	#3,D1			X / 8
		ADD.L	D0,D1	OFFSET START	D1 = Y * BYTES REGEL + X / 8
		SUB.L	D2,D3			D3 = X1 - X
		LSR.L	#3,D3			D3 = (X1 - X) / 8
		SUB.L	D3,D6			D6 = BLTAMOD = BYTES REGEL-(X1-X)/8
		MOVE.L	#0,(A1)+		BLTCMOD + BLTBMOD OP 0
		MOVE.W	D6,(A1)+		BLTAMOD
		MOVE.W	D6,(A1)+		BLTDMOD
		MOVE.L	A5,(A1)+		BLTCON01
		SUB.L	D4,D5			Y1 - Y
		ASL.L	#6,D5			(Y1 - Y) * 64
		LSR.L	#1,D3			(X1 - X) / 16
		ADD.L	D3,D5	BLITSIZE	(Y1 - Y) * 64 + (X1 - X) / 16
		MOVE.W	D5,(A1)+		BLTSIZE
		SUBQ.W	#1,D7			PLANECOUNT - 1 VOOR DBRA !
ADRES_LOOP	MOVE.L	(A2)+,D0		ADRES PLANES 1 -> 6
		ADD.L	D1,D0
		MOVE.L	D0,(A1)+		SOURCE ADRES
		MOVE.L	D0,(A1)+		DEST ADRES		
		DBRA	D7,ADRES_LOOP		D7 = PLANECOUNT -1
		ADDQ.L	#8,A3			STACK ADJUST !
		MOVEM.L	(SP)+,A4-6
		RTS
BLIT_STORE_DEF	MOVEQ	#11,D0
		Rbra	L_CUSTOM 
DESCENDING	NEG.L	D5
		AND.L	#$F,D5
		Rbeq	L_IFonca
		LSR.L	D5,D6
		SWAP	D6
		MOVE.W	D7,(A1)+
		MOVE.L	D6,(A1)+		BLTAFLWM
		ROR.L	#4,D5
		ADD.L	#$9F00002,D5
		MOVE.L	D5,A5			--- A5 BEZET ! BLTCON01
		MOVE.L	(A3)+,D5		Y1
		CMP.W	EcTy(A4),D5
		Rbhi	L_Ifonca
		MOVE.L	(A3)+,D3		X1
		AND.W	#$FFF0,D3
		MOVE.L	(A3)+,D4		Y
		Rbmi	L_IFonca
		MOVE.L	(A3)+,D2		X
		Rbmi	L_IFonca
		AND.W	#$FFF0,D2
		CMP.W	D3,D2
		Rbge	L_IFonca
		CMP.W	D5,D4
		Rbge	L_IFonca
		MOVE.W	EcTLigne(A4),D6		BYTES PER REGEL
		ASL.W	#3,D6			PIXELS PER REGEL
		CMP.W	D3,D6
		BGT.S	NOT_OVER_D
		MOVE.W	D6,D3
NOT_OVER_D	ASR.W	#3,D6			BYTES PER REGEL
		MOVEM.L	D2-6,-(SP)
		SUB.L	D4,D5			Y1 - Y
		MULU	D6,D5			(Y1 - Y) * BYTES REGEL
		SUB.L	D2,D3			X1 - X
		ASR.L	#3,D3			(X1 - X) / 8
		ADD.L	D3,D5
		SUBQ	#2,D5
		SUB.W	D6,D5
		MOVE.L	D5,A6			DESCENDING OFFSET
		MOVEM.L	(SP)+,D2-6
		MOVE.L	D4,D0			Y
		MULU	D6,D0			Y * BYTES REGEL
		MOVE.L	D2,D1			X
		LSR.L	#3,D1			X / 8
		ADD.L	D0,D1	OFFSET START	D1 = Y * BYTES REGEL + X / 8
		ADD.L	A6,D1	DESCENDING OFFSET
		SUB.L	D2,D3			D3 = X1 - X
		LSR.L	#3,D3			D3 = (X1 - X) / 8
		SUB.L	D3,D6			D6 = BLTAMOD = BYTES REGEL-(X1-X)/8
		MOVE.L	#0,(A1)+		BLTCMOD + BLTBMOD OP 0
		MOVE.W	D6,(A1)+		BLTAMOD
		MOVE.W	D6,(A1)+		BLTDMOD
		MOVE.L	A5,(A1)+		BLTCON01
		SUB.L	D4,D5			Y1 - Y
		ASL.L	#6,D5			(Y1 - Y) * 64
		LSR.L	#1,D3			(X1 - X) / 16
		ADD.L	D3,D5	BLITSIZE	(Y1 - Y) * 64 + (X1 - X) / 16
		MOVE.W	D5,(A1)+		BLTSIZE
		SUBQ.W	#1,D7			PLANECOUNT - 1 VOOR DBRA !
ADRES_D_LOOP	MOVE.L	(A2)+,D0		ADRES PLANES 1 -> 6
		ADD.L	D1,D0
		MOVE.L	D0,(A1)+		SOURCE ADRES
		MOVE.L	D0,(A1)+		DEST ADRES		
		DBRA	D7,ADRES_D_LOOP		D7 = PLANECOUNT -1
		ADDQ.L	#8,A3			STACK ADJUST !
		MOVEM.L	(SP)+,A4-6
		RTS
		
L_MULTI_BLIT	EQU	44
L44		MOVE.L	(A3)+,D7		TO BLIT
		MOVE.L	(A3)+,D6		FROM BLIT
		CMP.W	D6,D7
		Rblt	L_IFonc
		SUBQ.W	#1,D6
		Rbmi	L_IFonc
		SUBQ.W	#1,D7
		CMP.W	#96,D7
		Rbcc	L_IFonc
		MOVEM.L	A3-4,-(SP)
		MOVE.L	T_RASTPORT(A5),A4
		LEA	$DFF000,A1
		Dlea	BLIT_DEFS,A2
NEXT_MULTI_BLIT	ADD.W	D6,D6
		ADD.W	D6,D6
		MOVE.L	A2,A0
		MOVE.L	(A0,D6.W),D0
		BEQ.S	NO_MULTI_BLIT		IF ADRES = 0 ERROR !!
		MOVE.L	D0,A0
		MOVE.W	(A0)+,D5		PLANE COUNT
		SUBQ.L	#1,D5
		MOVEM.L	(A0)+,D1-4
		MOVE.W	(A0)+,A3		BLTSIZE
		MOVEQ	#0,D0
BLIT_S_LOOP	BTST	D0,24(A4)
		BEQ.S	SKIP_BLIT
BLIT_S_LOOP1	BTST	#14,2(A1)
		BNE.S	BLIT_S_LOOP1
		ADDQ	#1,D0
		MOVE.L	D1,$44(A1)		BLTAFLWM
		MOVE.L	D2,$60(A1)		BLTCBMOD
		MOVE.L	D3,$64(A1)		BLTADMOD
		MOVE.L	D4,$40(A1)		BLTCON01
		MOVE.L	(A0)+,$50(A1)		SOURCE ADRES
		MOVE.L	(A0)+,$54(A1)		DEST ADRES
		MOVE.W	A3,$58(A1)
		DBRA	D5,BLIT_S_LOOP
		ASR.W	#2,D6
		ADDQ.W	#1,D6
		CMP.W	D7,D6
		BLE.S	NEXT_MULTI_BLIT
		MOVEM.L	(SP)+,A3-4
		RTS
SKIP_BLIT	ADDQ.L	#8,A0
		ADDQ	#1,D0
		DBRA	D5,BLIT_S_LOOP
		ASR.W	#2,D6
		ADDQ.W	#1,D6
		CMP.W	D7,D6
		BLE.S	NEXT_MULTI_BLIT
		MOVEM.L	(SP)+,A3-4
		RTS
NO_MULTI_BLIT	MOVEM.L	(SP)+,A3-4
		MOVEQ	#12,D0
		Rbra	L_CUSTOM
		
L_ERASE_BLIT	EQU	45
L45		MOVE.L	A6,-(SP)
		MOVE.L	(A3)+,D2
		Rble	L_IFonc
		SUBQ.W	#1,D2
		CMP.W	#96,D2
		Rbcc	L_IFonc
		ASL.L	#2,D2
		Dlea	BLIT_DEFS,A1
		MOVE.L	A1,A2
		MOVE.L	(A1,D2.L),D1
		BEQ.S	BLIT_IS_ERASED
		MOVE.L	D1,A1
		MOVE.W	(A1),D0
		MOVE.L	#0,(A2,D2.L)
		EXT.L	D0
		MULU	#8,D0
		ADD.W	#20,D0
		CALLEXEC FreeMem
BLIT_IS_ERASED	MOVE.L	(SP)+,A6
		RTS

L_BLIT_SPEED	EQU	46
L46		MOVE.L	(A3)+,D7	NEW SPEED
		AND.L	#$F,D7
		Rbeq	L_IFonc
		MOVE.L	(A3)+,D6	BLIT NUMBER
		MOVE.W	#$FFFF,D5
		MOVE.W	#$9F0,D4
		SUBQ.L	#1,D6
		Dlea	BLIT_DEFS,A0
		ADD.W	D6,D6
		ADD.W	D6,D6
		MOVE.L	(A0,D6.W),D0	BLIT DEF ADRES
		BEQ.S	NO_BLIT_SPEED	NOT DEFINED ? ERROR !
		MOVE.L	D0,A0
		MOVE.L	2(A0),D0	BLTAFLWM
		BTST	#0,D0
		BEQ.S	IS_RIGHT
		LSR.W	D7,D5
		MOVE.W	D5,4(A0)
		ROR.W	#4,D7
		ADD.W	D7,D4
		MOVE.W	D4,14(A0)
		RTS
IS_RIGHT	BTST	#15,D0
		BEQ.S	IS_UP
		ASL.W	D7,D5
		MOVE.W	D5,4(A0)
		ROR.W	#4,D7
		ADD.W	D7,D4
		MOVE.W	D4,14(A0)
IS_UP		RTS
NO_BLIT_SPEED	MOVEQ	#12,D0
		Rbra	L_CUSTOM

L_BLIT_LEFT	EQU	47
L47		MOVE.L	20(A3),D1
		Rjsr	L_GetEc
		MOVE.L	D0,A2		BITMAP ADRESSEN
		MOVE.W	EcNPlan(A0),D7	AANTAL PLANES
		SUBQ.W	#1,D7		-1 VOOR DBRA
		MOVE.L	(A3)+,D6	SHIFT
		BMI	DESCENDING_LEFT
		MOVE.L	(A3)+,D5	Y1
		CMP.W	EcTy(A0),D5
		Rbhi	L_IFonc
		MOVE.L	(A3)+,D3	X1
		AND.W	#$FFF0,D3
		MOVE.L	(A3)+,D4	Y
		Rbmi	L_IFonc
		MOVE.L	(A3)+,D2	X
		Rbmi	L_IFonc
		AND.W	#$FFF0,D2
		CMP.W	D3,D2
		Rbge	L_IFonc
		CMP.W	D5,D4
		Rbge	L_IFonc
		MOVE.L	D4,D0
		MULU	EcTligne(A0),D0	Y * BYTES REGEL
		MOVE.L	D2,D1
		LSR.W	#3,D1		X / 8
		ADD.W	D0,D1		OFFSET= Y * BYTES REGEL + X / 8
		SUB.W	D2,D3		X1 - X
		LSR.W	#3,D3		(X1 - X) / 8
		MOVE.W	EcTligne(A0),D0
		SUB.W	D3,D0		BLTAMOD	= BYTES REGEL - (X1 - X) / 8
		SUB.W	D4,D5		(Y1 - Y)
		ASL.W	#6,D5		(Y1 - Y) * 64
		LSR.W	#1,D3		(X1 - X) / 16		
		ADD.W	D3,D5		BLTSIZE
		MOVEQ	#-1,D2
		LSL.L	D6,D2		BLTAFLWM
		ROR.L	#4,D6
		ADD.L	#$9F00000,D6	BLTCON01
		LEA	$DFF000,A1
		MOVE.L	T_RASTPORT(A5),A0
		MOVEQ	#0,D4
LOOP_A_LEFT	BTST	D4,24(A0)
		BEQ.S	SKIP_A_BLIT
LOOP_A_LEFT1	BTST	#14,2(A1)
		BNE.S	LOOP_A_LEFT1
		ADDQ	#1,D4
		MOVE.L	D2,$44(A1)	BLTAFLWM
		MOVE.L	#0,$60(A1)	BLTCBMOD
		MOVE.W	D0,$64(A1)	BLTAMOD
		MOVE.W	D0,$66(A1)	BLTDMOD
		MOVE.L	(A2)+,D3	ADRES PLANES 1 - > 6
		ADD.L	D1,D3
		MOVE.L	D6,$40(A1)
		MOVE.L	D3,$50(A1)	SOURCE ADRES
		MOVE.L	D3,$54(A1)	DEST ADRES
		MOVE.W	D5,$58(A1)	BLTSIZE
		DBRA	D7,LOOP_A_LEFT
		ADDQ.L	#4,A3		ADJUST STACK !
		RTS
SKIP_A_BLIT	ADDQ.L	#4,A2
		ADDQ	#1,D4
		DBRA	D7,LOOP_A_LEFT
		ADDQ.L	#4,A3
		RTS
DESCENDING_LEFT	NEG.L	D6
		MOVE.L	(A3)+,D5	Y1
		CMP.W	EcTy(A0),D5
		Rbhi	L_IFonc
		MOVE.L	(A3)+,D3	X1
		AND.W	#$FFF0,D3
		MOVE.L	(A3)+,D4	Y
		Rbmi	L_IFonc
		MOVE.L	(A3)+,D2	X
		Rbmi	L_IFonc
		AND.W	#$FFF0,D2
		CMP.W	D3,D2
		Rbge	L_IFonc
		CMP.W	D5,D4
		Rbge	L_IFonc
		MOVEM.L	D2-5,-(SP)
		SUB.W	D4,D5		Y1 - Y
		MULU	EcTligne(A0),D5	(Y1 - Y) * BYTES REGEL
		SUB.W	D2,D3		X1 - X
		ASR.W	#3,D3		(X1 - X) / 8
		ADD.W	D3,D5
		SUBQ.W	#2,D5
		SUB.W	EcTligne(A0),D5
		MOVE.L	D5,A1		DESCENDING OFFSET
		MOVEM.L	(SP)+,D2-5
		MOVE.L	D4,D0
		MULU	EcTligne(A0),D0	Y * BYTES REGEL
		MOVE.L	D2,D1
		LSR.W	#3,D1		X / 8
		ADD.W	D0,D1		OFFSET= Y * BYTES REGEL + X / 8
		ADD.L	A1,D1		OFFSET + DESCENDING OFFSET
		SUB.W	D2,D3		X1 - X
		LSR.W	#3,D3		(X1 - X) / 8
		MOVE.W	EcTligne(A0),D0
		SUB.W	D3,D0		BLTAMOD	= BYTES REGEL - (X1 - X) / 8
		SUB.L	D4,D5		(Y1 - Y)
		ASL.W	#6,D5		(Y1 - Y) * 64
		LSR.W	#1,D3		(X1 - X) / 16		
		ADD.W	D3,D5		BLTSIZE
		MOVEQ	#-1,D2
		LSR.L	D6,D2		BLTAFLWM
		SWAP 	D2
		ROR.L	#4,D6
		ADD.L	#$9F00002,D6	BLTCON01
		LEA	$DFF000,A1
		MOVE.L	T_RASTPORT(A5),A0
		MOVEQ	#0,D4
LOOP_D_LEFT	BTST	D4,24(A0)
		BEQ.S	SKIP_D_BLIT
LOOP_D_LEFT1	BTST	#14,2(A1)
		BNE.S	LOOP_D_LEFT1
		ADDQ	#1,D4
		MOVE.L	D2,$44(A1)	BLTAFLWM
		MOVE.L	#0,$60(A1)	BLTCBMOD
		MOVE.W	D0,$64(A1)	BLTAMOD
		MOVE.W	D0,$66(A1)	BLTDMOD
		MOVE.L	(A2)+,D3	ADRES PLANES 1 - > 6
		ADD.L	D1,D3
		MOVE.L	D6,$40(A1)
		MOVE.L	D3,$50(A1)	SOURCE ADRES
		MOVE.L	D3,$54(A1)	DEST ADRES
		MOVE.W	D5,$58(A1)	BLTSIZE
		DBRA	D7,LOOP_D_LEFT
		ADDQ.L	#4,A3		ADJUST STACK !
		RTS
SKIP_D_BLIT	ADDQ.L	#4,A2
		ADDQ	#1,D4
		DBRA	D7,LOOP_D_LEFT
		ADDQ.L	#4,A3
		RTS

L_BLIT_CLEAR	EQU	48
L48		LEA	$DFF000,A1
		MOVE.L	ScOnAd(A5),A0
		MOVE.W	EcNPlan(A0),D7
		MOVE.W	EcTLigne(A0),D6	BYTES REGEL
		ASR.W	#1,D6		WORDS REGEL
		MOVE.W	EcTy(A0),D5
		ASL.W	#6,D5		Y * 64
		ADD.W	D5,D6		BLITSIZE
		MOVEQ	#0,D1		INIT BLTADAT/BLTDMOD
		MOVEQ	#-1,D2		INIT BLTAFLWM
		MOVE.L	(A3)+,D0	PLANE TO BE ERASED !
		BMI.S	ALL_PLANES
		Rbeq	L_IFonc
		SUBQ	#1,D0
		CMP.W	D7,D0
		Rbge	L_IFonc 
SELECT_PLANE	MOVE.L	(A0)+,A2
		DBRA	D0,SELECT_PLANE
ERASE_SINGLE	BTST	#14,2(A1)
		BNE.S	ERASE_SINGLE
		MOVE.W	D1,$74(A1)		BLTADAT
		MOVE.W	D1,$66(A1)		BLTDMOD
		MOVE.L	D2,$44(A1)		BLTAFLWM
		MOVE.L	#$01F00000,$40(A1)	BLTCON0/1
		MOVE.L	A2,$54(A1)		ADRES PLANE 1 -> 6
		MOVE.W	D6,$58(A1)		BLTSIZE
		RTS	
ALL_PLANES	SUBQ	#1,D7
		MOVE.L	T_RASTPORT(A5),A2
		MOVEQ	#0,D3
ERASE_ALL	BTST	#14,2(A1)
		BNE.S	ERASE_ALL
		BTST	D3,24(A2)
		BEQ.S	SKIP_CLEAR
		ADDQ	#1,D3
		MOVE.W	D1,$74(A1)		BLTADAT
		MOVE.W	D1,$66(A1)		BLTDMOD
		MOVE.L	D2,$44(A1)		BLTAFLWM
		MOVE.L	#$01F00000,$40(A1)	BLTCON0/1
		MOVE.L	(A0)+,$54(A1)		ADRES PLANES 1 -> 6
		MOVE.W	D6,$58(A1)		BLTSIZE
		DBRA	D7,ERASE_ALL
		RTS
SKIP_CLEAR	ADDQ.L	#4,A0
		ADDQ	#1,D3
		DBRA	D7,ERASE_ALL
		RTS

L_FAST_PLOT	EQU	49
L49		MOVE.L	ScOnAd(A5),A0
		MOVEQ.L	#0,D2
		MOVE.L	(A3)+,D3	COLOUR
		Rbmi	L_IFonc
		MOVE.L	(A3)+,D7	Y
		BMI.S	NO_PLOT1
		CMP.W	EcTy(A0),D7
		BGE.S	NO_PLOT1
		MOVE.L	(A3)+,D6	X
		BMI.S	NO_PLOT
		MOVE.W	EcTligne(A0),D4
		MOVE.W	D4,D5
		ASL.W	#3,D5
		CMP.W	D5,D6
		BGE.S	NO_PLOT
		MULU	D4,D7		D4 -> EcTligne(A0)
		MOVE.W	D6,D5
		ASR.W	#3,D6
		ADD.W	D6,D7		OFFSET
		NOT	D5
		MOVE.W	EcNPlan(A0),D0
		SUBQ.W	#1,D0
		TST.W	EcAuto(A0)
		Rbeq	L_PLOT
		MOVEM.L	D0-D7/A0-2,-(SP)
		EcCall	AutoBack1
		MOVEM.L	(SP),D0-7/A0-2
		BTST	#BitDble,EcFlags(A0)
		BEQ.S	ABPac1
		Rbsr	L_PLOT
		EcCall	AutoBack2
		MOVEM.L	(SP),D0-7/A0-2
		Rbsr	L_PLOT
		EcCall	Autoback3
		BRA.S	ABPac2
ABPac1		Rbsr	L_PLOT
		EcCall	AutoBack4
ABPac2		MOVEM.L	(SP)+,D0-7/A0-2
NO_PLOT		RTS
NO_PLOT1	ADDQ.L	#4,A3
		RTS

L_PLOT		EQU	50
L50		LEA	EcCurrent(A0),A2
SET_BIT_LOOP	MOVE.L	A2,A1
		MOVE.L	(A1),A1
		BTST	D2,D3
		BEQ.S	BIT_CLEAR
		BSET	D5,(A1,D7.L)
		ADDQ.W	#1,D2
		ADDQ.L	#4,A2
		DBRA	D0,SET_BIT_LOOP
		RTS
BIT_CLEAR	BCLR	D5,(A1,D7.L)
		ADDQ.W	#1,D2
		ADDQ.L	#4,A2
		DBRA	D0,SET_BIT_LOOP
		RTS

L_FAST_POINT	EQU	51
L51		MOVEQ	#-1,D3		INIT RESULT
		MOVE.L	ScOnAd(A5),A0
		MOVE.L	(A3)+,D7	Y
		BMI.S	NO_POINT1
		CMP.W	EcTy(A0),D7
		BGE.S	NO_POINT1
		MOVE.L	(A3)+,D6	X
		BMI.S	NO_POINT
		MOVE.W	EcTligne(A0),D5
		MOVE.W	D5,D4
		ASL.W	#3,D5
		CMP.W	D5,D6
		BGE.S	NO_POINT
		MOVEQ	#0,D3
		MULU	D4,D7
		MOVE.W	D6,D4
		ASR.W	#3,D6
		ADD.W	D6,D7		OFFSET
		NOT	D4
		MOVE.W	EcNPlan(A0),D2
		MOVEQ	#0,D5
		SUBQ	#1,D2
CHEK_POINT_LOOP	MOVE.L	(A0)+,A1
		BTST	D4,(A1,D7.L)
		BEQ.S	NO_BIT_SET
		BSET	D5,D3
NO_BIT_SET	ADDQ	#1,D5
		DBRA	D2,CHEK_POINT_LOOP
		MOVEQ	#0,D2
		RTS
NO_POINT	MOVEQ	#0,D2
		RTS
NO_POINT1	ADDQ.L	#4,A3
		MOVEQ	#0,D2
		RTS

L_RES_STARS	EQU	52
L52		MOVE.L	(A3)+,D0
		Rble	L_IFonc
		CMP.W	#4001,D0
		Rbge	L_IFonc
		Dload	A2
		MOVE.W	STARS_COUNT-MB(A2),D1
		BNE	STARS_DEFINED
		MOVE.W	D0,STARS_COUNT-MB(A2)
		MULU	#8,D0
		MOVE.L	#MEMF_CHIP+MEMF_CLEAR,D1
		MOVE.L	A6,A2
		CALLEXEC AllocMem
		MOVE.L	A2,A6
		Rbeq	OUT_OF_MEM
		Dload	A2
		MOVE.L	D0,STARS_ADRES-MB(A2)
		MOVEQ	#2,D0
		MOVE.L	ScOnAd(A5),A0
*		STORE ADRES OF SCREEN FOR STARS INTERRUPT ROUTINE
*		THIS ADRES IS NOT USED BY THE NORMAL 'STAR' ROUTINES !
		MOVE.L	A0,STARS_INT_SCREEN-MB(A2)
		MULU	EcTy(A0),D0
		MOVE.W	D0,OFFSET_COUNT-MB(A2)
		MOVE.L	#MEMF_CHIP+MEMF_CLEAR,D1
		MOVE.L	A6,A2
		CALLEXEC AllocMem
		MOVE.L	A2,A6
		Dload	A2
		MOVE.L	D0,OFFSET_ADRES-MB(A2)		
		MOVE.L	D0,A1
		MOVE.L	ScOnAd(A5),A0
		MOVE.W	EcTy(A0),D7
		MOVE.W	EcTLigne(A0),D6
		SUBQ	#1,D7
		MOVEQ	#0,D1
OFFSET_LOOP	MOVE.W	D1,D0
		MULU	D6,D0
		MOVE.W	D0,(A1)+
		ADDQ	#1,D1
		CMP.W	D7,D1
		BLE.S	OFFSET_LOOP
		Dlea	STARS_CLIP,A2
		CLR.L	(A2)+			X,Y CLIP=0
		MOVE.L	ScOnAd(A5),A0
		MOVE.W	EcTLigne(A0),D0
		ASL.W	#3,D0			X1
		MOVE.W	D0,(A2)+
		MOVE.W	EcTy(A0),(A2)		Y1
		RTS
STARS_DEFINED	MOVEQ	#8,D0
		Rbra	L_CUSTOM
	
L_DEF_STAR	EQU	53
L53		Dload	A2
		MOVE.L	(A3)+,D4	Y SPEED
		MOVE.L	(A3)+,D3	X SPEED
		MOVE.L	(A3)+,D2	Y
		Rbmi	L_IFonc
		MOVE.L	(A3)+,D1	X
		Rbmi	L_IFonc
		MOVE.L	(A3)+,D0	STAR NR
		Rble	L_IFonc
		SUBQ	#1,D0
		TST.W	STARS_COUNT-MB(A2)
		BEQ.S	NO_STARS_RESERVED
		CMP.W	STARS_COUNT-MB(A2),D0
		Rbge	L_IFonc		NO STARS DEFINED OR 'STAR NR' >COUNT?
		ASL.W	#3,D0
		MOVE.L	STARS_ADRES-MB(A2),A2
		MOVEM.W	D1-4,(A2,D0.W)
		RTS
NO_STARS_RESERVED
		MOVEQ	#9,D0
		Rbra	L_CUSTOM

L_DRAW_STARS	EQU	54
L54		Dload	A2
		MOVE.W	STARS_COUNT-MB(A2),D7	HOW MANY STARS ?
		Rbeq	L_IFonc			NO STARS DEFINED
		SUBQ.W	#1,D7
		MOVEM.L	A3-A6,-(SP)
		MOVE.L	OFFSET_ADRES-MB(A2),A6	START ADRES OF EVERY LINE
		MOVE.L	ScOnAd(A5),A4		ADRES ACTUAL SCREEN
		MOVE.L	(A4),A0			PTR TO BITMAP ETC...
		Dlea	STARS_CLIP,A3		CLIP DEFINITIONS
		MOVEM.W	(A3),D1/A1/A3/A5	MIN X,MIN Y,MAX X,MAX Y
		MOVE.L	STARS_ADRES-MB(A2),A2	STAR DEFINITIONS
		MOVEQ	#0,D0			VALUE FOR TESTING SPEED
STARS1_LOOP	MOVEM.W	(A2),D3-6		3=X 4=Y 5=X SPEED 6= Y SPEED
		CMP.W	D0,D5			X SPEED = 0 ?
		BEQ.S	NO_X_SPEED
		ADD.W	D3,D5
		CMP.W	A3,D5			X >= MAX X ?
		BGE.S	X_OFF_SCREEN
		CMP.W	D1,D5			X < MIN X ?
		BLT.S	X_OFF_SCREEN1	
		MOVE.W	D5,(A2)			NEW COORD = OK
		BRA.S	X_ON_SCREEN
X_OFF_SCREEN	SUB.W	A3,D5			
		MOVE.W	D5,(A2)			NEW COORD = X - MAX X
		BRA.S	X_ON_SCREEN
X_OFF_SCREEN1	ADD.W	D5,A3
		MOVE.W	A3,(A2)			NEW COORD = MAX X + (-X)
X_ON_SCREEN
NO_X_SPEED	CMP.W	D0,D6			Y SPEED = 0 ?
		BEQ.S	NO_Y_SPEED
		ADD.W	D4,D6
		CMP.W	A1,D6			Y < MIN Y ?
		BLT.S	Y_OFF_SCREEN1
		CMP.W	A5,D6			Y >= MAX Y ?
		BGE.S	Y_OFF_SCREEN
		MOVE.W	D6,2(A2)		NEW COORD = OK
		BRA.S	Y_ON_SCREEN
Y_OFF_SCREEN	SUB.W	A5,D6
		MOVE.W	D6,2(A2)		NEW COORD = Y - MAX Y
		BRA.S	Y_ON_SCREEN
Y_OFF_SCREEN1	ADD.W	D6,A5
		MOVE.W	A5,2(A2)		NEW COORD = MAX Y + (-Y)
Y_ON_SCREEN
NO_Y_SPEED	ADD.W	D4,D4			FIND START ADRES OF LINE
		MOVE.W	D3,D5			SAVE X -> PIXELS
		NOT	D5
		ASR.W	#3,D3			SCREEN OFFSET -> ONLY X (BYTES)
		ADD.W	(A6,D4.W),D3			ADD SCREEN OFFSETS -> X+Y
		BSET	D5,(A0,D3.W)		SET BIT ON SCREEN
		ADDQ.L	#8,A2			ADRES OF NEXT STAR
		DBRA	D7,STARS1_LOOP		GO ON !
		MOVEM.L	(SP)+,A3-A6
		RTS

L_ERASE_STARS	EQU	55
L55		Dload	A2
		MOVE.W	STARS_COUNT-MB(A2),D0
		BEQ.S	STARS_ERASED
		EXT.L	D0
		MULU	#8,D0
		MOVE.W	#0,STARS_COUNT-MB(A2)
		MOVE.L	STARS_ADRES-MB(A2),A1
		MOVE.L	A6,A2
		CALLEXEC FreeMem
		MOVE.L	A2,A6
		Dload	A2
		MOVE.W	OFFSET_COUNT-MB(A2),D0
		EXT.L	D0
		MOVE.L	OFFSET_ADRES-MB(A2),A1
		MOVE.L	A6,A2
		CALLEXEC FreeMem
		MOVE.L	A2,A6
STARS_ERASED	RTS

L_COMPUTE_STARS	EQU	56
L56		Dload	A2
		MOVE.L	(A3)+,D3		TO PARAM
		Rbeq	L_IFonc			CHECK VALUE !!!
		SUBQ	#1,D3
		CMP.W	STARS_COUNT-MB(A2),D3
		Rbge	L_IFonc			NO STARS DEFINED ?
		MOVE.L	(A3)+,D7		FROM PARAM
		Rbeq	L_IFonc			CHECK VALUE !!!
		SUBQ	#1,D7
		MOVE.W	D3,COMPUTE_TO-MB(A2)	STORE "TO" VALUE
		MOVEM.L	A3-A6,-(SP)
		MOVE.L	OFFSET_ADRES-MB(A2),A6	Y OFFSETS (FOR MORE SPEED)
		MOVE.L	STARS_ADRES-MB(A2),A2	STARS DEFINITIONS
		MOVE.L	D7,D4			COMPUTE ADRESS OF
		LSL.W	#3,D4			FIRST STAR TO BE
		ADD.L	D4,A2			PROCESSED...
		DLOAD	A4
		Dlea	STARS_CLIP,A3		CLIP DEFINITIONS
		MOVEM.W	(A3),D1/A1/A3/A5	MIN X,MIN Y,MAX X,MAX Y
		MOVEQ	#0,D0			RESET AND CHECK VALUE
STARS1_COMP	MOVEM.W	(A2),D3-6		3=X 4=Y 5=X SPEED 6= Y SPEED
		CMP.W	D0,D5			X SPEED = 0 ?
		BEQ.S	NO_X_SPEED_C
		ADD.W	D3,D5
		CMP.W	A3,D5			X >= MAX X ?
		BGE.S	X_OFF_SCREEN_C
		CMP.W	D1,D5			X < MIN X ?
		BLT.S	X_OFF_SCREEN1_C	
		MOVE.W	D5,(A2)			NEW COORD = OK
		BRA.S	X_ON_SCREEN_C
X_OFF_SCREEN_C	SUB.W	A3,D5			
		MOVE.W	D5,(A2)			NEW COORD = X - MAX X
		BRA.S	X_ON_SCREEN_C
X_OFF_SCREEN1_C	ADD.W	D5,A3
		MOVE.W	A3,(A2)			NEW COORD = MAX X + (-X)
X_ON_SCREEN_C
NO_X_SPEED_C	CMP.W	D0,D6			Y SPEED = 0 ?
		BEQ.S	NO_Y_SPEED_C
		ADD.W	D4,D6
		CMP.W	A1,D6			Y < MIN Y ?
		BLT.S	Y_OFF_SCREEN1_C
		CMP.W	A5,D6			Y >= MAX Y ?
		BGE.S	Y_OFF_SCREEN_C
		MOVE.W	D6,2(A2)		NEW COORD = OK
		BRA.S	Y_ON_SCREEN_C
Y_OFF_SCREEN_C	SUB.W	A5,D6
		MOVE.W	D6,2(A2)		NEW COORD = Y - MAX Y
		BRA.S	Y_ON_SCREEN_C
Y_OFF_SCREEN1_C	ADD.W	D6,A5
		MOVE.W	A5,2(A2)		NEW COORD = MAX Y + (-Y)
Y_ON_SCREEN_C
NO_Y_SPEED_C	ADDQ.L	#8,A2
		ADDQ	#1,D7
		CMP.W	COMPUTE_TO-MB(A4),D7
		BLE.S	STARS1_COMP
		MOVEM.L	(SP)+,A3-A6
		RTS

L_F_STARS	EQU	57
L57		Dload	A2
		MOVE.W	STARS_COUNT-MB(A2),D7	HOW MANY STARS ?
		Rbeq	L_IFonc			NO STARS DEFINED ?
		SUBQ.W	#1,D7			-1 FOR DBRA
		MOVE.L	A4,-(SP)
		MOVE.L	A6,-(SP)
		MOVE.L	ScOnAd(A5),A4		ADRES ACTUAL SCREEN
		MOVE.L	OFFSET_ADRES-MB(A2),A6	Y OFFSETS (FOR MORE SPEED)
		MOVE.L	STARS_ADRES-MB(A2),A2	STAR DEFINITIONS
		MOVE.L	(A4),A0			FIRST BITPLANE OF SCREEN
STARS1_F_LOOP	MOVEM.W	(A2)+,D3-6		3=X 4=Y 5=X SPEED 6= Y SPEED
		ADD.W	D4,D4			(SPEED FACTORS NOT USED !!!)
		MOVE.W	D3,D5			SAVE X -> PIXELS
		NOT	D5
		ASR.W	#3,D3			SCREEN OFFSET -> ONLY X (BYTES)
		ADD.W	(A6,D4.W),D3			ADD SCREEN OFFSETS -> X+Y
		BSET	D5,(A0,D3.W)		SET BIT ON SCREEN
		DBRA	D7,STARS1_F_LOOP	NEXT STAR...
EXIT_F_STARS	MOVE.L	(SP)+,A6
		MOVE.L	(SP)+,A4
		RTS

L_STARS_SPEED	EQU	58
L58		MOVE.L	(A3)+,D4		NEW Y SPEED
		MOVE.L	(A3)+,D3		NEW X SPEED
		MOVE.L	(A3)+,D2		TO PARAM
		MOVE.L	(A3)+,D1		FROM PARAM
		Rbeq	l_IFonc
		CMP.W	D1,D2
		Rble	L_IFonc
		Dload	A2
		SUBQ	#1,D2
		CMP.W	STARS_COUNT-MB(A2),D2
		Rbge	L_IFonc			NO STARS DEFINED ?
		SUBQ	#1,D1
		MOVE.L	D1,D5
		ASL.W	#3,D5
		MOVE.L	STARS_ADRES-MB(A2),A1
		ADD.L	D5,A1
SPEED_LOOP	ADDQ.L	#4,A1
		MOVE.W	D3,(A1)+
		MOVE.W	D4,(A1)+
		ADDQ	#1,D1
		CMP.W	D2,D1
		BLE.S	SPEED_LOOP
		RTS
				
L_CLIP_STARS	EQU	59
L59		MOVE.L	(A3)+,D7		MAX Y
		MOVE.L	(A3)+,D6		MAX X
		MOVE.L	(A3)+,D5		MIN Y
		Rbmi	L_IFonc			MIN Y < 0 ? ERROR
		MOVE.L	(A3)+,D4		MIN X
		Rbmi	L_IFonc			MIN X < 0 ? ERROR
		CMP.W	D4,D6
		Rble	L_IFonc			MAX X <= MIN X ? ERROR
		CMP.W	D5,D7
		Rble	L_IFonc			MAX Y <= MIN Y ? ERROR
		MOVE.L	ScOnAd(A5),A0		ACTUAL SCREEN
		MOVE.W	EcTy(A0),D3		MAX Y OF SCREEN
		MOVE.W	EcTLigne(A0),D2
		ASL.W	#3,D2			MAX X OF SCREEN
		Dlea	STARS_CLIP,A1		CLIP DEFINITIONS
		CMP.W	D2,D4			
		Rbge	L_IFonc			MIN X >= MAX X OF SCREEN ?
		MOVE.W	D4,(A1)+		STORE NEW MIN X
		CMP.W	D3,D5
		Rbge	L_IFonc			MIN Y >= MAX Y OF SCREEN ?
		MOVE.W	D5,(A1)+		STORE NEW MIN Y
		CMP.W	D2,D6
		BGE.S	X_TOO_BIG		MAX X >= MAX X OF SCREEN ?
		MOVE.W	D6,(A1)+		STORE NEW MAX X		
		BRA.S	Y_TEST
X_TOO_BIG	SUBQ	#1,D2
		MOVE.W	D2,(A1)+		NEW MAX X = MAX X OF SCREEN-1
Y_TEST		CMP.W	D3,D7
		BGE.S	Y_TOO_BIG		MAX Y >= MAX Y OF SCREEN ?
		MOVE.W	D7,(A1)			STORE NEW MAX Y
		BRA.S	CLIPS_OK
Y_TOO_BIG	SUBQ	#1,D3
		MOVE.W	D3,(A1)			NEW MAX Y = MAX Y OF SCREEN-1
CLIPS_OK	RTS

L_LEFT_CLICK	EQU	60
L60		BTST	#6,$BFE001
		BEQ.S	LEFT_CLICK		IS SOMEONE CLICKING ?
		MOVEQ.L	#0,D3			RETURN FALSE
		MOVEQ.L	#0,D2			INTEGER VALUE
		RTS
LEFT_CLICK	MOVEQ.L	#-1,D3			RETURN TRUE
		MOVEQ.L	#0,D2			INTEGER VALUE
		RTS

L_F_CIRCLE	EQU	61
L61		MOVE.L	(A3)+,D7	COLOUR
		Rbmi	L_IFonc
		MOVE.L	(A3)+,D6	R
		Rble	L_IFonc
		MOVE.L	(A3)+,D5	OFFY
		MOVE.L	(A3)+,D4	OFFX
		MOVE.W	D6,D3		R ->D3
		ASL.L	#8,D3		R * 256
		DIVU	#362,D3		(R * 256)/ 362
		BEQ.S	NO_ADD
		ADDQ	#1,D3		1 + (R * 256)/ 362 = TELLER
NO_ADD		MULU	D6,D6		R*R
		MOVE.L	ScOnAd(A5),A2
		MOVEM.L	A4-6,-(SP)
		MOVEM.W	EcTX(A2),A4-A6	EcTx, EcTy, EcNPlan
		SUBQ	#1,A6
		MOVE.W	D7,-(A3)	PASS COLOUR ONLY ONCE !
CIRCLE_LOOP	MOVE.W	D3,D0		X ->D0
		MULU	D0,D0		X*X
		NEG.L	D0		-(X*X)
		ADD.L	D6,D0		-(X*X)+(R*R)
		MOVE.W	D3,A1		\
		MOVEQ	#0,D1		|
		move.w	#$4000,d2	|
ROOT_CIRC	move.w	d1,d3		|
		add.w	d2,d3		|
		lsr.w	#1,d1		|
		cmp.w	d3,d0		|
		ble.s	BOING_CIRC	|
		sub.w	d3,d0		|---> ROOT OF -(X*X)+(R*R)
		or.w	d2,d1		|
BOING_CIRC	lsr.w	#2,d2		|     IN D2	
		bne.s	ROOT_CIRC	|
		cmp.w	d1,d0		|
		blt.s	NO_ROUND_CIRC	|
		addq	#1,d1		|
NO_ROUND_CIRC	MOVE.W	A1,D3		/
		MOVE.W	D1,D2
		MOVE.W	EcTLigne(A2),D1
		MOVEM.W	D2-6,-(SP)		
		ADD.W	D3,D4		OFFX + X
		ADD.W	D2,D5		OFFY + Y
*		MOVE.W	D4,-(A3)	\			X
*		MOVE.W	D5,-(A3)	 |--> PASS PARAMS	Y
		MOVE.L	A2,A0
		MOVEQ.L	#0,D2
		MOVE.W	D5,D7	Y
		BMI.S	NO_CIRCLE1
		CMP.W	A5,D7
		BGE.S	NO_CIRCLE1
		MOVE.W	D4,D6	X
		BMI.S	NO_CIRCLE1
		CMP.W	A4,D6
		BGE.S	NO_CIRCLE1
		MOVE.W	(A3),D3		COLOUR
		MULU	D1,D7
*		MULU	EcTligne(A0),D7
		MOVEQ.L	#7,D4
		MOVE.W	D6,D5
		ASR.W	#3,D6
		ADD.W	D6,D7		OFFSET
		AND.W	#%111,D5
		SUB.W	D5,D4
		MOVE.L	A6,D0
SET_BIT_CIRC1	MOVE.L	(A0)+,A1
		BTST	D2,D3
		BEQ.S	BIT_CLEAR_CIRC1
		BSET	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC1
		BRA.S	NO_CIRCLE1
BIT_CLEAR_CIRC1	BCLR	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC1
NO_CIRCLE1
*		Rbsr	L_CIRCLE_PLOT
		MOVEM.W	(SP),D2-6
		ADD.W	D3,D4		OFFX + X
		SUB.W	D2,D5		OFFY - Y
*		MOVE.W	D4,-(A3)	\			X
*		MOVE.W	D5,-(A3)	 |--> PASS PARAMS	Y
		MOVE.L	A2,A0
		MOVEQ.L	#0,D2
		MOVE.W	D5,D7	Y
		BMI.S	NO_CIRCLE2
		CMP.W	A5,D7
		BGE.S	NO_CIRCLE2
		MOVE.W	D4,D6	X
		BMI.S	NO_CIRCLE2
		CMP.W	A4,D6
		BGE.S	NO_CIRCLE2
		MOVE.W	(A3),D3		COLOUR
		MULU	D1,D7
*		MULU	EcTligne(A0),D7
		MOVEQ.L	#7,D4
		MOVE.W	D6,D5
		ASR.W	#3,D6
		ADD.W	D6,D7		OFFSET
		AND.W	#%111,D5
		SUB.W	D5,D4
		MOVE.L	A6,D0
SET_BIT_CIRC2	MOVE.L	(A0)+,A1
		BTST	D2,D3
		BEQ.S	BIT_CLEAR_CIRC2
		BSET	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC2
		BRA.S	NO_CIRCLE2
BIT_CLEAR_CIRC2	BCLR	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC2
NO_CIRCLE2
*		Rbsr	L_CIRCLE_PLOT
		MOVEM.W	(SP),D2-6
		SUB.W	D3,D4		OFFX - X
		ADD.W	D2,D5		OFFY + Y
*		MOVE.W	D4,-(A3)	\
*		MOVE.W	D5,-(A3)	 |--> PASS PARAMS
		MOVE.L	A2,A0
		MOVEQ.L	#0,D2
		MOVE.W	D5,D7	Y
		BMI.S	NO_CIRCLE3
		CMP.W	A5,D7
		BGE.S	NO_CIRCLE3
		MOVE.W	D4,D6	X
		BMI.S	NO_CIRCLE3
		CMP.W	A4,D6
		BGE.S	NO_CIRCLE3
		MOVE.W	(A3),D3		COLOUR
		MULU	D1,D7
*		MULU	EcTligne(A0),D7
		MOVEQ.L	#7,D4
		MOVE.W	D6,D5
		ASR.W	#3,D6
		ADD.W	D6,D7		OFFSET
		AND.W	#%111,D5
		SUB.W	D5,D4
		MOVE.L	A6,D0
SET_BIT_CIRC3	MOVE.L	(A0)+,A1
		BTST	D2,D3
		BEQ.S	BIT_CLEAR_CIRC3
		BSET	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC3
		BRA.S	NO_CIRCLE3
BIT_CLEAR_CIRC3	BCLR	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC3
NO_CIRCLE3
*		Rbsr	L_CIRCLE_PLOT
		MOVEM.W	(SP),D2-6
		SUB.W	D3,D4		OFFX - X
		SUB.W	D2,D5		OFFY - Y
*		MOVE.W	D4,-(A3)	\
*		MOVE.W	D5,-(A3)	 |--> PASS PARAMS
		MOVE.L	A2,A0
		MOVEQ.L	#0,D2
		MOVE.W	D5,D7	Y
		BMI.S	NO_CIRCLE4
		CMP.W	A5,D7
		BGE.S	NO_CIRCLE4
		MOVE.W	D4,D6	X
		BMI.S	NO_CIRCLE4
		CMP.W	A4,D6
		BGE.S	NO_CIRCLE4
		MOVE.W	(A3),D3		COLOUR
		MULU	D1,D7
*		MULU	EcTligne(A0),D7
		MOVEQ.L	#7,D4
		MOVE.W	D6,D5
		ASR.W	#3,D6
		ADD.W	D6,D7		OFFSET
		AND.W	#%111,D5
		SUB.W	D5,D4
		MOVE.L	A6,D0
SET_BIT_CIRC4	MOVE.L	(A0)+,A1
		BTST	D2,D3
		BEQ.S	BIT_CLEAR_CIRC4
		BSET	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC4
		BRA.S	NO_CIRCLE4
BIT_CLEAR_CIRC4	BCLR	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC4
NO_CIRCLE4
*		Rbsr	L_CIRCLE_PLOT	
		MOVEM.W	(SP),D2-6
		SUB.W	D2,D4		OFFX - Y
		ADD.W	D3,D5		OFFY + X
*		MOVE.W	D4,-(A3)	\
*		MOVE.W	D5,-(A3)	 |--> PASS PARAMS
		MOVE.L	A2,A0
		MOVEQ.L	#0,D2
		MOVE.W	D5,D7	Y
		BMI.S	NO_CIRCLE5
		CMP.W	A5,D7
		BGE.S	NO_CIRCLE5
		MOVE.W	D4,D6	X
		BMI.S	NO_CIRCLE5
		CMP.W	A4,D6
		BGE.S	NO_CIRCLE5
		MOVE.W	(A3),D3		COLOUR
		MULU	D1,D7
*		MULU	EcTligne(A0),D7
		MOVEQ.L	#7,D4
		MOVE.W	D6,D5
		ASR.W	#3,D6
		ADD.W	D6,D7		OFFSET
		AND.W	#%111,D5
		SUB.W	D5,D4
		MOVE.L	A6,D0
SET_BIT_CIRC5	MOVE.L	(A0)+,A1
		BTST	D2,D3
		BEQ.S	BIT_CLEAR_CIRC5
		BSET	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC5
		BRA.S	NO_CIRCLE5
BIT_CLEAR_CIRC5	BCLR	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC5
NO_CIRCLE5
*		Rbsr	L_CIRCLE_PLOT
		MOVEM.W	(SP),D2-6
		SUB.W	D2,D4		OFFX - Y
		SUB.W	D3,D5		OFFY - X
*		MOVE.W	D4,-(A3)	\
*		MOVE.W	D5,-(A3)	 |--> PASS PARAMS
		MOVE.L	A2,A0
		MOVEQ.L	#0,D2
		MOVE.W	D5,D7	Y
		BMI.S	NO_CIRCLE6
		CMP.W	A5,D7
		BGE.S	NO_CIRCLE6
		MOVE.W	D4,D6	X
		BMI.S	NO_CIRCLE6
		CMP.W	A4,D6
		BGE.S	NO_CIRCLE6
		MOVE.W	(A3),D3		COLOUR
		MULU	D1,D7
*		MULU	EcTligne(A0),D7
		MOVEQ.L	#7,D4
		MOVE.W	D6,D5
		ASR.W	#3,D6
		ADD.W	D6,D7		OFFSET
		AND.W	#%111,D5
		SUB.W	D5,D4
		MOVE.L	A6,D0
SET_BIT_CIRC6	MOVE.L	(A0)+,A1
		BTST	D2,D3
		BEQ.S	BIT_CLEAR_CIRC6
		BSET	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC6
		BRA.S	NO_CIRCLE6
BIT_CLEAR_CIRC6	BCLR	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC6
NO_CIRCLE6
*		Rbsr	L_CIRCLE_PLOT
		MOVEM.W	(SP),D2-6
		ADD.W	D2,D4		OFFX + Y
		SUB.W	D3,D5		OFFY - X
*		MOVE.W	D4,-(A3)	\
*		MOVE.W	D5,-(A3)	 |--> PASS PARAMS
		MOVE.L	A2,A0
		MOVEQ.L	#0,D2
		MOVE.W	D5,D7	Y
		BMI.S	NO_CIRCLE7
		CMP.W	A5,D7
		BGE.S	NO_CIRCLE7
		MOVE.W	D4,D6	X
		BMI.S	NO_CIRCLE7
		CMP.W	A4,D6
		BGE.S	NO_CIRCLE7
		MOVE.W	(A3),D3		COLOUR
		MULU	D1,D7
*		MULU	EcTligne(A0),D7
		MOVEQ.L	#7,D4
		MOVE.W	D6,D5
		ASR.W	#3,D6
		ADD.W	D6,D7		OFFSET
		AND.W	#%111,D5
		SUB.W	D5,D4
		MOVE.L	A6,D0
SET_BIT_CIRC7	MOVE.L	(A0)+,A1
		BTST	D2,D3
		BEQ.S	BIT_CLEAR_CIRC7
		BSET	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC7
		BRA.S	NO_CIRCLE7
BIT_CLEAR_CIRC7	BCLR	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC7
NO_CIRCLE7
*		Rbsr	L_CIRCLE_PLOT
		MOVEM.W	(SP),D2-6
		ADD.W	D2,D4		OFFX + Y
		ADD.W	D3,D5		OFFY + X
*		MOVE.W	D4,-(A3)	\
*		MOVE.W	D5,-(A3)	 |--> PASS PARAMS
		MOVE.L	A2,A0
		MOVEQ.L	#0,D2
		MOVE.W	D5,D7	Y
		BMI.S	NO_CIRCLE8
		CMP.W	A5,D7
		BGE.S	NO_CIRCLE8
		MOVE.W	D4,D6	X
		BMI.S	NO_CIRCLE8
		CMP.W	A4,D6
		BGE.S	NO_CIRCLE8
		MOVE.W	(A3),D3		COLOUR
		MULU	D1,D7
*		MULU	EcTligne(A0),D7
		MOVEQ.L	#7,D4
		MOVE.W	D6,D5
		ASR.W	#3,D6
		ADD.W	D6,D7		OFFSET
		AND.W	#%111,D5
		SUB.W	D5,D4
		MOVE.L	A6,D0
SET_BIT_CIRC8	MOVE.L	(A0)+,A1
		BTST	D2,D3
		BEQ.S	BIT_CLEAR_CIRC8
		BSET	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC8
		BRA.S	NO_CIRCLE8
BIT_CLEAR_CIRC8	BCLR	D4,(A1,D7.L)
		ADDQ.W	#1,D2
		DBRA	D0,SET_BIT_CIRC8
NO_CIRCLE8
*		Rbsr	L_CIRCLE_PLOT
		MOVEM.W	(SP)+,D2-6
		DBRA	D3,CIRCLE_LOOP
		MOVEM.L	(SP)+,A4-6
		MOVE.W	(A3)+,D0
		RTS


L_IFonc		EQU	62
L62		MOVEQ.L	#23,D0
		Rjmp	L_Error

L_IFonca	EQU	63
L63		MOVEM.L	(SP)+,A4-6
		MOVEQ.L	#23,D0
		Rjmp	L_Error

OUT_OF_MEM	EQU	64
L64		MOVEQ	#24,D0
		Rjmp	L_Error

L_FAST_SQR	EQU	65
L65		MOVE.L	(A3)+,D0
		MOVEQ	#0,D1
		move.l	#$40000000,d2
root_loop:
		move.l	d1,d3
		add.l	d2,d3
		lsr.l	#1,d1
		cmp.l	d3,d0
		ble.s	boing
		sub.l	d3,d0
		or.l	d2,d1
boing:
		lsr.l	#2,d2
		bne.s	root_loop
		cmp.l	d1,d0
		blt.s	no_round_up
		addq.l	#1,d1
no_round_up:
		EXT.L	D1
		move.L	d1,d3
		MOVEQ	#0,D2
		rts

L_STARS_INT_ON	EQU	66
L66		Dload	A2
		TST.W	STARS_COUNT-MB(A2)
		BEQ.S	NO_INT_STARS_DEF
		TST.W	INT_STARS_ON-MB(A2)
		BNE.S	NO_INT_STARS
		MOVE.W	#1,INT_STARS_ON-MB(A2)
		MOVE.L	(A3)+,D0
		BEQ.S	NO_CLEAR
		MOVE.W	#1,STARS_INT_CLEAR-MB(A2)
NO_CLEAR	MOVEM.L	A4-A7,-(SP)
		MOVE.L	#IS_SIZE,D0
		MOVE.L	#(MEMF_PUBLIC|MEMF_CLEAR),D1
		CALLEXEC AllocMem
		TST.L	D0
		BEQ.S	EXIT
		MOVE.L	D0,A1
		Dload	A2
		MOVE.L	D0,INT_STARS_SERVER-MB(A2)
*		INITIALISATIE INTERRUPT
		MOVE.B	#NT_INTERRUPT,LN_TYPE(A1)
		MOVE.B	#-40,LN_PRI(A1)
		Dlea	INT_STARS_NAME,A2
		MOVE.L	A2,LN_NAME(A1)
		MOVE.L	A5,IS_DATA(A1)
		LEA	INT_DRAW_STARS(PC),A2
		MOVE.L	A2,IS_CODE(A1)
		MOVE.L	#INTB_VERTB,D0
		CALLEXEC AddIntServer
EXIT		MOVEM.L	(SP)+,A4-A7
		RTS
NO_INT_STARS	MOVEQ	#10,D0
		Rbra	L_CUSTOM
NO_INT_STARS_DEF
		MOVEQ	#9,D0
		Rbra	L_CUSTOM

INT_DRAW_STARS	MOVEM.L	D2-D7/A2-A4,-(SP)
		MOVE.L	A1,A5
		Dload	A2
		MOVEQ	#0,D0
		MOVE.L	STARS_INT_SCREEN-MB(A2),A4
		TST.W	STARS_INT_CLEAR-MB(A2)
		BEQ.S	SKIP_STARS_CLR
		LEA	$DFF000,A1
		MOVE.W	EcTLigne(A4),D6	BYTES REGEL
		ASR.W	#1,D6		WORDS REGEL
		MOVE.W	EcTy(A4),D5
		ASL.W	#6,D5		Y * 64
		ADD.W	D5,D6		BLITSIZE
ERASE_SINGLE_I	BTST	#14,2(A1)
		BNE.S	ERASE_SINGLE_I
		MOVE.W	D0,$74(A1)		BLTADAT
		MOVE.W	D0,$66(A1)		BLTDMOD
		MOVE.L	#-1,$44(A1)		BLTAFLWM
		MOVE.L	#$01F00000,$40(A1)	BLTCON0/1
		MOVE.L	(A4),$54(A1)		ADRES PLANE 1 -> 6
		MOVE.W	D6,$58(A1)		BLTSIZE
SKIP_STARS_CLR	MOVE.W	STARS_COUNT-MB(A2),D7	HOW MANY STARS ?
		BEQ.S	EXIT_STARS		NO STARS DEFINED
		SUBQ.W	#1,D7
		MOVE.L	OFFSET_ADRES-MB(A2),A6	START ADRES OF EVERY LINE
		MOVE.L	(A4),A0			PTR TO BITMAP ETC...
		Dlea	STARS_CLIP,A3		CLIP DEFINITIONS
		MOVEM.W	(A3),D1/A1/A3/A5	MIN X,MIN Y,MAX X,MAX Y
		MOVE.L	STARS_ADRES-MB(A2),A2	STAR DEFINITIONS
STARS1_LOOP_I	MOVEM.W	(A2),D3-6		3=X 4=Y 5=X SPEED 6= Y SPEED
		CMP.W	D0,D5			X SPEED = 0 ?
		BEQ.S	NO_X_SPEED_I
		ADD.W	D3,D5
		CMP.W	A3,D5			X >= MAX X ?
		BGE.S	X_OFF_SCREEN_I
		CMP.W	D1,D5			X < MIN X ?
		BLT.S	X_OFF_SCREEN1_I	
		MOVE.W	D5,(A2)			NEW COORD = OK
		BRA.S	X_ON_SCREEN_I
X_OFF_SCREEN_I	SUB.W	A3,D5
		MOVE.W	D5,(A2)			NEW COORD = X - MAX X
		BRA.S	X_ON_SCREEN_I
X_OFF_SCREEN1_I	ADD.W	D5,A3
		MOVE.W	A3,(A2)			NEW COORD = MAX X + (-X)
X_ON_SCREEN_I
NO_X_SPEED_I
; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; !!! I don't change the Y coordinates. This takes too much time !!!
; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;		CMP.W	D0,D6			Y SPEED = 0 ?
;		BEQ.S	NO_Y_SPEED_I
;		ADD.W	D4,D6
;		CMP.W	A1,D6			Y < MIN Y ?
;		BLT.S	Y_OFF_SCREEN1_I
;		CMP.W	A5,D6			Y >= MAX Y ?
;		BGE.S	Y_OFF_SCREEN_I
;		MOVE.W	D6,2(A2)		NEW COORD = OK
;		BRA.S	Y_ON_SCREEN_I
;Y_OFF_SCREEN_I	MOVE.W	A1,2(A2)		NEW COORD = MIN Y
;		BRA.S	Y_ON_SCREEN_I
;Y_OFF_SCREEN1_I	MOVE.W	A5,2(A2)		NEW COORD = MAX Y
;Y_ON_SCREEN_I
NO_Y_SPEED_I	ADD.W	D4,D4			FIND START ADRES OF LINE
*		MOVE.W	(A6,D4.W),D6		IN TABLE
		MOVE.W	D3,D5			SAVE X -> PIXELS
		NOT	D5
		ASR.W	#3,D3			SCREEN OFFSET -> ONLY X (BYTES)
		ADD.W	(A6,D4.W),D3			ADD SCREEN OFFSETS -> X+Y
		BSET	D5,(A0,D3.W)		SET BIT ON SCREEN
		ADDQ.L	#8,A2			ADRES OF NEXT STAR
		DBRA	D7,STARS1_LOOP_I	GO ON !
EXIT_STARS	MOVEM.L	(SP)+,D2-D7/A2-A4
		MOVEQ	#0,D0
		RTS

L_STARS_INT_OFF	EQU	67
L67		Dload	A2
		TST.W	INT_STARS_ON-MB(A2)
		BEQ.S	NO_STARS_INT
		CLR.W	STARS_INT_CLEAR-MB(A2)
		MOVEM.L	A4-A6,-(SP)
		CALLEXEC Disable
		Dload	A2
		CLR.W	INT_STARS_ON-MB(A2)
		MOVE.L	INT_STARS_SERVER-MB(A2),A1
		MOVE.L	#INTB_VERTB,D0
		CALLEXEC RemIntServer
		CALLEXEC Enable
		MOVEM.L	(SP),A4-6
		Dload	A2
		MOVE.L	INT_STARS_SERVER-MB(A2),A1
		MOVE.L	#IS_SIZE,D0
		CALLEXEC FreeMem
		MOVEM.L	(SP)+,A4-A6
NO_STARS_INT	RTS
	
L_BLIT_INT_ON	EQU	68
L68		MOVE.L	(A3)+,D7		TO BLIT
		MOVE.L	(A3)+,D6		FROM BLIT
		CMP.W	D6,D7
		Rblt	L_IFonc
		SUBQ.W	#1,D6
		Rbmi	L_IFonc
		SUBQ.W	#1,D7
		CMP.W	#96,D7
		Rbcc	L_IFonc
		Dload	A2
		TST.W	INT_BLIT_ON-MB(A2)
		BNE.S	NO_INT_BLIT
		MOVE.W	#1,INT_BLIT_ON-MB(A2)
		MOVE.W	D6,INT_BLIT_FROM-MB(A2)
		MOVE.W	D7,INT_BLIT_TO-MB(A2)
		MOVEM.L	A4-A7,-(SP)
		MOVE.L	#IS_SIZE,D0
		MOVE.L	#(MEMF_PUBLIC|MEMF_CLEAR),D1
		CALLEXEC AllocMem
		TST.L	D0
		BEQ.S	EXIT_INT_BLIT
		MOVE.L	D0,A1
		Dload	A2
		MOVE.L	D0,INT_BLIT_SERVER-MB(A2)
*		INITIALISATIE INTERRUPT
		MOVE.B	#NT_INTERRUPT,LN_TYPE(A1)
		MOVE.B	#9,LN_PRI(A1)
		Dlea	INT_BLIT_NAME,A2
		MOVE.L	A2,LN_NAME(A1)
		MOVE.L	A5,IS_DATA(A1)
		LEA	INT_MULTI_BLIT(PC),A2
		MOVE.L	A2,IS_CODE(A1)
		MOVE.L	#INTB_VERTB,D0
		CALLEXEC AddIntServer
EXIT_INT_BLIT	MOVEM.L	(SP)+,A4-A7
		RTS
NO_INT_BLIT	MOVEQ	#13,D0
		Rbra	L_CUSTOM
INT_MULTI_BLIT	MOVEM.L	D2-D7/A2-A4,-(SP)
		MOVE.L	A1,A5
		Dload	A2
		MOVE.L	T_RASTPORT(A5),A4
		MOVE.W	INT_BLIT_FROM-MB(A2),D6
		MOVE.W	INT_BLIT_TO-MB(A2),D7
		LEA	$DFF000,A1
		Dlea	BLIT_DEFS,A2
NEXT_INT_BLIT	ADD.W	D6,D6
		ADD.W	D6,D6	
		MOVE.L	A2,A0
		MOVE.L	(A0,D6.W),D0
		BEQ.S	BLIT_SKIP_THIS		IF ADRES = 0 EXIT !!
		MOVE.L	D0,A0
		MOVE.W	(A0)+,D5		PLANE COUNT
		SUBQ	#1,D5
		MOVEM.L	(A0)+,D1-4
		MOVE.W	(A0)+,A3		BLITSIZE
		MOVEQ	#0,D0
BLIT_S_LOOP_I	BTST	D0,24(A4)
		BEQ.S	SKIP_S_BLIT
BLIT_S_LOOP_I1	BTST	#14,2(A1)
		BTST	#14,2(A1)
		BNE.S	BLIT_S_LOOP_I1
		ADDQ	#1,D0
		MOVE.L	D1,$44(A1)		BLTAFLWM
		MOVEM.L	D2-3,$60(A1)		BLTCBMOD + BLTADMOD
		MOVE.L	D4,$40(A1)		BLTCON01
		MOVE.L	(A0)+,$50(A1)		SOURCE ADRES
		MOVE.L	(A0)+,$54(A1)		DEST ADRES
		MOVE.W	A3,$58(A1)
		DBRA	D5,BLIT_S_LOOP_I
BLIT_SKIP_THIS	ASR.W	#2,D6
		ADDQ	#1,D6
		CMP.W	D7,D6
		BLE.S	NEXT_INT_BLIT
		MOVEM.L	(SP)+,D2-D7/A2-A4
		MOVEQ	#0,D0
		RTS
SKIP_S_BLIT	ADDQ.L	#8,A0
		ADDQ	#1,D0
		DBRA	D5,BLIT_S_LOOP_I
		ASR.W	#2,D6
		ADDQ	#1,D6
		CMP.W	D7,D6
		BLE.S	NEXT_INT_BLIT
		MOVEM.L	(SP)+,D2-D7/A2-A4
		MOVEQ	#0,D0
		RTS

L_BLIT_INT_OFF	EQU	69
L69		Dload	A2
		TST.W	INT_BLIT_ON-MB(A2)
		BEQ.S	NO_BLIT_INT
		CLR.W	INT_BLIT_ON-MB(A2)
		MOVEM.L	A4-A6,-(SP)
		CALLEXEC Disable
		Dload	A2
		MOVE.L	INT_BLIT_SERVER-MB(A2),A1
		MOVE.L	#INTB_VERTB,D0
		CALLEXEC RemIntServer
		CALLEXEC Enable
		MOVEM.L	(SP),A4-6
		Dload	A2
		MOVE.L	INT_BLIT_SERVER-MB(A2),A1
		MOVE.L	#IS_SIZE,D0
		CALLEXEC FreeMem
		MOVEM.L	(SP)+,A4-A6
NO_BLIT_INT	RTS

L_FAST_DRAW	EQU	70
L70		MOVE.L	(A3)+,D3	Y2
		MOVE.L	(A3)+,D2	X2
		MOVE.L	(A3)+,D1	Y1
		MOVE.L	(A3)+,D0	X1
		MOVE.L	T_RASTPORT(A5),A1
                RBSR	L_DRAW_THE_LINE
		RTS


*********************************
L_INTER_Y	EQU	71
L71
inter_y		move.w	d0,d4		*\
		add.w	d2,d4		* >middle of X
		asr.w	#1,d4		*/
		move.w	d1,d5		*\
		add.w	d3,d5		* >middle of Y
		asr.w	#1,d5		*/
		cmp.w	d6,d5
		bne.s	inter_y_not_found
		rts
inter_y_not_found:
		cmp.w	d6,d5		*\
		blt.s	middle_inf_y	* \ if middle_y(d5) is greater
		move.w	d4,d2		*  > than d6
		move.w	d5,d3		* /  then modify coord and loop
		bra.s	inter_y		*/
middle_inf_y:			*\
		move.w	d4,d0		* \if middle_y(d5) is less
		move.w	d5,d1		* / than d6
		bra.s	inter_y		*/ then modify coord and loop

***********************************
L_INTER_X	EQU	72
L72
inter_x 	move.w	d0,d4		*\
		add.w	d2,d4		* > middle of X
		asr.w	#1,d4		*/
		move.w	d1,d5		*\
		add.w	d3,d5		* > middle of Y
		asr.w	#1,d5		*/
		cmp.w	d6,d4
		bne.s	inter_x_not_found
		rts

inter_x_not_found:
		cmp.w	d6,d4		*\
		blt.s	middle_inf_x	* \ if middle_x(d4) is greater
		move.w	d4,d2		*  > than d6
		move.w	d5,d3		* /  then modify coord and loop
		bra.s	inter_x		*/
middle_inf_x:			*\
		move.w	d4,d0		* \if middle_x(d4) is less
		move.w	d5,d1		* / than d6
		bra.s	inter_x		*/ then modify coord and loop

***********************************

L_SET_OBJECT_LIMIT	EQU	73
L73		DLOAD	A2
		MOVE.L	(A3)+,D0
		RBMI	L_IFONC
		CMP.L	#32000,D0
		BGT.S	LIMIT_TOO_HIGH
		TST.L	D0
		BEQ.S	CLEAR_OBJECT_LIMIT
		TST.W	OBJECT_LIMIT-MB(A2)
		BNE.S	LIMIT_IS_SET
		MOVE.L	A2,-(SP)
		MOVE.L	D0,D7
		LSL.L	#2,D0
		MOVE.L	A6,A2
		MOVE.L	$4.W,A6
		MOVE.L	#MEMF_CHIP+MEMF_CLEAR,D1
		JSR	ALLOCMEM(A6)
		BEQ.S	NO_MEM
		MOVE.L	D0,D6		STORE OBJECT BASE ADR
		MOVE.L	D7,D0		
		ADD.L	D0,D0
		MOVE.L	#MEMF_CHIP+MEMF_CLEAR,D1
		JSR	ALLOCMEM(A6)
		BEQ.S	NO_MEM
		MOVE.L	A2,A6
		MOVE.L	(SP)+,A2
		MOVE.W	D7,OBJECT_LIMIT-MB(A2)
		MOVE.L	D6,OBJECT_ADRES_BASE-MB(A2)
		MOVE.L	D0,OBJECT_POINT_BASE-MB(A2)
		RTS
LIMIT_IS_SET	MOVEQ	#14,D0
		RBRA	L_CUSTOM
LIMIT_TOO_HIGH	MOVEQ	#16,D0
		RBRA	L_CUSTOM
NO_MEM		MOVE.L	A2,A6
		MOVE.L	(SP)+,A2
		RBRA	OUT_OF_MEM
CLEAR_OBJECT_LIMIT
		MOVE.W	OBJECT_LIMIT-MB(A2),D0
		BEQ.S	ALLREADY_CLEARED
		MOVE.W	D0,D7
		SUBQ	#1,D7
		MOVE.L	OBJECT_ADRES_BASE-MB(A2),A1
		MOVE.L	A1,A0
BASE_TEST	TST.L	(A0)+
		BNE.S	OBJECT_STILL_DEFINED
		DBRA	D7,BASE_TEST
		EXT.L	D0
		ADD.L	D0,D0
		MOVE.L	D0,D7
		ADD.L	D0,D0
		MOVE.L	A6,A2
		MOVE.L	$4.W,A6
		JSR	FREEMEM(A6)
		MOVE.L	A2,A6
		DLOAD	A2
		CLR.W	OBJECT_LIMIT-MB(A2)
		MOVE.L	OBJECT_POINT_BASE-MB(A2),A1
		MOVE.L	D7,D0
		MOVE.L	A6,A2
		MOVE.L	$4.W,A6
		JSR	FREEMEM(A6)
		MOVE.L	A2,A6
		RTS
ALLREADY_CLEARED
		MOVEQ	#15,D0
		RBRA	L_CUSTOM
OBJECT_STILL_DEFINED
		MOVEQ	#17,D0
		RBRA	L_CUSTOM


L_FAST_DRAW_TO	EQU	74
L74		MOVE.L	T_RASTPORT(A5),A1
		MOVEM.W	36(A1),D0-1
		MOVE.L	(A3)+,D3	Y2
		MOVE.L	(A3)+,D2	X2
		RBSR	L_DRAW_THE_LINE
		RTS
			
L_DRAW_THE_LINE	EQU	75
L75		MOVEM.L	A3-6,-(SP)
		MOVEM.W	D2-3,36(A1)
		MOVEQ	#0,D7
		MOVE.B	25(A1),D7	COLOUR FROM Rp STRUCT
		LEA	$DFF000,A1
		MOVE.L	ScOnAd(A5),A0	POINTER NAAR BITPLANES ENZ...
		Dload	A2
		MOVEM.W	EcClipX0(A0),A3-A6	XMIN=3,YMIN=4,XMAX=5,YMAX=6
		SUBQ	#1,A5
		SUBQ	#1,A6
clip_line:
		cmp.w	d2,d0		*\
		ble.s	x1_less_x2	* \
		exg	d0,d2		*  >after that d0 <= d2
		exg	d1,d3		* /
x1_less_x2:			*/
		movem.w	d0-d3,X1-MB(A2)	* save coor in buffer
		CMP.W	A5,D2
;		cmp.w	#x_max,d2	*\
		ble.s	no_inter_x_max	* > all line is at left of x_max
		CMP.W	A5,D0
;		cmp.w	#x_max,d0	*\
		bgt	line_unvisible	* > all line is at right of x_max
		MOVE.W	A5,D6
;		move.w	#x_max,d6	*\
		Rbsr	L_INTER_X		* \compute intersectoin with x_max
		movem.w	d4-d5,X2-MB(A2)	* / adn modify the coor
		movem.w	X1-MB(A2),d0-d3	*/
no_inter_x_max:
		CMP.W	A3,D0
;		cmp.w	#x_min,d0	*\
		bge.s	no_inter_x_min	* > all line is at right of x_min
		CMP.W	A3,D2
;		cmp.w	#x_min,d2	*\
		ble	line_unvisible	* > all line is at left of x_min
		MOVE.W	A3,D6
;		move.w	#x_min,d6	*\
		Rbsr	L_INTER_X		* \ compute intersection with x_min
		movem.w	d4-d5,X1-MB(A2)	* / adn modify the coor
		movem.w	X1-MB(A2),d0-d3	*/
no_inter_x_min:		
		cmp.w	d3,d1		*\
		ble.s	y1_less_y2	* \
		exg	d0,d2		*  >after that d1 <= d3
		exg	d1,d3		* /
y1_less_y2:			*/
		movem.w	d0-d3,X1-MB(A2)	* save coor in buffer
		CMP.W	A6,D3
;		cmp.w	#y_max,d3	*\
		ble.s	no_inter_y_max	* > all line is at left of y_max
		CMP.W	A6,D1
;		cmp.w	#y_max,d1	*\
		bgt	line_unvisible	* > all line is at right of y_max
		MOVE.W	A6,D6
;		move.w	#y_max,d6	*\
		Rbsr	L_INTER_Y		* \compute intersectoin with y_max
		movem.w	d4-d5,X2-MB(A2)	* / adn modify the coor
		movem.w	X1-MB(A2),d0-d3	*/
no_inter_y_max:
		CMP.W	A4,D1
;		cmp.w	#y_min,d1	*\
		bge.s	no_inter_y_min	* > all line is at right of y_min
		CMP.W	A4,D3
;		cmp.w	#y_min,d3	*\
		ble	line_unvisible	* > all line is at left of y_min
		MOVE.W	A4,D6
;		move.w	#y_min,d6	*\
		Rbsr	L_INTER_Y		* \ compute intersection with y_min
		movem.w	d4-d5,X1-MB(A2)	* / adn modify the coor
		movem.w	X1-MB(A2),d0-d3	*/
no_inter_y_min:
		SUB.W	D0,D2
		BMI.S	XNEG
		SUB.W	D1,D3
		BMI.S	YNEG
		CMP.W	D3,D2
		BMI.S	YGTX
		MOVEQ.L	#OCTANT1+LINEMODE,D5
		BRA.S	LINEAGAIN
YGTX		EXG	D2,D3
		MOVEQ.L	#OCTANT2+LINEMODE,D5
		BRA.S	LINEAGAIN
YNEG		NEG.W	D3
		CMP.W	D3,D2
		BMI.S	YNYGTX
		MOVEQ.L	#OCTANT8+LINEMODE,D5
		BRA.S	LINEAGAIN
YNYGTX		EXG	D2,D3
		MOVEQ.L	#OCTANT7+LINEMODE,D5
		BRA.S	LINEAGAIN
XNEG		NEG.W	D2
		SUB.W	D1,D3
		BMI.S	XYNEG
		CMP.W	D3,D2
		BMI.S	XNYGTX
		MOVEQ.L	#OCTANT4+LINEMODE,D5
		BRA.S	LINEAGAIN
XNYGTX		EXG	D2,D3
		MOVEQ.L	#OCTANT3+LINEMODE,D5
		BRA.S	LINEAGAIN
XYNEG		NEG.W	D3
		CMP.W	D3,D2
		BMI.S	XYNYGTX
		MOVEQ.L	#OCTANT5+LINEMODE,D5
		BRA.S	LINEAGAIN
XYNYGTX		EXG	D2,D3
		MOVEQ.L	#OCTANT6+LINEMODE,D5
LINEAGAIN	MOVE.W	EcTLigne(A0),D4	BREEDTE IN BYTES
		MULU	D4,D1
		MOVE.L	D1,A3
		ROR.L	#4,D0
		ADD.W	D0,D0
		ADD.W	D0,A3		A3=OFFSET
		SWAP	D0
		ADD.W	D3,D3
		ADD.W	D3,D3
		MOVE.W	D3,A4		A4=BLTBMOD IN LOW-WORD VAN A4
		ADD.W	D2,D2
		MOVE.W	D2,D1
		LSL.W	#5,D1
		ADD.W	#$42,D1
		MOVE.W	D1,A6		BLTSIZE
		MOVE.L	D0,D1
		SUB.W	D2,D3
		MOVE.W	D3,A5
		BPL.S	LINEOVER
		OR.W	#SIGNFLAG,D5
LINEOVER	SUB.W	D2,A5		BLTBMOD+BLTAMOD 		
		MOVE.W	EcNplan(A0),D2	NUMBER OF PLANES 
		SUBQ	#1,D2		-1 VOOR DBRA !		
		BNE	MULTI_PLANE_DRAW
ONE_PLANE_DRAW
WAIT_BLITTER1	BTST	#14,2(A1)
		BNE.S	WAIT_BLITTER1
		MOVE.W	D4,BLTDMOD(A1)
		MOVEM.W	D4/A4/A5,BLTCMOD(A1)	C/B/A MOD	
		MOVEQ	#-1,D0
		MOVE.L	D0,BLTAFWM(A1)
		MOVE.W	#$8000,BLTADAT(A1)
		MOVE.L	(A0),A2
		SUBQ	#1,D7
		BNE.S	LINE_CLEAR1
		OR.W	#$BFA,D1
		MOVEM.W	D1/D5,BLTCON0(A1) 
		ADD.L	A3,A2		ADRES BITPLANE + OFFSET
		LEA	$52(A1),A3	EFFECTIEF ADRES BLTAPTL
		MOVE.L	A2,BLTCPTH(A1)
		MOVE.W	D3,(A3)+	BLTAPTL
		MOVE.L	A2,(A3)+	BLTDPTH+BLTDPTL
		MOVE.W	A6,(A3)		BLTSIZE
		MOVEM.L	(SP)+,A3-6
		RTS
LINE_CLEAR1	OR.W	#$B0A,D1
		MOVEM.W	D1/D5,BLTCON0(A1) 
		ADD.L	A3,A2		ADRES BITPLANE + OFFSET
		LEA	$52(A1),A3
		MOVE.L	A2,BLTCPTH(A1)	EFFECTIEF ADRES BLTAPTL
		MOVE.W	D3,(A3)+	BLTAPTL
		MOVE.L	A2,(A3)+	BLTDPTH+BLTDPTL
		MOVE.W	A6,(A3)		BLTSIZE
LINE_UNVISIBLE	MOVEM.L	(SP)+,A3-6
		RTS

MULTI_PLANE_DRAW
		MOVEQ	#0,D6
WAIT_BLITTER	BTST	#14,2(A1)
		BNE.S	WAIT_BLITTER
		MOVE.W	D4,BLTDMOD(A1)
		MOVEM.W	D4/A4/A5,BLTCMOD(A1)	C/B/A MOD
		MOVEQ.L	#-1,D0
		MOVE.L	D0,BLTAFWM(A1)
		MOVE.W	#$8000,BLTADAT(A1)
		MOVE.L	D1,D4
		MOVE.L	D1,D0
		OR.W	#$BFA,D0
		OR.W	#$B0A,D4
		MOVE.W	#$8400,$96(A1)
NEXT_PLANE	MOVE.L	(A0)+,A2
WAIT_BLITTER2	BTST	#14,2(A1)
		BNE.S	WAIT_BLITTER2
		BTST	D6,D7
		BEQ.S	LINE_CLEAR
		MOVEM.W	D0/D5,BLTCON0(A1) 
		ADD.L	A3,A2		ADRES BITPLANE + OFFSET
		LEA	$52(A1),A4	EFFECTIEF ADRES BLTAPTL
		MOVE.L	A2,BLTCPTH(A1)	
		MOVE.W	D3,(A4)+	BLTAPTL
		MOVE.L	A2,(A4)+	BLTDPTH+BLTDPTL
		MOVE.W	A6,(A4)		BLTSIZE
		ADDQ	#1,D6
		DBRA	D2,NEXT_PLANE
		MOVE.W	#$0400,$96(A1)
		MOVEM.L	(SP)+,A3-6
		RTS
LINE_CLEAR	MOVEM.W	D4/D5,BLTCON0(A1) 
		ADD.L	A3,A2		ADRES BITPLANE + OFFSET
		LEA	$52(A1),A4	EFFECTIEF ADRES BLTAPTL
		MOVE.L	A2,BLTCPTH(A1)	
		MOVE.W	D3,(A4)+	BLTAPTL
		MOVE.L	A2,(A4)+	BLTDPTH+BLTDPTL
		MOVE.W	A6,(A4)		BLTSIZE
		ADDQ	#1,D6
		DBRA	D2,NEXT_PLANE
		MOVE.W	#$0400,$96(A1)
		MOVEM.L	(SP)+,A3-6
		RTS

L_SET_PLANES	EQU	76
L76		MOVE.L	T_RASTPORT(A5),A0
		MOVE.L	(A3)+,D0
		AND.L	#$FF,D0
		MOVE.B	D0,24(A0)
		RTS

L_PLANE_OFFSET	EQU	77
L77		MOVEM.L	(A3)+,D4-7	D4=Y D5=X D6=PLANE D7=SCREEN
		MOVE.L	D7,D1
		RJSR	L_GETEC
		TST.W	D6
		RBEQ	L_IFONC
		BMI.S	CLEAR_PLANE_OFFSETS
		MOVE.W	ECNPLAN(A0),D0
		CMP.W	D6,D0
		RBLT	L_IFONC
		SUBQ	#1,D6
		LSL.W	#2,D6
		MULU	#24,D7
		ADD.W	D7,D6
		MULS	ECTLIGNE(A0),D4
		ADD.L	D5,D4
		BEQ.S	CLEAR_SINGLE_OFFSET
		DLEA	PLANE_OFFSETS,A2
		ADD.L	D4,(A2,D6.W)
		RTS
CLEAR_SINGLE_OFFSET
		DLEA	PLANE_OFFSETS,A2
		MOVE.L	D4,(A2,D6.W)
		RTS
CLEAR_PLANE_OFFSETS
		DLEA	PLANE_OFFSETS,A1
		MULU	#24,D7
		ADD.L	D7,A1
		MOVEQ	#5,D0		6 OFFSETS TO CLEAR
CLEAR_OFFSET_L	CLR.L	(A1)+
		DBRA	D0,CLEAR_OFFSET_L
		RTS

L_PLANE_SWAP	EQU	78
L78		MOVE.L	(A3)+,D6	TO PARAM
		RBLE	L_IFONC
		MOVE.L	(A3)+,D7	FROM PARAM
		RBLE	L_IFONC
		MOVE.L	(A3)+,D1	screen nr
		MOVE.W	D1,D4		SAVE SCREEN NR
		RJSR	L_GETEC
		MOVE.W	EcNplan(A0),D5
		CMP.W	#1,D5
		RBEQ	L_IFONC		ONLY 1 PLANE ? NO SWAP POSSIBLE
		CMP.W	D6,D5		
		RBLT	L_IFONC		PLANE CNT < PLANE TO SWAP ? ERROR !
		CMP.W	D7,D5
		RBLT	L_IFONC		PLANE CNT < PLANE TO SWAP ? ERROR !
		SUBQ	#1,D6
		SUBQ	#1,D7
		LSL.W	#2,D6
		LSL.W	#2,D7
		MULU	#24,D4
		ADD.W	D4,D6	|
		ADD.W	D4,D7	/
		LEA	ECLOGIC(A0),A1
		MOVE.L	(A1,D6.W),D0
		MOVE.L	(A1,D7.W),D1
		EXG	D0,D1		swap logic bitplanes
		MOVE.L	D0,(A1,D6.W)
		MOVE.L	D1,(A1,D7.W)
		LEA	ECPHYSIC(A0),A1
		MOVE.L	(A1,D6.W),D0
		MOVE.L	(A1,D7.W),D1
		EXG	D0,D1		swap physic bitplanes
		MOVE.L	D0,(A1,D6.W)
		MOVE.L	D1,(A1,D7.W)
		LEA	ECCURRENT(A0),A1
		MOVE.L	(A1,D6.W),D0
		MOVE.L	(A1,D7.W),D1
		EXG	D0,D1		swap current bitplanes
		MOVE.L	D0,(A1,D6.W)
		MOVE.L	D1,(A1,D7.W)
		RTS

L_PLANE_SH_UP	EQU	79
L79		MOVE.L	(A3)+,D7	TO PARAM
		RBLE	L_IFONC
		MOVE.L	(A3)+,D6	FROM PARAM
		RBLE	L_IFONC
		CMP.W	D6,D7
		RBLE	L_IFONC
		MOVE.L	(A3)+,D1	screen nr
		MOVE.W	D1,D4
		RJSR	L_GETEC
		MOVE.W	ECNPLAN(A0),D0
		CMP.W	D7,D0
		RBLT	L_IFONC
		SUBQ	#1,D6
		SUBQ	#1,D7
		MOVE.W	D7,D5
		SUB.W	D6,D5
		SUBQ	#1,D5		D5=COUNT
		LSL.W	#2,D7
		MOVE.W	D7,D6
		SUBQ	#4,D6
		MULU	#24,D4	|
		ADD.W	D4,D6	|
		ADD.W	D4,D7	/
		LEA	ECLOGIC(A0),A2
		LEA	ECPHYSIC(A0),A1
		LEA	ECCURRENT(A0),A0
		MOVE.L	(A2,D7.W),D2
		MOVE.L	(A1,D7.W),D1
		MOVE.L	(A0,D7.W),D0
SHIFT_UP	MOVE.L	(A2,D6.W),(A2,D7.W)
		MOVE.L	(A1,D6.W),(A1,D7.W)
		MOVE.L	(A0,D6.W),(A0,D7.W)
		SUBQ	#4,D6
		SUBQ	#4,D7
		DBRA	D5,SHIFT_UP
		MOVE.L	D2,(A2,D7.W)
		MOVE.L	D1,(A1,D7.W)
		MOVE.L	D0,(A0,D7.W)
		RTS

L_PLANE_SH_DOWN	EQU	80
L80		MOVE.L	(A3)+,D7	TO PARAM
		RBLE	L_IFONC
		MOVE.L	(A3)+,D6	FROM PARAM
		RBLE	L_IFONC
		CMP.W	D6,D7
		RBLE	L_IFONC
		MOVE.L	(A3)+,D1	screen nr
		MOVE.W	D1,D4
		RJSR	L_GETEC
		MOVE.W	ECNPLAN(A0),D0
		CMP.W	D7,D0
		RBLT	L_IFONC
		SUBQ	#1,D6
		SUBQ	#1,D7
		MOVE.W	D7,D5
		SUB.W	D6,D5
		SUBQ	#1,D5		D5=COUNT
		LSL.W	#2,D6
		MOVE.W	D6,D7
		ADDQ	#4,D7
		MULU	#24,D4	|
		ADD.W	D4,D6	|
		ADD.W	D4,D7	/
		LEA	ECLOGIC(A0),A2
		LEA	ECPHYSIC(A0),A1
		LEA	ECCURRENT(A0),A0
		MOVE.L	(A2,D6.W),D2
		MOVE.L	(A1,D6.W),D1
		MOVE.L	(A0,D6.W),D0
SHIFT_DOWN	MOVE.L	(A2,D7.W),(A2,D6.W)
		MOVE.L	(A1,D7.W),(A1,D6.W)
		MOVE.L	(A0,D7.W),(A0,D6.W)
		ADDQ	#4,D6
		ADDQ	#4,D7
		DBRA	D5,SHIFT_DOWN
		MOVE.L	D2,(A2,D6.W)
		MOVE.L	D1,(A1,D6.W)
		MOVE.L	D0,(A0,D6.W)
		RTS

L_PLANE_UPDATE	EQU	81		
L81		MOVE.L	(A3)+,D1	screen nr
		MOVE.W	D1,D4
		RJSR	L_GETEC
		MOVEM.L	A3/A6,-(SP)
		MOVE.L	A0,A2
		MOVE.L	A2,-(SP)
		MOVE.L	$4.W,A6
		MOVEQ	#72,D7		4*6*3 BYTES
		LEA	ECLOGIC(A2),A0
		DLEA	ECLOGIC_SAVE,A1
		MOVE.L	D7,D0
		JSR	-630(A6)
		MOVE.W	ECNPLAN(A2),D0
		LEA	ECLOGIC(A2),A0
		LEA	ECPHYSIC(A2),A1
		LEA	ECCURRENT(A2),A2
		DLEA	PLANE_OFFSETS,A3
		MULU	#24,D4	
		ADD.W	D4,A3	
ADD_OFFSETS	MOVE.L	(A3)+,D1
		ADD.L	D1,(A0)+
		ADD.L	D1,(A1)+
		ADD.L	D1,(A2)+
		DBRA	D0,ADD_OFFSETS
		MOVE.L	(SP)+,A2
		MOVEM.L	(SP),A3/A6
		ECCALL	COPFORCE
		MOVE.L	$4.W,A6
		DLEA	ECLOGIC_SAVE,A0
		LEA	ECLOGIC(A2),A1
		MOVE.L	D7,D0
		JSR	-630(A6)
		MOVEM.L	(SP)+,A3/A6
		RTS

F_PASTE_ICON	EQU	82
L82		MOVE.L	(A3)+,D1
		RBLE	L_IFONC
		MOVE.L	ABANKS(A5),A0
		MOVE.L	8(A0),D0
		BEQ	IC_BANK_NOT_RES
		MOVE.L	D0,A2
		ADDQ.L	#8,A2
		CMP.W	(A2),D1
		BHI	ICON_NOT_DEF
		LSL.W	#3,D1
		LEA	-6(A2,D1.W),A2	PTR TO ICON DEFINITION	
		MOVE.L	(A2),D0		GET ICON ADDRESS
		BEQ	ICON_NOT_DEF
		MOVE.L	D0,A2
		MOVE.L	(A3)+,D1	D1=Y 
		BLT	ICON_OF_SCREEN1
		MOVE.L	(A3)+,D2	D2=X
		BLT	ICON_OF_SCREEN
		AND.W	#$FFF0,D2	X 16 BIT BOUNDARY
		MOVE.L	SCONAD(A5),A0	ADRES ACTUAL SCREEN
		MOVEM.W	ECTX(A0),D5-7	D5=ECTX D6=ECTY D7=ECNPLAN
;		MOVEQ.L	#0,D4		TEST PARAM FOR COORDS OF ICON
;		CMP.W	D4,D1		Y<0 ?
;		BLT	ICON_OF_SCREEN
;		CMP.W	D4,D2		X<0 ?
;		BLT	ICON_OF_SCREEN
		CMP.W	D6,D1		Y>=ECTY ?
		BGE	ICON_OF_SCREEN
		CMP.W	D5,D2		X>=ECTX ?
		BGE	ICON_OF_SCREEN
		MOVE.W	ECTLIGNE(A0),D0	BYTES IN LINE
		MOVE.W	D0,D5
		MOVE.W	D0,D4
		MULU	D1,D0		Y * BYTES IN LINE
		LSR.W	#3,D2		X / 8
		ADD.L	D2,D0		D0 = OFFSET START (Y*BYTES+X/8)
		MOVE.W	(A2)+,D3	SIZE ICON IN X (WORDS)
		ADD.W	D3,D3		SIZE ICON IN X (BYTES)
		SUB.W	D3,D5		D5 = BLTDMOD (BYTES LINE-BYTES ICON)
		SUB.W	D1,D6		ECTY - Y = YOVER
;		MOVEQ	#0,D1		INIT BLTAMOD
		SUB.W	D2,D4		X OVER (BYTES LINE-X POS ICON)
		MOVE.W	D3,D2		STORE SIZE ICON IN X (BYTES)
		MOVE.W	D3,-(SP)	STORE IT ONE MORE...
		SUB.W	D4,D3		SIZE ICON X <= X OVER ?
		BLE.S	NO_MOD_ICON
		ADD.W	D3,D5		ADJUST DMOD
		SWAP	D3		BLTAMOD IN HIGH WORD (SIZE X-X OVER)
		OR.L	D3,D5
		MOVE.W	D4,(SP)		STORE NEW SIZE ICON X FOR BLTSIZE
NO_MOD_ICON	MOVE.W	(A2)+,D4	D4 = SIZE ICON IN LINES
		MULU	D4,D2	OFFSET	D2 = SIZE ICON X * SIZE LINES (BYTES)
		CMP.W	D6,D4
		BLT.S	NO_CLIP_ICON
		MOVE.W	D6,D4
NO_CLIP_ICON
		LSL.W	#6,D4		D4 = ICON LINES * 64
		MOVE.W	(SP)+,D3
		LSR.W	#1,D3		D3 = SIZE ICON IN X (WORDS)
		ADD.W	D3,D4		D4 = BLTSIZE LINES*64+X (X=WORDS)
		MOVE.W	(A2)+,D3	D3 = NUMBER OF PLANES IN ICON
		CMP.W	D3,D7		NUMBER OF PLANES IN SCREEN <
		BLT.S	PUT_SCR_PLAN	NUMBER OF PLANES IN ICON ?
		MOVE.W	D3,D7		NUMBER OF PLANES ICON FOR LOOP
PUT_SCR_PLAN	SUBQ	#1,D7		-1 FOR DBRA
		LEA	4(A2),A2	SOURCE ADDRESS		
		LEA	$DFF002,A1	BASE CUSTOM+2
		MOVE.L	#$9F00000,D1	INIT BLTCON0/1
ICON_LOOP	MOVE.L	(A0)+,D6		ADRES PLANES 1 --> 6
		ADD.L	D0,D6			ADD OFFSET TO PLANE
WAIT_LOOP	BTST	#14,(A1)
		BNE.S	WAIT_LOOP
		MOVEQ.L	#-1,D3
		MOVEM.L	D1/D3,-2+$40(A1)	BLTCON0/1 + BLTAFLWM
		MOVEQ.L	#0,D3
		MOVEM.L	D3/D5,-2+$60(A1)	BLTCBMOD AND BLTADMOD
		MOVE.L	A2,-2+$50(A1)		SOURCE ADRES (ICON)
		MOVE.L	D6,-2+$54(A1)		DEST ADRES (PLANE)
		MOVE.W	D4,-2+$58(A1)		BLTSIZE
		ADD.L	D2,A2
		DBRA	D7,ICON_LOOP
ICON_OF_SCREEN	RTS
ICON_OF_SCREEN1	ADDQ.L	#4,A3
		RTS
IC_BANK_NOT_RES	MOVEQ	#$24,D0
		RJMP	L_ERROR
ICON_NOT_DEF	MOVEQ	#$4A,D0
		RJMP	L_ERROR

F_32BIT_ICON	EQU	83
L83		MOVE.L	(A3)+,D1
		RBLE	L_IFONC
		MOVE.L	ABANKS(A5),A0
		MOVE.L	8(A0),A2
;		MOVE.L	8(A0),D0
;		BEQ	IC_32_NOT_RES
;		MOVE.L	D0,A2
		ADDQ.L	#8,A2
;		CMP.W	(A2),D1
;		BHI	IC_32_NOT_DEF
		LSL.W	#3,D1
		LEA	-6(A2,D1.W),A2	PTR TO ICON DEFINITION	
		MOVE.L	(A2),A2
;		MOVE.L	(A2),D0		GET ICON ADDRESS
;		BEQ	IC_32_NOT_DEF
;		MOVE.L	D0,A2
		MOVE.L	(A3)+,D1	D1=Y
		BLT.S	IC_32_OF_SCREEN1 
		MOVE.L	(A3)+,D2	D2=X
		BLT.S	IC_32_OF_SCREEN
		AND.W	#$FFE0,D2	X 32 BIT BOUNDARY
		AND.W	#$FFE0,D1	Y 32 BIT BOUNDARY
		MOVE.L	SCONAD(A5),A0	ADRES ACTUAL SCREEN
		MOVEM.W	ECTX(A0),D5-7	D5=ECTX D6=ECTY D7=ECNPLAN
		MOVEQ.L	#0,D4		TEST PARAM FOR COORDS OF ICON
;		CMP.W	D4,D1		Y<0 ?
;		BLT.S	IC_32_OF_SCREEN
;		CMP.W	D4,D2		X<0 ?
;		BLT.S	IC_32_OF_SCREEN
		CMP.W	D6,D1		Y>=ECTY ?
		BGE.S	IC_32_OF_SCREEN
		CMP.W	D5,D2		X>=ECTX ?
		BGE.S	IC_32_OF_SCREEN
		MOVE.W	ECTLIGNE(A0),D0	BYTES IN LINE
		MOVE.W	D0,D5
		MULU	D1,D0		Y * BYTES IN LINE
		LSR.W	#3,D2		X / 8
		ADD.L	D2,D0		D0 = OFFSET START (Y*BYTES+X/8)
		SUBQ.W	#4,D5		D5 = BLTAMOD (BYTES LINE-BYTES ICON)
		MOVE.W	#$802,D1	BLTSIZE
		MOVE.W	4(A2),D3	D3 = NUMBER OF PLANES IN ICON
		CMP.W	D3,D7		NUMBER OF PLANES IN SCREEN <
		BLT.S	PUT_32_PLAN	NUMBER OF PLANES IN ICON ?
		MOVE.W	D3,D7		NUMBER OF PLANES ICON FOR LOOP
PUT_32_PLAN	SUBQ	#1,D7		-1 FOR DBRA
		LEA	10(A2),A2	SOURCE ADDRESS		
		LEA	$DFF002,A1	BASE CUSTOM+2
		MOVEQ.L	#-1,D6		INIT BLTAFLWM
		MOVE.L	#$9F00000,D2
ICON_32_LOOP	MOVE.L	(A0)+,D3		ADRES PLANES 1 --> 6
		ADD.L	D0,D3			ADD OFFSET TO PLANE
WAIT_32_LOOP	BTST	#14,(A1)
		BNE.S	WAIT_32_LOOP
		MOVEM.L	D2/D6,-2+$40(A1)	BLTCON0/1 + BLTAFLWM
		MOVEM.L	D4-5,-2+$60(A1)		BLTCBAMOD AND BLTDMOD
		MOVE.L	A2,-2+$50(A1)		SOURCE ADRES (ICON)
		MOVE.L	D3,-2+$54(A1)		DEST ADRES (PLANE)
		MOVE.W	D1,-2+$58(A1)		BLTSIZE
		LEA	128(A2),A2
		DBRA	D7,ICON_32_LOOP
IC_32_OF_SCREEN	RTS
IC_32_OF_SCREEN1
		ADDQ.L	#4,A3
		RTS
IC_32_NOT_RES	MOVEQ	#$24,D0
		RJMP	L_ERROR
IC_32_NOT_DEF	MOVEQ	#$4A,D0
		RJMP	L_ERROR


F_16BIT_ICON	EQU	84
L84		MOVE.L	(A3)+,D1
		RBLE	L_IFONC
		MOVE.L	ABANKS(A5),A0
		MOVE.L	8(A0),A2
;		MOVE.L	8(A0),D0
;		BEQ	IC_16_NOT_RES
;		MOVE.L	D0,A2
		ADDQ.L	#8,A2
;		CMP.W	(A2),D1
;		BHI	IC_16_NOT_DEF
		LSL.W	#3,D1
		LEA	-6(A2,D1.W),A2	PTR TO ICON DEFINITION	
		MOVE.L	(A2),A2
;		MOVE.L	(A2),D0		GET ICON ADDRESS
;		BEQ	IC_32_NOT_DEF
;		MOVE.L	D0,A2
		MOVE.L	(A3)+,D1	D1=Y 
		BLT.S	IC_16_OF_SCREEN1
		MOVE.L	(A3)+,D2	D2=X
		BLT.S	IC_16_OF_SCREEN
		AND.W	#$FFF0,D2	X 32 BIT BOUNDARY
		AND.W	#$FFF0,D1	Y 32 BIT BOUNDARY
		MOVE.L	SCONAD(A5),A0	ADRES ACTUAL SCREEN
		MOVEM.W	ECTX(A0),D5-7	D5=ECTX D6=ECTY D7=ECNPLAN
		MOVEQ.L	#0,D4		TEST PARAM FOR COORDS OF ICON
;		CMP.W	D4,D1		Y<0 ?
;		BLT.S	IC_16_OF_SCREEN
;		CMP.W	D4,D2		X<0 ?
;		BLT.S	IC_16_OF_SCREEN
		CMP.W	D6,D1		Y>=ECTY ?
		BGE.S	IC_16_OF_SCREEN
		CMP.W	D5,D2		X>=ECTX ?
		BGE.S	IC_16_OF_SCREEN
		MOVE.W	ECTLIGNE(A0),D0	BYTES IN LINE
		MOVE.W	D0,D5
		MULU	D1,D0		Y * BYTES IN LINE
		LSR.W	#3,D2		X / 8
		ADD.L	D2,D0		D0 = OFFSET START (Y*BYTES+X/8)
		SUBQ.W	#2,D5		D5 = BLTAMOD (BYTES LINE-BYTES ICON)
		MOVE.W	#$802/2,D1	BLTSIZE
		MOVE.W	4(A2),D3	D3 = NUMBER OF PLANES IN ICON
		CMP.W	D3,D7		NUMBER OF PLANES IN SCREEN <
		BLT.S	PUT_16_PLAN	NUMBER OF PLANES IN ICON ?
		MOVE.W	D3,D7		NUMBER OF PLANES ICON FOR LOOP
PUT_16_PLAN	SUBQ	#1,D7		-1 FOR DBRA
		LEA	10(A2),A2	SOURCE ADDRESS		
		LEA	$DFF002,A1	BASE CUSTOM+2
		MOVEQ.L	#-1,D6		INIT BLTAFLWM
		MOVE.L	#$9F00000,D2	INIT BLTCON0/1
ICON_16_LOOP	MOVE.L	(A0)+,D3		ADRES PLANES 1 --> 6
		ADD.L	D0,D3			ADD OFFSET TO PLANE
WAIT_16_LOOP	BTST	#14,(A1)
		BNE.S	WAIT_16_LOOP
		MOVEM.L	D2/D6,-2+$40(A1)	BLTCON0/1 + BLTAFLWM
		MOVEM.L	D4-5,-2+$60(A1)		BLTCBAMOD AND BLTDMOD
		MOVE.L	A2,-2+$50(A1)		SOURCE ADRES (ICON)
		MOVE.L	D3,-2+$54(A1)		DEST ADRES (PLANE)
		MOVE.W	D1,-2+$58(A1)		BLTSIZE
		LEA	32(A2),A2		ADD SIZE ICON TO PTR
		DBRA	D7,ICON_16_LOOP
IC_16_OF_SCREEN	RTS
IC_16_OF_SCREEN1
		ADDQ.L	#4,A3
		RTS
IC_16_NOT_RES	MOVEQ	#$24,D0
		RJMP	L_ERROR
IC_16_NOT_DEF	MOVEQ	#$4A,D0
		RJMP	L_ERROR


F_PROC_16ICON	EQU	85
L85		MOVE.L	(A3)+,D1
		RBLE	L_IFONC
		MOVE.L	ABANKS(A5),A0
		MOVE.L	8(A0),A2
;		MOVE.L	8(A0),D0
;		BEQ	IC_16_NOT_RES
;		MOVE.L	D0,A2
		ADDQ.L	#8,A2
;		CMP.W	(A2),D1
;		BHI	IC_16_NOT_DEF
		LSL.W	#3,D1
		LEA	-6(A2,D1.W),A2	PTR TO ICON DEFINITION	
		MOVE.L	(A2),A2
;		MOVE.L	(A2),D0		GET ICON ADDRESS
;		BEQ	IC_32_NOT_DEF
;		MOVE.L	D0,A2
		MOVE.L	(A3)+,D1	D1=Y 
		BLT	IC_PROC_16OF_SCREEN1
		MOVE.L	(A3)+,D2	D2=X
		BLT.S	IC_PROC_16OF_SCREEN
		AND.W	#$FFF0,D2	X 32 BIT BOUNDARY
		AND.W	#$FFF0,D1	Y 32 BIT BOUNDARY
		MOVE.L	SCONAD(A5),A0	ADRES ACTUAL SCREEN
		MOVEM.W	ECTX(A0),D5-7	D5=ECTX D6=ECTY D7=ECNPLAN
;		MOVEQ.L	#0,D4		TEST PARAM FOR COORDS OF ICON
;		CMP.W	D4,D1		Y<0 ?
;		BLT.S	IC_PROC_16OF_SCREEN
;		CMP.W	D4,D2		X<0 ?
;		BLT.S	IC_PROC_16OF_SCREEN
		CMP.W	D6,D1		Y>=ECTY ?
		BGE.S	IC_PROC_16OF_SCREEN
		CMP.W	D5,D2		X>=ECTX ?
		BGE.S	IC_PROC_16OF_SCREEN
		MOVE.W	ECTLIGNE(A0),D0	BYTES IN LINE
		MOVE.W	D0,D5
		MULU	D1,D0		Y * BYTES IN LINE
		LSR.W	#3,D2		X / 8
		ADD.L	D2,D0		D0 = OFFSET START (Y*BYTES+X/8)
		MOVE.W	4(A2),D3
		CMP.W	D3,D7
		BLT.S	PUT_PROC_16PLAN
		MOVE.W	D3,D7
PUT_PROC_16PLAN	SUBQ	#1,D7
		LEA	10(A2),A2
PUT_PROC_16LOOP	MOVE.L	(A0)+,A1
		ADD.L	D0,A1
PUT_DATA_16LOOP	MOVE.W	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.W	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.W	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.W	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.W	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.W	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.W	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.W	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.W	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.W	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.W	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.W	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.W	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.W	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.W	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.W	(A2)+,(A1)
		DBRA	D7,PUT_PROC_16LOOP
IC_PROC_16OF_SCREEN
		RTS
IC_PROC_16OF_SCREEN1
		ADDQ.L	#4,A3
		RTS

F_PROC_32ICON	EQU	86
L86		MOVE.L	(A3)+,D1
		RBLE	L_IFONC
		MOVE.L	ABANKS(A5),A0
		MOVE.L	8(A0),A2
;		MOVE.L	8(A0),D0
;		BEQ	IC_16_NOT_RES
;		MOVE.L	D0,A2
		ADDQ.L	#8,A2
;		CMP.W	(A2),D1
;		BHI	IC_16_NOT_DEF
		LSL.W	#3,D1
		LEA	-6(A2,D1.W),A2	PTR TO ICON DEFINITION	
		MOVE.L	(A2),A2
;		MOVE.L	(A2),D0		GET ICON ADDRESS
;		BEQ	IC_32_NOT_DEF
;		MOVE.L	D0,A2
		MOVE.L	(A3)+,D1	D1=Y
		BLT	IC_PROC_32OF_SCREEN1
		MOVE.L	(A3)+,D2	D2=X
		BLT	IC_PROC_32OF_SCREEN
		AND.W	#$FFF0,D2	X 32 BIT BOUNDARY
		AND.W	#$FFF0,D1	Y 32 BIT BOUNDARY
		MOVE.L	SCONAD(A5),A0	ADRES ACTUAL SCREEN
		MOVEM.W	ECTX(A0),D5-7	D5=ECTX D6=ECTY D7=ECNPLAN
;		MOVEQ.L	#0,D4		TEST PARAM FOR COORDS OF ICON
;		CMP.W	D4,D1		Y<0 ?
;		BLT	IC_PROC_32OF_SCREEN
;		CMP.W	D4,D2		X<0 ?
;		BLT	IC_PROC_32OF_SCREEN
		CMP.W	D6,D1		Y>=ECTY ?
		BGE	IC_PROC_32OF_SCREEN
		CMP.W	D5,D2		X>=ECTX ?
		BGE	IC_PROC_32OF_SCREEN
		MOVE.W	ECTLIGNE(A0),D0	BYTES IN LINE
		MOVE.W	D0,D5
		MULU	D1,D0		Y * BYTES IN LINE
		LSR.W	#3,D2		X / 8
		ADD.L	D2,D0		D0 = OFFSET START (Y*BYTES+X/8)
		MOVE.W	4(A2),D3
		CMP.W	D3,D7
		BLT.S	PUT_PROC_32PLAN
		MOVE.W	D3,D7
PUT_PROC_32PLAN	SUBQ	#1,D7
		LEA	10(A2),A2
PUT_PROC_32LOOP	MOVE.L	(A0)+,A1
		ADD.L	D0,A1
PUT_DATA_32LOOP	MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		ADD.W	D5,A1
		MOVE.L	(A2)+,(A1)
		DBRA	D7,PUT_PROC_32LOOP
IC_PROC_32OF_SCREEN
		RTS
IC_PROC_32OF_SCREEN1
		ADDQ.L	#4,A3
		RTS

L_ICON_X	EQU	87
L87		MOVE.L	(A3)+,D1
		RBLE	L_IFONC
		MOVE.L	ABANKS(A5),A0
		MOVE.L	8(A0),D0
		BEQ.S	IC_X_NOT_RES
		MOVE.L	D0,A2
		ADDQ.L	#8,A2
		CMP.W	(A2),D1
		BHI.S	ICON_X_NOT_DEF
		LSL.W	#3,D1
		LEA	-6(A2,D1.W),A2	PTR TO ICON DEFINITION	
		MOVE.L	(A2),D0		GET ICON ADDRESS
		BEQ.S	ICON_X_NOT_DEF
		MOVE.L	D0,A2
		MOVE.W	(A2),D3
		MOVEQ	#0,D2
		RTS
IC_X_NOT_RES	MOVEQ	#$24,D0
		RJMP	L_ERROR
ICON_X_NOT_DEF	MOVEQ	#$4A,D0
		RJMP	L_ERROR

L_ICON_Y	EQU	88
L88		MOVE.L	(A3)+,D1
		RBLE	L_IFONC
		MOVE.L	ABANKS(A5),A0
		MOVE.L	8(A0),D0
		BEQ.S	IC_Y_NOT_RES
		MOVE.L	D0,A2
		ADDQ.L	#8,A2
		CMP.W	(A2),D1
		BHI.S	ICON_Y_NOT_DEF
		LSL.W	#3,D1
		LEA	-6(A2,D1.W),A2	PTR TO ICON DEFINITION	
		MOVE.L	(A2),D0		GET ICON ADDRESS
		BEQ.S	ICON_Y_NOT_DEF
		MOVE.L	D0,A2
		MOVE.W	2(A2),D3
		MOVEQ	#0,D2
		RTS
IC_Y_NOT_RES	MOVEQ	#$24,D0
		RJMP	L_ERROR
ICON_Y_NOT_DEF	MOVEQ	#$4A,D0
		RJMP	L_ERROR

L_ICON_PLANES	EQU	89
L89		MOVE.L	(A3)+,D1
		RBLE	L_IFONC
		MOVE.L	ABANKS(A5),A0
		MOVE.L	8(A0),D0
		BEQ.S	IC_PLANES_NOT_RES
		MOVE.L	D0,A2
		ADDQ.L	#8,A2
		CMP.W	(A2),D1
		BHI.S	ICON_PLANES_NOT_DEF
		LSL.W	#3,D1
		LEA	-6(A2,D1.W),A2	PTR TO ICON DEFINITION	
		MOVE.L	(A2),D0		GET ICON ADDRESS
		BEQ.S	ICON_PLANES_NOT_DEF
		MOVE.L	D0,A2
		MOVE.W	4(A2),D3
		MOVEQ	#0,D2
		RTS
IC_PLANES_NOT_RES
		MOVEQ	#$24,D0
		RJMP	L_ERROR
ICON_PLANES_NOT_DEF
		MOVEQ	#$4A,D0
		RJMP	L_ERROR


L_CPU_INFO	EQU	90
L90		MOVE.L	A6,A2
		MOVE.L	$4.W,A6		
		MOVE.W	296(A6),D1
		BTST	#3,D1
		BNE.S	CPU040
		BTST	#2,D1
		BNE.S	CPU030
		BTST	#1,D1
		BNE.S	CPU020
		BTST	#0,D1
		BNE.S	CPU010
CPU000		MOVEQ	#0,D3
		BRA.S	CPU_OK
CPU010		MOVEQ	#10,D3
		BRA.S	CPU_OK
CPU020		MOVEQ	#20,D3
		BRA.S	CPU_OK
CPU030		MOVEQ	#30,D3
		BRA.S	CPU_OK
CPU040		MOVEQ	#40,D3
CPU_OK		MOVEQ	#0,D2
		MOVE.L	A2,A6
		RTS

L_MATH_INFO	EQU	91
L91		MOVEQ.L	#0,D3	INIT RESULT
		MOVEQ.L	#0,D2	AS AN INTEGER
		MOVE.L	A6,A2
		MOVE.L	$4.W,A6		
		MOVE.W	296(A6),D1
		BTST	#4,d1
		BNE.S	FOUND_881
		BTST	#5,d1
		BNE.S	FOUND_882
		BRA.S	FPU_FOUND	
FOUND_882	MOVE.L	#882,D3
		BRA.S	FPU_FOUND
FOUND_881	MOVE.L	#881,D3
FPU_FOUND	MOVE.L	A2,A6
		RTS


L92
L93
***********************************************************
* 	Customized error messages
; This list of routines just load in D0 the number of the error message in
; the extension error-list, and call the error handling routine.


*********************************************************************
*	ERROR MESSAGES...

L_Custom	equ	94
L94	lea	ErrMess(pc),a0
	moveq	#0,d1			* Can be trapped
	moveq	#ExtNb,d2		* Number of extension
	moveq	#0,d3			* IMPORTANT!!!
	RJmp	L_ErrorExt		* Jump to routine...
* Messages...
ErrMess	dc.b	"Check allready reserved",0			*0
	dc.b 	"Check not reserved",0				*1
	dc.b 	"Object is allready defined",0			*2
	dc.b	"Object is not defined",0			*3
	dc.b	"Too many draws in object",0			*4
	dc.b	"Too many moves in object",0			*5
	dc.b	"Too many attributes in object",0		*6
	dc.b	"This is not an object file",0			*7
	dc.b	"Stars allready reserved",0			*8
	dc.b	"Stars not reserved",0				*9
	dc.b	"Stars int allready on",0			*10
	dc.b	"Blit store allready defined",0			*11
	dc.b	"Blit store not defined",0			*12
	dc.b	"Blit int allready on",0			*13
	dc.b	"Limit allready set",0				*14
	dc.b	"Limit allready cleared",0			*15
	dc.b	"Limit should be max : 32000",0			*16
	dc.b	"Some objects still defined, Erase them",0	*17
	dc.b	"Object count exceeds object limit",0		*18

* IMPORTANT! Always EVEN!
	even

******* "No errors" routine
; If you compile with -E0, the compiler will replace the previous
; routine by this one. This one just sets D3 to -1, and does not
; load messages in A0. Anyway, values in D1 and D2 must be valid.
;	
; THIS ROUTINE MUST BE THE LAST ONE IN THE LIBRARY!
;

L95	moveq	#0,d1
	moveq	#ExtNb,d2
	moveq	#-1,d3
	RJmp	L_ErrorExt

; Do not forget the last label to delimit the last library routine!
L96

*********************************************************************
; Now the title of the extension. If you come from V1.23 note that
; the cursor is no more located on the screen, instead a CDOWN (31)
; control code is used...

******* TITLE MESSAGE
C_Title	dc.b	31,"TURBO EXTENSION V1.6 ",10
	Even

******* END OF THE EXTENSION
C_End	dc.w	0
	even






