Guest User

Untitled

a guest
Sep 14th, 2013
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <stdbool.h>
  3. #include "data.h"
  4.  
  5. //PD data
  6. //PC control
  7. //PB programming + xtal + clocko (CKOUT fuse)
  8.  
  9. #define CE (_BV(PC0))
  10. #define WE (_BV(PC1))
  11. #define READY (_BV(PC2))
  12.  
  13. inline static unsigned char get( uint16_t p){
  14. return pgm_read_byte(&data[p]);
  15. }
  16.  
  17. #define PRESCALER 8
  18.  
  19. #if PRESCALER == 1
  20. #define PRESCALERSETTING _BV(CS10)
  21. #define SLEEPNTSC 59659
  22. //wait an overflow before this
  23. #define SLEEPPALOVERSLEEP
  24. #define SLEEPPAL 6055
  25. #elif PRESCALER == 8
  26. #define PRESCALERSETTING _BV(CS11)
  27. #define SLEEPNTSC 7457
  28. #define SLEEPPAL 8949
  29. #elif PRESCALER == 64
  30. #define PRESCALERSETTING _BV(CS11)|_BV(CS10)
  31. #define SLEEPNTSC 932
  32. #define SLEEPPAL 1119
  33. #endif
  34.  
  35.  
  36.  
  37. void write(unsigned char c){
  38. PORTD=c;
  39. PORTC&=~CE;
  40. PORTC&=~WE;
  41. while(PINC&READY){}//wait READY to go down
  42. while((PINC&READY)==0){}//wait READY to go up
  43. PORTC|=CE|WE;
  44. }
  45.  
  46.  
  47. int main(){
  48. DDRD=0xFF;
  49. DDRC|=CE|WE;
  50. PORTC|=CE|WE;
  51. PORTC|=READY;//enable the pullup
  52. TCCR1A=0;
  53. TCCR1B=PRESCALERSETTING;
  54. uint16_t p=0;
  55. TCNT1=0;
  56. while(true){
  57. unsigned char cmd=get(p++);
  58. switch(cmd){
  59. case 0x4f: //game gear psg stereo
  60. p++;
  61. break;
  62. case 0x50://write value
  63. write(get(p++));
  64. break;
  65. case 0x61:{//variable delay
  66. uint16_t delay;
  67. unsigned char low,high;
  68. low=get(p++);
  69. high=get(p++);
  70. delay=high*256+low;
  71. while (TCNT1<delay){};
  72. TCNT1=0;
  73. }
  74. break;
  75. case 0x62://NTSC delay
  76. while (TCNT1<SLEEPNTSC){};
  77. TCNT1=0;
  78. break;
  79. case 0x63://PAL delay
  80. #ifdef SLEEPPALOVERSLEEP
  81. while (TCNT1<60000){};
  82. #endif
  83. while (TCNT1<SLEEPPAL){};
  84. break;
  85. TCNT1=0;
  86. case 0x66:
  87. p=0;
  88. TCNT1=0;
  89. break;
  90. } //switch
  91. }//while true
  92. }//main
Advertisement
Add Comment
Please, Sign In to add comment