Автор Тема: Собираем Figher Pad для SEGA DreamCast своими руками.  (Прочитано 9931 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн masyanya

  • Пользователь
  • Сообщений: 545
  • Пол: Мужской
  • ...there's no knowledge that is not power...
    • Youtube
    • Просмотр профиля
Забавная мысль тут появилась, сделать переходник для сеги Дримкаст, такой как я собирал для USB.
Смысл такой, обираешь переходник, втыкаешь его в дрим, втыкаешь в него джой для NES или для Genesis, и играешь в любимые игрухи на дриме через эмулятор, я надеюсь что щаз абсолютног не секрет что для дрима есть неплохие эмуляторы NES, вот тока дримовские джой недают насладиться в полной мере... Или скажем продавались для дрима джои похожие на Genesis'овские шоб в Dead Or Alive играть, а тут можно будет генезисовским поиграть, эта идея выглядит ещё более заманчивой потому как... если я правильно понимаю в один порт их можно будет воткнуть несколько штук через один переходник. Сёння подрубил тока один джой от NES, Simbas, который похож на джой от Генезиса. Завтра всю инфу включая прошивку выложу, а то щаз мозх уже не варит.... :wow:

Оффлайн Йобан Матич

  • Emu-Land Team
  • Сообщений: 2593
  • Пол: Мужской
    • Просмотр профиля
masyanya,
Следующей темой будет "DreamCast своими руками" =)

Оффлайн masyanya

  • Пользователь
  • Сообщений: 545
  • Пол: Мужской
  • ...there's no knowledge that is not power...
    • Youtube
    • Просмотр профиля
 Вряд ли, тут 5 микросхем, из которых 4-ре производяться с 1988 года по сей день. А в дриме, да том помоему кроме флешь памятошек ничё и не достать. А чем не устраивает джой для дрима своими руками? Вон скока народа у кого джои погорели достать негде даже жалкое подобие!

 Нефиг издеваться. <_<

Добавлено позже:
И кстати... если чё-то ненравиться, я могу сдесь вообще ничего не выкладывать. Тока скажите.  >:(

Оффлайн alex

  • Пользователь
  • Сообщений: 1076
  • Пол: Мужской
    • Просмотр профиля
Забавная мысль тут появилась, сделать переходник для сеги Дримкаст, такой как я собирал для USB.
Смысл такой, обираешь переходник, втыкаешь его в дрим, втыкаешь в него джой для NES или для Genesis, и играешь в любимые игрухи на дриме через эмулятор, я надеюсь что щаз абсолютног не секрет что для дрима есть неплохие эмуляторы NES, вот тока дримовские джой недают насладиться в полной мере... Или скажем продавались для дрима джои похожие на Genesis'овские шоб в Dead Or Alive играть, а тут можно будет генезисовским поиграть, эта идея выглядит ещё более заманчивой потому как... если я правильно понимаю в один порт их можно будет воткнуть несколько штук через один переходник. Сёння подрубил тока один джой от NES, Simbas, который похож на джой от Генезиса. Завтра всю инфу включая прошивку выложу, а то щаз мозх уже не варит.... :wow:

круто, выкладывай

ещебы под генесисовский пад переходник замутить ведь скоро на подходе полноценный эмулятор Genesis Gens4All

Оффлайн Йобан Матич

  • Emu-Land Team
  • Сообщений: 2593
  • Пол: Мужской
    • Просмотр профиля
masyanya,
Я не издеваюсь.

Клава теперь есть, джой есть. Осталось ещё CD-ROM подключить или DVD(можно будет полные версии играть), лазер тоже садится...
Имхо, лучше от PSX джой подключить, им удобней будет играть Dreamcast'овые игры, да и NES'овские тоже.

Оффлайн alex

  • Пользователь
  • Сообщений: 1076
  • Пол: Мужской
    • Просмотр профиля
Цитата
Имхо, лучше от PSX джой подключить, им удобней будет играть Dreamcast'овые игры, да и NES'овские тоже.
нет спасибо в дримовские игры лучше на дримовском джое играть, чем на этом подобии пада от сони

Оффлайн masyanya

  • Пользователь
  • Сообщений: 545
  • Пол: Мужской
  • ...there's no knowledge that is not power...
    • Youtube
    • Просмотр профиля
Имхо Alex тотально прав!!!  ^_^

Оффлайн Photon9

  • Пользователь
  • Сообщений: 10356
  • Пол: Мужской
  • йОжик сОник
    • Просмотр профиля
Цитата: alex
нет спасибо в дримовские игры лучше на дримовском джое играть, чем на этом подобии пада от сони
Согласен, а удобнее только тому кто никаким кроме соневского не играл, я вот наоборот немог никак долое время к соневскому на компе привыкнуть. Если уж говорить о замене то наверное самый близкий к дримовскому, джой от бокса

Оффлайн Rumata

  • Супермодератор
  • Сообщений: 24708
    • Просмотр профиля
Ну не зря же Микрософт поучаствовал в разработке Дрима  ;)

Оффлайн masyanya

  • Пользователь
  • Сообщений: 545
  • Пол: Мужской
  • ...there's no knowledge that is not power...
    • Youtube
    • Просмотр профиля
Вот и оно:

В приложенных файлах схема, печатка, прошивочки.


Добавлено позже:
На с хеме указано КР1533ИР5, дак вот, это неправда, туда ставим КР1533ИЕ5 или,что ещё лучше SN7493A или SN74LS93A или IN74HC93A, короче ключевые цифирки 74 и 93 (буквы74буквы93, не путать с 74HC193, 74HC293, 74HC393).

Оффлайн Chronoman

  • Пользователь
  • Сообщений: 236
  • Пол: Мужской
  • JRPG тестер
    • Просмотр профиля
 0_0 Фигассе и ты ето сам собрал?! Манак :-\

Оффлайн scooby-do

  • Пользователь
  • Сообщений: 81
    • Просмотр профиля
Chronoman, А че там собирать то?

Оффлайн HardWareMan

  • Модератор
  • Сообщений: 7498
    • Просмотр профиля
Круто! Респекты! Жаль тока что ты ЗЫЧ забросил... Эх...

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3589
    • Twitter
    • Просмотр профиля
Кстати, в паде для Дрима предусмотрены две дополнительные кнопки: C и Z, так что любой пад мог бы быть сегаподобным. Две лишние кнопки предусматриваются протоколом и спецификацией стандартного контроллера, просто не реализованы в оригинальных падах.

Оффлайн masyanya

  • Пользователь
  • Сообщений: 545
  • Пол: Мужской
  • ...there's no knowledge that is not power...
    • Youtube
    • Просмотр профиля
Это вот ты для кого это сейчас? Про это я и так знал, в спецификации то предусмотрены, а в эмуляторах - НЕТ. Мало того там ещё предусмотрен второй цифровай крестик и ещё несколько аналогов:-\

Добавлено позже:
Chronoman, А че там собирать то?
Во первых не собрал, а разработал. Во вторых, - Ну ну, чё-то кроме меня никто не сделал, сам не сделаешь никто не сделает, зато ууууумных потом, чё собирать... нечего там делать... фи как просто... я бы и сам, только занят был... хлеб на масло намазывал...

Упс... походу переборщил... :-)


Добавлено позже:
Вот вом кусочек листинга программы для на затравочку
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <string.h>
#include <avr/sleep.h>

#include "MapleDevices.h"

unsigned long PeripheralFunction=0;


//Mouse
/*
const uint8_t DeviceInformation[] EEMEM={
//Device ID
0x00,0x00,0x02,0x00,
0x00,0x0E,0x07,0x00,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
//Country specification
0xFF,
//Connection method
0x00,
//Model name 30 BYTES
'D','r','e','a','m','c','a','s','t',' ',
'M','o','u','s','e',' ',' ',' ',' ',' ',
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
//License 60 BYTES
'P','r','o','d','u','c','e','d',' ','B',
'y',' ','o','r',' ','U','n','d','e','r',
' ','L','i','c','v','e','n','s','e',' ',
'F','r','o','m',' ','S','E','G','A',' ',
'E','N','T','E','R','P','R','I','S','E',
'S',',','L','T','D','.',' ',' ',' ',' ',
//Standby current consumption - 43 ma
0x01,0x90,
//Maximum current consumption - 50 ma
0x01,0xF4
};
*/
/*
//Keyboard
const uint8_t DeviceInformation[] EEMEM={
//Device ID
0x00,0x00,0x00,0x40,
0x0E,0x04,0x00,0x80,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
//Country specification
0xFF,
//Connection method
0x00,
//Model name 30 BYTES
'1','0','2','k','e','y',' ','K','e','y',
'b','o','a','r','d',' ','f','o','r',' ',
'E','U','R',' ',' ',' ',' ',' ',' ',' ',
//License 60 BYTES
'P','r','o','d','u','c','e','d',' ','B',
'y',' ','o','r',' ','U','n','d','e','r',
' ','L','i','c','v','e','n','s','e',' ',
'F','r','o','m',' ','S','E','G','A',' ',
'E','N','T','E','R','P','R','I','S','E',
'S',',','L','T','D','.',' ',' ',' ',' ',
//Standby current consumption - 43 ma
0x01,0xAE,
//Maximum current consumption - 50 ma
0x01,0xF4
};
//Free device status is exported from controller
*/

const uint8_t DeviceInformation[] EEMEM ={
//Device ID
0x00,0x00,0x00,0x01,
0x00,0x00,0x04,0xFE,
//0x00,0x0F,0x06,0xFE,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
//Country specification
0xFF,
//Connection method
0x00,
//Model name 30 BYTES
'D','r','e','a','m','c','a','s','t',' ',
'C','o','n','t','r','o','l','l','e','r',
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
//License 60 BYTES
'N','o','t',' ','P','r','o','d','u','c',
'e','d',' ','B','y',' ','o','r',' ','U',
'n','d','e','r',' ','L','i','c','e','n',
's','e',' ','F','r','o','m',' ','S','E',
'G','A',' ','E','N','T','E','R','P','R',
'I','S','E','S',',','L','T','D','.',' ',
//Standby current consumption - 43 ma
0x01,0xAE,
//Maximum current consumption - 50 ma
0x01,0xF4
};

const uint8_t DeviceRevisionInfo[] EEMEM ={
'V','e','r','s','i','o','n',' ','1','.',
'0','0','0',',','2','0','0','7','/','0',
'2','/','1','2',',','A','T','M','E','G',
'A','8','5','1','5','-','6','1','2','5',
'-','A','B',',','N','e','s',' ','T','O',
' ','D','C',' ','M','o','d','u','l','e',
',','l','o','g','i','c',' ','v','e','r',
' ','1','.','0','0','0',' ',' ',' ',' '
};

//Our device address
extern unsigned char DeviceAddress;
//Number of Transmits again
extern unsigned char NumbersOfTramsmits;
//Last Sended command
extern unsigned char PreviousCommand;
//Last Sended Data Size
extern unsigned char PreviousDataSize;


void ProcessDeviceFrame(LPMAPLEFRAME MPFrame)
{
/*
#define   DeviceStatus      0x05
#define   DeviceAllStatus      0x06
#define   DeviceReply         0x07
#define   DataTransfer      0x08
#define   FunctionTypeUnknown   0xFE//Controller
#define   CommandUnknown      0xFD//Controller
#define   FileError         0xFB
#define   LCDError         0xFA
#define   ARError            0xF9
#define   TransmitAgain      0xFC//Host, Controller
*/
   //We receive our device address
   if(DeviceAddress==0)
         DeviceAddress=MapleFrame.DestAP;
   //Is our maple perefirial address?
   if(MapleFrame.DestAP!=DeviceAddress || DeviceAddress==0)
      return;

   MPFrame->DestAP=MPFrame->OriginAP;
   MPFrame->OriginAP=MakeOurDeviceAddress(DeviceAddress);

   switch(MPFrame->Command)
   {
      case   DeviceRequest:      //0x01
         MPFrame->Command=DeviceStatus;
         MPFrame->DataSize=sizeof(DeviceInformation)/4;
         eeprom_read_block(MPFrame->DataLine,DeviceInformation
            ,sizeof(DeviceInformation));
//         memcpy_P(MPFrame->DataLine,DeviceInformation,sizeof(DeviceInformation));
         MapleSend(MPFrame);
         break;
      case   AllStatusRequest:   //0x02
         MPFrame->Command=DeviceAllStatus;
         MPFrame->DataSize=(sizeof(DeviceInformation)+sizeof(DeviceRevisionInfo))/4;
         eeprom_read_block(MPFrame->DataLine,DeviceInformation,
               (sizeof(DeviceInformation)+sizeof(DeviceRevisionInfo)));
//         memcpy_P(MPFrame->DataLine,DeviceInformation,sizeof(DeviceInformation)+sizeof(DeviceRevisionInfo));
         MapleSend(MPFrame);
         break;
      case   DeviceReset:      //0x03
         MPFrame->Command=DeviceReply;
         MPFrame->DataSize=0;
         MapleSend(MPFrame);
      //Hire we must processing "Peripheral is initialized".
         break;
      case   DeviceKill:         //0x04
      //Reply for this command
         MPFrame->Command=DeviceReply;
         MPFrame->DataSize=0;
         MapleSend(MPFrame);
      //Stop interrupt processing
         cli();
      //And halt
         sleep_enable();
         sleep_cpu();
      case   GetCondition:      //0x09
      //Hire we get device status
      //Hire we copy our device condition
      MPFrame->Command=DataTransfer;

         if(!(MPFrame->DataSize=GetDeviceCondition((LPDEVICEINFORMATION)(MPFrame->DataLine))))
            MPFrame->Command=FunctionTypeUnknown;

         MapleSend(MPFrame);
         break;
      case   TransmitAgain:      //0xFC
         if(NumbersOfTramsmits!=0)
         {
            MPFrame->Command=PreviousCommand;
            MPFrame->DataSize=PreviousDataSize;
            MapleSend(MPFrame);
            NumbersOfTramsmits--;
         }
         return;
      case   GetMediaInfo:      //0x0A
      case   BlockRead:         //0x0B
      case   BlockWrite:         //0x0C
      case   SetCondition:      //0x0E
      case   FT4Control:         //0x0F
      case   ARControl:         //0x10
      case   GetLastError:      //0x0D
      default:
            MPFrame->Command=CommandUnknown;
            MPFrame->DataSize=0;
            MapleSend(MPFrame);
          break;
   }
   NumbersOfTramsmits=3;
   PreviousCommand=MPFrame->Command;
   PreviousDataSize=MPFrame->DataSize;
}

/*
+0004   Function type   00h   The function type specifies
+0005      00h   the controller.
+0006      00h   
+0007      01h   
+0008   Read format   FFh   According to the controller format,
+0009      FFh   the controller's data is stored. The
+000a      00h   blocks to be used have been
+000b      00h   declared already by the device ID.
+000c      80h   
+000d      80h   
+000e      80h   
+000f      80h   
*/
unsigned char GetDeviceCondition(LPDEVICEINFORMATION DeviceCond)
{
   //be shure what host is needed data from Controller, not other device!
   //==0x00000100 - Vibration pack... and others
   switch(DeviceCond->FT0&PeripheralFunction)
   {
      case CONTROLLER:
         return GetControllerCondition((LPCONTROLLERCONDITION)DeviceCond);
      case KEYBOARD:
         return GetKeyboardCondition((LPKEYBOARDCONDITION)DeviceCond);
      case MOUSE:
         return GetMouseCondition((LPMOUSECONDITION)DeviceCond);
      case GUN:
         break;
      default:
       break;
   }
 return 0;
}

//Hire we process controller buttons/hooks/d-pad/analog
unsigned char GetMouseCondition(LPMOUSECONDITION MouseCond)
{
//press = '0', release = '1'.
   MouseCond->BTN=DEF_BUTTON|
      MW_BUTTON|
      MA_BUTTON|
      MB_BUTTON;   //Operating button data
//no overflow=0
//AOV0
//AOV1
//AOV2
   MouseCond->AOV=0x0000;   //Analog coordinate overflow
//
   MouseCond->AC1=0x0000;   //X-axis analog coordinate region
   MouseCond->AC2=0x0000;   //Y-axis analog coordinate region
   MouseCond->AC3=0x0000;   //Z-axis analog coordinate region (wheel)
   MouseCond->AC4=ST_CONSTANT;   //Constant (00h-02h, fixed)
   MouseCond->AC5=ST_CONSTANT;   //Constant (00h-02h, fixed)
   MouseCond->AC6=ST_CONSTANT;   //Constant (00h-02h, fixed)
   MouseCond->AC7=ST_CONSTANT;   //Constant (00h-02h, fixed)
   MouseCond->AC8=ST_CONSTANT;   //Constant (00h-02h, fixed)

   return sizeof(MOUSECONDITION)/4;
}

//Hire we process controller buttons/hooks/d-pad/analog
unsigned char GetKeyboardCondition(LPKEYBOARDCONDITION KeybCond)
{
   KeybCond->ChangeKeyBit=0x00;
   KeybCond->LEDInformation=0x00;
   memset(KeybCond->KeyScanCodeArray,0x00,0x06);

   return sizeof(KEYBOARDCONDITION)/4;
}

//Hire we process controller buttons/hooks/d-pad/analog
/*
      ***********CONTROLLER***********
0x00      0x0F      0x06      0xFE
0b00000000   0b00001111   0b00000110   0b11111110
         16,17,18,19   X,Y         Ra,La,Da,Ua,St,A,B
   Bit      7   6   5   4   3   2   1   0
1st Data   0   0   0   0   0   0   0   0
2nd Data   0   0   RB21RB20RB19RB18RB17RB16
3rd Data   RB15RB14RB13RB12RB11RB10RB9   RB8
4th Data   RB7   RB6   RB5   RB4   RB3   RB2   RB1   RB0

   bit      7   6   5   4   3   2   1   0
1st Data   RB7   RB6   RB5   RB4   RB3   RB2   RB1   RB0
2nd Data   RB15RB14RB13RB12RB11RB10RB9   RB8
3rd Data   -------------RB16--------------
4th Data   -------------RB17--------------
5th Data   -------------RB18--------------
6th Data   -------------RB19--------------
7th Data   -------------RB20--------------
8th Data   -------------RB21--------------

   bit      7   6   5   4   3   2   1   0
1st Data   Ra   La   Da   Ua   St   A   B   C
2nd Data   Rb   Lb   Db   Ub   D   X   Y   Z
3rd Data   A17   A16   A15   A14   A13   A12   A11   A10
4th Data   A27   A26   A25   A24   A23   A22   A21   A20
5th Data   A37   A36   A35   A34   A33   A32   A31   A30
6th Data   A47   A46   A45   A44   A43   A42   A41   A40
7th Data   A57   A56   A55   A54   A53   A52   A51   A50
8th Data   A67   A66   A65   A64   A63   A62   A61   A60

         ***********GUN***********
0x00      0x00      0x00      0xFE
0b00000000   0b00000000   0b00000000   0b11111110
                           Ra,La,Da,Ua,St,A,B
*/
unsigned char GetControllerCondition(LPCONTROLLERCONDITION ContCond)
{
//                     X         Ra,La,Da,Ua,St,A,B   
//0b00000000   0b00000000   0b00000100   0b11111110   
   ContCond->ButtonsLO=0xFF;
   ContCond->ButtonsHI=0xFF;
   ContCond->AR_axis=0x00;//Left Lever not pushed
   ContCond->AL_axis=0x00;//Left Lever not pushed
   ContCond->Xa_axis=0x80;//center
   ContCond->Ya_axis=0x80;//center
   ContCond->Not_used_A=0x80;
   ContCond->Not_used_B=0x80;

   ReadNesController(ContCond);
   return sizeof(CONTROLLERCONDITION)/4;
}

//Acks all expansions slots for any devices connected
unsigned char MakeOurDeviceAddress(unsigned char DeviceAddress)
{
   unsigned char ExpDevices=0;
 //Hire We read Expansion devices from slots
 //ExpDevices = FindExpDevices();
   return ExpDevices|DeviceAddress;
}

void GetPeripheralFunctionType(void)
{
   eeprom_read_block(&PeripheralFunction
      ,(const char *)DeviceInformation,sizeof(PeripheralFunction));
}



Добавлено позже:
Есть ещё мыслищи, так что тема ещё не раскрыта.
« Последнее редактирование: 31 Март 2008, 11:43:14 от masyanya »

Оффлайн masyanya

  • Пользователь
  • Сообщений: 545
  • Пол: Мужской
  • ...there's no knowledge that is not power...
    • Youtube
    • Просмотр профиля
Я тут обнаружил что нестер DC не хочет запускаться пока в джой которым играеш не засунешь карточку памяти...