*************************************************************************
*                                                                       
*   sample.library.asm -- Example run-time library source code          
*                                                                       
* Copyright (c) 1990 Commodore-Amiga, Inc.
*
* This example is provided in electronic form by Commodore-Amiga, Inc. for
* use with the 1.3 revisions of the Addison-Wesley Amiga reference manuals. 
* The 1.3 Addison-Wesley Amiga Reference Manual series contains additional
* information on the correct usage of the techniques and operating system
* functions presented in this example.  The source and executable code of
* this example may only be distributed in free electronic form, via bulletin
* board or as part of a fully non-commercial and freely redistributable
* diskette.  Both the source and executable code (including comments) must
* be included, without modification, in any copy.  This example may not be
* published in printed form or distributed with any commercial product.
* However, the programming techniques and support routines set forth in
* this example may be used in the development of original executable
* software products for Commodore Amiga computers.
* All other rights reserved.
* This example is provided "as-is" and is subject to change; no warranties
* are made.  All use is at your own risk.  No liability or responsibility
* is assumed.
*
*   Assemble and link, without startup code, to create Sample.library,  
*     a LIBS: drawer run-time shared library                            
*                                                                       
*  Linkage Info:                                                        
*  FROM     sample.library.o                                            
*  LIBRARY  LIB:Amiga.lib                                               
*  TO       sample.library                                              
*                                                                       
************************************************************************

   SECTION   code

   NOLIST
   
   INCDIR  "include/"
   INCLUDE "offsets.i"
   INCLUDE "exec/types.i"
   INCLUDE "exec/initializers.i"
   INCLUDE "exec/libraries.i"
   INCLUDE "exec/lists.i"
   INCLUDE "exec/alerts.i"
   INCLUDE "exec/resident.i"
   INCLUDE "libraries/dos.i"

   INCLUDE "asmsupp.i"
   INCLUDE "samplebase.i"
   INCLUDE "D3libs.i

upx		equ	48
upy		equ	50
botx		equ	52
boty		equ	54
centx		equ	56
centy		equ	58
dxarcus		equ	60
dyarcus		equ	62
D3list		equ	64		
Distant		equ	94	
_DosBase	equ	96
_GfxBase	equ	100
_IntuitionBase	equ	104
Naytto		equ	108
Ikkuna		equ	112
Rp		equ	116
Userport	equ	120
MemBuf		equ	124
Colorlist	equ	128
Activedwindow	equ	192 
ActivedBase	equ	196
Bufsize		equ	108
Windowbase	equ	112
Windowrp	equ	116
Windowuserport	equ	120

   ;------ These don't have to be external, but it helps some
   ;------ debuggers to have them globally visible
   XDEF   Init
   XDEF   Open
   XDEF   Close
   XDEF   Expunge
   XDEF   Null
   XDEF   sampleName
   XDEF   Cosi
   XDEF   Sini
   XREF   Circle
   XREF   D3rot
   XREF   D3xyz
   XREF   D3dist
   XREF   D3proj
   XREF   OpenLibs
   XREF   GfxRp
   XREF   D3line
   XREF   D3plot
   XREF   D3cub
   XREF   Arcus
   XREF   Vanillakey
   XREF   D3realcub
   XREF   Allocd3buf
   XREF   Freed3buf
   XREF   D3realplot
   XREF   D3colorplot
   XREF   Square
   XREF   Colorwindow
   XREF   Lightarcus
   XREF   Colorset
   XREF   D3print
   XREF   OpenD3Window
   XREF   CloseD3Window
   XREF   ActiveD3Window
   XREF   CloseD3Screen
   XREF   ClickD3Window
   XREF   _AbsExecBase
  
  

   XLIB   OpenLibrary
   XLIB   CloseLibrary
   XLIB   Alert
   XLIB   FreeMem
   XLIB   Remove



   ; The first executable location.  This should return an error
   ; in case someone tried to run you as a program (instead of
   ; loading you as a library).
Start:
   MOVEQ   #-1,d0
   rts

;-----------------------------------------------------------------------
; A romtag structure.  Both "exec" and "ramlib" look for
; this structure to discover magic constants about you
; (such as where to start running you from...).
;-----------------------------------------------------------------------

   ; Most people will not need a priority and should leave it at zero.
   ; the RT_PRI field is used for configuring the roms.  Use "mods" from
   ; wack to look at the other romtags in the system
MYPRI   EQU   0

initDDescrip:
               ;STRUCTURE RT,0
     DC.W    RTC_MATCHWORD      ; UWORD RT_MATCHWORD
     DC.L    initDDescrip       ; APTR  RT_MATCHTAG
     DC.L    EndCode            ; APTR  RT_ENDSKIP
     DC.B    RTF_AUTOINIT       ; UBYTE RT_FLAGS
     DC.B    VERSION            ; UBYTE RT_VERSION
     DC.B    NT_LIBRARY         ; UBYTE RT_TYPE
     DC.B    MYPRI              ; BYTE  RT_PRI
     DC.L    sampleName         ; APTR  RT_NAME
     DC.L    idString           ; APTR  RT_IDSTRING
     DC.L    Init               ; APTR  RT_INIT


   ; this is the name that the library will have
sampleName:    D3NAME

   ; a major version number.
VERSION:   EQU   34

   ; A particular revision.  This should uniquely identify the bits in the
   ; library.  I use a script that advances the revision number each time
   ; I recompile.  That way there is never a question of which library
   ; that really is.
REVISION:   EQU  2

   ; this is an identifier tag to help in supporting the library
   ; format is 'name version.revision (dd MON yyyy)',<cr>,<lf>,<null>
idString:   dc.b   'd3lib 1.3 (06 Dec 1989)',13,10,0

dosName:   DOSNAME

   ; force word allignment
   ds.w   0


   ; The romtag specified that we were "RTF_AUTOINIT".  This means
   ; that the RT_INIT structure member points to one of these
   ; tables below.  If the AUTOINIT bit was not set then RT_INIT
   ; would point to a routine to run.

Init:
   DC.L   $300              ; size of library base data space
   DC.L   funcTable         ; pointer to function initializers
   DC.L   dataTable         ; pointer to data initializers
   DC.L   initRoutine       ; routine to run


funcTable:

   ;------ standard system routines
   dc.l   Open
   dc.l   Close
   dc.l   Expunge
   dc.l   Null

   ;------ my libraries definitions
   dc.l   Cosi
   dc.l   Sini
   dc.l   Circle
   dc.l   D3rot
   dc.l   D3xyz
   dc.l   D3dist
   dc.l   D3proj
   dc.l   OpenLibs
   dc.l   GfxRp
   dc.l   D3plot
   dc.l   D3line
   dc.l   D3cub
   dc.l   Arcus
   dc.l   Vanillakey
   dc.l   D3realcub
   dc.l   Allocd3buf
   dc.l   Freed3buf
   dc.l   D3realplot
   dc.l   D3colorplot
   dc.l   Square
   dc.l   Colorwindow
   dc.l   Lightarcus
   dc.l   Colorset
   dc.l   D3print
   dc.l   OpenD3Window
   dc.l   CloseD3Window
   dc.l   ActiveD3Window
   dc.l	  CloseD3Screen
   dc.l   ClickD3Window
   ;------ function table end marker
   dc.l   -1


   ; The data table initializes static data structures.
   ; The format is specified in exec/InitStruct routine's
   ; manual pages.  The INITBYTE/INITWORD/INITLONG routines
   ; are in the file "exec/initializers.i".  The first argument
   ; is the offset from the library base for this byte/word/long.
   ; The second argument is the value to put in that cell.
   ; The table is null terminated
   ; NOTE - LN_TYPE below is a correction - old example had LH_TYPE

dataTable:
	INITBYTE	LN_TYPE,NT_LIBRARY
	INITLONG	LN_NAME,sampleName
	INITBYTE	LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
	INITWORD	LIB_VERSION,VERSION
	INITWORD	LIB_REVISION,REVISION
	INITLONG	LIB_IDSTRING,idString
	DC.L   0


   ; This routine gets called after the library has been allocated.
   ; The library pointer is in D0.  The segment list is in A0.
   ; If it returns non-zero then the library will be linked into
   ; the library list.
initRoutine:

   ;------ get the library pointer into a convenient A register
   move.l   a5,-(sp)
   move.l   d0,a5

   ;------ save a pointer to exec
   move.l   a6,sb_SysLib(a5)

   ;------ save a pointer to our loaded code
   move.l   a0,sb_SegList(a5)

   ;------ open the dos library
   lea   dosName(pc),a1
   CLEAR   d0
   CALLSYS   OpenLibrary

   move.l   d0,sb_DosLib(a5)
   bne.s   1$

   ;------ can't open the dos!  what gives
   ALERT   AG_OpenLib!AO_DOSLib

1$:
   ;------ now build the static data that we need

   ;
   ; put your initialization here...
   ;

   move.l   a5,d0
   move.l   (sp)+,a5
   rts

;----------------------------------------------------------------------
;
; here begins the system interface commands.  When the user calls
; OpenLibrary/CloseLibrary/RemoveLibrary, this eventually gets translated
; into a call to the following routines (Open/Close/Expunge).  Exec
; has already put our library pointer in A6 for us.  Exec has turned
; off task switching while in these routines (via Forbid/Permit), so
; we should not take too long in them.
;
;----------------------------------------------------------------------


   ; Open returns the library pointer in d0 if the open
   ; was successful.  If the open failed then null is returned.
   ; It might fail if we allocated memory on each open, or
   ; if only open application could have the library open
   ; at a time...

Open:      ; ( libptr:a6, version:d0 )

   ;------ mark us as having another opener
   addq.w   #1,LIB_OPENCNT(a6)

   ;------ prevent delayed expunges
   bclr   #LIBB_DELEXP,sb_Flags(a6)

   move.l   a6,d0
   rts

   ; There are two different things that might be returned from
   ; the Close routine.  If the library is no longer open and
   ; there is a delayed expunge then Close should return the
   ; segment list (as given to Init).  Otherwise close should
   ; return NULL.

Close:      ; ( libptr:a6 )
    
   ;------ set the return value
   CLEAR   d0

   ;------ mark us as having one fewer openers
   subq.w   #1,LIB_OPENCNT(a6)

   ;------ see if there is anyone left with us open
   bne.s   1$

   ;------ see if we have a delayed expunge pending
   btst   #LIBB_DELEXP,sb_Flags(a6)
   beq.s   1$

   ;------ do the expunge
   bsr   Expunge
1$:
   rts


   ; There are two different things that might be returned from
   ; the Expunge routine.  If the library is no longer open
   ; then Expunge should return the segment list (as given to
   ; Init).  Otherwise Expunge should set the delayed expunge
   ; flag and return NULL.
   ;
   ; One other important note: because Expunge is called from
   ; the memory allocator, it may NEVER Wait() or otherwise
   ; take long time to complete.

Expunge:   ; ( libptr: a6 )

   movem.l   d2/a5/a6,-(sp)
   move.l   a6,a5
   move.l   sb_SysLib(a5),a6
   
   ;------ see if anyone has us open
   tst.w   LIB_OPENCNT(a5)
   beq   1$

   ;------ it is still open.  set the delayed expunge flag
   bset   #LIBB_DELEXP,sb_Flags(a5)
   CLEAR   d0
   bra.s   Expunge_End

1$:
   ;------ go ahead and get rid of us.  Store our seglist in d2
   move.l   sb_SegList(a5),d2

   ;------ unlink from library list
   move.l   a5,a1
   CALLSYS   Remove
   
   ;
   ; device specific closings here...
   ;

   ;------ close the dos library
   move.l   sb_DosLib(a5),a1
   CALLSYS   CloseLibrary

   ;------ free our memory
   CLEAR   d0
   move.l   a5,a1
   move.w   LIB_NEGSIZE(a5),d0

   sub.l   d0,a1
   add.w   LIB_POSSIZE(a5),d0

   CALLSYS   FreeMem

   ;------ set up our return value
   move.l   d2,d0

Expunge_End:
   movem.l   (sp)+,d2/a5/a6
   rts


Null:
   CLEAR   d0
   rts

;----------------------------------------------------------------------
;
; Here begins the library specific functions.
;
; Both of these simple functions are entirely in assembler, but you
; can write your functions in C if you wish and interface to them here.
; If, for instance, the bulk of the AddThese function was written
; in C, you could interface to it as follows:
;
;   - write a C function  addTheseC(n1,n2) and compile it
;   - XDEF _addThese C  in this library code
;   - change the AddThese function code below to:
;       move.l d1,-(sp)     ;push rightmost C arg first
;       move.l d0,-(sp)     ;push other C arg(s), right to left
;       jsr    _addTheseC   ;call the C code
;       addq   #8,sp        ;fix stack
;       rts                 ;return with result in d0
;
;----------------------------------------------------------------------


;* d3library*

;*----	Cosi d0 value d0
		ds.l	0
Cosi		add.w	#4096,d0

;*--- Sini d0 value d0

Sini		lea	sintable(pc),a0		;sintable address
		move.w	d0,d1
		and.w	#$1fff,d1
		asl.w	#1,d1
		move.w	0(a0,d1.w),d1		;sin from table
		btst.l	#13,d0
		beq.s	possin
		neg.w	d1
possin		clr.l	d0
		move.w	d1,d0
		rts		

;*--- Circle	
Circle		movem.l	d2-d7/a1-a6,-(sp)
		move.l	a6,a5
		move.l	a0,a3
		bsr	GfxRp
		move.w	12(a3),d0
		jsr	_LVOSetAPen(a6)

		move.w	#0,d7		;angle
contxyr		move.w	d7,d0
		bsr	Sini
		move.w	4(a3),d3
		muls.w	d3,d0
		asl.l	#1,d0
		swap	d0
		move.w	d0,d2		;z*sin(t)
		move.w	d7,d0
		bsr	Cosi
		move.w	2(a3),d3
		muls.w	d3,d0
		asl.l	#1,d0
		swap	d0
		move.w	d0,-(sp)	;y*cos(t)
		move.w	d7,d0
		bsr	Sini
		move.w	0(a3),d3
		muls.w	d3,d0
		asl.l	#1,d0
		swap	d0
		move.w	(sp)+,d1
		add.w	6(a3),d0
		add.w	8(a3),d1
		add.w	10(a3),d2
		move.l	a5,a6
		bsr	D3dots
		move.l	a5,a6
		bsr	GfxRp
		tst.w	d7
		bne	no_zerox
		jsr	_LVOMove(a6)
		bra	nextl
no_zerox	jsr	_LVODraw(a6)
nextl		add.w	#256,d7
		cmp.w	#$4000,d7
		ble	contxyr
		movem.l	(sp)+,d2-d7/a1-a6
		rts
;d3 angles

D3rot		movem.l	d3-d7/a2/a6,-(sp)
		sub.w	#1,d3
		cmp.w	#3,d3
		bhi	errorrot
		asl.w	#7,d3
		ext.l	d3
		lea	256(a6),a1
		add.l	d3,a1
		add.l	#D3list,a1
		move.w	d0,d3
		move.w	d1,d4
		bsr	Sini
		move.w	d0,0(a1)	;sin x
		move.w	d3,d0
		bsr	Cosi
		move.w	d0,2(a1)	;cos x
		move.w	d4,d0
		bsr	Sini
		move.w	d0,4(a1)	;sin y
		move.w	d4,d0
		bsr	Cosi
		move.w	d0,6(a1)	;cos y
		move.w	d2,d0
		bsr	Sini
		move.w	d0,8(a1)	;sin z
		move.w	d2,d0
		bsr	Cosi
		move.w	d0,10(a1)	;cosi z



;siirtokertoimien laskeminen
		move.l	a1,a2
		move.w	(a2)+,d0	;sin and cos
		move.w	(a2)+,d1
		move.w	(a2)+,d2
		move.w	(a2)+,d3
		move.w	(a2)+,d4
		move.w	(a2)+,d5
		move.w	d3,d6
		muls.w	d5,d6
;		asl.l	#1,d6
		swap	d6
		move.w	d4,d7
		muls.w	d0,d7
		asl.l	#1,d7
		swap	d7
		move.w	d7,-(sp)
		muls.w	d2,d7
;		asl.l	#1,d7
		swap	d7
		sub.w	d7,d6
		move.w	d6,12(a1)	;x, x
		move.w	d1,d6
		muls.w	d4,d6
;		asl.l	#1,d6
		swap	d6
		neg.w	d6
		move.w	d6,14(a1)	;x, y
		move.w	d2,d6
		muls.w	d5,d6
;		asl.l	#1,d6
		swap	d6
		move.w	(sp)+,d7
		muls.w	d3,d7
;		asl.l	#1,d7
		swap	d7
		add.w	d6,d7
		move.w	d7,16(a1)	;x, z
		move.w	d3,d6
		muls.w	d4,d6
;		asl.l	#1,d6
		swap	d6
		move.w	d0,d7
		muls.w	d5,d7
		asl.l	#1,d7
		swap	d7
		move.w	d7,-(sp)
		muls.w	d2,d7
;		asl.l	#1,d7
		swap	d7
		add.w	d6,d7
		move.w	d7,18(a1)	;y, x
		move.w	d1,d6
		muls.w	d5,d6
;		asl.l	#1,d6
		swap	d6

		move.w	d6,20(a1)	;y, y
		move.w	d4,d6
		muls.w	d2,d6
;		asl.l	#1,d6
		swap	d6
		move.w	(sp)+,d7
		muls.w	d3,d7
;		asl.l	#1,d7
		swap	d7
		sub.w	d7,d6
		move.w	d6,22(a1)	;y, z
		muls.w	d1,d2
;		asl.l	#1,d2
		swap	d2
		neg.w	d2
		move.w	d2,24(a1)		;z, x
		asr.w	#1,d0
		move.w	d0,26(a1)		;z, y
		muls.w	d1,d3
;		asl.l	#1,d3
		swap	d3
		move.w	d3,28(a1)		;z, z
		moveq	#14,d7
		lea	D3list(a6),a0
loopsf		move.w	(a1)+,(a0)+
		dbf	d7,loopsf
		moveq.l	#1,d0
		movem.l	(sp)+,d3-d7/a2/a6
		rts	
errorrot	moveq.l	#0,d0
		movem.l	(sp)+,d3-d7/a2/a6
		rts		

D3xyz		lea	D3list(a6),a0				;angletable
		movem.l	d3-d7,-(sp)
		moveq	#2,d6
		clr.l	d7
lopsr		move.w	d0,d3
		move.w	d1,d4
		move.w	d2,d5
		muls.w	12(a0,d7),d3
		asl.l	#1,d3
		swap	d3
		muls.w	14(a0,d7),d4
		asl.l	#1,d4
		swap	d4
		muls.w	16(a0,d7),d5
		asl.l	#1,d5
		swap	d5
		add.w	d3,d4
		add.w	d4,d5
		move.w	d5,-(sp)		; x, y, z,
		addq	#6,d7
		dbf	d6,lopsr
		move.w	(sp)+,d2
		move.w	(sp)+,d1
		move.w	(sp)+,d0
		movem.l	(sp)+,d3-d7
		rts

D3dist		
		subq.w	#1,d1
		cmp.w	#3,d1
		bhi	errordis
		asl.w	#7,d1
		ext.l	d1
		lea	256(a6),a0
		add.l	d1,a2
		lsr.w	#1,d0
		move.w	d0,Distant(a0)
		move.w	d0,Distant(a6)
		rts

errordis	moveq.l	#0,d0
		rts
		
D3proj		move.l	a6,a0			;angletable
		asr.w	#1,d2
		muls.w	Distant(a0),d0
		muls.w	Distant(a0),d1
		add.w	Distant(a0),d2
		beq.s	overflow
		bvs.s	overflow
		divs.w	d2,d0
		divs.w	d2,d1
		rts
overflow	move.w	#$7fff,d0
		move.w	#$7fff,d1
		rts

OpenLibs	movem.l	a5/a6,-(sp)
		move.l	a6,a5			;d3.library address

		move.l	4,a6
		moveq	#0,d0
		lea	_DosLib(pc),a1
		jsr	_LVOOpenLibrary(a6)
		move.l	d0,_DosBase(a5)
		beq	cleanup1
		
		move.l	4,a6
		moveq	#0,d0
		lea	_GfxLib(pc),a1
		jsr	_LVOOpenLibrary(a6)
		move.l	d0,_GfxBase(a5)
		beq	cleanup1

		move.l	4,a6
		moveq	#0,d0
		lea	_IntuitionLib(pc),a1
		jsr	_LVOOpenLibrary(a6)
		move.l	d0,_IntuitionBase(a5)
		beq	cleanup1



		lea	Uusinaytto(pc),a0	;screenstructure address
		move.l	_IntuitionBase(a5),a6
		jsr	_LVOOpenScreen(a6)
		move.l	d0,Naytto(a5)			;screen address
		beq 	cleanup1

*varit*

		move.l	Naytto(a5),a0			;screen address
		lea	44(a0),a0			;sc_ViewPort viewport structure address
		move.l	_GfxBase(a5),a6			;grahpiclibrary

		moveq	#32,d0				;number of color
		lea	colortable(pc),a1
		jsr	_LVOLoadRGB4(a6)
		movem.l	(sp)+,a5/a6
		
		rts
		
colortable	dc.w	$0000
		dc.w	$0111
		dc.w	$0222
		dc.w	$0333
		dc.w	$0444
		dc.w	$0555
		dc.w	$0666
		dc.w	$0777
		dc.w	$0888
		dc.w	$0999
		dc.w	$0aaa
		dc.w	$0bbb
		dc.w	$0ccc
		dc.w	$0ddd
		dc.w	$0eee
		dc.w	$0fff
		dc.w	$07a0
		dc.w	$05c0
		dc.w	$03d0
		dc.w	$02e0
		dc.w	$00f0
		dc.w	$00d1
		dc.w	$00c3
		dc.w	$00b5
		dc.w	$00a7
		dc.w	$0099
		dc.w	$007a
		dc.w	$005c
		dc.w	$003d
		dc.w	$002e
		dc.w	$001f
		dc.w	$000f
		ds.l	0
*open vindow and rastport address *


OpenD3Window	movem.l	d2-d5/a5/a6,-(sp)
		move.l	a6,a5
		move.w	d4,Activedwindow(a5)
		subq.w	#1,d4
		ext.l	d4
		cmp.w	#3,d4
		bhi	cleanup
		asl.l	#7,d4
		lea	UusiIkkuna(pc),a0
		lea	$100(a5),a1				;d3base
		add.l	d4,a1
		move.l	a1,-(sp)
		moveq	#12,d5
windowmove	move.l	(a0)+,(a1)+
		dbf	d5,windowmove
		
		move.l	(sp)+,a0
		move.w	d0,(a0)			;upx
		move.w	d1,2(a0)			;upy
		move.w	d2,4(a0)			;botx
		move.w	d3,6(a0)			;boty
		move.w	d2,38(a0)
		move.w	d2,42(a0)
		move.w	d3,40(a0)
		move.w	d3,44(a0)

		move.w	d0,upx(a5)
		move.w	d0,upx(a0)
		move.w	d1,upy(a5)
		move.w	d1,upy(a0)
		move.w	d2,botx(a5)
		move.w	d2,botx(a0)
		move.w	d3,boty(a5)
		move.w	d3,boty(a0)
		asr.w	#1,d2
		asr.w	#1,d3
		move.w	d2,centx(a5)
		move.w	d2,centx(a0)
		move.w	d3,centy(a5)
		move.w	d3,centy(a0)
		move.l	a0,-(sp)	
			
		move.l	Naytto(a5),30(a0)		;nw_Screen nayton osoitin
		move.l	_IntuitionBase(a5),a6		;intuibase
		jsr	_LVOOpenWindow(a6)		;open window
		
		move.l	(sp)+,a1	
		move.l	d0,Ikkuna(a5)			;save window address
		beq	cleanup				;if not open exit
		move.l	d0,a0
		move.l	d0,Windowbase(a1)
		
		move.l	50(a0),Rp(a5)			;wd_RPort take rastport address
		move.l	86(a0),Userport(a5)		;userport
		move.l	50(a0),Windowrp(a1)
		move.l	86(a0),Windowuserport(a1)
		move.l	a1,ActivedBase(a5)
		movem.l	(sp)+,d2-d5/a5/a6
		rts
cleanup		moveq	#0,d0
		move.w	#0,Activedwindow(a5)
		movem.l	(sp)+,d2-d5/a5/a6
		rts	
CloseD3Window
		movem.l	a4-a6,-(sp)
		move.l	a6,a5
		lea	256(a5),a4
		ext.l	d0
		subq.l	#1,d0
		cmp.l	#3,d0
		bhi	nowindow
		asl.l	#7,d0
		add.l	d0,a4
		move.l	Windowbase(a4),d0
		beq	nowindow
		move.l	d0,a0
		move.l	_IntuitionBase(a5),a6
		jsr	_LVOCloseWindow(a6)
		move.l	#0,Windowbase(a4)
		move.w	#0,Activedwindow(a5)	
		move.l	#0,ActivedBase(a5)
nowindow	movem.l	(sp)+,a4-a6
		rts   
ActiveD3Window
		movem.l	a4-a6,-(sp)
		lea	256(a6),a4
		move.w	d0,Activedwindow(a6)
		subq.w	#1,d0
		cmp.w	#3,d0
		bhi	activeerror
		asl.w	#7,d0
		ext.l	d0
		add.l	d0,a4
		move.l	Windowbase(a4),Ikkuna(a6)
		move.l	Windowrp(a4),Rp(a6)
		move.l	Windowuserport(a4),Userport(a6)
		move.l	a4,ActivedBase(a6)
		move.l	MemBuf(a4),MemBuf(a6)
		
		lea	upx(a6),a5
		lea	upx(a4),a4
		moveq	#11,d0
loophk		move.l	(a4)+,(a5)+
		dbf	d0,loophk
		
		move.w	Distant(a6),d0
		bne	activeerror
		move.w	#$4000,Distant(a6)
		movem.l	(sp)+,a4-a6
		moveq.l	#1,d0
		rts
activeerror	moveq.l	#0,d0
		movem.l	(sp)+,a4-a6
		rts
*waitclose*
ClickD3Window
		move.w	d0,-(sp)
		movem.l	d2-d4/a4-a6,-(sp)
		sub.w	#1,d0
		cmp.w	#3,d0
		bhi	errorghj
		asl.w	#7,d0
		ext.l	d0
		lea	256(a6),a5
		add.l	d0,a5
initclose	move.l	Windowbase(a5),d0		;window
		beq	errorghj		;no window
		move.l	d0,a4
		lea	Title(pc),a0
		move.l	a0,32(a4)		;wd_Title
		move.l	_IntuitionBase(a6),a6
		move.l	a4,a0
		jsr	_LVORefreshWindowFrame(a6)
	

checkclose	move.l	4,a6			;execbase
		move.l	$56(a4),a0		;wd_UserPort get message
		jsr	_LVOWaitPort(a6)
		move.l	$56(a4),a0
		jsr	_LVOGetMsg(a6)
		move.l	d0,a1			;pointer
		move.l	20(a1),d2		;message type
		jsr	_LVOReplyMsg(a6)
		cmpi.l	#$00000200,d2		;CLOSEWINDOW is correct
		bne	checkclose		
errorghj	movem.l	(sp)+,d2-d4/a4-a6
		move.w	(sp)+,d0
		bsr	CloseD3Window
		rts


*close library*
Reserved	
		rts
CloseD3Screen
		movem.l	a5/a6,-(sp)
		move.l	a6,a5	
cleanup1	move.l	Naytto(a5),d0
		beq.s	cleanup2
		move.l	d0,a0
		move.l	_IntuitionBase(a5),a6
		jsr	_LVOCloseScreen(a6)

cleanup2	
		move.l	_GfxBase(a5),d0
		beq.s	cleanup3
		move.l	4,a6
		move.l	d0,a1
		jsr	_LVOCloseLibrary(a6)

cleanup3
		move.l	_IntuitionBase(a5),d0
		beq.s	cleanup4
		move.l	4,a6
		move.l	d0,a1
		jsr	_LVOCloseLibrary(a6)

cleanup4	move.l	_DosBase(a5),d0
		beq.s	cleanup5
		move.l	4,a6
		move.l	d0,a1
		jsr	_LVOCloseLibrary(a6)			
	
cleanup5	moveq	#0,d0
		movem.l	(sp)+,a5/a6
		rts


		
*structures*		
		

Uusinaytto	DC.W	0,0
		DC.W	320,256		;size (x,y)
		DC.W	6		;bits for colors
		DC.B	0,1		;pens
		DC.W	$80		;mode
		DC.W	15		;CUSTOMSCREEN	;type of screen
		DC.L	Fontit		;address of fonts
		DC.L	Otsikko		;address of screen
		DC.L	0		;no gargets
		DC.L	64		:no bitmaps
		

UusiIkkuna	DC.W	0,0,320,256	;upper x,y , bottom x,y
		DC.B	2,3		;detailpen, blockpen
		DC.L	$200206		;IDCMPFlags
		DC.L	$002180b	;WINDOWSIZING!WINDOWDRAG!NOCAREREFRESH!ACTIVATE!BORDERLESS!WINDOWCLOSE	;Flags
		DC.L	0		;gadgets
		DC.L	0		;checkmark
		DC.L	0		;title
		DC.L	0		;screen
		DC.L	0		;bitmap
		DC.W	100,80,320,256		;min-max size
		DC.W	15		;CUSTOMSCREEN	;type

MyWinTitle	DC.B	'ThisIsMine!',0,0

		DS.L	0
		
Screenname	DC.B	'My screen',0
		
		DS.L	0

Fontit		dc.l	fontin_nimi
		dc.w	0
		dc.b	0,0

fontin_nimi	dc.b	"topas.font",0
Otsikko		dc.b	"HALFBRITE",0
Title		dc.b	"D3 Window",0


_DosLib		dc.b	"dos.library",0
_GfxLib		dc.b	"graphics.library",0
_IntuitionLib	dc.b	"intuition.library",0



		ds.l	0

GfxRp		move.l	Naytto(a6),a0			;screen address
		move.l	Rp(a6),a1			;rasterport address
		move.l	_GfxBase(a6),a6
		rts


;D3dots	
		asl.w	#4,d0
		asl.w	#4,d1
		asl.w	#4,d2
D3dots
D3plots		bsr	D3xyz
		move.w	d2,-(sp)
		bsr	D3proj
		asr.w	#3,d0
		bcc.s	noadd1
		addq.w	#1,d0
noadd1		ext.l	d0
		asr.w	#3,d1
		bcc.s	noadd2
		addq.w	#1,d1
noadd2		neg.w	d1
		ext.l	d1
		add.w	centx(a5),d0
		add.w	centy(a5),d1
		move.w	(sp)+,d2
		rts

D3plot		movem.l	a1/a5/a6,-(sp)
		move.l	a6,a5
		bsr	D3plots
		move.l	a5,a6
		bsr	GfxRp
		jsr	_LVOWritePixel(a6)
		movem.l	(sp)+,a1/a5/a6
		rts

D3suplot	movem.l	a1/a5/a6,-(sp)
		move.l	a6,a5
		bsr	D3plots
		move.l	a5,a6
		bsr	GfxRp
		jsr	_LVOWritePixel(a6)
		movem.l	(sp)+,a1/a5/a6
		rts

D3line		movem.l	a1/a5/a6,-(sp)
		move.l	a6,a5
		move.l	a0,a3
		move.w	12(a3),d0			;color
		bsr	GfxRp
		jsr	_LVOSetAPen(a6)
		move.w	0(a3),d0
		move.w	2(a3),d1
		move.w	4(a3),d2
		move.l	a5,a6
		bsr	D3dots
		move.l	a5,a6
		bsr	GfxRp
		jsr	_LVOMove(a6)
		move.w	6(a3),d0
		move.w	8(a3),d1
		move.w	10(a3),d2
		move.l	a5,a6
		bsr	D3dots
		move.l	a5,a6
		bsr	GfxRp
		jsr	_LVODraw(a6)
		movem.l	(sp)+,a1/a5/a6
		rts

D3cub		movem.l	d1-d7/a3-a6,-(sp)
		link	a4,#-32
		move.l	a6,a5
		move.l	a0,a3
		move.w	12(a3),d0
		bsr	GfxRp
		jsr	_LVOSetAPen(a6)
		move.w	0(a3),d0
		move.w	2(a3),d1
		move.w	4(a3),d2
		move.l	a5,a6
		bsr	D3dots			;x1, y1, z1
		move.w	d0,-2(a4)
		move.w	d1,-4(a4)

		move.w	6(a3),d0
		move.w	2(a3),d1
		move.w	4(a3),d2
		move.l	a5,a6
		bsr	D3dots			;x2, y1, z1
		move.w	d0,-6(a4)
		move.w	d1,-8(a4)

		move.w	6(a3),d0
		move.w	8(a3),d1
		move.w	4(a3),d2	
		move.l	a5,a6
		bsr	D3dots			;x2, y2, z1
		move.w	d0,-10(a4)
		move.w	d1,-12(a4)

		move.w	0(a3),d0
		move.w	8(a3),d1
		move.w	4(a3),d2
		move.l	a5,a6
		bsr	D3dots			;x1, y2, z1
		move.w	d0,-14(a4)
		move.w	d1,-16(a4)		

		move.w	0(a3),d0
		move.w	2(a3),d1
		move.w	10(a3),d2
		move.l	a5,a6
		bsr	D3dots			;x1, y1, z2
		move.w	d0,-18(a4)
		move.w	d1,-20(a4)

		move.w	6(a3),d0
		move.w	2(a3),d1
		move.w	10(a3),d2
		move.l	a5,a6
		bsr	D3dots			;x2, y1, z2
		move.w	d0,-22(a4)
		move.w	d1,-24(a4)

		move.w	6(a3),d0
		move.w	8(a3),d1
		move.w	10(a3),d2
		move.l	a5,a6
		bsr	D3dots			;x2, y2, z2
		move.w	d0,-26(a4)
		move.w	d1,-28(a4)

		move.w	0(a3),d0
		move.w	8(a3),d1
		move.w	10(a3),d2
		move.l	a5,a6
		bsr	D3dots			;x1, y2, z2
		move.w	d0,-30(a4)
		move.w	d1,-32(a4)

		move.w	-2(a4),d0
		move.	-4(a4),d1
		move.l	a5,a6
		bsr	GfxRp
		jsr	_LVOMove(a6)
		move.w	-6(a4),d0
		move.w	-8(a4),d1
		jsr	_LVODraw(a6)
		move.w	-10(a4),d0
		move.w	-12(a4),d1
		jsr	_LVODraw(a6)
		move.w	-14(a4),d0
		move.w	-16(a4),d1
		jsr	_LVODraw(a6)
		move.w	-2(a4),d0
		move.w	-4(a4),d1
		jsr	_LVODraw(a6)
		move.w	-18(a4),d0
		move.w	-20(a4),d1
		jsr	_LVODraw(a6)
		move.w	-22(a4),d0
		move.w	-24(a4),d1
		jsr	_LVODraw(a6)
		move.w	-26(a4),d0
		move.w	-28(a4),d1
		jsr	_LVODraw(a6)
		move.w	-30(a4),d0
		move.w	-32(a4),d1
		jsr	_LVODraw(a6)
		move.w	-18(a4),d0
		move.w	-20(a4),d1
		jsr	_LVODraw(a6)
		move.w	-14(a4),d0
		move.w	-16(a4),d1
		jsr	_LVOMove(a6)
		move.w	-30(a4),d0
		move.w	-32(a4),d1
		jsr	_LVODraw(a6)
		move.w	-10(a4),d0
		move.w	-12(a4),d1
		jsr	_LVOMove(a6)
		move.w	-26(a4),d0
		move.w	-28(a4),d1
		jsr	_LVODraw(a6)
		move.w	-6(a4),d0
		move.w	-8(a4),d1
		jsr	_LVOMove(a6)
		move.w	-22(a4),d0
		move.w	-24(a4),d1
		jsr	_LVODraw(a6)

		unlk	a4
		movem.l	(sp)+,d1-d7/a3-a6
		rts
;*--- ArcusCircle	
Arcus		movem.l	d2-d7/a1-a6,-(sp)
		move.l	a6,a5
		move.l	a0,a3
		bsr	GfxRp
		move.w	16(a3),d0
		jsr	_LVOSetAPen(a6)

		move.w	12(a3),d7		;angle
		moveq	#0,d6
conxyr		move.w	d7,d0
		bsr	Sini
		move.w	4(a3),d3
		muls.w	d3,d0
		asl.l	#1,d0
		swap	d0
		move.w	d0,d2		;z*sin(t)
		move.w	d7,d0
		bsr	Cosi
		move.w	2(a3),d3
		muls.w	d3,d0
		asl.l	#1,d0
		swap	d0
		move.w	d0,-(sp)	;y*cos(t)
		move.w	d7,d0
		bsr	Sini
		move.w	0(a3),d3
		muls.w	d3,d0
		asl.l	#1,d0
		swap	d0
		move.w	(sp)+,d1
		add.w	6(a3),d0
		add.w	8(a3),d1
		add.w	10(a3),d2
		move.l	a5,a6
		bsr	D3dots
		move.l	a5,a6
		bsr	GfxRp
		tst.w	d6
		bne	no_zeroxx
		jsr	_LVOMove(a6)
		addq.w	#1,d6
		bra	nexttl
no_zeroxx	jsr	_LVODraw(a6)
nexttl		add.w	#64,d7
		cmp.w	14(a3),d7
		ble	conxyr
		movem.l	(sp)+,d2-d7/a1-a6
		rts

Vanillakey	move.l	a5,-(sp)
		move.l	a6,a5
		move.l	4,a6
		move.l	Userport(a5),a0
		jsr	_LVOGetMsg(a6)
		tst.l	d0
		beq.s	nomessage
		move.l	d0,a1
		move.w	24(a1),d0

nomessage	move.l	a5,a6
		move.l	(sp)+,a5
		rts

D3realcub
		movem.l	d2-d7/a2-a6,-(sp)
		move.l	a6,a5
		link	a4,#-48
		move.l	a0,a3			;cubic structure
		lea	corners(pc),a2
		moveq	#7,d7			;all corners
		move.w	#0,d3
		move.w	#0,d4
loopse		move.w	0(a2,d3.w),d0
		move.w	2(a2,d3.w),d1
		move.w	4(a2,d3.w),d2
		move.w	0(a3,d0.w),d0
		move.w	0(a3,d1.w),d1
		move.w	0(a3,d2.w),d2
		bsr	D3dots
		move.w	d0,-16(a4,d4.w)
		move.w	d1,-32(a4,d4.w)
		move.w	d2,-48(a4,d4.w)
		add.w	#2,d4
		add.w	#6,d3
		dbf	d7,loopse
;nearest corner
		moveq	#0,d2
		moveq	#2,d3
		moveq	#0,d4
		moveq	#0,d5
		lea	equallist(pc),a0
loopcd		move.w	-48(a4,d2.w),d0
		cmp.w	-48(a4,d3.w),d0
		blt.s	smalls
		beq.s	equals
		move.w	d3,d2
		move.w	#0,d4
		moveq	#0,d5			;no equals
smalls		add.w	#2,d3
		cmp.w	#16,d3
		bne.s	loopcd
	 	bra	readys
equals		addq	#1,d4
		move.w	d3,0(a0,d5.w)
		add.w	#2,d3
		add.w	#2,d5
		cmp.w	#16,d3
		bne.s	loopcd
		move.l	a5,a6		
		bsr	GfxRp
		move.w	12(a3),d0
		jsr	_LVOSetAPen(a6)
readys		lsl.w	#4,d2
		ext.l	d2
		lea	fnurkat(pc),a2
		add.l	d2,a2
		move.w	(a2)+,d6
		move.w	-16(a4,d6.w),d0
		move.w	-32(a4,d6.w),d1
		move.l	a5,a6
		bsr	GfxRp
		jsr	_LVOMove(a6)
		moveq	#9,d7
loopxt		move.w	(a2)+,d6
		move.w	-16(a4,d6.w),d0
		move.w	-32(a4,d6.w),d1
		jsr	_LVODraw(a6)
		dbf	d7,loopxt
		move.w	d2,d0
		move.w	d5,d1
cubicready	unlk	a4
		movem.l	(sp)+,d2-d7/a2-a6
		rts

corners		dc.w	0,2,4,6,2,4,6,8,4,0,8,4
		dc.w	0,2,10,6,2,10,6,8,10,0,8,10	

equallist	dc.w	0,0,0,0,0,0,0,0

fnurkat		dc.w	8,0,6,14,8,10,2,4,6,0,2,0,0,0,0,0
		dc.w	0,2,4,6,0,8,10,12,4,2,10,0,0,0,0,0
		dc.w	6,4,12,14,6,0,2,10,12,4,2,0,0,0,0,0
		dc.w	14,6,4,12,14,8,0,2,4,6,0,0,0,0,0,0

		dc.w	10,8,14,12,10,2,0,6,14,8,0,0,0,0,0,0
		dc.w	8,10,12,14,8,0,2,4,12,10,2,0,0,0,0,0
		dc.w	10,12,14,8,10,2,4,6,14,12,4,0,0,0,0,0
		dc.w	6,14,8,0,6,4,12,10,8,14,12,0,0,0,0,0

Allocd3buf	movem.l	d1/d6/d7/a4-a6,-(sp)
		move.l	a6,a5
		lea	256(a5),a4
		subq.w	#1,d0
		move.w	d0,d1
		
		ext.l	d0
		asl.l	#7,d0
		add.l	d0,a4
		cmp.w	#3,d1
		bhi	errorbuf
		move.l	Windowbase(a4),d0
		beq	errorbuf
		move.w	botx(a4),d1
		move.w	boty(a4),d0
		move.w	d0,d6
		ext.l	d6
		asl.l	#2,d6				;edges
		add.w	#2,d1
		mulu.w	d1,d0				;picsels in window
		asl.l	#1,d0				;size of buffer
		
		move.l	d0,Bufsize(a4)
		move.l	#1,d1
	
		move.l	4,a6
		jsr	_LVOAllocMem(a6)
	
		move.l	d0,a0
		tst.l	d0
		beq	errorbuf
		move.l	Bufsize(a4),d7
		asr.l	#2,d7
		sub.l	#8,d7
		move.l	#$7fff7fff,d1
loopfsb		move.l	d1,(a0)+
		dbf	d7,loopfsb
		add.l	d6,d0
		move.l	d0,MemBuf(a5)
		move.l	d0,MemBuf(a4)
		movem.l	(sp)+,d1/d6/d7/a4-a6
		rts
errorbuf	moveq	#0,d0
		move.l	#0,Bufsize(a4)
		movem.l	(sp)+,d1/d6/d7/a4-a6
		rts


Freed3buf	
		movem.l	d7/a4-a6,-(sp)
		move.l	a6,a5
		lea	256(a6),a4
		subq.w	#1,d0
		cmp.w	#3,d0
		bhi	errorth
		ext.l	d0
		asl.l	#7,d0
		add.l	d0,a4
		move.l	Windowbase(a4),d0
		beq	errorth
		
		move.l	Bufsize(a4),d0
		beq	errorth
		move.l	MemBuf(a4),a1
		move.w	boty(a4),d7
		ext.l	d7
		asl.l	#2,d7
		sub.l	d7,a1
		move.l	4,a6
		jsr	_LVOFreeMem(a6)
	
errorth		move.l	#0,MemBuf(a5)
		move.l	#0,MemBuf(a4)
		move.l	#0,Bufsize(a4)
		movem.l	(sp)+,d7/a4-a6
		rts
		
D3realplot	movem.l	d2-d7/a3-a6,-(sp)
		move.l	a6,a5
		move.l	ActivedBase(a5),a4		;windowstructure address
		move.l	MemBuf(a6),a3			;d3buf
		tst.l	MemBuf(a6)
		beq	bless
		bsr	D3plots
		tst.w	d0
		bmi	bless
		cmp.w	botx(a5),d0
		bge	bless
		tst.w	d1
		bmi	bless
		cmp.w	boty(a5),d1
		bge	bless
		move.w	d0,d3
		mulu.w	boty(a5),d3
		asl.l	#1,d3			;*2

		move.w	d1,d4
		ext.l	d4
		asl.l	#1,d4
		add.l	d3,a3
		add.l	d4,a3
		cmp.w	(a3),d2
		bge	bless			;no writepixel
		move.w	d2,(a3)			;new	valjue

		move.l	a5,a6
		bsr	GfxRp
		jsr	_LVOWritePixel(a6)
	
bless		movem.l	(sp)+,d2-d7/a3-a6
		rts


		
D3colorplot	movem.l	d2-d7/a2-a6,-(sp)
		move.l	a6,a5
		move.l	a6,a4
		move.l	ActivedBase(a5),a4
		move.l	MemBuf(a6),a3		;d3buf		
		move.l	a6,a2			;d3base
		bsr	D3plots
cplot		tst.w	d0
		bmi	blests
		cmp.w	botx(a5),d0
		bge	blests
		tst.w	d1
		bmi	blests
		cmp.w	boty(a5),d1
		bge	blests
		tst.l	MemBuf(a6)
		beq	blests
		move.w	d0,d3
		mulu.w	boty(a5),d3
		asl.l	#1,d3			;*2

		move.w	d1,d4
		ext.l	d4
		asl.l	#1,d4
		add.l	d3,a3
		add.l	d4,a3
		cmp.w	(a3),d2
		bge	blests			;no writepixel
		move.w	d2,(a3)			;new	valjue
		movem.w	d0/d1,-(sp)
		move.l	a5,a6
		bsr	GfxRp
		bsr	colorit
		jsr	_LVOSetAPen(a6)
		movem.w	(sp)+,d0/d1
		move.l	a5,a6
		bsr	GfxRp
		jsr	_LVOWritePixel(a6)
	
blests		movem.l	(sp)+,d2-d7/a2-a6
		rts


colorit	
		move.l	a4,-(sp)
		move.w	d2,d3
		move.w	d2,d4
		move.w	d2,d5
		move.w	d2,d6
		move.w	boty(a4),d0
		asl.w	#2,d0
		sub.w	0(a3,d0.w),d4
		neg.w	d0
		sub.w	0(a3,d0.w),d3
		sub.w	-4(a3),d5			;previous y
		sub.w	4(a3),d6			;next y

		move.w	d3,d0
		bpl.s	ovei1
		neg.w	d0
ovei1		move.w	d4,d1
		bpl.s	ovei2
		neg.w	d1

ovei2		cmp.w	d1,d0
		bls.s	ovei4
		move.w	d4,d3
		neg.w	d3
ovei4
		move.w	d5,d0
		bpl.s	ovei5
		neg.w	d0
ovei5		move.w	d6,d1
		bpl.s	ovei6
		neg.w	d1
ovei6		move.w	d5,d2
		cmp.w	d1,d0
		bls.s	ovei7
		move.w	d6,d2
		neg.w	d2
	
ovei7		lea	Arcustan(pc),a4
		asl.w	#1,d2
		asl.w	#1,d3
		cmp.w	#-128,d3
		bge	ovei8
		move.w	#-29,d0
		bra	ovei10
ovei8		cmp.w	#126,d3
		ble	ovei9
		move.w	#29,d0
		bra	ovei10
ovei9		move.w	0(a4,d3.w),d0
ovei10		cmp.w	#-128,d2
		bge	ovei11
		move.w	#-29,d1
		bra	ovei13
ovei11		cmp.w	#126,d2
		ble	ovei12
		move.w	#29,d1
		bra	ovei13
ovei12		move.w	0(a4,d2.w),d1
ovei13		
		

;d3.library address a2		
		sub.w	60(a2),d0		;dx arcus
		sub.w	62(a2),d1		;dy arcus
		cmp.w	#64,d0

		muls.w	d0,d0
		muls.w	d1,d1
		add.w	d1,d0
		bsr	Square
		cmp.w	#32,d0
		bne	ovei15
		move.w	#33,d0
ovei15		cmp.w	#64,d0
		blt	ovei16
		move.w	#128,d1
		sub.w	d0,d1
		move.w	d1,d0

ovei16		tst.w	d0
		bne	ovei17
		addq.w	#1,d0		
ovei17		move.l  (sp)+,a4
		rts
		
		

		dc.w	-28,-28,-28,-28,-28,-27,-27,-27
		dc.w	-27,-27,-27,-27,-27,-27,-27,-26
		dc.w	-26,-26,-26,-26,-26,-26,-25,-25
		dc.w	-25,-25,-25,-25,-24,-24,-23,-23
		dc.w	-23,-22,-22,-22,-22,-21,-21,-21
		dc.w	-20,-20,-20,-19,-19,-18,-18,-17
		dc.w	-16,-15,-15,-14,-14,-13,-12,-11
		dc.w	-10,-09,-08,-07,-06,-04,-02,-01

Arcustan	dc.w	00,01,02,04,06,07,08,09
		dc.w	10,11,12,13,14,14,15,15
		dc.w	16,17,18,18,19,19,20,20
		dc.w	20,21,21,21,22,22,22,22
		dc.w	23,23,23,24,24,25,25,25
		dc.w	25,25,25,26,26,26,26,26
		dc.w	26,26,27,27,27,27,27,27
		dc.w	27,27,27,27,28,28,28,28

	

Square		movem.l	d1-d3/d7,-(sp)
		moveq	#0,d1
		moveq	#0,d2
		moveq	#0,d3
		moveq	#15,d7

loopgt		asl.l	#1,d0
		roxl.l	#1,d2
		asl.l	#1,d0
		roxl.l	#1,d2

		asl.l	#1,d1
		asl.l	#1,d3
		cmp.l	d3,d2
		bls.s	zerobg
		addq.l	#1,d1
		addq.l	#1,d3
		sub.l	d3,d2
		addq.l	#1,d3
zerobg		dbf	d7,loopgt
		move.l	d1,d0

		movem.l	(sp)+,d1-d3/d7
		rts	


Colorwindow	movem.l	d2-d7/a3-a6,-(sp)	
		move.l	a6,a5
		subq.w	#1,d0
		cmp.w	#3,d0
		bhi	exitsg
		lea	256(a6),a4
		ext.l	d0			;d3membuf
		asl.l	#7,d0
		add.l	d0,a4
		move.l	MemBuf(a4),d0
		move.l	d0,a3
		tst.l	d0
		beq	exitsg
		move.l	a6,a2			;d3base
		move.w	#0,d3
		move.w	#0,d4
loopbgh		
		move.w	(a3),d2
		cmp.w	#$7fff,d2
		beq	noplot
		movem.w	d3/d4,-(sp)
		bsr	colorit
		move.l	_GfxBase(a5),a6
		move.l	Rp(a4),a1
		jsr	_LVOSetAPen(a6)
		movem.w	(sp)+,d3/d4
		move.w	d3,d1			;y
		move.w	d4,d0			;x
		move.l	a5,a6
		move.l	_GfxBase(a5),a6
		move.l	Rp(a4),a1
		jsr	_LVOWritePixel(a6)
noplot		add.l	#2,a3
		addq.w	#1,d3
		cmp.w	boty(a4),d3
		bne	loopbgh
		move.w	#0,d3
		addq.w	#1,d4
		cmp.w	botx(a4),d4
		bne	loopbgh
exitsg		movem.l	(sp)+,d2-d7/a3-a6
		rts		

Lightarcus
		move.l	d2,-(sp)
		lea	256(a6),a1
		ext.l	d2
		subq.l	#1,d2
		cmp.l	#3,d2
		bhi	fgty
		asl.l	#7,d2
		add.l	d2,a1
		asl.w	#2,d0
		asr.w	#6,d0
		asr.w	#3,d0
		move.w	d0,dxarcus(a6)
		move.w	d0,dxarcus(a1)
		asl.w	#2,d1
		asr.w	#6,d1
		asr.w	#3,d1
		move.w	d1,dyarcus(a6)
		move.w	d1,dyarcus(a1)
fgty		move.l	(sp)+,d2
		rts	


colormount				;calculate new color component
		move.w	#$0f,d0
		sub.w	d1,d0
		move.w	#$0f,d1
		sub.w	d2,d1
		muls.w	d1,d0
		divs.w	#$0f,d0
		move.w	#$0f,d1
		sub.w	d0,d1
		rts

colordif					;seperate color
		move.w	d1,d3
		and.w	#$000f,d3		;blue	
		asr.w	#4,d1
		move.w	d1,d4
		and.w	#$000f,d4		;green
		asr.w	#4,d1
		move.w	d1,d5
		and.w	#$000f,d5		;red
		rts

Colorset
		movem.l	d2-d7/a2-a6,-(sp)
		move.l	a6,a5
		link	a4,#-12

		move.l	a6,a2			;d3base
		add.l	#$80,a2			;address colorlist
		move.l	a2,-(sp)
		
		move.w	d1,(a2)+		;background color
		move.w	d0,d1
		bsr	colordif
		move.w	d3,-8(a4)		;blue
		move.w	d4,-10(a4)		;green
		move.w	d5,-12(a4)		;red
		lea	colorlist(pc),a3
		add.l	#2,a3
		moveq	#30,d7
loopedf		move.w	(a3)+,d1
		bsr	colordif
		move.w	d3,-2(a4)		;blue
		move.w	d4,-4(a4)		;green
		move.w	d5,-6(a4)		;red
	
		move.w	-8(a4),d1
		move.w	-2(a4),d2		;blue
		bsr	colormount
		move.w	d1,-2(a4)
		
		move.w	-10(a4),d1
		move.w	-4(a4),d2		;green
		bsr	colormount
		move.w	d1,-4(a4)
		
		move.w	-12(a4),d1
		move.w	-6(a4),d2		;red
		bsr	colormount
			
		asl.w	#4,d1
		add.w	-4(a4),d1
		asl.w	#4,d1
		add.w	-2(a4),d1
		move.w	d1,(a2)+
		dbf	d7,loopedf

		
;colorsetting
		move.l	a5,a6			;gfxbase a6
		bsr	GfxRp

		lea.l	44(a0),a0	;viewport structure address


		moveq	#32,d0			;number of color
		move.l	(sp)+,a1
		jsr	_LVOLoadRGB4(a6)
		unlk	a3
		unlk	a4
		movem.l	(sp)+,d2-d7/a2-a6
		rts


colorlist	dc.w	$03bc
		dc.w	$0fff
		dc.w	$0ffe
		dc.w	$0fee

		dc.w	$0eed
		dc.w	$0edd
		dc.w	$0ddc
		dc.w	$0dcc

		dc.w	$0ccb
		dc.w	$0cbb
		dc.w	$0bba
		dc.w	$0baa

		dc.w	$0aa9
		dc.w	$0a99
		dc.w	$0998
		dc.w	$0988

		dc.w	$0887
		dc.w	$0877
		dc.w	$0776
		dc.w	$0766

		dc.w	$0665
		dc.w	$0655
		dc.w	$0554
		dc.w	$0544

		dc.w	$0443
		dc.w	$0433
		dc.w	$0332
		dc.w	$0322

		dc.w	$0221
		dc.w	$0211
		dc.w	$0110
		dc.w	$0000
		ds.l	0


D3colorline
		rts
					
xpoint		equ	-2			;kirjaimen alkukoordinatit
ypoint		equ	-4
zpoint		equ	-6
size		equ	-8			;size of letter
addr1		equ	-10
addr2		equ	-12
xtemp		equ	-14
ytemp		equ	-16
ztemp		equ	-18
begin		equ	-20
ends		equ	-22
xmove		equ	-24
ymove		equ	-26
flag		equ	-28
s12		equ	-30
s2		equ	-32
s32		equ	-34
s52		equ	-36
s72		equ	-38
vinous		equ	-40
D3buffer	equ	-44
s14		equ	-46
s74		equ	-48
s4		equ	-50

D3print
		movem.l	d2-d7/a2-a6,-(sp)
		link	a4,#-56
		
		move.w	(a0),xpoint(a4)
		move.w	2(a0),ypoint(a4)
		move.w	4(a0),zpoint(a4)
		move.w	6(a0),d0
		move.w	d0,size(a4)
		asr.w	#1,d0
		move.w	d0,s12(a4)
		move.w	d0,d1
		asr.w	#1,d1
		move.w	d1,s14(a4)
		muls.w	#7,d1
		move.w	d1,s74(a4)
		add.w	size(a4),d0
		move.w	d0,s32(a4)
		add.w	s12(a4),d0
		move.w	d0,s2(a4)
		add.w	s12(a4),d0
		move.w	d0,s52(a4)
		add.w	size(a4),d0
		move.w	d0,s72(a4)
		add.w	s12(a4),d0
		move.w	d0,s4(a4)
		move.l	a1,a2
		
nextletter	move.b	(a2)+,d0
		beq	exit	
		sub.b	#32,d0
		bmi.s	nextletter
		cmp.b	#96,d0
		bge.s	nextletter
		ext.w	d0
		asl.w	#2,d0
		lea	letters(pc),a0
		jsr	0(a0,d0.w)
		bra	nextletter

exit		unlk	a4
		movem.l	(sp)+,d2-d7/a2-a6
		rts

letters
		bra	SPACE
		bra	HUUTO
		bra	LAINAUS
		bra	RUKSI
		bra	TAALA
		bra	PROSENTTI
		bra	PYKALA
		bra	HEITTO
		bra	VKAARI
		bra	OKAARI
		bra	KERTO
		bra	PLUS
		bra	PILKKU
		bra	MIINUS
		bra	PISTE
		bra	JAKO
		bra	NOLLA
		bra	YKSI
		bra	KAKSI
		bra	KOLME
		bra	NELJA
		bra	VIISI
		bra	KUUSI
		bra	SEITSEMAN
		bra	KAHDEKSAN
		bra	YHDEKSAN
		bra	KAKSOISPISTE
		bra	KAKSOISPILKKU
		bra	ISOMPI
		bra	YHTA
		bra	PIENEMPI
		bra	KYSYMYS

		bra	SPACE
		bra	AA
		bra	BB
		bra	CC
		bra	DD
		bra	EE
		bra	FF
		bra	GG
		bra	HH
		bra	II
		bra	JJ
		bra	KK
		bra	LL
		bra	MM
		bra	NN
		bra	OO
		bra	PP
		bra	QQ
		bra	RR
		bra	SS
		bra	TT
		bra	UU	
		bra	VV
		bra	WW
		bra	XX
		bra	YY
		bra	ZZ
		bra	vhaka
		bra	vviiva
		bra	ohaka
		bra	karki
		bra	aviiva
		bra	SPACE
		bra	aa
		bra	bb
		bra	cc
		bra	dd
		bra	ee
		bra	ff
		bra	gg
		bra	hh
		bra	ii
		bra	jj
		bra	kk
		bra	ll
		bra	mm
		bra	nn
		bra	oo
		bra	pp
		bra	qq
		bra	rr
		bra	ss
		bra	tt
		bra	uu
		bra	vv
		bra	ww
		bra	xx
		bra	yy
		bra	zz
		bra	zz
		bra	zz
		bra	zz
		bra	zz

siirto4
		move.w	xpoint(a4),d0
		add.w	s4(a4),d0
		move.w	d0,xpoint(a4)
		rts

pystypuu	move.w	s52(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s52(a4),ends(a4)
		rts

SPACE
		bra	siirto72

HUUTO
		move.w	size(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s52(a4),ends(a4)
		move.w	s12(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)
		bsr	pipe
		
		bra	PISTE
		
kaksiviiva	move.w	s52(a4),ends(a4)
		move.w	s14(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)
		bsr	pipe
		move.w	s74(a4),xmove(a4)
		bra	pipe

LAINAUS
		move.w	size(a4),begin(a4)
		bsr	kaksiviiva
		bra	siirto4

RUKSI
		move.w	s52(a4),begin(a4)
		neg.w	begin(a4)
		bsr	kaksiviiva

yhtasuuri	move.w	s12(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s52(a4),ends(a4)
		move.w	size(a4),ymove(a4)
		move.w	#0,xmove(a4)
		move.w	#-1,flag(a4)
		bsr	pipe
		
		neg.w	ymove(a4)
		bsr	pipe
		bra	siirto4

TAALA
		move.w	s52(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s52(a4),ends(a4)
		move.w	size(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)
		bsr	pipe
		bra	SS

PROSENTTI
		move.w	#0,begin(a4)
		move.w	#$4000,ends(a4)
		move.w	s14(a4),xmove(a4)
		move.w	s74(a4),ymove(a4)
		bsr	sring

		move.w	s74(a4),xmove(a4)
		neg.w	ymove(a4)
		bsr	sring
		bra	JAKO

PYKALA
		move.w	s52(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s12(a4),ends(a4)
		move.w	s2(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#-6,vinous(a4)
		bsr	vinopipe

		move.w	#$3000,begin(a4)
		move.w	#$6000,ends(a4)
		move.w	size(a4),xmove(a4)
		move.w	s12(a4),ymove(a4)
		bsr	sring

		move.w	#$1000,begin(a4)
		move.w	#$3900,ends(a4)
		move.w	size(a4),ymove(a4)
		neg.w	ymove(a4)
		bsr	ring
		bra	siirto4

HEITTO
		move.w	s72(a4),ymove(a4)
		bsr	heittoj
		bra	siirto72
VKAARI
		move.w	#$1600,begin(a4)
		move.w	#$2a00,ends(a4)
		move.w	s72(a4),xmove(a4)
okaarij		move.w	#0,ymove(a4)
		move.w	s52(a4),flag(a4)
		move.w	s12(a4),vinous(a4)
		bsr	fring
		bra	siirto4

OKAARI		
		move.w	#$3600,begin(a4)
		move.w	#$4a00,ends(a4)
		move.w	s74(a4),xmove(a4)
		neg.w	xmove(a4)
		bra	okaarij
KERTO
		move.w	s32(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s32(a4),ends(a4)
		move.w	s14(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#7,vinous(a4)
		bsr	vinopipe

		move.w	s74(a4),xmove(a4)
		neg.w	vinous(a4)
		bsr	vinopipe
		bra	MIINUS
PLUS
		move.w	s32(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s32(a4),ends(a4)
		move.w	size(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)
		bsr	pipe
		bra	MIINUS
PILKKU
		bsr	pilkkuj
		bra	PISTE

pilkkuj		move.w	s52(a4),ymove(a4)
		neg.w	ymove(a4)
heittoj		move.w	s12(a4),xmove(a4)
		move.w	#$3000,begin(a4)
		move.w	#$5000,ends(a4)
		move.w	s12(a4),flag(a4)
		move.w	s14(a4),vinous(a4)
		bra	fring
		

MIINUS
		move.w	#0,ymove(a4)
		bsr	keskiviiva
		bra	siirto4

PISTE
		move.w	s12(a4),xmove(a4)
		move.w	s2(a4),ymove(a4)
		neg.w	ymove(a4)
		bsr	ball
		bra	siirto52
JAKO
		move.w	s52(a4),ends(a4)
		move.w	#0,ymove(a4)
		bra	zjatko
NOLLA
		bsr	OO
		move.w	xpoint(a4),d0
		sub.w	s4(a4),d0
		move.w	d0,xpoint(a4)
		move.w	s52(a4),ends(a4)
		bra	zjatko
YKSI
		bsr	pystypuu
		move.w	size(a4),xmove(a4)
		bra	yksijatko

KAKSI
		move.w	#0,begin(a4)
		move.w	s2(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	s2(a4),ymove(a4)
		neg.w	ymove(a4)
		move.w	#-1,flag(a4)
		
		bsr	pipe
		bra	YHDEKSAN

KOLME
		bsr	ylaviiva

		move.w	#0,begin(a4)
		move.w	s52(a4),ends(a4)
		move.w	#0,ymove(a4)
		move.w	size(a4),xmove(a4)
		move.w	#6,vinous(a4)
		bsr	vinopipe
		move.w	size(a4),ymove(a4)
		move.w	size(a4),xmove(a4)
		bra	kolmejatko
		
NELJA
		move.w	s12(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s52(a4),ends(a4)
		bra	neljajatko

ylarengas
		move.w	#0,begin(a4)
		move.w	#$4000,ends(a4)
		move.w	size(a4),xmove(a4)
		move.w	size(a4),ymove(a4)
		bra	ring

VIISI
		bsr	ylaviiva
		move.w	size(a4),ends(a4)
		move.w	#0,ymove(a4)
		bsr	pipe
	
		move.w	s12(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s52(a4),ends(a4)
		move.w	#0,flag(a4)
		bsr	pipe
		move.w	size(a4),ymove(a4)
		move.w	size(a4),xmove(a4)
		bra	kolmejatko
KUUSI
		move.w	s12(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s52(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#8,vinous(a4)
		bsr	vinopipe

		bra	oo


ylaviiva	move.w	s2(a4),ymove(a4)
keskiviiva	move.w	s12(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s52(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	#-1,flag(a4)
		bra	pipe

SEITSEMAN
		bsr	ylaviiva
		bra	seitsemanjatko
KAHDEKSAN
		bsr	ylarengas
		bra	oo

YHDEKSAN
		move.w	s52(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s12(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#8,vinous(a4)

		bsr	vinopipe

		bsr	ylarengas
		bra	siirto4

KAKSOISPISTE
		move.w	s12(a4),xmove(a4)
		move.w	#0,ymove(a4)
		bsr	ball

		bra	PISTE

KAKSOISPILKKU
		move.w	s12(a4),xmove(a4)
		move.w	#0,ymove(a4)
		bsr	ball
		
		bra	PILKKU
ISOMPI
		bsr	ivii1
		bsr	ivii2
		bra	siirto72

ivii1		move.w	#0,ymove(a4)
pvii1		move.w	#0,xmove(a4)
		move.w	#0,begin(a4)
		move.w	s32(a4),ends(a4)
		move.w	#12,vinous(a4)
		bra	vinopipe

ivii2		move.w	s32(a4),ymove(a4)
pvii2		move.w	s74(a4),xmove(a4)
		neg.w	ymove(a4)
		move.w	#-12,vinous(a4)
		bra	vinopipe

YHTA
		bra	yhtasuuri
PIENEMPI
		move.w	s32(a4),ymove(a4)
		neg.w	ymove(a4)
		bsr	pvii1
		move.w	#0,ymove(a4)
		bsr	pvii2
		bra	siirto72
		
KYSYMYS
		move.w	#$3000,begin(a4)
		move.w	#$5800,ends(a4)
		move.w	size(a4),xmove(a4)
		move.w	size(a4),ymove(a4)
		bsr	ring

		move.w	#$1000,begin(a4)
		move.w	#$3800,ends(a4)
		move.w	s12(a4),ymove(a4)
		neg.w	ymove(a4)
		bsr	sring

		move.w	s2(a4),ymove(a4)
		neg.w	ymove(a4)
		bsr	ball
		bra	siirto4

AA
		
		move.w	s52(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s52(a4),ends(a4)
		move.w	s2(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#-2,vinous(a4)
		
		bsr	vinopipe		;

		move.w	#0,xmove(a4)
		move.w	#2,vinous(a4)

		bsr	vinopipe

		move.w	#0,begin(a4)
		move.w	s2(a4),ends(a4)
		move.w	size(a4),ymove(a4)
		neg.w	ymove(a4)
		
		move.w	#-1,flag(a4)

		bsr	pipe
		bra	siirto4

		move.w	size(a4),d0
		move.w	d0,ends(a4)
	
hjatko		
neljajatko	move.w	#0,xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)		;vertical

		bsr	pipe			;left feet

		bsr	pystypuu
		move.w	s2(a4),xmove(a4)
		move.w	#0,flag(a4)		;vertigal

		bsr	pipe
				
		move.w	#0,begin(a4)		;poikkipuu
		move.w	s2(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#-1,flag(a4)
		bsr	pipe

siirto72		move.w	s72(a4),d1
		add.w	xpoint(a4),d1
		move.w	d1,xpoint(a4)
		rts

BB
		move.w	size(a4),xmove(a4)
		move.w	size(a4),ymove(a4)
		move.w	#$3000,begin(a4)
		move.w	#$5000,ends(a4)

		bsr	ring
		
		neg.w	ymove(a4)

		bsr	ring

;poikkipuut
	
		move.w	size(a4),ends(a4)
ejatko		move.w	s2(a4),ymove(a4)
		move.w	#0,xmove(a4)
		move.w	#0,begin(a4)
		move.w	#-1,flag(a4)
		
		neg.	ymove(a4)

		bsr	pipe			;alasakara

		neg.w	ymove(a4)

pjatko
fjatko		bsr	pipe			;ylasakara

		move.w	#0,ymove(a4)

		bsr	pipe			;keskisakara

;pystypuu		
kjatko
ljatko	
njatko		bsr	pystypuu
	
		move.w	#0,xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)

		bsr	pipe
		bra	siirto4


CC
gjatko
ojatko		move.w	size(a4),xmove(a4)
		move.w	size(a4),ymove(a4)
		move.w	#0,begin(a4)
		move.w	#$2000,ends(a4)

		bsr	ring

		neg.w	ymove(a4)
		move.w	#$2000,begin(a4)
		move.w	#$4000,ends(a4)

		bsr	ring

		move.w	size(a4),begin(a4)
		move.w	size(a4),ends(a4)
		neg.w	begin(a4)
		move.w	#0,xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)

		bsr	pipe
		bra	siirto4

DD
		move.w	size(a4),xmove(a4)
		move.w	size(a4),ymove(a4)
		move.w	#0,begin(a4)
		move.w	#$1000,ends(a4)
		
		bsr	ring

		move.w	#$3000,begin(a4)
		move.w	#$4000,ends(a4)
		neg.w	ymove(a4)

		bsr	ring

		move.w	size(a4),begin(a4)
		neg.w	begin(a4)
		move.w	size(a4),ends(a4)
		move.w	s2(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)

		bsr	pipe

vhjatko		move.w	#0,begin(a4)
		move.w	size(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	s2(a4),ymove(a4)
		move.w	#-1,flag(a4)

		bsr	pipe

		bra	djatko
EE	
		move.w	s2(a4),ends(a4)
		bra	ejatko

FF		move.w	s2(a4),ends(a4)
		move.w	s2(a4),ymove(a4)
		move.w	#0,xmove(a4)
		move.w	#0,begin(a4)
		move.w	#-1,flag(a4)
		bra	fjatko

GG
		move.w	s12(a4),begin(a4)
		move.w	s2(a4),ends(a4)
		move.w	s12(a4),xmove(a4)
		move.w	s12(a4),ymove(a4)
		neg.w	ymove(a4)
		move.w	#-1,flag(a4)

		bsr	pipe

		move.w	s2(a4),xmove(a4)
		move.w	s52(a4),ymove(a4)
		neg.w	ymove(a4)
		move.w	#0,flag(a4)

		bsr	pipe
		bra	gjatko
HH
		bsr	pystypuu
		bra	hjatko


II
		bsr	pystypuu
	
		move.w	s12(a4),xmove(a4)
yksijatko	move.w	#0,ymove(a4)
		move.w	#0,flag(a4)

		bsr	pipe

siirto52	move.w	xpoint(a4),d0
		add.w	s52(a4),d0
		move.w	d0,xpoint(a4)
		rts
		
JJ
ujatko		move.w	size(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s52(a4),ends(a4)
		move.w	s2(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)

		bsr	pipe

		move.w	size(a4),xmove(a4)
		move.w	size(a4),ymove(a4)
		neg.w	ymove(a4)
		move.w	#$2000,begin(a4)
		move.w	#$4000,ends(a4)

		bsr	ring
		bra	siirto4	

KK
		move.w	#0,begin(a4)
		move.w	s52(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#10,vinous(a4)

		bsr	vinopipe

		move.w	s52(a4),begin(a4)
		neg.w	begin(a4)
		move.w	#0,ends(a4)
		move.w	s2(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#-10,vinous(a4)

		bsr	vinopipe
		
		bra	kjatko

LL
		move.w	s2(a4),ends(a4)
djatko		move.w	#0,begin(a4)
		move.w	#0,xmove(a4)
		move.w	s2(a4),ymove(a4)
		neg.w	ymove(a4)
		move.w	#-1,flag(a4)

		bsr	pipe
		bra	ljatko

MM
		bsr	pystypuu

		move.w	s72(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)

		bsr	pipe

		move.w	s2(a4),xmove(a4)
		move.w	#3,vinous(a4)

		bsr	vinopipe
		
		move.w	#-4,vinous(a4)

		bsr	vinopipe

		move.w	#0,xmove(a4)

		bsr	pipe

		move.w	xpoint(a4),d0
		add.w	size(a4),d0
		move.w	d0,xpoint(a4)
		bra	siirto4		

NN		bsr	pystypuu

		move.w	s2(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)

		bsr	pipe

mjatke		move.w	#-4,vinous(a4)

		bsr	vinopipe
		bra	njatko
OO
qjatko		move.w	size(a4),begin(a4)
		move.w	size(a4),ends(a4)
		neg.w	begin(a4)
		move.w	s2(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)

		bsr	pipe
		bra	ojatko

PP
rjatko		move.w	size(a4),xmove(a4)
		move.w	size(a4),ymove(a4)
		move.w	#$3000,begin(a4)
		move.w	#$5000,ends(a4)

		bsr	ring
		
		move.w	#0,begin(a4)
		move.w	size(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	s2(a4),ymove(a4)
		move.w	#-1,flag(a4)

		bra	pjatko

QQ
		move.w	#0,begin(a4)
		move.w	s2(a4),ends(a4)
		move.w	s2(a4),xmove(a4)
		move.w	s2(a4),ymove(a4)
		neg.w	ymove(a4)
		move.w	#-10,vinous(a4)

		bsr	vinopipe
		bra	qjatko
RR
		move.w	s52(a4),begin(a4)
		neg.w	begin(a4)
		move.w	#0,ends(a4)
		move.w	s52(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#-10,vinous(a4)

		bsr	vinopipe
		bra	rjatko
SS
		move.w	#$0300,begin(a4)
		move.w	#$3000,ends(a4)
		move.w	size(a4),xmove(a4)
		move.w	size(a4),ymove(a4)

		bsr	ring

kolmejatko	move.w	#$2100,begin(a4)
		move.w	#$5000,ends(a4)
		neg.w	ymove(a4)

		bsr	ring
		bra	siirto4

TT
		bsr	pystypuu
	
		move.w	size(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)
		
		bsr	pipe

		move.w	s2(a4),ymove(a4)
avjatko		move.w	s12(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s2(a4),d0
		add.w	s12(a4),d0
		move.w	d0,ends(a4)
		move.w	#0,xmove(a4)
		move.w	#-1,flag(a4)

		bsr	pipe
		bra	siirto4

UU
		move.w	size(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s52(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)

		bsr	pipe
		bra	ujatko

VV
		bsr	vee
		bra	siirto72

vee		bsr	pystypuu

		move.w	size(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#-2,vinous(a4)

		bsr	vinopipe

		move.w	#2,vinous(a4)

		bsr	vinopipe
		rts

WW
		bsr	vee
		move.w	xpoint(a4),d0
		add.w	s32(a4),d0
		move.w	d0,xpoint(a4)

		bsr	vee
		bra	siirto4

XX
		bsr	vvijatko
		bra	yjatko

vvijatko	bsr	pystypuu
	
		move.w	s2(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#-5,vinous(a4)

		bra	vinopipe
	
yjatko		move.w	#0,xmove(a4)
		move.w	#5,vinous(a4)

		bsr	vinopipe
		bra	siirto4

YY
		move.w	#0,begin(a4)
		move.w	s52(a4),ends(a4)
		move.w	size(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#-5,vinous(a4)

		bsr	vinopipe

zjatko		move.w	s52(a4),begin(a4)
		neg.w	begin(a4)
		
		bra	yjatko

ZZ
		move.w	#0,begin(a4)
		move.w	s2(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	s2(a4),ymove(a4)
		move.w	#-1,flag(a4)

		bsr	pipe

		neg.w	ymove(a4)

seitsemanjatko	bsr	pipe

		move.w	s52(a4),ends(a4)
		move.w	#0,ymove(a4)

		bra	zjatko	

vhaka
		bra	vhjatko

vviiva
		bsr	vvijatko
		bra	siirto72

ohaka
		bsr	pystypuu
		move.w	s2(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)

		bsr	pipe

		move.w	s12(a4),begin(a4)
		move.w	s2(a4),ends(a4)
		move.w	s2(a4),ymove(a4)
		move.w	#0,xmove(a4)
		move.w	#-1,flag(a4)

		bsr	pipe

		neg.w	ymove(a4)
		
		bsr	pipe
		bra	siirto72

karki
		move.w	#0,begin(a4)
		move.w	s52(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#5,vinous(a4)
		bsr	vinopipe

		move.w	s2(a4),xmove(a4)
		move.w	#-5,vinous(a4)

		bsr	vinopipe
		bra	siirto72
aviiva
		move.w	s2(a4),ymove(a4)
		neg.w	ymove(a4)
		bra	avjatko	

pystyviiva	move.w	#0,xmove(a4)
pystyyn		bsr	pystypuu
	
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)
		bra	pipe


ajatku		move.w	s12(a4),ends(a4)
djatku		move.w	s52(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s2(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)
		
		bsr	pipe
		rts

brengas		move.w	#$2600,begin(a4)
		move.w	#$5a00,ends(a4)
		bra	bjatka

crengas		move.w	#$0600,begin(a4)
		move.w	#$3c00,ends(a4)
bjatka		move.w	size(a4),xmove(a4)
		move.w	size(a4),ymove(a4)
		neg.w	ymove(a4)

		bra	ring	

aa
		bsr	ajatku
		bsr	crengas
		bra	siirto72
bb
		bsr	pystyviiva

		bsr	brengas
		bra	siirto72
cc
		bsr	crengas
		bra	siirto72

dd
		bsr	crengas
		move.w	s52(a4),ends(a4)
		
		bsr	djatku	
		bra	siirto72
ee
		move.w	s12(a4),begin(a4)
		move.w	s2(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	s12(a4),ymove(a4)
		neg.w	ymove(a4)
		move.w	#-1,flag(a4)

		bsr	pipe		
		bsr	crengas
		bra	siirto72

ff
		move.w	size,xmove(a4)
		bsr	pystyyn
		move.w	s12(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s32(a4),ends(a4)
		move.w	#-1,flag(a4)

		bsr	pipe
		bra	siirto72

gg
		bsr	crengas
		bra	gjatku

hh
		bsr	pystyviiva
		
njatku		move.w	#$0,begin(a4)
		move.w	#$1a00,ends(a4)
		bsr	bjatka

		move.w	size(a4),ends(a4)
		neg.w	ends(a4)

		bsr	djatku
		bra	siirto72


iviiva		move.w	s52(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s12(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)
		
		bra	pipe

ii
		bsr	iviiva
siirto2		move.w	xpoint(a4),d0
		add.w	s2(a4),d0
		move.w	d0,xpoint(a4)
		rts

jj
gjatku		move.w	s2(a4),d0
		add.w	size(a4),d0
		neg.w	d0
		move.w	d0,begin(a4)
		move.w	d0,-(sp)
		move.w	#0,ends(a4)
		move.w	s2(a4),xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)

		bsr	pipe

		move.w	#$2800,begin(a4)
		move.w	#$4000,ends(a4)
		move.w	size(a4),xmove(a4)
		move.w	(sp)+,ymove(a4)

		bsr	ring
		bra	siirto72
	
kk		
		move.w	#0,begin(a4)
		move.w	size(a4),ends(a4)
		move.w	s32(a4),xmove(a4)
		move.w	s52(a4),ymove(a4)
		neg.w	ymove(a4)
		move.w	#-12,vinous(a4)

		bsr	vinopipe

		move.w	#0,xmove(a4)
		move.w	size(a4),ymove(a4)
		neg.w	ymove(a4)
		move.w	#10,vinous(a4)

		bsr	vinopipe
		bsr	pystyviiva
		bra	siirto72
	
ll
		bsr	pystyviiva
		bra	siirto2

mm
		bsr	nn
		move.w	xpoint(a4),d0
		sub.w	s32(a4),d0
		move.w	d0,xpoint(a4)
		bra	mjatku	
nn
		move.w	s52(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s12(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)

		bsr	pipe

mjatku		bra	njatku


oo
		move.w	#0,begin(a4)
		move.w	#$4000,ends(a4)
		bsr	bjatka
		bra	siirto72

pp
		bsr	brengas
		move.w	#0,xmove(a4)
		bsr	pviiva
		bra	siirto72

pviiva
		move.w	#0,xmove(a4)
qviiva		move.w	#0,ymove(a4)
		move.w	s72(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s12(a4),ends(a4)
		move.w	#0,flag(a4)

		bra	pipe
qq
		move.w	s2(a4),xmove(a4)
		bsr	qviiva

		bsr	crengas
		bra	siirto72

rr
		bsr	iviiva
		move.w	#$0600,begin(a4)
		move.w	#$1a00,ends(a4)

		bsr	bjatka
		bra	siirto72

ss
		move.w	#$0600,begin(a4)
		move.w	#$3000,ends(a4)
		move.w	size(a4),xmove(a4)
		move.w	s12(a4),ymove(a4)
		neg.w	ymove(a4)

		bsr	sring
		move.w	#$2100,begin(a4)
		move.w	#$5000,ends(a4)
		move.w	s32(a4),ymove(a4)
		neg.w	ymove(a4)
		
		bsr	sring
		bra	siirto72
tt		
		move.w	size(a4),xmove(a4)
		bsr	pystyyn

		move.w	#0,begin(a4)
		move.w	s2(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	s12(a4),ymove(a4)
		move.w	#-1,flag(a4)

		bsr	pipe
		bra	siirto72

uu
		bsr	uviiva
		move.w	s52(a4),begin(a4)
		neg.w	begin(a4)
		move.w	s2(a4),xmove(a4)

		bsr	uuviiva
		move.w	#$2000,begin(a4)
		move.w	#$3a00,ends(a4)
		bsr	bjatka
		bra	siirto72

uviiva		move.w	#0,xmove(a4)
		move.w	size(a4),begin(a4)
		neg.w	begin(a4)
uuviiva		move.w	#0,ends(a4)
		move.w	#0,ymove(a4)
		move.w	#0,flag(a4)

		bra	pipe
		
vv
		move.w	#5,vinous(a4)
		bsr	vvino
		
		move.w	#-5,vinous(a4)
		bsr	vvino
		bra	siirto72

vvino
		move.w	size(a4),xmove(a4)
xvino		move.w	#0,ymove(a4)
		move.w	s52(a4),begin(a4)
		neg.w	begin(a4)
		move.w	#0,ends(a4)
		
		bra	vinopipe

ww
		bsr	vv
		move.w	xpoint(a4),d0
		sub.w	s2(a4),d0
		move.w	d0,xpoint(a4)
		bra	vv

xx
		move.w	s2(a4),xmove(a4)
		move.w	#-10,vinous(a4)
		bsr	xvino
zvino		move.w	#0,xmove(a4)
		move.w	#10,vinous(a4)
		bsr	xvino
		bra	siirto72
yy
		bsr	uviiva
		move.w	#$2000,begin(a4)
		move.w	#$3a00,ends(a4)
		bsr	bjatka
		bra	jj

zz
		move.w	#0,begin(a4)
		move.w	s2(a4),ends(a4)
		move.w	#0,xmove(a4)
		move.w	#0,ymove(a4)
		move.w	#-1,flag(a4)

		bsr	pipe

		move.w	s2(a4),ymove(a4)
		neg.w	ymove(a4)
		bsr	pipe

		move.w	s2(a4),ymove(a4)
		neg.w	ymove(a4)
		bra	zvino	


;rengaan piirto		
ball
		move.w	#0,d3
		move.w	#$2000,ends(a4)
		move.w	#0,d5
		move.w	s12(a4),d6
		bra	srhm
fring
		move.w	flag(a4),d5
		move.w	vinous(a4),d6
		bra	srhn
sring
		move.w	s12(a4),d5
		move.w	s12(a4),d6
		bra	srhn

ring						
		move.w	size(a4),d5		;size of letter
		move.w	s12(a4),d6
	
srhn		
		move.w	begin(a4),d3
srhm		move.w	#0,d4	
		move.w	d6,d0
		bne.s	ovecr
		move.w	#16,d0
ovecr		move.l	#$8000,d1
		divu.w	d0,d1
		add.w	#2,d1
		move.w	d1,addr1(a4)				;lisays	

		move.w	d5,d0
		bne.s	ovect
		move.w	#16,d0
ovect		move.l	#$4000,d1
		divu.w	d0,d1
		add.w	#2,d1
		move.w	d1,addr2(a4)

loopmj				
		mulcosi	d6,d4
		move.w	d0,-(sp)
		add.w	d5,d0
		move.w	d0,d2
		mulcosi	d2,d3
		move.w	d0,xtemp(a4)			;x
		
		move.w	(sp)+,d0
		add.w	d5,d0
		move.w	d0,d2
		mulsini	d2,d3
		move.w	d0,ytemp(a4)			;y
		mulsini	d6,d4			;z*sin(s)
				

		move.w	d0,d2
		add.w	zpoint(a4),d2

		move.w	ytemp(a4),d1
		add.w	ypoint(a4),d1
		add.w	ymove(a4),d1

		move.w	xtemp(a4),d0
		add.w	xpoint(a4),d0
		add.w	xmove(a4),d0
	
		move.l	D3buffer(a4),a0			;D3buf
		bsr	D3colorplot

		add.w	addr1(a4),d4
		cmp.w	#$4000,d4
		ble 	loopmj		
		move.w	#0,d4
		add.w	addr2(a4),d3
		cmp.w	ends(a4),d3
		ble 	loopmj
	
		rts

pipe		move.w	begin(a4),d3
		move.w	size(a4),d6		;radius
		asr.w	#1,d6
		move.w	#0,d4			;angle
		move.w	d6,d0
		move.l	#$8000,d1
		divu.w	d0,d1
		add.w	#2,d1
		move.w	d1,addr1(a4)


loopkn
		mulsini	d6,d4
		move.w	d0,xtemp(a4)

		mulcosi	d6,d4
		move.w	d0,ztemp(a4)

		move.w	d3,d1
		move.w	xtemp(a4),d0

		tst.w	flag(a4)
		beq.s	overk1
		exg	d0,d1

overk1		add.w	ypoint(a4),d1
		add.w	ymove(a4),d1

		add.w	xpoint(a4),d0
		add.w	xmove(a4),d0

		move.w	ztemp(a4),d2
		add.w	zpoint(a4),d2

		move.l	D3buffer(a4),a0
		bsr	D3colorplot

		add.w	addr1(a4),d4
		cmp.w	#$4000,d4
		ble	loopkn

		move.w	#0,d4
		add.w	#12,d3
		cmp.w	ends(a4),d3
		ble	loopkn
		rts

		
vinopipe

		move.w	begin(a4),d3
		move.w	size(a4),d6		;radius
		asr.w	#1,d6
		move.w	#0,d4			;angle
		move.w	d6,d0
		move.l	#$8000,d1
		divu.w	d0,d1
		add.w	#2,d1
		move.w	d1,addr1(a4)
		move.w	#0,d7

loopkm
		mulsini	d6,d4
		move.w	d0,xtemp(a4)

		mulcosi	d6,d4
		move.w	d0,ztemp(a4)

		move.w	d3,d1
		move.w	xtemp(a4),d0

		
		add.w	ypoint(a4),d1
		add.w	ymove(a4),d1

		add.w	xpoint(a4),d0
		add.w	xmove(a4),d0

		move.w	ztemp(a4),d2
		add.w	zpoint(a4),d2
		
		add.w	d7,d0			;vinous
		move.l	D3buffer(a4),a0
		bsr	D3colorplot
		
		add.w	addr1(a4),d4
		cmp.w	#$4000,d4
		ble	loopkm

		add.w	vinous(a4),d7
		move.w	#0,d4
		add.w	#12,d3
		cmp.w	ends(a4),d3
		ble	loopkm
		rts

bx		equ	-2
by		equ	-4
bz		equ	-6
bradius		equ	-8

D3ball
		movem.l	d2-d7/a2-a6,-(sp)
		link	a4,#-24
		move.w	d3,bradius(a4)
		bsr	D3plots			;new	x, y, z
		

		move.w	d0,bx(a4)		;save x koord
		move.w	d1,by(a4)		;save y koord
		move.w	d2,bz(a4)

		move.w	bradius,d0
		bsr	D3proj
		move.w	d0,bradius(a4)		;save radius

		unlk	a4
		movem.l	(sp)+,d2-d7/a2-a6
		rts

sintable		
	


   ; EndCode is a marker that show the end of your code.
   ; Make sure it does not span sections nor is before the
   ; rom tag in memory!  It is ok to put it right after
   ; the rom tag -- that way you are always safe.  I put
   ; it here because it happens to be the "right" thing
   ; to do, and I know that it is safe in this case.
EndCode:

   END
