Приставки > Джойстики и прочие манипуляторы
Собираем Figher Pad для SEGA DreamCast своими руками.
(1/1)
masyanya:
Забавная мысль тут появилась, сделать переходник для сеги Дримкаст, такой как я собирал для USB.
Смысл такой, обираешь переходник, втыкаешь его в дрим, втыкаешь в него джой для NES или для Genesis, и играешь в любимые игрухи на дриме через эмулятор, я надеюсь что щаз абсолютног не секрет что для дрима есть неплохие эмуляторы NES, вот тока дримовские джой недают насладиться в полной мере... Или скажем продавались для дрима джои похожие на Genesis'овские шоб в Dead Or Alive играть, а тут можно будет генезисовским поиграть, эта идея выглядит ещё более заманчивой потому как... если я правильно понимаю в один порт их можно будет воткнуть несколько штук через один переходник. Сёння подрубил тока один джой от NES, Simbas, который похож на джой от Генезиса. Завтра всю инфу включая прошивку выложу, а то щаз мозх уже не варит.... :wow:
Йобан Матич:
masyanya,
Следующей темой будет "DreamCast своими руками" =)
masyanya:
Вряд ли, тут 5 микросхем, из которых 4-ре производяться с 1988 года по сей день. А в дриме, да том помоему кроме флешь памятошек ничё и не достать. А чем не устраивает джой для дрима своими руками? Вон скока народа у кого джои погорели достать негде даже жалкое подобие!
Нефиг издеваться. <_<
Добавлено позже:
И кстати... если чё-то ненравиться, я могу сдесь вообще ничего не выкладывать. Тока скажите. >:(
alex:
--- Цитата: masyanya от 30 Март 2008, 21:41:08 ---Забавная мысль тут появилась, сделать переходник для сеги Дримкаст, такой как я собирал для USB.
Смысл такой, обираешь переходник, втыкаешь его в дрим, втыкаешь в него джой для NES или для Genesis, и играешь в любимые игрухи на дриме через эмулятор, я надеюсь что щаз абсолютног не секрет что для дрима есть неплохие эмуляторы NES, вот тока дримовские джой недают насладиться в полной мере... Или скажем продавались для дрима джои похожие на Genesis'овские шоб в Dead Or Alive играть, а тут можно будет генезисовским поиграть, эта идея выглядит ещё более заманчивой потому как... если я правильно понимаю в один порт их можно будет воткнуть несколько штук через один переходник. Сёння подрубил тока один джой от NES, Simbas, который похож на джой от Генезиса. Завтра всю инфу включая прошивку выложу, а то щаз мозх уже не варит.... :wow:
--- Конец цитаты ---
круто, выкладывай
ещебы под генесисовский пад переходник замутить ведь скоро на подходе полноценный эмулятор Genesis Gens4All
Йобан Матич:
masyanya,
Я не издеваюсь.
Клава теперь есть, джой есть. Осталось ещё CD-ROM подключить или DVD(можно будет полные версии играть), лазер тоже садится...
Имхо, лучше от PSX джой подключить, им удобней будет играть Dreamcast'овые игры, да и NES'овские тоже.
alex:
--- Цитата ---Имхо, лучше от PSX джой подключить, им удобней будет играть Dreamcast'овые игры, да и NES'овские тоже.
--- Конец цитаты ---
нет спасибо в дримовские игры лучше на дримовском джое играть, чем на этом подобии пада от сони
masyanya:
Имхо Alex тотально прав!!! ^_^
Photon9:
--- Цитата: alex ---нет спасибо в дримовские игры лучше на дримовском джое играть, чем на этом подобии пада от сони
--- Конец цитаты ---
Согласен, а удобнее только тому кто никаким кроме соневского не играл, я вот наоборот немог никак долое время к соневскому на компе привыкнуть. Если уж говорить о замене то наверное самый близкий к дримовскому, джой от бокса
Rumata:
Ну не зря же Микрософт поучаствовал в разработке Дрима ;)
masyanya:
Вот и оно:
В приложенных файлах схема, печатка, прошивочки.
Добавлено позже:
На с хеме указано КР1533ИР5, дак вот, это неправда, туда ставим КР1533ИЕ5 или,что ещё лучше SN7493A или SN74LS93A или IN74HC93A, короче ключевые цифирки 74 и 93 (буквы74буквы93, не путать с 74HC193, 74HC293, 74HC393).
Chronoman:
0_0 Фигассе и ты ето сам собрал?! Манак :-\
scooby-do:
Chronoman, А че там собирать то?
HardWareMan:
Круто! Респекты! Жаль тока что ты ЗЫЧ забросил... Эх...
CaH4e3:
Кстати, в паде для Дрима предусмотрены две дополнительные кнопки: C и Z, так что любой пад мог бы быть сегаподобным. Две лишние кнопки предусматриваются протоколом и спецификацией стандартного контроллера, просто не реализованы в оригинальных падах.
masyanya:
Это вот ты для кого это сейчас? Про это я и так знал, в спецификации то предусмотрены, а в эмуляторах - НЕТ. Мало того там ещё предусмотрен второй цифровай крестик и ещё несколько аналогов:-\
Добавлено позже:
--- Цитата: scooby-do от 31 Март 2008, 08:58:01 ---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));
}
Добавлено позже:
Есть ещё мыслищи, так что тема ещё не раскрыта.
masyanya:
Я тут обнаружил что нестер DC не хочет запускаться пока в джой которым играеш не засунешь карточку памяти...
Навигация
Перейти к полной версии