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

1#!/usr/bin/env python 

2 

3""" 

4 MC6809 - 6809 CPU emulator in Python 

5 ======================================= 

6 

7 6809 is Big-Endian 

8 

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/ 

13 

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. 

16 

17 Based on: 

18 * ApplyPy by James Tauber (MIT license) 

19 * XRoar emulator by Ciaran Anscomb (GPL license) 

20 more info, see README 

21""" 

22 

23 

24from MC6809.components.cpu_utils.instruction_caller import opcode 

25 

26 

27class OpsLoadStoreMixin: 

28 

29 # ---- Store / Load ---- 

30 

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. 

42 

43 source code forms: LDD P; LDX P; LDY P; LDS P; LDU P 

44 

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) 

55 

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. 

63 

64 source code forms: LDA P; LDB P 

65 

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) 

75 

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. 

87 

88 source code forms: STD P; STX P; STY P; STS P; STU P 

89 

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 

101 

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. 

109 

110 source code forms: STA P; STB P 

111 

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