diff --git a/firmware/source/operation.c b/firmware/source/operation.c index 27cdc70..788b91a 100644 --- a/firmware/source/operation.c +++ b/firmware/source/operation.c @@ -44,29 +44,41 @@ uint8_t * operation_usb_call( setup_packet *spacket, uint8_t *rv, uint8_t *rlen) return rptr; } -read_funcptr decode_rdfunc_num( uint8_t func_num ) { +read_funcptr decode_rdfunc_num(uint8_t dict, uint8_t func_num ) +{ - switch( func_num ) { - case NES_CPU_RD: return nes_cpu_rd; - case NES_PPU_RD: return nes_ppu_rd; - case EMULATE_NES_CPU_RD: return emulate_nes_cpu_rd; - default: - return (void*)~SUCCESS; + if ( dict == NES ) { + switch( func_num ) { + case NES_CPU_RD: return nes_cpu_rd; + case NES_PPU_RD: return nes_ppu_rd; + case EMULATE_NES_CPU_RD: return emulate_nes_cpu_rd; + default: + return (void*)~SUCCESS; + } + } else { + //dictionary not supported + return (void*)~SUCCESS; } } -write_funcptr decode_wrfunc_num( uint8_t func_num ) { - switch( func_num ) { - case DISCRETE_EXP0_PRGROM_WR: - return discrete_exp0_prgrom_wr; - case NES_CPU_WR: - return nes_cpu_wr; - case NES_PPU_WR: - return nes_ppu_wr; - default: - return (void*)~SUCCESS; +write_funcptr decode_wrfunc_num(uint8_t dict, uint8_t func_num ) +{ + if ( dict == NES ) { + switch( func_num ) { + case DISCRETE_EXP0_PRGROM_WR: + return discrete_exp0_prgrom_wr; + case NES_CPU_WR: + return nes_cpu_wr; + case NES_PPU_WR: + return nes_ppu_wr; + default: + return (void*)~SUCCESS; + } + } + } else { + //dictionary not supported + return (void*)~SUCCESS; } - } @@ -93,17 +105,19 @@ uint8_t oper_opcode_no_return( uint8_t opcode, uint8_t operMSB, uint8_t operLSB, case COPY_ELEMENTS_TO_BUFF0: copy_data_to_buff0( (uint8_t *)oper_info, OPER_DATA_NUM_BYTE_ELEMENTS ); break; + //operMSB contains dictionary, operLSB contains function number + //decode that into proper function pointer case SET_OPER_FUNC: //oper_info->oper_func = decode_opfunc_num( operLSB ); break; case SET_RD_FUNC: - oper_info->rd_func = decode_rdfunc_num( operLSB ); + oper_info->rd_func = decode_rdfunc_num( operMSB, operLSB ); break; case SET_WR_MEM_FUNC: - oper_info->wr_mem_func = decode_wrfunc_num( operLSB ); + oper_info->wr_mem_func = decode_wrfunc_num( operMSB, operLSB ); break; case SET_WR_MAP_FUNC: - oper_info->wr_map_func = decode_wrfunc_num( operLSB ); + oper_info->wr_map_func = decode_wrfunc_num( operMSB, operLSB ); break; default: //opcode doesn't exist @@ -128,8 +142,8 @@ uint8_t oper_opcode_return( uint8_t opcode, uint8_t operMSB, uint8_t operLSB, ui { switch (opcode) { case GET_OPERATION: - *rvalue = oper_info->operation; - *rlength += 1; + *rvalue = oper_info->operation; + *rlength += 1; break; default: //opcode doesn't exist diff --git a/firmware/source/operation.h b/firmware/source/operation.h index 93bbad2..c3abcd0 100644 --- a/firmware/source/operation.h +++ b/firmware/source/operation.h @@ -14,8 +14,8 @@ uint8_t * operation_usb_call( setup_packet *spacket, uint8_t *rv, uint8_t *rlen); -read_funcptr decode_rdfunc_num( uint8_t func_num ); -write_funcptr decode_wrfunc_num( uint8_t func_num ); +read_funcptr decode_rdfunc_num( uint8_t dict, uint8_t func_num ); +write_funcptr decode_wrfunc_num( uint8_t dict, uint8_t func_num ); uint8_t oper_opcode_no_return( uint8_t opcode, uint8_t operMSB, uint8_t operLSB, uint8_t miscdata ); uint8_t oper_opcode_return( uint8_t opcode, uint8_t operMSB, uint8_t operLSB, uint8_t miscdata, uint8_t *rvalue, uint8_t *rlength ); diff --git a/host/source/operation.c b/host/source/operation.c index d488d5e..f68d735 100644 --- a/host/source/operation.c +++ b/host/source/operation.c @@ -5,7 +5,7 @@ * Post:oper_info elements loaded * Rtn: SUCCESS if no errors */ -int load_oper_info_elements( USBtransfer *transfer, cartridge *cart, int mem ) +int load_oper_info_elements( USBtransfer *transfer, cartridge *cart ) { uint8_t rv[RETURN_BUFF_SIZE]; uint8_t buff_num = 0; //buffer used to load elements according to shared_dict_operation.h diff --git a/shared/shared_dict_operation.h b/shared/shared_dict_operation.h index 55f8e23..5808d68 100644 --- a/shared/shared_dict_operation.h +++ b/shared/shared_dict_operation.h @@ -110,6 +110,7 @@ enum operation_elem_nums { //Each index is numbered by it's name #define COPY_ELEMENTS_TO_BUFF0 0x02 +//pass dictionary in operMSB and command/func in operLSB #define SET_OPER_FUNC 0x03 #define SET_RD_FUNC 0x04 #define SET_WR_MEM_FUNC 0x05