2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
13 #define SET_BANK(s, e, w, r) { \
14 int sb = (s) >> 11, eb = (e) >> 11; \
15 for(int i = sb; i <= eb; i++) { \
19 wbank[i] = (w) + 0x800 * (i - sb); \
24 rbank[i] = (r) + 0x800 * (i - sb); \
29 void TF20::initialize()
33 memset(rom, 0xff, sizeof(rom));
34 memset(ram, 0, sizeof(ram));
35 memset(rdmy, 0xff, sizeof(rdmy));
38 FILEIO* fio = new FILEIO();
39 if(fio->Fopen(create_local_path(_T("TF20.ROM")), FILEIO_READ_BINARY)) {
40 fio->Fread(rom, sizeof(rom), 1);
42 } else if(fio->Fopen(create_local_path(_T("DISK.ROM")), FILEIO_READ_BINARY)) {
43 fio->Fread(rom, sizeof(rom), 1);
47 d_cpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
52 SET_BANK(0x0000, 0xffff, ram, ram);
57 SET_BANK(0x0000, 0x07ff, ram, rom);
61 uint32_t TF20::read_data8(uint32_t addr)
64 return rbank[addr >> 11][addr & 0x7ff];
67 void TF20::write_data8(uint32_t addr, uint32_t data)
70 wbank[addr >> 11][addr & 0x7ff] = data;
74 xxF0H-F3H R/W uPD7201 (A=A0 B=A1)
75 xxF6H R Shadow ROM Separation
76 xxF7H R Dip Switch (D0-D3)
78 xxF8H W FDDMotor ON/OFF (DO1=ON)
79 xxFAH R uPD765A Status Register
80 xxFBH R/W uPD765A Data Register
83 6-1 DriveA: OFF.ON.OFF.OFF.OFF.ON
84 DriveB: OFF,ON,OFF,OFF,ON,OFF
87 uint32_t TF20::read_io8(uint32_t addr)
94 return d_sio->read_io8(addr);
96 SET_BANK(0x0000, 0x07ff, ram, ram);
100 return 0xf0 | (drive_no & 0x0f);
102 d_fdc->write_signal(SIG_UPD765A_TC, 1, 1);
106 return d_fdc->read_io8(addr);
110 return d_pio->read_io8(addr);
115 void TF20::write_io8(uint32_t addr, uint32_t data)
117 switch(addr & 0xff) {
122 d_sio->write_io8(addr, data);
125 d_fdc->write_signal(SIG_UPD765A_TC, 1, 1);
128 d_fdc->write_io8(addr, data);
134 d_pio->write_io8(addr, data);
139 uint32_t TF20::get_intr_ack()
144 #define STATE_VERSION 1
146 bool TF20::process_state(FILEIO* state_fio, bool loading)
148 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
151 if(!state_fio->StateCheckInt32(this_device_id)) {
154 state_fio->StateBuffer(ram, sizeof(ram), 1);
155 state_fio->StateBool(rom_selected);
160 SET_BANK(0x0000, 0x07ff, ram, rom);
162 SET_BANK(0x0000, 0x07ff, ram, ram);