#include <avr/io.h>
 
#include <util/delay.h>
 
 
 
#include "pins.h"
 
#include "mytypes.h"
 
 
 
#include "main.h"
 
#include "atx.h"
 
#include "rs232.h"
 
#include "zx.h"
 
 
 
//if want Log than comment next string
 
#undef LOGENABLE
 
 
 
volatile UWORD atx_counter;
 
 
 
void wait_for_atx_power(void)
 
{
 
        UBYTE j = MCUCSR;
 
 
 
        //clear status register
 
        MCUCSR = 0;
 
 
 
#ifdef LOGENABLE
 
        char log_ps2keyboard_parse[] = "MC..\r\n";
 
        log_ps2keyboard_parse[2] = ((j >> 4) <= 9 )?'0'+(j >> 4):'A'+(j >> 4)-10;
 
        log_ps2keyboard_parse[3] = ((j & 0x0F) <= 9 )?'0'+(j & 0x0F):'A'+(j & 0x0F)-10;
 
        to_log(log_ps2keyboard_parse);
 
#endif
 
 
 
        //check power
 
        if ( (nCONFIG_PIN & (1<<nCONFIG)) == 0 )
 
        {
 
                //if not external reset
 
                //then wait for atx power on button (SOFTRESET)
 
                if ( !(j & ((1<<JTRF)|(1<<WDRF)|(1<<BORF)|(1<<EXTRF))) ||
 
                         (j & (1<<PORF)) )
 
                while( SOFTRES_PIN&(1<<SOFTRES) );
 
 
 
                //switch on ATX power
 
                ATXPWRON_PORT |= (1<<ATXPWRON);
 
 
 
                //1 sec delay
 
                j=50;
 
                do _delay_ms(20); while(--j);
 
        }
 
 
 
        //init port F
 
        PORTF = 0b11111000;
 
        //clear counter
 
        atx_counter = 0;
 
}
 
 
 
void atx_power_task(void)
 
{
 
        static UWORD last_count = 0;
 
        UBYTE j = 50;
 
 
 
        if ( atx_counter > 1700 )
 
        {
 
                if ( ( SOFTRES_PIN & (1<<SOFTRES) ) == 0 )
 
                {
 
                        //atx power off button pressed (~5 sec)
 
 
 
                        //switch off atx power
 
                        ATXPWRON_PORT &= ~(1<<ATXPWRON);
 
                }
 
                else
 
                {
 
                        //enable hard reset
 
                        flags_register |= FLAG_HARD_RESET;
 
                }
 
        }
 
 
 
        if ( ( last_count > 0 ) && ( atx_counter == 0 ) )
 
        {
 
                //soft reset (reset Z80 only)
 
                zx_spi_send(SPI_RST_REG, 0, 0x7F);
 
        }
 
        last_count = atx_counter;
 
 
 
        if ( ( nCONFIG_PIN & (1<<nCONFIG) ) == 0 )
 
        {
 
                //power down
 
 
 
                //power led off (timer output disconnect from led pin)
 
                TCCR2 &= ~((1<<COM20)|(1<<COM21));
 
 
 
                //wait for button released
 
                while (  ( SOFTRES_PIN & (1<<SOFTRES) ) == 0 );
 
 
 
                //1 sec delay
 
                do _delay_ms(20); while(--j);
 
 
 
                last_count = 0;
 
 
 
                //enable hard reset
 
                flags_register |= FLAG_HARD_RESET;
 
        }
 
}