mirror of
https://github.com/irmen/prog8.git
synced 2024-12-25 08:29:25 +00:00
incr decr fixes
This commit is contained in:
parent
aa2f3dd169
commit
57bc7d49bc
@ -164,6 +164,9 @@ class IntegerValue(Value):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "<IntegerValue {} name={}>".format(self.value, self.name)
|
return "<IntegerValue {} name={}>".format(self.value, self.name)
|
||||||
|
|
||||||
|
def negative(self) -> 'IntegerValue':
|
||||||
|
return IntegerValue(-self.value, self.sourceref, datatype=self.datatype, name=self.name)
|
||||||
|
|
||||||
|
|
||||||
class FloatValue(Value):
|
class FloatValue(Value):
|
||||||
def __init__(self, value: float, sourceref: SourceRef, name: str = None) -> None:
|
def __init__(self, value: float, sourceref: SourceRef, name: str = None) -> None:
|
||||||
@ -187,6 +190,9 @@ class FloatValue(Value):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "<FloatValue {} name={}>".format(self.value, self.name)
|
return "<FloatValue {} name={}>".format(self.value, self.name)
|
||||||
|
|
||||||
|
def negative(self) -> 'FloatValue':
|
||||||
|
return FloatValue(-self.value, self.sourceref, name=self.name)
|
||||||
|
|
||||||
|
|
||||||
class StringValue(Value):
|
class StringValue(Value):
|
||||||
def __init__(self, value: str, sourceref: SourceRef, name: str = None, constant: bool = False) -> None:
|
def __init__(self, value: str, sourceref: SourceRef, name: str = None, constant: bool = False) -> None:
|
||||||
@ -419,21 +425,21 @@ class ReturnStmt(_AstNode):
|
|||||||
|
|
||||||
|
|
||||||
class InplaceIncrStmt(_AstNode):
|
class InplaceIncrStmt(_AstNode):
|
||||||
def __init__(self, what: Value, howmuch: Union[None, int, float], byname: Optional[str], sourceref: SourceRef) -> None:
|
def __init__(self, what: Value, value: Union[IntegerValue, FloatValue], sourceref: SourceRef) -> None:
|
||||||
super().__init__(sourceref)
|
super().__init__(sourceref)
|
||||||
assert howmuch is None or howmuch > 0
|
assert value.constant
|
||||||
|
assert (value.value is None and value.name) or value.value > 0
|
||||||
self.what = what
|
self.what = what
|
||||||
self.howmuch = howmuch
|
self.value = value
|
||||||
self.float_var_name = byname
|
|
||||||
|
|
||||||
|
|
||||||
class InplaceDecrStmt(_AstNode):
|
class InplaceDecrStmt(_AstNode):
|
||||||
def __init__(self, what: Value, howmuch: Union[None, int, float], byname: Optional[str], sourceref: SourceRef) -> None:
|
def __init__(self, what: Value, value: Union[IntegerValue, FloatValue], sourceref: SourceRef) -> None:
|
||||||
super().__init__(sourceref)
|
super().__init__(sourceref)
|
||||||
assert howmuch is None or howmuch > 0
|
assert value.constant
|
||||||
|
assert (value.value is None and value.name) or value.value > 0
|
||||||
self.what = what
|
self.what = what
|
||||||
self.howmuch = howmuch
|
self.value = value
|
||||||
self.float_var_name = byname
|
|
||||||
|
|
||||||
|
|
||||||
class IfCondition(_AstNode):
|
class IfCondition(_AstNode):
|
||||||
|
111
il65/codegen.py
111
il65/codegen.py
@ -396,10 +396,13 @@ class CodeGenerator:
|
|||||||
self.previous_stmt_was_assignment = isinstance(stmt, AssignmentStmt)
|
self.previous_stmt_was_assignment = isinstance(stmt, AssignmentStmt)
|
||||||
|
|
||||||
def generate_incr_or_decr(self, stmt: Union[InplaceIncrStmt, InplaceDecrStmt]) -> None:
|
def generate_incr_or_decr(self, stmt: Union[InplaceIncrStmt, InplaceDecrStmt]) -> None:
|
||||||
assert (stmt.howmuch is None and stmt.float_var_name) or (stmt.howmuch > 0 and not stmt.float_var_name)
|
assert stmt.value.constant
|
||||||
if stmt.what.datatype != DataType.FLOAT and stmt.howmuch > 0xff:
|
assert (stmt.value.value is None and stmt.value.name) or stmt.value.value > 0
|
||||||
|
if stmt.what.datatype != DataType.FLOAT and not stmt.value.name and stmt.value.value > 0xff:
|
||||||
raise CodeError("only supports integer incr/decr by up to 255 for now") # XXX
|
raise CodeError("only supports integer incr/decr by up to 255 for now") # XXX
|
||||||
is_incr = isinstance(stmt, InplaceIncrStmt)
|
is_incr = isinstance(stmt, InplaceIncrStmt)
|
||||||
|
howmuch = stmt.value.value
|
||||||
|
value_str = stmt.value.name or str(howmuch)
|
||||||
if isinstance(stmt.what, RegisterValue):
|
if isinstance(stmt.what, RegisterValue):
|
||||||
reg = stmt.what.register
|
reg = stmt.what.register
|
||||||
# note: these operations below are all checked to be ok
|
# note: these operations below are all checked to be ok
|
||||||
@ -407,9 +410,9 @@ class CodeGenerator:
|
|||||||
if reg == 'A':
|
if reg == 'A':
|
||||||
# a += 1..255
|
# a += 1..255
|
||||||
self.p("\t\tclc")
|
self.p("\t\tclc")
|
||||||
self.p("\t\tadc #{:d}".format(stmt.howmuch))
|
self.p("\t\tadc #" + value_str)
|
||||||
elif reg in REGISTER_BYTES:
|
elif reg in REGISTER_BYTES:
|
||||||
if stmt.howmuch == 1:
|
if howmuch == 1:
|
||||||
# x/y += 1
|
# x/y += 1
|
||||||
self.p("\t\tin{:s}".format(reg.lower()))
|
self.p("\t\tin{:s}".format(reg.lower()))
|
||||||
else:
|
else:
|
||||||
@ -417,25 +420,25 @@ class CodeGenerator:
|
|||||||
self.p("\t\tpha")
|
self.p("\t\tpha")
|
||||||
self.p("\t\tt{:s}a".format(reg.lower()))
|
self.p("\t\tt{:s}a".format(reg.lower()))
|
||||||
self.p("\t\tclc")
|
self.p("\t\tclc")
|
||||||
self.p("\t\tadc #{:d}".format(stmt.howmuch))
|
self.p("\t\tadc #" + value_str)
|
||||||
self.p("\t\tta{:s}".format(reg.lower()))
|
self.p("\t\tta{:s}".format(reg.lower()))
|
||||||
self.p("\t\tpla")
|
self.p("\t\tpla")
|
||||||
elif reg == "AX":
|
elif reg == "AX":
|
||||||
# AX += 1..255
|
# AX += 1..255
|
||||||
self.p("\t\tclc")
|
self.p("\t\tclc")
|
||||||
self.p("\t\tadc #{:d}".format(stmt.howmuch))
|
self.p("\t\tadc #" + value_str)
|
||||||
self.p("\t\tbcc +")
|
self.p("\t\tbcc +")
|
||||||
self.p("\t\tinx")
|
self.p("\t\tinx")
|
||||||
self.p("+")
|
self.p("+")
|
||||||
elif reg == "AY":
|
elif reg == "AY":
|
||||||
# AY += 1..255
|
# AY += 1..255
|
||||||
self.p("\t\tclc")
|
self.p("\t\tclc")
|
||||||
self.p("\t\tadc #{:d}".format(stmt.howmuch))
|
self.p("\t\tadc # " + value_str)
|
||||||
self.p("\t\tbcc +")
|
self.p("\t\tbcc +")
|
||||||
self.p("\t\tiny")
|
self.p("\t\tiny")
|
||||||
self.p("+")
|
self.p("+")
|
||||||
elif reg == "XY":
|
elif reg == "XY":
|
||||||
if stmt.howmuch == 1:
|
if howmuch == 1:
|
||||||
# XY += 1
|
# XY += 1
|
||||||
self.p("\t\tinx")
|
self.p("\t\tinx")
|
||||||
self.p("\t\tbne +")
|
self.p("\t\tbne +")
|
||||||
@ -446,7 +449,7 @@ class CodeGenerator:
|
|||||||
self.p("\t\tpha")
|
self.p("\t\tpha")
|
||||||
self.p("\t\ttxa")
|
self.p("\t\ttxa")
|
||||||
self.p("\t\tclc")
|
self.p("\t\tclc")
|
||||||
self.p("\t\tadc #{:d}".format(stmt.howmuch))
|
self.p("\t\tadc #" + value_str)
|
||||||
self.p("\t\ttax")
|
self.p("\t\ttax")
|
||||||
self.p("\t\tbcc +")
|
self.p("\t\tbcc +")
|
||||||
self.p("\t\tiny")
|
self.p("\t\tiny")
|
||||||
@ -457,9 +460,9 @@ class CodeGenerator:
|
|||||||
if reg == 'A':
|
if reg == 'A':
|
||||||
# a -= 1..255
|
# a -= 1..255
|
||||||
self.p("\t\tsec")
|
self.p("\t\tsec")
|
||||||
self.p("\t\tsbc #{:d}".format(stmt.howmuch))
|
self.p("\t\tsbc #" + value_str)
|
||||||
elif reg in REGISTER_BYTES:
|
elif reg in REGISTER_BYTES:
|
||||||
if stmt.howmuch == 1:
|
if howmuch == 1:
|
||||||
# x/y -= 1
|
# x/y -= 1
|
||||||
self.p("\t\tde{:s}".format(reg.lower()))
|
self.p("\t\tde{:s}".format(reg.lower()))
|
||||||
else:
|
else:
|
||||||
@ -467,25 +470,25 @@ class CodeGenerator:
|
|||||||
self.p("\t\tpha")
|
self.p("\t\tpha")
|
||||||
self.p("\t\tt{:s}a".format(reg.lower()))
|
self.p("\t\tt{:s}a".format(reg.lower()))
|
||||||
self.p("\t\tsec")
|
self.p("\t\tsec")
|
||||||
self.p("\t\tsbc #{:d}".format(stmt.howmuch))
|
self.p("\t\tsbc #" + value_str)
|
||||||
self.p("\t\tta{:s}".format(reg.lower()))
|
self.p("\t\tta{:s}".format(reg.lower()))
|
||||||
self.p("\t\tpla")
|
self.p("\t\tpla")
|
||||||
elif reg == "AX":
|
elif reg == "AX":
|
||||||
# AX -= 1..255
|
# AX -= 1..255
|
||||||
self.p("\t\tsec")
|
self.p("\t\tsec")
|
||||||
self.p("\t\tsbc #{:d}".format(stmt.howmuch))
|
self.p("\t\tsbc #" + value_str)
|
||||||
self.p("\t\tbcs +")
|
self.p("\t\tbcs +")
|
||||||
self.p("\t\tdex")
|
self.p("\t\tdex")
|
||||||
self.p("+")
|
self.p("+")
|
||||||
elif reg == "AY":
|
elif reg == "AY":
|
||||||
# AY -= 1..255
|
# AY -= 1..255
|
||||||
self.p("\t\tsec")
|
self.p("\t\tsec")
|
||||||
self.p("\t\tsbc #{:d}".format(stmt.howmuch))
|
self.p("\t\tsbc #" + value_str)
|
||||||
self.p("\t\tbcs +")
|
self.p("\t\tbcs +")
|
||||||
self.p("\t\tdey")
|
self.p("\t\tdey")
|
||||||
self.p("+")
|
self.p("+")
|
||||||
elif reg == "XY":
|
elif reg == "XY":
|
||||||
if stmt.howmuch == 1:
|
if howmuch == 1:
|
||||||
# XY -= 1
|
# XY -= 1
|
||||||
self.p("\t\tcpx #0")
|
self.p("\t\tcpx #0")
|
||||||
self.p("\t\tbne +")
|
self.p("\t\tbne +")
|
||||||
@ -496,7 +499,7 @@ class CodeGenerator:
|
|||||||
self.p("\t\tpha")
|
self.p("\t\tpha")
|
||||||
self.p("\t\ttxa")
|
self.p("\t\ttxa")
|
||||||
self.p("\t\tsec")
|
self.p("\t\tsec")
|
||||||
self.p("\t\tsbc #{:d}".format(stmt.howmuch))
|
self.p("\t\tsbc #" + value_str)
|
||||||
self.p("\t\ttax")
|
self.p("\t\ttax")
|
||||||
self.p("\t\tbcs +")
|
self.p("\t\tbcs +")
|
||||||
self.p("\t\tdey")
|
self.p("\t\tdey")
|
||||||
@ -507,86 +510,86 @@ class CodeGenerator:
|
|||||||
what = stmt.what
|
what = stmt.what
|
||||||
if isinstance(what, IndirectValue):
|
if isinstance(what, IndirectValue):
|
||||||
if isinstance(what.value, IntegerValue):
|
if isinstance(what.value, IntegerValue):
|
||||||
r_str = what.value.name or Parser.to_hex(what.value.value)
|
what_str = what.value.name or Parser.to_hex(what.value.value)
|
||||||
else:
|
else:
|
||||||
raise CodeError("invalid incr indirect type", what.value)
|
raise CodeError("invalid incr indirect type", what.value)
|
||||||
else:
|
else:
|
||||||
r_str = what.name or Parser.to_hex(what.address)
|
what_str = what.name or Parser.to_hex(what.address)
|
||||||
if what.datatype == DataType.BYTE:
|
if what.datatype == DataType.BYTE:
|
||||||
if stmt.howmuch == 1:
|
if howmuch == 1:
|
||||||
self.p("\t\t{:s} {:s}".format("inc" if is_incr else "dec", r_str))
|
self.p("\t\t{:s} {:s}".format("inc" if is_incr else "dec", what_str))
|
||||||
else:
|
else:
|
||||||
self.p("\t\tpha")
|
self.p("\t\tpha")
|
||||||
self.p("\t\tlda " + r_str)
|
self.p("\t\tlda " + what_str)
|
||||||
if is_incr:
|
if is_incr:
|
||||||
self.p("\t\tclc")
|
self.p("\t\tclc")
|
||||||
self.p("\t\tadc #{:d}".format(stmt.howmuch))
|
self.p("\t\tadc #" + value_str)
|
||||||
else:
|
else:
|
||||||
self.p("\t\tsec")
|
self.p("\t\tsec")
|
||||||
self.p("\t\tsbc #{:d}".format(stmt.howmuch))
|
self.p("\t\tsbc #" + value_str)
|
||||||
self.p("\t\tsta " + r_str)
|
self.p("\t\tsta " + what_str)
|
||||||
self.p("\t\tpla")
|
self.p("\t\tpla")
|
||||||
elif what.datatype == DataType.WORD:
|
elif what.datatype == DataType.WORD:
|
||||||
if stmt.howmuch == 1:
|
if howmuch == 1:
|
||||||
# mem.word +=/-= 1
|
# mem.word +=/-= 1
|
||||||
if is_incr:
|
if is_incr:
|
||||||
self.p("\t\tinc " + r_str)
|
self.p("\t\tinc " + what_str)
|
||||||
self.p("\t\tbne +")
|
self.p("\t\tbne +")
|
||||||
self.p("\t\tinc {:s}+1".format(r_str))
|
self.p("\t\tinc {:s}+1".format(what_str))
|
||||||
self.p("+")
|
self.p("+")
|
||||||
else:
|
else:
|
||||||
self.p("\t\tpha")
|
self.p("\t\tpha")
|
||||||
self.p("\t\tlda " + r_str)
|
self.p("\t\tlda " + what_str)
|
||||||
self.p("\t\tbne +")
|
self.p("\t\tbne +")
|
||||||
self.p("\t\tdec {:s}+1".format(r_str))
|
self.p("\t\tdec {:s}+1".format(what_str))
|
||||||
self.p("+\t\tdec " + r_str)
|
self.p("+\t\tdec " + what_str)
|
||||||
self.p("\t\tpla")
|
self.p("\t\tpla")
|
||||||
else:
|
else:
|
||||||
# mem.word +=/-= 2..255
|
# mem.word +=/-= 2..255
|
||||||
if is_incr:
|
if is_incr:
|
||||||
self.p("\t\tpha")
|
self.p("\t\tpha")
|
||||||
self.p("\t\tclc")
|
self.p("\t\tclc")
|
||||||
self.p("\t\tlda " + r_str)
|
self.p("\t\tlda " + what_str)
|
||||||
self.p("\t\tadc #{:d}".format(stmt.howmuch))
|
self.p("\t\tadc #" + value_str)
|
||||||
self.p("\t\tsta " + r_str)
|
self.p("\t\tsta " + what_str)
|
||||||
self.p("\t\tbcc +")
|
self.p("\t\tbcc +")
|
||||||
self.p("\t\tinc {:s}+1".format(r_str))
|
self.p("\t\tinc {:s}+1".format(what_str))
|
||||||
self.p("+\t\tpla")
|
self.p("+\t\tpla")
|
||||||
else:
|
else:
|
||||||
self.p("\t\tpha")
|
self.p("\t\tpha")
|
||||||
self.p("\t\tsec")
|
self.p("\t\tsec")
|
||||||
self.p("\t\tlda " + r_str)
|
self.p("\t\tlda " + what_str)
|
||||||
self.p("\t\tsbc #{:d}".format(stmt.howmuch))
|
self.p("\t\tsbc #" + value_str)
|
||||||
self.p("\t\tsta " + r_str)
|
self.p("\t\tsta " + what_str)
|
||||||
self.p("\t\tbcs +")
|
self.p("\t\tbcs +")
|
||||||
self.p("\t\tdec {:s}+1".format(r_str))
|
self.p("\t\tdec {:s}+1".format(what_str))
|
||||||
self.p("+\t\tpla")
|
self.p("+\t\tpla")
|
||||||
elif what.datatype == DataType.FLOAT:
|
elif what.datatype == DataType.FLOAT:
|
||||||
if stmt.howmuch == 1.0:
|
if howmuch == 1.0:
|
||||||
# special case for +/-1
|
# special case for +/-1
|
||||||
with self.preserving_registers({'A', 'X', 'Y'}, loads_a_within=True):
|
with self.preserving_registers({'A', 'X', 'Y'}, loads_a_within=True):
|
||||||
self.p("\t\tldx #<" + r_str)
|
self.p("\t\tldx #<" + what_str)
|
||||||
self.p("\t\tldy #>" + r_str)
|
self.p("\t\tldy #>" + what_str)
|
||||||
if is_incr:
|
if is_incr:
|
||||||
self.p("\t\tjsr il65_lib.float_add_one")
|
self.p("\t\tjsr c64flt.float_add_one")
|
||||||
else:
|
else:
|
||||||
self.p("\t\tjsr il65_lib.float_sub_one")
|
self.p("\t\tjsr c64flt.float_sub_one")
|
||||||
elif stmt.float_var_name:
|
elif stmt.value.name:
|
||||||
with self.preserving_registers({'A', 'X', 'Y'}, loads_a_within=True):
|
with self.preserving_registers({'A', 'X', 'Y'}, loads_a_within=True):
|
||||||
self.p("\t\tlda #<" + stmt.float_var_name)
|
self.p("\t\tlda #<" + stmt.value.name)
|
||||||
self.p("\t\tsta c64.SCRATCH_ZPWORD1")
|
self.p("\t\tsta c64.SCRATCH_ZPWORD1")
|
||||||
self.p("\t\tlda #>" + stmt.float_var_name)
|
self.p("\t\tlda #>" + stmt.value.name)
|
||||||
self.p("\t\tsta c64.SCRATCH_ZPWORD1+1")
|
self.p("\t\tsta c64.SCRATCH_ZPWORD1+1")
|
||||||
self.p("\t\tldx #<" + r_str)
|
self.p("\t\tldx #<" + what_str)
|
||||||
self.p("\t\tldy #>" + r_str)
|
self.p("\t\tldy #>" + what_str)
|
||||||
if is_incr:
|
if is_incr:
|
||||||
self.p("\t\tjsr il65_lib.float_add_SW1_to_XY")
|
self.p("\t\tjsr c64flt.float_add_SW1_to_XY")
|
||||||
else:
|
else:
|
||||||
self.p("\t\tjsr il65_lib.float_sub_SW1_from_XY")
|
self.p("\t\tjsr c64flt.float_sub_SW1_from_XY")
|
||||||
else:
|
else:
|
||||||
raise CodeError("incr/decr missing float constant definition")
|
raise CodeError("incr/decr missing float constant definition")
|
||||||
else:
|
else:
|
||||||
raise CodeError("cannot in/decrement memory of type " + str(what.datatype), stmt.howmuch)
|
raise CodeError("cannot in/decrement memory of type " + str(what.datatype), howmuch)
|
||||||
else:
|
else:
|
||||||
raise CodeError("cannot in/decrement " + str(stmt.what))
|
raise CodeError("cannot in/decrement " + str(stmt.what))
|
||||||
|
|
||||||
@ -1536,7 +1539,7 @@ class CodeGenerator:
|
|||||||
# assigning a register to a float requires c64 ROM routines
|
# assigning a register to a float requires c64 ROM routines
|
||||||
if r_register in REGISTER_WORDS:
|
if r_register in REGISTER_WORDS:
|
||||||
def do_rom_calls():
|
def do_rom_calls():
|
||||||
self.p("\t\tjsr c64.GIVUAYF") # uword AY -> fac1
|
self.p("\t\tjsr c64flt.GIVUAYF") # uword AY -> fac1
|
||||||
self.p("\t\tldx #<" + lv_string)
|
self.p("\t\tldx #<" + lv_string)
|
||||||
self.p("\t\tldy #>" + lv_string)
|
self.p("\t\tldy #>" + lv_string)
|
||||||
self.p("\t\tjsr c64.FTOMEMXY") # fac1 -> memory XY
|
self.p("\t\tjsr c64.FTOMEMXY") # fac1 -> memory XY
|
||||||
@ -1772,7 +1775,7 @@ class CodeGenerator:
|
|||||||
self.p("\t\tsta c64.SCRATCH_ZPWORD1+1")
|
self.p("\t\tsta c64.SCRATCH_ZPWORD1+1")
|
||||||
self.p("\t\tldx #<" + l_str)
|
self.p("\t\tldx #<" + l_str)
|
||||||
self.p("\t\tldy #>" + l_str)
|
self.p("\t\tldy #>" + l_str)
|
||||||
self.p("\t\tjsr il65_lib.copy_mflt")
|
self.p("\t\tjsr c64flt.copy_mflt")
|
||||||
elif rvalue.datatype == DataType.BYTE:
|
elif rvalue.datatype == DataType.BYTE:
|
||||||
with self.preserving_registers({'A', 'X', 'Y'}):
|
with self.preserving_registers({'A', 'X', 'Y'}):
|
||||||
self.p("\t\tldy " + r_str)
|
self.p("\t\tldy " + r_str)
|
||||||
@ -1784,7 +1787,7 @@ class CodeGenerator:
|
|||||||
with self.preserving_registers({'A', 'X', 'Y'}, loads_a_within=True):
|
with self.preserving_registers({'A', 'X', 'Y'}, loads_a_within=True):
|
||||||
self.p("\t\tlda " + r_str)
|
self.p("\t\tlda " + r_str)
|
||||||
self.p("\t\tldy {:s}+1".format(r_str))
|
self.p("\t\tldy {:s}+1".format(r_str))
|
||||||
self.p("\t\tjsr c64.GIVUAYF") # uword AY -> fac1
|
self.p("\t\tjsr c64flt.GIVUAYF") # uword AY -> fac1
|
||||||
self.p("\t\tldx #<" + l_str)
|
self.p("\t\tldx #<" + l_str)
|
||||||
self.p("\t\tldy #>" + l_str)
|
self.p("\t\tldy #>" + l_str)
|
||||||
self.p("\t\tjsr c64.FTOMEMXY") # fac1 -> memory XY
|
self.p("\t\tjsr c64.FTOMEMXY") # fac1 -> memory XY
|
||||||
|
@ -254,10 +254,11 @@ class Parser:
|
|||||||
|
|
||||||
def desugar_immediate_floats(stmt: _AstNode, containing_block: Block) -> None:
|
def desugar_immediate_floats(stmt: _AstNode, containing_block: Block) -> None:
|
||||||
if isinstance(stmt, (InplaceIncrStmt, InplaceDecrStmt)):
|
if isinstance(stmt, (InplaceIncrStmt, InplaceDecrStmt)):
|
||||||
if stmt.howmuch is None:
|
howmuch = stmt.value.value
|
||||||
assert stmt.float_var_name
|
if howmuch is None:
|
||||||
|
assert stmt.value.name
|
||||||
return
|
return
|
||||||
if stmt.howmuch in (0, 1):
|
if howmuch in (0, 1) or type(howmuch) is int:
|
||||||
return # 1 is special cased in the code generator
|
return # 1 is special cased in the code generator
|
||||||
rom_floats = {
|
rom_floats = {
|
||||||
1: "c64.FL_FONE",
|
1: "c64.FL_FONE",
|
||||||
@ -276,24 +277,24 @@ class Parser:
|
|||||||
1.0 / math.log(2): "c64.FL_LOGEB2",
|
1.0 / math.log(2): "c64.FL_LOGEB2",
|
||||||
}
|
}
|
||||||
for fv, name in rom_floats.items():
|
for fv, name in rom_floats.items():
|
||||||
if math.isclose(stmt.howmuch, fv, rel_tol=0, abs_tol=1e-9):
|
if math.isclose(howmuch, fv, rel_tol=0, abs_tol=1e-9):
|
||||||
# use one of the constants available in ROM
|
# use one of the constants available in ROM
|
||||||
stmt.float_var_name = name
|
stmt.value.name = name
|
||||||
return
|
return
|
||||||
if stmt.howmuch in self._immediate_floats:
|
if howmuch in self._immediate_floats:
|
||||||
# reuse previously defined float constant
|
# reuse previously defined float constant
|
||||||
blockname, floatvar_name = self._immediate_floats[stmt.howmuch]
|
blockname, floatvar_name = self._immediate_floats[howmuch]
|
||||||
if blockname:
|
if blockname:
|
||||||
stmt.float_var_name = blockname + '.' + floatvar_name
|
stmt.value.name = blockname + '.' + floatvar_name
|
||||||
else:
|
else:
|
||||||
stmt.float_var_name = floatvar_name
|
stmt.value.name = floatvar_name
|
||||||
else:
|
else:
|
||||||
# define new float variable to hold the incr/decr value
|
# define new float variable to hold the incr/decr value
|
||||||
# note: not a constant, because we need the MFLT bytes
|
# note: not a constant, because we need the MFLT bytes
|
||||||
floatvar_name = "il65_float_{:d}".format(id(stmt))
|
floatvar_name = "il65_float_{:d}".format(id(stmt))
|
||||||
containing_block.symbols.define_variable(floatvar_name, stmt.sourceref, DataType.FLOAT, value=stmt.howmuch)
|
containing_block.symbols.define_variable(floatvar_name, stmt.sourceref, DataType.FLOAT, value=howmuch)
|
||||||
self._immediate_floats[stmt.howmuch] = (containing_block.name, floatvar_name)
|
self._immediate_floats[howmuch] = (containing_block.name, floatvar_name)
|
||||||
stmt.float_var_name = floatvar_name
|
stmt.value.name = floatvar_name
|
||||||
|
|
||||||
for block in self.result.blocks:
|
for block in self.result.blocks:
|
||||||
self.cur_block = block
|
self.cur_block = block
|
||||||
@ -826,9 +827,10 @@ class Parser:
|
|||||||
what = self.parse_expression(line[:-2].rstrip())
|
what = self.parse_expression(line[:-2].rstrip())
|
||||||
if isinstance(what, IntegerValue):
|
if isinstance(what, IntegerValue):
|
||||||
raise self.PError("cannot in/decrement a constant value")
|
raise self.PError("cannot in/decrement a constant value")
|
||||||
|
one_value = IntegerValue(1, self.sourceref)
|
||||||
if incr:
|
if incr:
|
||||||
return InplaceIncrStmt(what, 1, None, self.sourceref)
|
return InplaceIncrStmt(what, one_value, self.sourceref)
|
||||||
return InplaceDecrStmt(what, 1, None, self.sourceref)
|
return InplaceDecrStmt(what, one_value, self.sourceref)
|
||||||
else:
|
else:
|
||||||
# perhaps it is an augmented assignment statement
|
# perhaps it is an augmented assignment statement
|
||||||
match = re.fullmatch(r"(?P<left>\S+)\s*(?P<assignment>\+=|-=|\*=|/=|%=|//=|\*\*=|&=|\|=|\^=|>>=|<<=)\s*(?P<right>\S.*)", line)
|
match = re.fullmatch(r"(?P<left>\S+)\s*(?P<assignment>\+=|-=|\*=|/=|%=|//=|\*\*=|&=|\|=|\^=|>>=|<<=)\s*(?P<right>\S.*)", line)
|
||||||
@ -967,27 +969,24 @@ class Parser:
|
|||||||
if truncated:
|
if truncated:
|
||||||
r_value = IntegerValue(int(value), self.sourceref, datatype=l_value.datatype, name=r_value.name)
|
r_value = IntegerValue(int(value), self.sourceref, datatype=l_value.datatype, name=r_value.name)
|
||||||
if operator in ("+=", "-="):
|
if operator in ("+=", "-="):
|
||||||
# see if we can simplify this to inplace incr/decr statement
|
# see if we can simplify this to inplace incr/decr statement (only int/float constant values)
|
||||||
if r_value.constant:
|
if r_value.constant:
|
||||||
|
if not isinstance(r_value, (IntegerValue, FloatValue)):
|
||||||
|
raise self.PError("incr/decr requires constant int or float, not " + r_value.__class__.__name__)
|
||||||
if operator == "+=":
|
if operator == "+=":
|
||||||
if r_value.value > 0: # type: ignore
|
if r_value.value > 0:
|
||||||
return InplaceIncrStmt(l_value, r_value.value, None, self.sourceref)
|
return InplaceIncrStmt(l_value, r_value, self.sourceref)
|
||||||
elif r_value.value < 0: # type: ignore
|
elif r_value.value < 0:
|
||||||
return InplaceDecrStmt(l_value, -r_value.value, None, self.sourceref)
|
return InplaceDecrStmt(l_value, r_value.negative(), self.sourceref)
|
||||||
else:
|
else:
|
||||||
self.print_warning("incr with zero, ignored")
|
self.print_warning("incr with zero, ignored")
|
||||||
else:
|
else:
|
||||||
if r_value.value > 0: # type: ignore
|
if r_value.value > 0:
|
||||||
return InplaceDecrStmt(l_value, r_value.value, None, self.sourceref)
|
return InplaceDecrStmt(l_value, r_value, self.sourceref)
|
||||||
elif r_value.value < 0: # type: ignore
|
elif r_value.value < 0:
|
||||||
return InplaceIncrStmt(l_value, -r_value.value, None, self.sourceref)
|
return InplaceIncrStmt(l_value, r_value.negative(), self.sourceref)
|
||||||
else:
|
else:
|
||||||
self.print_warning("decr with zero, ignored")
|
self.print_warning("decr with zero, ignored")
|
||||||
else:
|
|
||||||
if r_value.name:
|
|
||||||
if operator == "+=":
|
|
||||||
return InplaceIncrStmt(l_value, None, r_value.name, self.sourceref)
|
|
||||||
return InplaceDecrStmt(l_value, None, r_value.name, self.sourceref)
|
|
||||||
return AugmentedAssignmentStmt(l_value, operator, r_value, self.sourceref)
|
return AugmentedAssignmentStmt(l_value, operator, r_value, self.sourceref)
|
||||||
|
|
||||||
def parse_return(self, line: str) -> ReturnStmt:
|
def parse_return(self, line: str) -> ReturnStmt:
|
||||||
@ -1404,7 +1403,9 @@ class Optimizer:
|
|||||||
# some symbols are used by the emitted assembly code from the code generator,
|
# some symbols are used by the emitted assembly code from the code generator,
|
||||||
# and should never be removed or the assembler will fail
|
# and should never be removed or the assembler will fail
|
||||||
# @todo make this dynamic
|
# @todo make this dynamic
|
||||||
never_remove = {"c64.GIVUAYF", "c64.FREADUY", "c64.FTOMEMXY", "c64.FADD", "c64.FSUB"}
|
never_remove = {"c64.FREADUY", "c64.FTOMEMXY", "c64.FADD", "c64.FSUB",
|
||||||
|
"c64flt.GIVUAYF", "c64flt.copy_mflt", "c64flt.float_add_one", "c64flt.float_sub_one",
|
||||||
|
"c64flt.float_add_SW1_to_XY", "c64flt.float_sub_SW1_from_XY"}
|
||||||
discarded = []
|
discarded = []
|
||||||
for sub in list(block.symbols.iter_subroutines()):
|
for sub in list(block.symbols.iter_subroutines()):
|
||||||
usages = self.parsed.subroutine_usage[(sub.blockname, sub.name)]
|
usages = self.parsed.subroutine_usage[(sub.blockname, sub.name)]
|
||||||
|
578
lib/c64lib.ill
578
lib/c64lib.ill
@ -115,17 +115,17 @@ sub MOVAF () -> (A?, X?) = $bc0c ; copy fac1 to fac2 (rounded)
|
|||||||
sub MOVEF () -> (A?, X?) = $bc0f ; copy fac1 to fac2
|
sub MOVEF () -> (A?, X?) = $bc0f ; copy fac1 to fac2
|
||||||
sub FTOMEMXY (mflpt: XY) -> (A?, Y?) = $bbd4 ; store fac1 to memory X/Y as 5-byte mflpt
|
sub FTOMEMXY (mflpt: XY) -> (A?, Y?) = $bbd4 ; store fac1 to memory X/Y as 5-byte mflpt
|
||||||
sub FTOSWORDYA () -> (Y, A, X?) = $b1aa ; fac1-> signed word in Y/A (might throw ILLEGAL QUANTITY)
|
sub FTOSWORDYA () -> (Y, A, X?) = $b1aa ; fac1-> signed word in Y/A (might throw ILLEGAL QUANTITY)
|
||||||
; use c64.FTOSWRDAY to get A/Y output (lo/hi switched to normal order)
|
; use c64flt.FTOSWRDAY to get A/Y output (lo/hi switched to normal order)
|
||||||
sub GETADR () -> (Y, A, X?) = $b7f7 ; fac1 -> unsigned word in Y/A (might throw ILLEGAL QUANTITY)
|
sub GETADR () -> (Y, A, X?) = $b7f7 ; fac1 -> unsigned word in Y/A (might throw ILLEGAL QUANTITY)
|
||||||
; (result also in $14/15) use c64.GETADRAY to get A/Y output (lo/hi switched to normal order)
|
; (result also in $14/15) use c64flt.GETADRAY to get A/Y output (lo/hi switched to normal order)
|
||||||
sub QINT () -> (?) = $bc9b ; fac1 -> 4-byte signed integer in 98-101 ($62-$65), with the MSB FIRST.
|
sub QINT () -> (?) = $bc9b ; fac1 -> 4-byte signed integer in 98-101 ($62-$65), with the MSB FIRST.
|
||||||
sub AYINT () -> (?) = $b1bf ; fac1-> signed word in 100-101 ($64-$65) MSB FIRST. (might throw ILLEGAL QUANTITY)
|
sub AYINT () -> (?) = $b1bf ; fac1-> signed word in 100-101 ($64-$65) MSB FIRST. (might throw ILLEGAL QUANTITY)
|
||||||
sub GIVAYF (lo: Y, hi: A) -> (?) = $b391 ; signed word in Y/A -> float in fac1
|
sub GIVAYF (lo: Y, hi: A) -> (?) = $b391 ; signed word in Y/A -> float in fac1
|
||||||
; use c64.GIVAYFAY to use A/Y input (lo/hi switched to normal order)
|
; use c64flt.GIVAYFAY to use A/Y input (lo/hi switched to normal order)
|
||||||
; there is also c64.GIVUAYF - unsigned word in A/Y (lo/hi) to fac1
|
; there is also c64flt.GIVUAYF - unsigned word in A/Y (lo/hi) to fac1
|
||||||
; there is also c64.FREADS32 that reads from 98-101 ($62-$65) MSB FIRST
|
; there is also c64flt.FREADS32 that reads from 98-101 ($62-$65) MSB FIRST
|
||||||
; there is also c64.FREADUS32 that reads from 98-101 ($62-$65) MSB FIRST
|
; there is also c64flt.FREADUS32 that reads from 98-101 ($62-$65) MSB FIRST
|
||||||
; there is also c64.FREADS24AXY that reads signed int24 into fac1 from A/X/Y (lo/mid/hi bytes)
|
; there is also c64flt.FREADS24AXY that reads signed int24 into fac1 from A/X/Y (lo/mid/hi bytes)
|
||||||
sub FREADUY (ubyte: Y) -> (?) = $b3a2 ; 8 bit unsigned Y -> float in fac1
|
sub FREADUY (ubyte: Y) -> (?) = $b3a2 ; 8 bit unsigned Y -> float in fac1
|
||||||
sub FREADSA (sbyte: A) -> (?) = $bc3c ; 8 bit signed A -> float in fac1
|
sub FREADSA (sbyte: A) -> (?) = $bc3c ; 8 bit signed A -> float in fac1
|
||||||
sub FREADSTR (len: A) -> (?) = $b7b5 ; str -> fac1, $22/23 must point to string, A=string length
|
sub FREADSTR (len: A) -> (?) = $b7b5 ; str -> fac1, $22/23 must point to string, A=string length
|
||||||
@ -259,6 +259,14 @@ sub init_system () -> (?) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} ; ------ end of block c64
|
||||||
|
|
||||||
|
|
||||||
|
~ c64flt {
|
||||||
|
; ---- this block contains C-64 floating point related functions ----
|
||||||
|
|
||||||
|
|
||||||
sub FREADS32 () -> (?) {
|
sub FREADS32 () -> (?) {
|
||||||
; ---- fac1 = signed int32 from $62-$65 big endian (MSB FIRST)
|
; ---- fac1 = signed int32 from $62-$65 big endian (MSB FIRST)
|
||||||
asm {
|
asm {
|
||||||
@ -342,7 +350,99 @@ sub GETADRAY () -> (AY, X?) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} ; ------ end of block c64
|
sub copy_mflt (source: XY) -> (A?, Y?) {
|
||||||
|
; ---- copy a 5 byte MFLT floating point variable to another place
|
||||||
|
; input: X/Y = source address, c64.SCRATCH_ZPWORD1 = destination address
|
||||||
|
asm {
|
||||||
|
stx c64.SCRATCH_ZP1
|
||||||
|
sty c64.SCRATCH_ZPWORD1+1
|
||||||
|
ldy #0
|
||||||
|
lda (c64.SCRATCH_ZP1),y
|
||||||
|
sta (c64.SCRATCH_ZPWORD1),y
|
||||||
|
iny
|
||||||
|
lda (c64.SCRATCH_ZP1),y
|
||||||
|
sta (c64.SCRATCH_ZPWORD1),y
|
||||||
|
iny
|
||||||
|
lda (c64.SCRATCH_ZP1),y
|
||||||
|
sta (c64.SCRATCH_ZPWORD1),y
|
||||||
|
iny
|
||||||
|
lda (c64.SCRATCH_ZP1),y
|
||||||
|
sta (c64.SCRATCH_ZPWORD1),y
|
||||||
|
iny
|
||||||
|
lda (c64.SCRATCH_ZP1),y
|
||||||
|
sta (c64.SCRATCH_ZPWORD1),y
|
||||||
|
ldy c64.SCRATCH_ZPWORD1+1
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub float_add_one (mflt: XY) -> (?) {
|
||||||
|
; ---- add 1 to the MFLT pointed to by X/Y. Clobbers A, X, Y
|
||||||
|
asm {
|
||||||
|
stx c64.SCRATCH_ZP1
|
||||||
|
sty c64.SCRATCH_ZP2
|
||||||
|
txa
|
||||||
|
jsr c64.MOVFM ; fac1 = float XY
|
||||||
|
lda #<c64.FL_FONE
|
||||||
|
ldy #>c64.FL_FONE
|
||||||
|
jsr c64.FADD ; fac1 += 1
|
||||||
|
ldx c64.SCRATCH_ZP1
|
||||||
|
ldy c64.SCRATCH_ZP2
|
||||||
|
jmp c64.FTOMEMXY ; float XY = fac1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub float_sub_one (mflt: XY) -> (?) {
|
||||||
|
; ---- subtract 1 from the MFLT pointed to by X/Y. Clobbers A, X, Y
|
||||||
|
asm {
|
||||||
|
stx c64.SCRATCH_ZP1
|
||||||
|
sty c64.SCRATCH_ZP2
|
||||||
|
lda #<c64.FL_FONE
|
||||||
|
ldy #>c64.FL_FONE
|
||||||
|
jsr c64.MOVFM ; fac1 = 1
|
||||||
|
txa
|
||||||
|
ldy c64.SCRATCH_ZP2
|
||||||
|
jsr c64.FSUB ; fac1 = float XY - 1
|
||||||
|
ldx c64.SCRATCH_ZP1
|
||||||
|
ldy c64.SCRATCH_ZP2
|
||||||
|
jmp c64.FTOMEMXY ; float XY = fac1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub float_add_SW1_to_XY (mflt: XY) -> (?) {
|
||||||
|
; ---- add MFLT pointed to by SCRATCH_ZPWORD1 to the MFLT pointed to by X/Y. Clobbers A, X, Y
|
||||||
|
asm {
|
||||||
|
stx c64.SCRATCH_ZP1
|
||||||
|
sty c64.SCRATCH_ZP2
|
||||||
|
txa
|
||||||
|
jsr c64.MOVFM ; fac1 = float XY
|
||||||
|
lda c64.SCRATCH_ZPWORD1
|
||||||
|
ldy c64.SCRATCH_ZPWORD1+1
|
||||||
|
jsr c64.FADD ; fac1 += SCRATCH_ZPWORD1
|
||||||
|
ldx c64.SCRATCH_ZP1
|
||||||
|
ldy c64.SCRATCH_ZP2
|
||||||
|
jmp c64.FTOMEMXY ; float XY = fac1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub float_sub_SW1_from_XY (mflt: XY) -> (?) {
|
||||||
|
; ---- subtract MFLT pointed to by SCRATCH_ZPWORD1 from the MFLT pointed to by X/Y. Clobbers A, X, Y
|
||||||
|
asm {
|
||||||
|
stx c64.SCRATCH_ZP1
|
||||||
|
sty c64.SCRATCH_ZP2
|
||||||
|
lda c64.SCRATCH_ZPWORD1
|
||||||
|
ldy c64.SCRATCH_ZPWORD1+1
|
||||||
|
jsr c64.MOVFM ; fac1 = SCRATCH_ZPWORD1
|
||||||
|
txa
|
||||||
|
ldy c64.SCRATCH_ZP2
|
||||||
|
jsr c64.FSUB ; fac1 = float XY - SCRATCH_ZPWORD1
|
||||||
|
ldx c64.SCRATCH_ZP1
|
||||||
|
ldy c64.SCRATCH_ZP2
|
||||||
|
jmp c64.FTOMEMXY ; float XY = fac1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} ; ------ end of block c64flt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -391,32 +491,10 @@ sub scroll_left_full (alsocolors: SC) -> (A?, X?, Y?) {
|
|||||||
ldx #0
|
ldx #0
|
||||||
ldy #38
|
ldy #38
|
||||||
-
|
-
|
||||||
lda c64.Colors + 40*0 + 1,x
|
.for row=0, row<=12, row+=1
|
||||||
sta c64.Colors + 40*0,x
|
lda c64.Colors + 40*row + 1,x
|
||||||
lda c64.Colors + 40*1 + 1,x
|
sta c64.Colors + 40*row,x
|
||||||
sta c64.Colors + 40*1,x
|
.next
|
||||||
lda c64.Colors + 40*2 + 1,x
|
|
||||||
sta c64.Colors + 40*2,x
|
|
||||||
lda c64.Colors + 40*3 + 1,x
|
|
||||||
sta c64.Colors + 40*3,x
|
|
||||||
lda c64.Colors + 40*4 + 1,x
|
|
||||||
sta c64.Colors + 40*4,x
|
|
||||||
lda c64.Colors + 40*5 + 1,x
|
|
||||||
sta c64.Colors + 40*5,x
|
|
||||||
lda c64.Colors + 40*6 + 1,x
|
|
||||||
sta c64.Colors + 40*6,x
|
|
||||||
lda c64.Colors + 40*7 + 1,x
|
|
||||||
sta c64.Colors + 40*7,x
|
|
||||||
lda c64.Colors + 40*8 + 1,x
|
|
||||||
sta c64.Colors + 40*8,x
|
|
||||||
lda c64.Colors + 40*9 + 1,x
|
|
||||||
sta c64.Colors + 40*9,x
|
|
||||||
lda c64.Colors + 40*10 + 1,x
|
|
||||||
sta c64.Colors + 40*10,x
|
|
||||||
lda c64.Colors + 40*11 + 1,x
|
|
||||||
sta c64.Colors + 40*11,x
|
|
||||||
lda c64.Colors + 40*12 + 1,x
|
|
||||||
sta c64.Colors + 40*12,x
|
|
||||||
inx
|
inx
|
||||||
dey
|
dey
|
||||||
bpl -
|
bpl -
|
||||||
@ -424,30 +502,10 @@ sub scroll_left_full (alsocolors: SC) -> (A?, X?, Y?) {
|
|||||||
ldx #0
|
ldx #0
|
||||||
ldy #38
|
ldy #38
|
||||||
-
|
-
|
||||||
lda c64.Colors + 40*13 + 1,x
|
.for row=13, row<=24, row+=1
|
||||||
sta c64.Colors + 40*13,x
|
lda c64.Colors + 40*row + 1,x
|
||||||
lda c64.Colors + 40*14 + 1,x
|
sta c64.Colors + 40*row,x
|
||||||
sta c64.Colors + 40*14,x
|
.next
|
||||||
lda c64.Colors + 40*15 + 1,x
|
|
||||||
sta c64.Colors + 40*15,x
|
|
||||||
lda c64.Colors + 40*16 + 1,x
|
|
||||||
sta c64.Colors + 40*16,x
|
|
||||||
lda c64.Colors + 40*17 + 1,x
|
|
||||||
sta c64.Colors + 40*17,x
|
|
||||||
lda c64.Colors + 40*18 + 1,x
|
|
||||||
sta c64.Colors + 40*18,x
|
|
||||||
lda c64.Colors + 40*19 + 1,x
|
|
||||||
sta c64.Colors + 40*19,x
|
|
||||||
lda c64.Colors + 40*20 + 1,x
|
|
||||||
sta c64.Colors + 40*20,x
|
|
||||||
lda c64.Colors + 40*21 + 1,x
|
|
||||||
sta c64.Colors + 40*21,x
|
|
||||||
lda c64.Colors + 40*22 + 1,x
|
|
||||||
sta c64.Colors + 40*22,x
|
|
||||||
lda c64.Colors + 40*23 + 1,x
|
|
||||||
sta c64.Colors + 40*23,x
|
|
||||||
lda c64.Colors + 40*24 + 1,x
|
|
||||||
sta c64.Colors + 40*24,x
|
|
||||||
inx
|
inx
|
||||||
dey
|
dey
|
||||||
bpl -
|
bpl -
|
||||||
@ -456,32 +514,10 @@ _scroll_screen
|
|||||||
ldx #0
|
ldx #0
|
||||||
ldy #38
|
ldy #38
|
||||||
-
|
-
|
||||||
lda c64.Screen + 40*0 + 1,x
|
.for row=0, row<=12, row+=1
|
||||||
sta c64.Screen + 40*0,x
|
lda c64.Screen + 40*row + 1,x
|
||||||
lda c64.Screen + 40*1 + 1,x
|
sta c64.Screen + 40*row,x
|
||||||
sta c64.Screen + 40*1,x
|
.next
|
||||||
lda c64.Screen + 40*2 + 1,x
|
|
||||||
sta c64.Screen + 40*2,x
|
|
||||||
lda c64.Screen + 40*3 + 1,x
|
|
||||||
sta c64.Screen + 40*3,x
|
|
||||||
lda c64.Screen + 40*4 + 1,x
|
|
||||||
sta c64.Screen + 40*4,x
|
|
||||||
lda c64.Screen + 40*5 + 1,x
|
|
||||||
sta c64.Screen + 40*5,x
|
|
||||||
lda c64.Screen + 40*6 + 1,x
|
|
||||||
sta c64.Screen + 40*6,x
|
|
||||||
lda c64.Screen + 40*7 + 1,x
|
|
||||||
sta c64.Screen + 40*7,x
|
|
||||||
lda c64.Screen + 40*8 + 1,x
|
|
||||||
sta c64.Screen + 40*8,x
|
|
||||||
lda c64.Screen + 40*9 + 1,x
|
|
||||||
sta c64.Screen + 40*9,x
|
|
||||||
lda c64.Screen + 40*10 + 1,x
|
|
||||||
sta c64.Screen + 40*10,x
|
|
||||||
lda c64.Screen + 40*11 + 1,x
|
|
||||||
sta c64.Screen + 40*11,x
|
|
||||||
lda c64.Screen + 40*12 + 1,x
|
|
||||||
sta c64.Screen + 40*12,x
|
|
||||||
inx
|
inx
|
||||||
dey
|
dey
|
||||||
bpl -
|
bpl -
|
||||||
@ -489,33 +525,14 @@ _scroll_screen
|
|||||||
ldx #0
|
ldx #0
|
||||||
ldy #38
|
ldy #38
|
||||||
-
|
-
|
||||||
lda c64.Screen + 40*13 + 1,x
|
.for row=13, row<=24, row+=1
|
||||||
sta c64.Screen + 40*13,x
|
lda c64.Screen + 40*row + 1,x
|
||||||
lda c64.Screen + 40*14 + 1,x
|
sta c64.Screen + 40*row,x
|
||||||
sta c64.Screen + 40*14,x
|
.next
|
||||||
lda c64.Screen + 40*15 + 1,x
|
|
||||||
sta c64.Screen + 40*15,x
|
|
||||||
lda c64.Screen + 40*16 + 1,x
|
|
||||||
sta c64.Screen + 40*16,x
|
|
||||||
lda c64.Screen + 40*17 + 1,x
|
|
||||||
sta c64.Screen + 40*17,x
|
|
||||||
lda c64.Screen + 40*18 + 1,x
|
|
||||||
sta c64.Screen + 40*18,x
|
|
||||||
lda c64.Screen + 40*19 + 1,x
|
|
||||||
sta c64.Screen + 40*19,x
|
|
||||||
lda c64.Screen + 40*20 + 1,x
|
|
||||||
sta c64.Screen + 40*20,x
|
|
||||||
lda c64.Screen + 40*21 + 1,x
|
|
||||||
sta c64.Screen + 40*21,x
|
|
||||||
lda c64.Screen + 40*22 + 1,x
|
|
||||||
sta c64.Screen + 40*22,x
|
|
||||||
lda c64.Screen + 40*23 + 1,x
|
|
||||||
sta c64.Screen + 40*23,x
|
|
||||||
lda c64.Screen + 40*24 + 1,x
|
|
||||||
sta c64.Screen + 40*24,x
|
|
||||||
inx
|
inx
|
||||||
dey
|
dey
|
||||||
bpl -
|
bpl -
|
||||||
|
|
||||||
rts
|
rts
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -532,124 +549,41 @@ sub scroll_right_full (alsocolors: SC) -> (A?, X?) {
|
|||||||
+
|
+
|
||||||
ldx #38
|
ldx #38
|
||||||
-
|
-
|
||||||
lda c64.Colors + 40*0,x
|
.for row=0, row<=12, row+=1
|
||||||
sta c64.Colors + 40*0 + 1,x
|
lda c64.Colors + 40*row + 0,x
|
||||||
lda c64.Colors + 40*1,x
|
sta c64.Colors + 40*row + 1,x
|
||||||
sta c64.Colors + 40*1 + 1,x
|
.next
|
||||||
lda c64.Colors + 40*2,x
|
|
||||||
sta c64.Colors + 40*2 + 1,x
|
|
||||||
lda c64.Colors + 40*3,x
|
|
||||||
sta c64.Colors + 40*3 + 1,x
|
|
||||||
lda c64.Colors + 40*4,x
|
|
||||||
sta c64.Colors + 40*4 + 1,x
|
|
||||||
lda c64.Colors + 40*5,x
|
|
||||||
sta c64.Colors + 40*5 + 1,x
|
|
||||||
lda c64.Colors + 40*6,x
|
|
||||||
sta c64.Colors + 40*6 + 1,x
|
|
||||||
lda c64.Colors + 40*7,x
|
|
||||||
sta c64.Colors + 40*7 + 1,x
|
|
||||||
lda c64.Colors + 40*8,x
|
|
||||||
sta c64.Colors + 40*8 + 1,x
|
|
||||||
lda c64.Colors + 40*9,x
|
|
||||||
sta c64.Colors + 40*9 + 1,x
|
|
||||||
lda c64.Colors + 40*10,x
|
|
||||||
sta c64.Colors + 40*10 + 1,x
|
|
||||||
lda c64.Colors + 40*11,x
|
|
||||||
sta c64.Colors + 40*11 + 1,x
|
|
||||||
lda c64.Colors + 40*12,x
|
|
||||||
sta c64.Colors + 40*12 + 1,x
|
|
||||||
dex
|
dex
|
||||||
bpl -
|
bpl -
|
||||||
|
|
||||||
ldx #38
|
ldx #38
|
||||||
-
|
-
|
||||||
lda c64.Colors + 40*13,x
|
.for row=13, row<=24, row+=1
|
||||||
sta c64.Colors + 40*13 + 1,x
|
lda c64.Colors + 40*row,x
|
||||||
lda c64.Colors + 40*14,x
|
sta c64.Colors + 40*row + 1,x
|
||||||
sta c64.Colors + 40*14 + 1,x
|
.next
|
||||||
lda c64.Colors + 40*15,x
|
|
||||||
sta c64.Colors + 40*15 + 1,x
|
|
||||||
lda c64.Colors + 40*16,x
|
|
||||||
sta c64.Colors + 40*16 + 1,x
|
|
||||||
lda c64.Colors + 40*17,x
|
|
||||||
sta c64.Colors + 40*17 + 1,x
|
|
||||||
lda c64.Colors + 40*18,x
|
|
||||||
sta c64.Colors + 40*18 + 1,x
|
|
||||||
lda c64.Colors + 40*19,x
|
|
||||||
sta c64.Colors + 40*19 + 1,x
|
|
||||||
lda c64.Colors + 40*20,x
|
|
||||||
sta c64.Colors + 40*20 + 1,x
|
|
||||||
lda c64.Colors + 40*21,x
|
|
||||||
sta c64.Colors + 40*21 + 1,x
|
|
||||||
lda c64.Colors + 40*22,x
|
|
||||||
sta c64.Colors + 40*22 + 1,x
|
|
||||||
lda c64.Colors + 40*23,x
|
|
||||||
sta c64.Colors + 40*23 + 1,x
|
|
||||||
lda c64.Colors + 40*24,x
|
|
||||||
sta c64.Colors + 40*24 + 1,x
|
|
||||||
dex
|
dex
|
||||||
bpl -
|
bpl -
|
||||||
|
|
||||||
_scroll_screen
|
_scroll_screen
|
||||||
ldx #38
|
ldx #38
|
||||||
-
|
-
|
||||||
lda c64.Screen + 40*0,x
|
.for row=0, row<=12, row+=1
|
||||||
sta c64.Screen + 40*0 + 1,x
|
lda c64.Screen + 40*row + 0,x
|
||||||
lda c64.Screen + 40*1,x
|
sta c64.Screen + 40*row + 1,x
|
||||||
sta c64.Screen + 40*1 + 1,x
|
.next
|
||||||
lda c64.Screen + 40*2,x
|
|
||||||
sta c64.Screen + 40*2 + 1,x
|
|
||||||
lda c64.Screen + 40*3,x
|
|
||||||
sta c64.Screen + 40*3 + 1,x
|
|
||||||
lda c64.Screen + 40*4,x
|
|
||||||
sta c64.Screen + 40*4 + 1,x
|
|
||||||
lda c64.Screen + 40*5,x
|
|
||||||
sta c64.Screen + 40*5 + 1,x
|
|
||||||
lda c64.Screen + 40*6,x
|
|
||||||
sta c64.Screen + 40*6 + 1,x
|
|
||||||
lda c64.Screen + 40*7,x
|
|
||||||
sta c64.Screen + 40*7 + 1,x
|
|
||||||
lda c64.Screen + 40*8,x
|
|
||||||
sta c64.Screen + 40*8 + 1,x
|
|
||||||
lda c64.Screen + 40*9,x
|
|
||||||
sta c64.Screen + 40*9 + 1,x
|
|
||||||
lda c64.Screen + 40*10,x
|
|
||||||
sta c64.Screen + 40*10 + 1,x
|
|
||||||
lda c64.Screen + 40*11,x
|
|
||||||
sta c64.Screen + 40*11 + 1,x
|
|
||||||
lda c64.Screen + 40*12,x
|
|
||||||
sta c64.Screen + 40*12 + 1,x
|
|
||||||
dex
|
dex
|
||||||
bpl -
|
bpl -
|
||||||
|
|
||||||
ldx #38
|
ldx #38
|
||||||
-
|
-
|
||||||
lda c64.Screen + 40*13,x
|
.for row=13, row<=24, row+=1
|
||||||
sta c64.Screen + 40*13 + 1,x
|
lda c64.Screen + 40*row,x
|
||||||
lda c64.Screen + 40*14,x
|
sta c64.Screen + 40*row + 1,x
|
||||||
sta c64.Screen + 40*14 + 1,x
|
.next
|
||||||
lda c64.Screen + 40*15,x
|
|
||||||
sta c64.Screen + 40*15 + 1,x
|
|
||||||
lda c64.Screen + 40*16,x
|
|
||||||
sta c64.Screen + 40*16 + 1,x
|
|
||||||
lda c64.Screen + 40*17,x
|
|
||||||
sta c64.Screen + 40*17 + 1,x
|
|
||||||
lda c64.Screen + 40*18,x
|
|
||||||
sta c64.Screen + 40*18 + 1,x
|
|
||||||
lda c64.Screen + 40*19,x
|
|
||||||
sta c64.Screen + 40*19 + 1,x
|
|
||||||
lda c64.Screen + 40*20,x
|
|
||||||
sta c64.Screen + 40*20 + 1,x
|
|
||||||
lda c64.Screen + 40*21,x
|
|
||||||
sta c64.Screen + 40*21 + 1,x
|
|
||||||
lda c64.Screen + 40*22,x
|
|
||||||
sta c64.Screen + 40*22 + 1,x
|
|
||||||
lda c64.Screen + 40*23,x
|
|
||||||
sta c64.Screen + 40*23 + 1,x
|
|
||||||
lda c64.Screen + 40*24,x
|
|
||||||
sta c64.Screen + 40*24 + 1,x
|
|
||||||
dex
|
dex
|
||||||
bpl -
|
bpl -
|
||||||
|
|
||||||
rts
|
rts
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -666,118 +600,38 @@ sub scroll_up_full (alsocolors: SC) -> (A?, X?) {
|
|||||||
+
|
+
|
||||||
ldx #39
|
ldx #39
|
||||||
-
|
-
|
||||||
lda c64.Colors + 40*1,x
|
.for row=1, row<=11, row+=1
|
||||||
sta c64.Colors + 40*0,x
|
lda c64.Colors + 40*row,x
|
||||||
lda c64.Colors + 40*2,x
|
sta c64.Colors + 40*(row-1),x
|
||||||
sta c64.Colors + 40*1,x
|
.next
|
||||||
lda c64.Colors + 40*3,x
|
|
||||||
sta c64.Colors + 40*2,x
|
|
||||||
lda c64.Colors + 40*4,x
|
|
||||||
sta c64.Colors + 40*3,x
|
|
||||||
lda c64.Colors + 40*5,x
|
|
||||||
sta c64.Colors + 40*4,x
|
|
||||||
lda c64.Colors + 40*6,x
|
|
||||||
sta c64.Colors + 40*5,x
|
|
||||||
lda c64.Colors + 40*7,x
|
|
||||||
sta c64.Colors + 40*6,x
|
|
||||||
lda c64.Colors + 40*8,x
|
|
||||||
sta c64.Colors + 40*7,x
|
|
||||||
lda c64.Colors + 40*9,x
|
|
||||||
sta c64.Colors + 40*8,x
|
|
||||||
lda c64.Colors + 40*10,x
|
|
||||||
sta c64.Colors + 40*9,x
|
|
||||||
lda c64.Colors + 40*11,x
|
|
||||||
sta c64.Colors + 40*10,x
|
|
||||||
lda c64.Colors + 40*12,x
|
|
||||||
sta c64.Colors + 40*11,x
|
|
||||||
dex
|
dex
|
||||||
bpl -
|
bpl -
|
||||||
|
|
||||||
ldx #39
|
ldx #39
|
||||||
-
|
-
|
||||||
lda c64.Colors + 40*13,x
|
.for row=12, row<=24, row+=1
|
||||||
sta c64.Colors + 40*12,x
|
lda c64.Colors + 40*row,x
|
||||||
lda c64.Colors + 40*14,x
|
sta c64.Colors + 40*(row-1),x
|
||||||
sta c64.Colors + 40*13,x
|
.next
|
||||||
lda c64.Colors + 40*15,x
|
|
||||||
sta c64.Colors + 40*14,x
|
|
||||||
lda c64.Colors + 40*16,x
|
|
||||||
sta c64.Colors + 40*15,x
|
|
||||||
lda c64.Colors + 40*17,x
|
|
||||||
sta c64.Colors + 40*16,x
|
|
||||||
lda c64.Colors + 40*18,x
|
|
||||||
sta c64.Colors + 40*17,x
|
|
||||||
lda c64.Colors + 40*19,x
|
|
||||||
sta c64.Colors + 40*18,x
|
|
||||||
lda c64.Colors + 40*20,x
|
|
||||||
sta c64.Colors + 40*19,x
|
|
||||||
lda c64.Colors + 40*21,x
|
|
||||||
sta c64.Colors + 40*20,x
|
|
||||||
lda c64.Colors + 40*22,x
|
|
||||||
sta c64.Colors + 40*21,x
|
|
||||||
lda c64.Colors + 40*23,x
|
|
||||||
sta c64.Colors + 40*22,x
|
|
||||||
lda c64.Colors + 40*24,x
|
|
||||||
sta c64.Colors + 40*23,x
|
|
||||||
dex
|
dex
|
||||||
bpl -
|
bpl -
|
||||||
|
|
||||||
_scroll_screen
|
_scroll_screen
|
||||||
ldx #39
|
ldx #39
|
||||||
-
|
-
|
||||||
lda c64.Screen + 40*1,x
|
.for row=1, row<=11, row+=1
|
||||||
sta c64.Screen + 40*0,x
|
lda c64.Screen + 40*row,x
|
||||||
lda c64.Screen + 40*2,x
|
sta c64.Screen + 40*(row-1),x
|
||||||
sta c64.Screen + 40*1,x
|
.next
|
||||||
lda c64.Screen + 40*3,x
|
|
||||||
sta c64.Screen + 40*2,x
|
|
||||||
lda c64.Screen + 40*4,x
|
|
||||||
sta c64.Screen + 40*3,x
|
|
||||||
lda c64.Screen + 40*5,x
|
|
||||||
sta c64.Screen + 40*4,x
|
|
||||||
lda c64.Screen + 40*6,x
|
|
||||||
sta c64.Screen + 40*5,x
|
|
||||||
lda c64.Screen + 40*7,x
|
|
||||||
sta c64.Screen + 40*6,x
|
|
||||||
lda c64.Screen + 40*8,x
|
|
||||||
sta c64.Screen + 40*7,x
|
|
||||||
lda c64.Screen + 40*9,x
|
|
||||||
sta c64.Screen + 40*8,x
|
|
||||||
lda c64.Screen + 40*10,x
|
|
||||||
sta c64.Screen + 40*9,x
|
|
||||||
lda c64.Screen + 40*11,x
|
|
||||||
sta c64.Screen + 40*10,x
|
|
||||||
lda c64.Screen + 40*12,x
|
|
||||||
sta c64.Screen + 40*11,x
|
|
||||||
dex
|
dex
|
||||||
bpl -
|
bpl -
|
||||||
|
|
||||||
ldx #39
|
ldx #39
|
||||||
-
|
-
|
||||||
lda c64.Screen + 40*13,x
|
.for row=12, row<=24, row+=1
|
||||||
sta c64.Screen + 40*12,x
|
lda c64.Screen + 40*row,x
|
||||||
lda c64.Screen + 40*14,x
|
sta c64.Screen + 40*(row-1),x
|
||||||
sta c64.Screen + 40*13,x
|
.next
|
||||||
lda c64.Screen + 40*15,x
|
|
||||||
sta c64.Screen + 40*14,x
|
|
||||||
lda c64.Screen + 40*16,x
|
|
||||||
sta c64.Screen + 40*15,x
|
|
||||||
lda c64.Screen + 40*17,x
|
|
||||||
sta c64.Screen + 40*16,x
|
|
||||||
lda c64.Screen + 40*18,x
|
|
||||||
sta c64.Screen + 40*17,x
|
|
||||||
lda c64.Screen + 40*19,x
|
|
||||||
sta c64.Screen + 40*18,x
|
|
||||||
lda c64.Screen + 40*20,x
|
|
||||||
sta c64.Screen + 40*19,x
|
|
||||||
lda c64.Screen + 40*21,x
|
|
||||||
sta c64.Screen + 40*20,x
|
|
||||||
lda c64.Screen + 40*22,x
|
|
||||||
sta c64.Screen + 40*21,x
|
|
||||||
lda c64.Screen + 40*23,x
|
|
||||||
sta c64.Screen + 40*22,x
|
|
||||||
lda c64.Screen + 40*24,x
|
|
||||||
sta c64.Screen + 40*23,x
|
|
||||||
dex
|
dex
|
||||||
bpl -
|
bpl -
|
||||||
|
|
||||||
@ -797,122 +651,38 @@ sub scroll_down_full (alsocolors: SC) -> (A?, X?) {
|
|||||||
+
|
+
|
||||||
ldx #39
|
ldx #39
|
||||||
-
|
-
|
||||||
lda c64.Colors + 40*23,x
|
.for row=23, row>=12, row-=1
|
||||||
sta c64.Colors + 40*24,x
|
lda c64.Colors + 40*row,x
|
||||||
lda c64.Colors + 40*22,x
|
sta c64.Colors + 40*(row+1),x
|
||||||
sta c64.Colors + 40*23,x
|
.next
|
||||||
lda c64.Colors + 40*21,x
|
|
||||||
sta c64.Colors + 40*22,x
|
|
||||||
lda c64.Colors + 40*20,x
|
|
||||||
sta c64.Colors + 40*21,x
|
|
||||||
lda c64.Colors + 40*19,x
|
|
||||||
sta c64.Colors + 40*20,x
|
|
||||||
lda c64.Colors + 40*18,x
|
|
||||||
sta c64.Colors + 40*19,x
|
|
||||||
lda c64.Colors + 40*17,x
|
|
||||||
sta c64.Colors + 40*18,x
|
|
||||||
lda c64.Colors + 40*16,x
|
|
||||||
sta c64.Colors + 40*17,x
|
|
||||||
lda c64.Colors + 40*15,x
|
|
||||||
sta c64.Colors + 40*16,x
|
|
||||||
lda c64.Colors + 40*14,x
|
|
||||||
sta c64.Colors + 40*15,x
|
|
||||||
lda c64.Colors + 40*13,x
|
|
||||||
sta c64.Colors + 40*14,x
|
|
||||||
lda c64.Colors + 40*12,x
|
|
||||||
sta c64.Colors + 40*13,x
|
|
||||||
|
|
||||||
dex
|
dex
|
||||||
bpl -
|
bpl -
|
||||||
|
|
||||||
ldx #39
|
ldx #39
|
||||||
-
|
-
|
||||||
lda c64.Colors + 40*11,x
|
.for row=11, row>=0, row-=1
|
||||||
sta c64.Colors + 40*12,x
|
lda c64.Colors + 40*row,x
|
||||||
lda c64.Colors + 40*10,x
|
sta c64.Colors + 40*(row+1),x
|
||||||
sta c64.Colors + 40*11,x
|
.next
|
||||||
lda c64.Colors + 40*9,x
|
|
||||||
sta c64.Colors + 40*10,x
|
|
||||||
lda c64.Colors + 40*8,x
|
|
||||||
sta c64.Colors + 40*9,x
|
|
||||||
lda c64.Colors + 40*7,x
|
|
||||||
sta c64.Colors + 40*8,x
|
|
||||||
lda c64.Colors + 40*6,x
|
|
||||||
sta c64.Colors + 40*7,x
|
|
||||||
lda c64.Colors + 40*5,x
|
|
||||||
sta c64.Colors + 40*6,x
|
|
||||||
lda c64.Colors + 40*4,x
|
|
||||||
sta c64.Colors + 40*5,x
|
|
||||||
lda c64.Colors + 40*3,x
|
|
||||||
sta c64.Colors + 40*4,x
|
|
||||||
lda c64.Colors + 40*2,x
|
|
||||||
sta c64.Colors + 40*3,x
|
|
||||||
lda c64.Colors + 40*1,x
|
|
||||||
sta c64.Colors + 40*2,x
|
|
||||||
lda c64.Colors + 40*0,x
|
|
||||||
sta c64.Colors + 40*1,x
|
|
||||||
|
|
||||||
dex
|
dex
|
||||||
bpl -
|
bpl -
|
||||||
|
|
||||||
_scroll_screen
|
_scroll_screen
|
||||||
ldx #39
|
ldx #39
|
||||||
-
|
-
|
||||||
lda c64.Screen + 40*23,x
|
.for row=23, row>=12, row-=1
|
||||||
sta c64.Screen + 40*24,x
|
lda c64.Screen + 40*row,x
|
||||||
lda c64.Screen + 40*22,x
|
sta c64.Screen + 40*(row+1),x
|
||||||
sta c64.Screen + 40*23,x
|
.next
|
||||||
lda c64.Screen + 40*21,x
|
|
||||||
sta c64.Screen + 40*22,x
|
|
||||||
lda c64.Screen + 40*20,x
|
|
||||||
sta c64.Screen + 40*21,x
|
|
||||||
lda c64.Screen + 40*19,x
|
|
||||||
sta c64.Screen + 40*20,x
|
|
||||||
lda c64.Screen + 40*18,x
|
|
||||||
sta c64.Screen + 40*19,x
|
|
||||||
lda c64.Screen + 40*17,x
|
|
||||||
sta c64.Screen + 40*18,x
|
|
||||||
lda c64.Screen + 40*16,x
|
|
||||||
sta c64.Screen + 40*17,x
|
|
||||||
lda c64.Screen + 40*15,x
|
|
||||||
sta c64.Screen + 40*16,x
|
|
||||||
lda c64.Screen + 40*14,x
|
|
||||||
sta c64.Screen + 40*15,x
|
|
||||||
lda c64.Screen + 40*13,x
|
|
||||||
sta c64.Screen + 40*14,x
|
|
||||||
lda c64.Screen + 40*12,x
|
|
||||||
sta c64.Screen + 40*13,x
|
|
||||||
|
|
||||||
dex
|
dex
|
||||||
bpl -
|
bpl -
|
||||||
|
|
||||||
ldx #39
|
ldx #39
|
||||||
-
|
-
|
||||||
lda c64.Screen + 40*11,x
|
.for row=11, row>=0, row-=1
|
||||||
sta c64.Screen + 40*12,x
|
lda c64.Screen + 40*row,x
|
||||||
lda c64.Screen + 40*10,x
|
sta c64.Screen + 40*(row+1),x
|
||||||
sta c64.Screen + 40*11,x
|
.next
|
||||||
lda c64.Screen + 40*9,x
|
|
||||||
sta c64.Screen + 40*10,x
|
|
||||||
lda c64.Screen + 40*8,x
|
|
||||||
sta c64.Screen + 40*9,x
|
|
||||||
lda c64.Screen + 40*7,x
|
|
||||||
sta c64.Screen + 40*8,x
|
|
||||||
lda c64.Screen + 40*6,x
|
|
||||||
sta c64.Screen + 40*7,x
|
|
||||||
lda c64.Screen + 40*5,x
|
|
||||||
sta c64.Screen + 40*6,x
|
|
||||||
lda c64.Screen + 40*4,x
|
|
||||||
sta c64.Screen + 40*5,x
|
|
||||||
lda c64.Screen + 40*3,x
|
|
||||||
sta c64.Screen + 40*4,x
|
|
||||||
lda c64.Screen + 40*2,x
|
|
||||||
sta c64.Screen + 40*3,x
|
|
||||||
lda c64.Screen + 40*1,x
|
|
||||||
sta c64.Screen + 40*2,x
|
|
||||||
lda c64.Screen + 40*0,x
|
|
||||||
sta c64.Screen + 40*1,x
|
|
||||||
|
|
||||||
dex
|
dex
|
||||||
bpl -
|
bpl -
|
||||||
|
|
||||||
|
@ -95,89 +95,4 @@ jsr_indirect_XY
|
|||||||
jmp (SCRATCH_ZP1)
|
jmp (SCRATCH_ZP1)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
asm {
|
|
||||||
|
|
||||||
; ---- copy a 5 byte MFLT floating point variable to another place
|
|
||||||
; input: X/Y = source address, SCRATCH_ZPWORD1 = destination address
|
|
||||||
copy_mflt stx SCRATCH_ZP1
|
|
||||||
sty SCRATCH_ZPWORD1+1
|
|
||||||
ldy #0
|
|
||||||
lda (SCRATCH_ZP1),y
|
|
||||||
sta (SCRATCH_ZPWORD1),y
|
|
||||||
iny
|
|
||||||
lda (SCRATCH_ZP1),y
|
|
||||||
sta (SCRATCH_ZPWORD1),y
|
|
||||||
iny
|
|
||||||
lda (SCRATCH_ZP1),y
|
|
||||||
sta (SCRATCH_ZPWORD1),y
|
|
||||||
iny
|
|
||||||
lda (SCRATCH_ZP1),y
|
|
||||||
sta (SCRATCH_ZPWORD1),y
|
|
||||||
iny
|
|
||||||
lda (SCRATCH_ZP1),y
|
|
||||||
sta (SCRATCH_ZPWORD1),y
|
|
||||||
ldy SCRATCH_ZPWORD1+1
|
|
||||||
rts
|
|
||||||
}
|
|
||||||
|
|
||||||
asm {
|
|
||||||
|
|
||||||
; ---- add 1 to the MFLT pointed to by X/Y. Clobbers A, X, Y
|
|
||||||
float_add_one
|
|
||||||
stx SCRATCH_ZP1
|
|
||||||
sty SCRATCH_ZP2
|
|
||||||
txa
|
|
||||||
jsr c64.MOVFM ; fac1 = float XY
|
|
||||||
lda #<c64.FL_FONE
|
|
||||||
ldy #>c64.FL_FONE
|
|
||||||
jsr c64.FADD ; fac1 += 1
|
|
||||||
ldx SCRATCH_ZP1
|
|
||||||
ldy SCRATCH_ZP2
|
|
||||||
jmp c64.FTOMEMXY ; float XY = fac1
|
|
||||||
|
|
||||||
; ---- subtract 1 from the MFLT pointed to by X/Y. Clobbers A, X, Y
|
|
||||||
float_sub_one
|
|
||||||
stx SCRATCH_ZP1
|
|
||||||
sty SCRATCH_ZP2
|
|
||||||
lda #<c64.FL_FONE
|
|
||||||
ldy #>c64.FL_FONE
|
|
||||||
jsr c64.MOVFM ; fac1 = 1
|
|
||||||
txa
|
|
||||||
ldy SCRATCH_ZP2
|
|
||||||
jsr c64.FSUB ; fac1 = float XY - 1
|
|
||||||
ldx SCRATCH_ZP1
|
|
||||||
ldy SCRATCH_ZP2
|
|
||||||
jmp c64.FTOMEMXY ; float XY = fac1
|
|
||||||
|
|
||||||
|
|
||||||
; ---- add MFLT pointed to by SCRATCH_ZPWORD1 to the MFLT pointed to by X/Y. Clobbers A, X, Y
|
|
||||||
float_add_SW1_to_XY
|
|
||||||
stx SCRATCH_ZP1
|
|
||||||
sty SCRATCH_ZP2
|
|
||||||
txa
|
|
||||||
jsr c64.MOVFM ; fac1 = float XY
|
|
||||||
lda SCRATCH_ZPWORD1
|
|
||||||
ldy SCRATCH_ZPWORD1+1
|
|
||||||
jsr c64.FADD ; fac1 += SCRATCH_ZPWORD1
|
|
||||||
ldx SCRATCH_ZP1
|
|
||||||
ldy SCRATCH_ZP2
|
|
||||||
jmp c64.FTOMEMXY ; float XY = fac1
|
|
||||||
|
|
||||||
|
|
||||||
; ---- subtract MFLT pointed to by SCRATCH_ZPWORD1 from the MFLT pointed to by X/Y. Clobbers A, X, Y
|
|
||||||
float_sub_SW1_from_XY
|
|
||||||
stx SCRATCH_ZP1
|
|
||||||
sty SCRATCH_ZP2
|
|
||||||
lda SCRATCH_ZPWORD1
|
|
||||||
ldy SCRATCH_ZPWORD1+1
|
|
||||||
jsr c64.MOVFM ; fac1 = SCRATCH_ZPWORD1
|
|
||||||
txa
|
|
||||||
ldy SCRATCH_ZP2
|
|
||||||
jsr c64.FSUB ; fac1 = float XY - SCRATCH_ZPWORD1
|
|
||||||
ldx SCRATCH_ZP1
|
|
||||||
ldy SCRATCH_ZP2
|
|
||||||
jmp c64.FTOMEMXY ; float XY = fac1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -59,6 +59,15 @@ start
|
|||||||
some_address = 4123.2342342222
|
some_address = 4123.2342342222
|
||||||
[$c000.word] = # flt_pi
|
[$c000.word] = # flt_pi
|
||||||
|
|
||||||
|
my_float ++
|
||||||
|
my_float += 1
|
||||||
|
my_float += 0.5
|
||||||
|
my_float += 999.222
|
||||||
|
my_float --
|
||||||
|
my_float -= 1
|
||||||
|
my_float -= 0.5
|
||||||
|
my_float -= 999.222
|
||||||
|
|
||||||
; print some floating points from source and compare them with ROM
|
; print some floating points from source and compare them with ROM
|
||||||
|
|
||||||
printflt(#flt_pi)
|
printflt(#flt_pi)
|
||||||
|
@ -15,8 +15,6 @@ import "c64lib"
|
|||||||
start
|
start
|
||||||
c64.init_system()
|
c64.init_system()
|
||||||
|
|
||||||
c64.VMCSB += 2
|
|
||||||
c64.VMCSB *= 2
|
|
||||||
A = c64.VMCSB
|
A = c64.VMCSB
|
||||||
A |= 2 ; @todo c64.VMCSB |= 2
|
A |= 2 ; @todo c64.VMCSB |= 2
|
||||||
c64.VMCSB = A
|
c64.VMCSB = A
|
||||||
@ -37,7 +35,7 @@ start
|
|||||||
c64.MUL10()
|
c64.MUL10()
|
||||||
c64.FADDH()
|
c64.FADDH()
|
||||||
c64.FADDH()
|
c64.FADDH()
|
||||||
AY = c64.GETADRAY()
|
AY = c64flt.GETADRAY()
|
||||||
secretnumber = A
|
secretnumber = A
|
||||||
|
|
||||||
c64scr.print_string("I am thinking of a number from 1 to 100!You'll have to guess it!\n")
|
c64scr.print_string("I am thinking of a number from 1 to 100!You'll have to guess it!\n")
|
||||||
@ -58,7 +56,7 @@ ask_guess
|
|||||||
c64.CHROUT('\n')
|
c64.CHROUT('\n')
|
||||||
[$22.word] = guess
|
[$22.word] = guess
|
||||||
c64.FREADSTR(A)
|
c64.FREADSTR(A)
|
||||||
AY = c64.GETADRAY()
|
AY = c64flt.GETADRAY()
|
||||||
A -= secretnumber ; @todo condition so we can do if guess > secretnumber....
|
A -= secretnumber ; @todo condition so we can do if guess > secretnumber....
|
||||||
if_zero goto correct_guess
|
if_zero goto correct_guess
|
||||||
if_gt goto too_high
|
if_gt goto too_high
|
||||||
|
11
todo.ill
11
todo.ill
@ -5,7 +5,16 @@ output prg,basic
|
|||||||
import "c64lib"
|
import "c64lib"
|
||||||
|
|
||||||
~ main {
|
~ main {
|
||||||
|
const num = 44
|
||||||
|
var var1 =22
|
||||||
|
var .word wvar1 = 22
|
||||||
start
|
start
|
||||||
|
var1 ++
|
||||||
|
var1 += num
|
||||||
|
X++
|
||||||
|
X+=num
|
||||||
|
|
||||||
|
|
||||||
asm {
|
asm {
|
||||||
ldy #200
|
ldy #200
|
||||||
- lda #81
|
- lda #81
|
||||||
@ -42,7 +51,7 @@ start
|
|||||||
loop
|
loop
|
||||||
A=c64.GETIN()
|
A=c64.GETIN()
|
||||||
if_not goto loop
|
if_not goto loop
|
||||||
c64scr.scroll_down_full(1)
|
c64scr.scroll_right_full(1)
|
||||||
goto loop
|
goto loop
|
||||||
c64.CHROUT(A)
|
c64.CHROUT(A)
|
||||||
goto loop
|
goto loop
|
||||||
|
Loading…
Reference in New Issue
Block a user