diff --git a/src/inc/memmgr.plh b/src/inc/memmgr.plh
index 752b016..295ca53 100644
--- a/src/inc/memmgr.plh
+++ b/src/inc/memmgr.plh
@@ -2,13 +2,13 @@ import memmgr
     //
     // Utility routine
     //
-    predef sweep, brk, sbrk
+    predef sweep#0, brk(addr), sbrk(size)
     //
     // Memory routines
     //
-    predef hmemNew, hmemLock, hmemUnlock, hmemRef, hmemDel, hmemFre
+    predef hmemNew(size), hmemLock(hmem), hmemUnlock(hmem)#0, hmemRef(hmem), hmemDel(hmem), hmemFre(lptr)
     //
     // Max size of a memory block
     //
     const MAX_MEMBLK_SIZE = $2000
-end
\ No newline at end of file
+end
diff --git a/src/libsrc/conio.pla b/src/libsrc/conio.pla
index dc55d61..4aa7bc9 100644
--- a/src/libsrc/conio.pla
+++ b/src/libsrc/conio.pla
@@ -1,7 +1,4 @@
-import STDLIB
-    predef syscall, call, memset, getc, putc, puts, modaddr
-    byte MACHID
-end
+include "inc/cmdsys.plh"
 //
 // Handy constants.
 //
@@ -200,7 +197,7 @@ def a2writeln(string, start, fill)
 end
 def a2textmode(columns)
     call($FB39, 0, 0, 0, 0) // textmode()
-    return a2home 
+    return a2home
 end
 def a2grmode(mix)
     call($FB2F, 0, 0, 0, 0) // initmode()
@@ -216,7 +213,7 @@ end
 //
 def dev_control(devnum, code, list)
     byte params[5]
-    
+
     params.0 = 3
     params.1 = devnum
     params.2 = code
@@ -225,7 +222,7 @@ def dev_control(devnum, code, list)
 end
 def dev_status(devnum, code, list)
     byte params[5]
-    
+
     params.0 = 3
     params.1 = devnum
     params.2 = code
diff --git a/src/libsrc/dgr.pla b/src/libsrc/dgr.pla
index 23bfeca..087bef4 100755
--- a/src/libsrc/dgr.pla
+++ b/src/libsrc/dgr.pla
@@ -1,18 +1,4 @@
-import cmdsys
-	predef puts, memset, memcpy, heapmark, heapalloc, heaprelease, call
-	byte MACHID
-	//
-	// System flags: memory allocator screen holes.
-	//
-	const restxt1     = $0001
-	const restxt2     = $0002
-	const resxtxt1    = $0004
-	const resxtxt2    = $0008
-	const reshgr1     = $0010
-	const reshgr2     = $0020
-	const resxhgr1    = $0040
-	const resxhgr2    = $0080
-end
+include "inc/cmdsys.plh"
 sysflags $000F	// Reserve all text pages
 //
 // Apple II hardware constants.
diff --git a/src/libsrc/dhcp.pla b/src/libsrc/dhcp.pla
index 3ce3d89..529299c 100644
--- a/src/libsrc/dhcp.pla
+++ b/src/libsrc/dhcp.pla
@@ -1,12 +1,7 @@
 //
 // DHCP
 //
-import cmdsys
-    predef syscall, call, getc, gets, putc, puts, putln
-    predef memset, memcpy, modaddr, modexec
-    predef heapmark, heapallocalign, heapalloc, heaprelease
-    byte MACHID
-end
+include "inc/cmdsys.plh"
 //
 // Net object
 //
@@ -136,7 +131,7 @@ def puti(i)
 end
 def putip(ipptr)
     byte i
-    
+
     for i = 0 to 2
         puti(ipptr->[i]); putc('.')
     next
@@ -144,7 +139,7 @@ def putip(ipptr)
 end
 def dumpbytes(buf, len)
     word i
-    
+
     for i = 0 to len - 1
         putb(buf->[i])
 	if i & 15 == 15
@@ -168,7 +163,7 @@ def dumpdhcp(pkt)
 end
 def parseopts(opts, match)
     byte i
-    
+
     i = 0
     while opts->[i] <> $FF and i < 64
 	while !opts->[i] and i < 64
@@ -183,7 +178,7 @@ def parseopts(opts, match)
 end
 def recvDHCP(remip, remport, pkt, len, param)
     word servopts, maskopts, gwopts, dnsopts
-    
+
     //putip(remip);putc(':');puti(remport);putln
     //dumpdhcp(pkt)
     if pkt=>dhcp_xid:0 == $0201 and pkt=>dhcp_xid:2 == $0403
diff --git a/src/libsrc/etherip.pla b/src/libsrc/etherip.pla
index 48f8698..500e22c 100644
--- a/src/libsrc/etherip.pla
+++ b/src/libsrc/etherip.pla
@@ -1,15 +1,4 @@
-import cmdsys
-    predef syscall, call, getc, gets, putc, puts, putln
-    predef isugt, isuge, isult, isule
-    predef memset, memcpy, modaddr, modexec
-    predef heapmark, heapallocalign, heapalloc, heaprelease, heapavail
-    byte MACHID
-    //
-    // Module don't free memory
-    //
-    const modkeep     = $2000
-    const modinitkeep = $4000
-end
+include "inc/cmdsys.plh"
 //
 // Net object
 //
@@ -244,7 +233,7 @@ CHKLP 	LDA 	(SRC),Y
 	STA 	ESTKH+2,X
 	PLA
 	ADC 	ESTKL+2,X
-	STA 	ESTKL+2,X	
+	STA 	ESTKL+2,X
 	INY
 	BNE 	+
 	INC 	SRCH
@@ -268,7 +257,7 @@ def etherSendIP(ipdst, proto, seglist, size)
     byte[t_iphdr] hdr
     byte retry
     word timeout
-    
+
     hdr.ip_vers_hlen      = $45
     hdr.ip_service        = 0
     hdr:ip_length         = swab(t_iphdr + size)
@@ -340,7 +329,7 @@ end
 def etherSendUDP(port, ipdst, portdst, data, len)
     word[8] seglist // list of data and header segments
     byte[t_udphdr] hdr
-    
+
     hdr:udp_src    = swab(port=>notify_port)
     hdr:udp_dst    = swab(portdst)
     hdr:udp_len    = swab(t_udphdr + len)
@@ -391,7 +380,7 @@ end
 def etherCloseUDP(port)
     word port
     byte i
-    
+
     if isuge(port, @portsUDP) and isult(port, @portsUDP + MAX_UDP_NOTIFIES * t_notify)
 	//
 	// Clear notiications on this port
diff --git a/src/libsrc/fiber.pla b/src/libsrc/fiber.pla
index 02c7bc6..a4312b4 100644
--- a/src/libsrc/fiber.pla
+++ b/src/libsrc/fiber.pla
@@ -1,13 +1,7 @@
 //
 // Cooperative multi-threading (fiber) scheduler
 //
-import cmdsys
-    predef syscall, call, getc, gets, putc, puts, putln
-    predef memset, memcpy, modaddr, modexec
-    predef heapmark, heapallocalign, heapalloc, heaprelease
-    predef isugt, isuge, isult, isule
-    byte MACHID
-end
+include "inc/cmdsys.plh"
 //
 // Maximum number of fibers
 //
diff --git a/src/libsrc/memmgr.pla b/src/libsrc/memmgr.pla
index a0d6191..3464bc5 100644
--- a/src/libsrc/memmgr.pla
+++ b/src/libsrc/memmgr.pla
@@ -1,14 +1,9 @@
 //
 // Handle based swapping memory manager
 //
-import cmdsys
-    predef syscall, call, getc, gets, putc, puts, putln
-    predef memset, memcpy, modaddr, modexec
-    predef heapmark, heapallocalign, heapalloc, heaprelease
-    predef isugt, isuge, isult, isule
-    byte MACHID
-end
-const iobuffer = $0800
+include "inc/cmdsys.plh"
+include "inc/fileio.plh"
+
 struc t_initdata
     word    volptr
     word    freeblks
@@ -88,7 +83,7 @@ word frelst              // Free list
 byte sweeppg, sweepen
 byte[64] swapvol = "/"   // Swap volume
 byte swapdir = "/SWAP/"
-byte hexchar = '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' 
+byte hexchar = '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
 //
 // DEBUG
 //
@@ -109,11 +104,11 @@ byte hexchar = '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
 //
 // Fill block filename
 //
-def strcharadd(str, char)
+def strcharadd(str, char)#0
     ^str = ^str + 1
     str->.[^str] = char
 end
-def swapfile(filestr, hmem)
+def swapfile(filestr, hmem)#0
     memcpy(filestr, @swapvol, swapvol + 1)
     strcharadd(filestr, 'H')
     strcharadd(filestr, hexchar[(hmem >> 12) & $0F])
@@ -121,78 +116,6 @@ def swapfile(filestr, hmem)
     strcharadd(filestr, hexchar[(hmem >> 4)  & $0F])
     strcharadd(filestr, hexchar[ hmem        & $0F])
 end
-def open(path)
-    byte params[6]
-
-    params.0 = 3
-    params:1 = path
-    params:3 = iobuffer
-    params.5 = 0
-    syscall($C8, @params)
-    return params.5
-end
-def close(refnum)
-    byte params[2]
-
-    params.0 = 1
-    params.1 = refnum
-    return syscall($CC, @params)
-end
-def read(refnum, buff, len)
-    byte params[8]
-
-    params.0 = 4
-    params.1 = refnum
-    params:2 = buff
-    params:4 = len
-    params:6 = 0
-    syscall($CA, @params)
-    return params:6
-end
-def write(refnum, buff, len)
-    byte params[8]
-
-    params.0 = 4
-    params.1 = refnum
-    params:2 = buff
-    params:4 = len
-    params:6 = 0
-    syscall($CB, @params)
-    return params:6
-end
-def get_info(path, infoptr)
-    byte params[18]
-    
-    memset(@params, 0, 18)
-    params.0 = 10
-    params:1 = path
-    syscall($C4, @params)
-    return memcpy(infoptr, @params.3, 15)
-end
-def create(path, access, type, aux)
-    byte params[12], kind
-
-    kind = $01
-    if type == $0F
-        kind = $0D
-    fin
-    params.0  = 7
-    params:1  = path
-    params.3  = access
-    params.4  = type
-    params:5  = aux
-    params.7  = kind
-    params:8  = 0
-    params:10 = 0
-    return syscall($C0, @params)
-end
-def destroy(path)
-    byte params[12]
-
-    params.0 = 1
-    params:1 = path
-    return syscall($C1, @params)
-end
 //
 // Find exact/best free memory match
 //
@@ -209,7 +132,7 @@ def unlink(freblk, freprv)
 end
 def unfre(freblk, freprv, size)
     word shrink
-    
+
     if freblk=>fresiz == size
         //
 	// Unlink free block
@@ -234,32 +157,32 @@ def unfre(freblk, freprv, size)
 end
 def addfre(freblk)
     word srch
-    
+
     //freblk=>fresiz = freblk=>blksiz
     if frelst and frelst < freblk
         srch = frelst
         while srch=>frenxt
             if srch=>frenxt > freblk
-	        //
-		// Insert into list
-		//
-		freblk=>frenxt = srch=>frenxt
-		srch=>frenxt   = freblk
+    	        //
+        		// Insert into list
+        		//
+        		freblk=>frenxt = srch=>frenxt
+        		srch=>frenxt   = freblk
                 return
-	    fin
+    	    fin
             srch = srch=>frenxt
         loop
-	//
-	// Add to end of list
-	//
-	freblk=>frenxt = 0
-	srch=>frenxt   = freblk
+    	//
+    	// Add to end of list
+    	//
+    	freblk=>frenxt = 0
+    	srch=>frenxt   = freblk
     else
         //
-	// Add to beginning of list
-	//
+    	// Add to beginning of list
+    	//
         freblk=>frenxt = frelst
-	frelst         = freblk
+    	frelst         = freblk
     fin
 end
 //
@@ -267,58 +190,58 @@ end
 //
 def coallesce
     word srch, combined
-    
+
     combined = 0
     srch = frelst
     while srch and srch=>frenxt
         if srch + srch=>fresiz == srch=>frenxt
-	    //
-	    // Combine adjacent free space
-	    //
-	    //putc('C');putc(' ');puth(srch);putc('+');puth(srch=>frenxt);putc(' ')
+    	    //
+    	    // Combine adjacent free space
+    	    //
+    	    //putc('C');putc(' ');puth(srch);putc('+');puth(srch=>frenxt);putc(' ')
             srch=>fresiz = srch=>fresiz + srch=>frenxt=>fresiz
-	    srch=>frenxt = srch=>frenxt=>frenxt
+    	    srch=>frenxt = srch=>frenxt=>frenxt
             combined = 1
         else
             srch = srch=>frenxt
-	fin
+    	fin
     loop
     return combined
 end
 def compact
     word page, entry, memblk, moveblk, size, srch, prev
     byte moved
-    
+
     moved = 0
     for page = PG_TBL_SIZE - 1 downto 0
         if hpgtbl[page]
             for entry = 255 downto 0
-		if hpgtbl:[page, entry].lsb & HMEM_STATE == HMEM_MOVEABLE
+        		if hpgtbl:[page, entry].lsb & HMEM_STATE == HMEM_MOVEABLE
                     memblk = hpgtbl:[page, entry]
-		    size    = memblk=>blksiz
-		    moveblk = 0
-		    prev    = 0
+        		    size    = memblk=>blksiz
+        		    moveblk = 0
+        		    prev    = 0
                     srch    = frelst
-		    while srch and srch < memblk
+        		    while srch and srch < memblk
                         if srch=>fresiz >= size
-			    moveblk = unfre(srch, prev, size)
-			    break
-			fin
-			prev = srch
-			srch = srch=>frenxt
-		    loop
-		    if moveblk
-			//putc('M');putc(' ');puth(moveblk);putc('=');puth(memblk);putc(' ')
-		        memcpy(moveblk, memblk, size)
-			hpgtbl:[page, entry] = moveblk
-			addfre(memblk)
-			moved = 1
-		    fin
-		fin
+            			    moveblk = unfre(srch, prev, size)
+            			    break
+            			fin
+            			prev = srch
+            			srch = srch=>frenxt
+        		    loop
+        		    if moveblk
+            			//putc('M');putc(' ');puth(moveblk);putc('=');puth(memblk);putc(' ')
+        		        memcpy(moveblk, memblk, size)
+            			hpgtbl:[page, entry] = moveblk
+            			addfre(memblk)
+            			moved = 1
+        		    fin
+        		fin
             next
         else
             break
-	fin
+    	fin
     next
     if moved
         coallesce
@@ -333,40 +256,40 @@ def swapout(accessed)
     byte ref
     word page, entry, memblk, hmem, size
     byte swapped
-    
+
     swapped = 0
     for page = PG_TBL_SIZE - 1 downto 0
         if hpgtbl[page]
             for entry = 255 downto 0
-		if hpgtbl:[page, entry].lsb & HMEM_STATE == HMEM_MOVEABLE
+        		if hpgtbl:[page, entry].lsb & HMEM_STATE == HMEM_MOVEABLE
                     memblk = hpgtbl:[page, entry]
-		    if not (memblk->blklok & accessed)
-		        //
-			// Swap this block out
-			//
+        		    if not (memblk->blklok & accessed)
+        		        //
+            			// Swap this block out
+            			//
                         size     = memblk=>blksiz
-			hmem.lsb = page
-			hmem.msb = entry
-			swapfile(@filename, hmem)
-			create(@filename, $C3, $00, size) // embed size in aux type
+            			hmem.lsb = page
+            			hmem.msb = entry
+            			swapfile(@filename, hmem)
+            			create(@filename, $C3, $00, size) // embed size in aux type
                         //puts(@swapoutstr);puts(@filename);putc('@');puth(memblk);putc(':');puth(size);putln
-			ref = open(@filename)
-			if ref
-			    //
-			    // Write it out
-			    //
-			    if write(ref, memblk, size) == size
-			        //
-				// Zero size in page table flags swapin to read from disk
-				//
-			        hpgtbl:[page, entry] = HMEM_SWAPPED
-				addfre(memblk)
-				swapped = 1
-			    fin
-  			    close(ref)
-			fin
-		    fin
-		fin
+            			ref = open(@filename)
+            			if ref
+            			    //
+            			    // Write it out
+            			    //
+            			    if write(ref, memblk, size) == size
+            			        //
+                				// Zero size in page table flags swapin to read from disk
+                				//
+            			        hpgtbl:[page, entry] = HMEM_SWAPPED
+                				addfre(memblk)
+                				swapped = 1
+            			    fin
+              			    close(ref)
+            			fin
+        		    fin
+        		fin
             next
         else
             break
@@ -389,46 +312,46 @@ def findexact(size)
     while srch
         if srch=>fresiz == size
             //putc('E')
-	    return unlink(srch, prev)
-	fin
-	prev = srch
+    	    return unlink(srch, prev)
+    	fin
+    	prev = srch
         srch = srch=>frenxt
     loop
 end
 def findbest(size)
     word srch, prev
-    
+
     prev = 0
     srch = frelst
     while srch
         if srch=>fresiz >= size
             //putc('B')
-	    return unfre(srch, prev, size)
-	fin
-	prev = srch
+    	    return unfre(srch, prev, size)
+    	fin
+    	prev = srch
         srch = srch=>frenxt
     loop
 end
 def findblk(size)
     word addr
-    
+
     if size > MAX_BLK_SIZE; return 0; fin
     addr = findexact(size)
     if !addr
         coallesce
-	addr = findexact(size)
-	if !addr
-	    compact
-	    addr = findbest(size)
-	    if !addr
-	        swapout(HMEM_ACCESSED)
-		addr = findbest(size)
-		if !addr
-	            swapout(0)
-		    addr = findbest(size)
-		fin
-	    fin
-	fin
+    	addr = findexact(size)
+    	if !addr
+    	    compact
+    	    addr = findbest(size)
+    	    if !addr
+    	        swapout(HMEM_ACCESSED)
+        		addr = findbest(size)
+        		if !addr
+    	            swapout(0)
+        		    addr = findbest(size)
+        		fin
+    	    fin
+    	fin
     fin
     //
     // Fill in the block
@@ -436,8 +359,8 @@ def findblk(size)
     //puts(@getblkstr);puth(addr);putc(':');puth(size);putln
     if addr
         addr=>blksiz = size
-	addr->blkref = 1
-	addr->blklok = 0
+    	addr->blkref = 1
+    	addr->blklok = 0
     fin
     return addr
 end
@@ -449,33 +372,33 @@ def swapin(hmem)
     byte[15] info
     byte ref
     word memblk, size
-    
+
     size = hpgtbl:[hmem.lsb, hmem.msb] & HMEM_SIZE
     if size
         //
-	// This was just uninitialized memory, don't bother reading from file
-	//
+    	// This was just uninitialized memory, don't bother reading from file
+    	//
         memblk = findblk(size)
     else
         //
-	// Swap this block back in
-	//
-	swapfile(@filename, hmem)
-	get_info(@filename, @info)
-	size   = info:2 // Size encoded in aux type
+    	// Swap this block back in
+    	//
+    	swapfile(@filename, hmem)
+    	get_info(@filename, @info)
+    	size   = info:2 // Size encoded in aux type
         memblk = findblk(size)
-	//puts(@swapinstr);puts(@filename);putc('@');puth(memblk);putc(':');puth(size);putln
-	if memblk
-	    //
-	    // Read it in
-	    //
-	    ref = open(@filename)
-	    if ref
-	        read(ref, memblk, size)
-		close(ref)
-		destroy(@filename)
-	    fin
-	fin
+    	//puts(@swapinstr);puts(@filename);putc('@');puth(memblk);putc(':');puth(size);putln
+    	if memblk
+    	    //
+    	    // Read it in
+    	    //
+    	    ref = open(@filename)
+    	    if ref
+    	        read(ref, memblk, size)
+        		close(ref)
+        		destroy(@filename)
+    	    fin
+    	fin
     fin
     if memblk
         hpgtbl:[hmem.lsb, hmem.msb] = memblk
@@ -485,29 +408,29 @@ end
 //
 // Incrementally clear the ACCESSED BIT
 //
-export def sweep
+export def sweep#0
     word memblk
-    
+
     if hpgtbl[sweeppg]
         memblk = hpgtbl:[sweeppg, sweepen]
-	when memblk.lsb & HMEM_STATE
-	    is HMEM_MOVEABLE
-	    is HMEM_LOCKED
-	        memblk = memblk & HMEM_ADDR
-	        if memblk->blklok & HMEM_ACCESSED
-	            memblk->blklok = memblk->blklok & $7F
-		fin
-	wend
-	if sweepen == 255
-	    sweepen = 0
-	    if sweeppg == 0
-	        sweeppg = PG_TBL_SIZE - 1
-	    else
-	        sweeppg = sweeppg - 1
-	    fin
-	else
-	    sweepen = sweepen + 1
-	fin
+    	when memblk.lsb & HMEM_STATE
+    	    is HMEM_MOVEABLE
+    	    is HMEM_LOCKED
+    	        memblk = memblk & HMEM_ADDR
+    	        if memblk->blklok & HMEM_ACCESSED
+    	            memblk->blklok = memblk->blklok & $7F
+        		fin
+    	wend
+    	if sweepen == 255
+    	    sweepen = 0
+    	    if sweeppg == 0
+    	        sweeppg = PG_TBL_SIZE - 1
+    	    else
+    	        sweeppg = sweeppg - 1
+    	    fin
+    	else
+    	    sweepen = sweepen + 1
+    	fin
     else
         sweeppg = PG_TBL_SIZE - 1
     fin
@@ -517,7 +440,7 @@ end
 //
 export def brk(addr)
     word heapalign, brkblk, brksiz, srch
-    
+
     //
     // Check if addr is too high or low
     //
@@ -525,44 +448,44 @@ export def brk(addr)
     if isule(addr, heapmark); return 0; fin
     if not pooladdr
         //
-	// Allocate the memory pool
-	//
+    	// Allocate the memory pool
+    	//
         heapalign = (heapmark | MIN_BLK_MASK) + 1
-	brksiz    = addr - heapalign
-	if isult(brksiz, MAX_BLK_SIZE); return 0; fin // Not enough heap
-        poolsize = addr - heapmark
-	pooladdr = heapalloc(poolsize)
-        if pooladdr
-	    frelst         = heapalign
-            frelst=>fresiz = brksiz
-            frelst=>frenxt = 0
+    	brksiz    = addr - heapalign
+    	if isult(brksiz, MAX_BLK_SIZE); return 0; fin // Not enough heap
+            poolsize = addr - heapmark
+        	pooladdr = heapalloc(poolsize)
+            if pooladdr
+        	    frelst         = heapalign
+                frelst=>fresiz = brksiz
+                frelst=>frenxt = 0
+            else
+                poolsize = 0
+            fin
         else
-            poolsize = 0
-        fin
-    else
         //
-	// Can we extend the memory pool?
-	//
-	if pooladdr + poolsize == heapmark
-	    brksiz = addr - heapmark
+    	// Can we extend the memory pool?
+    	//
+    	if pooladdr + poolsize == heapmark
+    	    brksiz = addr - heapmark
             brkblk = heapalloc(brksiz)
             if brkblk
-	        //
-		// Add block to end of free list
-		//
+    	        //
+        		// Add block to end of free list
+        		//
                 poolsize       = poolsize + brksiz
-		brkblk=>fresiz = brksiz
-		brkblk=>frenxt = 0
-		if frelst
-		    srch = frelst
-		    while srch=>frenxt; srch = srch=>frenxt; loop
-		    srch=>frenxt = brkblk
-		else
-		    frelst = brkblk
-		fin
+        		brkblk=>fresiz = brksiz
+        		brkblk=>frenxt = 0
+        		if frelst
+        		    srch = frelst
+        		    while srch=>frenxt; srch = srch=>frenxt; loop
+        		    srch=>frenxt = brkblk
+        		else
+        		    frelst = brkblk
+        		fin
                 coallesce // combine adjacent free space
-	    fin
-	fin
+    	    fin
+    	fin
     fin
     return poolsize
 end
@@ -575,7 +498,7 @@ end
 //
 export def hmemFre(lptr)
     word srch, free, largest
-    
+
     coallesce
     while compact; loop
     free    = 0
@@ -599,7 +522,7 @@ end
 //
 export def hmemNew(size)
     word page, entry, hnew, memblk
-    
+
     //
     // First, find a free handle
     //
@@ -609,33 +532,33 @@ export def hmemNew(size)
             // Allocate a new page table
             //
             hpgtbl[page] = heapalloc(PG_SIZE)
-	    memset(hpgtbl[page], HMEM_AVAIL, PG_SIZE)
+    	    memset(hpgtbl[page], HMEM_AVAIL, PG_SIZE)
             //puts(@allocpgstr);puth(hpgtbl[page]);putln
-	    //
-	    // Check if we need to allocate the memory pool
-	    //
-	    if not pooladdr
-	        //
-		// Allocate 3/4 of available heap on 128K machine, 1/2 on 64K machine
-		//
-		poolsize = ((@page - heapmark) >> 1) & $7FFF
-		if MACHID & $30 == $30
-	            poolsize = poolsize + (poolsize >> 1)
-		fin
+    	    //
+    	    // Check if we need to allocate the memory pool
+    	    //
+    	    if not pooladdr
+    	        //
+        		// Allocate 3/4 of available heap on 128K machine, 1/2 on 64K machine
+        		//
+        		poolsize = ((@page - heapmark) >> 1) & $7FFF
+        		if MACHID & $30 == $30
+        	            poolsize = poolsize + (poolsize >> 1)
+        		fin
                 if isult(poolsize, MAX_BLK_SIZE)
                     poolsize = MAX_BLK_SIZE
                 fin
-		sbrk(poolsize)
-	    fin
+        		sbrk(poolsize)
+    	    fin
         fin
         for entry = 255 downto 0
             if hpgtbl:[page, entry].lsb == HMEM_AVAIL
                 //
                 // Reserve handle as swapped out block
-		// Nonzero size will flag swapin to not read from disk
+        		// Nonzero size will flag swapin to not read from disk
                 //
                 //putc('N');putc(' ');putb(entry);putb(page);putc('@')
-		size = ((size + t_memblk) | MIN_BLK_MASK) + 1
+        		size = ((size + t_memblk) | MIN_BLK_MASK) + 1
                 hpgtbl:[page, entry] = size | HMEM_SWAPPED
                 hnew.lsb = page
                 hnew.msb = entry
@@ -649,39 +572,39 @@ end
 //
 export def hmemLock(hmem)
     word memblk
-    
+
     memblk = hpgtbl:[hmem.lsb, hmem.msb]
     when memblk.lsb & HMEM_STATE
         is HMEM_SWAPPED
-	    memblk = swapin(hmem)
-	    if not memblk; return 0; fin
-	is HMEM_MOVEABLE
-	    hpgtbl:[hmem.lsb, hmem.msb] = memblk | HMEM_LOCKED
+    	    memblk = swapin(hmem)
+    	    if not memblk; return 0; fin
+    	is HMEM_MOVEABLE
+    	    hpgtbl:[hmem.lsb, hmem.msb] = memblk | HMEM_LOCKED
         is HMEM_LOCKED
-	    memblk = memblk & HMEM_ADDR
-	    memblk->blklok = (memblk->blklok + 1) | HMEM_ACCESSED
+    	    memblk = memblk & HMEM_ADDR
+    	    memblk->blklok = (memblk->blklok + 1) | HMEM_ACCESSED
             //putc('L');putc(' ');puth(hmem);putc('@');puth(memblk);putln
-	    return memblk + t_memblk
+    	    return memblk + t_memblk
     wend
 end
 //
 // Unlock memory block
 //
-export def hmemUnlock(hmem)
+export def hmemUnlock(hmem)#0
     byte lock
     word memblk
-    
+
     memblk = hpgtbl:[hmem.lsb, hmem.msb]
     if memblk.lsb & HMEM_STATE == HMEM_LOCKED
         memblk = memblk & HMEM_ADDR
-	lock = memblk->blklok - 1
-	if lock == HMEM_ACCESSED
-	    //
-	    // Block is now moveable
-	    //
-	    hpgtbl:[hmem.lsb, hmem.msb] = memblk
-	fin
-	memblk->blklok = lock
+    	lock = memblk->blklok - 1
+    	if lock == HMEM_ACCESSED
+    	    //
+    	    // Block is now moveable
+    	    //
+    	    hpgtbl:[hmem.lsb, hmem.msb] = memblk
+    	fin
+    	memblk->blklok = lock
         //putc('U');putc(' ');puth(hmem);putln
     fin
 end
@@ -690,16 +613,16 @@ end
 //
 export def hmemRef(hmem)
     word memblk
-    
+
     memblk = hpgtbl:[hmem.lsb, hmem.msb]
     when memblk.lsb & HMEM_STATE
         is HMEM_SWAPPED
-	    memblk = swapin(hmem)
+    	    memblk = swapin(hmem)
         is HMEM_LOCKED
-	is HMEM_MOVEABLE
-	    memblk = memblk & HMEM_ADDR
-	    if not memblk; return 0; fin
-	    memblk->blkref = memblk->blkref + 1
+    	is HMEM_MOVEABLE
+    	    memblk = memblk & HMEM_ADDR
+    	    if not memblk; return; fin
+    	    memblk->blkref = memblk->blkref + 1
     wend
 end
 //
@@ -708,26 +631,26 @@ end
 export def hmemDel(hmem)
     byte ref
     word memblk
-    
+
     memblk = hpgtbl:[hmem.lsb, hmem.msb]
     when memblk & HMEM_STATE
         is HMEM_SWAPPED
 	    memblk = swapin(hmem)
         is HMEM_LOCKED
-	is HMEM_MOVEABLE
-	    memblk = memblk & HMEM_ADDR
-	    if not memblk; return 0; fin
-	    ref = memblk->blkref - 1
-	    if ref == 0
-	        //
-		// No more references, free block
-		//
-		hpgtbl:[hmem.lsb, hmem.msb] = HMEM_AVAIL
-	        addfre(memblk)
-	    else
-	        memblk->blkref = ref
-	    fin
-	    break
+    	is HMEM_MOVEABLE
+    	    memblk = memblk & HMEM_ADDR
+    	    if not memblk; return 0; fin
+    	    ref = memblk->blkref - 1
+    	    if ref == 0
+    	        //
+        		// No more references, free block
+        		//
+        		hpgtbl:[hmem.lsb, hmem.msb] = HMEM_AVAIL
+    	        addfre(memblk)
+    	    else
+    	        memblk->blkref = ref
+    	    fin
+    	    break
     wend
 end
 //
@@ -738,7 +661,7 @@ end
 initdata = heapmark // Use data at top of heap for initialization
 initdata=>volparms.0 = 2
 initdata=>volparms.1 = 0
-initdata=>volparms:2 = iobuffer
+initdata=>volparms:2 = sysbuf
 syscall($C5, @initdata=>volparms)
 initdata=>volptr   = iobuffer
 initdata=>ramfree  = 0
@@ -749,16 +672,16 @@ for sweepen = 0 to 15
         memcpy(@swapvol + 2, initdata=>volptr + 1, ^initdata=>volptr)
         swapvol = ^initdata=>volptr + 1
         get_info(@swapvol, @initdata->volinfo)
-	initdata=>freeblks = initdata=>volinfo:2 - initdata=>volinfo:5
-	if initdata=>volptr:1 == $522F and initdata=>volptr:3 == $4D41 // '/RAM'
-	    if isugt(initdata=>freeblks, initdata=>ramfree)
-	        initdata=>ramvol  = initdata=>volptr
-		initdata=>ramfree = initdata=>freeblks
-	    fin
-	elsif isugt(initdata=>freeblks, initdata=>bestfree)
-	    initdata=>bestvol  = initdata=>volptr
-	    initdata=>bestfree = initdata=>freeblks
-	fin
+    	initdata=>freeblks = initdata=>volinfo:2 - initdata=>volinfo:5
+    	if initdata=>volptr:1 == $522F and initdata=>volptr:3 == $4D41 // '/RAM'
+    	    if isugt(initdata=>freeblks, initdata=>ramfree)
+    	        initdata=>ramvol  = initdata=>volptr
+        		initdata=>ramfree = initdata=>freeblks
+    	    fin
+    	elsif isugt(initdata=>freeblks, initdata=>bestfree)
+    	    initdata=>bestvol  = initdata=>volptr
+    	    initdata=>bestfree = initdata=>freeblks
+    	fin
     fin
     initdata=>volptr = initdata=>volptr + 16
 next
@@ -780,27 +703,27 @@ initdata->swapstrlen = swapvol
 repeat
     if read(initdata->catref, @initdata->catalog, 512) == 512
         initdata=>catentry = @initdata->catalog.4
-	if initdata->firstblk
-	    initdata->entrylen   = initdata->catalog.$23
-	    initdata->entriesblk = initdata->catalog.$24
-	    initdata=>filecnt    = initdata=>catalog:$25
-	    initdata=>catentry   = initdata=>catentry + initdata->entrylen
+    	if initdata->firstblk
+    	    initdata->entrylen   = initdata->catalog.$23
+    	    initdata->entriesblk = initdata->catalog.$24
+    	    initdata=>filecnt    = initdata=>catalog:$25
+    	    initdata=>catentry   = initdata=>catentry + initdata->entrylen
         fin
-	for sweepen = initdata->firstblk to initdata->entriesblk
-	    ^initdata=>catentry = ^initdata=>catentry & $0F
-	    if ^initdata=>catentry
+    	for sweepen = initdata->firstblk to initdata->entriesblk
+    	    ^initdata=>catentry = ^initdata=>catentry & $0F
+    	    if ^initdata=>catentry
                 memcpy(@swapvol + swapvol + 1, initdata=>catentry + 1, ^initdata=>catentry)
                 swapvol = swapvol + ^initdata=>catentry
-	        destroy(@swapvol)
+    	        destroy(@swapvol)
                 swapvol = initdata->swapstrlen
-	    fin
-	    initdata=>catentry = initdata=>catentry + initdata->entrylen
+    	    fin
+    	    initdata=>catentry = initdata=>catentry + initdata->entrylen
         next
-	initdata->firstblk = 0
+    	initdata->firstblk = 0
     else
         initdata->filecnt = 0
     fin
 until !initdata->filecnt
 close(initdata->catref)
 //puts(@swapvol); putln
-done
\ No newline at end of file
+done
diff --git a/src/libsrc/portio.pla b/src/libsrc/portio.pla
index 57088e6..23e4d4e 100644
--- a/src/libsrc/portio.pla
+++ b/src/libsrc/portio.pla
@@ -1,13 +1,7 @@
 //
 // Game port I/O library based on the wiring library
 //
-import cmdsys
-    predef syscall, call, getc, gets, putc, puts, putln
-    predef memset, memcpy, modaddr, modexec
-    predef heapmark, heapallocalign, heapalloc, heaprelease
-    predef isugt, isuge, isult, isule
-    byte MACHID
-end
+include "inc/cmdsys.plh"
 
 const ANN0   = $C058
 const ANN1   = $C05A
diff --git a/src/libsrc/sdfat.pla b/src/libsrc/sdfat.pla
index 2f6fd7d..9c1d68d 100644
--- a/src/libsrc/sdfat.pla
+++ b/src/libsrc/sdfat.pla
@@ -1,7 +1,5 @@
+include "inc/cmdsys.plh"
 include "inc/spiport.plh"
-import cmdsys
-    predef call, putc, puts, putln
-end
 
 //
 // FAT I/O object
@@ -21,7 +19,7 @@ word[] = @size, @truncate, @isDir, @isFile
 //
 def cwd(pathname)
     byte namelen
-    
+
     namelen = 0
     spiSend(15) // CWD
     namelen = spiRecv
@@ -55,7 +53,7 @@ end
 
 def openDir(cmd, filename)
     byte namelen
-    
+
     namelen = 0
     spiSend(cmd)
     namelen = spiRecv
@@ -148,4 +146,4 @@ end
 //
 spiSend(14) // SDINIT
 return spiReady <> 0 // Is Arduino READY?
-done
\ No newline at end of file
+done
diff --git a/src/libsrc/spiport.pla b/src/libsrc/spiport.pla
index 405034f..7129cd2 100644
--- a/src/libsrc/spiport.pla
+++ b/src/libsrc/spiport.pla
@@ -1,6 +1,4 @@
-import cmdsys
-    predef call, putc, puts, putln
-end
+include "inc/cmdsys.plh"
 //
 // Bit banged spi over gameport
 //
diff --git a/src/libsrc/uthernet.pla b/src/libsrc/uthernet.pla
index 4d22a1f..6340c2e 100644
--- a/src/libsrc/uthernet.pla
+++ b/src/libsrc/uthernet.pla
@@ -1,13 +1,7 @@
 //
 // Original Uthernet ethernet card based on Cirrus Logic cs8900a
 //
-import cmdsys
-    predef syscall, call, getc, gets, putc, puts, putln
-    predef isugt, isuge, isult, isule
-    predef memset, memcpy, modaddr, modexec
-    predef heapmark, heapallocalign, heapalloc, heaprelease, heapavail
-    byte MACHID
-end
+include "inc/cmdsys.plh"
 //
 // Include dependency on S/W IP stack
 //
diff --git a/src/libsrc/uthernet2.pla b/src/libsrc/uthernet2.pla
index c6316e8..a201c30 100644
--- a/src/libsrc/uthernet2.pla
+++ b/src/libsrc/uthernet2.pla
@@ -4,13 +4,7 @@
 // TCP/IP is built into hardware, so no dependencies on the software
 // layers, like the Uthernet
 //
-import cmdsys
-    predef syscall, call, getc, gets, putc, puts, putln
-    predef isugt, isuge, isult, isule
-    predef memset, memcpy, modaddr, modexec
-    predef heapmark, heapallocalign, heapalloc, heaprelease, heapavail
-    byte MACHID
-end
+include "inc/cmdsys.plh"
 //
 // Net object
 //
@@ -417,7 +411,7 @@ def pokeregw(reg, dataw)
 end
 def peekregw(reg)
     word dataw
-    
+
     _pokeiow(reg)
     dataw.1 = _peekio()
     _pokeiow(reg + 1)
@@ -429,7 +423,7 @@ end
 //
 def wizSendUDP(wiz, ipdst, portdst, data, len)
     word wizregs, wizdata, txrr, txwr, splitlen
-    
+
     wizregs = wiz=>channel_regs
     wizdata = wiz=>channel_txmem
     if !ipdst
@@ -633,7 +627,7 @@ end
 //
 def wizSendTCP(wiz, data, len)
     word wizregs, wizdata, txrr, txwr, splitlen
-    
+
     if wiz->channel_state <> TCP_STATE_OPEN; return -1; fin
     wizregs = wiz=>channel_regs
     wizdata = wiz=>channel_txmem
@@ -717,7 +711,7 @@ end
 def wizServiceIP
     word wiz, wizregs, wizdata, rxlen, rxrr, rxwr, rxpkt, splitlen
     byte ir, i, sir
-    
+
     ir = peekreg(WIZ_IR)
     if ir
         wiz = @wizChannel
diff --git a/src/libsrc/wiznet.pla b/src/libsrc/wiznet.pla
index bff544e..7260104 100644
--- a/src/libsrc/wiznet.pla
+++ b/src/libsrc/wiznet.pla
@@ -4,13 +4,7 @@
 // TCP/IP is built into hardware, so no dependencies on the software
 // layers, like the Uthernet
 //
-import cmdsys
-    predef syscall, call, getc, gets, putc, puts, putln
-    predef isugt, isuge, isult, isule
-    predef memset, memcpy, modaddr, modexec
-    predef heapmark, heapallocalign, heapalloc, heaprelease, heapavail
-    byte MACHID
-end
+include "inc/cmdsys.plh"
 //
 // Net object
 //
@@ -426,7 +420,7 @@ def pokeregw(reg, dataw)
 end
 def peekregw(reg)
     word dataw
-    
+
     _pokeiow(reg)
     dataw.1 = _peekio()
     _pokeiow(reg + 1)
@@ -456,7 +450,7 @@ def puti(i)
 end
 def putip(ipptr)
     byte i
-    
+
     for i = 0 to 2
         puti(ipptr->[i]); putc('.')
     next
@@ -467,7 +461,7 @@ end
 //
 def wizSendUDP(wiz, ipdst, portdst, data, len)
     word wizregs, wizdata, txrr, txwr, splitlen
-    
+
     wizregs = wiz=>channel_regs
     wizdata = wiz=>channel_txmem
     if !ipdst
@@ -678,7 +672,7 @@ end
 //
 def wizSendTCP(wiz, data, len)
     word wizregs, wizdata, txrr, txwr, splitlen
-    
+
     if wiz->channel_state <> TCP_STATE_OPEN; return -1; fin
     //putc('W');puti(len);putc(':')
     wizregs = wiz=>channel_regs
@@ -715,7 +709,7 @@ def wizCloseTCP(wiz)
 	//
 	// Clear notiications on this port
 	//
-        if wiz->channel_proto == WIZ_PROTO_TCP and (wiz->channel_state == TCP_STATE_OPEN or wiz->channel_state == TCP_STATE_CLOSING) 
+        if wiz->channel_proto == WIZ_PROTO_TCP and (wiz->channel_state == TCP_STATE_OPEN or wiz->channel_state == TCP_STATE_CLOSING)
             wiz->channel_state = TCP_STATE_CLOSING
             pokereg(wiz=>channel_regs + WIZ_SnCR, $08) // DISCON
 	    repeat
@@ -768,7 +762,7 @@ end
 def wizServiceIP
     word wiz, wizregs, wizdata, rxlen, rxrr, rxwr, rxpkt, splitlen
     byte ir, i, sir
-    
+
     ir = peekreg(WIZ_IR)
     if ir and ir <> $FF // Ignore spurious read of IR
         //putc('I');putb(ir)
@@ -868,7 +862,7 @@ def wizServiceIP
 				// Write TCP socket OK
 				//
 			    //fin
-                            break			    
+                            break
                         is WIZ_PROTO_UDP
                             //putc('U');putb(sir)
                             if sir & $04
@@ -911,7 +905,7 @@ def wizServiceIP
             //
             pokereg(WIZ_IR, ir)
         fin
-    fin    
+    fin
 end
 //
 // Set the local IP addresses
diff --git a/src/mockingboard/seqplay.pla b/src/mockingboard/seqplay.pla
index c192206..a72f3ee 100755
--- a/src/mockingboard/seqplay.pla
+++ b/src/mockingboard/seqplay.pla
@@ -93,9 +93,6 @@ word[5] arpeggioDuration = DUR16TH, DUR16TH, DUR16TH/2, DUR16TH/3, DUR16TH/4
 //
 word arg
 word ref
-asm defs
-        !SOURCE "../vmsrc/plvmzp.inc"
-end
 ///////////////////////////////////////////////////////////////////////////////
 //
 // Emulators are broken - they only activate the MockingBoard's 6522 Timer1
@@ -105,6 +102,9 @@ end
 // disabled. NO INTERRUPTS ARE HANDLED WHEN PLAYING MUSIC! The previous state
 // is restored between playing sequences.
 //
+asm vmincs
+        !SOURCE "../vmsrc/plvmzp.inc"
+end
 asm getStatusReg#1
         PHP
         PLA
diff --git a/src/samplesrc/hello.pla b/src/samplesrc/hello.pla
index 61c3725..bb39d48 100644
--- a/src/samplesrc/hello.pla
+++ b/src/samplesrc/hello.pla
@@ -1,6 +1,4 @@
-import cmdsys
-    predef puts
-end
+include "inc/cmdsys.plh"
 
 puts("Hello, world.\n")
 done
diff --git a/src/samplesrc/hgr1.pla b/src/samplesrc/hgr1.pla
index c16fed3..d8d4ea4 100644
--- a/src/samplesrc/hgr1.pla
+++ b/src/samplesrc/hgr1.pla
@@ -1,17 +1,4 @@
-import cmdsys
-    predef memset
-    //
-    // System flags: memory allocator screen holes.
-    //
-    const restxt1     = $0001
-    const restxt2     = $0002
-    const resxtxt1    = $0004
-    const resxtxt2    = $0008
-    const reshgr1     = $0010
-    const reshgr2     = $0020
-    const resxhgr1    = $0040
-    const resxhgr2    = $0080
-end
+include "inc/cmdsys.plh"
 
 sysflags reshgr1	// Reserve HGR page 1
 
@@ -20,4 +7,4 @@ memset($2000, 0, $2000) // Clear HGR page 1
 ^$C052
 ^$C057
 ^$C050
-done
\ No newline at end of file
+done
diff --git a/src/samplesrc/hgr1test.pla b/src/samplesrc/hgr1test.pla
index 278a437..6c19402 100644
--- a/src/samplesrc/hgr1test.pla
+++ b/src/samplesrc/hgr1test.pla
@@ -1,8 +1,4 @@
-import cmdsys
-    predef memset, memcpy, heapalloc, heapmark, heaprelease
-    predef puts, putc, gets, getc
-    predef isugt, isuge, isult, isule
-end
+include "inc/cmdsys.plh"
 import HGR1
 end
 
diff --git a/src/samplesrc/httpd.pla b/src/samplesrc/httpd.pla
index f8b236a..edaa382 100644
--- a/src/samplesrc/httpd.pla
+++ b/src/samplesrc/httpd.pla
@@ -8,13 +8,7 @@
 // - check for binary files and set Content-Type accordingly
 // still todo: output base filename for Content-Disposition header
 //
-import cmdsys
-    predef syscall, call, getc, gets, putc, puts, putln
-    predef memset, memcpy, modaddr, modexec
-    predef isugt, isuge, isult, isule
-    predef heapmark, heapallocalign, heapalloc, heaprelease
-    byte MACHID
-end
+include "inc/cmdsys.plh"
 //
 // Net object
 //
@@ -116,7 +110,7 @@ def read(refnum, buff, len)
 end
 def get_eof(refnum)
     byte params[5]
-    
+
     params.0 = 2
     params.1 = refnum
     params:2 = 0
@@ -125,7 +119,7 @@ def get_eof(refnum)
     return params:2
 end
 def get_file_info(path)
-    
+
     fileInfo.0 = 10 // param count
     fileInfo:1 = path // path name
 
@@ -155,7 +149,7 @@ def puti(i)
 end
 def putip(ipptr)
     byte i
-    
+
     for i = 0 to 2
         puti(ipptr->[i]); putc('.')
     next
@@ -163,7 +157,7 @@ def putip(ipptr)
 end
 def dumpbytes(buf, len)
     word i
-    
+
     for i = 0 to len - 1
         putb(buf->[i])
 	if i & 15 == 15
@@ -175,7 +169,7 @@ def dumpbytes(buf, len)
 end
 def dumpchars(buf, len)
     word i
-  
+
     len = len - 1
     for i = 0 to len
         putc(buf->[i])
@@ -194,7 +188,7 @@ def itos(dst, i)
     if i < 0; ^dst = '-'; i = -i; dst = dst + 1; fin
     if i < 10
         ^dst = i + '0'
-    else  
+    else
         dst = itos(dst, i / 10)
         ^dst = i % 10 + '0'
     fin
@@ -247,7 +241,7 @@ def servHTTP(remip, remport, lclport, data, len, param)
 			    url->1 = url->0 - 1
 			    url = url + 1
 			fin
-		    fin 
+		    fin
 		    strcat(@filename, @prefix, url)
 		    puts("GET:"); puts(@filename);putln
 		    //
@@ -271,7 +265,7 @@ def servHTTP(remip, remport, lclport, data, len, param)
 			    //
 			    //puts(@mimeTextHtml) // debug
 			    strcat(@okhdr, @okhdr, @httpContentType)
-			    strcat(@okhdr, @okhdr, @mimeTextHtml)	
+			    strcat(@okhdr, @okhdr, @mimeTextHtml)
 			else
 			    //
 			    // send as binary attachment
@@ -285,7 +279,7 @@ def servHTTP(remip, remport, lclport, data, len, param)
 			    //
 			    strcat(@okhdr, @okhdr, @httpContentAttach)
 			    // todo: get the base filename...
-			fin 			
+			fin
 			strcat(@okhdr, @okhdr, @httpEnd)
 			//dumpchars(@okhdr + 1, okhdr) // debug
 			iNet:sendTCP(socketHTTP, @okhdr + 1, okhdr) // send HTTP response header to client
@@ -313,8 +307,8 @@ getpfx(@prefix)
 //
 // Alloc aligned file/io buffers
 //
-filebuff = heapallocalign(1024, 8, 0) 
-iobuff   = heapallocalign(1024, 8, 0) 
+filebuff = heapallocalign(1024, 8, 0)
+iobuff   = heapallocalign(1024, 8, 0)
 //
 // Service IP
 //
@@ -329,4 +323,4 @@ repeat
 until ^$C000 > 127
 ^$C010
 
-done
\ No newline at end of file
+done
diff --git a/src/samplesrc/memtest.pla b/src/samplesrc/memtest.pla
index e055a73..238a634 100644
--- a/src/samplesrc/memtest.pla
+++ b/src/samplesrc/memtest.pla
@@ -1,10 +1,4 @@
-import cmdsys
-    predef syscall, call, memset, getc, gets, putc, puts, putln
-    predef memset, memcpy, modaddr, modexec
-    predef heapmark, heapallocalign, heapalloc, heaprelease
-    predef isugt, isuge, isult, isule
-    byte MACHID
-end
+include "inc/cmdsys.plh"
 import memmgr
     predef sweep, brk, sbrk
     predef hmemNew, hmemLock, hmemUnlock, hmemRef, hmemDel, hmemFre
@@ -76,4 +70,4 @@ if memptr; puth(e); putc('='); puth(*memptr); putln; fin
 hmemUnlock(e)
 hmemDel(e)
 memfre=hmemFre(@memlrgst);puth(memfre); putc(' '); puth(memlrgst); putln
-done
\ No newline at end of file
+done
diff --git a/src/samplesrc/mon.pla b/src/samplesrc/mon.pla
index 3b49838..d3bf2b9 100644
--- a/src/samplesrc/mon.pla
+++ b/src/samplesrc/mon.pla
@@ -1,10 +1,4 @@
-import cmdsys
-    predef syscall, call, memset, getc, gets, putc, puts, putln
-    predef memset, memcpy, modaddr, modexec
-    predef heapmark, heapallocalign, heapalloc, heaprelease
-    predef isugt, isuge, isult, isule
-    byte MACHID
-end
+include "inc/cmdsys.plh"
 byte bye = $20, $00, $BF, $65
 word paramsptr
 byte[7] params = 4
@@ -22,4 +16,4 @@ paramsptr = @params
 // Call into monitor
 //
 call(-151, 0, 0, 0, 0)
-done
\ No newline at end of file
+done
diff --git a/src/samplesrc/rod.pla b/src/samplesrc/rod.pla
index 3582751..ab357e6 100644
--- a/src/samplesrc/rod.pla
+++ b/src/samplesrc/rod.pla
@@ -1,7 +1,4 @@
-import cmdsys
-    predef syscall(f,p)#1, call(adr,a,x,y,p)#1, memset(d,s,l)#1, getc#1, putc(c)#1, puts(s)#1, modaddr(a)#1
-    byte MACHID
-end
+include "inc/cmdsys.plh"
 //
 // Handy constants.
 //
diff --git a/src/samplesrc/rogue.combat.pla b/src/samplesrc/rogue.combat.pla
index 5af63cf..d2c3fef 100644
--- a/src/samplesrc/rogue.combat.pla
+++ b/src/samplesrc/rogue.combat.pla
@@ -1,9 +1,4 @@
-import cmdsys
-  predef syscall, call, memset, getc, putc, puts, putln
-  predef memset, memcpy
-  predef heapmark, heapallocalign, heapalloc, heaprelease, heapavail
-  byte MACHID
-end
+include "inc/cmdsys.plh"
 
 import ROGUEMAP
   predef puti, toupper, moveplayer
diff --git a/src/samplesrc/rogue.io.pla b/src/samplesrc/rogue.io.pla
index e9f2e4f..006c1d3 100644
--- a/src/samplesrc/rogue.io.pla
+++ b/src/samplesrc/rogue.io.pla
@@ -1,9 +1,4 @@
-import cmdsys
-    predef syscall, call, getc, putc, puts, putln
-    predef memset, memcpy, modaddr
-    predef heapmark, heapallocalign, heapalloc, heaprelease, heapavail
-    byte MACHID
-end
+include "inc/cmdsys.plh"
 
 const modkeep     = $2000
 const modinitkeep = $4000
@@ -279,4 +274,4 @@ while ^titlestr
   titlestr = titlestr + ^titlestr + 1
 loop
 
-done
\ No newline at end of file
+done
diff --git a/src/samplesrc/rogue.map.pla b/src/samplesrc/rogue.map.pla
index 774a62e..6794daf 100644
--- a/src/samplesrc/rogue.map.pla
+++ b/src/samplesrc/rogue.map.pla
@@ -1,12 +1,7 @@
 //
 // Map module
 //
-import cmdsys
-  predef syscall, call, getc, putc, puts, putln
-  predef memset, memcpy, modaddr
-  predef heapmark, heapallocalign, heapalloc, heaprelease, heapavail
-  byte MACHID
-end
+include "inc/cmdsys.plh"
 
 import rogueio
   const O_READ       = 1
@@ -767,4 +762,4 @@ export def drawvisentity(xofst, yofst, tile)
   fin
 end
 
-done
\ No newline at end of file
+done
diff --git a/src/samplesrc/rogue.pla b/src/samplesrc/rogue.pla
index be37d78..02780fc 100755
--- a/src/samplesrc/rogue.pla
+++ b/src/samplesrc/rogue.pla
@@ -1,9 +1,4 @@
-import cmdsys
-  predef syscall, call, memset, getc, gets, putc, puts, putln
-  predef memset, memcpy
-  predef heapmark, heapallocalign, heapalloc, heaprelease, heapavail
-  byte MACHID
-end
+include "inc/cmdsys.plh"
 
 import roguemap
   const xcentr     = 20
@@ -238,7 +233,7 @@ end
 
 def moveplayer(dir)
   byte xmove, ymove
-  
+
   xmove = player.xpos + dir * xdir[player.angle]
   ymove = player.ypos + dir * ydir[player.angle]
   when getmaptile(xmove, ymove) & MAP_TILE
@@ -666,4 +661,3 @@ else
 fin
 puts(@againstr)
 done
-
diff --git a/src/samplesrc/sieve.pla b/src/samplesrc/sieve.pla
index 7eee507..364563f 100644
--- a/src/samplesrc/sieve.pla
+++ b/src/samplesrc/sieve.pla
@@ -1,7 +1,4 @@
-import cmdsys
-    predef syscall, call, memset, getc, putc, puts, putln
-    byte MACHID
-end
+include "inc/cmdsys.plh"
 
 const FALSE  = 0
 const TRUE   = !FALSE
@@ -48,4 +45,4 @@ beep
 beep
 puti(count)
 puts(@strPrimes)
-done
\ No newline at end of file
+done
diff --git a/src/toolsrc/ed.pla b/src/toolsrc/ed.pla
index ed8ab61..eb7a518 100755
--- a/src/toolsrc/ed.pla
+++ b/src/toolsrc/ed.pla
@@ -1,26 +1,24 @@
+//=====================================
 //
-// Global constants
+//              Text Editor
 //
-const false         = 0
-const true          = 1
+//=====================================
+
+include "inc/cmdsys.plh"
+include "inc/args.plh"
+include "inc/fileio.plh"
 //
 // Hardware constants
 //
 const csw           = $0036
-const speaker       = $C030
-const showgraphics  = $C050
-const showtext      = $C051
-const showfull      = $C052
-const showmix       = $C053
-const showpage1     = $C054
-const showpage2     = $C055
-const showlores     = $C056
-const showhires     = $C057
 const pushbttn1     = $C061
 const pushbttn2     = $C062
 const pushbttn3     = $C063
 const keyboard      = $C000
 const keystrobe     = $C010
+//
+// ASCII key values
+//
 const keyenter      = $8D
 const keyspace      = $A0
 const keyarrowup    = $8B
@@ -50,21 +48,16 @@ const keyctrlw      = $97
 const keyctrlx      = $98
 const keyctrlz      = $9A
 const keydelete     = $FF
+//
+// Input buffer
+//
 const getbuff       = $01FF
 //
 // Data and text buffer constants
 //
-const machid        = $BF98
 const maxlines      = 1500
 const maxfill       = 1524
-const iobuffer      = $0800
-const databuff      = $0C00
-const strlinbuf     = $1000
-const strheapmap    = $1F00
-const strheapmsz    = 224 // $E0 = 28K is memory@16 bytes per bit map, 128 bytes per 8 bit map, 1K bytes per 8 byte map
 const maxlnlen      = 79
-const strheap       = $4800
-const strheasz      = $7000
 const pgjmp         = 16
 const changed       = 1
 const insmode       = 2
@@ -72,12 +65,6 @@ const showcurs      = 4
 const uppercase     = 8
 const shiftlock     = 128
 //
-// Argument buffer
-//
-word	          = $EEEE
-byte              = 32 // buffer length
-byte[32] argbuff  = ""
-//
 // Text screen row address array
 //
 word txtscrn      = $0400,$0480,$0500,$0580,$0600,$0680,$0700,$0780
@@ -87,13 +74,12 @@ word              = $0450,$04D0,$0550,$05D0,$0650,$06D0,$0750,$07D0
 // Editor variables
 //
 byte nullstr      = ""
-byte version      = "PLASMA ][ EDITOR VERSION 0.9 "
-byte errorstr     = "ERROR: $"
-byte okstr        = "OK"
-byte outofmem     = "OUT OF MEMORY!"
-byte losechng     = "LOSE CHANGES TO FILE (Y/N)?"
-byte untitled     = "UNTITLED"
-byte[64] txtfile  = "UNTITLED.PLA"
+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 flags        = 0
 byte flash        = 0
 word numlines     = 0
@@ -110,267 +96,9 @@ predef cmdmode
 // Defines for ASM routines
 //
 asm equates
-INTERP	=	$03D0
-LCRDEN 	=	$C080
-LCWTEN	=	$C081
-ROMEN	=	$C082
-LCRWEN 	=	$C083
-LCBNK2	=	$00
-LCBNK1	=	$08
 	!SOURCE	"vmsrc/plvmzp.inc"
 end
-//
-// CALL 6502 ROUTINE
-// CALL(ADDR, AREG, XREG, YREG, STATUS)
-//
-asm call
-REGVALS	=	SRC
-        PHP
-        LDA     ESTKL+4,X
-        STA     TMPL
-        LDA     ESTKH+4,X
-        STA     TMPH
-        LDA     ESTKL,X
-        PHA
-        LDA     ESTKL+1,X
-        TAY
-        LDA     ESTKL+3,X
-        PHA
-        LDA     ESTKL+2,X
-        INX
-        INX
-        INX
-	INX
-        STX     ESP
-        TAX
-        PLA
-        BIT     ROMEN
-        PLP
-        JSR     JMPTMP
-        PHP
-        BIT     LCRDEN+LCBNK2
-        STA     REGVALS+0
-        STX     REGVALS+1
-        STY     REGVALS+2
-        PLA
-        STA     REGVALS+3
-        LDX     ESP
-        LDA     #<REGVALS
-        LDY     #>REGVALS
-        STA     ESTKL,X
-        STY     ESTKH,X
-        PLP
-        RTS
-JMPTMP	JMP	(TMP)
-end
-//
-// CALL PRODOS
-// SYSCALL(CMD, PARAMS)
-//
-asm syscall
-	LDA	ESTKL,X
-	LDY	ESTKH,X
-	STA	PARAMS
-	STY	PARAMS+1
-	INX
-	LDA	ESTKL,X
-	STA	CMD
-	JSR	$BF00
-CMD:	!BYTE	00
-PARAMS:	!WORD	0000
-	LDY    	#$00
-	STA	ESTKL,X
-	STY	ESTKH,X
-	RTS
-end
-// SET MEMORY TO VALUE
-// MEMSET(ADDR, SIZE, VALUE)
-//   With optimizations from Peter Ferrie
-//
-asm memset
-	LDY     #$00
-	LDA     ESTKL+2,X
-	STA     DSTL
-	LDA     ESTKH+2,X
-	STA     DSTH
-	INC     ESTKL+1,X
-	INC     ESTKH+1,X
-SETMLPL	CLC
-	LDA     ESTKL,X
-SETMLPH	DEC     ESTKL+1,X
-	BNE     +
-	DEC     ESTKH+1,X
-	BEQ     SETMEX
-+	STA     (DST),Y
-	INY
-	BNE	+
-	INC     DSTH
-+	BCS	SETMLPL
-	SEC
-	LDA     ESTKH,X
-	BCS	SETMLPH
-SETMEX	INX
-	INX
-	RTS
-end
-//
-// COPY MEMORY
-// MEMCPY(DSTADDR, SRCADDR, SIZE)
-//
-asm memcpy
-	INX
-	INX
-	LDA	ESTKL-2,X
-	ORA	ESTKH-2,X
-	BEQ	CPYMEX
-	LDA	ESTKL-1,X
-	CMP	ESTKL,X
-	LDA	ESTKH-1,X
-	SBC	ESTKH,X
- 	BCC	REVCPY
-;
-; FORWARD COPY
-;
-	LDA	ESTKL,X
-	STA 	DSTL
-	LDA	ESTKH,X
-	STA 	DSTH
-	LDA	ESTKL-1,X
-	STA 	SRCL
-	LDA	ESTKH-1,X
-	STA 	SRCH
-	INC 	ESTKH-2,X
-	LDY	#$00
-FORCPYLP LDA	(SRC),Y
-	STA	(DST),Y
-	INY
-	BNE	+
-	INC	DSTH
-	INC	SRCH
-+	DEC 	ESTKL-2,X
-	BNE	FORCPYLP
-	DEC	ESTKH-2,X
-	BNE	FORCPYLP
-	RTS
-;
-; REVERSE COPY
-;
-REVCPY	;CLC
-	LDA 	ESTKL-2,X
-	ADC	ESTKL,X
-	STA	DSTL
-	LDA	ESTKH-2,X
-	ADC	ESTKH,X
-	STA	DSTH
-	CLC
-	LDA 	ESTKL-2,X
-	ADC	ESTKL-1,X
-	STA	SRCL
-	LDA	ESTKH-2,X
-	ADC	ESTKH-1,X
-	STA	SRCH
-	INC 	ESTKH-2,X
-	DEC	DSTH
-	DEC	SRCH
-	LDY	#$FF
-REVCPYLP LDA	(SRC),Y
-	STA	(DST),Y
-	DEY
-	CPY	#$FF
-	BNE	+
-	DEC	DSTH
-	DEC	SRCH
-+	DEC 	ESTKL-2,X
-	BNE	REVCPYLP
-	DEC	ESTKH-2,X
-	BNE	REVCPYLP
-CPYMEX	RTS
-end
-//
-// CHAR OUT
-// COUT(CHAR)
-//
-asm cout
-	LDA	ESTKL,X
-	ORA 	#$80
-	BIT	ROMEN
-	JSR	$FDED
-	BIT	LCRDEN+LCBNK2
-	RTS
-end
-//
-// CHAR IN
-// RDKEY()
-//
-asm cin
-	BIT	ROMEN
-	JSR	$FD0C
-	BIT	LCRDEN+LCBNK2
-	DEX
-	LDY	#$00
-	STA	ESTKL,X
-	STY	ESTKH,X
-	RTS
-end
-//
-// PRINT STRING
-// PRSTR(STR)
-//
-asm prstr
-	LDY	#$00
-	LDA     ESTKL,X
-	STA     SRCL
-	LDA     ESTKH,X
-	STA     SRCH
-	LDA     (SRC),Y
-	STA     TMP
-	BEQ     ++
-	BIT	ROMEN
--	INY
-	LDA	(SRC),Y
-	ORA	#$80
-	JSR	$FDED
-	CPY	TMP
-	BNE	-
-	BIT	LCRDEN+LCBNK2
-++	RTS
-end
-//
-// READ STRING
-// STR = RDSTR(PROMPTCHAR)
-//
-asm rdstr
-        LDA     ESTKL,X
-        STA     $33
-        STX     ESP
-        BIT     ROMEN
-        JSR     $FD6A
-	BIT	LCRDEN+LCBNK2
-        STX     $01FF
--       LDA     $01FF,X
-        AND     #$7F
-        STA     $01FF,X
-        DEX
-        BPL     -
-        LDX     ESP
-        LDA     #$FF
-        STA     ESTKL,X
-        LDA     #$01
-        STA     ESTKH,X
-	RTS
-end
-//
-// EXIT
-//
-asm exit
-        JSR	$BF00
-        !BYTE	$65
-        !WORD	EXITTBL
-EXITTBL:
-        !BYTE	4
-        !BYTE	0
-end
-//def toupper_11(c)
+//def toupper(c)
 //   if c >= 'a'
 //       if c <= 'z'
 //           return c - $20
@@ -380,7 +108,7 @@ end
 //end
 asm toupper
         LDA     ESTKL,X
-	AND     #$7F
+        AND     #$7F
         CMP     #'a'
         BCC     +
         CMP     #'z'+1
@@ -388,7 +116,7 @@ asm toupper
         SEC
         SBC     #$20
 +       STA     ESTKL,X
-	RTS
+        RTS
 end
 asm clrhibit(strptr)
         LDA     ESTKL,X
@@ -404,7 +132,7 @@ CLHILP  LDA     (SRC),Y
         STA     (SRC),Y
         DEY
         BNE     CLHILP
-+	RTS
++       RTS
 end
 asm sethibit(strptr)
         LDA     ESTKL,X
@@ -420,14 +148,14 @@ STHILP  LDA     (SRC),Y
         STA     (SRC),Y
         DEY
         BNE     STHILP
-+	RTS
++       RTS
 end
 asm cpyln(srcstr, dststr)
         LDA     ESTKL,X
         STA     DSTL
         LDA     ESTKH,X
         STA     DSTH
-	INX
+        INX
         LDA     ESTKL,X
         STA     SRCL
         LDA     ESTKH,X
@@ -450,112 +178,14 @@ CPLNLP  LDA     (SRC),Y
         BNE     CPLNLP
         LDA     (SRC),Y
 ++      STA     (DST),Y
-	RTS
+        RTS
 end
-//
-// ProDOS routines
-//
-def getpfx(path)
-    byte params[3]
-
-    ^path    = 0
-    params.0 = 1
-    params:1 = path
-    perr     = syscall($C7, @params)
-    return path
-end
-def setpfx(path)
-    byte params[3]
-
-    params.0 = 1
-    params:1 = path
-    perr     = syscall($C6, @params)
-    return path
-end
-def open(path, buff)
-    byte params[6]
-
-    params.0 = 3
-    params:1 = path
-    params:3 = buff
-    params.5 = 0
-    perr     = syscall($C8, @params)
-    return params.5
-end
-def close(refnum)
-    byte params[2]
-
-    params.0 = 1
-    params.1 = refnum
-    perr     = syscall($CC, @params)
-    return perr
-end
-def read(refnum, buff, len)
-    byte params[8]
-
-    params.0 = 4
-    params.1 = refnum
-    params:2 = buff
-    params:4 = len
-    params:6 = 0
-    perr     = syscall($CA, @params)
-    return params:6
-end
-def write(refnum, buff, len)
-    byte params[8]
-
-    params.0 = 4
-    params.1 = refnum
-    params:2 = buff
-    params:4 = len
-    params:6 = 0
-    perr     = syscall($CB, @params)
-    return params:6
-end
-def create(path, access, type, aux)
-    byte params[12]
-
-    params.0  = 7
-    params:1  = path
-    params.3  = access
-    params.4  = type
-    params:5  = aux
-    params.7  = $1
-    params:8  = 0
-    params:10 = 0
-    perr      = syscall($C0, @params)
-    return perr
-end
-def destroy(path)
-    byte params[12]
-
-    params.0 = 1
-    params:1 = path
-    perr     = syscall($C1, @params)
-    return perr
-end
-def newline(refnum, emask, nlchar)
-    byte params[4]
-
-    params.0 = 3
-    params.1 = refnum
-    params.2 = emask
-    params.3 = nlchar
-    perr     = syscall($C9, @params)
-    return perr
-end
-
-//=====================================
-//
-//            Editor
-//
-//=====================================
 
 def crout
     cout($0D)
 end
 def bell
-    return call($FBDD, 0, 0, 0, 0)
+    cout($07)
 end
 //
 // Memory management routines
@@ -565,58 +195,12 @@ def strcpy(dststr, srcstr)
 
     strlen = ^srcstr
     while (srcstr).[strlen] == $8D or (srcstr).[strlen] == $A0
-        strlen = strlen - 1
+        strlen--
     loop
     ^dststr = strlen
     memcpy(dststr + 1, srcstr + 1, strlen)
 end
-def heapaddr(ofst, mask)
-    word addr
-
-    addr = (ofst << 7) + strheap
-    while !(mask & 1)
-        addr = addr + 16
-        mask = mask >> 1
-    loop
-    return addr
-end
-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 heapalloc(size)
-    byte szmask, i
-    word mapmask
-
-    szmask = sizemask(size)
-    for i = strheapmsz - 1 downto 0
-        if strheapmap.[i] <> $FF
-            mapmask = szmask
-            repeat
-                if strheapmap.[i] & mapmask
-                    mapmask = mapmask << 1
-                else
-                    strheapmap.[i] = strheapmap.[i] | mapmask
-                    return heapaddr(i, mapmask)
-                fin
-            until mapmask & $100
-        fin
-    next
-    bell()
-    prstr(@outofmem)
-    return 0
-end
-def freestr(strptr)
+def delstr(strptr)
     byte mask, ofst
 
     if strptr and strptr <> @nullstr
@@ -624,7 +208,7 @@ def freestr(strptr)
         ofst = (strptr - strheap) >> 4
         mask = mask << (ofst & $07)
         ofst = ofst >> 3
-        strheapmap.[ofst] = strheapmap.[ofst] & ~mask
+        strpoolmap->[ofst] = strpoolmap->[ofst] & ~mask
     fin
 end
 def newstr(strptr)
@@ -638,7 +222,7 @@ def newstr(strptr)
     if strlen == 0
         return @nullstr
     fin
-    newptr = heapalloc(strlen + 1)
+    newptr = strpoolalloc(strlen + 1)
     if newptr
         memcpy(newptr, strptr, strlen + 1)
         ^newptr = strlen
@@ -646,10 +230,16 @@ def newstr(strptr)
     fin
     return @nullstr
 end
-def inittxtbuf
+def inittxtbuf#0
     word i
 
-    memset(strheapmap, strheapmsz, 0)
+    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)
     numlines   = 1
     cursrow    = 0
@@ -671,7 +261,7 @@ def caseconv(chr)
     fin
     return chr
 end
-def strupper(strptr)
+def strupper(strptr)#0
     byte i, chr
 
     for i = ^strptr downto 1
@@ -681,7 +271,7 @@ def strupper(strptr)
         fin
     next
 end
-def strlower(strptr)
+def strlower(strptr)#0
     byte i, chr
 
     for i = ^strptr downto 1
@@ -691,7 +281,7 @@ def strlower(strptr)
         fin
     next
 end
-def txtupper
+def txtupper#0
     word i, strptr
 
     flags = flags | uppercase
@@ -699,7 +289,7 @@ def txtupper
         strupper(strlinbuf:[i])
     next
 end
-def txtlower
+def txtlower#0
     word i, strptr
 
     flags = flags & ~uppercase
@@ -707,15 +297,15 @@ def txtlower
         strlower(strlinbuf:[i])
     next
 end
-def prbyte(h)
+def prbyte(h)#0
     cout('$')
-    return call($FDDA, h, 0, 0, 0)
+    call($FDDA, h, 0, 0, 0)
 end
-def prword(h)
+def prword(h)#0
     cout('$')
-    return call($F941, h >> 8, h, 0, 0)
+    call($F941, h >> 8, h, 0, 0)
 end
-def print(i)
+def print(i)#0
     byte numstr[7]
     byte place, sign
 
@@ -738,19 +328,19 @@ def print(i)
         place         = place - 1
     fin
     numstr[place] = 6 - place
-    return prstr(@numstr[place])
+    puts(@numstr[place])
 end
-def nametostr(namestr, len, strptr)
+def nametostr(namestr, len, strptr)#0
     ^strptr = len
-    return memcpy(strptr + 1, namestr, len)
+    memcpy(strptr + 1, namestr, len)
 end
 //
 // File routines
 //
-def readtxt(filename)
+def readtxt(filename)#0
     byte txtbuf[81], refnum, i, j
 
-    refnum = open(filename, iobuffer)
+    refnum = open(filename, sysbuf)
     if refnum
         newline(refnum, $7F, $0D)
         repeat
@@ -764,23 +354,23 @@ def readtxt(filename)
             if !(numlines & $0F); cout('.'); fin
         until txtbuf == 0 or numlines == maxlines
         close(refnum)
-	//
-	// Make sure there is a blank line at the end of the buffer
-	//
-	if numlines < maxlines and strlinbuf:[numlines - 1] <> @nullstr
-	    strlinbuf:[numlines] = @nullstr
-	    numlines = numlines + 1
-	fin
+    	//
+    	// Make sure there is a blank line at the end of the buffer
+    	//
+    	if numlines < maxlines and strlinbuf:[numlines - 1] <> @nullstr
+    	    strlinbuf:[numlines] = @nullstr
+    	    numlines = numlines + 1
+    	fin
     fin
 end
-def writetxt(filename)
+def writetxt(filename)#0
     byte txtbuf[81], refnum
     byte j, chr
     word i, strptr
 
     destroy(filename)
     create(filename, $C3, $04, $00) // full access, TXT file
-    refnum = open(filename, iobuffer)
+    refnum = open(filename, sysbuf)
     if refnum == 0
         return
     fin
@@ -798,15 +388,15 @@ def writetxt(filename)
         write(refnum, @txtbuf + 1, txtbuf)
         if !(i & $0F); cout('.'); fin
     next
-    return close(refnum)
+    close(refnum)
 end
 //
 // Screen routines
 //
-def clrscrn
-    return call($FC58, 0, 0, 0, 0)
+def clrscrn@0
+    call($FC58, 0, 0, 0, 0)
 end
-def drawrow(row, ofst, strptr)
+def drawrow(row, ofst, strptr)#0
     byte numchars
     word scrnptr
 
@@ -821,49 +411,49 @@ def drawrow(row, ofst, strptr)
     else
         memset(scrnptr + numchars, 40 - numchars, $A0A0)
     fin
-    return memcpy(scrnptr, strptr + ofst + 1, numchars)
+    memcpy(scrnptr, strptr + ofst + 1, numchars)
 end
-def drawscrn(toprow, ofst)
+def drawscrn(toprow, ofst)#0
     byte row, numchars
     word strptr, scrnptr
 
     if ofst
         for row = 0 to 23
             strptr   = strlinbuf:[toprow + row]
-	    scrnptr  = txtscrn[row]
-	    if ofst >= ^strptr
-	        numchars = 0
-	    else
+    	    scrnptr  = txtscrn[row]
+    	    if ofst >= ^strptr
+    	        numchars = 0
+    	    else
                 numchars = ^strptr - ofst
-	    fin
-	    if numchars >= 40
+    	    fin
+    	    if numchars >= 40
                 numchars = 40
-	    else
-	        memset(scrnptr + numchars, 40 - numchars, $A0A0)
+    	    else
+    	        memset(scrnptr + numchars, 40 - numchars, $A0A0)
        	    fin
-	    memcpy(scrnptr, strptr + ofst + 1, numchars)
+	        memcpy(scrnptr, strptr + ofst + 1, numchars)
         next
     else
         for row = 0 to 23
             strptr   = strlinbuf:[toprow + row]
-	    scrnptr  = txtscrn[row]
-	    numchars = ^strptr
-	    if numchars >= 40
+    	    scrnptr  = txtscrn[row]
+    	    numchars = ^strptr
+    	    if numchars >= 40
                 numchars = 40
-	    else
-	        memset(scrnptr + numchars, 40 - numchars, $A0A0)
+    	    else
+    	        memset(scrnptr + numchars, 40 - numchars, $A0A0)
        	    fin
-	    memcpy(scrnptr, strptr + 1, numchars)
+    	    memcpy(scrnptr, strptr + 1, numchars)
         next
     fin
 end
-def cursoff
+def cursoff#0
     if flags & showcurs
         ^cursptr = underchr
         flags = flags & ~showcurs
     fin
 end
-def curson
+def curson#0
     if !(flags & showcurs)
         cursptr  = txtscrn[cursy] + cursx
         underchr = ^cursptr
@@ -871,22 +461,22 @@ def curson
         flags = flags | showcurs
     fin
 end
-def cursflash
+def cursflash#0
     if flags & showcurs
         if flash == 0
             ^cursptr = curschr
         elsif flash == 128
             ^cursptr = underchr
         fin
-        flash = flash + 1
+        flash++
     fin
 end
-def redraw
+def redraw#0
     cursoff
     drawscrn(scrntop, scrnleft)
     curson
 end
-def curshome
+def curshome#0
     cursoff
     cursrow  = 0
     curscol  = 0
@@ -895,9 +485,9 @@ def curshome
     scrnleft = 0
     scrntop  = 0
     drawscrn(scrntop, scrnleft)
-    return curson
+    curson
 end
-def cursend
+def cursend#0
     cursoff
     if numlines > 23
         cursrow  = numlines - 1
@@ -912,9 +502,9 @@ def cursend
     cursx    = 0
     scrnleft = 0
     drawscrn(scrntop, scrnleft)
-    return curson
+    curson
 end
-def cursup
+def cursup#0
     if cursrow > 0
         cursoff
         cursrow = cursrow - 1
@@ -927,14 +517,14 @@ def cursup
         curson
     fin
 end
-def pgup
+def pgup#0
     byte i
 
     for i = pgjmp downto 0
         cursup
     next
 end
-def cursdown
+def cursdown#0
     if cursrow < numlines - 1
         cursoff
         cursrow = cursrow + 1
@@ -947,14 +537,14 @@ def cursdown
         curson
     fin
 end
-def pgdown
+def pgdown#0
     byte i
 
     for i = pgjmp downto 0
         cursdown
     next
 end
-def cursleft
+def cursleft#0
     if curscol > 0
         cursoff
         curscol = curscol - 1
@@ -967,14 +557,14 @@ def cursleft
         curson
     fin
 end
-def pgleft
+def pgleft#0
     byte i
 
     for i = 7 downto 0
         cursleft
     next
 end
-def cursright
+def cursright#0
     if curscol < 80
         cursoff
         curscol = curscol + 1
@@ -987,7 +577,7 @@ def cursright
         curson
     fin
 end
-def pgright
+def pgright#0
     byte i
 
     for i = 7 downto 0
@@ -1044,18 +634,18 @@ end
 //
 // Printer routines
 //
-def printtxt(slot)
+def printtxt(slot)#0
     byte txtbuf[80]
     word i, scrncsw
 
-    scrncsw = *(csw)
-    *(csw)  = $C000 | (slot << 8)
+    scrncsw = *csw
+    *csw  = $C000 | (slot << 8)
     for i = 0 to numlines - 1
         cpyln(strlinbuf:[i], @txtbuf)
-        prstr(@txtbuf)
+        puts(@txtbuf)
         crout
     next
-    *(csw) = scrncsw
+    *csw = scrncsw
 end
 def openline(row)
     if numlines < maxlines
@@ -1063,12 +653,12 @@ def openline(row)
         strlinbuf:[row] = @nullstr
         numlines = numlines + 1
         flags = flags | changed
-        return 1
+        return TRUE
     fin
     bell
-    return 0
+    return FALSE
 end
-def cutline
+def cutline#0
     freestr(cutbuf)
     cutbuf = strlinbuf:[cursrow]
     memcpy(@strlinbuf:[cursrow], @strlinbuf:[cursrow + 1], (numlines - cursrow) * 2)
@@ -1079,9 +669,9 @@ def cutline
     if cursrow == numlines
         cursup
     fin
-    return redraw
+    redraw
 end
-def pasteline
+def pasteline#0
     if cutbuf and numlines < maxlines
         memcpy(@strlinbuf:[cursrow + 1], @strlinbuf:[cursrow], (numlines - cursrow) * 2)
         strlinbuf:[cursrow] = newstr(cutbuf)
@@ -1092,7 +682,7 @@ def pasteline
         bell
     fin
 end
-def joinline
+def joinline#0
     byte joinstr[80], joinlen
 
     if cursrow < numlines - 1
@@ -1113,7 +703,7 @@ def joinline
         fin
     fin
 end
-def splitline
+def splitline#0
     byte splitstr[80], splitlen
 
     if openline(cursrow + 1)
@@ -1141,15 +731,15 @@ def splitline
 end
 def editkey(key)
     if key >= keyspace
-        return true
+        return TRUE
     elsif key == keydelete
-        return true
+        return TRUE
     elsif key == keyctrld
-        return true
+        return TRUE
     elsif key == keyctrlr
-        return true
+        return TRUE
     fin
-    return false
+    return FALSE
 end
 def editline(key)
     byte editstr[80]
@@ -1241,7 +831,7 @@ def editline(key)
     fin
     return key
 end
-def editmode
+def editmode#0
     repeat
         when editline(keyin())
             is keyarrowup
@@ -1269,15 +859,15 @@ def editmode
             is keyctrlv
                 pasteline; break
             is keyctrlf
-	        if numlines < maxlines and cursrow == numlines - 1
+    	        if numlines < maxlines and cursrow == numlines - 1
                     strlinbuf:[numlines] = @nullstr
-		    numlines = numlines + 1
-		fin
-	        cursdown
+        		    numlines = numlines + 1
+        		fin
+    	        cursdown
             is keyctrlo
                 openline(cursrow)
                 redraw
-		break
+        		break
             is keyenter
                 if flags & insmode
                     splitline
@@ -1286,7 +876,7 @@ def editmode
                     cursdown
                     redraw
                 fin
-		break
+        		break
             is keyctrlt
                 joinline; break
             is keyctrli
@@ -1297,7 +887,7 @@ def editmode
                     flags = flags | insmode
                     curschr = '+'
                 fin
-		break
+        		break
             is keyctrlc
                 if flags & uppercase
                     txtlower
@@ -1305,12 +895,12 @@ def editmode
                     txtupper
                 fin
                 redraw
-		break
+        		break
             is keyescape
                 cursoff
                 cmdmode
                 redraw
-		break
+        		break
         wend
     until false
 end
@@ -1329,10 +919,10 @@ def prfiles(optpath)
         strcpy(@path, optpath)
     else
         getpfx(@path)
-        prstr(@path)
+        puts(@path)
         crout
     fin
-    refnum = open(@path, iobuffer)
+    refnum = open(@path, sysbuf)
     if perr
         return perr
     fin
@@ -1351,7 +941,7 @@ def prfiles(optpath)
                 if type <> 0
                     len = type & $0F
                     ^entry = len
-                    prstr(entry)
+                    puts(entry)
                     if type & $F0 == $D0 // Is it a directory?
                         cout('/')
                         len = len + 1
@@ -1372,7 +962,7 @@ def prfiles(optpath)
     crout
     return 0
 end
-def striplead(strptr, chr)
+def striplead(strptr, chr)#0
     while ^strptr and ^(strptr + 1) == chr
         memcpy(strptr + 1, strptr + 2, ^strptr)
         ^strptr = ^strptr - 1
@@ -1395,16 +985,16 @@ def parsecmd(strptr)
 end
 def chkchng
     if flags & changed
-        prstr(@losechng)
+        puts("LOSE CHANGES TO FILE (Y/N)?")
         if toupper(keyin()) == 'N'
             crout
-            return false
+            return FALSE
         fin
         crout
     fin
-    return true
+    return TRUE
 end
-def quit
+def quit#0
     if chkchng
         exit
     fin
@@ -1414,26 +1004,26 @@ def cmdmode
     word cmdptr
 
     clrscrn
-    prstr(@version)
+    puts("PLASMA ][ EDITOR VERSION 0.99")
     crout
-    while true
-        prstr(@txtfile)
+    while TRUE
+        puts(@txtfile)
         cmdptr = rdstr($BA)
         when toupper(parsecmd(cmdptr))
             is 'A'
                 readtxt(cmdptr)
                 flags = flags | changed
-		break
+        		break
             is 'R'
                 if chkchng
                     inittxtbuf
-		    numlines = 0
+        		    numlines = 0
                     strcpy(@txtfile, cmdptr)
                     readtxt(@txtfile)
-		    if numlines == 0; numlines = 1; fin
+        		    if numlines == 0; numlines = 1; fin
                     flags = flags & ~changed
                 fin
-		break
+        		break
             is 'W'
                 if ^cmdptr
                     strcpy(@txtfile, cmdptr)
@@ -1441,7 +1031,7 @@ def cmdmode
                 writetxt(@txtfile)
                 //if flags & changed; fin
                 flags = flags & ~changed
-		break
+        		break
             is 'C'
                 prfiles(cmdptr); break
             is 'P'
@@ -1453,7 +1043,7 @@ def cmdmode
                     slot = 1
                 fin
                 printtxt(slot)
-		break
+        		break
             is 'Q'
                 quit
             is 'E'
@@ -1462,19 +1052,19 @@ def cmdmode
             is 'N'
                 if chkchng
                     inittxtbuf
-                    strcpy(@txtfile, @untitled)
+                    strcpy(@txtfile, "UNTITLED")
                 fin
-		break
+        		break
             otherwise
                 bell
                 cout('?')
                 crout
         wend
         if perr
-            prstr(@errorstr)
+            puts("ERROR: $")
             call($FDDA, perr, 0, 0, 0)
         else
-            prstr(@okstr)
+            puts("OK")
         fin
         crout
     loop
@@ -1482,7 +1072,7 @@ end
 //
 // Init editor
 //
-if !(^machid & $80)
+if !(^MACHID & $80)
     flags = uppercase | shiftlock
     keyin = @keyin2
 else
@@ -1491,7 +1081,7 @@ fin
 inittxtbuf
 if argbuff
     strcpy(@txtfile, @argbuff)
-    prstr(@txtfile)
+    puts(@txtfile)
     numlines = 0
     readtxt(@txtfile)
 fin
diff --git a/src/vmsrc/a1cmd.pla b/src/vmsrc/a1cmd.pla
index c096631..b972255 100755
--- a/src/vmsrc/a1cmd.pla
+++ b/src/vmsrc/a1cmd.pla
@@ -79,6 +79,7 @@ byte hpmarkstr[]  = "HEAPMARK"
 byte hpalignstr[] = "HEAPALLOCALIGN"
 byte hpallocstr[] = "HEAPALLOC"
 byte hprelstr[]   = "HEAPRELEASE"
+byte hpavlstr[]   = "HEAPAVAIL"
 byte memsetstr[]  = "MEMSET"
 byte memcpystr[]  = "MEMCPY"
 byte uisgtstr[]   = "ISUGT"
@@ -100,6 +101,7 @@ word              = @hpmarkstr, @markheap
 word              = @hpallocstr,@allocheap
 word              = @hpalignstr,@allocalignheap
 word              = @hprelstr,  @releaseheap
+word              = @hpavlstr,  @availheap
 word              = @memsetstr, @memset
 word              = @memcpystr, @memcpy
 word              = @uisgtstr,  @uword_isgt
diff --git a/src/vmsrc/cmd.pla b/src/vmsrc/cmd.pla
index 61d1ff4..9b08b7d 100755
--- a/src/vmsrc/cmd.pla
+++ b/src/vmsrc/cmd.pla
@@ -26,7 +26,7 @@ const modinitkeep = $4000
 //
 predef syscall(cmd,params)#1, call(addr,areg,xreg,yreg,status)#1
 predef crout()#0, cout(c)#0, prstr(s)#0, cin()#1, rdstr(p)#1
-predef markheap()#1, allocheap(size)#1, allocalignheap(size, pow2, freeaddr), releaseheap(newheap)#1, availheap()#1
+predef markheap()#1, allocheap(size)#1, allocalignheap(size, pow2, freeaddr)#1, releaseheap(newheap)#1, availheap()#1
 predef memset(addr,value,size)#0, memcpy(dst,src,size)#0
 predef uword_isgt(a,b)#1, uword_isge(a,b)#1, uword_islt(a,b)#1, uword_isle(a,b)#1
 predef loadmod(mod)#1, execmod(modfile)#1, lookupstrmod(str)#1
@@ -103,26 +103,26 @@ word syslibsym  = @exports
 // SYSCALL(CMD, PARAMS)
 //
 asm syscall(cmd,params)#1
-    LDA ESTKL,X
-    LDY ESTKH,X
-    STA PARAMS
-    STY PARAMS+1
-    INX
-    LDA ESTKL,X
-    STA CMD
-    JSR $BF00
+        LDA     ESTKL,X
+        LDY     ESTKH,X
+        STA     PARAMS
+        STY     PARAMS+1
+        INX
+        LDA     ESTKL,X
+        STA     CMD
+        JSR     $BF00
 CMD:    !BYTE   00
 PARAMS: !WORD   0000
-    LDY     #$00
-    STA ESTKL,X
-    STY ESTKH,X
-    RTS
+        LDY     #$00
+        STA     ESTKL,X
+        STY     ESTKH,X
+        RTS
 end
 //
 // CALL 6502 ROUTINE
 // CALL(ADDR, AREG, XREG, YREG, STATUS)
 //
-asm call(addr,areg,xreg,yreg,sstatus)#1
+asm call(addr,areg,xreg,yreg,status)#1
 REGVALS =   SRC
         PHP
         LDA     ESTKL+4,X
@@ -166,23 +166,23 @@ end
 // CALL LOADED SYSTEM PROGRAM
 //
 asm exec()#0
-    LDX #$00
-    STX IFPL
-    LDA #$BF
-    STA IFPH
-    LDX #$FE
-    TXS
-    LDX #ESTKSZ/2
-    BIT ROMEN
-    JMP $2000
+        LDX     #$00
+        STX     IFPL
+        LDA     #$BF
+        STA     IFPH
+        LDX     #$FE
+        TXS
+        LDX     #ESTKSZ/2
+        BIT     ROMEN
+        JMP     $2000
 end
 //
 // EXIT
 //
 asm reboot()#0
-    BIT ROMEN
-    DEC $03F4       ; INVALIDATE POWER-UP BYTE
-    JMP ($FFFC)     ; RESET
+        BIT     ROMEN
+        DEC     $03F4       ; INVALIDATE POWER-UP BYTE
+        JMP     ($FFFC)     ; RESET
 end
 //
 // SET MEMORY TO VALUE
@@ -190,112 +190,112 @@ end
 //   With optimizations from Peter Ferrie
 //
 asm memset(addr,value,size)#0
-    LDA     ESTKL+2,X
-    STA     DSTL
-    LDA     ESTKH+2,X
-    STA     DSTH
-    LDY     ESTKL,X
-    BEQ     +
-    INC     ESTKH,X
-    LDY     #$00
-+   LDA     ESTKH,X
-    BEQ     SETMEX
+        LDA     ESTKL+2,X
+        STA     DSTL
+        LDA     ESTKH+2,X
+        STA     DSTH
+        LDY     ESTKL,X
+        BEQ     +
+        INC     ESTKH,X
+        LDY     #$00
++       LDA     ESTKH,X
+        BEQ     SETMEX
 SETMLPL CLC
-    LDA     ESTKL+1,X
+        LDA     ESTKL+1,X
 SETMLPH STA     (DST),Y
-    DEC     ESTKL,X
-    BEQ     ++
--   INY
-    BEQ     +
---  BCS     SETMLPL
-    SEC
-    LDA     ESTKH+1,X
-    BCS     SETMLPH
-+   INC     DSTH
-    BNE     --
-++  DEC     ESTKH,X
-    BNE     -
+        DEC     ESTKL,X
+        BEQ     ++
+-       INY
+        BEQ     +
+--      BCS     SETMLPL
+        SEC
+        LDA     ESTKH+1,X
+        BCS     SETMLPH
++       INC     DSTH
+        BNE     --
+++      DEC     ESTKH,X
+        BNE     -
 SETMEX  INX
-    INX
-    INX
-    RTS
+        INX
+        INX
+        RTS
 end
 //
 // COPY MEMORY
 // MEMCPY(DSTADDR, SRCADDR, SIZE)
 //
 asm memcpy(dst,src,size)#0
-    INX
-    INX
-    INX
-    LDA ESTKL-3,X
-    ORA ESTKH-3,X
-    BEQ CPYMEX
-    LDA ESTKL-2,X
-    CMP ESTKL-1,X
-    LDA ESTKH-2,X
-    SBC ESTKH-1,X
-    BCC REVCPY
+        INX
+        INX
+        INX
+        LDA     ESTKL-3,X
+        ORA     ESTKH-3,X
+        BEQ     CPYMEX
+        LDA     ESTKL-2,X
+        CMP     ESTKL-1,X
+        LDA     ESTKH-2,X
+        SBC     ESTKH-1,X
+        BCC     REVCPY
 ;
 ; FORWARD COPY
 ;
-    LDA ESTKL-1,X
-    STA     DSTL
-    LDA ESTKH-1,X
-    STA     DSTH
-    LDA ESTKL-2,X
-    STA     SRCL
-    LDA ESTKH-2,X
-    STA     SRCH
-    LDY ESTKL-3,X
-    BEQ FORCPYLP
-    INC     ESTKH-3,X
-    LDY #$00
+        LDA     ESTKL-1,X
+        STA     DSTL
+        LDA     ESTKH-1,X
+        STA     DSTH
+        LDA     ESTKL-2,X
+        STA     SRCL
+        LDA     ESTKH-2,X
+        STA     SRCH
+        LDY     ESTKL-3,X
+        BEQ     FORCPYLP
+        INC     ESTKH-3,X
+        LDY     #$00
 FORCPYLP LDA    (SRC),Y
-    STA (DST),Y
-    INY
-    BNE +
-    INC DSTH
-    INC SRCH
-+   DEC     ESTKL-3,X
-    BNE FORCPYLP
-    DEC ESTKH-3,X
-    BNE FORCPYLP
-    RTS
+        STA     (DST),Y
+        INY
+        BNE     +
+        INC     DSTH
+        INC     SRCH
++       DEC     ESTKL-3,X
+        BNE     FORCPYLP
+        DEC     ESTKH-3,X
+        BNE     FORCPYLP
+        RTS
 ;
 ; REVERSE COPY
 ;
 REVCPY  ;CLC
-    LDA     ESTKL-3,X
-    ADC ESTKL-1,X
-    STA DSTL
-    LDA ESTKH-3,X
-    ADC ESTKH-1,X
-    STA DSTH
-    CLC
-    LDA     ESTKL-3,X
-    ADC ESTKL-2,X
-    STA SRCL
-    LDA ESTKH-3,X
-    ADC ESTKH-2,X
-    STA SRCH
-    DEC DSTH
-    DEC SRCH
-    LDY #$FF
-    LDA     ESTKL-3,X
-    BEQ REVCPYLP
-    INC     ESTKH-3,X
+        LDA     ESTKL-3,X
+        ADC     ESTKL-1,X
+        STA     DSTL
+        LDA     ESTKH-3,X
+        ADC     ESTKH-1,X
+        STA     DSTH
+        CLC
+        LDA     ESTKL-3,X
+        ADC     ESTKL-2,X
+        STA     SRCL
+        LDA     ESTKH-3,X
+        ADC     ESTKH-2,X
+        STA     SRCH
+        DEC     DSTH
+        DEC     SRCH
+        LDY     #$FF
+        LDA     ESTKL-3,X
+        BEQ     REVCPYLP
+        INC     ESTKH-3,X
 REVCPYLP LDA    (SRC),Y
-    STA (DST),Y
-    DEY
-    CPY #$FF
-    BNE +
-    DEC DSTH
-    DEC SRCH
-+   DEC     ESTKL-3,X
-    BNE REVCPYLP
-    DEC ESTKH-3,X
-    BNE REVCPYLP
+        STA     (DST),Y
+        DEY
+        CPY     #$FF
+        BNE     +
+        DEC     DSTH
+        DEC     SRCH
++       DEC     ESTKL-3,X
+        BNE     REVCPYLP
+        DEC     ESTKH-3,X
+        BNE     REVCPYLP
 CPYMEX  RTS
 end
 //
@@ -304,34 +304,34 @@ end
 // MEMXCPY(DST, SRC, SIZE)
 //
 asm memxcpy(dst,src,size)#0
-    LDA ESTKL+1,X
-    STA $3C
-    CLC
-    ADC ESTKL,X
-    STA $3E
-    LDA ESTKH+1,X
-    STA $3D
-    ADC ESTKH,X
-    STA $3F
-    LDA ESTKL+2,X
-    STA $42
-    LDA ESTKH+2,X
-    STA $43
-    STX     ESP
-    BIT ROMEN
-    SEC
-    JSR $C311
-    BIT LCRDEN+LCBNK2
-    LDX ESP
-    INX
-    INX
-    INX
-    RTS
+        LDA     ESTKL+1,X
+        STA     $3C
+        CLC
+        ADC     ESTKL,X
+        STA     $3E
+        LDA     ESTKH+1,X
+        STA     $3D
+        ADC     ESTKH,X
+        STA     $3F
+        LDA     ESTKL+2,X
+        STA     $42
+        LDA     ESTKH+2,X
+        STA     $43
+        STX     ESP
+        BIT     ROMEN
+        SEC
+        JSR     $C311
+        BIT     LCRDEN+LCBNK2
+        LDX     ESP
+        INX
+        INX
+        INX
+        RTS
 end
 asm crout()#0
-    DEX
-    LDA #$0D
-    BNE +
+        DEX
+        LDA     #$0D
+        BNE     +
     ; FALL THROUGH TO COUT
 end
 //
@@ -339,161 +339,161 @@ end
 // COUT(CHAR)
 //
 asm cout(c)#0
-    LDA ESTKL,X
-    BIT $BF98
-    BMI +
-    JSR TOUPR
-+   ORA     #$80
-    BIT ROMEN
-    JSR $FDED
-    BIT LCRDEN+LCBNK2
-    INX
-    RTS
+        LDA     ESTKL,X
+        BIT     $BF98
+        BMI     +
+        JSR     TOUPR
++       ORA     #$80
+        BIT     ROMEN
+        JSR     $FDED
+        BIT     LCRDEN+LCBNK2
+        INX
+        RTS
 end
 //
 // CHAR IN
 // RDKEY()
 //
 asm cin()#1
-    BIT ROMEN
-    JSR $FD0C
-    BIT LCRDEN+LCBNK2
-    DEX
-    LDY #$00
-    AND #$7F
-    STA ESTKL,X
-    STY ESTKH,X
-    RTS
+        BIT     ROMEN
+        JSR     $FD0C
+        BIT     LCRDEN+LCBNK2
+        DEX
+        LDY     #$00
+        AND     #$7F
+        STA     ESTKL,X
+        STY     ESTKH,X
+        RTS
 end
 //
 // PRINT STRING
 // PRSTR(STR)
 //
 asm prstr(s)#0
-    LDY #$00
-    LDA ESTKL,X
-    STA SRCL
-    LDA ESTKH,X
-    STA SRCH
-    LDA (SRC),Y
-    BEQ ++
-    STA TMP
-    BIT ROMEN
--   INY
-    LDA (SRC),Y
-    BIT $BF98
-    BMI +
-    JSR TOUPR
-+   ORA #$80
-    JSR $FDED
-    CPY TMP
-    BNE -
-    BIT LCRDEN+LCBNK2
-++  INX
-    RTS
+        LDY     #$00
+        LDA     ESTKL,X
+        STA     SRCL
+        LDA     ESTKH,X
+        STA     SRCH
+        LDA     (SRC),Y
+        BEQ     ++
+        STA     TMP
+        BIT     ROMEN
+-       INY
+        LDA     (SRC),Y
+        BIT     $BF98
+        BMI     +
+        JSR     TOUPR
++       ORA     #$80
+        JSR     $FDED
+        CPY     TMP
+        BNE     -
+        BIT     LCRDEN+LCBNK2
+++      INX
+        RTS
 end
 //
 // PRINT BYTE
 //
 asm prbyte(b)#0
-    LDA ESTKL,X
-    STX     ESP
-    BIT ROMEN
-    JSR $FDDA
-    LDX     ESP
-    BIT LCRDEN+LCBNK2
-    INX
-    RTS
+        LDA     ESTKL,X
+        STX     ESP
+        BIT     ROMEN
+        JSR     $FDDA
+        LDX     ESP
+        BIT     LCRDEN+LCBNK2
+        INX
+        RTS
 end
 //
 // PRINT WORD
 //
 asm prword(w)#0
-    STX ESP
-    TXA
-    TAY
-    LDA ESTKH,Y
-    LDX ESTKL,Y
-    BIT ROMEN
-    JSR $F941
-    LDX     ESP
-    BIT LCRDEN+LCBNK2
-    INX
-    RTS
+        STX     ESP
+        TXA
+        TAY
+        LDA     ESTKH,Y
+        LDX     ESTKL,Y
+        BIT     ROMEN
+        JSR     $F941
+        LDX     ESP
+        BIT     LCRDEN+LCBNK2
+        INX
+        RTS
 end
 //
 // READ STRING
 // STR = RDSTR(PROMPTCHAR)
 //
 asm rdstr(p)#1
-    LDA     ESTKL,X
-    STA     $33
-    STX     ESP
-    BIT     ROMEN
-    JSR     $FD6A
-    STX     $01FF
--   LDA     $01FF,X
-    AND     #$7F
-    STA     $01FF,X
-    DEX
-    BPL     -
-    TXA
-    LDX     ESP
-    STA     ESTKL,X
-    LDA     #$01
-    STA     ESTKH,X
-    BIT     LCRDEN+LCBNK2
-    RTS
+        LDA     ESTKL,X
+        STA     $33
+        STX     ESP
+        BIT     ROMEN
+        JSR     $FD6A
+        STX     $01FF
+-       LDA     $01FF,X
+        AND     #$7F
+        STA     $01FF,X
+        DEX
+        BPL     -
+        TXA
+        LDX     ESP
+        STA     ESTKL,X
+        LDA     #$01
+        STA     ESTKH,X
+        BIT     LCRDEN+LCBNK2
+        RTS
 end
 asm uword_isge(a,b)#1
-    LDA ESTKL+1,X
-    CMP ESTKL,X
-    LDA ESTKH+1,X
-    SBC ESTKH,X
-    LDA #$FF
-    ADC #$00
-    EOR #$FF
-    STA ESTKL+1,X
-    STA ESTKH+1,X
-    INX
-    RTS
+        LDA     ESTKL+1,X
+        CMP     ESTKL,X
+        LDA     ESTKH+1,X
+        SBC     ESTKH,X
+        LDA     #$FF
+        ADC     #$00
+        EOR     #$FF
+        STA     ESTKL+1,X
+        STA     ESTKH+1,X
+        INX
+        RTS
 end
 asm uword_isle(a,b)#1
-    LDA ESTKL,X
-    CMP ESTKL+1,X
-    LDA ESTKH,X
-    SBC ESTKH+1,X
-    LDA #$FF
-    ADC #$00
-    EOR #$FF
-    STA ESTKL+1,X
-    STA ESTKH+1,X
-    INX
-    RTS
+        LDA     ESTKL,X
+        CMP     ESTKL+1,X
+        LDA     ESTKH,X
+        SBC     ESTKH+1,X
+        LDA     #$FF
+        ADC     #$00
+        EOR     #$FF
+        STA     ESTKL+1,X
+        STA     ESTKH+1,X
+        INX
+        RTS
 end
 asm uword_isgt(a,b)#1
-    LDA ESTKL,X
-    CMP ESTKL+1,X
-    LDA ESTKH,X
-    SBC ESTKH+1,X
-    LDA #$FF
-    ADC #$00
-    STA ESTKL+1,X
-    STA ESTKH+1,X
-    INX
-    RTS
+        LDA     ESTKL,X
+        CMP     ESTKL+1,X
+        LDA     ESTKH,X
+        SBC     ESTKH+1,X
+        LDA     #$FF
+        ADC     #$00
+        STA     ESTKL+1,X
+        STA     ESTKH+1,X
+        INX
+        RTS
 end
 asm uword_islt(a,b)#1
-    LDA ESTKL+1,X
-    CMP ESTKL,X
-    LDA ESTKH+1,X
-    SBC ESTKH,X
-    LDA #$FF
-    ADC #$00
-    STA ESTKL+1,X
-    STA ESTKH+1,X
-    INX
-    RTS
+        LDA     ESTKL+1,X
+        CMP     ESTKL,X
+        LDA     ESTKH+1,X
+        SBC     ESTKH,X
+        LDA     #$FF
+        ADC     #$00
+        STA     ESTKL+1,X
+        STA     ESTKH+1,X
+        INX
+        RTS
 end
 //
 // Utility routines.
@@ -513,28 +513,28 @@ end
 //    return len
 //end
 asm dcitos(dci, str)#1
-    LDA ESTKL,X
-    STA DSTL
-    LDA ESTKH,X
-    STA DSTH
-    LDA ESTKL+1,X
-    STA SRCL
-    LDA ESTKH+1,X
-    STA SRCH
-    LDY #$00
--   LDA (SRC),Y
-    CMP #$80
-    AND #$7F
-    INY
-    STA (DST),Y
-    BCS -
-    TYA
-    LDY #$00
-    STA (DST),Y
-    INX
-    STA ESTKL,X
-    STY ESTKH,X
-    RTS
+        LDA     ESTKL,X
+        STA     DSTL
+        LDA     ESTKH,X
+        STA     DSTH
+        LDA     ESTKL+1,X
+        STA     SRCL
+        LDA     ESTKH+1,X
+        STA     SRCH
+        LDY     #$00
+-       LDA     (SRC),Y
+        CMP     #$80
+        AND     #$7F
+        INY
+        STA     (DST),Y
+        BCS     -
+        TYA
+        LDY     #$00
+        STA     (DST),Y
+        INX
+        STA     ESTKL,X
+        STY     ESTKH,X
+        RTS
 end
 //def stodci(str, dci)
 //    byte len, c
@@ -553,43 +553,43 @@ end
 //    return ^str
 //end
 asm stodci(str,dci)#1
-    LDA ESTKL,X
-    STA DSTL
-    LDA ESTKH,X
-    STA DSTH
-    LDA ESTKL+1,X
-    STA SRCL
-    LDA ESTKH+1,X
-    STA SRCH
-    INX
-    LDY #$00
-    LDA (SRC),Y
-    BEQ ++
-    TAY
-    LDA (SRC),Y
-    JSR TOUPR
-    BNE +
--   LDA (SRC),Y
-    JSR TOUPR
-    ORA #$80
-+   DEY
-    STA (DST),Y
-    BNE -
-    LDA (SRC),Y
-++  STA ESTKL,X
-    STY ESTKH,X
-    RTS
+        LDA     ESTKL,X
+        STA     DSTL
+        LDA     ESTKH,X
+        STA     DSTH
+        LDA     ESTKL+1,X
+        STA     SRCL
+        LDA     ESTKH+1,X
+        STA     SRCH
+        INX
+        LDY     #$00
+        LDA     (SRC),Y
+        BEQ     ++
+        TAY
+        LDA     (SRC),Y
+        JSR     TOUPR
+        BNE     +
+-       LDA     (SRC),Y
+        JSR     TOUPR
+        ORA     #$80
++       DEY
+        STA     (DST),Y
+        BNE     -
+        LDA     (SRC),Y
+++      STA     ESTKL,X
+        STY     ESTKH,X
+        RTS
 end
 asm toupper(c)#1
-    LDA     ESTKL,X
-TOUPR   AND #$7F
-    CMP     #'a'
-    BCC     +
-    CMP     #'z'+1
-    BCS     +
-    SBC     #$1F
-+   STA     ESTKL,X
-    RTS
+        LDA     ESTKL,X
+TOUPR   AND     #$7F
+        CMP     #'a'
+        BCC     +
+        CMP     #'z'+1
+        BCS     +
+        SBC     #$1F
++       STA     ESTKL,X
+        RTS
 end
 //
 // Module symbols are entered into the symbol table
@@ -608,25 +608,25 @@ end
 //    return dci
 //end
 asm modtosym(mod,dci)#1
-    LDA ESTKL+1,X
-    STA SRCL
-    LDA ESTKH+1,X
-    STA SRCH
-    LDA ESTKL,X
-    STA ESTKL+1,X
-    STA DSTL
-    LDA ESTKH,X
-    STA ESTKH+1,X
-    STA DSTH
-    INX
-    LDY #$00
-    LDA #'#'+$80
--   STA (DST),Y
-    ASL
-    LDA (SRC),Y
-    INY
-    BCS -
-    RTS
+        LDA     ESTKL+1,X
+        STA     SRCL
+        LDA     ESTKH+1,X
+        STA     SRCH
+        LDA     ESTKL,X
+        STA     ESTKL+1,X
+        STA     DSTL
+        LDA     ESTKH,X
+        STA     ESTKH+1,X
+        STA     DSTH
+        INX
+        LDY     #$00
+        LDA     #'#'+$80
+-       STA     (DST),Y
+        ASL
+        LDA     (SRC),Y
+        INY
+        BCS     -
+        RTS
 end
 //
 // Lookup routines.
@@ -649,46 +649,46 @@ end
 //    loop
 //    return 0
 asm lookuptbl(dci, tbl)#1
-    LDA ESTKL,X
-    STA DSTL
-    LDA ESTKH,X
-    STA DSTH
-    LDA ESTKL+1,X
-    STA SRCL
-    LDA ESTKH+1,X
-    STA SRCH
-    LDY #$00
--   LDA (DST),Y
-    BEQ +
-    CMP (SRC),Y
-    BNE ++
-    INY
-    ASL
-    BCS -
-    LDA (DST),Y
-    PHA
-    INY
-    LDA (DST),Y
-    TAY
-    PLA
-+   INX
-    STA ESTKL,X
-    STY ESTKH,X
-    RTS
-++  LDY #$00
---  LDA (DST),Y
-    INC DSTL
-    BEQ +
---- ASL
-    BCS --
-    LDA #$02
-    ADC DSTL
-    STA DSTL
-    BCC -
-    INC DSTH
-    BCS -
-+   INC DSTH
-    BNE ---
+        LDA     ESTKL,X
+        STA     DSTL
+        LDA     ESTKH,X
+        STA     DSTH
+        LDA     ESTKL+1,X
+        STA     SRCL
+        LDA     ESTKH+1,X
+        STA     SRCH
+        LDY     #$00
+-       LDA     (DST),Y
+        BEQ     +
+        CMP     (SRC),Y
+        BNE     ++
+        INY
+        ASL
+        BCS     -
+        LDA     (DST),Y
+        PHA
+        INY
+        LDA     (DST),Y
+        TAY
+        PLA
++       INX
+        STA     ESTKL,X
+        STY     ESTKH,X
+        RTS
+++      LDY     #$00
+--      LDA     (DST),Y
+        INC     DSTL
+        BEQ     +
+---     ASL
+        BCS     --
+        LDA     #$02
+        ADC     DSTL
+        STA     DSTL
+        BCC     -
+        INC     DSTH
+        BCS     -
++       INC     DSTH
+        BNE     ---
 end
 //
 // ProDOS routines
@@ -752,15 +752,15 @@ def allocheap(size)#1
     heap = heap + size
     if systemflags & reshgr1
         if uword_islt(addr, $4000) and uword_isgt(heap, $2000)
-        addr = $4000
-        heap = addr + size
-    fin
+            addr = $4000
+            heap = addr + size
+        fin
     fin
     if systemflags & reshgr2
         if uword_islt(addr, $6000) and uword_isgt(heap, $4000)
-        addr = $6000
-        heap = addr + size
-    fin
+            addr = $6000
+            heap = addr + size
+        fin
     fin
     if uword_isge(heap, @addr)
         return 0
@@ -793,27 +793,27 @@ def allocxheap(size)#1
     xheap = xheap + size
     if systemflags & restxt1
         if uword_isle(xaddr, $0800) and uword_isgt(xheap, $0400)
-        xaddr = $0800
-        xheap = xaddr + size
-    fin
+            xaddr = $0800
+            xheap = xaddr + size
+        fin
     fin
     if systemflags & restxt2
         if uword_isle(xaddr, $0C00) and uword_isgt(xheap, $0800)
-        xaddr = $0C00
-        xheap = xaddr + size
-    fin
+            xaddr = $0C00
+            xheap = xaddr + size
+        fin
     fin
     if systemflags & resxhgr1
         if uword_isle(xaddr, $4000) and uword_isgt(xheap, $2000)
-        xaddr = $4000
-        xheap = xaddr + size
-    fin
+            xaddr = $4000
+            xheap = xaddr + size
+        fin
     fin
     if systemflags & resxhgr2
         if uword_isle(xaddr, $6000) and uword_isgt(xheap, $4000)
-        xaddr = $6000
-        xheap = xaddr + size
-    fin
+            xaddr = $6000
+            xheap = xaddr + size
+        fin
     fin
     if uword_isge(xheap, $BF00)
         return 0
@@ -861,12 +861,12 @@ def lookupextern(esd, index)#1
         esd = esd + dcitos(esd, @str)
         if esd->0 & $10 and esd->1 == index
             addr = lookupsym(sym)
-        if !addr
+            if !addr
                 perr = $81
-            cout('?')
-        prstr(@str)
-        crout
-        fin
+                cout('?')
+                prstr(@str)
+                crout
+            fin
             return addr
         fin
         esd = esd + 3
@@ -1108,12 +1108,12 @@ def volumes()#0
     strbuf   = databuff
     for i = 0 to 15
         ^strbuf = ^strbuf & $0F
-    if ^strbuf
-        cout('/')
-        prstr(strbuf)
-        crout()
-    fin
-    strbuf = strbuf + 16
+        if ^strbuf
+            cout('/')
+            prstr(strbuf)
+            crout()
+        fin
+        strbuf = strbuf + 16
     next
 end
 def catalog(optpath)#1
@@ -1154,12 +1154,12 @@ def catalog(optpath)#1
                     if type & $F0 == $D0 // Is it a directory?
                         cout('/')
                         len = len + 1
-            elsif entry->$10 == $FF
-                cout('-')
-            len = len + 1
-            elsif entry->$10 == $FE
-                cout('+')
-            len = len + 1
+                    elsif entry->$10 == $FF
+                        cout('-')
+                        len = len + 1
+                    elsif entry->$10 == $FE
+                        cout('+')
+                        len = len + 1
                     fin
                     for len = 19 - len downto 0
                         cout(' ')
@@ -1198,9 +1198,9 @@ def striptrail(strptr)#1
 
     for i = 1 to ^strptr
         if ^(strptr + i) <= ' '
-        ^strptr = i - 1
-        return strptr
-    fin
+            ^strptr = i - 1
+            return strptr
+        fin
     next
     return strptr
 end
@@ -1236,23 +1236,23 @@ def execsys(sysfile)#0
 
     if ^sysfile
         memcpy($280, sysfile, ^sysfile + 1)
-    striptrail(sysfile)
-    refnum = open(sysfile, iobuffer)
-    if refnum
-        len = read(refnum, databuff, $FFFF)
-        resetmemfiles()
-        if len
-            memcpy(sysfile, $280, ^$280 + 1)
-        if stripchars(sysfile) and ^$2000 == $4C and *$2003 == $EEEE
-            stripspaces(sysfile)
-            if ^$2005 >= ^sysfile + 1
-                memcpy($2006, sysfile, ^sysfile + 1)
+        striptrail(sysfile)
+        refnum = open(sysfile, iobuffer)
+        if refnum
+            len = read(refnum, databuff, $FFFF)
+            resetmemfiles()
+            if len
+                memcpy(sysfile, $280, ^$280 + 1)
+                if stripchars(sysfile) and ^$2000 == $4C and *$2003 == $EEEE
+                    stripspaces(sysfile)
+                    if ^$2005 >= ^sysfile + 1
+                        memcpy($2006, sysfile, ^sysfile + 1)
+                    fin
+                fin
+                striptrail($280)
+                exec()
             fin
         fin
-            striptrail($280)
-        exec()
-        fin
-    fin
     fin
 end
 def execmod(modfile)#1
@@ -1262,16 +1262,16 @@ def execmod(modfile)#1
     perr = 1
     if stodci(modfile, @moddci)
         saveheap  = heap
-    savexheap = xheap
-    savesym   = lastsym
-    saveflags = systemflags
-    if loadmod(@moddci) < modkeep
-        lastsym = savesym
-        xheap   = savexheap
-        heap    = saveheap
-    fin
-    ^lastsym    = 0
-    systemflags = saveflags
+        savexheap = xheap
+        savesym   = lastsym
+        saveflags = systemflags
+        if loadmod(@moddci) < modkeep
+            lastsym = savesym
+            xheap   = savexheap
+            heap    = saveheap
+        fin
+        ^lastsym    = 0
+        systemflags = saveflags
     fin
     return -perr
 end
@@ -1314,34 +1314,34 @@ while 1
     if cmdln
         when toupper(parsecmd(@cmdln))
             is 'Q'
-            reboot()
-        break
-        is 'C'
-            catalog(@cmdln)
-        break
-        is 'P'
-            setpfx(@cmdln)
-        break
-        is 'V'
-            volumes()
-        break
-        is '-'
-            execsys(@cmdln)
-        break
-        is '+'
-            execmod(striptrail(@cmdln))
-        break
-        otherwise
-            cout('?')
+                reboot()
+                break
+            is 'C'
+                catalog(@cmdln)
+                break
+            is 'P'
+                setpfx(@cmdln)
+                break
+            is 'V'
+                volumes()
+                break
+            is '-'
+                execsys(@cmdln)
+                break
+            is '+'
+                execmod(striptrail(@cmdln))
+                break
+            otherwise
+                cout('?')
         wend
         if perr
             prstr("ERR:$")
-        prbyte(perr)
-        perr = 0
+            prbyte(perr)
+            perr = 0
         else
             prstr("OK")
         fin
-    crout()
+        crout()
     fin
     prstr(getpfx(@prefix))
     memcpy(@cmdln, rdstr($BA), 128)
diff --git a/src/vmsrc/plvm02.s b/src/vmsrc/plvm02.s
index 94c1569..7278cf2 100755
--- a/src/vmsrc/plvm02.s
+++ b/src/vmsrc/plvm02.s
@@ -63,7 +63,7 @@ INTERP	=	 $03D0
 ;*
 ;* DISCONNECT /RAM
 ;*
-	SEI			; DISABLE /RAM
+	;SEI			; DISABLE /RAM
 	LDA	MACHID
 	AND	#$30
 	CMP	#$30
@@ -92,7 +92,7 @@ RAMEXIT LDA	NODEV
 	LDA	NODEV+1
 	STA	RAMSLOT+1
 	DEC	DEVCNT
-RAMDONE CLI
+RAMDONE ;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
 ;*
 ;* MOVE VM INTO LANGUAGE CARD
 ;*
@@ -250,7 +250,7 @@ IINTRPX PLA
 	STA	IFPH
 	LDA	#>OPXTBL
 	STA	OPPAGE
-	SEI
+	;SEI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
 	STA	ALTRDON
 !IF SELFMODIFY {
     BIT	LCRWEN+LCBNK2
@@ -1463,9 +1463,9 @@ CALLX	+INC_IP
 	TYA
 	PHA
 	STA	ALTRDOFF
-	CLI
+	;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
 	JSR	JMPTMP
-	SEI
+	;SEI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
 	STA	ALTRDON
 	PLA
 	TAY
@@ -1521,9 +1521,9 @@ ICALX	LDA	ESTKL,X
 	TYA
 	PHA
 	STA	ALTRDOFF
-	CLI
+	;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
 	JSR	JMPTMP
-	SEI
+	;SEI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
 	STA	ALTRDON
 	PLA
 	TAY
@@ -1576,7 +1576,7 @@ ENTER	INY
 ;* LEAVE FUNCTION
 ;*
 LEAVEX	STA	ALTRDOFF
-	CLI
+	;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
 LEAVE	PLA			; DEALLOCATE POOL + FRAME
 	CLC
 	ADC	IFPL
@@ -1591,7 +1591,7 @@ LEAVE	PLA			; DEALLOCATE POOL + FRAME
 	RTS
 ;
 RETX	STA	ALTRDOFF
-	CLI
+	;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
 RET	LDA	IFPL		; DEALLOCATE POOL
 	STA	PPL
 	LDA	IFPH
diff --git a/src/vmsrc/soscmd.pla b/src/vmsrc/soscmd.pla
index 007d218..2bcdfa7 100755
--- a/src/vmsrc/soscmd.pla
+++ b/src/vmsrc/soscmd.pla
@@ -74,6 +74,7 @@ byte hpmarkstr[]  = "HEAPMARK"
 byte hpalignstr[] = "HEAPALLOCALIGN"
 byte hpallocstr[] = "HEAPALLOC"
 byte hprelstr[]   = "HEAPRELEASE"
+byte hpavlstr[]   = "HEAPAVAIL"
 byte memsetstr[]  = "MEMSET"
 byte memcpystr[]  = "MEMCPY"
 byte uisgtstr[]   = "ISUGT"
@@ -96,6 +97,7 @@ word              = @hpmarkstr, @markheap
 word              = @hpallocstr,@allocheap
 word              = @hpalignstr,@allocalignheap
 word              = @hprelstr,  @releaseheap
+word              = @hpavlstr,  @availheap
 word              = @memsetstr, @memset
 word              = @memcpystr, @memcpy
 word              = @uisgtstr,  @uword_isgt