X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Feeprom.cpp;h=197d2692a77583783cdd1ae6af47134f55f1f5b4;hb=4fc7c64eac42b571ee64ec693e6da1d5a458344f;hp=1610e1cc2643b302564c3e588d514477438ed20e;hpb=aaa37222bec76a065e74830b363e8c9dfa4709ae;p=virtualjaguar diff --git a/src/eeprom.cpp b/src/eeprom.cpp index 1610e1c..197d269 100644 --- a/src/eeprom.cpp +++ b/src/eeprom.cpp @@ -1,3 +1,11 @@ +// +// EEPROM handler +// +// by cal2 +// GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS) +// Cleanups by James L. Hammons +// + #include "eeprom.h" #define eeprom_LOG @@ -41,388 +49,279 @@ uint16 jerry_ee_direct_jump = 0; FILE * jerry_ee_fp; extern char * jaguar_boot_dir; -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void eeprom_init(void) { - static char eeprom_filename[256]; - sprintf(eeprom_filename,"%s\\%s%.8x.eep",jaguar_boot_dir,jaguar_eeproms_path,jaguar_mainRom_crc32); - jerry_ee_fp=fopen(eeprom_filename,"rb"); + static char eeprom_filename[1024]; + + sprintf(eeprom_filename, "%s\\%s%08X.eep", jaguar_boot_dir, jaguar_eeproms_path, (unsigned int)jaguar_mainRom_crc32); + jerry_ee_fp = fopen(eeprom_filename, "rb"); if (jerry_ee_fp) { - fread(eeprom_ram,1,128,jerry_ee_fp); + fread(eeprom_ram, 1, 128, jerry_ee_fp); fclose(jerry_ee_fp); - fprintf(log_get(),"eeprom: loaded from %s\n",eeprom_filename); - jerry_ee_fp=fopen(eeprom_filename,"wrb"); + fprintf(log_get(), "eeprom: loaded from %s\n", eeprom_filename); + jerry_ee_fp = fopen(eeprom_filename, "wrb"); } else { - fprintf(log_get(),"eeprom: creating %s\n",eeprom_filename); - jerry_ee_fp=fopen(eeprom_filename,"wb"); - if (jerry_ee_fp==NULL) - fprintf(log_get(),"eeprom: could not open/create %s\n",eeprom_filename); + fprintf(log_get(), "eeprom: creating %s\n", eeprom_filename); + jerry_ee_fp = fopen(eeprom_filename, "wb"); + if (jerry_ee_fp == NULL) + fprintf(log_get(), "EEPROM: Could not open/create %s\n", eeprom_filename); } } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void eeprom_reset(void) { - if (jerry_ee_fp==NULL) - memset(eeprom_ram,0xff,64*2); + if (jerry_ee_fp == NULL) + memset(eeprom_ram, 0xFF, 64 * sizeof(uint16)); } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void eeprom_done(void) { if (jerry_ee_fp) { - fwrite(eeprom_ram,1,128,jerry_ee_fp); + fwrite(eeprom_ram, 1, 128, jerry_ee_fp); fclose(jerry_ee_fp); } else fprintf(log_get(),"eeprom: not saved\n"); } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void eeprom_byte_write(uint32 offset, uint8 data) { switch (offset) { - case 0xf14001: break; - case 0xf14801: eeprom_set_di(data&0x01); break; - case 0xf15001: eeprom_set_cs(1); break; + case 0xF14001: + break; + case 0xF14801: + eeprom_set_di(data & 0x01); + break; + case 0xF15001: + eeprom_set_cs(1); + break; // default: fprintf(log_get(),"eeprom: unmapped 0x%.8x\n",offset); break; } } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void eeprom_word_write(uint32 offset, uint16 data) { - eeprom_byte_write(offset+0,(data>>8)&0xff); - eeprom_byte_write(offset+1,(data&0xff)); + eeprom_byte_write(offset+0, (data >> 8) & 0xFF); + eeprom_byte_write(offset+1, data & 0xFF); } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + uint8 eeprom_byte_read(uint32 offset) { switch (offset) { - case 0xf14001: return(eeprom_get_do()); break; - case 0xf14801: break; - case 0xf15001: eeprom_set_cs(1); break; + case 0xF14001: + return eeprom_get_do(); + case 0xF14801: + break; + case 0xF15001: + eeprom_set_cs(1); + break; // default: fprintf(log_get(),"eeprom: unmapped 0x%.8x\n",offset); break; } - return(0x00); + + return 0x00; } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + uint16 eeprom_word_read(uint32 offset) { - uint16 data=eeprom_byte_read(offset+0); - data<<=8; - data|=eeprom_byte_read(offset+1); - return(data); + return ((uint16)eeprom_byte_read(offset+0) << 8) | eeprom_byte_read(offset+1); } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void eeprom_set_di(uint32 data) { // fprintf(log_get(),"eeprom: di=%i\n",data); // fprintf(log_get(),"eeprom: state %i\n",jerry_ee_state); switch (jerry_ee_state) { - case EE_STATE_START: { - jerry_ee_state=EE_STATE_OP_A; - break; - } - case EE_STATE_OP_A: { - jerry_ee_op=(data<<1); - jerry_ee_state=EE_STATE_OP_B; - break; - } - case EE_STATE_OP_B: { - jerry_ee_op|=data; - jerry_ee_direct_jump=0; -// fprintf(log_get(),"eeprom: opcode %i\n",jerry_ee_op); - switch (jerry_ee_op) - { - case 0: jerry_ee_state=EE_STATE_0; break; - case 1: jerry_ee_state=EE_STATE_1; break; - case 2: jerry_ee_state=EE_STATE_2; break; - case 3: jerry_ee_state=EE_STATE_3; break; - } - eeprom_set_di(data); - break; - } - case EE_STATE_0: { - jerry_ee_rstate=EE_STATE_0_0; - jerry_ee_state=EE_READ_ADDRESS; - jerry_ee_direct_jump=1; - jerry_ee_address_cnt=6; - jerry_ee_address_data=0; - break; - } - case EE_STATE_0_0: { - switch ((jerry_ee_address_data>>4)&0x03) - { - case 0: jerry_ee_state=EE_STATE_0_0_0; break; - case 1: jerry_ee_state=EE_STATE_0_0_1; break; - case 2: jerry_ee_state=EE_STATE_0_0_2; break; - case 3: jerry_ee_state=EE_STATE_0_0_3; break; - } - eeprom_set_di(data); - break; - } - case EE_STATE_0_0_0:{ - // writes disable - // fprintf(log_get(),"eeprom: read only\n"); - jerry_writes_enabled=0; - jerry_ee_state=EE_STATE_START; - break; - } - case EE_STATE_0_0_1:{ - // writes all - jerry_ee_rstate=EE_STATE_0_0_1_0; - jerry_ee_state=EE_READ_DATA; - jerry_ee_data_cnt=16; - jerry_ee_data=0; - jerry_ee_direct_jump=1; - break; - } - case EE_STATE_0_0_1_0:{ - // fprintf(log_get(),"eeprom: filling eeprom with 0x%.4x\n",data); - if (jerry_writes_enabled) - { - for (int i=0;i<64;i++) - eeprom_ram[i]=jerry_ee_data; - } - //else - // fprintf(log_get(),"eeprom: not writing because read only\n"); - jerry_ee_state=EE_STATE_BUSY; - break; - } - case EE_STATE_0_0_2:{ - // erase all - //fprintf(log_get(),"eeprom: erasing eeprom\n"); - if (jerry_writes_enabled) - { - for (int i=0;i<64;i++) - eeprom_ram[i]=0xffff; - } - jerry_ee_state=EE_STATE_BUSY; - break; - } - case EE_STATE_0_0_3:{ - // writes enable - //fprintf(log_get(),"eeprom: read/write\n"); - jerry_writes_enabled=1; - jerry_ee_state=EE_STATE_START; - break; - } - case EE_STATE_1: { - jerry_ee_rstate=EE_STATE_1_0; - jerry_ee_state=EE_READ_ADDRESS; - jerry_ee_address_cnt=6; - jerry_ee_address_data=0; - jerry_ee_direct_jump=1; - break; - } - case EE_STATE_1_0: { - jerry_ee_rstate=EE_STATE_1_1; - jerry_ee_state=EE_READ_DATA; - jerry_ee_data_cnt=16; - jerry_ee_data=0; - jerry_ee_direct_jump=1; - break; - } - case EE_STATE_1_1: { - //fprintf(log_get(),"eeprom: writing 0x%.4x at 0x%.2x\n",jerry_ee_data,jerry_ee_address_data); - if (jerry_writes_enabled) - eeprom_ram[jerry_ee_address_data]=jerry_ee_data; - jerry_ee_state=EE_STATE_BUSY; - break; - } - case EE_STATE_2: { - jerry_ee_rstate=EE_STATE_2_0; - jerry_ee_state=EE_READ_ADDRESS; - jerry_ee_address_cnt=6; - jerry_ee_address_data=0; - jerry_ee_data_cnt=16; - jerry_ee_data=0; - break; - } - case EE_STATE_3: { - jerry_ee_rstate=EE_STATE_3_0; - jerry_ee_state=EE_READ_ADDRESS; - jerry_ee_address_cnt=6; - jerry_ee_address_data=0; - jerry_ee_direct_jump=1; - break; - } - case EE_STATE_3_0: { - //fprintf(log_get(),"eeprom: erasing 0x%.2x\n",jerry_ee_address_data); - if (jerry_writes_enabled) - eeprom_ram[jerry_ee_address_data]=0xffff; - jerry_ee_state=EE_STATE_BUSY; - break; - } + case EE_STATE_START: + jerry_ee_state = EE_STATE_OP_A; + break; + case EE_STATE_OP_A: + jerry_ee_op = (data << 1); + jerry_ee_state = EE_STATE_OP_B; + break; + case EE_STATE_OP_B: + jerry_ee_op |= data; + jerry_ee_direct_jump = 0; +// fprintf(log_get(),"eeprom: opcode %i\n",jerry_ee_op); + switch (jerry_ee_op) + { + case 0: jerry_ee_state = EE_STATE_0; break; + case 1: jerry_ee_state = EE_STATE_1; break; + case 2: jerry_ee_state = EE_STATE_2; break; + case 3: jerry_ee_state = EE_STATE_3; break; + } + eeprom_set_di(data); + break; + case EE_STATE_0: + jerry_ee_rstate = EE_STATE_0_0; + jerry_ee_state = EE_READ_ADDRESS; + jerry_ee_direct_jump = 1; + jerry_ee_address_cnt = 6; + jerry_ee_address_data = 0; + break; + case EE_STATE_0_0: + switch ((jerry_ee_address_data >> 4) & 0x03) + { + case 0: jerry_ee_state=EE_STATE_0_0_0; break; + case 1: jerry_ee_state=EE_STATE_0_0_1; break; + case 2: jerry_ee_state=EE_STATE_0_0_2; break; + case 3: jerry_ee_state=EE_STATE_0_0_3; break; + } + eeprom_set_di(data); + break; + case EE_STATE_0_0_0: + // writes disable + // fprintf(log_get(),"eeprom: read only\n"); + jerry_writes_enabled = 0; + jerry_ee_state = EE_STATE_START; + break; + case EE_STATE_0_0_1: + // writes all + jerry_ee_rstate = EE_STATE_0_0_1_0; + jerry_ee_state = EE_READ_DATA; + jerry_ee_data_cnt = 16; + jerry_ee_data = 0; + jerry_ee_direct_jump = 1; + break; + case EE_STATE_0_0_1_0: + // fprintf(log_get(),"eeprom: filling eeprom with 0x%.4x\n",data); + if (jerry_writes_enabled) + for(int i=0; i<64; i++) + eeprom_ram[i] = jerry_ee_data; + //else + // fprintf(log_get(),"eeprom: not writing because read only\n"); + jerry_ee_state = EE_STATE_BUSY; + break; + case EE_STATE_0_0_2: + // erase all + //fprintf(log_get(),"eeprom: erasing eeprom\n"); + if (jerry_writes_enabled) + for(int i=0; i<64; i++) + eeprom_ram[i] = 0xFFFF; + + jerry_ee_state=EE_STATE_BUSY; + break; + case EE_STATE_0_0_3: + // writes enable + //fprintf(log_get(),"eeprom: read/write\n"); + jerry_writes_enabled = 1; + jerry_ee_state = EE_STATE_START; + break; + case EE_STATE_1: + jerry_ee_rstate = EE_STATE_1_0; + jerry_ee_state = EE_READ_ADDRESS; + jerry_ee_address_cnt = 6; + jerry_ee_address_data = 0; + jerry_ee_direct_jump = 1; + break; + case EE_STATE_1_0: + jerry_ee_rstate = EE_STATE_1_1; + jerry_ee_state = EE_READ_DATA; + jerry_ee_data_cnt = 16; + jerry_ee_data = 0; + jerry_ee_direct_jump = 1; + break; + case EE_STATE_1_1: + //fprintf(log_get(),"eeprom: writing 0x%.4x at 0x%.2x\n",jerry_ee_data,jerry_ee_address_data); + if (jerry_writes_enabled) + eeprom_ram[jerry_ee_address_data] = jerry_ee_data; + jerry_ee_state = EE_STATE_BUSY; + break; + case EE_STATE_2: + jerry_ee_rstate = EE_STATE_2_0; + jerry_ee_state = EE_READ_ADDRESS; + jerry_ee_address_cnt = 6; + jerry_ee_address_data = 0; + jerry_ee_data_cnt = 16; + jerry_ee_data = 0; + break; + case EE_STATE_3: + jerry_ee_rstate = EE_STATE_3_0; + jerry_ee_state = EE_READ_ADDRESS; + jerry_ee_address_cnt = 6; + jerry_ee_address_data = 0; + jerry_ee_direct_jump = 1; + break; + case EE_STATE_3_0: + //fprintf(log_get(),"eeprom: erasing 0x%.2x\n",jerry_ee_address_data); + if (jerry_writes_enabled) + eeprom_ram[jerry_ee_address_data] = 0xFFFF; + jerry_ee_state = EE_STATE_BUSY; + break; case EE_READ_DATA: - { - //fprintf(log_get(),"eeprom:\t\t\t%i bit %i\n",data,jerry_ee_data_cnt-1); - jerry_ee_data<<=1; - jerry_ee_data|=data; - jerry_ee_data_cnt--; - if (!jerry_ee_data_cnt) - { - jerry_ee_state=jerry_ee_rstate; - if (jerry_ee_direct_jump) - eeprom_set_di(data); - } - break; - } + //fprintf(log_get(),"eeprom:\t\t\t%i bit %i\n",data,jerry_ee_data_cnt-1); + jerry_ee_data <<= 1; + jerry_ee_data |= data; + jerry_ee_data_cnt--; + if (!jerry_ee_data_cnt) + { + jerry_ee_state = jerry_ee_rstate; + if (jerry_ee_direct_jump) + eeprom_set_di(data); + } + break; case EE_READ_ADDRESS: - { - jerry_ee_address_data<<=1; - jerry_ee_address_data|=data; - jerry_ee_address_cnt--; -// fprintf(log_get(),"eeprom:\t%i bits remaining\n",jerry_ee_address_cnt); - if (!jerry_ee_address_cnt) - { - jerry_ee_state=jerry_ee_rstate; - //fprintf(log_get(),"eeprom:\t\tread address 0x%.2x\n",jerry_ee_address_data); - if (jerry_ee_direct_jump) - eeprom_set_di(data); - } - break; - } - default: { - jerry_ee_state=EE_STATE_OP_A; - break; - } - + jerry_ee_address_data <<= 1; + jerry_ee_address_data |= data; + jerry_ee_address_cnt--; +// fprintf(log_get(),"eeprom:\t%i bits remaining\n",jerry_ee_address_cnt); + if (!jerry_ee_address_cnt) + { + jerry_ee_state = jerry_ee_rstate; + //fprintf(log_get(),"eeprom:\t\tread address 0x%.2x\n",jerry_ee_address_data); + if (jerry_ee_direct_jump) + eeprom_set_di(data); + } + break; + default: + jerry_ee_state = EE_STATE_OP_A; } } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + void eeprom_set_cs(uint32 state) { // fprintf(log_get(),"eeprom: cs=%i\n",state); - jerry_ee_state=EE_STATE_START; - jerry_ee_op=0; - jerry_ee_rstate=0; - jerry_ee_address_data=0; - jerry_ee_address_cnt=6; - jerry_ee_data=0; - jerry_ee_data_cnt=16; - jerry_writes_enabled=1; + jerry_ee_state = EE_STATE_START; + jerry_ee_op = 0; + jerry_ee_rstate = 0; + jerry_ee_address_data = 0; + jerry_ee_address_cnt = 6; + jerry_ee_data = 0; + jerry_ee_data_cnt = 16; + jerry_writes_enabled = 1; } -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -////////////////////////////////////////////////////////////////////////////// + uint32 eeprom_get_do(void) { - uint16 data=1; + uint16 data = 1; + switch (jerry_ee_state) { - case EE_STATE_START: { - data=1; - break; - } - case EE_STATE_BUSY: { - jerry_ee_state=EE_STATE_START; - data=0; - break; - } - case EE_STATE_2_0: { - jerry_ee_data_cnt--; - data=((eeprom_ram[jerry_ee_address_data]&(1<>jerry_ee_data_cnt); - if (!jerry_ee_data_cnt) - { - //fprintf(log_get(),"eeprom: read 0x%.4x at 0x%.2x cpu %i pc=0x%.8x\n",eeprom_ram[jerry_ee_address_data],jerry_ee_address_data,jaguar_cpu_in_exec,s68000readPC()); - jerry_ee_state=EE_STATE_START; - } - break; - } + case EE_STATE_START: + data = 1; + break; + case EE_STATE_BUSY: + jerry_ee_state = EE_STATE_START; + data = 0; + break; + case EE_STATE_2_0: + jerry_ee_data_cnt--; + data = (eeprom_ram[jerry_ee_address_data] & (1 << jerry_ee_data_cnt)) >> jerry_ee_data_cnt; + if (!jerry_ee_data_cnt) + { + //fprintf(log_get(),"eeprom: read 0x%.4x at 0x%.2x cpu %i pc=0x%.8x\n",eeprom_ram[jerry_ee_address_data],jerry_ee_address_data,jaguar_cpu_in_exec,s68000readPC()); + jerry_ee_state = EE_STATE_START; + } + break; } + // fprintf(log_get(),"eeprom: do=%i\n",data); - return(data); + return data; }