| 874 | } |
| 875 | |
| 876 | uae_u32 flash_read(void *fdv, uaecptr addr) |
| 877 | { |
| 878 | struct flashrom_data *fd = (struct flashrom_data*)fdv; |
| 879 | uae_u8 v = 0xff; |
| 880 | int other_byte_mult = 1; |
| 881 | #if FLASH_LOG > 1 |
| 882 | uaecptr oaddr = addr; |
| 883 | #endif |
| 884 | |
| 885 | if (!fd) |
| 886 | return 0; |
| 887 | |
| 888 | if (fd->flags & (FLASHROM_EVERY_OTHER_BYTE | FLASHROM_SKIP_EVERY_OTHER_BYTE)) { |
| 889 | addr >>= 1; |
| 890 | other_byte_mult = 2; |
| 891 | } |
| 892 | |
| 893 | if (addr * other_byte_mult >= fd->allocsize) { |
| 894 | return 0xff; |
| 895 | } |
| 896 | |
| 897 | addr &= fd->mask; |
| 898 | |
| 899 | // write data in pagebuffer when any read is done |
| 900 | if ((fd->flags & FLASHROM_PARALLEL_EEPROM) && fd->pagemodified) { |
| 901 | fd->pagemodified = false; |
| 902 | for (int i = 0; i < fd->pagesize; i++) { |
| 903 | int offset = fd->lastpagewrite + i; |
| 904 | if (fd->mpage[i]) { |
| 905 | if (fd->rom[offset] != fd->page[i]) { |
| 906 | fd->rom[offset] = fd->page[i]; |
| 907 | setmodified(fd, offset); |
| 908 | } |
| 909 | fd->mpage[i] = false; |
| 910 | } |
| 911 | } |
| 912 | } |
| 913 | |
| 914 | if (fd->state == 3) { |
| 915 | uae_u8 a = addr & 0xff; |
| 916 | if (a == 0) |
| 917 | v = fd->mfgcode; |
| 918 | if (a == 1) |
| 919 | v = fd->devicecode; |
| 920 | if (a == 2) |
| 921 | v = 0x00; |
| 922 | gui_flicker_led (LED_MD, 0, 1); |
| 923 | } else if (fd->state >= 200) { |
| 924 | v = 0; |
| 925 | if (fd->state & 1) |
| 926 | v ^= 0x40; |
| 927 | fd->state++; |
| 928 | if (fd->state >= 210) |
| 929 | fd->state = 0; |
| 930 | v |= 0x08; |
| 931 | } else if (fd->state > 7) { |
| 932 | v = (fd->rom[addr * other_byte_mult] & 0x80) ^ 0x80; |
| 933 | if (fd->state & 1) |
no test coverage detected