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':
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)
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
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
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
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