void TOWNS_DMAC::do_dma_inc_dec_ptr_8bit(int c)
{
// Note: FM-Towns may extend to 32bit.
+ int32_t incdec = ((dma[c].mode & 0x20) == 0) ? 1 : -1;
+ uint32_t addr = dma[c].areg;
+ uint32_t high_a = addr & 0xff000000;
__LIKELY_IF(dma_wrap_reg != 0) {
- uint32_t high_a = dma[c].areg & 0xff000000;
- if(dma[c].mode & 0x20) {
- dma[c].areg = dma[c].areg - 1;
- } else {
- dma[c].areg = dma[c].areg + 1;
- }
- dma[c].areg = ((dma[c].areg & 0x00ffffff) | high_a) & dma_addr_mask;
+ addr = (addr + incdec) & 0x00ffffff;
+ addr = addr | high_a;
} else {
- if(dma[c].mode & 0x20) {
- dma[c].areg = (dma[c].areg - 1) & dma_addr_mask;
- } else {
- dma[c].areg = (dma[c].areg + 1) & dma_addr_mask;
- }
+ addr = (addr + incdec) & 0xffffffff;
}
+ dma[c].areg = addr;
}
void TOWNS_DMAC::do_dma_inc_dec_ptr_16bit(int c)
{
// Note: FM-Towns may extend to 32bit.
+ int32_t incdec = ((dma[c].mode & 0x20) == 0) ? 2 : -2;
+ uint32_t addr = dma[c].areg;
+ uint32_t high_a = addr & 0xff000000;
__LIKELY_IF(dma_wrap_reg != 0) {
- uint32_t high_a = dma[c].areg & 0xff000000;
- if(dma[c].mode & 0x20) {
- dma[c].areg = dma[c].areg - 2;
- } else {
- dma[c].areg = dma[c].areg + 2;
- }
- dma[c].areg = ((dma[c].areg & 0x00ffffff) | high_a) & dma_addr_mask;
+ addr = (addr + incdec) & 0x00ffffff;
+ addr = addr | high_a;
} else {
- if(dma[c].mode & 0x20) {
- dma[c].areg = (dma[c].areg - 2) & dma_addr_mask;
- } else {
- dma[c].areg = (dma[c].areg + 2) & dma_addr_mask;
- }
+ addr = (addr + incdec) & 0xffffffff;
}
+ dma[c].areg = addr;
}
#if 0 /* For Debug */
dma->set_context_debugger(new DEBUGGER(this, emu));
extra_dma->set_context_debugger(new DEBUGGER(this, emu));
#endif
- //dma->set_context_cpu(cpu);
+ dma->set_context_cpu(cpu);
dma->set_context_memory(memory);
dma->set_context_ch0(fdc);
dma->set_context_ch1(scsi_host);
cmd = data & 0xffff;
break;
default:
- write_io8(addr & 0x0e, data);
-// write_io8(addr, data);
+// write_io8(addr & 0x0e, data);
+ write_io8(addr, data);
break;
}
// } else {
}
// verify
uint32_t val = dma[c].dev->read_dma_io8w(0, &wait_1);
- reset_ube(c);
-
uint32_t val2;
__UNLIKELY_IF(__debugging) {
val2 = d_debugger->read_via_debugger_data8w(dma[c].areg, &wait_2);
} else {
val2 = read_via_debugger_data8w(dma[c].areg, &wait_2);
}
-
+ reset_ube(c);
// ToDo: Compare val1 and val2.
// update temporary register
- tmp = (tmp >> 8) | (val2 << 8);
+ tmp = (tmp >> 8) | (val << 8);
wait += compressed ? 5 : 7;
if(extended) {
__debugging = d_debugger->now_device_debugging;
}
uint32_t val;
- //reset_ube(c);
+ reset_ube(c);
val = dma[c].dev->read_dma_io8w(0, &wait_r);
// update temporary register
tmp = (tmp >> 8) | (val << 8);
// verify
bool __debugging = false;
int wait_1 = 0, wait_2 = 0;
- set_ube(c);
+
__LIKELY_IF((__USE_DEBUGGER) && (d_debugger != NULL)) {
__debugging = d_debugger->now_device_debugging;
}
// verify
uint32_t val = dma[c].dev->read_dma_io16w(0, &wait_1);
-
+ set_ube(c);
uint32_t val2;
__UNLIKELY_IF(__debugging) {
val2 = d_debugger->read_via_debugger_data16w(dma[c].areg, &wait_2);
// ToDo: Compare val1 and val2.
// update temporary register
- tmp = val2;
+ tmp = val;
wait += compressed ? 5 : 7;
if(extended) {
// -- 20200316 K.O
if((dma[c].mode & 0xc0) == 0x40){
// single mode
-// req &= ~bit;
-// sreq &= ~bit;
+ req &= ~bit;
+ sreq &= ~bit;
running = false;
return true;
+ } else if((dma[c].mode & 0xc0) == 0x00){
+ // single mode
+ req &= ~bit;
+ sreq &= ~bit;
+ return true;
}
+
#endif
return false;
}
}
}
uint8_t bit = 1 << c;
- bool dmastat = false;
+
if(((req | sreq) & bit) /*&& !(mask & bit)*/) {
// execute dma
//while((req | sreq) & bit) { // Q: Will use burst transfer? 20230319 K.O