How install a modchip on the PSX
At first, you need to remove the PSX motherboard from the housing. You need to do:
- Turn the PSX over and remove the screws that are on the edges and corners.
- Position the PSX again with the cover upwards and remove the upper casing, the entire plastic casing covering the inside is removed.
- Remove the optical connectors (Data and power supply), the power supply connector of the logic board, and the data connector of the two Joypads.
- Remove the optics from the support pins. DO NOT TURN THE OPTICS, THE LENS COULD SCRATCH !!!
- Remove the screws that block the metal plate. In version 1002 it is also necessary to unscrew the support screws for the Joypads.
- Remove the metal plate.
- Unscrew the screws that block the logic board of the PSX. They are all placed in a row on the back side of the PSX, above the parallel, the link port and the I / O port. In 7002 it is not necessary to remove the motherboard.
- Remove the card from the housing and turn it over.
- In 7502 it is not necessary to remove the plate on the motherboard, which covers the circuit.
Here are the diagrams for the various PSXs models.
To find out what your model is, read the technical label located under the Playstation.
CHIP PIC 12c5xx
The pic must be programmed, and moreover we need to know what the pins of the chip refer to. Some tutorials refer to patterns that only indicate the numbers of the pins, sometimes the rotation for counting was wrong, so we made the decision to report the image of the chip with the four-sided numbering.
Remember that in all the electronic components you can find a dot or a notch indicating the upper side.
Pin 1 - Vdd = Positive processor power supply from 2.5V to 5.5V
Pin 2 - GP5 / OSC1 / CLKIN = Clock transfer, Not necessary if the program does not include internal clock management, ignore this pin for connecting with 4 wires.
Pin 4 - GP3 / MCLR = Reset transfer, Not necessary if the program does not use the reset, ignore this pin for connection with 4 or 5 wires.
Pin 5 - T0cki / GP2 = Data input and output
Pin 6 - GP1 = Data input and output
Pin 8 - Vss = Negative processor power supply from 2.5V to 5.5V
Following is the code to program the PIC
;
; PIC12C508 version of the "v5.4" serial data chip emulation.
; Written by the Old Crow (Scott Rider) on 6-JUN-97.
; Bug fix on 08-JUN-98 by PIC-NUTTER
;
; Revision History:
;
; P1.01v5 on 19-JAN-97 ;Uses v5.0 chip data
; P1.05 on 29-JAN-97 ;Uses ASCII version of v5.0 data
; P1.051 on 22-FEB-97 ;Fixed tiny, unimportant timing bug
; P1.052 on 06-JUN-97 ;Revised 5-wire version of '508 for 550x
; P1.053 on 08-JUN-97 ;Alternating 4MHz/4.45MHz delay on 5-wire
; P1.054 on 08-MAY-98 ;Fixed timing bug in 5-wire version
; P1.055 on 08-JUN-98 ;Fixed timing bug in 4-wire version to correct
; ;poor resolution on internal RC clock
; ;on the "04 SAN" batch this is approx 0.2uS every
; ;3 intructions, as the original code runs at a
; ;+0.1uS error (every 3) on my JW part I have only corrected
; ;this code by toggling between the original value
; ;and a -0.1uS error (every 3). Hope it works for you......
;
; PIC-NUTTER
;
; ;I have also fixed a small bug on assembly, the lastest
; ;version of MPLAB does not understand "_INT_RC" and has been
; ;changed by MCHIP to "_IntRC_OSC"
;
; P1.056 on 08-OCT-98 ;Due to new psx board mixing signals, this code only outputs
; ;data for a fixed amount of time (20*block of code).
; ; To play a legitimate gold-disk backup of you orginal disk
; ;make sure that you reset the machine with the power switch.
; ;This will send the data header that the PSX wants (and is
; ;missing from your backup.
; ; To play an original disk, power up the PSX, wait approx 30Secs
; ;then press the RESET button, this will not power down the chip
; ;and will allow the original country code info to get to the
; ;PSX. HOWEVER, this does mean that you will not be able to play
; ;out of country cd's i.e. european disks on a japan machine :o(
; ; To over come this problem, simply make a backup of your out
; ;of country disk.
;
; ;Please remeber this is an interim fix.
;
; ;Because of my limited time available to write this free-ware,
; ;I can't spare the time to go any further with this project
; ;unless I have the anti-piracy source code.
;
; ;If you want a chip to play all disks, then please post
; ;the anti-piracy source file to................
; "support@interesting-devices.com"
;
; ;enjoy!
;
;
; PIC-NUTTER
;
;
; This version uses Microchip assembler mnemonics and the
; Microchip MPASM assembler.
;
; Chip is connected in 4-wire or 5-wire fashion:
;
; _______ _______
; | \/ |
; Vdd --+ 1 < < >> 8 +-- Vss
; | |
; GP5/OSC1 --+ 2 < * 7 +-- GP0
; | |
; GP4/OSC2 --+ 3 >> 6 +-- GP1
; | |
; GP3/!MCLR --+ 4 >> 5 +-- GP2/T0CKI
; | |
; +----------------+
;
; 4-wire: " > > " and " < < " indicated pins are connected.
; 5-wire: " > > " and " < < " and " < * " pins are connected.
;
; 4-Wire Operation: Be sure to set the following config options
; on the __FUSES line below: MCLRE_OFF, CP_OFF, WDT_OFF, OSC=INTRC
;
; 5-Wire Operation: (DEFAULT) Be sure to set the following config
; options on the __FUSES line: MCLRE_OFF, CP_OFF, WDT_OFF, OSC=XT
;
; Note: change the "P509 EQU 0" to "P509 EQU 1" below to instruct
; the assembler to make the hex object code for a PIC12C509.
;
P509 EQU 0 ;Default assembles for a PIC12C508
IF P509
list p=12c509
include "p12c509.inc"
ELSE
list p=12c508
include "p12c508.inc"
ENDIF
radix dec
;
; Note: change the "WIRE5 EQU 0" to "WIRE5 EQU 1" below to instruct
; the assembler to make a 5-wire chip which works on all models.
;
WIRE5 EQU 0 ;Default assembles to 4-wire version
IF WIRE5
__FUSES _MCLRE_OFF & _CP_OFF & _WDT_OFF & _XT_OSC ;5-wire
ELSE
__FUSES _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC ;4-wire
ENDIF
cblock 0x07 ;Store variables above control registers
i ;Loop counters
j
k ;/
x ;Used by delay routine
y ;/
xmit ;Transmit data holding register
index ;Index register for table lookups
mode ;Cheap counter used to toggle delay mode on 5-wire/
mode1 ;Cheap counter used to toggle delay to toggle between 249/233
;in 1msec delay, this is to allow for the errors in the 12c508
;internal RC osc.
loops ;number of times to send 3 blocks of data
endc
org 0x00 ;Start of code space
movwf OSCCAL ;Set oscillator calibration reg.
goto start ;Jump into main code segment
;
; Support routines
;
; dly50 -- entry for 50ms delay
; dly_ms -- entry with number of ms in w (1 to 255)
;
dly50 movlw 50 ;Enter here for a 50ms delay
dly_ms movwf x ;/
dy_0 movlw 249 ;1ms loop count on 100x series (pre-SAN batch code or 5-wire)
IF WIRE5
goto store_in_y ;5-wire mode, so variation not needed
ENDIF
btfss mode1,0 ;differnt delay for post-SAN batch code?
movlw 233 ;yes, give it a whirl!
store_in_y
movwf y ;/
dy_1 nop ;Delay loop, default is 4 * 249 = 996 for pre-SAN
;and 4 * 233 = 932 for post-SAN
decfsz y,F
goto dy_1
IF WIRE5
btfss mode,0 ;Which delay length, 1002 cycles or 1113?
goto dy_3
;
; Waste another 112 cycles (5-wire version) for the 4.45MHz clock case.
;
movlw 37
movwf y
dy_2 decfsz y,F ;Waste away
goto dy_2
ENDIF
dy_3 decfsz x,F ;# of 1ms delays
goto dy_0
retlw 3
;
; sendln -- send 4-byte line(s) with a 72ms marker at head of line.
; Enter with number of lines in w.
;
sendln movwf i ;Do this many lines
sl_0 movlw 72 ;Delay 72ms
call dly_ms
movlw 4 ;Do first half of line
movwf j ;/
sl_1 movf index,W ;Restore index
call lines ;Get a data byte..
movwf xmit ;..into xmit buffer
comf xmit,F ;Invert for sending
;
; Send a byte on rb.1. LSB first, 4ms/bit (250 bps) with one
; start bit and two stop bits per byte. Instead of setting and
; clearing the port bit, the port's direction is changed. The actual
; port register is set to zero, so that when the port bit is directed
; to be an output, it automatically goes low. Directing the port bit
; to be an input floats the I/O pin, and the external pullup creates
; the high. This allows open-collector operation of the port bits.
;
movlw 8 ;8 bit bytes
movwf k ;/
movlw b'11111011' ;Start bit on pin 7=1
tris GPIO
movlw 4 ;4ms bit-time
call dly_ms
sl_2 rrf xmit,F ;Get a bit..
movlw b'11111001' ;Keep port bits low when outputs
movwf GPIO ;/
btfsc STATUS,C ;High or low?
movlw b'11111011' ;Set pin 7 high via port direction control
btfss STATUS,C ;High or low?
movlw b'11111001' ;Set pin 7 low via port direction control
tris GPIO ;Set the port
movlw 4 ;Delay 4ms
call dly_ms
decfsz k,F ;Do all bits requested
goto sl_2
movlw b'11111001' ;Stop bits
tris GPIO
movlw 8 ;Two 4ms bit-times
call dly_ms
;
;
incf index,F ;Point to next
decfsz j,F
goto sl_1
decfsz i,F ;Do specified number of lines
goto sl_0
retlw 3
;
; Data block.
;
lines addwf PCL,F ;Get index into table
dt 'S','C','E','I' ;Japanese/NTSC
dt 'S','C','E','A' ;U.S./NTSC
dt 'S','C','E','E' ;European/PAL
;
; Main program loop.
;
org 0x0100
start
movlw b'11000010' ;Set TMR0 prescaler = 1:8 (f_osc=4MHz)
option ;/
movlw b'11111111' ;Make all port bits inputs initially
tris GPIO ;/
IF WIRE5
clrf mode ;Clear delay toggle counter (5-wire)
ENDIF
movlw 40 ;move 40 to w (# of times to loop)
movwf loops ;load register
;
; Step 1 -- approx. 50ms after reset, I/O pin 7 goes low.
;
call dly50 ;Delay 50ms
bcf GPIO,1 ;Make sure it's low
movlw b'11111101' ;Make rb.1 low via port direction
tris GPIO ;/
;
; Step 2 -- approx. 850ms later I/O pin 8 goes low.
;
step2 movlw 17 ;17 x 50ms = 850ms
movwf i ;/
s2_0 call dly50
decfsz i,F
goto s2_0 ;/
bcf GPIO,2 ;Make sure it's low
movlw b'11111001' ;Make rb.2 (and keep rb.1) low
tris GPIO ;/
;
; Step 3 -- wait approx. 314ms
;
step3 movlw 6 ;6 x 50ms = 300ms
movwf i ;/
s3_0 call dly50
decfsz i,F
goto s3_0 ;/
movlw 14 ;Final 14ms
call dly_ms
;
; Step 4 -- clock out all three datagrams on rb.1 ad infinitum.
;
step4 clrf index ;Do first line
call sendln
incf mode1,F ;Toggle delay length for 1ms delay (4-wire version)
IF WIRE5
incf mode,F ;Toggle delay length (5-wire version)
ENDIF
decfsz loops,F ;decrease loop (# of times to send data)
goto step4 ;not zero, send next lot
movlw b'11111111' ;Make rb.1 input (allow normal data to go through)
tris GPIO ;/
loop_4_ever
goto loop_4_ever ;guess!
;
; (Note: do NOT overwrite factory-programmed location 0x1FF !!)
;
; That's all, folks!
;
end