mirror of
https://github.com/irmen/prog8.git
synced 2024-09-10 09:54:32 +00:00
fix reg2reg and incr decr 16 bits
This commit is contained in:
parent
9bcbf29a49
commit
739f5b9659
@ -405,38 +405,75 @@ class CodeGenerator:
|
|||||||
raise CodeError("only supports incr/decr by up to 255 for now") # XXX
|
raise CodeError("only supports incr/decr by up to 255 for now") # XXX
|
||||||
is_incr = isinstance(stmt, ParseResult.InplaceIncrStmt)
|
is_incr = isinstance(stmt, ParseResult.InplaceIncrStmt)
|
||||||
if isinstance(stmt.what, ParseResult.RegisterValue):
|
if isinstance(stmt.what, ParseResult.RegisterValue):
|
||||||
|
reg = stmt.what.register
|
||||||
if is_incr:
|
if is_incr:
|
||||||
if stmt.what.register == 'A':
|
if reg == 'A':
|
||||||
self.p("\t\tclc")
|
self.p("\t\tclc")
|
||||||
self.p("\t\tadc #{:d}".format(stmt.howmuch))
|
self.p("\t\tadc #{:d}".format(stmt.howmuch))
|
||||||
elif stmt.what.register in REGISTER_BYTES:
|
elif reg in REGISTER_BYTES:
|
||||||
|
# 8 bit incr
|
||||||
if stmt.howmuch == 1:
|
if stmt.howmuch == 1:
|
||||||
self.p("\t\tin{:s}".format(stmt.what.register.lower()))
|
self.p("\t\tin{:s}".format(reg.lower()))
|
||||||
else:
|
else:
|
||||||
self.p("\t\tpha")
|
self.p("\t\tpha")
|
||||||
self.p("\t\tt{:s}a".format(stmt.what.register.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 #{:d}".format(stmt.howmuch))
|
||||||
self.p("\t\tta{:s}".format(stmt.what.register.lower()))
|
self.p("\t\tta{:s}".format(reg.lower()))
|
||||||
self.p("\t\tpla")
|
self.p("\t\tpla")
|
||||||
|
elif reg == "AX":
|
||||||
|
self.p("\t\tclc")
|
||||||
|
self.p("\t\tadc #1")
|
||||||
|
self.p("\t\tbne +")
|
||||||
|
self.p("\t\tinx")
|
||||||
|
self.p("+")
|
||||||
|
elif reg == "AY":
|
||||||
|
self.p("\t\tclc")
|
||||||
|
self.p("\t\tadc #1")
|
||||||
|
self.p("\t\tbne +")
|
||||||
|
self.p("\t\tiny")
|
||||||
|
self.p("+")
|
||||||
|
elif reg == "XY":
|
||||||
|
self.p("\t\tinx")
|
||||||
|
self.p("\t\tbne +")
|
||||||
|
self.p("\t\tiny")
|
||||||
|
self.p("+")
|
||||||
else:
|
else:
|
||||||
raise CodeError("invalid incr/decr register")
|
raise CodeError("invalid incr register: " + reg)
|
||||||
else:
|
else:
|
||||||
if stmt.what.register == 'A':
|
if reg == 'A':
|
||||||
self.p("\t\tsec")
|
self.p("\t\tsec")
|
||||||
self.p("\t\tsbc #{:d}".format(stmt.howmuch))
|
self.p("\t\tsbc #{:d}".format(stmt.howmuch))
|
||||||
elif stmt.what.register in REGISTER_BYTES:
|
elif reg in REGISTER_BYTES:
|
||||||
|
# 8 bit decr
|
||||||
if stmt.howmuch == 1:
|
if stmt.howmuch == 1:
|
||||||
self.p("\t\tde{:s}".format(stmt.what.register.lower()))
|
self.p("\t\tde{:s}".format(reg.lower()))
|
||||||
else:
|
else:
|
||||||
self.p("\t\tpha")
|
self.p("\t\tpha")
|
||||||
self.p("\t\tt{:s}a".format(stmt.what.register.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 #{:d}".format(stmt.howmuch))
|
||||||
self.p("\t\tta{:s}".format(stmt.what.register.lower()))
|
self.p("\t\tta{:s}".format(reg.lower()))
|
||||||
self.p("\t\tpla")
|
self.p("\t\tpla")
|
||||||
|
elif reg == "AX":
|
||||||
|
self.p("\t\tcmp #0")
|
||||||
|
self.p("\t\tbne +")
|
||||||
|
self.p("\t\tdex")
|
||||||
|
self.p("+\t\tsec")
|
||||||
|
self.p("\t\tsbc #1")
|
||||||
|
elif reg == "AY":
|
||||||
|
self.p("\t\tcmp #0")
|
||||||
|
self.p("\t\tbne +")
|
||||||
|
self.p("\t\tdey")
|
||||||
|
self.p("+\t\tsec")
|
||||||
|
self.p("\t\tsbc #1")
|
||||||
|
elif reg == "XY":
|
||||||
|
self.p("\t\tcpx #0")
|
||||||
|
self.p("\t\tbne +")
|
||||||
|
self.p("\t\tdey")
|
||||||
|
self.p("+\t\tdex")
|
||||||
else:
|
else:
|
||||||
raise CodeError("invalid incr/decr register")
|
raise CodeError("invalid decr register: " + reg)
|
||||||
elif isinstance(stmt.what, (ParseResult.MemMappedValue, ParseResult.IndirectValue)):
|
elif isinstance(stmt.what, (ParseResult.MemMappedValue, ParseResult.IndirectValue)):
|
||||||
what = stmt.what
|
what = stmt.what
|
||||||
if isinstance(what, ParseResult.IndirectValue):
|
if isinstance(what, ParseResult.IndirectValue):
|
||||||
@ -768,16 +805,12 @@ class CodeGenerator:
|
|||||||
|
|
||||||
def _generate_call_or_goto(self, stmt: ParseResult.CallStmt, branch_emitter: Callable[[str, bool, bool], None]) -> None:
|
def _generate_call_or_goto(self, stmt: ParseResult.CallStmt, branch_emitter: Callable[[str, bool, bool], None]) -> None:
|
||||||
def generate_param_assignments() -> None:
|
def generate_param_assignments() -> None:
|
||||||
self.p("; param assignment") # XXX
|
|
||||||
for assign_stmt in stmt.desugared_call_arguments:
|
for assign_stmt in stmt.desugared_call_arguments:
|
||||||
self.generate_assignment(assign_stmt)
|
self.generate_assignment(assign_stmt)
|
||||||
self.p("; param assignment done") # XXX
|
|
||||||
|
|
||||||
def generate_result_assignments() -> None:
|
def generate_result_assignments() -> None:
|
||||||
self.p("; result assignment") # XXX
|
|
||||||
for assign_stmt in stmt.desugared_output_assignments:
|
for assign_stmt in stmt.desugared_output_assignments:
|
||||||
self.generate_assignment(assign_stmt)
|
self.generate_assignment(assign_stmt)
|
||||||
self.p("; result assignment done") # XXX
|
|
||||||
|
|
||||||
def params_load_a() -> bool:
|
def params_load_a() -> bool:
|
||||||
for assign_stmt in stmt.desugared_call_arguments:
|
for assign_stmt in stmt.desugared_call_arguments:
|
||||||
@ -1510,19 +1543,21 @@ class CodeGenerator:
|
|||||||
# y -> x, 6502 doesn't have tyx
|
# y -> x, 6502 doesn't have tyx
|
||||||
self.p("\t\tsty ${0:02x}\n\t\tldx ${0:02x}".format(Zeropage.SCRATCH_B1))
|
self.p("\t\tsty ${0:02x}\n\t\tldx ${0:02x}".format(Zeropage.SCRATCH_B1))
|
||||||
elif lv.register == "AX" and r_register == "XY":
|
elif lv.register == "AX" and r_register == "XY":
|
||||||
|
# x -> a, y -> x, 6502 doesn't have tyx
|
||||||
self.p("\t\ttxa")
|
self.p("\t\ttxa")
|
||||||
# y -> x, 6502 doesn't have tyx
|
|
||||||
self.p("\t\tsty ${0:02x}\n\t\tldx ${0:02x}".format(Zeropage.SCRATCH_B1))
|
self.p("\t\tsty ${0:02x}\n\t\tldx ${0:02x}".format(Zeropage.SCRATCH_B1))
|
||||||
elif lv.register == "AY" and r_register == "AX":
|
elif lv.register == "AY" and r_register == "AX":
|
||||||
# x -> y, 6502 doesn't have txy
|
# x -> y, 6502 doesn't have txy
|
||||||
self.p("\t\tstx ${0:02x}\n\t\tldy ${0:02x}".format(Zeropage.SCRATCH_B1))
|
self.p("\t\tstx ${0:02x}\n\t\tldy ${0:02x}".format(Zeropage.SCRATCH_B1))
|
||||||
elif lv.register == "AY" and r_register == "XY":
|
elif lv.register == "AY" and r_register == "XY":
|
||||||
|
# x -> a
|
||||||
self.p("\t\ttxa")
|
self.p("\t\ttxa")
|
||||||
elif lv.register == "XY" and r_register == "AX":
|
elif lv.register == "XY" and r_register == "AX":
|
||||||
self.p("\t\ttax")
|
# x -> y, a -> x, 6502 doesn't have txy
|
||||||
# x -> y, 6502 doesn't have txy
|
|
||||||
self.p("\t\tstx ${0:02x}\n\t\tldy ${0:02x}".format(Zeropage.SCRATCH_B1))
|
self.p("\t\tstx ${0:02x}\n\t\tldy ${0:02x}".format(Zeropage.SCRATCH_B1))
|
||||||
|
self.p("\t\ttax")
|
||||||
elif lv.register == "XY" and r_register == "AY":
|
elif lv.register == "XY" and r_register == "AY":
|
||||||
|
# a -> x
|
||||||
self.p("\t\ttax")
|
self.p("\t\ttax")
|
||||||
else:
|
else:
|
||||||
raise CodeError("invalid register combination", lv.register, r_register)
|
raise CodeError("invalid register combination", lv.register, r_register)
|
||||||
|
@ -10,7 +10,74 @@ import "c64lib"
|
|||||||
var secretnumber
|
var secretnumber
|
||||||
var attempts_left = 10
|
var attempts_left = 10
|
||||||
|
|
||||||
|
|
||||||
start
|
start
|
||||||
|
c64util.init_system()
|
||||||
|
|
||||||
|
|
||||||
|
XY = $0401
|
||||||
|
c64util.print_word_decimal(XY)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
XY--
|
||||||
|
c64util.print_word_decimal(XY)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
XY--
|
||||||
|
c64util.print_word_decimal(XY)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
|
||||||
|
AX = $0401
|
||||||
|
c64util.print_word_decimal(AX)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
AX--
|
||||||
|
c64util.print_word_decimal(AX)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
AX--
|
||||||
|
c64util.print_word_decimal(AX)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
|
||||||
|
AY = $0401
|
||||||
|
c64util.print_word_decimal(AY)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
AY--
|
||||||
|
c64util.print_word_decimal(AY)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
AY--
|
||||||
|
c64util.print_word_decimal(AY)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
|
||||||
|
XY = $03ff
|
||||||
|
c64util.print_word_decimal(XY)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
XY++
|
||||||
|
c64util.print_word_decimal(XY)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
XY++
|
||||||
|
c64util.print_word_decimal(XY)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
|
||||||
|
AX = $03ff
|
||||||
|
c64util.print_word_decimal(AX)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
AX++
|
||||||
|
c64util.print_word_decimal(AX)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
AX++
|
||||||
|
c64util.print_word_decimal(AX)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
|
||||||
|
AY = $03ff
|
||||||
|
c64util.print_word_decimal(AY)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
AY++
|
||||||
|
c64util.print_word_decimal(AY)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
AY++
|
||||||
|
c64util.print_word_decimal(AY)
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
c64.CHROUT('\n')
|
||||||
|
|
||||||
|
|
||||||
A = c64.VMCSB
|
A = c64.VMCSB
|
||||||
A |= 2 ; @todo c64.VMCSB |= 2
|
A |= 2 ; @todo c64.VMCSB |= 2
|
||||||
c64.VMCSB = A
|
c64.VMCSB = A
|
||||||
|
Loading…
Reference in New Issue
Block a user