Subversion Repositories pentevo

Rev

Rev 910 | Blame | Compare with Previous | 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. void pff_test(void);
  22. /*
  23. uint8_t disk_initialize (void);
  24. uint8_t disk_readp (uint8_t* buff, uint32_t sector, uint16_t offser, uint16_t count);
  25. uint8_t disk_writep (const uint8_t* buff, uint32_t sc);
  26. */
  27. //if want Log than comment next string
  28. //#undef LOGENABLE
  29. #define LOGENABLE
  30.  
  31. /** FPGA data pointer [far address] (linker symbol). */
  32. extern const ULONG fpga PROGMEM;
  33.  
  34. // FPGA data index..
  35. volatile ULONG curFpga;
  36.  
  37. // Common flag register.
  38. volatile UBYTE flags_register;
  39. volatile UBYTE flags_ex_register;
  40.  
  41. // Common modes register.
  42. volatile UBYTE modes_register;
  43.  
  44. // Type extensions of gluk registers
  45. volatile UBYTE ext_type_gluk;
  46.  
  47. // Buffer for depacking FPGA configuration.
  48. // You can USED for other purposed after setup FPGA.
  49. UBYTE dbuf[DBSIZE];
  50.  
  51. void put_buffer(UWORD size)
  52. {
  53.         // writes specified length of buffer to the output
  54.         UBYTE * ptr = dbuf;
  55.  
  56.         do
  57.         {
  58.                 spi_send( *(ptr++) );
  59.  
  60.         } while(--size);
  61. }
  62.  
  63. void hardware_init(void)
  64. {
  65.         //Initialized AVR pins
  66.  
  67.         cli(); // disable interrupts
  68.  
  69.         // configure pins
  70.     WDTCR = 0B00011111;
  71.     WDTCR = 0x00;
  72.         PORTG = 0b11111111;
  73.         DDRG  = 0b00000000; // inputs pulled up
  74.  
  75.         // reset value for PORTF is zero (incl. ATX poweron pin),
  76.         // if no HW reset happens, it keeps previous value
  77.         //
  78.         ///PORTF = 0b11110000; // ATX off (zero output), fpga config/etc inputs
  79.        
  80.         MCUCSR |= 0x80;
  81.         MCUCSR |= 0x80;
  82.         PORTF |=   0b11110000 ;
  83.         PORTF &= ~(0b00000111);
  84.         DDRF   =   0b10111000;
  85.         MCUCSR |= 0x80;
  86.  
  87.         PORTE = 0b11110011;
  88.         DDRE  = 0b00000000; // PLL to 2X [E2=Z,E3=Z], inputs pulled up
  89.  
  90.         PORTD = 0b11111111; // inputs pulled up
  91.         DDRD  = 0b00100000; // RTS out
  92.  
  93.  
  94.         PORTC = 0b11011111;
  95.         DDRC  = 0b00000000; // PWRGOOD input, other pulled up
  96.  
  97.         PORTB = 0b11000001;
  98.         DDRB  = 0b10000111; // LED off, spi outs inactive
  99.  
  100.         PORTA = 0b11111111;
  101.         DDRA  = 0b00000000; // pulled up
  102.  
  103.         ACSR = 0x80; // DISABLE analog comparator
  104. }
  105.  
  106. int main()
  107. {
  108. start:
  109.  
  110.         hardware_init();
  111.  
  112.         rs232_init();
  113. #ifdef LOGENABLE
  114.         to_log("VER:");
  115.         {
  116.                 UBYTE b,i;
  117.                 ULONG version = 0x1DFF0;
  118.                 char VER[]="..";
  119.                 for( i=0; i<12; i++)
  120.                 {
  121.                         dbuf[i] = pgm_read_byte_far(version+i);
  122.                 }
  123.                 dbuf[i]=0;
  124.                 to_log((char*)dbuf);
  125.                 to_log(" ");
  126.                 UBYTE b1 = pgm_read_byte_far(version+12);
  127.                 UBYTE b2 = pgm_read_byte_far(version+13);
  128.                 UBYTE day = b1&0x1F;
  129.                 UBYTE mon = ((b2<<3)+(b1>>5))&0x0F;
  130.                 UBYTE year = (b2>>1)&0x3F;
  131.                 VER[0] = '0'+(day/10);
  132.                 VER[1] = '0'+(day%10);
  133.         to_log(VER);
  134.         to_log(".");
  135.                 VER[0] = '0'+(mon/10);
  136.                 VER[1] = '0'+(mon%10);
  137.         to_log(VER);
  138.         to_log(".");
  139.                 VER[0] = '0'+(year/10);
  140.                 VER[1] = '0'+(year%10);
  141.         to_log(VER);
  142.         to_log("\r\n");
  143.                 //
  144.                 for( i=0; i<16; i++)
  145.                 {
  146.                         b = pgm_read_byte_far(version+i);
  147.                         VER[0] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
  148.                         VER[1] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
  149.                         to_log(VER);
  150.                 }
  151.                 to_log("\r\n");
  152.         }
  153. #endif
  154.  
  155.         wait_for_atx_power();
  156.  
  157.         spi_init();
  158.  
  159.  
  160.         pff_test();
  161.         // config loop
  162. #if 0
  163.         do
  164.         {
  165.                 // power led OFF
  166.                 LED_PORT |= 1<<LED;
  167.  
  168.                 DDRF |= (1<<nCONFIG); // pull low for a time
  169.                 _delay_ms(20);
  170.                 DDRF &= ~(1<<nCONFIG);
  171.                 while( !(PINF & (1<<nSTATUS)) ); // wait ready
  172.  
  173.                 curFpga = GET_FAR_ADDRESS(fpga); // prepare for data fetching
  174. #ifdef LOGENABLE
  175.                 {
  176.                 char log_fpga[]="F........\r\n";
  177.                 UBYTE b = (UBYTE)((curFpga>>24)&0xFF);
  178.                 log_fpga[1] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
  179.                 log_fpga[2] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
  180.                 b = (UBYTE)((curFpga>>16)&0xFF);
  181.                 log_fpga[3] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
  182.                 log_fpga[4] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
  183.                 b = (UBYTE)((curFpga>>8)&0xFF);
  184.                 log_fpga[5] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
  185.                 log_fpga[6] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
  186.                 b = (UBYTE)(curFpga&0xFF);
  187.                 log_fpga[7] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
  188.                 log_fpga[8] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
  189.                 to_log(log_fpga);
  190.                 }
  191. #endif
  192.                 depacker_dirty();
  193. #ifdef LOGENABLE
  194.                 to_log("depacker_dirty OK\r\n");
  195. #endif
  196.  
  197.                 // power led ON
  198.                 LED_PORT &= ~(1<<LED);
  199.  
  200.                 // wait a bit and check CONF_DONE
  201.                 _delay_ms(20);
  202.         } while( !(CONF_DONE_PIN & (1<<CONF_DONE)) );
  203. #endif
  204.  
  205.  
  206.         //power led OFF
  207.         LED_PORT |= 1<<LED;
  208.  
  209.         // start timer (led dimming and timeouts for ps/2)
  210.         TCCR2 = 0b01110011; // FOC2=0, {WGM21,WGM20}=01, {COM21,COM20}=11, {CS22,CS21,CS20}=011
  211.                             // clk/64 clocking,
  212.                             // 1/512 overflow rate, total 11.059/32768 = 337.5 Hz interrupt rate
  213.         TIFR = (1<<TOV2);
  214.         TIMSK = (1<<TOIE2);
  215.  
  216.  
  217.         //init some counters and registers
  218.         ps2keyboard_init();
  219.  
  220.         ps2mouse_count = 12;
  221.         ps2mouse_initstep = 0;
  222.         ps2mouse_resp_count = 0;
  223.         ps2mouse_cmd = PS2MOUSE_CMD_SET_RESOLUTION;
  224.         flags_register = 0;
  225.         flags_ex_register = 0;
  226.         modes_register = 0;
  227.         ext_type_gluk = 0;
  228.  
  229.         //reset ps2 keyboard log
  230.         ps2keyboard_reset_log();
  231.  
  232.         //enable mouse
  233.         zx_mouse_reset(1);
  234.  
  235.         //set external interrupt
  236.         //INT4 - PS2 Keyboard  (falling edge)
  237.         //INT5 - PS2 Mouse     (falling edge)
  238.         //INT6 - SPI  (falling edge)
  239.         //INT7 - RTC  (falling edge)
  240.         EICRB = (1<<ISC41)+(0<<ISC40) + (1<<ISC51)+(0<<ISC50) + (1<<ISC61)+(0<<ISC60) + (1<<ISC71)+(0<<ISC70); // set condition for interrupt
  241.         EIFR = (1<<INTF4)|(1<<INTF5)|(1<<INTF6)|(1<<INTF7); // clear spurious ints there
  242.         EIMSK |= (1<<INT4)|(1<<INT5)|(1<<INT6)|(1<<INT7); // enable
  243.  
  244.         kbmap_init();
  245.         zx_init();
  246.         rtc_init();
  247.  
  248. #ifdef LOGENABLE
  249.         to_log("zx_init OK\r\n");
  250. #endif
  251.  
  252.         sei(); // globally go interrupting
  253.  
  254.         //set led on keyboard
  255.         ps2keyboard_send_cmd(PS2KEYBOARD_CMD_SETLED);
  256. #ifdef LOGENABLE
  257. /*
  258.         if(disk_initialize()) to_log("sd_init ERR\r\n");
  259.         else {
  260.                 static uint8_t buf[512];
  261.                 to_log("sd_init OK\r\n");
  262.                 disk_readp(buf,1,0,512);
  263.                 uint16_t i = 0;
  264.                 rs232_transmit('$');
  265.                 while(i != 512){
  266.                         rs232_transmit(buf[i]);
  267.                         i++;
  268.                 }
  269.                 rs232_transmit('$');
  270.                 rs232_transmit(disk_writep(0,1)+'0');
  271.                 rs232_transmit(disk_writep("test223456OK",12)+'0');
  272.                 rs232_transmit(disk_writep(0,0)+'0');
  273.                 rs232_transmit(disk_readp(buf,1,0,512)+'0');
  274.                 i = 0;
  275.                 rs232_transmit('#');
  276.                 while(i != 60){
  277.                         rs232_transmit(buf[i]);
  278.                         i++;
  279.                 }
  280.                 rs232_transmit('#');
  281.                
  282.         }
  283. */
  284. #endif
  285.  
  286.         //main loop
  287.         do
  288.         {
  289.                 tape_task();
  290.                 ps2mouse_task();
  291.                 ps2keyboard_task();
  292.                 zx_task(ZX_TASK_WORK);
  293.                 zx_mouse_task();
  294.                 joystick_task();
  295.                 rs232_task();
  296.  
  297.                 //event from SPI
  298.                 if ( flags_register&FLAG_SPI_INT )
  299.                 {
  300.                         //get status byte
  301.                         UBYTE status;
  302.                         nSPICS_PORT &= ~(1<<nSPICS);
  303.                         nSPICS_PORT |= (1<<nSPICS);
  304.                         status = spi_send(0);
  305.                         zx_wait_task( status );
  306.                 }
  307.  
  308.                 atx_power_task(); // must be last in loop!
  309.         }
  310.         while( (flags_register&FLAG_HARD_RESET) == 0 );
  311.  
  312.         goto start;
  313. }
  314.