рд╣рдо рдЧреЗрдордкреИрдб рдХреЛ PS1 / PS2 рд╕реЗ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ

рдпрд╛рд░реНрдб рдореЗрдВ рдордИ рдХреА рдЫреБрдЯреНрдЯрд┐рдпрд╛рдВ рд╣реИрдВред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрдмрд╛рдм рдЦрд╛рдиреЗ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдбреНрд░рд╛рдлреНрдЯ рдФрд░ рдмреЛрддрд▓рдмрдВрдж рдкреЗрдп рдкреАрдиреЗ рдХреЗ рд▓рд┐рдПред рдФрд░ рдореИрдВ рд╣рд░ рддрд░рд╣ рдХреА рдмрдХрд╡рд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВред рдирдП рд╕рд╛рд▓ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реЛ рд╕рдХрд╛ред рдкрд╣рд▓рд╛ рдЧреЗрдордкреИрдб (рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдмрд╛рдж рдореЗрдВ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджрд┐рдпрд╛) рдЦрд░реАрджрд╛, рдФрд░ рдЙрд╕рд╕реЗ рдкреВрдЫрддрд╛рдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдореИрдиреБрдЕрд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╡рд╣рд╛рдБ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ 23 рдлрд░рд╡рд░реА рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЙрдкрд╣рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ, рдЬреЛ рдореЛрдЬрд╝реЗ рдореЗрдВ рдкреИрдХ рдлреЛрдо рдирд╣реАрдВ рд╢реЗрд╡рд┐рдВрдЧ рдерд╛, рд▓реЗрдХрд┐рди 600 рд░реВрдмрд▓ред рдЕрдкрдиреЗ рдЖрдк рдХреЛ aliexpress рдкрд░ рдХреБрдЫ рднреА рдЗрдирдХрд╛рд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рдеред рдЬрд╣рд╛рдВ рд╕рд▓рд╛рдИ рд▓реЙрдЬрд┐рдХ рд▓реЙрдЬрд┐рдХ рдПрдирд╛рд▓рд╛рдЗрдЬрд░ рдХреА рдЪреАрдиреА рдХреЙрдкреА рдЦрд░реАрджреА рдЧрдИ рдереАред рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕рдореЗрдВ рд░реБрдЪрд┐ рд╣реИ рд╡реЗ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЬреЛ рд▓реЛрдЧ рдкрдврд╝рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реИрдВ, рд╡реЗ рддреБрд░рдВрдд рдпрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ ред



рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рд▓реЙрдЬрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рдЦрд░рд╛рдм рдХрд░ рджреЗрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЧреЗрдордкреИрдб рдиреЗ рд╕реНрдкрд╖реНрдЯ рд╕реНрд▓реИрдЧ рднреЗрдЬрд╛ рд╣реИред

рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдПрдХ рдХреНрд╖рдгред

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХрдВрд╕реЛрд▓ SPI рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреЗрдордкреИрдб рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╡рд┐рдирд┐рдпрдорд┐рдд рдореЛрдб рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореЛрдбрдкреИрдб 3, рдлреЙрд░рд╡рд░реНрдб рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдФрд░ рд▓рд╛рдЗрдирдкреИрдб рдкрд░ рддрд░реНрдХ рд╕реНрддрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдЧреЗрдордкреИрдб "0" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЧреБрд▓рд╛рдо рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдХреНрд▓рдХ рд▓рд╛рдЗрди рдкрд░ рдЖрд╡реГрддреНрддрд┐ 250 kHz рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ 100 kHz рдХрд┐рдпрд╛, рдФрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ, рдпрд╣рд╛рдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ ред рдФрд░ рдЧреЗрдордкреИрдб рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХреА рдкреНрд░рдгрд╛рд▓реА, рдФрд░ рдпрд╣рд╛рдВ рдЙрддреНрддрд░реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ред рд░реЗрдбрд┐рдпреЛрдХреЙрдЯ рдкреЛрд░реНрдЯрд▓ рдкрд░ рднреА, рдПрдХ рдкреНрд░рдХрд╛рд╢рди рд╣реИ, рд▓реЗрдХрд┐рди рдЯреАрдореЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рдПрдХ рдорд╛рдирдХ рдЧреЗрдордкреИрдб рд╕реЗ рдкреВрдЫрддрд╛рдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдПрдХ рдХрдорд╛рдВрдб рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

0x1 0x42 0x0 0x0 0x0   , -  0xff 0x41 0x5a 0xff 0xff 

рдЬрд╣рд╛рдВ 0x41 рдЧреЗрдордкреИрдб рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ рдЕрдВрддрд┐рдо 2 рдмрд╛рдЗрдЯреНрд╕ рдмрдЯрди рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИред рдПрдирд╛рд▓реЙрдЧ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ рдЖрдкрдХреЛ рдкреИрдХреЗрдЬ рдореЗрдВ 4 рдФрд░ рд╢реВрдиреНрдп рдмрд╛рдЗрдЯреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 0x1, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0   , -  0xff 0x73 0x5a 0xff 0xff 0x80 0x80 0x80 0x80 0x0, 0x0, 0x0, 0x0, 0x0 0x1, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0   , -  0xff 0x73 0x5a 0xff 0xff 0x80 0x80 0x80 0x80 

рдпрд╣рд╛рдВ 0x73 рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧреЗрдордкреИрдб рдПрдирд╛рд▓реЙрдЧ рд╣реИ, рдЕрдВрддрд┐рдо 4 рдмрд╛рдЗрдЯреНрд╕ рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИред

рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЧреЗрдордкреИрдб 3.3 рд╡реА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рд╕реАрдзреЗ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдорд╛рдирдХ рдореЛрдб рдореЗрдВ (рдХреЗрд╡рд▓ рдмрдЯрди рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ), рдЦрдкрдд рд▓рдЧрднрдЧ 2 рдПрдордП рд╣реИ, рдПрдирд╛рд▓реЙрдЧ рдореЛрдб 12 рдПрдордП рдореЗрдВред рдФрд░ рдлрд┐рд░ рдпреЗ 10 рдПрдордП рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рдПрдХ рдПрд▓рдИрдбреА рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдФрд░ 3.3 рд╡реА рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рд▓рд╛рдЗрди рдкрд░, 50 рдПрдордП рддрдХ рдХрд╛ рднрд╛рд░ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рджрд░рдЕрд╕рд▓, рдЧреЗрдордкреИрдб рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА 4 GPIO рдкреЛрд░реНрдЯ рдФрд░ рдкрд╛рд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреЗрд╡рд▓ 6 рддрд╛рд░ред

рддреЛ рдпрд╣рд╛рдБ рд╣реИред рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ GPIO, рдХрд┐ bcm2835, рдХрд┐ wiringPi рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп, SPI рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЦрд░рд╛рдм рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╡реЗ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдлреЙрд░рд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЬ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЧреЛрджреА рдореЗрдВ, рдпрд╣ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╣реАрдВ рдмрд╣реБрдд рдЧрд╣рд░рд╛рдИ рд╕реЗред рдФрд░ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢рд╛рд╕рди рджреНрд╡рд╛рд░рд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдкреИрдХреЗрдЬ рдХреЛ рдЦреБрдж рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ, рдФрд░ рдЧреЗрдордкреИрдб рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рддрд╛ рд╣реИред рдЬрд▓реНрджреА рд╕реЗ рдирд╣реАрдВ рдХрд╣рд╛ред WiringPi рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЗрдВ рдФрд░ рд▓рд┐рдЦреЗрдВ:

 #include <stdio.h> #include <unistd.h> #include <wiringPi.h> #define mosi 12 #define miso 13 #define clk 14 #define ce 5 unsigned char i, b; unsigned char cmd[9] = {0x1, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; int main() { wiringPiSetup () ; //  pinMode (mosi, OUTPUT); pinMode (clk, OUTPUT); pinMode (ce, OUTPUT); pinMode (miso, INPUT); digitalWrite (clk, HIGH); digitalWrite (mosi, LOW); digitalWrite (ce, HIGH); while(1) { unsigned char data[9] = {0}; digitalWrite (ce, LOW); delayMicroseconds(20); for (i = 0; i < 9; i++) { for (b = 0; b < 8; b++) { if (((cmd[i] >> b)&1) == 1) { digitalWrite (mosi, HIGH); digitalWrite (clk, LOW); delayMicroseconds(5); digitalWrite (clk, HIGH); data[i] ^= digitalRead(miso) << b; delayMicroseconds(5); digitalWrite (mosi, LOW); } else { digitalWrite (clk, LOW); delayMicroseconds(5); digitalWrite (clk, HIGH); data[i] ^= digitalRead(miso) << b; delayMicroseconds(5); } } delayMicroseconds(40); } digitalWrite (ce, HIGH); printf("%x %x %x %x %x %x\n", data[3], data[4], data[5], data[6], data[7], data[8]); delayMicroseconds(100); } } 

рд╕рдм рдХреБрдЫ рд╢рд╛рд╕реНрддреНрд░реАрдп рд╣реИ, рд╣рдо GPIO рдкреЛрд░реНрдЯ, рд╡реИрд░рд┐рдПрдмрд▓ рдФрд░ рдХрдорд╛рдВрдб рдХреА рдПрдХ рд╕рд░рдгреА рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рдкреЛрд░реНрдЯ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рдореЛрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ clk, mosi рдФрд░ ce (рдЪрд┐рдк рд╕рдХреНрд╖рдо) рд▓рд╛рдЗрдиреЗрдВ рд░реАрд╕реЗрдЯ рд╣реИрдВред рдлрд┐рд░ 2 рдЪрдХреНрд░ рдмрдирддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рдореЗрдВ, рдХрдорд╛рдВрдб рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ, рдмрд╛рдЗрдЯреНрд╕ рд╕реНрд╡рдпрдВ рдмрд┐рдЯ-рд╡рд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдмрд┐рдЯ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдЗрдХрд╛рдИ рдпрд╛ рдореЛрдЬреА рд▓рд╛рдЗрди рдХреЛ рд╢реВрдиреНрдп рдЖрдкреВрд░реНрддрд┐ рдХреА рдЬрд╛ рд╕рдХреЗред рдФрд░ рдЙрд╕реА рд╕рдордп рд╣рдордиреЗ рдЬрд╡рд╛рдм рдкрдврд╝рд╛ред рдЬрдм рдореИрдВрдиреЗ рдХрд╝реАрдорддреА рдЬрд╡рд╛рдм рджреЗрдЦрд╛:

 0xff 0x41 0x5a 0xff 0xff 

рдореИрдВ рд▓рдЧрднрдЧ рдЫрдд рдкрд░ рдХреВрдж рдЧрдпрд╛ред рдпрд╣рд╛рдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдмрд╛рдПрдВ рдПрдирд╛рд▓реЙрдЧ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣рд╛ рдерд╛ред

 ff ff 80 80 ff 80 ff ff 80 80 ff 80 ff ff 80 80 ff 80 ff ff 80 80 ff 80 ff ff 80 80 ff 80 ff ff 80 80 ff 80 ff ff 80 80 ff 40 ff ff 80 80 ff 4b ff ff 80 80 ff 4b ff ff 80 80 ff 4b ff ff 80 80 ff 4b ff ff 80 80 ff 4b ff ff 80 80 ff 1a ff ff 80 80 ff 1a ff ff 80 80 ff 1a ff ff 80 80 ff 1a ff ff 80 80 ff 1a ff ff 80 80 ff 0 

рдЦреИрд░, рддрдм рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдХреЛрдб рдХреЛ рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдореБрд▓реЗрдЯрд░ рдХреА рдкрд╕рдВрдж рдХреЗ рд╕рд╛рде рд╕рд╡рд╛рд▓ рдЦрдбрд╝рд╛ рдирд╣реАрдВ рд╣реБрдЖред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ PCx_rearmed ред рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреА рддрд░рд╣, рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдЬреЛ рдЗрд╕рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЖрд░рдореНрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдмрд╛рд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред PsxInit рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдирд┐рдХрд▓рд╛, рдпрд╣ r3000a.c рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдЬреЛ рдХреЗрдВрджреНрд░реАрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЬреЛрдбрд╝рд╛ рдФрд░ GPIO рдкреЛрд░реНрдЯ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ред PsxInit рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдореИрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ GPIO рдкреЛрд░реНрдЯреНрд╕ рдкрд░ рд╢реБрд░реБрдЖрддреА рд╕реНрддрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВред рдиреАрдЪреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВред

 #include "r3000a.h" #include "cdrom.h" #include "mdec.h" #include "gte.h" #include <wiringPi.h> #define mosi 12 #define miso 13 #define clk 14 #define ce 5 R3000Acpu *psxCpu = NULL; psxRegisters psxRegs; int psxInit() { SysPrintf(_("Running PCSX Version %s (%s).\n"), PACKAGE_VERSION, __DATE__); wiringPiSetup () ; //  pinMode (mosi, OUTPUT); pinMode (clk, OUTPUT); pinMode (ce, OUTPUT); pinMode (miso, INPUT); digitalWrite (clk, HIGH); digitalWrite (mosi, LOW); digitalWrite (ce, HIGH); #ifdef PSXREC if (Config.Cpu == CPU_INTERPRETER) { psxCpu = &psxInt; } else psxCpu = &psxRec; #else psxCpu = &psxInt; #endif Log = 0; if (psxMemInit() == -1) return -1; return psxCpu->Init(); } 

рдЗрд╕рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдерд╛ рдХрд┐ рдПрдореБрд▓реЗрдЯрд░ рдЧреЗрдордкреИрдб рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЕрдиреБрдХрд░рдг рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ psemu_plugin_defs.h рд╣реИ, рдпрд╣ рд╢рд╛рдорд┐рд▓ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдпрд╣рд╛рдБ рдЗрд╕рдореЗрдВ рд╡рд╣ рд╕рдВрд░рдЪрдирд╛ рд╕рдорд╛рд╣рд┐рдд рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЪрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЧреЗрдордкреИрдб рдХрд╛ рдкреНрд░рдХрд╛рд░ рдорд╛рдирдХ, рдПрдирд╛рд▓реЙрдЧ, рдмрдЯрди рд╕реНрдЯреЗрдЯ рд╡реИрд░рд┐рдПрдмрд▓, рдПрдирд╛рд▓реЙрдЧ рд╕реНрдХреНрд░реАрди рдЪрд░ рдФрд░ рдХрдВрдкрди рдирд┐рдпрдВрддреНрд░рдг рдЪрд░ рд╣реИрдВред

 typedef struct { // controler type - fill it withe predefined values above unsigned char controllerType; // status of buttons - every controller fills this field unsigned short buttonStatus; // for analog pad fill those next 4 bytes // values are analog in range 0-255 where 127 is center position unsigned char rightJoyX, rightJoyY, leftJoyX, leftJoyY; // for mouse fill those next 2 bytes // values are in range -128 - 127 unsigned char moveX, moveY; unsigned char Vib[2]; unsigned char VibF[2]; unsigned char reserved[87]; } PadDataS; 

рддреЛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЗрди рдЪрд░ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реИред рдЗрд╕ рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╣реИрдВред рдЧреЗрдордкреИрдб рдкреНрд▓рдЧрдЗрди рд╕рд╣рд┐рдд, рдкреНрд▓рдЧрдЗрдиреНрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ dfinput рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд pad.c рдлрд╝рд╛рдЗрд▓ рд╕реНрдерд┐рдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЧреЗрдордкреИрдб рд╕реНрдерд┐рддрд┐ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рднреАред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдХреЛрдб рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкреЛрд░реНрдЯ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рднреА рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдЪрд░ рднреА рд╣реИрдВ рдЬреЛ рдЧреЗрдордкреИрдб рдХреЛ рднреЗрдЬреЗ рдЧрдП рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрди рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреЗрдордкреИрдб рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдиреАрдЪреЗ рдЗрд╕ рдХреЛрдб рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реИ:

 #include <stdint.h> #include "../include/psemu_plugin_defs.h" #include "main.h" #include <wiringPi.h> #define mosi 12 #define miso 13 #define clk 14 #define ce 5 unsigned char a, b; unsigned char cmd[9] = {0x1, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; enum { ANALOG_LEFT = 0, ANALOG_RIGHT, ANALOG_TOTAL }; enum { CMD_READ_DATA_AND_VIBRATE = 0x42, CMD_CONFIG_MODE = 0x43, CMD_SET_MODE_AND_LOCK = 0x44, CMD_QUERY_MODEL_AND_MODE = 0x45, CMD_QUERY_ACT = 0x46, // ?? CMD_QUERY_COMB = 0x47, // ?? CMD_QUERY_MODE = 0x4C, // QUERY_MODE ?? CMD_VIBRATION_TOGGLE = 0x4D, }; 

рд╣рдо рдкрд╣рд▓реЗ рдПрдХ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп 42 рд╣реИред рдпрд╣рд╛рдВ, рдЬрдм рдЗрд╕ рдЪрд░ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдпрд╣ рдЦрд╛рд▓реА рд╣реИред рдФрд░ do_cmd рдХрдорд╛рдВрдб рдПрдиреНрдпреВрдорд░реЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдореИрдВрдиреЗ рдореБрдЦреНрдп рдХреЛрдб рдбрд╛рд▓рд╛:

 static uint8_t do_cmd(void) { PadDataS *pad = &padstate[CurPad].pad; int pad_num = CurPad; unsigned char data[9] = {0}; CmdLen = 8; switch (CurCmd) { case CMD_SET_MODE_AND_LOCK: buf = stdmode[pad_num]; return 0xF3; case CMD_QUERY_MODEL_AND_MODE: buf = stdmodel[pad_num]; buf[4] = padstate[pad_num].PadMode; return 0xF3; case CMD_QUERY_ACT: buf = unk46[pad_num]; return 0xF3; case CMD_QUERY_COMB: buf = unk47[pad_num]; return 0xF3; case CMD_QUERY_MODE: buf = unk4c[pad_num]; return 0xF3; case CMD_VIBRATION_TOGGLE: buf = unk4d[pad_num]; return 0xF3; case CMD_CONFIG_MODE: if (padstate[pad_num].ConfigMode) { buf = stdcfg[pad_num]; return 0xF3; } // else FALLTHROUGH case CMD_READ_DATA_AND_VIBRATE: digitalWrite (ce, LOW); delayMicroseconds(20); for (a = 0; a < 9; a++) { for (b = 0; b < 8; b++) { if (((cmd[a] >> b)&1) == 1) { digitalWrite (mosi, HIGH); digitalWrite (clk, LOW); delayMicroseconds(5); digitalWrite (clk, HIGH); data[a] ^= digitalRead(miso) << b; delayMicroseconds(5); digitalWrite (mosi, LOW); } else { digitalWrite (clk, LOW); delayMicroseconds(5); digitalWrite (clk, HIGH); data[a] ^= digitalRead(miso) << b; delayMicroseconds(5); } } delayMicroseconds(40); } digitalWrite (ce, HIGH); pad->buttonStatus = data[4]; pad->buttonStatus = pad->buttonStatus << 8; pad->buttonStatus |= data[3]; pad->rightJoyX = data[5]; pad->rightJoyY = data[6]; pad->leftJoyX = data[7]; pad->leftJoyY = data[8]; default: buf = stdpar[pad_num]; buf[2] = pad->buttonStatus; buf[3] = pad->buttonStatus >> 8; if (padstate[pad_num].PadMode == 1) { buf[4] = pad->rightJoyX; buf[5] = pad->rightJoyY; buf[6] = pad->leftJoyX; buf[7] = pad->leftJoyY; } else { CmdLen = 4; } return padstate[pad_num].PadID; } } 

рдлрд┐рд░, рдЬрдм рд╡рд░реНрддрдорд╛рди рдХрдорд╛рдВрдб рдкрдврд╝ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЧреЗрдордкреИрдб рдХреЛ рдкреЛрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдЪрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдПрдореБрд▓реЗрдЯрд░ рдЦреБрдж рдЙрдиреНрд╣реЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╕рдм, рдпрд╣ рдХреЗрд╡рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП wirigPi рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдореЗрдХрдлрд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

 # Makefile for PCSX ReARMed # default stuff goes here, so that config can override TARGET ?= pcsx CFLAGS += -Wall -ggdb -Ifrontend -ffast-math -I/usr/include -I/usr/include/SDL LDLIBS += -lpthread -lSDL -lpng -lwiringPi ifndef DEBUG CFLAGS += -DNDEBUG -g endif CXXFLAGS += $(CFLAGS) #DRC_DBG = 1 #PCNT = 1 

рдФрд░ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдПрдирд╛рд▓реЙрдЧ рдЧреЗрдордкреИрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдореБрд▓реЗрдЯрд░ рдХреЛ рдЙрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ PS1 рдХреЗ рд▓рд┐рдП рдХрдИ рдЧреЗрдо рдирд╣реАрдВ рд╣реИрдВ, рдореИрдВрдиреЗ рд▓рдЧрднрдЧ 7 рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдХрд╣реАрдВ рдкрд░ рдЪреЗрдХ рдХрд┐рдпрд╛ред рдпрд╣ рдЯреЙрдореНрдм рд░реЗрдбрд░ 2 рдФрд░ рдиреНрдпреВрдХреНрд▓рд┐рдпрд░ рд╕реНрдЯреНрд░рд╛рдЗрдХ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдЧреЗрдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдЧреЗрдордкреИрдб рдХреНрдпрд╛ рд╣реИред рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдорд╛рдирдХ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкреБрдирд╢реНрдЪ рдПрдореБрд▓реЗрдЯрд░ рд╕реНрд╡рдпрдВ рдЕрдиреБрдХреВрд▓рди рдЭрдВрдбреЗ рдХреЗ рд╕рд╛рде рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдпрд╣ рдпрд╣рд╛рдБ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ ред

Source: https://habr.com/ru/post/hi403753/


All Articles