/*************************************** ***************************************/ function cpu_dump(d, prg_size, crc) { cpu_write(d, 0x8000, 0x0); cpu_write(d, 0x8001, 0x0); cpu_write(d, 0x8002, 0x0); cpu_write(d, 0x8003, 0x0); for(local i = 0; i < (prg_size/0x4000) ; i += 1) { if(i==16) { cpu_write(d, 0x8000, 0x1); cpu_write(d, 0x8001, 0x1); cpu_write(d, 0x8002, 0x1); cpu_write(d, 0x8003, 0x1); } cpu_write(d, 0x8008, i); cpu_read(d, 0x8000, 0x2000 * 2); } //reset to 1st 256K bank cpu_write(d, 0x8000, 0x0); cpu_write(d, 0x8001, 0x0); cpu_write(d, 0x8002, 0x0); cpu_write(d, 0x8003, 0x0); } function ppu_dump(d, chr_size, crc) { for(local i = 0; i < chr_size/0x400; i+=8){ cpu_write(d, 0x8000, (i)|0,0x8001, (i)|1 ); cpu_write(d, 0x8002, (i)|2,0x8003, (i)|3 ); cpu_write(d, 0x8004, (i)|4,0x8005, (i)|5 ); cpu_write(d, 0x8006, (i)|6,0x8007, (i)|7 ); cpu_write(d, 0x6000, (i)|0,0x6001, (i)|1 ); cpu_write(d, 0x6002, (i)|2,0x6003, (i)|3 ); cpu_write(d, 0x6004, (i)|4,0x6005, (i)|5 ); cpu_write(d, 0x6006, (i)|6,0x6007, (i)|7 ); ppu_read(d, 0x0000, 0x400 * 8); } } /* $800d 7 data direction 0:FCG3->EEPROM (write), 1:EEPROM->FCG3 (read) 6 data, FCG3 -> EEPROM 5 clock $6000-$7fff 4 data, EEPROM -> FCG3 */ const I2C_READBIT = 4; const I2C_DIRBIT = 7; const I2C_WRITEBIT = 6; const I2C_CLOCKBIT = 5; I2C_DIR_READ <- 1 << I2C_DIRBIT; I2C_DIR_WRITE <- 0 << I2C_DIRBIT; I2C_SEND_H <- 1 << I2C_WRITEBIT; I2C_SEND_L <- 0 << I2C_WRITEBIT; I2C_CLOCK_H <- 1 << I2C_CLOCKBIT; I2C_CLOCK_L <- 0 << I2C_CLOCKBIT; function i2c_start(d) { cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_L); cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_H); cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_H | I2C_SEND_H); cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_H | I2C_SEND_L); cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_L); } function i2c_stop(d) { cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_L); cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_H | I2C_SEND_L); cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_H | I2C_SEND_H); cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_H); cpu_write(d, 0x800d, I2C_DIR_READ | I2C_CLOCK_L | I2C_SEND_H); } function i2c_ack_wait(d) { cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_H); cpu_write(d, 0x800d, I2C_DIR_READ | I2C_CLOCK_H | I2C_SEND_L); local n = cpu_read_register(d, 0x6000, 0); n = n & (1 << I2C_READBIT); return n == 0; } function send_bit(d, v) { cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_L); cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | v); cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_H | v); } function i2c_address_set(d, address, rw) { do{ local a = address; i2c_start(d); for(local i = 0; i < 7; i++){ send_bit(d, a & I2C_SEND_H); a = a << 1; } send_bit(d, rw); }while(i2c_ack_wait(d) != true); } function eeprom_address_set(d, address) { for(local i = 0; i < 8; i++){ local n = I2C_SEND_L; if(address & 0x80){ n = I2C_SEND_H; } send_bit(d, n); address = address << 1; } i2c_ack_wait(d); } function cpu_ram_x24c01(d, pagesize, banksize) { local I2C_WRITE = I2C_SEND_L; local I2C_READ = I2C_SEND_H; if(mode_is_read(d) == true) { //sequential read i2c_address_set(d, 0, I2C_READ); for(local i = 0; i < pagesize * banksize; i++){ for(local bit = 0; bit < 8; bit++){ cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_H); cpu_write(d, 0x800d, I2C_DIR_READ | I2C_CLOCK_H | I2C_SEND_H); cpu_read_bit_msb(d, 0x6000, 4); } //send ack send_bit(d, I2C_SEND_L); } i2c_stop(d); }else{ //page write (4byte) for(local i = 0; i < pagesize * banksize; i+=4){ i2c_address_set(d, i, I2C_WRITE); for(local j = 0; j < 4; j++){ for(local bit = 0; bit < 8; bit++){ local n = I2C_SEND_L; if(cpu_fetch_bit_msb(d) != 0){ n = I2C_SEND_H; } send_bit(d, n); } i2c_ack_wait(d); } i2c_stop(d); } } } function cpu_ram_x24c02(d, pagesize, banksize) { local I2C_WRITE = I2C_SEND_L; local I2C_READ = I2C_SEND_H; if(mode_is_read(d) == true){ //sequenctial read i2c_address_set(d, 0x50, I2C_WRITE); eeprom_address_set(d, 0); i2c_address_set(d, 0x50, I2C_READ); for(local i = 0; i < pagesize * banksize; i++){ for(local bit = 0; bit < 8; bit++){ cpu_write(d, 0x800d, I2C_DIR_WRITE | I2C_CLOCK_L | I2C_SEND_H); cpu_write(d, 0x800d, I2C_DIR_READ | I2C_CLOCK_H | I2C_SEND_H); cpu_read_bit_msb(d, 0x6000, 4); } //send ack send_bit(d, I2C_SEND_L); } i2c_stop(d); }else{ //page write. 4byte for(local i = 0; i < pagesize * banksize; i+=4){ i2c_address_set(d, 0x50, I2C_WRITE); eeprom_address_set(d, i); for(local j = 0; j < 4; j++){ for(local bit = 0; bit < 8; bit++){ local n = I2C_SEND_L; if(cpu_fetch_bit_msb(d) != 0){ n = I2C_SEND_H; } send_bit(d, n); } i2c_ack_wait(d); } i2c_stop(d); } } } function ram_dump(d, prg_size, banksize) { }