| 315 | Console.Error("DEV9: UNDERFLOW BY IOP"); |
| 316 | } |
| 317 | void IOPWriteFIFO() |
| 318 | { |
| 319 | pxAssert((dev9.dma_iop_ptr != nullptr) && (dev9.xfr_ctrl & SPD_XFR_DMAEN)); |
| 320 | pxAssert(dev9.xfr_ctrl & SPD_XFR_WRITE); |
| 321 | |
| 322 | const int unread = (dev9.fifo_bytes_write - dev9.fifo_bytes_read); |
| 323 | const int space = (SPD_DBUF_AVAIL_MAX * 512 - unread); |
| 324 | const int base = dev9.fifo_bytes_write % (SPD_DBUF_AVAIL_MAX * 512); |
| 325 | |
| 326 | const int remain = dev9.dma_iop_size - dev9.dma_iop_transfered; |
| 327 | const int write = std::min(remain, space); |
| 328 | |
| 329 | pxAssert(unread <= SPD_DBUF_AVAIL_MAX * 512); |
| 330 | |
| 331 | if (write == 0) |
| 332 | return; |
| 333 | |
| 334 | if (base + write > SPD_DBUF_AVAIL_MAX * 512) |
| 335 | { |
| 336 | const int was = SPD_DBUF_AVAIL_MAX * 512 - base; |
| 337 | |
| 338 | std::memcpy(dev9.fifo + base, dev9.dma_iop_ptr + dev9.dma_iop_transfered, was); |
| 339 | std::memcpy(dev9.fifo + base, dev9.dma_iop_ptr + dev9.dma_iop_transfered + was, write - was); |
| 340 | } |
| 341 | else |
| 342 | { |
| 343 | std::memcpy(dev9.fifo + base, dev9.dma_iop_ptr + dev9.dma_iop_transfered, write); |
| 344 | } |
| 345 | |
| 346 | dev9.dma_iop_transfered += write; |
| 347 | dev9.fifo_bytes_write += write; |
| 348 | if ((dev9.fifo_bytes_write - dev9.fifo_bytes_read) > SPD_DBUF_AVAIL_MAX * 512) |
| 349 | Console.Error("DEV9: OVERFLOW BY IOP"); |
| 350 | } |
| 351 | void FIFOIntr() |
| 352 | { |
| 353 | //FIFO Buffer Full/Empty |
no test coverage detected