diff --git a/src/libsrc/apple/dhgrlib.pla b/src/libsrc/apple/dhgrlib.pla
index b5fcb8e..24f63fc 100644
--- a/src/libsrc/apple/dhgrlib.pla
+++ b/src/libsrc/apple/dhgrlib.pla
@@ -1,6 +1,7 @@
 include "inc/cmdsys.plh"
+include "inc/lines.plh"
 
-sysflags restxt1|reshgr1|resxhgr1
+sysflags resxtxt1|reshgr1|resxhgr1
 
 //
 // Apple II graphics soft switches
@@ -49,34 +50,57 @@ word           = $2350,$2750,$2B50,$2F50,$3350,$3750,$3B50,$3F50
 word           = $23D0,$27D0,$2BD0,$2FD0,$33D0,$37D0,$3BD0,$3FD0
 //
 // Pixel masks for 7 contiguous pixels
-//             AUXL AUXH MEML MEMH
-byte masks[] = $0F, $00, $00, $00
-byte         = $70, $00, $01, $00
-byte         = $00, $00, $1E ,$00
-byte         = $00, $03, $60, $00
-byte         = $00, $3C, $00, $00
-byte         = $00, $40, $00, $07
-byte         = $00, $00, $00, $78
+//
+word auxmask[] = $000F
+word           = $0070
+word           = $0000
+word           = $0300
+word           = $3C00
+word           = $4000
+word           = $0000
+word memmask[] = $0000
+word           = $0001
+word           = $001E
+word           = $0060
+word           = $0000
+word           = $0700
+word           = $7800
 //
 // Solid colors
-//              AUXL AUXH MEML MEMH
-byte colors[] = $00, $00, $00, $00 // black
-byte          = $08, $22, $11, $44 // magenta
-byte          = $44, $11, $08, $22 // brown
-byte          = $4C, $33, $19, $66 // orange
-byte          = $22, $08, $44, $11 // dark green
-byte          = $2A, $2A, $55, $55 // gray 1
-byte          = $66, $19, $4C, $33 // green
-byte          = $6E, $3B, $5D, $77 // yellow
-byte          = $11, $44, $22, $08 // dark blue
-byte          = $19, $66, $33, $4C // purple
-byte          = $55, $55, $2A, $2A // gray 2
-byte          = $5D, $77, $3B, $6E // pink
-byte          = $33, $4C, $66, $19 // medium blue
-byte          = $3B, $6E, $77, $5D // light blue
-byte          = $77, $5D, $6E, $3B // aqua
-byte          = $7F, $7F, $7F, $7F // white
-word clr = @colors
+//
+word auxclrs[] = $0000 // black
+word           = $2208 // magenta
+word           = $1144 // brown
+word           = $334C // orange
+word           = $0822 // dark green
+word           = $2A2A // gray 1
+word           = $1966 // green
+word           = $3B6E // yellow
+word           = $4411 // dark blue
+word           = $6619 // purple
+word           = $5555 // gray 2
+word           = $775D // pink
+word           = $4C33 // medium blue
+word           = $6E3B // light blue
+word           = $5D77 // aqua
+word           = $7F7F // white
+word memclrs[] = $0000 // black
+word           = $4411 // magenta
+word           = $2208 // brown
+word           = $6619 // orange
+word           = $1144 // dark green
+word           = $5555 // gray 1
+word           = $334C // green
+word           = $775D // yellow
+word           = $0822 // dark blue
+word           = $4C33 // purple
+word           = $2A2A // gray 2
+word           = $6E3B // pink
+word           = $1966 // medium blue
+word           = $5D77 // light blue
+word           = $3B6E // aqua
+word           = $7F7F // white
+word auxclr, memclr
 //
 // Modulo 7
 //
@@ -103,47 +127,98 @@ byte        = 0, 1, 2, 3, 4, 5, 6
 //
 // Divide 7
 //
-byte div7[] = 0, 0, 0, 0, 0, 0, 0
-byte        = 1, 1, 1, 1, 1, 1, 1
-byte        = 2, 2, 2, 2, 2, 2, 2
-byte        = 3, 3, 3, 3, 3, 3, 3
-byte        = 4, 4, 4, 4, 4, 4, 4
-byte        = 5, 5, 5, 5, 5, 5, 5
-byte        = 6, 6, 6, 6, 6, 6, 6
-byte        = 7, 7, 7, 7, 7, 7, 7
-byte        = 8, 8, 8, 8, 8, 8, 8
-byte        = 9, 9, 9, 9, 9, 9, 9
-byte        =10,10,10,10,10,10,10
-byte        =11,11,11,11,11,11,11
-byte        =12,12,12,12,12,12,12
-byte        =13,13,13,13,13,13,13
-byte        =14,14,14,14,14,14,14
-byte        =15,15,15,15,15,15,15
-byte        =16,16,16,16,16,16,16
-byte        =17,17,17,17,17,17,17
-byte        =18,18,18,18,18,18,18
-byte        =19,19,19,19,19,19,19
+byte div7x2[] = 0, 0, 0, 0, 0, 0, 0
+byte          = 2, 2, 2, 2, 2, 2, 2
+byte          = 4, 4, 4, 4, 4, 4, 4
+byte          = 6, 6, 6, 6, 6, 6, 6
+byte          = 8, 8, 8, 8, 8, 8, 8
+byte          =10,10,10,10,10,10,10
+byte          =12,12,12,12,12,12,12
+byte          =14,14,14,14,14,14,14
+byte          =16,16,16,16,16,16,16
+byte          =18,18,18,18,18,18,18
+byte          =20,20,20,20,20,20,20
+byte          =22,22,22,22,22,22,22
+byte          =24,24,24,24,24,24,24
+byte          =26,26,26,26,26,26,26
+byte          =28,28,28,28,28,28,28
+byte          =30,30,30,30,30,30,30
+byte          =32,32,32,32,32,32,32
+byte          =34,34,34,34,34,34,34
+byte          =36,36,36,36,36,36,36
+byte          =38,38,38,38,38,38,38
 
-def dhgrcolor(c)#0
-  clr = @colors + ((c & $0F) << 2)
+def dhgrColor(c)#0
+  auxclr = auxclrs[c & $0F]
+  memclr = memclrs[c & $0F]
 end
-def dhgrplot(x, y)#0
-  word pixaddr, maskblk, mask
+def dhgrPlot(x, y)#0
+  byte pix7
+  word pix7addr, mask
 
-  pixaddr = hgrscan[y] + div7[x] * 2
-  maskblk = @masks     + mod7[x] * 4
-  mask    = *maskblk
+  pix7addr = hgrscan[y] + div7x2[x]
+  pix7     = mod7[x]
+  mask     = auxmask[pix7]
   if mask
     ^page1x
-    *pixaddr = (*pixaddr & ~mask) | (mask & *clr)
+    *pix7addr = (*pix7addr & ~mask) | (mask & auxclr)
   fin
-  mask = *(maskblk + 2)
+  mask = memmask[pix7]
   if mask
     ^page1m
-    *pixaddr = (*pixaddr & ~mask) | (mask & *(clr + 2))
+    *pix7addr = (*pix7addr & ~mask) | (mask & memclr)
   fin
 end
-def dhgrmode(mode)
+def dhgrTile(x7, y8, tileptr)#0
+  word tileaddr
+  byte scan
+
+  tileaddr = hgrscan[y8 * 8] + x7 * 2
+  for scan = 0 to 7
+    ^page1x
+    *tileaddr = *tileptr
+    tileptr   = tileptr + 2
+    ^page1m
+    *tileaddr = *tileptr
+    tileptr   = tileptr + 2
+    tileaddr  = tileaddr + $0400
+  next
+end
+def dhgrDst(x7, y, w7, h, dstptr)#0
+  word pix7addr
+  byte scan, b
+  
+  for scan = y to y+h-1
+    pix7addr = hgrscan[scan] + x7 * 2
+    for b = 1 to w7
+      ^page1x
+      *dstptr  = *pix7addr
+      dstptr   = dstptr + 2
+      ^page1m
+      *dstptr  = *pix7addr
+      dstptr   = dstptr + 2
+      pix7addr = pix7addr + 2
+    next
+  next
+end
+def dhgrSrc(x7, y, w7, h, srcptr)#0
+  word pix7addr
+  byte scan, b
+  
+  for scan = y to y+h-1
+    pix7addr = hgrscan[scan] + x7 * 2
+    for b = 1 to w7
+      ^page1x
+      *pix7addr = *srcptr
+      srcptr    = srcptr + 2
+      ^page1m
+      *pix7addr = *srcptr
+      srcptr    = srcptr + 2
+      pix7addr = pix7addr + 2
+    next
+  next
+end
+def dhgrMode(mode)
   if mode == 0
     ^page1m
     ^showfull
@@ -167,12 +242,29 @@ def dhgrmode(mode)
   return mode
 end
 
-def dhgrtest#0
-  byte i
+def dhgrTest#0
+  byte i, j
+  word pixblk
 
-  dhgrcolor(15)
-  for i = 0 to 139
-    dhgrplot(i, i)
+  setlineplot(@dhgrPlot)
+  for i = 0 to 191 step 4
+    dhgrColor(i)
+    line(0, 0, 139, i)
+  next
+  for i = 139 downto 0 step 4
+    dhgrColor(i)
+    line(0, 0, i, 191)
+  next
+  pixblk = heapalloc(16/2*20)
+  dhgrDst(0, 0, 2, 20, pixblk)
+  for i = 1 to 170
+    dhgrSrc(0, i, 2, 20, pixblk)
+  next
+  dhgrDst(0, 0, 1, 8, pixblk) // Create tile
+  for j = 0 to 19
+    for i = 0 to 19
+      dhgrTile(i, j, pixblk)
+    next
   next
   while ^$C000 < 128
   loop