/* * data_adjust - アイテムの整理 */ void data_adjust(DATA_INFO **root) { DATA_INFO *di = *root; DATA_INFO *wk_di; while (di != NULL) { if (di->type == TYPE_ITEM && di->child == NULL) { wk_di = di->next; // 削除 data_delete(root, di, TRUE); di = wk_di; } else { if (di->type == TYPE_FOLDER) { data_adjust(&di->child); } di = di->next; } } }
void SPC7110::mmio_write(unsigned addr, uint8 data) { addr &= 0xffff; switch(addr) { //================== //decompression unit //================== case 0x4801: r4801 = data; break; case 0x4802: r4802 = data; break; case 0x4803: r4803 = data; break; case 0x4804: r4804 = data; break; case 0x4805: r4805 = data; break; case 0x4806: { r4806 = data; unsigned table = (r4801 + (r4802 << 8) + (r4803 << 16)); unsigned index = (r4804 << 2); unsigned length = (r4809 + (r480a << 8)); unsigned addr = datarom_addr(table + index); unsigned mode = (cartridge.rom.read(addr + 0)); unsigned offset = (cartridge.rom.read(addr + 1) << 16) + (cartridge.rom.read(addr + 2) << 8) + (cartridge.rom.read(addr + 3) << 0); decomp.init(mode, offset, (r4805 + (r4806 << 8)) << mode); r480c = 0x80; } break; case 0x4807: r4807 = data; break; case 0x4808: r4808 = data; break; case 0x4809: r4809 = data; break; case 0x480a: r480a = data; break; case 0x480b: r480b = data; break; //============== //data port unit //============== case 0x4811: r4811 = data; r481x |= 0x01; break; case 0x4812: r4812 = data; r481x |= 0x02; break; case 0x4813: r4813 = data; r481x |= 0x04; break; case 0x4814: { r4814 = data; r4814_latch = true; if(!r4815_latch) break; if(!(r4818 & 2)) break; if(r4818 & 0x10) break; if((r4818 & 0x60) == 0x20) { unsigned increment = data_adjust() & 0xff; if(r4818 & 8) increment = (int8)increment; //8-bit sign extend set_data_pointer(data_pointer() + increment); } else if((r4818 & 0x60) == 0x40) { unsigned increment = data_adjust(); if(r4818 & 8) increment = (int16)increment; //16-bit sign extend set_data_pointer(data_pointer() + increment); } } break; case 0x4815: { r4815 = data; r4815_latch = true; if(!r4814_latch) break; if(!(r4818 & 2)) break; if(r4818 & 0x10) break; if((r4818 & 0x60) == 0x20) { unsigned increment = data_adjust() & 0xff; if(r4818 & 8) increment = (int8)increment; //8-bit sign extend set_data_pointer(data_pointer() + increment); } else if((r4818 & 0x60) == 0x40) { unsigned increment = data_adjust(); if(r4818 & 8) increment = (int16)increment; //16-bit sign extend set_data_pointer(data_pointer() + increment); } } break; case 0x4816: r4816 = data; break; case 0x4817: r4817 = data; break; case 0x4818: { if(r481x != 0x07) break; r4818 = data; r4814_latch = r4815_latch = false; } break; //========= //math unit //========= case 0x4820: r4820 = data; break; case 0x4821: r4821 = data; break; case 0x4822: r4822 = data; break; case 0x4823: r4823 = data; break; case 0x4824: r4824 = data; break; case 0x4825: { r4825 = data; if(r482e & 1) { //signed 16-bit x 16-bit multiplication int16 r0 = (int16)(r4824 + (r4825 << 8)); int16 r1 = (int16)(r4820 + (r4821 << 8)); signed result = r0 * r1; r4828 = result; r4829 = result >> 8; r482a = result >> 16; r482b = result >> 24; } else { //unsigned 16-bit x 16-bit multiplication uint16 r0 = (uint16)(r4824 + (r4825 << 8)); uint16 r1 = (uint16)(r4820 + (r4821 << 8)); unsigned result = r0 * r1; r4828 = result; r4829 = result >> 8; r482a = result >> 16; r482b = result >> 24; } r482f = 0x80; } break;
uint8 SPC7110::mmio_read(unsigned addr) { addr &= 0xffff; switch(addr) { //================== //decompression unit //================== case 0x4800: { uint16 counter = (r4809 + (r480a << 8)); counter--; r4809 = counter; r480a = counter >> 8; return decomp.read(); } case 0x4801: return r4801; case 0x4802: return r4802; case 0x4803: return r4803; case 0x4804: return r4804; case 0x4805: return r4805; case 0x4806: return r4806; case 0x4807: return r4807; case 0x4808: return r4808; case 0x4809: return r4809; case 0x480a: return r480a; case 0x480b: return r480b; case 0x480c: { uint8 status = r480c; r480c &= 0x7f; return status; } //============== //data port unit //============== case 0x4810: { if(r481x != 0x07) return 0x00; unsigned addr = data_pointer(); unsigned adjust = data_adjust(); if(r4818 & 8) adjust = (int16)adjust; //16-bit sign extend unsigned adjustaddr = addr; if(r4818 & 2) { adjustaddr += adjust; set_data_adjust(adjust + 1); } uint8 data = cartridge.rom.read(datarom_addr(adjustaddr)); if(!(r4818 & 2)) { unsigned increment = (r4818 & 1) ? data_increment() : 1; if(r4818 & 4) increment = (int16)increment; //16-bit sign extend if((r4818 & 16) == 0) { set_data_pointer(addr + increment); } else { set_data_adjust(adjust + increment); } } return data; } case 0x4811: return r4811; case 0x4812: return r4812; case 0x4813: return r4813; case 0x4814: return r4814; case 0x4815: return r4815; case 0x4816: return r4816; case 0x4817: return r4817; case 0x4818: return r4818; case 0x481a: { if(r481x != 0x07) return 0x00; unsigned addr = data_pointer(); unsigned adjust = data_adjust(); if(r4818 & 8) adjust = (int16)adjust; //16-bit sign extend uint8 data = cartridge.rom.read(datarom_addr(addr + adjust)); if((r4818 & 0x60) == 0x60) { if((r4818 & 16) == 0) { set_data_pointer(addr + adjust); } else { set_data_adjust(adjust + adjust); } } return data; } //========= //math unit //========= case 0x4820: return r4820; case 0x4821: return r4821; case 0x4822: return r4822; case 0x4823: return r4823; case 0x4824: return r4824; case 0x4825: return r4825; case 0x4826: return r4826; case 0x4827: return r4827; case 0x4828: return r4828; case 0x4829: return r4829; case 0x482a: return r482a; case 0x482b: return r482b; case 0x482c: return r482c; case 0x482d: return r482d; case 0x482e: return r482e; case 0x482f: { uint8 status = r482f; r482f &= 0x7f; return status; } //=================== //memory mapping unit //=================== case 0x4830: return r4830; case 0x4831: return r4831; case 0x4832: return r4832; case 0x4833: return r4833; case 0x4834: return r4834; //==================== //real-time clock unit //==================== case 0x4840: return r4840; case 0x4841: { if(rtc_state == RTCS_Inactive || rtc_state == RTCS_ModeSelect) return 0x00; r4842 = 0x80; uint8 data = rtc[rtc_index]; rtc_index = (rtc_index + 1) & 15; return data; } case 0x4842: { uint8 status = r4842; r4842 &= 0x7f; return status; } } return cpu.regs.mdr; }