David Rimer / Mbed OS Gigatron_Emulator
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "stm32746g_discovery_lcd.h"
00003 //#include "stm32746g_discovery_ts.h"
00004 #include "GigatronCPU.h"
00005 #include "I2CConfig.h"
00006 #include "WiiClassicControllerReader.h"
00007 
00008 
00009 Serial serial(USBTX, USBRX);
00010 
00011 #define BUTTON_A        0x80
00012 #define BUTTON_B        0x40
00013 #define BUTTON_SELECT   0x20
00014 #define BUTTON_START    0x10
00015 #define BUTTON_UP       0x08
00016 #define BUTTON_DOWN     0x04
00017 #define BUTTON_LEFT     0x02
00018 #define BUTTON_RIGHT    0x01
00019 
00020 #define HZ 6250000
00021 
00022 GigatronCPU * cpu;
00023 CPUStates cpuState;
00024 VGA vga;
00025 bool vSync = false;
00026 uint32_t cycles = 0;
00027 bool justStarted = true;
00028 int ledStatus = 0;
00029 
00030 extern const uint8_t rom_map[];
00031 
00032 /*
00033 void ReadAndReport(WiiClassicControllerReader* const ctrlr, const char* const portname)
00034 {
00035     int bufSize = 0;
00036     char* bufPtr = NULL;
00037     bool debug = true;
00038 
00039     ctrlr->RequestRead();
00040     serial.printf("%s: ", portname);
00041         
00042     if (debug)
00043     {
00044         bufSize = ctrlr->getBufferSize();
00045         bufPtr = ctrlr->getReadBuf();
00046         if (bufPtr != NULL)
00047         {
00048             for (int i = 0; i < bufSize; i++)
00049             {
00050                 serial.printf("%x ", bufPtr[i]);
00051             }
00052             serial.printf("\r\n");
00053         }
00054     }
00055     serial.printf("\r\nA\tB\tX\tY\tZL\tZR\tDU\tDD\tDL\tDR\tH\r\n");    
00056     serial.printf("%d\t", ctrlr->getButtonA());
00057     serial.printf("%d\t", ctrlr->getButtonB());
00058     serial.printf("%d\t", ctrlr->getButtonX());
00059     serial.printf("%d\t", ctrlr->getButtonY());
00060     serial.printf("%d\t", ctrlr->getButtonZL());
00061     serial.printf("%d\t", ctrlr->getButtonZR());
00062     serial.printf("%d\t", ctrlr->getButtonDU());
00063     serial.printf("%d\t", ctrlr->getButtonDD());
00064     serial.printf("%d\t", ctrlr->getButtonDL());
00065     serial.printf("%d\t", ctrlr->getButtonDR());
00066     serial.printf("%d\t", ctrlr->getButtonHOME());
00067     serial.printf("\r\nSEL\tSTART\tLT\tLC\tRT\tRC\tLX\tLY\tRX\tRY\r\n");
00068     serial.printf("%d\t", ctrlr->getButtonSELECT());
00069     serial.printf("%d\t", ctrlr->getButtonSTART());
00070     serial.printf("%d\t", ctrlr->getButtonLT());
00071     serial.printf("%d\t", ctrlr->getButtonLC());
00072     serial.printf("%d\t", ctrlr->getButtonRT());
00073     serial.printf("%d\t", ctrlr->getButtonRC());
00074     serial.printf("%d\t", ctrlr->getLJoyX());
00075     serial.printf("%d\t", ctrlr->getLJoyY());
00076     serial.printf("%d\t", ctrlr->getRJoyX());
00077     serial.printf("%d\t", ctrlr->getRJoyY());
00078     serial.printf("\r\n\n\n");
00079 }
00080 */
00081 
00082 int main()
00083 {
00084     WiiClassicControllerReader ctrlrA(I2CPort_A::SDA, I2CPort_A::SCL);
00085     //I2C test(PB_9, PB_8);
00086     
00087     /*
00088     while (true)
00089     {
00090         ReadAndReport(&ctrlrA, "PORT A");                
00091         wait(1);
00092     }*/
00093     
00094     
00095     ctrlrA.RequestRead();
00096     BSP_LCD_Init();
00097     BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FB_START_ADDRESS);
00098     //BSP_LCD_LayerRgb565Init(1, 0xC0100000);     //0xC007F800 - End of Page 1
00099     BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER);
00100     //BSP_LCD_SelectLayer(1);
00101 
00102     BSP_LCD_SetFont(&Font12);
00103     BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
00104     BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
00105     
00106     BSP_LCD_Clear(LCD_COLOR_BLACK);
00107     
00108     cpu = new GigatronCPU();    
00109     cpuState.Current = new CPUState;
00110     cpuState.New = new CPUState;
00111         
00112     cpu->SetCPURom((uint8_t *) &rom_map);
00113     
00114     while(1) {
00115         cpuState = cpu->CpuCycle(cpuState);
00116         cycles++;
00117         
00118         vga.ClockCycle(cpuState.New->OUT);  
00119         
00120 
00121         if ((cycles % ((HZ / 100) + 100)) == 0 && !justStarted)
00122         {
00123             int buttons = 0x00;
00124             
00125             ctrlrA.ControllerReadCmd();      
00126             //ctrlrA.RequestRead();
00127             ctrlrA.ControllerDecode();
00128                        
00129             if (ctrlrA.getButtonA() == 0)
00130             {
00131                 buttons |= BUTTON_A;
00132                 //serial.printf("A ");
00133             }
00134             
00135             if (ctrlrA.getButtonB() == 0)
00136             {
00137                 buttons |= BUTTON_B;
00138                 //serial.printf("B ");
00139             }
00140             
00141             if (ctrlrA.getButtonDD() == 0)
00142             {
00143                 buttons |= BUTTON_DOWN;
00144                 //serial.printf("D ");
00145             }
00146             
00147             if (ctrlrA.getButtonDU() == 0)
00148             {
00149                 buttons |= BUTTON_UP;
00150                 //serial.printf("U ");
00151             }
00152             
00153             if (ctrlrA.getButtonDL() == 0)
00154             {
00155                 buttons |= BUTTON_LEFT;
00156                 //serial.printf("U ");
00157             }
00158             
00159             if (ctrlrA.getButtonDR() == 0)
00160             {
00161                 buttons |= BUTTON_RIGHT;
00162                 //serial.printf("U ");
00163             }
00164             
00165             if (ctrlrA.getButtonSTART() == 0)
00166             {
00167                 buttons |= BUTTON_START;
00168                 //serial.printf("U ");
00169             }
00170             
00171             if (ctrlrA.getButtonSELECT() == 0)
00172             {
00173                 buttons |= BUTTON_SELECT;
00174                 //serial.printf("U ");
00175             }
00176 
00177             // Active Low
00178             cpuState.New->IN = buttons ^ 0xFF;
00179         } 
00180         else if ((cycles % (HZ / 100)) == 0)
00181         {
00182             ctrlrA.ControllerWriteCmd();
00183         }
00184         /*
00185         else if ((cycles % (HZ / 100)) == 0)
00186         {
00187             if (serial.readable() == 1) 
00188             {
00189                 char c = serial.getc();
00190                 
00191                 serial.printf("%c", c);
00192                 
00193                 switch(c)
00194                 {
00195                     case 13:
00196                         c = 10;
00197                         break;
00198                 }               
00199                 
00200                 cpuState.New->IN = c;
00201             }
00202         }
00203         */
00204         
00205         justStarted = false;   
00206     }
00207 }