Add inter-statement delay, fix an oversight regarding POKEs to CH, CV, INVFLG
authorNick Downing <nick@ndcode.org>
Tue, 24 May 2022 07:29:08 +0000 (17:29 +1000)
committerNick Downing <nick@ndcode.org>
Tue, 24 May 2022 07:32:10 +0000 (17:32 +1000)
apple_io.py
applesoft_basic.py
applesoft_basic.t
test_io.bas

index 22d2730..f48d44e 100644 (file)
@@ -383,12 +383,12 @@ def input():
         line += ch
 
 def htab(x):
-  write(f'\x1b[{x:d}G')
-  low_mem[ZP_CH] = x - 1
+  low_mem[ZP_CH] = (x - 1) & 0xff
+  write(ch())
 
 def vtab(y):
-  write(f'\x1b[{y:d}d')
-  low_mem[ZP_CV] = y - 1
+  low_mem[ZP_CV] = (y - 1) & 0xff
+  write(cv())
 
 def cleol():
   write('\x1b[K')
@@ -408,6 +408,12 @@ def home():
     addr = bascalc(i)
     low_mem[addr:addr + 40] = [0xa0] * 40
 
+def ch():
+  return f'\x1b[{low_mem[ZP_CH] + 1:d}G'
+
+def cv():
+  return f'\x1b[{low_mem[ZP_CV] + 1:d}d'
+
 def invflg():
   return (
     '\x1b[0;7;5m'
@@ -495,11 +501,17 @@ def poke(addr, data):
         if y < 24:
           x = (addr & 0x7f) % 40
           gr_update(x, y, x + 1, y + 1)
+      elif addr == ZP_CH:
+        write(ch())
+      elif addr == ZP_CV:
+        write(cv())
       elif addr == ZP_WNDTOP or addr == ZP_WNDBTM:
         # save cursor, set scrolling region, restore cursor
         write(
           f'\x1b[s\x1b[{low_mem[ZP_WNDTOP] + 1:d};{low_mem[ZP_WNDBTM]:d}r\x1b[u'
         )
+      elif addr == ZP_INVFLG:
+        write(invflg())
     else:
       mem[addr] = data
 
index 13e79ab..b4fdb1f 100755 (executable)
@@ -39,13 +39,15 @@ beep_styles = {
 while len(sys.argv) >= 2:
   if sys.argv[1][:7] == '--beep-style=':
     apple_io.beep_style = beep_styles[sys.arg[1][7:]]
+  elif sys.argv[1][:24] == '--inter-statement-delay=':
+    t_def.inter_statement_delay = float(sys.argv[1][24:])
   elif sys.argv[1][:11] == '--joystick=':
     apple_joystick.input_path = sys.argv[1][11:]
   else:
     break
   del sys.argv[1]
 if len(sys.argv) < 2:
-  print(f'usage: {sys.argv[0]:s} [--beep-style=alsa|vt100] [--joystick=/dev/input/eventNN] program.tok')
+  print(f'usage: {sys.argv[0]:s} [--beep-style=alsa|vt100] [--inter-statement-delay=secs] [--joystick=/dev/input/eventNN] program.tok')
   sys.exit(EXIT_FAILURE)
 program_bas = sys.argv[1]
 
index 84df4f8..5f5d822 100644 (file)
@@ -28,6 +28,7 @@
   # globals
   random.seed(time.time())
   last_random = random.random()
+  inter_statement_delay = 0.
 %}
 
 %%
@@ -261,6 +262,8 @@ class Context:
         statement = line.children[self.j]
         self.j += 1
         statement.execute(self)
+        if inter_statement_delay != 0:
+          time.sleep(inter_statement_delay)
       else:
         self.i += 1
         self.j = 1
index bcbcb4c..635ed99 100644 (file)
@@ -1,6 +1,7 @@
 10 HOME
 20 HTAB 10
-30 PRINT "MY PROGRAM"
+30 INVERSE:PRINT "MY PROGRAM":NORMAL
+35 FOR I=0 TO 31:POKE 1280+I,I*8:NEXT
 40 VTAB 5
 50 PRINT CHR$(7)"TYPE SOMETHING: ";
 60 GET I$