fd_out = sys.stdout.fileno()
poll_in = select.poll()
poll_in.register(fd_in, select.POLLIN)
+mem = {}
def init():
global attr
# doesn't seem to work on any linux console on my laptop
write(f'\x1b7\x1b[10;{freq:d}]\x1b[11;{dur:d}]\x07\x1b8')
+def peek(addr):
+ addr &= 0xffff
+ return mem.get(addr, 0)
+
+def poke(addr, data):
+ addr &= 0xffff
+ data &= 0xff
+ if data:
+ mem[addr] = data
+ elif addr in mem:
+ del mem[addr]
+
+def call(addr):
+ addr &= 0xffff
+ raise Exception(f'call {addr:04x}')
+
if __name__ == '__main__':
init()
while True:
class StatementGet: Statement;
class StatementInput: Statement;
class StatementDim: Statement;
+class StatementPoke: Statement;
+class StatementCall: Statement;
class RValue: Node;
class RValueOr: RValue;
class RValueAnd: RValue;
class RValueStrLiteral: RValue;
class RValueStrDollar: RValue;
class RValueVal: RValue;
+class RValuePeek: RValue;
class LValue: RValue;
class LValueVariable: LValue;
class LValueArray: LValue;
[create_array(i + 1) for j in range(dim[i])]
)
context.arrays[name] = create_array(0)
+@method(StatementPoke)
+def execute(self, context):
+ value0 = self.children[0].get_float()
+ value1 = self.children[1].get_float()
+ apple_io.poke(data_types.cint(value0), data_types.cint(value1))
+@method(StatementCall)
+def execute(self, context):
+ value = self.children[0].get_float()
+ apple_io.call(data_types.cint(value))
del execute
@method(RValue)
def get(self, context):
value = self.children[0].get_str(context)
return data_types.val(value)
+@method(RValuePeek)
+def get(self, context):
+ value = self.children[0].get_str(context)
+ return float(apple_io.peek(data_types.cint(value)))
@method(LValue)
def get(self, context):
value = self.find_variable(context).value
| %space (?E{t_def.StatementInput}KEYWORD_INPUT lvalue)
| %space (?E{t_def.StatementInput}KEYWORD_INPUT STR_LITERAL ';' lvalue)
| %space (?E{t_def.StatementDim}KEYWORD_DIM VARIABLE_NAME '(' rvalue_list ')')
+ | %space (?E{t_def.StatementPoke}KEYWORD_POKE lvalue ',' lvalue)
+ | %space (?E{t_def.StatementCall}KEYWORD_CALL lvalue)
;
print_rvalue_list0
| %space (?E{t_def.RValueOr}rvalue KEYWORD_OR rvalue)
| %space (?E{t_def.RValueStrDollar}KEYWORD_STR_DOLLAR '(' rvalue ')')
| %space (?E{t_def.RValueVal}KEYWORD_VAL '(' rvalue ')')
+ | %space (?E{t_def.RValuePeek}KEYWORD_PEEK '(' rvalue ')')
;
lvalue