| 453 | }; |
| 454 | |
| 455 | static uint8_t mem_read_flash_parallel(uint32_t addr) { |
| 456 | uint8_t value = 0; |
| 457 | unsigned int selected; |
| 458 | |
| 459 | if (likely(addr < flash.mask)) { |
| 460 | if (unlikely(++cpu.flashTotalAccesses == 0)) { |
| 461 | cpu.flashTotalAccesses = 0x80000000; |
| 462 | cpu.flashDelayCycles >>= 1; |
| 463 | } |
| 464 | cpu.cycles += flash.waitStates; |
| 465 | |
| 466 | switch(mem.flash.command) { |
| 467 | case FLASH_NO_COMMAND: |
| 468 | value = mem.flash.block[addr & (SIZE_FLASH - 1)]; |
| 469 | break; |
| 470 | case FLASH_SECTOR_ERASE: |
| 471 | value = 0x80; |
| 472 | mem.flash.read++; |
| 473 | if (mem.flash.read == 3) { |
| 474 | mem.flash.read = 0; |
| 475 | mem.flash.command = FLASH_NO_COMMAND; |
| 476 | } |
| 477 | break; |
| 478 | case FLASH_CHIP_ERASE: |
| 479 | value = 0xFF; |
| 480 | mem.flash.command = FLASH_NO_COMMAND; |
| 481 | break; |
| 482 | case FLASH_READ_SECTOR_PROTECTION: |
| 483 | if (addr < 0x10000) { |
| 484 | selected = addr / SIZE_FLASH_SECTOR_8K; |
| 485 | value = !(mem.flash.sector8k[selected].ipb & mem.flash.sector8k[selected].dpb); |
| 486 | } else { |
| 487 | selected = addr / SIZE_FLASH_SECTOR_64K; |
| 488 | value = !(mem.flash.sector[selected].ipb & mem.flash.sector[selected].dpb); |
| 489 | } |
| 490 | break; |
| 491 | case FLASH_READ_CFI: |
| 492 | if (addr >= 0x20 && addr <= 0x2A) { |
| 493 | static const uint8_t id[7] = { 0x51, 0x52, 0x59, 0x02, 0x00, 0x40, 0x00 }; |
| 494 | value = id[(addr - 0x20) / 2]; |
| 495 | } else if (addr >= 0x36 && addr <= 0x50) { |
| 496 | static const uint8_t id[] = { |
| 497 | 0x27, 0x36, 0x00, 0x00, 0x03, 0x04, 0x08, 0x0E, |
| 498 | 0x03, 0x05, 0x03, 0x03, 0x16, 0x02, 0x00, 0x05, |
| 499 | 0x00, 0x01, 0x08, 0x00, 0x00, 0x3F, 0x00, 0x00, |
| 500 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 501 | 0x00, 0x00, 0x50, 0x52, 0x49, 0x31, 0x33, 0x0C, |
| 502 | 0x02, 0x01, 0x00, 0x08, 0x00, 0x00, 0x02, 0x95, |
| 503 | 0xA5, 0x02, 0x01 }; |
| 504 | value = id[(addr - 0x36) / 2]; |
| 505 | } |
| 506 | break; |
| 507 | case FLASH_DEEP_POWER_DOWN: |
| 508 | break; |
| 509 | case FLASH_IPB_MODE: |
| 510 | if (addr < 0x10000) { |
| 511 | selected = addr / SIZE_FLASH_SECTOR_8K; |
| 512 | value = mem.flash.sector8k[selected].ipb; |
nothing calls this directly
no test coverage detected