*************************************************************************
*									*
*		   AMOS 1.3 TURBO LIBRARY	v1.11			*
*                   							*
*		     This file is PUBLIC DOMAIN !			*
*									*
*	Idea's and improvements may be sent to :			*
*									*
*	MANUEL ANDRE							*
*	Prins Boudewijnlaan 155/5					*
*	2610	WILRIJK							*
*									*
*	BELGIUM								*
*									*
*	I'm also looking for an AMOS-CLUB in 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	"dh1:include/"
		include "hardware/intbits.i"
		include "hardware/cia.i"
		include "exec/nodes.i"
		include "exec/interrupts.i"
		include "exec/memory.i"
		include "exec/exec_lib.i"
		incdir	"dh0:amos1_3/"
 		Include	"_Equ.s"
		RsSet	DataLong
		Include "_Pointe.s"
		Include "_CEqu.s"
		Include	"_WEqu.s"
		Include	"_LEqu.s"

; 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

; 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 	0	

iii		equ	0

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


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
OBJECTS			DC.L	0	PER BIT GEDEFINIEERD OBJECT MAX 32
OBJECT_ADRESS		DS.L	32	AL DE ADRESSEN VAN DE OBJECTS
OBJECT_POINTS		DS.W	32	HET AANTAL PUNTEN VAN HET OBJECT
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
**********************************************************************
; 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	(A3)+,D2		OBJECT NR
		SUBQ	#1,D2
		Rbmi	L_IFonc			< 0 ? ERROR
		Dload	A0
		MOVE.L	OBJECTS-MB(A0),D6	GET OBJECT DEFINITIONS
		BTST.L	D2,D6			CHECK IF ALLREADY DEFINED
		BNE.S	IS_SET_CH		IS DEFINED ! ERROR !
		MOVE.W	D0,D4
		MULU	#6,D0			MEM TO RESERVE = VECTORS * 6
		MOVE.L	D2,D5
		MOVE.L	#MEMF_CHIP+MEMF_CLEAR,D1
		MOVE.L	A6,A2
		CALLEXEC AllocMem		RESERVE MEMORY (CHIP+CLEARED)
		MOVE.L	A2,A6
		Rbeq	OUT_OF_MEM		OUT OF MEM ? ERROR
		ASL.W	#2,D2
		Dlea	OBJECT_ADRESS,A0	GET ADRESS OF OBJECT ADRESSES
		MOVE.L	D0,0(A0,D2.L)		STORE ADRESS OF RESERVED MEM
		ASR.W	#1,D2
		Dlea	OBJECT_POINTS,A0	GET ADRESS OF OBECT POINTS
		MOVE.W	D4,0(A0,D2.W)		STORE AMOUNT OF VECTORS
		Dload	A0
		MOVE.L	OBJECTS-MB(A0),D3	GET OBJECT DEFINITIONS
		BSET.L	D5,D3			SET OBJECT IS DEFINED
		MOVE.L	D3,OBJECTS-MB(A0)	STORE OBJECT DEFINITIONS
		RTS
IS_SET_CH	MOVEQ	#2,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	(A3)+,D2		OBJECT NR
		SUBQ	#1,D2
		Rbmi	L_IFonc			< 0 ? ERROR
		Dload	A0
		MOVE.L	OBJECTS-MB(A0),D6	GET OBJECT DEFINITIONS
		BTST.L	D2,D6			CHECK IF ALLREADY DEFINED
		BNE.S	IS_SET_FA		IS DEFINED ! ERROR !
		MOVE.W	D0,D4
		MULU	#6,D0			MEM TO RESERVE = VECTORS * 6
		MOVE.L	D2,D5
		MOVE.L	#MEMF_FAST+MEMF_CLEAR,D1
		MOVE.L	A6,A2
		CALLEXEC AllocMem		RESERVE MEMORY (FAST+CLEARED)
		MOVE.L	A2,A6
		Rbeq	OUT_OF_MEM		OUT OF MEM ? ERROR
		ASL.W	#2,D2
		Dlea	OBJECT_ADRESS,A0	GET ADRESS OF OBJECT ADRESSES
		MOVE.L	D0,0(A0,D2.L)		STORE ADRESS OF RESERVED MEM
		ASR.W	#1,D2
		Dlea	OBJECT_POINTS,A0	GET ADRESS OF OBJECT POINTS
		MOVE.W	D4,0(A0,D2.W)		STORE AMOUNT OF VECTORS
		Dload	A0
		MOVE.L	OBJECTS-MB(A0),D3	GET OBJECT DEFINITIONS
		BSET.L	D5,D3			SET OBJECT IS DEFINED
		MOVE.L	D3,OBJECTS-MB(A0)	STORE OBJECT DEFINITIONS
		RTS
IS_SET_FA	MOVEQ	#2,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.W	D3,D5
		ADD.W	D5,D5
		Dlea	OBJECT_POINTS,A0  GET ADRESS OF OBJECT POINTS
		MOVE.W	(A0,D5.W),D5	  GET AMOUNT OF VECTORS
		CMP.W	D5,D2		  TOO MANY VECTORS ?
		BGT.S	TOO_MUCH_DR	  ERROR !
		SUBQ	#1,D2
		Dload	A0
		MOVE.L	OBJECTS-MB(A0),D4 GET OBJECT DEFINITIONS
		BTST.L	D3,D4		  CHECK IF OBJECT IS DEFINED
		BEQ.S	NOT_DEF_DR	  NO ! ERROR
		ASL.W	#2,D3
		Dlea	OBJECT_ADRESS,A1  GET ADRESS OF OBJECT ADRESSES
		MOVE.L	(A1,D3.L),A1	  GET THE OBJECT ADRESS
		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	Y_POS
		MOVE.L	(A3)+,D0	X_POS
		MOVE.L	(A3)+,D2	WELK PUNT
		Rble	L_IFonc
		MOVE.L	(A3)+,D3	WELK OBJECT
		SUBQ	#1,D3
		BMI.S	NOT_DEF_MOV
		MOVE.W	D3,D5
		ADD.W	D5,D5
		Dlea	OBJECT_POINTS,A0
		MOVE.W	(A0,D5.W),D5
		CMP.W	D5,D2
		BGT.S	TOO_MUCH_MOV
		SUBQ	#1,D2
		Dload	A0
		MOVE.L	OBJECTS-MB(A0),D4
		BTST.L	D3,D4
		BEQ.S	NOT_DEF_MOV
		ASL.W	#2,D3
		Dlea	OBJECT_ADRESS,A1
		MOVE.L	(A1,D3.L),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.W	D3,D5
		ADD.W	D5,D5
		Dlea	OBJECT_POINTS,A0
		MOVE.W	(A0,D5.W),D5
		CMP.W	D5,D2
		BGT.S	TOO_MUCH_STOP
		SUBQ	#1,D2
		Dload	A0
		MOVE.L	OBJECTS-MB(A0),D4
		BTST.L	D3,D4
		BEQ.S	NOT_DEF_STOP
		ASL.W	#2,D3
		Dlea	OBJECT_ADRESS,A1
		MOVE.L	(A1,D3.L),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.W	D3,D5
		ADD.W	D5,D5
		Dlea	OBJECT_POINTS,A0
		MOVE.W	(A0,D5.W),D5
		CMP.W	D5,D2
		BGT.S	TOO_MUCH_COL
		SUBQ	#1,D2
		Dload	A0
		MOVE.L	OBJECTS-MB(A0),D4
		BTST.L	D3,D4
		BEQ.S	NOT_DEF_COL
		ASL.W	#2,D3
		Dlea	OBJECT_ADRESS,A1
		MOVE.L	(A1,D3.L),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	OBJECTS-MB(A0),D4
		BTST.L	D3,D4
		BEQ.S	DONT_DRAW
		ADD.W	D3,D3
		MOVE.W	D3,D5
		ADD.W	D3,D3
		Dlea	OBJECT_ADRESS,A0
		MOVE.L	(A0,D3.L),A2
		Dlea	OBJECT_POINTS,A0
		MOVE.W	(A0,D5.W),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.W	(A2)+,D0
		MOVE.W	(A2)+,D1
		JSR	-240(A6)
		DBRA	D5,DRAW_LOOP
STOP		MOVE.L	(sp)+,A6
		RTS
JUST_DRAW	MOVE.W	(A2)+,D0
		MOVE.W	(A2)+,D1
		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	OBJECTS-MB(A0),D4
		BTST.L	D3,D4
		BEQ.S	DONT_R_DRAW
		ADD.W	D3,D3
		MOVE.W	D3,D5
		ADD.W	D3,D3
		Dlea	OBJECT_ADRESS,A0
		MOVE.L	(A0,D3.L),A2
		Dlea	OBJECT_POINTS,A0
		MOVE.W	(A0,D5.W),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
		JSR	-240(A6)
		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	OBJECTS-MB(A0),D4
		BTST.L	D3,D4
		BEQ.S	DONT_MAG_DRAW
		ADD.W	D3,D3
		MOVE.W	D3,D5
		ADD.W	D3,D3
		Dlea	OBJECT_ADRESS,A0
		MOVE.L	(A0,D3.L),A2
		Dlea	OBJECT_POINTS,A0
		MOVE.W	(A0,D5.W),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
		JSR	-240(A6)
		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
		JSR	-240(A6)
		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	OBJECTS-MB(A0),D6
		BTST.L	D5,D6
		BEQ.S	DONT_R_MAG_DRAW
		ADD.W	D5,D5
		MOVE.W	D5,D0
		ADD.W	D5,D5
		Dlea	OBJECT_ADRESS,A0
		MOVE.L	(A0,D5.L),A2
		Dlea	OBJECT_POINTS,A0
		MOVE.W	(A0,D0.W),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
		JSR	-240(A6)
		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
		JSR	-240(A6)
		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
		SUBQ	#1,D0
		Rbmi	L_IFonc
		Dload	A0
		MOVE.L	OBJECTS-MB(A0),D1
		BTST.L	D0,D1
		BEQ.S	NOT_DEFINED
		BCLR.L	D0,D1
		MOVE.L	D1,OBJECTS-MB(A0)
		ASL.W	#2,D0
		Dlea	OBJECT_ADRESS,A1
		MOVE.L	(A1,D0.L),A1
		ASR.W	#1,D0
		Dlea	OBJECT_POINTS,A0
		MOVE.W	(A0,D0.L),D0
		MULU	#6,D0
		MOVE.L	A6,A2
		CALLEXEC FreeMem
		MOVE.L	A2,A6
		RTS
NOT_DEFINED	MOVEQ	#3,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
		MOVE.L	OBJECTS-MB(A0),D6	OBJECT DEFS
		BTST.L	D4,D6			IS DEFINED ?
		BEQ.S	GET_NEXT_OBJECT		IF NOT EXAMINE NEXT OBJECT
		ADD.W	D4,D4
		ADD.W	D4,D4
		Dlea	OBJECT_ADRESS,A0
		MOVE.L	(A0,D4.L),A2	GEEF ADRES VAN VECTORS OM TE SAVEN
		ASR.W	#1,D4
		Dlea	OBJECT_POINTS,A0
		MOVE.W	(A0,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
		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	OBJECTS-MB(A1),D4	OBJECT DEFINITIONS
		BTST.L	D7,D4
		BNE.S	IS_DEFINED	ERROR !
		BSET.L	D7,D4
		MOVE.L	D5,D3
		MULU	#6,D5		AANTAL TE LEZEN + TE RESERVEREN BYTES
		MOVE.W	D5,D0
		MOVE.L	D4,OBJECTS-MB(A1)
		MOVE.L	#MEMF_CHIP+MEMF_CLEAR,D1
		CALLEXEC AllocMem
		BEQ.S	NO_LOAD_MEM
		ASL.W	#1,D7
		Dlea	OBJECT_POINTS,A0
		MOVE.W	D3,0(A0,D7.L)	AANTAL VERTICES
		ASL.W	#1,D7
		Dlea	OBJECT_ADRESS,A0
		MOVE.L	D0,0(A0,D7.L)
		MOVE.L	D0,A3		SAVE ADRES VOOR IN TE SCHRIJVEN
		ASR.W	#2,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.S	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
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
		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)+,D0		BLTSIZE
BLIT_S_LOOP	BTST	#14,2(A1)
		BNE.S	BLIT_S_LOOP
		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	D0,$58(A1)
		DBRA	D5,BLIT_S_LOOP
		ASR.W	#2,D6
		ADDQ.W	#1,D6
		CMP.W	D7,D6
		BLE.S	NEXT_MULTI_BLIT
MULTI_NOT_DEF	RTS
NO_MULTI_BLIT	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
LOOP_A_LEFT	BTST	#14,2(A1)
		BNE.S	LOOP_A_LEFT
		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
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
LOOP_D_LEFT	BTST	#14,2(A1)
		BNE.S	LOOP_D_LEFT
		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

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
ERASE_ALL	BTST	#14,2(A1)
		BNE.S	ERASE_ALL
		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

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	MOVE.W	D1,(A2)			NEW COORD = MIN X
		BRA.S	X_ON_SCREEN
X_OFF_SCREEN1	MOVE.W	A3,(A2)			NEW COORD = MAX 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	MOVE.W	A1,2(A2)		NEW COORD = MIN Y
		BRA.S	Y_ON_SCREEN
Y_OFF_SCREEN1	MOVE.W	A5,2(A2)		NEW COORD = MAX 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/A4/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
		ASL.W	#3,D4			FIRST STAR TO BE
		ADD.L	D4,A2			PROCESSED...
		MOVE.L	ScOnAd(A5),A4		ADRESS OF ACTIVE SCREEN
		MOVE.L	(A4),A0			FIRST BITPLANE ADRESS
		MOVE.W	EcTy(A4),A1		Y
		MOVE.W	A1,A3
		SUBQ	#1,A3			MAX Y VALUE !
		MOVE.W	EcTligne(A4),D1		BYTES FOR EACH LINE
		EXT.L	D1
		ASL.W	#3,D1
		SUBQ.W	#1,D1			MAX X !
		MOVEQ.L	#%111,D2		SHIFT VALUE
		MOVEQ	#0,D0			RESET AND CHECK VALUE
		Dload	A4
STARS1_COMP	MOVEM.W	(A2),D3-6		3=X 4=Y 5=X SPEED 6= Y SPEED
		CMP.W	D0,D5
		BEQ.S	NO_X_COMP
		ADD.W	D3,D5
		CMP.W	D1,D5
		BGT.S	X_OFF_SCREEN_C
		CMP.W	D0,D5
		BLT.S	X_OFF_SCREEN1_C
		MOVE.W	D5,(A2)		
		BRA.S	X_ON_SCREEN_C
X_OFF_SCREEN_C	MOVE.W	D0,(A2)
		BRA.S	X_ON_SCREEN_C
X_OFF_SCREEN1_C	MOVE.W	D1,(A2)
X_ON_SCREEN_C
NO_X_COMP	CMP.W	D0,D6
		BEQ.S	NO_Y_COMP
		ADD.W	D4,D6
		CMP.W	D0,D6
		BLT.S	Y_OFF_SCREEN1_C
		CMP.W	A1,D6
		BGE.S	Y_OFF_SCREEN_C
		MOVE.W	D6,2(A2)
		BRA.S	Y_ON_SCREEN_C
Y_OFF_SCREEN_C	MOVE.W	D0,2(A2)
		BRA.S	Y_ON_SCREEN_C
Y_OFF_SCREEN1_C	MOVE.W	A3,2(A2)
Y_ON_SCREEN_C
NO_Y_COMP	ADDQ.L	#8,A2
		ADDQ	#1,D7
		CMP.W	COMPUTE_TO-MB(A4),D7
		BLE.S	STARS1_COMP
		MOVEM.L	(SP)+,A3/A4/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	MOVE.W	D1,(A2)			NEW COORD = MIN X
		BRA.S	X_ON_SCREEN_I
X_OFF_SCREEN1_I	MOVE.W	A3,(A2)			NEW COORD = MAX 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.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)+,D0		BLITSIZE
BLIT_S_LOOP_I	BTST	#14,2(A1)
		BNE.S	BLIT_S_LOOP_I
		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	D0,$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

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

L70
L71
L72
L73

***********************************************************
* 	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	74
L74	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
* 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!
;

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

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

*********************************************************************
; 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.11",10
	Even

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






