Mirror of CollapseOS
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
1.5KB

  1. #include <string.h>
  2. #include "at28.h"
  3. void at28_init(AT28 *at28, Z80Context *cpu, ushort startoffset, ushort size)
  4. {
  5. at28->cpu = cpu;
  6. memset(at28->mem, 0, LEN16BIT);
  7. at28->startoffset = startoffset;
  8. at28->size = size;
  9. at28->wrstamp = 0;
  10. }
  11. static void _maybe_end_write(AT28 *at28)
  12. {
  13. unsigned int ts = at28->cpu->tstates;
  14. unsigned int stamp = at28->wrstamp;
  15. // if ts < stamp, it means that the CPU re-initialized its counter
  16. if (stamp && ((ts < stamp) || (ts > stamp+80000))) {
  17. at28->mem[at28->wraddr] = at28->wrval;
  18. at28->wrstamp = 0;
  19. }
  20. }
  21. byte at28_mem_read(AT28 *at28, ushort addr)
  22. {
  23. _maybe_end_write(at28);
  24. if ((addr >= at28->startoffset) && (addr < at28->startoffset+at28->size)) {
  25. if (at28->wrstamp) {
  26. if (addr == at28->wraddr) {
  27. // poll
  28. at28->pollval ^= 0b01000000; // bit 6 toggle
  29. return at28->pollval;
  30. } else {
  31. // reading another addr interrupts write
  32. at28->wrstamp = 0;
  33. }
  34. }
  35. return at28->mem[addr];
  36. } else {
  37. return emul_mem_read(0, addr);
  38. }
  39. }
  40. void at28_mem_write(AT28 *at28, ushort addr, byte val)
  41. {
  42. _maybe_end_write(at28);
  43. if ((addr >= at28->startoffset) && (addr < at28->startoffset+at28->size)) {
  44. at28->wrstamp = at28->cpu->tstates;
  45. at28->wraddr = addr;
  46. at28->wrval = at28->pollval = val;
  47. } else {
  48. emul_mem_write(0, addr, val);
  49. }
  50. }