Further improvement to terminal emulation, makes scrolling window work properly
authorNick Downing <nick@ndcode.org>
Sun, 22 May 2022 09:58:49 +0000 (19:58 +1000)
committerNick Downing <nick@ndcode.org>
Sun, 22 May 2022 11:43:44 +0000 (21:43 +1000)
apple_io.py

index 65de630..42faa61 100644 (file)
@@ -256,6 +256,15 @@ def read(n):
 def write(data):
   os.write(fd_out, bytes(data, 'utf-8'))
 
+def crlf():
+  write(
+    '\r\n' + (f'\x1b[{mem[ZP_WNDLFT]:d}C' if mem[ZP_WNDLFT] else '')
+  )
+  mem[ZP_CV] += 1
+  if mem[ZP_CV] >= mem[ZP_WNDBTM]:
+    mem[ZP_CV] = mem[ZP_WNDBTM] - 1
+  mem[ZP_CH] = mem[ZP_WNDLFT]
+
 def _print(data):
   for ch in data:
     if ch == '\a':
@@ -271,24 +280,12 @@ def _print(data):
         mem[ZP_CV] = mem[ZP_WNDBTM] - 1
     elif ch == '\r':
       # apple treats \r as \r\n, so if you write e.g. \r\n you'll get \r\n\n
-      write(
-        '\r\n' + (f'\x1b[{mem[ZP_WNDLFT]:d}C' if mem[ZP_WNDLFT] else '')
-      )
-      mem[ZP_CV] += 1
-      if mem[ZP_CV] >= mem[ZP_WNDBTM]:
-        mem[ZP_CV] = mem[ZP_WNDBTM] - 1
-      mem[ZP_CH] = mem[ZP_WNDLFT]
+      crlf()
     elif ord(ch) >= 0x20:
       write(ch)
       mem[ZP_CH] += 1
       if mem[ZP_CH] >= mem[ZP_WNDLFT] + mem[ZP_WNDWTH]:
-        write(
-          '\r\n' + (f'\x1b[{mem[ZP_WNDLFT]:d}C' if mem[ZP_WNDLFT] else '')
-        )
-        mem[ZP_CV] += 1
-        if mem[ZP_CV] >= mem[ZP_WNDBTM]:
-          mem[ZP_CV] = mem[ZP_WNDBTM] - 1
-        mem[ZP_CH] = mem[ZP_WNDLFT]
+        crlf()
 
 def get():
   ch = read(1) 
@@ -398,7 +395,7 @@ def poke(addr, data):
   mem[addr] = data
   if addr == ZP_WNDTOP or addr == ZP_WNDBTM:
     # save cursor, set scrolling region, restore cursor
-    write(f'\x1b[s\x1b[{mem[ZP_WNDTOP + 1]:d};{mem[ZP_WNDBTM]:d}r\x1b[u')
+    write(f'\x1b[s\x1b[{mem[ZP_WNDTOP] + 1:d};{mem[ZP_WNDBTM]:d}r\x1b[u')
 
 def call(addr):
   addr &= 0xffff
@@ -452,6 +449,7 @@ def text():
 
 def gr():
   # clear screen, set scrolling region (homes cursor)
+  write(f'\x1b[2J\x1b[21;24r')
   mem[ZP_WNDLFT] = 0
   mem[ZP_WNDWTH] = 40
   mem[ZP_WNDTOP] = 20
@@ -462,7 +460,6 @@ def gr():
     gr_mem[i][:] = [0 for j in range(40)]
 
 def gr_update(x0, y0, x1, y1):
-  #write('\x1b[s') # save cursor
   write(f'\x1b7') # save all attributes (in case in INVERSE/FLASH mode)
   bg = -1
   fg = -1
@@ -502,8 +499,7 @@ def gr_update(x0, y0, x1, y1):
         fg = new_fg
         br = new_br
       write(ch * gr_width)
-  #write('\x1b[u\x1b[0m') # restore cursor and attributes
-  write(f'\x1b8') # save all attributes (in case in INVERSE/FLASH mode)
+  write(f'\x1b8') # restore all attributes (in case in INVERSE/FLASH mode)
 
 def color(n):
   global gr_color