1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2026-04-20 16:16:34 +00:00

Initial turtle graphics library

This commit is contained in:
David Schmenk
2025-12-01 11:06:58 -08:00
parent 35dd0f0eb5
commit 77b94b0339
5 changed files with 184 additions and 2 deletions
+10
View File
@@ -0,0 +1,10 @@
import turtle
predef initTurtle(width, height)#0
predef turnLeft(angle)#0
predef turnRight(angle)#0
predef turnTo(angle)#0
predef moveForward(dist)#0
predef moveTo(x, y)#0
predef penUp#0
predef penDown#0
end
+153
View File
@@ -0,0 +1,153 @@
include "inc/cmdsys.plh"
include "inc/int32.plh"
include "inc/sincos.plh"
include "inc/lines.plh"
const CLIP_LEFT = 1
const CLIP_RIGHT = 2
const CLIP_TOP = 4
const CLIP_BOTTOM = 8
var turtleX, turtleY, turtleAngle
byte pen
var clipLeft, clipRight, clipTop, clipBottom
def clipCode(x, y)#1
byte code
code = 0
if x < clipLeft
code = CLIP_LEFT
elsif x > clipRight
code = CLIP_RIGHT
fin
if y < clipTop
code = code | CLIP_TOP
elsif y > clipBottom
code = code | CLIP_BOTTOM
fin
return code
end
def abs(val)#1
return val < 0 ?? -val :: val
end
def lerp(a1, b1, a2, b2, n)#1
word[2] i32
if b2 == b1; return b1; fin // Horizontal lerp
if a2 == a1; return n; fin // Vertical lerp
loadi16(b2 - b1)
muli16(n - a1)
divi16(a2 - a1)
store32(@i32)
return i32[0] + b1
end
def clipLine(x1, y1, x2, y2)#0
byte outcode1, outcode2
outcode1 = clipCode(x1, y1)
outcode2 = clipCode(x2, y2)
if outcode1 & outcode2; return; fin // Early exit - clipped away
if outcode1 | outcode2 // Something is getting clipped
if outcode1 & CLIP_LEFT
y1 = lerp(x1, y1, x2, y2, clipLeft)
x1 = clipLeft
elsif outcode1 & CLIP_RIGHT
y1 = lerp(x1, y1, x2, y2, clipRight)
x1 = clipRight
fin
if outcode1 & CLIP_TOP
x1 = lerp(y1, x1, y2, x2, clipTop)
y1 = clipTop
elsif outcode1 & CLIP_BOTTOM
x1 = lerp(y1, x1, y2, x2, clipBottom)
y1 = clipBottom
fin
if outcode2 & CLIP_LEFT
y2 = lerp(x1, y1, x2, y2, clipLeft)
x2 = clipLeft
elsif outcode2 & CLIP_RIGHT
y2 = lerp(x1, y1, x2, y2, clipRight)
x2 = clipRight
fin
if outcode2 & CLIP_TOP
x2 = lerp(y1, x1, y2, x2, clipTop)
y2 = clipTop
elsif outcode2 & CLIP_BOTTOM
x2 = lerp(y1, x1, y2, x2, clipBottom)
y2 = clipBottom
fin
outcode1 = clipCode(x1, y1)
outcode2 = clipCode(x2, y2)
if outcode1 & outcode2; return; fin // Clipped away
fin
linespans(x1, y1, x2, y2)
end
export def clipRect(left, top, right, bottom)#0
clipLeft = left
clipTop = top
clipLeft = left
clipBottom = bottom
end
export def initTurtle(width, height)#0
cliprect(0, 0, width - 1, height - 1)
turtleX = width / 2
turtleY = height / 2
turtleAngle = 0
pen = 1
end
export def turnLeft(angle)#0
turtleAngle = turtleAngle - angle
while turtleAngle < 0; turtleAngle = turtleAngle + 360; loop
end
export def turnRight(angle)#0
turtleAngle = turtleAngle + angle
while turtleAngle >= 360; turtleAngle = turtleAngle - 360; loop
end
export def turnTo(angle)#0
turtleAngle = angle
while turtleAngle >= 360; turtleAngle = turtleAngle - 360; loop
while turtleAngle < 0; turtleAngle = turtleAngle + 360; loop
end
export def moveForward(dist)#0
var x, y
x = turtleX + mulcos(dist, turtleAngle)
y = turtleY + mulsin(dist, turtleAngle)
if pen
clipLine(turtleX, turtleY, x, y)
fin
turtleX = x
turtleY = y
end
export def moveTo(x, y)#0
if pen
clipLine(turtleX, turtleY, x, y)
fin
turtleX = x
turtleY = y
end
export def penUp#0
pen = 0
end
export def penDown#0
pen = 1
end
//
// Keep module in memory
//
return modkeep
done
+7 -2
View File
@@ -69,6 +69,7 @@ HGRSPRITE = rel/apple/HGRSPRITE\#FE1000
HGRTILE = rel/apple/HGRTILE\#FE1000
HGRFONT = rel/apple/HGRFONT\#FE1000
LINES = rel/LINES\#FE1000
TURTLE = rel/TURTLE\#FE1000
SINCOS = rel/SINCOS\#FE1000
GRAFIX = rel/apple/GRAFIX\#FE1000
SFM = rel/apple/SFM\#FE1000
@@ -126,8 +127,8 @@ $(CMD) $(CMDJIT) $(JIT) $(JIT16) $(JITUNE) $(SOSCMD) $(SOSCMDJIT) $(PLASMAPLASM)
$(HRFORTH) $(HR2FORTH) $(TX2FORTH) $(SEXPR) $(SMATH) $(DRAWL) $(ZIPCHIP) $(MATCHFILES) $(ARGS) $(MEMMGR) \
$(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(COPY) $(DEL) $(REN) $(CAT) $(NEWDIR) $(TYPE) \
$(INITSLOT) $(SOS) $(ROD) $(SIEVE) $(PRIMEGAP) $(MOUSE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) \
$(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(SFM) $(SFMSPRT) $(GRAFIX) $(GFXDEMO) $(LINES) $(SINCOS) \
$(HGRTILE) $(HGRFONT) $(HGRSPRITE) $(HGRLIB) $(TILETEST) $(HGRTEST) $(GRLIB) $(DGRLIB) $(VBLANK) \
$(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(SFM) $(SFMSPRT) $(GRAFIX) $(GFXDEMO) $(LINES) $(TURTLE) \
$(SINCOS) $(HGRTILE) $(HGRFONT) $(HGRSPRITE) $(HGRLIB) $(TILETEST) $(HGRTEST) $(GRLIB) $(DGRLIB) $(VBLANK) \
$(GRTEST) $(DGRTEST) $(HGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) \
$(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(INT32) $(INT32TEST) $(SANE) $(FPSTR) $(FPU) $(SANITY) \
$(LZ4) $(LZ4CAT) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) $(PLAYPCM) $(CONIOTEST)
@@ -307,6 +308,10 @@ $(LINES): libsrc/lines.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW libsrc/lines.pla
acme --setpc 4094 -o $(LINES) libsrc/lines.a
$(TURTLE): libsrc/turtle.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW libsrc/turtle.pla
acme --setpc 4094 -o $(TURTLE) libsrc/turtle.a
$(SINCOS): libsrc/sincos.pla $(PLVM02) $(PLASM)
./$(PLASM) -AMOW libsrc/sincos.pla
acme --setpc 4094 -o $(SINCOS) libsrc/sincos.a
+3
View File
@@ -14,6 +14,7 @@ mkdir prodos/sys
cp rel/apple/FILEIO#FE1000 prodos/sys/FILEIO.REL
cp rel/apple/CONIO#FE1000 prodos/sys/CONIO.REL
cp rel/LINES#FE1000 prodos/sys/LINES.REL
cp rel/TURTLE#FE1000 prodos/sys/TURTLE.REL
cp rel/SINCOS#FE1000 prodos/sys/SINCOS.REL
cp rel/apple/HGRFONT#FE1000 prodos/sys/HGRFONT.REL
cp rel/apple/HGRTILE#FE1000 prodos/sys/HGRTILE.REL
@@ -72,6 +73,7 @@ cp scripts/fileio.4th prodos/sys/scripts/FILEIO.4TH.TXT
cp scripts/grlib.4th prodos/sys/scripts/GRLIB.4TH.TXT
cp scripts/dgrlib.4th prodos/sys/scripts/DGRLIB.4TH.TXT
cp scripts/hgrlib.4th prodos/sys/scripts/HGRLIB.4TH.TXT
cp scripts/turtle.4th prodos/sys/scripts/TURTLE.4TH.TXT
cp scripts/grafix.4th prodos/sys/scripts/GRAFIX.4TH.TXT
cp scripts/int32.4th prodos/sys/scripts/INT32.4TH.TXT
cp scripts/fpu.4th prodos/sys/scripts/FPU.4TH.TXT
@@ -225,6 +227,7 @@ cp inc/matchfiles.plh prodos/bld/inc/MATCHFILES.PLH.TXT
cp inc/cmdsys.plh prodos/bld/inc/CMDSYS.PLH.TXT
cp inc/conio.plh prodos/bld/inc/CONIO.PLH.TXT
cp inc/lines.plh prodos/bld/inc/LINES.PLH.TXT
cp inc/turtle.plh prodos/bld/inc/TURTLE.PLH.TXT
cp inc/sincos.plh prodos/bld/inc/SINCOS.PLH.TXT
cp inc/hgrfont.plh prodos/bld/inc/HGRFONT.PLH.TXT
cp inc/hgrtile.plh prodos/bld/inc/HGRTILE.PLH.TXT
+11
View File
@@ -0,0 +1,11 @@
' INITTURTLE ?ENDSRC
" TURTLE" LOADMOD" "
LOOKUP INITTURTLE PLASMA INITTURTLE
LOOKUP CLIPRECT PLASMA CLIPRECT
LOOKUP TURNLEFT PLASMA TURNLEFT
LOOKUP TURNRIGHT PLASMA TURNRIGHT
LOOKUP TURNTO PLASMA TURNTO
LOOKUP MOVEFORWARD PLASMA MOVEFORWARD
LOOKUP MOVETO PLASMA MOVETO
LOOKUP PENUP PLASMA PENUP
LOOKUP PENDOWN PLASMA PENDOWN