sh-dis/python/instruction_function_name.py
Zack Buhman 8a300ba4c6 initial SH4 emulator implementation in C
This currently only implements the SH2 instructions.
2024-04-22 20:53:36 +08:00

119 lines
4.8 KiB
Python

mode_name = {
'': 'no_operand',
'Rn': 'destination_operand_only',
'Rm': 'destination_operand_only',
'Rm,Rn': 'source_and_destination_operands',
'Rm,SR': 'transfer_to_sr',
'Rm,SSR': 'transfer_to_ssr',
'Rm,SPC': 'transfer_to_spc',
'Rm,GBR': 'transfer_to_gbr',
'Rm,VBR': 'transfer_to_vbr',
'Rm,DBR': 'transfer_to_dbr',
'Rm,MACH': 'transfer_to_mach',
'Rm,MACL': 'transfer_to_macl',
'Rm,Rn_BANK': 'transfer_to_rn_bank',
'Rm,PR': 'transfer_to_pr',
'SR,Rn': 'transfer_from_sr',
'SSR,Rn': 'transfer_from_ssr',
'SPC,Rn': 'transfer_from_spc',
'GBR,Rn': 'transfer_from_gbr',
'VBR,Rn': 'transfer_from_vbr',
'DBR,Rn': 'transfer_from_dbr',
'SGR,Rn': 'transfer_from_sgr',
'MACH,Rn': 'transfer_from_mach',
'MACL,Rn': 'transfer_from_macl',
'Rm_BANK,Rn': 'transfer_from_rm_bank',
'PR,Rn': 'transfer_from_pr',
'@Rn': 'destination_operand_only',
'Rm,@Rn': 'store_register_direct_data_transfer',
'R0,@Rn': 'r0_store_register_direct_data_transfer',
'@Rm,Rn': 'load_register_direct_data_transfer',
'@Rm+,@Rn+': 'multiply_and_accumulate_operation',
'@Rm+,Rn': 'load_direct_data_transfer_from_register',
'@Rm+,SR': 'load_to_sr',
'@Rm+,SSR': 'load_to_ssr',
'@Rm+,SPC': 'load_to_spc',
'@Rm+,GBR': 'load_to_gbr',
'@Rm+,VBR': 'load_to_vbr',
'@Rm+,DBR': 'load_to_dbr',
'@Rm+,MACH': 'load_to_mach',
'@Rm+,MACL': 'load_to_macl',
'@Rm+,Rn_BANK': 'load_to_rn_bank',
'@Rm+,PR': 'load_to_pr',
'Rm,@-Rn': 'store_direct_data_transfer_from_register',
'SR,@-Rn': 'store_from_sr',
'SSR,@-Rn': 'store_from_ssr',
'SPC,@-Rn': 'store_from_spc',
'GBR,@-Rn': 'store_from_gbr',
'VBR,@-Rn': 'store_from_vbr',
'DBR,@-Rn': 'store_from_dbr',
'SGR,@-Rn': 'store_from_sgr',
'MACH,@-Rn': 'store_from_mach',
'MACL,@-Rn': 'store_from_macl',
'Rm_BANK,@-Rn': 'store_from_rm_bank',
'PR,@-Rn': 'store_from_pr',
'R0,@(disp,Rn)': 'store_register_indirect_with_displacement',
'Rm,@(disp,Rn)': 'store_register_indirect_with_displacement',
'@(disp,Rm),R0': 'load_register_indirect_with_displacement',
'@(disp,Rm),Rn': 'load_register_indirect_with_displacement',
'Rm,@(R0,Rn)': 'store_indexed_register_indirect',
'@(R0,Rm),Rn': 'load_indexed_register_indirect',
'R0,@(disp,GBR)': 'store_gbr_indirect_with_displacement',
'@(disp,GBR),R0': 'load_gbr_indirect_with_displacement',
'#imm,@(R0,GBR)': 'store_indexed_gbr_indirect',
'@(R0,GBR),#imm': 'load_indexed_gbr_indirect',
'@(disp,PC),Rn': 'pc_relative_with_displacement',
'@(disp,PC),R0': 'pc_relative_with_displacement',
'label': 'pc_relative',
'#imm,Rn': 'immediate',
'#imm,R0': 'immediate',
'#imm': 'immediate',
# floating point
'FRn': 'destination_operand_only',
'DRn': 'destination_operand_only_double',
'FRm,FRn': 'source_and_destination_operands',
'DRm,DRn': 'source_and_destination_operands_double',
'XDm,XDn': 'source_and_destination_operands_bank',
'DRm,XDn': 'double_to_bank',
'XDm,DRn': 'bank_to_double',
'@Rm,FRn': 'load_register_direct_data_transfer',
'@Rm,DRn': 'load_register_direct_data_transfer_double',
'@Rm,XDn': 'load_register_direct_data_transfer_bank',
'@(R0,Rm),FRn': 'load_indexed_register_indirect',
'@(R0,Rm),DRn': 'load_indexed_register_indirect_double',
'@(R0,Rm),XDn': 'load_indexed_register_indirect_bank',
'@Rm+,FRn': 'load_direct_data_transfer_from_register',
'@Rm+,DRn': 'load_direct_data_transfer_from_register_double',
'@Rm+,XDn': 'load_direct_data_transfer_from_register_bank',
'FRm,@Rn': 'store_register_direct_data_transfer',
'DRm,@Rn': 'store_register_direct_data_transfer_double',
'XDm,@Rn': 'store_register_direct_data_transfer_bank',
'FRm,@-Rn': 'store_direct_data_transfer_from_register',
'DRm,@-Rn': 'store_direct_data_transfer_from_register_double',
'XDm,@-Rn': 'store_direct_data_transfer_from_register_bank',
'FRm,@(R0,Rn)': 'store_indexed_register_indirect',
'DRm,@(R0,Rn)': 'store_indexed_register_indirect_double',
'XDm,@(R0,Rn)': 'store_indexed_register_indirect_bank',
'FRm,FPUL': 'frm_to_fpul',
'DRm,FPUL': 'drm_to_fpul',
'FPUL,FRn': 'fpul_to_frn',
'FPUL,DRn': 'fpul_to_drn',
'FR0,FRm,FRn': 'fr0_frm_frn',
'Rm,FPSCR': 'transfer_to_fpscr',
'Rm,FPUL': 'transfer_to_fpul',
'@Rm+,FPSCR': 'load_to_fpscr',
'@Rm+,FPUL': 'load_to_fpul',
'FPSCR,Rn': 'transfer_from_fpscr',
'FPUL,Rn': 'transfer_from_fpul',
'FPUL,@-Rn': 'store_from_fpul',
'FPSCR,@-Rn': 'store_from_fpscr',
'FVm,FVn': 'fvm_fvn',
'XMTRX,FVn': 'xmtrx_fvn',
}
def instruction_function_name(ins):
name = ins.instruction.replace('.', '_').replace('/', '_').lower()
assert ins.operands in mode_name, (ins.instruction, ins.operands)
mode = mode_name[ins.operands]
return '__'.join([name, mode])