diff --git a/src/inc/cmdsys.plh b/src/inc/cmdsys.plh
index 0046e36..c0e3a8f 100644
--- a/src/inc/cmdsys.plh
+++ b/src/inc/cmdsys.plh
@@ -1,4 +1,12 @@
 import cmdsys
+    //
+    // Useful values for everyone
+    //
+    const FALSE = 0
+    const TRUE  = not FALSE
+    //
+    // Machine ID values
+    //
     const MACHID_CLOCK = $01
     const MACHID_80COL = $02
     const MACHID_MEM   = $03
diff --git a/src/libsrc/conio.pla b/src/libsrc/conio.pla
index 7954d3f..4f0c1aa 100644
--- a/src/libsrc/conio.pla
+++ b/src/libsrc/conio.pla
@@ -2,8 +2,6 @@ include "inc/cmdsys.plh"
 //
 // Handy constants.
 //
-const FALSE        = 0
-const TRUE         = !FALSE
 const FULLMODE     = 0
 const MIXMODE      = 1
 //
diff --git a/src/samplesrc/rod.pla b/src/samplesrc/rod.pla
index 9c873d4..68d64c8 100644
--- a/src/samplesrc/rod.pla
+++ b/src/samplesrc/rod.pla
@@ -2,8 +2,6 @@ include "inc/cmdsys.plh"
 //
 // Handy constants.
 //
-const FALSE=0
-const TRUE=!FALSE
 const FULLMODE=0
 const MIXMODE=1
 //
diff --git a/src/samplesrc/rogue.map.pla b/src/samplesrc/rogue.map.pla
index 88829b0..3010c68 100644
--- a/src/samplesrc/rogue.map.pla
+++ b/src/samplesrc/rogue.map.pla
@@ -11,9 +11,6 @@ import rogueio
   word rnd, getkb, home, gotoxy, tone, open, read, close, newline
 end
 
-const FALSE = 0
-const TRUE  = 1
-
 //
 // Octant beam parameters
 //
diff --git a/src/samplesrc/rogue.pla b/src/samplesrc/rogue.pla
index 3051bcd..5c2c2a5 100755
--- a/src/samplesrc/rogue.pla
+++ b/src/samplesrc/rogue.pla
@@ -44,9 +44,6 @@ import rogueio
   word rnd, getkb, home, gotoxy, tone
 end
 
-const FALSE = 0
-const TRUE  = not FALSE
-
 const maxlight = 10
 const maxview  = 19
 
diff --git a/src/samplesrc/sieve.pla b/src/samplesrc/sieve.pla
index 2d298b7..ad86c9b 100644
--- a/src/samplesrc/sieve.pla
+++ b/src/samplesrc/sieve.pla
@@ -1,7 +1,5 @@
 include "inc/cmdsys.plh"
 
-const FALSE  = 0
-const TRUE   = !FALSE
 const size   = 8190
 const sizepl = size+1
 
diff --git a/src/toolsrc/ed.pla b/src/toolsrc/ed.pla
index f93a9f4..7f575aa 100755
--- a/src/toolsrc/ed.pla
+++ b/src/toolsrc/ed.pla
@@ -7,8 +7,6 @@
 include "inc/cmdsys.plh"
 include "inc/args.plh"
 include "inc/fileio.plh"
-const FALSE = 0
-const TRUE  = not FALSE
 //
 // Hardware constants
 //
@@ -58,9 +56,11 @@ const getbuff       = $01FF
 //
 // Data and text buffer constants
 //
-const maxlines      = 1500
-const maxfill       = 1524
-const maxlnlen      = 79
+const MAXLINES      = 1500
+const MAXLINESSIZE  = MAXLINES+24
+const MAXLNLEN      = 79
+const MAXSTRPLSIZE  = $8000 // $7000
+//const STRPLMAPSIZE  = 224 // $E0 = 28K is memory@16 bytes per bit map, 128 bytes per 8 bit map, 1K bytes per 8 byte map
 const pgjmp         = 16
 const changed       = 1
 const insmode       = 2
@@ -78,16 +78,14 @@ word              = $0450,$04D0,$0550,$05D0,$0650,$06D0,$0750,$07D0
 //
 byte nullstr      = ""
 byte[64] txtfile  = "UNTITLED"
-word strlinbuf    = $1000
-word strpoolmap   = $1F00
-word strpoolmsz   = 224 // $E0 = 28K is memory@16 bytes per bit map, 128 bytes per 8 bit map, 1K bytes per 8 byte map
-word strpool      = $4800
-word strpoolsz    = $7000
 byte exit         = FALSE
 byte flags        = 0
 byte flash        = 0
 word numlines     = 0
 word cutbuf       = 0
+word strplsize    = MAXSTRPLSIZE
+word strplmapsize
+word strlinbuf, strpoolmap, strpool
 byte cursx, cursy, scrnleft, curscol, underchr, curschr
 word keyin, cursrow, scrntop, cursptr
 //
@@ -102,11 +100,12 @@ predef cmdmode#0
 asm equates
     !SOURCE "vmsrc/plvmzp.inc"
 end
-asm clrhibit(strptr)
+asm clrhibit(strptr)#0
         LDA     ESTKL,X
         STA     SRCL
         LDA     ESTKH,X
         STA     SRCH
+        INX
         LDY     #$00
         LDA     (SRC),Y
         BEQ     +
@@ -118,11 +117,12 @@ CLHILP  LDA     (SRC),Y
         BNE     CLHILP
 +       RTS
 end
-asm sethibit(strptr)
+asm sethibit(strptr)#0
         LDA     ESTKL,X
         STA     SRCL
         LDA     ESTKH,X
         STA     SRCH
+        INX
         LDY     #$00
         LDA     (SRC),Y
         BEQ     +
@@ -134,7 +134,7 @@ STHILP  LDA     (SRC),Y
         BNE     STHILP
 +       RTS
 end
-asm cpyln(srcstr, dststr)
+asm cpyln(srcstr, dststr)#0
         LDA     ESTKL,X
         STA     DSTL
         LDA     ESTKH,X
@@ -144,6 +144,7 @@ asm cpyln(srcstr, dststr)
         STA     SRCL
         LDA     ESTKH,X
         STA     SRCH
+        INX
         LDY     #$00
         LDA     (SRC),Y
         TAY
@@ -165,31 +166,73 @@ CPLNLP  LDA     (SRC),Y
         RTS
 end
 
-def bell
+def bell#0
     putc($07)
 end
 //
 // Memory management routines
 //
-def strcpy(dststr, srcstr)
+def sizemask(size)
+    if size <= 16
+        return $01
+    elsif size <= 32
+        return $03
+    elsif size <= 48
+        return $07
+    elsif size <= 64
+        return $0F
+    elsif size <= 80
+        return $1F
+    fin
+    return 0
+end
+def strpoolalloc(size)
+    byte szmask, i
+    word mapmask, addr
+
+    szmask = sizemask(size)
+    for i = strplmapsize - 1 downto 0
+        if ^(strpoolmap + i) <> $FF
+            mapmask = szmask
+            repeat
+                if ^(strpoolmap + i) & mapmask
+                    mapmask = mapmask << 1
+                else
+                    ^(strpoolmap + i) = ^(strpoolmap + i) | mapmask
+                    addr = (i << 7) + strpool
+                    while !(mapmask & 1)
+                        addr = addr + 16
+                        mapmask = mapmask >> 1
+                    loop
+                    return addr
+                fin
+            until mapmask & $100
+        fin
+    next
+    bell()
+    puts("OUT OF MEMORY!")
+    return 0
+end
+
+def strcpy(dststr, srcstr)#0
     byte strlen
 
     strlen = ^srcstr
-    while (srcstr).[strlen] == $8D or (srcstr).[strlen] == $A0
+    while ^(srcstr + strlen) == $8D or ^(srcstr + strlen) == $A0
         strlen--
     loop
     ^dststr = strlen
     memcpy(dststr + 1, srcstr + 1, strlen)
 end
-def delstr(strptr)
+def delstr(strptr)#0
     byte mask, ofst
 
     if strptr and strptr <> @nullstr
-//        mask = sizemask(^strptr + 1)
-//        ofst = (strptr - strheap) >> 4
-//        mask = mask << (ofst & $07)
-//        ofst = ofst >> 3
-//        strpoolmap->[ofst] = strpoolmap->[ofst] & ~mask
+        mask = sizemask(^strptr + 1)
+        ofst = (strptr - strpool) >> 4
+        mask = mask << (ofst & $07)
+        ofst = ofst >> 3
+        ^(strpoolmap + ofst) = ^(strpoolmap + ofst) & ~mask
     fin
 end
 def newstr(strptr)
@@ -197,30 +240,35 @@ def newstr(strptr)
     word newptr
 
     strlen = ^strptr
-    while (strptr).[strlen] == $8D or (strptr).[strlen] == $A0
+    while ^(strptr + strlen) == $8D or ^(strptr + strlen) == $A0
         strlen--
     loop
     if strlen == 0
         return @nullstr
     fin
-//    newptr = strpoolalloc(strlen + 1)
-//    if newptr
-//        memcpy(newptr, strptr, strlen + 1)
-//        ^newptr = strlen
-//        return newptr
-//    fin
+    newptr = strpoolalloc(strlen + 1)
+    if newptr
+        memcpy(newptr, strptr, strlen + 1)
+        ^newptr = strlen
+        return newptr
+    fin
     return @nullstr
 end
 def inittxtbuf#0
     word i
 
-//    strlinbuf     = $1000
-//    strpoolmap    = $1F00
-//    strpoolmsz    = 224 // $E0 = 28K is memory@16 bytes per bit map, 128 bytes per 8 bit map, 1K bytes per 8 byte map
-//    strpool       = $4800
-//    strpoolsz     = $7000
-//    memset(strpoolmap, strheapmsz, 0)
-//    memset(strlinbuf, maxfill * 2, @nullstr)
+    strlinbuf = heapalloc(MAXLINESSIZE*2)
+    memset(strlinbuf, MAXLINESSIZE*2, @nullstr)
+    while isult(heapavail, strplsize)
+        strplsize = strplsize - 4096
+    loop
+    if isult(heapavail - strplsize, 4096) // Keep at least 4096 free
+        strplsize = strplsize - 4096
+    fin
+    strplmapsize = strplsize / 128
+    strpoolmap   = heapalloc(strplmapsize)
+    strpool      = heapalloc(strplsize)
+    memset(strpoolmap, strplmapsize, 0)
     numlines   = 1
     cursrow    = 0
     curscol    = 0
@@ -316,7 +364,7 @@ def readtxt(filename)#0
     if refnum
         newline(refnum, $7F, $0D)
         repeat
-            txtbuf = fileio:read(refnum, @txtbuf + 1, maxlnlen)
+            txtbuf = fileio:read(refnum, @txtbuf + 1, MAXLNLEN)
             if txtbuf
                 sethibit(@txtbuf)
                 if flags & uppercase; strupper(@txtbuf); fin
@@ -324,12 +372,12 @@ def readtxt(filename)#0
                 numlines++
             fin
             if !(numlines & $0F); putc('.'); fin
-        until txtbuf == 0 or numlines == maxlines
+        until txtbuf == 0 or numlines == MAXLINES
         fileio:close(refnum)
         //
         // Make sure there is a blank line at the end of the buffer
         //
-        if numlines < maxlines and strlinbuf:[numlines - 1] <> @nullstr
+        if numlines < MAXLINES and strlinbuf:[numlines - 1] <> @nullstr
             strlinbuf:[numlines] = @nullstr
             numlines++
         fin
@@ -620,7 +668,7 @@ def printtxt(slot)#0
     *csw = scrncsw
 end
 def openline(row)
-    if numlines < maxlines
+    if numlines < MAXLINES
         memcpy(@strlinbuf:[row + 1], @strlinbuf:[row], (numlines - row) * 2)
         strlinbuf:[row] = @nullstr
         numlines++
@@ -644,7 +692,7 @@ def cutline#0
     redraw
 end
 def pasteline#0
-    if cutbuf and numlines < maxlines
+    if cutbuf and numlines < MAXLINES
         memcpy(@strlinbuf:[cursrow + 1], @strlinbuf:[cursrow], (numlines - cursrow) * 2)
         strlinbuf:[cursrow] = newstr(cutbuf)
         numlines++
@@ -742,11 +790,11 @@ def editline(key)
                         fin
                         curson
                     fin
-                elsif curscol < maxlnlen
+                elsif curscol < MAXLNLEN
                     curscol++
                     cursx++
                     if flags & insmode
-                        if editstr < maxlnlen or editstr.maxlnlen == $A0
+                        if editstr < MAXLNLEN or editstr.MAXLNLEN == $A0
                             editstr++
                             if curscol >= editstr
                                 editstr = curscol
@@ -831,7 +879,7 @@ def editmode#0
             is keyctrlv
                 pasteline; break
             is keyctrlf
-                if numlines < maxlines and cursrow == numlines - 1
+                if numlines < MAXLINES and cursrow == numlines - 1
                     strlinbuf:[numlines] = @nullstr
                     numlines++
                 fin