Coverage for MC6809/components/mc6809_ops_load_store.py: 100%
25 statements
« prev ^ index » next coverage.py v7.2.1, created at 2023-03-06 19:50 +0100
« prev ^ index » next coverage.py v7.2.1, created at 2023-03-06 19:50 +0100
1#!/usr/bin/env python
3"""
4 MC6809 - 6809 CPU emulator in Python
5 =======================================
7 6809 is Big-Endian
9 Links:
10 http://dragondata.worldofdragon.org/Publications/inside-dragon.htm
11 http://www.burgins.com/m6809.html
12 http://koti.mbnet.fi/~atjs/mc6809/
14 :copyleft: 2013-2015 by the MC6809 team, see AUTHORS for more details.
15 :license: GNU GPL v3 or above, see LICENSE for more details.
17 Based on:
18 * ApplyPy by James Tauber (MIT license)
19 * XRoar emulator by Ciaran Anscomb (GPL license)
20 more info, see README
21"""
24from MC6809.components.cpu_utils.instruction_caller import opcode
27class OpsLoadStoreMixin:
29 # ---- Store / Load ----
31 @opcode( # Load register from memory
32 0xcc, 0xdc, 0xec, 0xfc, # LDD (immediate, direct, indexed, extended)
33 0x10ce, 0x10de, 0x10ee, 0x10fe, # LDS (immediate, direct, indexed, extended)
34 0xce, 0xde, 0xee, 0xfe, # LDU (immediate, direct, indexed, extended)
35 0x8e, 0x9e, 0xae, 0xbe, # LDX (immediate, direct, indexed, extended)
36 0x108e, 0x109e, 0x10ae, 0x10be, # LDY (immediate, direct, indexed, extended)
37 )
38 def instruction_LD16(self, opcode, m, register):
39 """
40 Load the contents of the memory location M:M+1 into the designated
41 16-bit register.
43 source code forms: LDD P; LDX P; LDY P; LDS P; LDU P
45 CC bits "HNZVC": -aa0-
46 """
47# log.debug("$%x LD16 set %s to $%x \t| %s" % (
48# self.program_counter,
49# register.name, m,
50# self.cfg.mem_info.get_shortest(m)
51# ))
52 register.set(m)
53 self.clear_NZV()
54 self.update_NZ_16(m)
56 @opcode( # Load accumulator from memory
57 0x86, 0x96, 0xa6, 0xb6, # LDA (immediate, direct, indexed, extended)
58 0xc6, 0xd6, 0xe6, 0xf6, # LDB (immediate, direct, indexed, extended)
59 )
60 def instruction_LD8(self, opcode, m, register):
61 """
62 Loads the contents of memory location M into the designated register.
64 source code forms: LDA P; LDB P
66 CC bits "HNZVC": -aa0-
67 """
68# log.debug("$%x LD8 %s = $%x" % (
69# self.program_counter,
70# register.name, m,
71# ))
72 register.set(m)
73 self.clear_NZV()
74 self.update_NZ_8(m)
76 @opcode( # Store register to memory
77 0xdd, 0xed, 0xfd, # STD (direct, indexed, extended)
78 0x10df, 0x10ef, 0x10ff, # STS (direct, indexed, extended)
79 0xdf, 0xef, 0xff, # STU (direct, indexed, extended)
80 0x9f, 0xaf, 0xbf, # STX (direct, indexed, extended)
81 0x109f, 0x10af, 0x10bf, # STY (direct, indexed, extended)
82 )
83 def instruction_ST16(self, opcode, ea, register):
84 """
85 Writes the contents of a 16-bit register into two consecutive memory
86 locations.
88 source code forms: STD P; STX P; STY P; STS P; STU P
90 CC bits "HNZVC": -aa0-
91 """
92 value = register.value
93# log.debug("$%x ST16 store value $%x from %s at $%x \t| %s" % (
94# self.program_counter,
95# value, register.name, ea,
96# self.cfg.mem_info.get_shortest(ea)
97# ))
98 self.clear_NZV()
99 self.update_NZ_16(value)
100 return ea, value # write word to Memory
102 @opcode( # Store accumulator to memory
103 0x97, 0xa7, 0xb7, # STA (direct, indexed, extended)
104 0xd7, 0xe7, 0xf7, # STB (direct, indexed, extended)
105 )
106 def instruction_ST8(self, opcode, ea, register):
107 """
108 Writes the contents of an 8-bit register into a memory location.
110 source code forms: STA P; STB P
112 CC bits "HNZVC": -aa0-
113 """
114 value = register.value
115# log.debug("$%x ST8 store value $%x from %s at $%x \t| %s" % (
116# self.program_counter,
117# value, register.name, ea,
118# self.cfg.mem_info.get_shortest(ea)
119# ))
120 self.clear_NZV()
121 self.update_NZ_8(value)
122 return ea, value # write byte to Memory