;********************************************************
;*							*
;*		WRITTEN BY <MAG> OF POLARIS		*
;*							*
;*	Okrag z 360 pixeli - przyklad wykorzystania	*
;*		  funkcji sinus i cosinus		*
;*							*
;********************************************************

;------------------ STALE -----------------

OLDOPENLIBRARY	=	-408
CLOSELIBRARY	=	-414
OPENSCREEN	=	-198
CLOSESCREEN	=	-66
WRITEPIXEL	=	-324
SETAPEN		=	-342
SETDRMD		=	-354

SCREENTYPE	=	$000F
WBENCHSCREEN	=	$0001
CUSTOMSCREEN	=	$000F
SHOWTITLE	=	$0010
BEEPING		=	$0020
CUSTOMBITMAP	=	$0040
SCREENBEHIND	=	$0080
SCREENQUIET	=	$0100
STDSCREENHEIGHT	=	-1

PFBA		=	$40
DUALPF		=	$400
HIRES		=	$8000
LACE		=	4
HAM		=	$800
SPRITES		=	$4000
VP_HIDE		=	$2000
GENLOCK_AUDIO	=	$100
GENLOCK_VIDEO	=	2
EXTRAHALFBRITE	=	$80

;----------------- PROGRAM ----------------

START:

	MOVE.L 4,A6
	LEA GFXNAME(PC),A1
	JSR OLDOPENLIBRARY(A6)
	TST.L D0
	BEQ.L ERROR
	MOVE.L D0,GFXBASE

	MOVE.L 4,A6
	LEA INTNAME(PC),A1
	JSR OLDOPENLIBRARY(A6)
	TST.L D0
	BEQ.L ERROR3
	MOVE.L D0,INTBASE

	LEA NEWSCREEN(PC),A0
	MOVE.L D0,A6
	JSR OPENSCREEN(A6)
	TST.L D0
	BEQ.L ERROR2
	MOVE.L D0,SCREEN

	ADDI.L #84,D0
	MOVE.L D0,RPORT
	
	MOVEQ #1,D0
	MOVE.L RPORT,A1
	MOVE.L GFXBASE,A6
	JSR SETAPEN(A6)

	MOVEQ #1,D0
	MOVE.L RPORT,A1
	MOVE.L GFXBASE,A6
	JSR SETDRMD(A6)

	MOVE.L #360,D6
	MOVE.L GFXBASE,A6

REPEAT:	MOVEM.L D6/A6,-(SP)	
	MOVE.W D6,D0
	JSR SIN(PC)
	MOVE.L D0,D1
	DIVS.W #4,D1
	EXT D1
	ADDI.L #128,D1
	MOVE.W D6,D0
	JSR COS(PC)
	DIVS.W #2,D0
	EXT D0
	ADDI.L #320,D0
	MOVE.L RPORT,A1
	MOVE.L GFXBASE,A6
	JSR WRITEPIXEL(A6)
	MOVEM.L (SP)+,D6/A6
	DBRA D6,REPEAT

wait:	btst #6,$bfe001			;LEWY KLAWISZ MYSZY
	bne.s wait

	MOVE.L SCREEN,A0
	MOVE.L INTBASE,A6
	JSR CLOSESCREEN(A6)
ERROR2:	MOVE.L INTBASE,A1
	MOVE.L 4,A6
	JSR CLOSELIBRARY(a6)
ERROR3: MOVE.L GFXBASE,A1
	MOVE.L 4,A6
	JSR CLOSELIBRARY(A6)
ERROR:	MOVEQ #0,D0
	RTS

GFXBASE:DC.L 0
RPORT:	DC.L 0
SCREEN:	DC.L 0
INTBASE:DC.L 0

INTNAME:DC.B "intuition.library",0
	EVEN
GFXNAME:DC.B "graphics.library",0
	EVEN
TITLE:	DC.B "OKRAG z 360 pixeli - to przyklad wykorzystania funkcji SIN & COS",0
	EVEN

NEWSCREEN:

	DC.W 0,0,640,256,1
	DC.B 0,1
	DC.W HIRES,CUSTOMSCREEN
	DC.L 0,TITLE,0,0
	DC.L 0	

;-------------- FUNCTION SINUS & COSINUS -------------
;
;		INPUT REGISTERS:
;		D0 - DEGREE 0 ÷ 360
;
;		OUTPUT REGISTER:
;		D0 - WORD (WARTOÕÇ) -255 ÷ 255
;		IF D0=$F000 THEN ERROR

SIN:
		MOVEM.L D1/D2/A0,-(SP)
		SUB.B D2,D2
		BTST #15,D0
		BEQ.s OMIN
		ADDI.W #360,D0
OMIN:		CMPI.W #360,D0
		BHI.s ERROR_IN_SINUS
JESZCZE2:	CMPI.W #90,D0
		BHI.s PRZELICZ
LICZE:		LEA SIN_TABLE(PC),A0
		ADD.L D0,A0
		ADD.L D0,A0
		MOVE.W (A0),D0
		TST.B D2
		BEQ.s FIN_SIN
		SUB.W D1,D1
		SUB.W D0,D1
		MOVE.W D1,D0
FIN_SIN:	MOVEM.L (SP)+,D1/D2/A0
		RTS

ERROR_IN_SINUS:

		MOVE.W #$F000,D0
		BRA.s FIN_SIN

COS:
		SUBI.W #270,D0
		BRA.s SIN

PRZELICZ:	MOVE.W #90,D1
		SUBI.W #90,D0
		CMPI.W #90,D0
		BHI.s PRZELICZ2
		SUBI.W D0,D1
		MOVE.W D1,D0
		BRA.s LICZE

PRZELICZ2:	SUBI.W #90,D0
		MOVE.B #$FF,D2
		BRA.s JESZCZE2

SIN_TABLE:

		DC.W 0,4,9,13,18,22,27,31,35,40,44,49,53,57,62
		DC.W 66,70,75,79,83,87,91,96,100,104,108,112
		DC.W 116,120,124,128,131,135,139,143,146,150
		DC.W 153,157,160,164,167,171,174,177,180,183
		DC.W 186,190,192,195,198,201,204,206,209,211
		DC.W 214,216,219,221,223,225,227,229,231,233
		DC.W 235,236,238,239,241,243,244,245,246,247
		DC.W 248,249,250,251,252,253,253,254,254,254
		DC.W 255,255,255,255

