Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/io.h>
- #include <stdbool.h>
- #include "data.h"
- //PD data
- //PC control
- //PB programming + xtal + clocko (CKOUT fuse)
- #define CE (_BV(PC0))
- #define WE (_BV(PC1))
- #define READY (_BV(PC2))
- inline static unsigned char get( uint16_t p){
- return pgm_read_byte(&data[p]);
- }
- #define PRESCALER 8
- #if PRESCALER == 1
- #define PRESCALERSETTING _BV(CS10)
- #define SLEEPNTSC 59659
- //wait an overflow before this
- #define SLEEPPALOVERSLEEP
- #define SLEEPPAL 6055
- #elif PRESCALER == 8
- #define PRESCALERSETTING _BV(CS11)
- #define SLEEPNTSC 7457
- #define SLEEPPAL 8949
- #elif PRESCALER == 64
- #define PRESCALERSETTING _BV(CS11)|_BV(CS10)
- #define SLEEPNTSC 932
- #define SLEEPPAL 1119
- #endif
- void write(unsigned char c){
- PORTD=c;
- PORTC&=~CE;
- PORTC&=~WE;
- while(PINC&READY){}//wait READY to go down
- while((PINC&READY)==0){}//wait READY to go up
- PORTC|=CE|WE;
- }
- int main(){
- DDRD=0xFF;
- DDRC|=CE|WE;
- PORTC|=READY;//enable the pullup
- TCCR1A=0;
- TCCR1B=PRESCALERSETTING;
- PORTC|=CE|WE;
- uint16_t p=0;
- while(true){
- unsigned char cmd=get(p++);
- switch(cmd){
- case 0x4f: //game gear psg stereo
- p++;
- break;
- case 0x50://write value
- write(get(p++));
- break;
- case 0x61:{//variable delay
- uint16_t delay;
- unsigned char low,high;
- TCNT1=0;
- low=get(p++);
- high=get(p++);
- delay=high*256+low;
- while (TCNT1<delay){};
- }
- break;
- case 0x62://NTSC delay
- TCNT1=0;
- while (TCNT1<SLEEPNTSC){};
- break;
- case 0x63://PAL delay
- TCNT1=0;
- #ifdef SLEEPPALOVERSLEEP
- while (TCNT1<60000){};
- #endif
- while (TCNT1<SLEEPPAL){};
- break;
- case 0x66:
- p=0;
- break;
- } //switch
- }//while true
- }//main
Advertisement
Add Comment
Please, Sign In to add comment