@@ -28,8 +28,6 @@ def __init__(self, name, initial_value):
28
28
def set (self , v ):
29
29
self .value = v
30
30
return self .value # e.g.: r = operand.set(a + 1)
31
- def get (self ):
32
- return self .value
33
31
34
32
# FIXME:
35
33
def decrement (self , value = 1 ):
@@ -94,41 +92,26 @@ def __str__(self):
94
92
95
93
96
94
97
- def _register_bit (key ):
98
- def set_flag (self , value ):
99
- assert value in (0 , 1 )
100
- self ._register [key ] = value
101
- def get_flag (self ):
102
- return self ._register [key ]
103
- return property (get_flag , set_flag )
104
-
105
-
106
95
class ConditionCodeRegister (object ):
107
96
""" CC - 8 bit condition code register bits """
108
97
109
- WIDTH = 8 # 8 Bit
98
+ WIDTH = 8 # 8 Bit
110
99
111
100
def __init__ (self , * cmd_args , ** kwargs ):
112
101
self .name = "CC"
113
- self ._register = {}
114
- self .set (0x0 ) # create all keys in dict with value 0
115
-
116
- E = _register_bit ("E" ) # E - 0x80 - bit 7 - Entire register state stacked
117
- F = _register_bit ("F" ) # F - 0x40 - bit 6 - FIRQ interrupt masked
118
- H = _register_bit ("H" ) # H - 0x20 - bit 5 - Half-Carry
119
- I = _register_bit ("I" ) # I - 0x10 - bit 4 - IRQ interrupt masked
120
- N = _register_bit ("N" ) # N - 0x08 - bit 3 - Negative result (twos complement)
121
- Z = _register_bit ("Z" ) # Z - 0x04 - bit 2 - Zero result
122
- V = _register_bit ("V" ) # V - 0x02 - bit 1 - Overflow
123
- C = _register_bit ("C" ) # C - 0x01 - bit 0 - Carry (or borrow)
102
+ self .E = 0 # E - 0x80 - bit 7 - Entire register state stacked
103
+ self .F = 0 # F - 0x40 - bit 6 - FIRQ interrupt masked
104
+ self .H = 0 # H - 0x20 - bit 5 - Half-Carry
105
+ self .I = 0 # I - 0x10 - bit 4 - IRQ interrupt masked
106
+ self .N = 0 # N - 0x08 - bit 3 - Negative result (twos complement)
107
+ self .Z = 0 # Z - 0x04 - bit 2 - Zero result
108
+ self .V = 0 # V - 0x02 - bit 1 - Overflow
109
+ self .C = 0 # C - 0x01 - bit 0 - Carry (or borrow)
124
110
125
111
####
126
112
127
- def set (self , status ):
128
- self .E , self .F , self .H , self .I , self .N , self .Z , self .V , self .C = \
129
- [0 if status & x == 0 else 1 for x in (128 , 64 , 32 , 16 , 8 , 4 , 2 , 1 )]
130
-
131
- def get (self ):
113
+ @property
114
+ def value (self ):
132
115
return self .C | \
133
116
self .V << 1 | \
134
117
self .Z << 2 | \
@@ -138,6 +121,15 @@ def get(self):
138
121
self .F << 6 | \
139
122
self .E << 7
140
123
124
+ @value .setter
125
+ def value (self , status ):
126
+ self .E , self .F , self .H , self .I , self .N , self .Z , self .V , self .C = \
127
+ [0 if status & x == 0 else 1 for x in (128 , 64 , 32 , 16 , 8 , 4 , 2 , 1 )]
128
+
129
+ def set (self , status ):
130
+ self .E , self .F , self .H , self .I , self .N , self .Z , self .V , self .C = \
131
+ [0 if status & x == 0 else 1 for x in (128 , 64 , 32 , 16 , 8 , 4 , 2 , 1 )]
132
+
141
133
@property
142
134
def get_info (self ):
143
135
"""
@@ -146,28 +138,16 @@ def get_info(self):
146
138
>>> cc.get_info
147
139
'E.H....C'
148
140
"""
149
- return cc_value2txt (self .get () )
141
+ return cc_value2txt (self .value )
150
142
151
143
def __str__ (self ):
152
144
return "%s=%s" % (self .name , self .get_info )
153
145
154
146
####
155
147
156
- """
157
- #define SET_Z(r) ( REG_CC |= ((r) ? 0 : CC_Z) )
158
- #define SET_N8(r) ( REG_CC |= (r&0x80)>>4 )
159
- #define SET_N16(r) ( REG_CC |= (r&0x8000)>>12 )
160
- #define SET_H(a,b,r) ( REG_CC |= ((a^b^r)&0x10)<<1 )
161
- #define SET_C8(r) ( REG_CC |= (r&0x100)>>8 )
162
- #define SET_C16(r) ( REG_CC |= (r&0x10000)>>16 )
163
- #define SET_V8(a,b,r) ( REG_CC |= ((a^b^r^(r>>1))&0x80)>>6 )
164
- #define SET_V16(a,b,r) ( REG_CC |= ((a^b^r^(r>>1))&0x8000)>>14 )
165
- """
166
-
167
148
def set_H (self , a , b , r ):
168
- if self .H == 0 :
169
- r2 = (a ^ b ^ r ) & 0x10
170
- self .H = 0 if r2 == 0 else 1
149
+ if not self .H and (a ^ b ^ r ) & 0x10 :
150
+ self .H = 1
171
151
# log.debug("\tset_H(): set half-carry flag to %i: ($%02x ^ $%02x ^ $%02x) & 0x10 = $%02x",
172
152
# self.H, a, b, r, r2
173
153
# )
@@ -185,69 +165,62 @@ def set_Z8(self, r):
185
165
# log.debug("\tset_Z8(): leave old value 1")
186
166
187
167
def set_Z16 (self , r ):
188
- if self .Z == 0 :
189
- r2 = r & 0xffff
190
- self .Z = 1 if r2 == 0 else 0
168
+ if not self .Z and not r & 0xffff :
169
+ self .Z = 1
191
170
# log.debug("\tset_Z16(): set zero flag to %i: $%04x & 0xffff = $%04x",
192
171
# self.Z, r, r2
193
172
# )
194
173
# else:
195
174
# log.debug("\tset_Z16(): leave old value 1")
196
175
197
176
def set_N8 (self , r ):
198
- if self .N == 0 :
199
- r2 = r & 0x80
200
- self .N = 0 if r2 == 0 else 1
177
+ if not self .N and r & 0x80 :
178
+ self .N = 1
201
179
# log.debug("\tset_N8(): set negative flag to %i: ($%02x & 0x80) = $%02x",
202
180
# self.N, r, r2
203
181
# )
204
182
# else:
205
183
# log.debug("\tset_N8(): leave old value 1")
206
184
207
185
def set_N16 (self , r ):
208
- if self .N == 0 :
209
- r2 = r & 0x8000
210
- self .N = 0 if r2 == 0 else 1
186
+ if not self .N and r & 0x8000 :
187
+ self .N = 1
211
188
# log.debug("\tset_N16(): set negative flag to %i: ($%04x & 0x8000) = $%04x",
212
189
# self.N, r, r2
213
190
# )
214
191
# else:
215
192
# log.debug("\tset_N16(): leave old value 1")
216
193
217
194
def set_C8 (self , r ):
218
- if self .C == 0 :
219
- r2 = r & 0x100
220
- self .C = 0 if r2 == 0 else 1
195
+ if not self .C and r & 0x100 :
196
+ self .C = 1
221
197
# log.debug("\tset_C8(): carry flag to %i: ($%02x & 0x100) = $%02x",
222
198
# self.C, r, r2
223
199
# )
224
200
# else:
225
201
# log.debug("\tset_C8(): leave old value 1")
226
202
227
203
def set_C16 (self , r ):
228
- if self .C == 0 :
229
- r2 = r & 0x10000
230
- self .C = 0 if r2 == 0 else 1
204
+ if not self .C and r & 0x10000 :
205
+ self .C = 1
231
206
# log.debug("\tset_C16(): carry flag to %i: ($%04x & 0x10000) = $%04x",
232
207
# self.C, r, r2
233
208
# )
234
209
# else:
235
210
# log.debug("\tset_C16(): leave old value 1")
236
211
237
212
def set_V8 (self , a , b , r ):
238
- if self .V == 0 :
239
- r2 = (a ^ b ^ r ^ (r >> 1 )) & 0x80
240
- self .V = 0 if r2 == 0 else 1
213
+ if not self .V and (a ^ b ^ r ^ (r >> 1 )) & 0x80 :
214
+ self .V = 1
241
215
# log.debug("\tset_V8(): overflow flag to %i: (($%02x ^ $%02x ^ $%02x ^ ($%02x >> 1)) & 0x80) = $%02x",
242
216
# self.V, a, b, r, r, r2
243
217
# )
244
218
# else:
245
219
# log.debug("\tset_V8(): leave old value 1")
246
220
247
221
def set_V16 (self , a , b , r ):
248
- if self .V == 0 :
249
- r2 = (a ^ b ^ r ^ (r >> 1 )) & 0x8000
250
- self .V = 0 if r2 == 0 else 1
222
+ if not self .V and (a ^ b ^ r ^ (r >> 1 )) & 0x8000 :
223
+ self .V = 1
251
224
# log.debug("\tset_V16(): overflow flag to %i: (($%04x ^ $%04x ^ $%04x ^ ($%04x >> 1)) & 0x8000) = $%04x",
252
225
# self.V, a, b, r, r, r2
253
226
# )
@@ -361,13 +334,12 @@ def set(self, value):
361
334
self ._a .set (value >> 8 )
362
335
self ._b .set (value & 0xff )
363
336
364
- def get (self ):
365
- a = self ._a .get ()
366
- b = self ._b .get ()
367
- return a * 256 + b
337
+ @property
338
+ def value (self ):
339
+ return self ._a .value * 256 + self ._b .value
368
340
369
341
def __str__ (self ):
370
- return "%s=%04x" % (self .name , self .get () )
342
+ return "%s=%04x" % (self .name , self .value )
371
343
372
344
373
345
def convert_differend_width (src_reg , dst_reg ):
@@ -389,7 +361,7 @@ def convert_differend_width(src_reg, dst_reg):
389
361
TODO: verify this behaviour on real hardware
390
362
see: http://archive.worldofdragon.org/phpBB3/viewtopic.php?f=8&t=4886
391
363
"""
392
- src_value = src_reg .get ()
364
+ src_value = src_reg .value
393
365
if src_reg .WIDTH == 8 and dst_reg .WIDTH == 16 :
394
366
# e.g.: $cd -> $ffcd
395
367
src_value += 0xff00
0 commit comments