home *** CD-ROM | disk | FTP | other *** search
- ;
- ; Turtle-Library V3.0
- ;
- ; 04.01.90
- ;
- ; Thomas Albers
- ;
-
- INCDIR "DevpacAm:include/"
-
- INCLUDE "exec.offsets"
- INCLUDE "graphics.offsets"
- INCLUDE "mathffp.offsets"
- INCLUDE "mathtrans.offsets"
-
- INCLUDE "exec/types.i"
- INCLUDE "exec/alerts.i"
- INCLUDE "exec/initializers.i"
- INCLUDE "exec/libraries.i"
- INCLUDE "exec/lists.i"
- INCLUDE "exec/resident.i"
-
- INCLUDE "graphics/rastport.i"
-
- ExecBase = 4
-
-
- ;TurtleBase
-
- STRUCTURE TurtleBase,LIB_SIZE
- ULONG tb_SegList ;pointer to Segment List,
- ULONG tb_GfxBase ; to Graphics Library,
- ULONG tb_FFPBase ; to MathFFP Library,
- ULONG tb_FFPTBase ; and to MathTrans Library
- LABEL TurLib_SIZEOF
-
- ;TurtleHandle
-
- STRUCTURE TurtleHandle,0
- APTR th_RastPort ;pointer to RastPort
- FLOAT th_xPosition ;x Position (FFP)
- FLOAT th_yPosition ;y Position (FFP)
- UWORD th_angle ;angle of Turtle
- UWORD th_xStart ;initial x
- UWORD th_yStart ;initial y
- UWORD th_aStart ;initial angle
- UBYTE th_Flags ;flags
- UBYTE th_FlagStart ;initial flags
- STRUCT th_PointArray,12 ;points of Turtle triangle
- LABEL TurtleHandle_SIZEOF
-
- ;Flags
-
- BITDEF Tur,Hide,0 ;turtle hidden
- BITDEF Tur,Up,1 ;pen Up
- BITDEF Tur,xComp,2 ;x compression
- BITDEF Tur,yComp,3 ;y compression
- BITDEF Tur,TValid,7 ;triangle valid
-
- ;if someone tried to run this
- Start:
- MOVEQ #0,D0
- RTS
-
- Priority = 0
- Version = 3
- Revision = 2
-
- ;Resident structure for Library
- Resident:
- DC.W RTC_MATCHWORD ;magic value
- DC.L Resident ;pointer to beginning
- DC.L EndCode ; and end of structure
- DC.B RTF_AUTOINIT ;type
- DC.B Version ;version
- DC.B NT_LIBRARY ;node type
- DC.B Priority ;priority
- DC.L TurtName ;library name
- DC.L InfoStrg ;info string
- DC.L InitData ;initialisisation data
-
- TurtName DC.B "turtle.library",0
-
- InfoStrg DC.B "turtle.library V3.2 (04 Jan 1990) by Thomas Albers",13,10,0
-
- GfxName DC.B "graphics.library",0
- FFPName DC.B "mathffp.library",0
- FFPTName DC.B "mathtrans.library",0
-
- EVEN
-
-
- InitData:
- DC.L TurLib_SIZEOF ;size of Library base
- DC.L FuncTable ;function table
- DC.L DataTable ;table for InitStruct
- DC.L LibInit ;initialisation routine
-
- FuncTable:
- DC.L Open
- DC.L Close
- DC.L Expunge
- DC.L ExtFunc
- DC.L CreateTurtle
- DC.L ReturnTurtle
- DC.L TurnLeft
- DC.L TurnRight
- DC.L PenUp
- DC.L PenDown
- DC.L HideTurtle
- DC.L ShowTurtle
- DC.L SetAngle
- DC.L SetPosition
- DC.L ResetTurtle
- DC.L Forward
- DC.L -1
-
- DataTable:
- INITBYTE LN_TYPE,NT_LIBRARY
- INITLONG LN_NAME,TurtName
- INITBYTE LIB_FLAGS,LIBF_SUMUSED|LIBF_CHANGED
- INITWORD LIB_VERSION,Version
- INITWORD LIB_REVISION,Revision
- INITLONG LIB_IDSTRING,InfoStrg
- DC.L 0
-
- LibInit:
- ;This routine is called after the library has been loaded from disk
- ;D0: Pointer to Library
- ;A0: Pointer to Segment list
-
- MOVEM.L A5-A6,-(SP)
-
- MOVE.L ExecBase,A6
-
- MOVE.L D0,A5 ;pointer to Library
- MOVE.L A0,tb_SegList(A5) ;save pointer to Segment list
-
- LEA GfxName,A1 ;open Graphics Library
- MOVEQ #0,D0
- JSR _LVOOpenLibrary(A6)
- MOVE.L D0,tb_GfxBase(A5)
- BEQ.S .LibIni1 ;error?
-
- LEA FFPName,A1 ;open MathFFP Library
- MOVEQ #0,D0
- JSR _LVOOpenLibrary(A6)
- MOVE.L D0,tb_FFPBase(A5)
- BEQ.S .LibIni2 ;error?
-
- LEA FFPTName,A1 ;open MathTrans Library
- MOVEQ #0,D0
- JSR _LVOOpenLibrary(A6)
- MOVE.L D0,tb_FFPTBase(A5)
- BEQ.S .LibIni3 ;error?
-
- MOVE.L A5,D0 ;allright, return Pointer to Library
- MOVEM.L (SP)+,A5-A6
- RTS
-
- .LibIni3 MOVE.L tb_FFPBase(A5),A1 ;error, close Libraries
- JSR _LVOCloseLibrary(A6)
-
- .LibIni2 MOVE.L tb_GfxBase(A5),A1
- JSR _LVOCloseLibrary(A6)
-
- .LibIni1 CLR.L D0 ;and return 0
-
- MOVEM.L (SP)+,A5-A6
- RTS
-
- Open:
- ;This routine is called each time when the library is opened
- ;A6: Pointer to Library
-
- ADDQ.W #1,LIB_OPENCNT(A6) ;increase Open count
- BCLR #LIBB_DELEXP,LIB_FLAGS(A6) ;no Delayed Expunge
- MOVE.L A6,D0 ;return pointer to Library
- RTS
-
- Close:
- ;This routine gets called each time the library is closed
- ;A6: Pointer to Library
-
- SUBQ.W #1,LIB_OPENCNT(A6) ;decrease Open count
- BNE.S .Clos1 ;still open
-
- BTST #LIBB_DELEXP,LIB_FLAGS(A6) ;Delayed Expunge?
- BNE.S Expunge ;yes, do it
-
- .Clos1 CLR.L D0 ;return 0 (no Expunge)
- RTS
-
- Expunge:
- ;This routine is used to clear the library from memory
- ;A6: Pointer to Library
-
- TST.W LIB_OPENCNT(A6) ;library still open?
- BEQ.S .Expung1 ;no, remove it
-
- BSET #LIBB_DELEXP,LIB_FLAGS(A6) ;set Delayed Expunge flag
- CLR.L D0 ;and return 0
- RTS
-
- .Expung1 MOVEM.L D2-D3/A4-A6,-(SP)
-
- MOVE.L A6,A5 ;pointer to library
- MOVE.L ExecBase,A6
- MOVE.L tb_SegList(A5),D2 ;pointer to Segment list
-
- MOVEQ #8,D3 ;close Libraries
- .Expung2 MOVE.L tb_GfxBase(A5,D3.W),A1
- JSR _LVOCloseLibrary(A6)
- SUBQ.W #4,D3
- BPL.S .Expung2
-
- MOVE.L A5,A1 ;remove library from library list
- JSR _LVORemove(A6)
-
- CLR.L D0
- MOVE.L A5,A1
- MOVE.W LIB_NEGSIZE(A5),D0
-
- SUB.L D0,A1 ;pointer to beginning of library
- ADD.W LIB_POSSIZE(A5),D0 ;length
-
- JSR _LVOFreeMem(A6) ;return memory
-
- MOVE.L D2,D0 ;return pointer to Segment list
- MOVEM.L (SP)+,D2-D3/A5-A6
- RTS
-
- ExtFunc:
- ;unused function
-
- MOVEQ #0,D0
- RTS
-
- CreateTurtle:
- ;create TurtleHandle
- ;
- ;A0: pointer to RastPort
- ;D0: x position
- ;D1: y position
- ;D2: angle
- ;D3: flags
-
- MOVEM.L D0-D3/A0/A4-A6,-(SP)
- MOVE.L A6,A5
- MOVE.L ExecBase,A6
-
- MOVEQ #TurtleHandle_SIZEOF,D0 ;allocate memory
- MOVEQ #0,D1
- JSR _LVOAllocMem(A6)
- TST.L D0 ;error?
- BEQ.S .Create1 ;yes, return
- MOVE.L D0,A4 ;pointer to memory
-
- MOVE.L tb_FFPBase(A5),A6
-
- MOVE.L 16(SP),th_RastPort(A4) ;store pointer to RastPort
- MOVE.W 10(SP),th_angle(A4) ; and angle in Handle
- MOVE.W 10(SP),th_aStart(A4)
- MOVE.B 15(SP),D0 ;flags
- BCLR #TurB_TValid,D0 ;clear Triangle Valid flag
- MOVE.B D0,th_Flags(A4) ;and store it
- MOVE.B D0,th_FlagStart(A4)
- MOVE.W 2(SP),D0 ;x position
- MOVE.W D0,th_xStart(A4) ;as initial position in Handle
- EXT.L D0
- JSR _LVOSPFlt(A6) ;to FFP
- MOVE.L D0,th_xPosition(A4) ;as actual position
- MOVE.W 6(SP),D0 ;y position
- MOVE.W D0,th_yStart(A4)
- EXT.L D0
- JSR _LVOSPFlt(A6)
- MOVE.L D0,th_yPosition(A4)
-
- MOVE.L A4,A0 ;draw triangle
- MOVE.L A5,A6
- BSR DrawTurtle
-
- MOVE.L A4,D0 ;return pointer to TurtleHandle
-
- .Create1 ADDQ.L #8,SP
- MOVEM.L (SP)+,D2-D3/A0/A4-A6
- RTS
-
- ReturnTurtle:
- ;return TurtleHandle
- ;
- ;A0: Zeiger auf Handle
-
- MOVE.L A6,-(SP)
-
- BSR DrawTurtle ;clear triangle
-
- MOVE.L ExecBase,A6
-
- MOVE.L A0,A1 ;and return memory
- MOVEQ #TurtleHandle_SIZEOF,D0
- JSR _LVOFreeMem(A6)
-
- MOVE.L (SP)+,A6
- RTS
-
- TurnRight:
- ;turn Turtle to the right (negative)
- ;
- ;A0: pointer to Turtlehandle
- ;D0: angle
-
- NEG.W D0 ;change sign
- ;und weiter bei TurnLeft
-
- TurnLeft:
- ;turn Turtle to the left (positive)
- ;
- ;A0: pointer to Turtlehandle
- ;D0: angle
-
- BSR DrawTurtle ;clear triangle
-
- ADD.W th_Angle(A0),D0 ;new angle
- EXT.L D0
- DIVS #360,D0 ;mod 360
-
- SWAP D0 ;remainder
- TST.W D0 ;positiv?
- BPL.S .TurnRi1 ;yes
- ADD.W #360,D0 ;no, make positive
-
- .TurnRi1 MOVE.W D0,th_Angle(A0) ;save angle
-
- BCLR #TurB_TValid,th_Flags(A0) ;triangle invalid
- BRA DrawTurtle ;new triangle
-
- PenUp:
- ;Pen up
- ;
- ;A0: pointer to TurtleHandle
- ;
- BSET #TurB_Up,th_Flags(A0) ;set Pen Up flag
- RTS
-
- PenDown:
- ;Pen down
- ;
- ;A0: pointer to TurtleHandle
- ;
- BCLR #TurB_Up,th_Flags(A0) ;clear Pen Up flag
- RTS
-
- HideTurtle:
- ;Hide Turtle triangle
- ;
- ;A0: pointer to TurtleHandle
- ;
- BTST #TurB_Hide,th_Flags(A0) ;already hidden?
- BNE.S .HideTu1 ;yes
-
- BSR DrawTurtle ;clear triangle
-
- BSET #TurB_Hide,th_Flags(A0) ;set Hide Turtle flag
- .HideTu1 RTS
-
- ShowTurtle:
- ;Show Turtle triangle
- ;
- ;A0: pointer to TurtleHandle
- ;
- BCLR #TurB_Hide,th_Flags(A0) ;clear Hide Turtle flag
- BEQ.S .ShowTu1 ;already cleared
-
- BCLR #TurB_TValid,th_Flags(A0) ;triangle invalid
- BSR DrawTurtle ;draw it
- .ShowTu1 RTS
-
- SetAngle:
- ;Set Turtle angle
- ;
- ;A0: pointer to TurtleHandle
- ;D0: new angle
- ;
- BSR DrawTurtle ;clear triangle
-
- MOVE.W D0,th_Angle(A0) ;new angle
-
- BCLR #TurB_TValid,th_Flags(A0) ;triangle invalid
- BRA DrawTurtle ;draw it
-
- SetPosition:
- ;Set Turtle position
- ;
- ;A0: Zeiger auf Turtlehandle
- ;D0: x position
- ;D1: y position
- ;
- MOVEM.L D0-D1/A4-A6,-(SP)
-
- BSR DrawTurtle ;clear triangle
-
- MOVE.L A0,A4 ;TurtleHandle
- MOVE.L A6,A5
- MOVE.L tb_FFPBase(A5),A6 ;FFP Library
-
- MOVE.W 2(SP),D0 ;x position
- EXT.L D0
- JSR _LVOSPFlt(A6) ;to FFP
- MOVE.L D0,th_xPosition(A4) ;save it
-
- MOVE.W 6(SP),D0 ;y-Position
- EXT.L D0
- JSR _LVOSPFlt(A6)
- MOVE.L D0,th_yPosition(A4)
-
- MOVE.L A5,A6
- BCLR #TurB_TValid,th_Flags(A4) ;triangle invalid
- BSR DrawTurtle ;draw it
-
- ADDQ.L #8,SP
- MOVEM.L (SP)+,A4-A6
- RTS
-
- ResetTurtle:
- ;Reset Turtle to initial state
- ;
- ;A0: pointer to TurtleHandle
- ;
- MOVEM.L A4-A6,-(SP)
-
- BSR DrawTurtle ;clear triangle
-
- MOVE.L A0,A4 ;pointer to TurtleHandle
- MOVE.L A6,A5
- MOVE.L tb_FFPBase(A5),A6
-
- MOVE.W th_aStart(A4),th_Angle(A4) ;set angle and flags to initial values
- MOVE.B th_FlagStart(A4),th_Flags(A4)
-
- MOVE.W th_xStart(A4),D0 ;initial x position
- EXT.L D0
- JSR _LVOSPFlt(A6) ;to FFP
- MOVE.L D0,th_xPosition(A4) ;actual x position
-
- MOVE.W th_yStart(A4),D0 ;initial y position
- EXT.L D0
- JSR _LVOSPFlt(A6)
- MOVE.L D0,th_yPosition(A4)
-
- MOVE.L A5,A6
- BSR DrawTurtle ;draw triangle
-
- MOVEM.L (SP)+,A4-A6
- RTS
-
- Forward:
- ;Move Turtle
- ;
- ;A0: pointer to TurtleHandle
- ;D0: distance (FFP)
- ;
- MOVEM.L D2-D6/A2-A3/A5-A6,-(SP)
- MOVE.L D0,D2 ;distance
- MOVE.L A0,A2 ;TurtleHandle
- MOVE.L A6,A5 ;library
-
- BSR DrawTurtle ;clear triangle
-
- MOVE.L tb_FFPBase(A5),A6
-
- MOVE.W th_Angle(A2),D0 ;convert angle
- EXT.L D0
- JSR _LVOSPFlt(A6) ;to FFP
-
- MOVE.L #$8EFA353B,D1 ; (pi/180)
- JSR _LVOSPMul(A6) ;and to radians
-
- MOVE.L tb_FFPTBase(A5),A6
-
- SUBQ.L #4,SP ;space for cosine on stack
- MOVE.L SP,D1
- JSR _LVOSPSinCos(A6)
- MOVE.L D0,D5 ;sine
- MOVE.L (SP)+,D6 ;cosine
-
- MOVE.L tb_FFPBase(A5),A6
-
- MOVE.L D2,D1 ;y component of distance:
- JSR _LVOSPMul(A6) ; yd := d * sin w
- MOVE.L D0,D1
-
- MOVE.L th_yPosition(A2),D0 ;y position:
- JSR _LVOSPSub(A6) ; yp := yp-yd
- MOVE.L D0,D3
-
- MOVE.L D6,D0 ;x component of distance:
- MOVE.L D2,D1 ; xd := d * cos w
- JSR _LVOSPMul(A6)
-
- MOVE.L th_xPosition(A2),D1 ;x position:
- JSR _LVOSPAdd(A6) ; xp := xp+xd
- MOVE.L D0,D2
-
- BTST #TurB_Up,th_Flags(A2) ;Pen up?
- BNE.S .Forwar1 ;yes
-
- MOVE.L th_RastPort(A2),A3 ;Rastport
-
- MOVE.L th_yPosition(A2),D0 ;convert old position to integer
- JSR _LVOSPFix(A6)
- MOVE.L D0,D4
-
- MOVE.L th_xPosition(A2),D0
- JSR _LVOSPFix(A6)
-
- MOVE.L tb_GfxBase(A5),A6
-
- MOVE.L A3,A1 ;graphics cursor to old position
- MOVE.L D4,D1
- JSR _LVOMove(A6)
-
- MOVE.L tb_FFPBase(A5),A6
-
- MOVE.L D3,D0 ;convert new position to integer
- JSR _LVOSPFix(A6)
- MOVE.L D0,D4
-
- MOVE.L D2,D0
- JSR _LVOSPFix(A6)
-
- MOVE.L tb_GfxBase(A5),A6
-
- MOVE.L A3,A1 ;draw line
- MOVE.L D4,D1
- JSR _LVODraw(A6)
-
- .Forwar1 MOVE.L D2,th_xPosition(A2) ;save new position
- MOVE.L D3,th_yPosition(A2)
-
- BTST #TurB_Hide,th_Flags(A2) ;triangle visible?
- BNE.S .Forwar2 ;no
-
- MOVE.L tb_FFPBase(A5),A6 ;yes, calculate coordinates
- BSR.S CalcTurtle
-
- MOVE.L A2,A0 ;and draw it
- MOVE.L A5,A6
- BSR DrawTurtle
-
- .Forwar2 MOVEM.L (SP)+,D2-D6/A2-A3/A5-A6
- RTS
-
- CalcTurtle:
- ;calculate points of Turtle triangle
- ;
- ;D2: x position (FFP)
- ;D3: y position (FFP)
- ;D5: sine
- ;D6: cosine
- ;A2: pointer to TurtleHandle
- ;A6: pointer to MathFFP library
- ;
- ;This function is private and is not contained in the jump table
- ;
- ;Do take care! Register contents are changed!
- ;
- MOVE.L D2,D0 ;convert position to integer
- JSR _LVOSPFix(A6)
- MOVE.W D0,th_PointArray+4(A2)
-
- MOVE.L D3,D0
- JSR _LVOSPFix(A6)
- MOVE.W D0,th_PointArray+6(A2) ;2nd point
-
- MOVE.L D2,D0 ;x position
- MOVE.L D6,D1
- ADDQ.B #3,D1 ; cos*8
- BTST #TurB_xComp,th_Flags(A2) ; x compression?
- BEQ.S .CalcTu1 ; no
- SUBQ.B #1,D1 ; cos*4
- .CalcTu1 JSR _LVOSPSub(A6) ;xpos - c*cos
- MOVE.L D0,D2 ;as x coordinate of center of baseline
-
- MOVE.L D3,D0 ;y position
- MOVE.L D5,D1
- ADDQ.B #3,D1 ; sin*8
- BTST #TurB_yComp,th_Flags(A2) ; y compression?
- BEQ.S .CalcTu2 ; no
- SUBQ.B #1,D1 ; sin*4
- .CalcTu2 JSR _LVOSPAdd(A6) ;ypos - c*sin
- MOVE.L D0,D3 ;as y coordinate of center of baseline
-
- MOVE.L D2,D0 ;x center
- MOVE.L D5,D1
- ADDQ.B #2,D1 ; sin*4
- BTST #TurB_xComp,th_Flags(A2) ; x compression?
- BEQ.S .CalcTu3 ; no
- SUBQ.B #1,D1 ; sin*2
- .CalcTu3 MOVE.L D1,D4 ; save sine
- JSR _LVOSPSub(A6) ;x center - sin
-
- JSR _LVOSPFix(A6) ;to integer
- MOVE.W D0,th_PointArray+0(A2) ;x coordinate of 1st point
-
- MOVE.L D2,D0
- MOVE.L D4,D1
- JSR _LVOSPAdd(A6) ;x center + sin
-
- JSR _LVOSPFix(A6)
- MOVE.W D0,th_PointArray+8(A2) ;x coordinate of 3rd point
-
- MOVE.L D3,D0 ;y center
- MOVE.L D6,D1
- ADDQ.B #2,D1
- BTST #TurB_yComp,th_Flags(A2)
- BEQ.S .CalcTu4
- SUBQ.B #1,D1
- .CalcTu4 MOVE.L D1,D4
- JSR _LVOSPSub(A6) ;y center - cos
-
- JSR _LVOSPFix(A6)
- MOVE.W D0,th_PointArray+2(A2) ;y coordinate of 1st point
-
- MOVE.L D3,D0
- MOVE.L D4,D1
- JSR _LVOSPAdd(A6) ;y center + cos
-
- JSR _LVOSPFix(A6)
- MOVE.W D0,th_PointArray+10(A2) ;y coordinate of 3rd point
-
- BSET #TurB_TValid,th_Flags(A2) ;triangle valid
- RTS
-
- DrawTurtle:
- ;draw Turtle triangle
- ;
- ;A0: pointer to TurtleHandle
- ;
- ;This function is provate and not contained in the jump table
- ;
- ;Register contents are not changed!
- ;
- BTST #TurB_Hide,th_Flags(A0) ;triangle hidden?
- BEQ.S .DrawTu2 ;no, draw it
-
- RTS
-
- .DrawTu2 MOVEM.L D0-D6/A0-A3/A5-A6,-(SP)
-
- MOVE.L A0,A2 ;TurtleHandle
- MOVE.L th_RastPort(A2),A3 ;RastPort
- MOVE.L A6,A5 ;Library Base
-
- BTST #TurB_TValid,th_Flags(A2) ;triangle valid?
- BNE.S .DrawTu1 ;yes
-
- MOVE.L tb_FFPBase(A5),A6
-
- MOVE.W th_Angle(A2),D0 ;convert angle
- EXT.L D0
- JSR _LVOSPFlt(A6)
-
- MOVE.L #$8EFA353B,D1 ;to radians
- JSR _LVOSPMul(A6)
-
- MOVE.L tb_FFPTBase(A5),A6
-
- SUBQ.L #4,SP
- MOVE.L SP,D1
- JSR _LVOSPSinCos(A6)
- MOVE.L D0,D5 ;sine to D5,
- MOVE.L (SP)+,D6 ;cosine to D6
-
- MOVE.L th_xPosition(A2),D2 ;x position to D2
- MOVE.L th_yPosition(A2),D3 ;y position to D3
-
- MOVE.L tb_FFPBase(A5),A6 ;calculate points
- BSR CalcTurtle
-
- .DrawTu1 MOVE.L tb_GfxBase(A5),A6
-
- MOVE.B rp_FgPen(A3),-(SP) ;save FgPen and DrawMode of RastPort
- MOVE.B rp_DrawMode(A3),-(SP)
-
- MOVE.L A3,A1 ;draw into all planes
- MOVEQ #-1,D0
- JSR _LVOSetAPen(A6)
-
- MOVE.L A3,A1 ;new DrawMode
- MOVEQ #RP_JAM1|RP_COMPLEMENT,D0
- JSR _LVOSetDrMd(A6)
-
- MOVE.L A3,A1 ;graphics cursor to 1st point
- MOVE.W th_PointArray+0(A2),D0
- MOVE.W th_PointArray+2(A2),D1
- JSR _LVOMove(A6)
-
- MOVE.L A3,A1 ;draw triangle
- MOVEQ #2,D0
- LEA th_PointArray+4(A2),A0
- JSR _LVOPolyDraw(A6)
-
- MOVE.L A3,A1 ;restore DrawMode
- MOVE.B (SP)+,D0
- JSR _LVOSetDrMd(A6)
-
- MOVE.L A3,A1 ;and FgPen
- MOVE.B (SP)+,D0
- JSR _LVOSetAPen(A6)
-
- MOVEM.L (SP)+,D0-D6/A0-A3/A5-A6
- RTS
-
- EndCode:
-
-