| 537 | } |
| 538 | |
| 539 | void smap_write8(u32 addr, u8 value) |
| 540 | { |
| 541 | std::unique_lock<std::mutex> reset_lock(reset_mutex, std::defer_lock); |
| 542 | std::unique_lock<std::mutex> counter_lock(frame_counter_mutex, std::defer_lock); |
| 543 | switch (addr) |
| 544 | { |
| 545 | case SMAP_R_TXFIFO_FRAME_INC: |
| 546 | //DevCon.WriteLn("DEV9: SMAP_R_TXFIFO_FRAME_INC 8bit write %x", value); |
| 547 | { |
| 548 | dev9Ru8(SMAP_R_TXFIFO_FRAME_CNT)++; |
| 549 | } |
| 550 | return; |
| 551 | |
| 552 | case SMAP_R_RXFIFO_FRAME_DEC: |
| 553 | //DevCon.WriteLn("DEV9: SMAP_R_RXFIFO_FRAME_DEC 8bit write %x", value); |
| 554 | counter_lock.lock(); |
| 555 | dev9Ru8(addr) = value; |
| 556 | { |
| 557 | dev9Ru8(SMAP_R_RXFIFO_FRAME_CNT)--; |
| 558 | } |
| 559 | counter_lock.unlock(); |
| 560 | return; |
| 561 | |
| 562 | case SMAP_R_TXFIFO_CTRL: |
| 563 | //DevCon.WriteLn("DEV9: SMAP_R_TXFIFO_CTRL 8bit write %x", value); |
| 564 | if (value & SMAP_TXFIFO_RESET) |
| 565 | { |
| 566 | dev9.txbdi = 0; |
| 567 | dev9.txfifo_rd_ptr = 0; |
| 568 | dev9Ru8(SMAP_R_TXFIFO_FRAME_CNT) = 0; //this actualy needs to be atomic (lock mov ...) |
| 569 | dev9Ru32(SMAP_R_TXFIFO_WR_PTR) = 0; |
| 570 | dev9Ru32(SMAP_R_TXFIFO_SIZE) = 16384; |
| 571 | } |
| 572 | value &= ~SMAP_TXFIFO_RESET; |
| 573 | dev9Ru8(addr) = value; |
| 574 | return; |
| 575 | |
| 576 | case SMAP_R_RXFIFO_CTRL: |
| 577 | //DevCon.WriteLn("DEV9: SMAP_R_RXFIFO_CTRL 8bit write %x", value); |
| 578 | if (value & SMAP_RXFIFO_RESET) |
| 579 | { |
| 580 | std::scoped_lock lock(reset_lock, counter_lock); |
| 581 | dev9.rxbdi = 0; |
| 582 | dev9.rxfifo_wr_ptr = 0; |
| 583 | dev9Ru8(SMAP_R_RXFIFO_FRAME_CNT) = 0; |
| 584 | dev9Ru32(SMAP_R_RXFIFO_RD_PTR) = 0; |
| 585 | dev9Ru32(SMAP_R_RXFIFO_SIZE) = 16384; |
| 586 | } |
| 587 | value &= ~SMAP_RXFIFO_RESET; |
| 588 | dev9Ru8(addr) = value; |
| 589 | return; |
| 590 | |
| 591 | case SMAP_R_BD_MODE: |
| 592 | if (value & SMAP_BD_SWAP) |
| 593 | { |
| 594 | DevCon.WriteLn("DEV9: SMAP_R_BD_MODE: Byteswapping enabled."); |
| 595 | dev9.bd_swap = 1; |
| 596 | } |
no test coverage detected