current_speed = 255
hrcg = False
+COUT_STATE_NORMAL = 0
+COUT_STATE_CTRL_A = 1
+cout_state = COUT_STATE_NORMAL
+
def init():
global termios_attr, pcm
low_mem[ZP_CH] = low_mem[ZP_WNDLFT]
def _print(data):
- for ch in data:
- if ch == '\a':
- tone(1000., .1) # 1 kHz for .1 sec
- elif ch == '\b':
- if low_mem[ZP_CH] > low_mem[ZP_WNDLFT]:
- write('\b')
- low_mem[ZP_CH] -= 1
- elif ch == '\n':
- write('\n')
- low_mem[ZP_CV] += 1
- if low_mem[ZP_CV] >= low_mem[ZP_WNDBTM]:
- low_mem[ZP_CV] = low_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
- if hrcg:
- write('\r')
- crlf()
- elif ord(ch) >= 0x20:
- # some applications expect BASL, BASH = base address of current line
- addr = bascalc(low_mem[ZP_CV])
- low_mem[ZP_BASL] = addr & 0xff
- low_mem[ZP_BASH] = addr >> 8
- i = ord(ch)
- data = (
- (i & 0x3f) ^ 0x60
- if invflg == INVFLG_FLASH else
- (i & 0x3f) ^ 0x20
- if invflg == INVFLG_INVERSE else
- i | 0x80
- )
- low_mem[addr + low_mem[ZP_CH]] = data
+ global cout_state
- if current_gr and low_mem[ZP_CV] < 20:
- write(gr_encode([data])[0] + invflg())
- else:
- write(ch)
- low_mem[ZP_CH] += 1
- if low_mem[ZP_CH] >= low_mem[ZP_WNDLFT] + low_mem[ZP_WNDWTH]:
+ for ch in data:
+ if cout_state == COUT_STATE_NORMAL:
+ if ch == '\a':
+ tone(1000., .1) # 1 kHz for .1 sec
+ elif ch == '\b':
+ if low_mem[ZP_CH] > low_mem[ZP_WNDLFT]:
+ write('\b')
+ low_mem[ZP_CH] -= 1
+ elif ch == '\n':
+ write('\n')
+ low_mem[ZP_CV] += 1
+ if low_mem[ZP_CV] >= low_mem[ZP_WNDBTM]:
+ low_mem[ZP_CV] = low_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
+ if hrcg:
+ write('\r')
crlf()
-
- if current_speed < 255:
- time.sleep((255 - current_speed) / 2550.) # up to .1s
- elif hrcg:
+ elif ord(ch) >= 0x20:
+ # some applications expect BASL, BASH = base address of current line
+ addr = bascalc(low_mem[ZP_CV])
+ low_mem[ZP_BASL] = addr & 0xff
+ low_mem[ZP_BASH] = addr >> 8
+ i = ord(ch)
+ data = (
+ (i & 0x3f) ^ 0x60
+ if invflg == INVFLG_FLASH else
+ (i & 0x3f) ^ 0x20
+ if invflg == INVFLG_INVERSE else
+ i | 0x80
+ )
+ low_mem[addr + low_mem[ZP_CH]] = data
+
+ if current_gr and low_mem[ZP_CV] < 20:
+ write(gr_encode([data])[0] + invflg())
+ else:
+ write(ch)
+ low_mem[ZP_CH] += 1
+ if low_mem[ZP_CH] >= low_mem[ZP_WNDLFT] + low_mem[ZP_WNDWTH]:
+ crlf()
+
+ if current_speed < 255:
+ time.sleep((255 - current_speed) / 2550.) # up to .1s
+ elif hrcg:
+ write(ch)
+ if ord(ch) == 1: # ctrl-a
+ cout_state = COUT_STATE_CTRL_A
+ elif cout_state == COUT_STATE_CTRL_A:
+ # doesn't advance cursor
write(ch)
+ COUT_STATE = COUT_STATE_NORMAL
+ else:
+ assert False
def get_internal():
global ch_in
while i < len(buf):
i += pcm.write(buf[i:])
pcm.close()
- else:
+ else:
assert False
def himem(addr):