Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <avr/pgmspace.h>
  4.  
  5. #include <util/delay.h>
  6.  
  7. #include "mytypes.h"
  8. #include "depacker_dirty.h"
  9. #include "getfaraddress.h"
  10. #include "pins.h"
  11. #include "main.h"
  12. #include "ps2.h"
  13. #include "zx.h"
  14. #include "spi.h"
  15. #include "rs232.h"
  16. #include "rtc.h"
  17. #include "atx.h"
  18. #include "joystick.h"
  19. #include "tape.h"
  20. #include "kbmap.h"
  21.  
  22. /** FPGA data pointer [far address] (linker symbol). */
  23. extern ULONG fpga PROGMEM;
  24.  
  25. // FPGA data index..
  26. volatile ULONG curFpga;
  27.  
  28. // Common flag register.
  29. volatile UBYTE flags_register;
  30.  
  31. // Common modes register.
  32. volatile UBYTE modes_register;
  33.  
  34. // Buffer for depacking FPGA configuration.
  35. // You can USED for other purposed after setup FPGA.
  36. UBYTE dbuf[DBSIZE];
  37.  
  38. void put_buffer(UWORD size)
  39. {
  40.         // writes specified length of buffer to the output
  41.         UBYTE * ptr = dbuf;
  42.  
  43.         do
  44.         {
  45.                 spi_send( *(ptr++) );
  46.  
  47.         } while(--size);
  48. }
  49.  
  50. void hardware_init(void)
  51. {
  52.         //Initialized AVR pins
  53.  
  54.         cli(); // disable interrupts
  55.  
  56.         // configure pins
  57.  
  58.         PORTG = 0b11111111;
  59.         DDRG  = 0b00000000;
  60.  
  61. //      PORTF = 0b11110000; // ATX off (zero output), fpga config/etc inputs
  62.         DDRF  = 0b00001000;
  63.  
  64.         PORTE = 0b11110011;
  65.         DDRE  = 0b00000000; // inputs pulled up, exclude PLL-control pins
  66.  
  67.         PORTD = 0b11111111;
  68.         DDRD  = 0b00000000; // same
  69.  
  70.         PORTC = 0b11011111;
  71.         DDRC  = 0b00000000; // PWRGOOD input, other pulled up
  72.  
  73.         PORTB = 0b11110001;
  74.         DDRB  = 0b10000111; // LED off, spi outs inactive
  75.  
  76.         PORTA = 0b11111111;
  77.         DDRA  = 0b00000000; // pulled up
  78.  
  79.         ACSR = 0x80; // DISABLE analog comparator
  80. }
  81.  
  82. int main()
  83. {
  84. start:
  85.  
  86.         hardware_init();
  87.  
  88.         rs232_init();
  89. #ifdef LOGENABLE
  90.         to_log("VER:");
  91.         {
  92.                 UBYTE b,i;
  93.                 ULONG version = 0x1DFF0;
  94.                 char VER[]="..";
  95.                 for( i=0; i<12; i++)
  96.                 {
  97.                         dbuf[i] = pgm_read_byte_far(version+i);
  98.                 }
  99.                 dbuf[i]=0;
  100.                 to_log((char*)dbuf);
  101.                 to_log(" ");
  102.                 UBYTE b1 = pgm_read_byte_far(version+12);
  103.                 UBYTE b2 = pgm_read_byte_far(version+13);
  104.                 UBYTE day = b1&0x1F;
  105.                 UBYTE mon = ((b2<<3)+(b1>>5))&0x0F;
  106.                 UBYTE year = (b2>>1)&0x3F;
  107.                 VER[0] = '0'+(day/10);
  108.                 VER[1] = '0'+(day%10);
  109.         to_log(VER);
  110.         to_log(".");
  111.                 VER[0] = '0'+(mon/10);
  112.                 VER[1] = '0'+(mon%10);
  113.         to_log(VER);
  114.         to_log(".");
  115.                 VER[0] = '0'+(year/10);
  116.                 VER[1] = '0'+(year%10);
  117.         to_log(VER);
  118.         to_log("\r\n");
  119.                 //
  120.                 for( i=0; i<16; i++)
  121.                 {
  122.                         b = pgm_read_byte_far(version+i);
  123.                         VER[0] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
  124.                         VER[1] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
  125.                         to_log(VER);
  126.                 }
  127.                 to_log("\r\n");
  128.         }
  129. #endif
  130.  
  131.         wait_for_atx_power();
  132.  
  133.         spi_init();
  134.  
  135.         DDRF |= (1<<nCONFIG); // pull low for a time
  136.         _delay_us(40);
  137.         DDRF &= ~(1<<nCONFIG);
  138.         while( !(PINF & (1<<nSTATUS)) ); // wait ready
  139.  
  140.         curFpga = GET_FAR_ADDRESS(fpga); // prepare for data fetching
  141. #ifdef LOGENABLE
  142.         {
  143.         char log_fpga[]="F........\r\n";
  144.         UBYTE b = (UBYTE)((curFpga>>24)&0xFF);
  145.         log_fpga[1] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
  146.         log_fpga[2] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
  147.         b = (UBYTE)((curFpga>>16)&0xFF);
  148.         log_fpga[3] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
  149.         log_fpga[4] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
  150.         b = (UBYTE)((curFpga>>8)&0xFF);
  151.         log_fpga[5] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
  152.         log_fpga[6] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
  153.         b = (UBYTE)(curFpga&0xFF);
  154.         log_fpga[7] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
  155.         log_fpga[8] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
  156.         to_log(log_fpga);
  157.         }
  158. #endif
  159.         depacker_dirty();
  160. #ifdef LOGENABLE
  161.         to_log("depacker_dirty OK\r\n");
  162. #endif
  163.  
  164.         //power led OFF
  165.         LED_PORT |= 1<<LED;
  166.  
  167.         // start timer (led dimming and timeouts for ps/2)
  168.         TCCR2 = 0b01110011; // FOC2=0, {WGM21,WGM20}=01, {COM21,COM20}=11, {CS22,CS21,CS20}=011
  169.                             // clk/64 clocking,
  170.                             // 1/512 overflow rate, total 11.059/32768 = 337.5 Hz interrupt rate
  171.         TIFR = (1<<TOV2);
  172.         TIMSK = (1<<TOIE2);
  173.  
  174.  
  175.         //init some counters and registers
  176.     ps2keyboard_count = 12;
  177.         ps2keyboard_cmd_count = 0;
  178.         ps2keyboard_cmd = 0;
  179.         ps2mouse_count = 12;
  180.         ps2mouse_initstep = 0;
  181.         ps2mouse_resp_count = 0;
  182.         flags_register = 0;
  183.         modes_register = 0;
  184.  
  185.         //enable mouse
  186.         zx_mouse_reset(1);
  187.  
  188.         //set external interrupt
  189.         //INT4 - PS2 Keyboard  (falling edge)
  190.         //INT5 - PS2 Mouse     (falling edge)
  191.         //INT6 - SPI  (falling edge)
  192.         //INT7 - RTC  (falling edge)
  193.         EICRB = (1<<ISC41)+(0<<ISC40) + (1<<ISC51)+(0<<ISC50) + (1<<ISC61)+(0<<ISC60) + (1<<ISC71)+(0<<ISC70); // set condition for interrupt
  194.         EIFR = (1<<INTF4)|(1<<INTF5)|(1<<INTF6)|(1<<INTF7); // clear spurious ints there
  195.         EIMSK |= (1<<INT4)|(1<<INT5)|(1<<INT6)|(1<<INT7); // enable
  196.  
  197.         kbmap_init();
  198.         zx_init();
  199.         rtc_init();
  200.  
  201. #ifdef LOGENABLE
  202.         to_log("zx_init OK\r\n");
  203. #endif
  204.  
  205.         sei(); // globally go interrupting
  206.  
  207.         //set led on keyboard
  208.         ps2keyboard_send_cmd(PS2KEYBOARD_CMD_SETLED);
  209.  
  210.         //main loop
  211.         do
  212.     {
  213.             tape_task();
  214.                 ps2mouse_task();
  215.         ps2keyboard_task();
  216.         zx_task(ZX_TASK_WORK);
  217.                 zx_mouse_task();
  218.                 joystick_task();
  219.  
  220.                 //event from SPI
  221.                 if ( flags_register&FLAG_SPI_INT )
  222.                 {
  223.                         //get status byte
  224.                         UBYTE status;
  225.                         nSPICS_PORT &= ~(1<<nSPICS);
  226.                         nSPICS_PORT |= (1<<nSPICS);
  227.                         status = spi_send(0);
  228.                         zx_wait_task( status );
  229.                 }
  230.  
  231.                 atx_power_task();
  232.     }
  233.         while( (flags_register&FLAG_HARD_RESET) == 0 );
  234.  
  235.         goto start;
  236. }
  237.