shared_memory.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * =====================================================================================
  3. *
  4. * ________ .__ __ ________ ____ ________
  5. * \_____ \ __ __|__| ____ | | __\______ \ _______ _/_ |/ _____/
  6. * / / \ \| | \ |/ ___\| |/ / | | \_/ __ \ \/ /| / __ \
  7. * / \_/. \ | / \ \___| < | ` \ ___/\ / | \ |__\ \
  8. * \_____\ \_/____/|__|\___ >__|_ \/_______ /\___ >\_/ |___|\_____ /
  9. * \__> \/ \/ \/ \/ \/
  10. *
  11. * www.optixx.org
  12. *
  13. *
  14. * Version: 1.0
  15. * Created: 07/21/2009 03:32:16 PM
  16. * Author: david@optixx.org
  17. *
  18. * =====================================================================================
  19. */
  20. #include <stdlib.h>
  21. #include <stdint.h>
  22. #include <util/delay.h>
  23. #include "shared_memory.h"
  24. #include "config.h"
  25. #include "sram.h"
  26. #include "debug.h"
  27. #include "info.h"
  28. uint8_t irq_addr_lo;
  29. uint8_t irq_addr_hi;
  30. uint8_t scratchpad_state;
  31. uint8_t scratchpad_cmd;
  32. uint8_t scratchpad_payload;
  33. void shared_memory_scratchpad_save(){
  34. scratchpad_state = sram_read(SHARED_MEM_LOC_STATE);
  35. scratchpad_cmd = sram_read(SHARED_MEM_LOC_CMD);
  36. scratchpad_payload = sram_read(SHARED_MEM_LOC_PAYLOAD);
  37. }
  38. void shared_memory_scratchpad_restore(){
  39. sram_write(SHARED_MEM_LOC_STATE, scratchpad_state);
  40. sram_write(SHARED_MEM_LOC_CMD, scratchpad_cmd);
  41. sram_write(SHARED_MEM_LOC_PAYLOAD, scratchpad_payload);
  42. }
  43. void shared_memory_irq_hook(){
  44. irq_addr_lo = sram_read(SHARED_IRQ_LOC_LO);
  45. irq_addr_hi = sram_read(SHARED_IRQ_LOC_HI);
  46. sram_write(SHARED_IRQ_HANDLER_LO, 0);
  47. sram_write(SHARED_IRQ_HANDLER_HI, 0);
  48. }
  49. void shared_memory_irq_restore(){
  50. sram_write(SHARED_IRQ_LOC_LO, irq_addr_lo);
  51. sram_write(SHARED_IRQ_LOC_HI, irq_addr_hi);
  52. }
  53. void shared_memory_put(uint8_t cmd, uint8_t value){
  54. //return;
  55. info("Write shared memory 0x%04x=0x%02x 0x%04x=0x%02x \n",SHARED_MEM_LOC_CMD,cmd,SHARED_MEM_LOC_PAYLOAD,value);
  56. shared_memory_scratchpad_save();
  57. shared_memory_irq_hook();
  58. sram_write(SHARED_MEM_LOC_STATE,1);
  59. sram_write(SHARED_MEM_LOC_CMD,cmd);
  60. sram_write(SHARED_MEM_LOC_PAYLOAD,value);
  61. snes_hirom();
  62. snes_wr_disable();
  63. snes_bus_active();
  64. _delay_ms(50);
  65. avr_bus_active();
  66. snes_irq_lo();
  67. snes_irq_off();
  68. snes_lorom();
  69. snes_wr_disable();
  70. shared_memory_scratchpad_restore();
  71. shared_memory_irq_restore();
  72. }