def _astoref16(ins): ''' Stores 2º operand content into address of 1st operand. storef16 a, x => *(&a) = x ''' output = _addr(ins.quad[1]) value = ins.quad[2] if value[0] == '*': value = value[1:] indirect = True else: indirect = False if indirect: output.append('push hl') output.extend(_f16_oper(ins.quad[2], useBC = True)) output.append('pop hl') REQUIRES.add('iload32.asm') else: output.extend(_f16_oper(ins.quad[2], useBC = True)) output.append('call __STORE32') REQUIRES.add('store32.asm') return output
def _astoref16(ins): ''' Stores 2º operand content into address of 1st operand. storef16 a, x => *(&a) = x ''' output = _addr(ins.quad[1]) value = ins.quad[2] if value[0] == '*': value = value[1:] indirect = True else: indirect = False if indirect: output.append('push hl') output.extend(_f16_oper(ins.quad[2], useBC=True)) output.append('pop hl') REQUIRES.add('iload32.asm') else: output.extend(_f16_oper(ins.quad[2], useBC=True)) output.append('call __STORE32') REQUIRES.add('store32.asm') return output
def _pstoref16(ins): ''' Stores 2nd parameter at stack pointer (SP) + X, being X 1st parameter. 1st operand must be a SIGNED integer. ''' value = ins.quad[2] offset = ins.quad[1] indirect = offset[0] == '*' bytes = 3 if indirect: offset = offset[1:] I = int(offset) if I >= 0: I += 4 # Return Address + "push IX" output = _f16_oper(value) ix_changed = not (-128 + bytes <= I <= 127 - bytes) # Offset > 127 bytes. Need to change IX if indirect: output.append('ld bc, %i' % I) output.append('call __PISTORE32') REQUIRES.add('pistore32.asm') return output # direct store output.append('ld bc, %i' % I) output.append('call __PSTORE32') REQUIRES.add('pstore32.asm') return output