;+-------------------------------------------------------------------------+
;¦ MYC.ASM ¦ DESENSAMBLADO DE 8MODCHIP.HEX PARA PSX2 POR MANOLO Y COMPAÑIA ¦
;+-------------------------------------------------------------------------+
; NOTA:
;* Para visualizar este fichero correctamente, usa el edit del dos
; o el bloc de notas del windows con el tipo de fuente 'terminal'
;* El objeto de realizar el desensamblado y comentado del código fuente,
; del 8modchip.hex es con el fin de que todos conozcamos como funciona
; y podamos perfeccionarlo y modificarlo entre todos a nuestro antojo.
;* Espero que al publicarlo en el foro, las mentes pensantes colaboren.
;* Desconozco quien es el autor del hex original pero le felicito por su
; programa.
;* Según aparezcan nuevas versiones del modchip se irán desensamblando
; y publicando.
;* Por favor poner vuestras experiencias en el foro para que lo vea todo
; el mundo.
;* los tiempos de las rutinas son muy críticos.
;* El codigo está más ordenado que en el 8modchip.hex pero es el mismo
; únicamete se han suprimido los caracteres de la tabla que no se usan
; para la versión europea.
;* Sugerencias de assembler o hard: jiglesias@arrakis.es
;--------------------------------------------------------------------------
; +----------------------------------+
; ¦ ESQUEMA DE CONEXIONES PIC12C509A ¦
; +----------------------------------+
;
; +------+ +------+
; ¦ +--+ ¦
; +5V ¦¦1 PIC12C509A 8¦¦ MASA
; ¦ ¦
; SWAPX ¦¦2 GPIO5 GPIO0 7¦¦ DVDIN=0
; ¦ ¦
; DVDOUT=1 ¦¦3 GPIO4 GPIO1 6¦¦ TXSCEE
; ¦ ¦
; /RESET=0 ¦¦4 GPIO3 GPIO2 5¦¦ SWAPY
; ¦ ¦
; +----------------+
;
; 1 - +5VCC - SIN COMENTARIOS
; 2 - SWAPX - SOLO LO USA LA OPCION 3 PARA LA APERTURA Y CIERRE DEL DVD
; 3 - DVDOUT - ES IGUAL A 1 CUANDO LA BANDEJA DEL DVD ESTA SALIENDO
; 4 - /RESET - ES IGUAL A 0 CUANDO PULSAMOS EL RESET DE LA PS2
; 5 - SWAPY - SOLO LO USA LA OPCION 3 PARA LA APERTURA Y CIERRE DEL DVD
; 6 - TXSCEE - ES POR DONDE TRANSMITE VIA SERIE "SCEE"
; 7 - DVDIN - ES IGUAL A 0 CUANDO LA BANDEJA DEL DVD ESTA ENTRANDO
; 8 - MASA - SIN COMENTARIOS
;--------------------------------------------------------------------------
;+---------------------------------+
;¦ PROCESADOR A EMPLEAR PIC12C509A ¦
;+---------------------------------+
P509A EQU 1 ;0=PIC12C508A 1=PIC12C509A
IF P509A
list p=12c509A
include "p12c509A.inc"
ELSE
list p=12c508A
include "p12c508A.inc"
ENDIF
;+-----------------------------------+
;¦ FUSIBLES, WASDOG, OSCILADOR ETC.. ¦
;+-----------------------------------+
__FUSES _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC
;+------------------+
;¦ NOTACION DECIMAL ¦
;+------------------+
radix dec
;--------------------------------------------------------------------------
;+--------------------------+
;¦ VARIABLES DE RAM INTERNA ¦
;+--------------------------+
cblock 0x0B
RAM_0B ;CONTADOR PAUSA
RAM_0C ;CONTADOR CARGA DEL DVD
RAM_0D ;CONTADOR PAUSA
RAM_0E ;CANTIDAD DE BYTES A ENVIAR DE LA TABLA
RAM_0F ;CANTIDAD DE BITS A ENVIAR DEL BYTE
RAM_10 ;NO UTILIZADA
RAM_11 ;CONTADOR W EN PAUSA Wx199
RAM_12 ;CONTADOR 199 EN PAUSA Wx199
RAM_13 ;BYTE LEIDO DE LA TABLA
RAM_14 ;PUNTERO DEL BYTE DE LA TABLA
RAM_15 ;MASCARA ESTADO DE LOS BIT DEL PUERTO
endc
;--------------------------------------------------------------------------
;+-----------------+
;¦ VECTOR DE RESET ¦
;+-----------------+
org 0x00
movwf OSCCAL ;CALIBRA EL OSCILADOR INTERNO
goto COMIENZO ;SALTA LA COMIENZO DEL PROGRAMA
;--------------------------------------------------------------------------
;+--------------------------------------+
;¦ VERSION DEL PROGRAMA (CODIGO INUTIL) ¦
;+--------------------------------------+
retlw 'M'
retlw 'A'
retlw 'N'
retlw 'O'
retlw 'L'
retlw 'O'
retlw ' '
retlw 'Y'
retlw ' '
retlw 'C'
retlw 'O'
retlw 'M'
retlw 'P'
retlw 'A'
retlw 'Ñ'
retlw 'I'
retlw 'A'
;--------------------------------------------------------------------------
;+-----------------------+
;¦ COMIENZO DEL PROGRAMA ¦
;+-----------------------+
COMIENZO
movlw b'11000010' ;CONFIGURA TMR0 PRESCALER = 1:8
option ;OSCILADOR = 4MHZ
movlw 255 ;INICIALIZA TODOS LOS PUERTOS
movwf RAM_15 ;EN ALTO Y RAM_15
tris GPIO ;
;--------------------------------------------------------------------------
;+----------------------------------------+
;¦ PAUSA DE ENCENDIDO DE 414 MILISEGUNDOS ¦
;+----------------------------------------+
movlw 2 ;100 MILISEGUNDOS
movwf RAM_0D ;
ETI_107 call PAUSA50MSG ; +
decfsz RAM_0D,F ;
goto ETI_107 ;
movlw 6 ;300 MILISEGUNDOS
movwf RAM_0D ;
ETI_10C call PAUSA50MSG ; +
decfsz RAM_0D,F ;
goto ETI_10C ;
movlw 14 ;14 MILISEGUNDOS
call PAUSAWX1MSG ;
;--------------------------------------------------------------------------
;+------------------------------------------------------------------+
;¦ LECTURA DE LAS 3 OPCIONES CON EL PULSADOR DE RESET DE LA CONSOLA ¦
;+------------------------------------------------------------------+
;OPCION1 EL RESET NO HA SIDO PULSADO
;-----------------------------------
btfsc GPIO,3 ;SI EL RESET NO ESTA PULSADO
goto OPCION1 ;SALTA A OPCION1
;OPCION2 EL RESET HA SIDO PULSADO Y SE HA SOLTADO ANTES DE 7,5 SEGUNDOS
;----------------------------------------------------------------------
movlw 150 ;
movwf RAM_0D ;
ETI_115 btfsc GPIO,3 ;
goto OPCION2 ;SALTA A OPCION2 AL LEVANTAR EL RESET
call PAUSA50MSG ;
decfsz RAM_0D,F ;
goto ETI_115 ;
;OPCION3 EL RESET HA SIDO PULSADO Y NO SE HA SOLTADO ANTES DE 7,5 SEGUNDOS
;-------------------------------------------------------------------------
goto OPCION3 ;SI CONTINUA PULSADO SALTA A OPCION3
;--------------------------------------------------------------------------
;+---------------------------------------------------+
;¦ OPCION 1 (RESET NO PULSADO) EL MODCHIP SE ¦
;¦ DESHABILITA Y SOLO PODEMOS USAR JUEGOS ORIGINALES ¦
;+---------------------------------------------------+
OPCION1
movlw b'00111111' ;INICIALIZA TODOS LOS
tris GPIO ;PUERTOS EN ALTO Y
sleep ;DESHABILITA EL MODCHIP
;--------------------------------------------------------------------------
;+------------------------------------------------------------------------+
;¦ OPCION 2 (RESET PULSADO DESPUES DE 1 SEG. Y SOLTADO ANTES DE 7,5 SEG.) ¦
;¦ JUEGOS (PSX1 DIRECTOS) Y (PSX2 SIN PROTECCION ANTIMODCHIP CON AR1.3) ¦
;+------------------------------------------------------------------------+
OPCION2
bcf GPIO,1 ;INICIALIZA PUERTO TXSERIE EN ALTO
bcf RAM_15,1 ;
movf RAM_15,W ;
tris GPIO ;
call PAUSA50MSG ;PAUSA CADA 100 TRANSMISIONES
movlw 100 ;100 VECES
movwf RAM_0C ;REPETIRA LA TRANSMISION
ETI_122
btfsc GPIO,0 ;SI EN ESTOS MOMENTOS LA BANDEJA DEL
goto ETI_04C ;DVD YA ESTA DENTRO TRANSMITE SCEE
clrf RAM_14 ;INICIALIZA PUNTERO A TABLA Y
call ENVIASCEE ;TRANSMITE VIA SERIE 100 VECES 'SCEE'
call SUB_04C ;LUEGO ESPERARA A QUE METAMOS OTRO JUEGO
goto ETI_122 ;ANTES DE VOLVER A TRANSMITIR 100 VECES
SUB_04C
ETI_04C
btfsc GPIO,0 ;SI EN ESTOS MOMENTOS LA BANDEJA DEL
goto ETI_050 ;DVD AUN NO ESTA DENTRO SALE
decfsz RAM_0C,F ;SI YA ESTA DENTRO RETORNA HASTA
retlw 3 ;TRANSMITIR LAS 100 VECES 'SCEE'
ETI_050 movlw b'00111111' ;INICIALIZA TODOS PUERTOS
tris GPIO ;COMO ENTRADAS
ETI_052
btfss GPIO,4 ;ESPERA A QUE PULSEMOS LA APERTURA
goto ETI_052 ;DE LA BANDEJA DEL DVD
movlw 250 ;ESPERAMOS UN TIEMPO A LA CONSOLA PARA
call PAUSAWX1MSG ;QUE TERMINE DE ABRIR LA BANDEJA DEL DVD
btfss GPIO,4 ;SI LA BANDEJA DEL DVD TODAVIA NO ESTA
goto ETI_052 ;ABRIENDOSE REPITE LA OPERACION
ETI_058
btfsc GPIO,4 ;SI LA BANDEJA DEL DVD ESTA ABRIENDOSE
goto ETI_058 ;SE ASEGURA A QUE SE ABRA DEL TODO
movlw 24 ;PAUSA DE 6 SEGUNDOS PARA QUE
movwf RAM_0B ;PONGAMOS EL JUEGO EN LA BANDEJA Y
ETI_05C movlw 250 ;PULSEMOS EL BOTON PARA INTRIDUCIRLO
call PAUSAWX1MSG ;EN LA CONSOLA
decfsz RAM_0B,F ;
goto ETI_05C ;
btfsc GPIO,0 ;SI LA BANDEJA DEL DVD ESTA TODAVIA FUERA
goto ETI_052 ;REPITE LA OPERACION
goto OPCION2 ;CUANDO EL DVD YA ESTA DENTRO SALTA OPCION2
;Y COMIENZAN LAS TRANSMISIONES DE 'SCEE'
;--------------------------------------------------------------------------
;+--------------------------------------------------------------------------+
;¦ OPCION 3 (RESET PULSADO DESPUES DE 1 SEG. Y SOLTADO DESPUES DE 7,5 SEG.) ¦
;¦ JUEGOS PSX2 CON PROTECCION ANTIMODCHIP CON AR1.3 ¦
;+--------------------------------------------------------------------------+
OPCION3
btfss GPIO,3 ;ESPERA A QUE SOLTEMOS EL
goto OPCION3 ;BOTON DE RESET
movlw 255 ;INICIALIZA RAM_15 Y TODOS
movwf RAM_15 ;LOS PUERTOS
tris GPIO ;EN ALTO
movlw 80 ;EL MODCHIP FUERZA A LA CONSOLA
movwf RAM_0B ;PARA QUE EXPULSE LA BANDEJA DEL DVD
ETI_132 movlw b'00100100' ; "
movwf GPIO ; "
movlw b'11011011' ; "
tris GPIO ; "
movlw 10 ; "
call PAUSAWX1MSG ; "
movlw b'00100000' ; "
movwf GPIO ; "
movlw b'00011011' ; "
tris GPIO ; "
movlw 10 ; "
call PAUSAWX1MSG ; "
decfsz RAM_0B,F ; "
goto ETI_132 ; "
movlw b'00111111' ; "
tris GPIO ; "
movlw 16 ;PAUSA PARA QUE LA BANDEJA DEL DVD
movwf RAM_0B ;ESTE 4 SEGUNDOS ABIERTA Y NOS DE
ETI_144 movlw 250 ;TIEMPO A PONER EL JUEGO EN ELLA
call PAUSAWX1MSG ; "
decfsz RAM_0B,F ; "
goto ETI_144 ; "
movlw 80 ;EL MODCHIP FUERZA A LA CONSOLA
movwf RAM_0B ;PARA QUE INTRODUZCA LA BANDEJA DEL DVD
ETI_14A movlw b'00010100' ; "
movwf GPIO ; "
movlw b'11101011' ; "
tris GPIO ; "
movlw 10 ; "
call PAUSAWX1MSG ; "
movlw b'00010000' ; "
movwf GPIO ; "
movlw b'11101011' ; "
tris GPIO ; "
movlw 10 ; "
call PAUSAWX1MSG ; "
decfsz RAM_0B,F ; "
goto ETI_14A ; "
movlw b'00111111' ; "
tris GPIO ; "
goto OPCION1 ;DESHABILITA AL MODCHIP Y YA PODEMOS
;EJECUTAR EL JUEGO CON EL MENU DEL AR1.3
;--------------------------------------------------------------------------
;+---------------------------------------------------------------------+
;¦ TRANSMITE VIA SERIE 'SCEE' CON 8 BIT DE DATOS Y 2 DE STOP A 250 BPS ¦
;+---------------------------------------------------------------------+
ENVIASCEE
movwf RAM_0D ;SALVA W EN RAM_0D (INUTIL PUES NO LO USA)
movlw 72 ;72 MILISEGUNDOS DE ESPACIO ENTRE BYTES
call PAUSAWX1MSG ;
movlw 4 ;ENVIAREMOS 4 BYTES
movwf RAM_0E ;DE LA TABLA
ETI_068
movf RAM_14,W ;LEEMOS 1 BYTE DE
call TABLA ;LA TABLA
movwf RAM_13 ;EN RAM_13
comf RAM_13,F ;
movlw 8 ;ENVIAREMOS 8
movwf RAM_0F ;BITS DE CADA BYTE
bsf RAM_15,1 ;ENVIA EL BIT DE START VIA SERIE
movf RAM_15,W ;
tris GPIO ;
movlw 4 ;4 MILISEGUNDOS DEL ANCHO DEL BIT DE START
call PAUSAWX1MSG ;
ETI_073
rrf RAM_13,F ;ENVIA 1 BIT DEL BYTE VIA SERIE
movlw b'11111000' ;
movwf GPIO ;
btfsc STATUS,0 ;
bsf RAM_15,1 ;
btfss STATUS,0 ;
bcf RAM_15,1 ;
movf RAM_15,W ;
tris GPIO ;
movlw 4 ;4 MILISEGUNDOS DEL ANCHO DEL BIT
call PAUSAWX1MSG ;
decfsz RAM_0F,F ;CONTINUAMOS HASTA
goto ETI_073 ;ENVIAR LOS 8 BITS DEL BYTE
bcf RAM_15,1 ;ENVIA 2 BITS DE STOP
movf RAM_15,W ;
tris GPIO ;
movlw 8 ;8 MILISEGUNDOS DEL ANCHO DE
call PAUSAWX1MSG ;LOS 2 BITS DE STOP
incf RAM_14,F ;INCREMENTA PUNTERO DE LA TABLA
decfsz RAM_0E,F ;CONTINUA HASTA
goto ETI_068 ;ENVIAR LOS 4 BYTES DE LA TABLA
retlw 3 ;RETORNA CON W=03H
TABLA addwf PCL,F ;TABLA PARA LA PS2 EUROPEA
retlw 'S'
retlw 'C'
retlw 'E'
retlw 'E'
;--------------------------------------------------------------------------
;+--------------------------+
;¦ PAUSA DE 50 MILISEGUNDOS ¦
;+--------------------------+
PAUSA50MSG
movlw 50
;+------------------------------+
;¦ PAUSA DE (W x 1 MILISEGUNDO) ¦
;+------------------------------+
PAUSAWX1MSG
movwf RAM_11
ETI_042 movlw 199
movwf RAM_12
ETI_044 nop
clrwdt
decfsz RAM_12,F
goto ETI_044
nop
decfsz RAM_11,F
goto ETI_042
retlw 3
;--------------------------------------------------------------------------
end