void Initialize(void){ int i; if(!isEepromFormatted()) FormatEeprom(); cli(); //InitSoundPort(); //ramp-up sound to avoid click #if SOUND_MIXER == MIXER_TYPE_VSYNC //Initialize the mixer buffer //ramp up to avoid initial click for(int j=0;j<MIX_BANK_SIZE*2;j++){ mix_buf[j]=0x80;//(i<128?i:128); } mix_pos=mix_buf; mix_bank=0; #endif #if MIXER_CHAN4_TYPE == 0 //initialize LFSR tr4_barrel_lo=1; tr4_barrel_hi=1; tr4_params=0b00000001; //15 bits no divider (1) #endif #if UART_RX_BUFFER == 1 uart_rx_buf_start=0; uart_rx_buf_end=0; #endif #if SNES_MOUSE == 1 snesMouseEnabled=false; #endif //silence all sound channels for(i=0;i<CHANNELS;i++){ mixer.channels.all[i].volume=0; } //set sync parameters. starts at odd field, in pre-eq pulses, line 1, vsync flag cleared sync_phase=0; sync_flags=0; sync_pulse=SYNC_PRE_EQ_PULSES+SYNC_EQ_PULSES+SYNC_POST_EQ_PULSES; //set rendering parameters render_lines_count_tmp=FRAME_LINES; render_lines_count=FRAME_LINES; first_render_line_tmp=FIRST_RENDER_LINE; first_render_line=FIRST_RENDER_LINE; joypad1_status_hi=0; joypad2_status_hi=0; sound_enabled=1; InitializeVideoMode(); //Initialize I/O registers u16 val; u8 *ptr; for(u8 j=0;j<(sizeof(io_table)>>1);j++){ val=pgm_read_word(&io_table[j]); ptr=(u8*)(val&0xff); *ptr=val>>8; } sei(); DisplayLogo(); }
void Initialize(void){ int i; if(!isEepromFormatted()) FormatEeprom(); cli(); //Initialize the mixer buffer for(i=0;i<MIX_BANK_SIZE*2;i++){ mix_buf[i]=0x80; } mix_pos=mix_buf; mix_bank=0; for(i=0;i<CHANNELS;i++){ mixer.channels.all[i].volume=0; } #if MIXER_CHAN4_TYPE == 0 //initialize LFSR tr4_barrel_lo=1; tr4_barrel_hi=1; tr4_params=0b00000001; //15 bits no divider (1) #endif #if UART_RX_BUFFER == 1 uart_rx_buf_start=0; uart_rx_buf_end=0; #endif #if MIDI_IN == 1 UCSR0B=(1<<RXEN0); //set UART for MIDI in UCSR0C=(1<<UCSZ01)+(1<<UCSZ00); UBRR0L=56; //31250 bauds (.5% error) #endif //stop timers TCCR1B=0; TCCR0B=0; //set ports DDRC=0xff; //video dac DDRB=0xff; //h-sync for ad725 DDRD=(1<<PD7)+(1<<PD4); //audio-out + led PORTD|=(1<<PD4)+(1<<PD3)+(1<<PD2); //turn on led & activate pull-ups for soft-power switches //setup port A for joypads DDRA =0b00001100; //set only control lines as outputs PORTA=0b11111011; //activate pullups on the data lines //PORTD=0; //set sync parameters. starts at odd field, in pre-eq pulses, line 1 sync_phase=SYNC_PHASE_PRE_EQ; sync_pulse=SYNC_PRE_EQ_PULSES; //set rendering parameters render_lines_count_tmp=FRAME_LINES; first_render_line_tmp=FIRST_RENDER_LINE; //clear timers TCNT1H=0; TCNT1L=0; //set sync generator counter on TIMER1 OCR1AH=HDRIVE_CL_TWICE>>8; OCR1AL=HDRIVE_CL_TWICE&0xff; TCCR1B=(1<<WGM12)+(1<<CS10);//CTC mode, use OCR1A for match TIMSK1=(1<<OCIE1A); //generate interrupt on match //set clock divider counter for AD725 on TIMER0 //outputs 14.31818Mhz (4FSC) TCCR0A=(1<<COM0A0)+(1<<WGM01); //toggle on compare match + CTC OCR0A=0; //divide main clock by 2 TCCR0B=(1<<CS00); //enable timer, no pre-scaler //set sound PWM on TIMER2 TCCR2A=(1<<COM2A1)+(1<<WGM21)+(1<<WGM20); //Fast PWM OCR2A=0; //duty cycle (amplitude) TCCR2B=(1<<CS20); //enable timer, no pre-scaler SYNC_PORT=(1<<SYNC_PIN)|(1<<VIDEOCE_PIN); //set sync & chip enable line to hi burstOffset=0; curr_frame=0; vsync_phase=0; joypad1_status_hi=0; joypad2_status_hi=0; snesMouseEnabled=false; sound_enabled=1; //enable color correction ReadButtons(); if(ReadJoypad(0)&BTN_B){ SetColorBurstOffset(4); } InitializeVideoMode(); sei(); DisplayLogo(); }