Family Basic

Para comentar los proyectos de hardware presentados en la web.
xt5
expert
expert
Mensajes: 512
Registrado: Mar Sep 18, 2007 1:16 am
Reputación: 0
Contactar:

Family Basic

Mensaje por xt5 »

En un minuto de procrastinacion, me puse a revisar algo de Family Basic (BASIC para Famicom), esta interesante, sobre todo por los famosos computadores GLK que son muy baratos y traen Family Basic incorporado.

Asi que este hilo podria tratar de avances con este tema, que da para mucho.

Me puse a hacerle un poco de ingenieria inversa al bytecode del Family Basic y pude hacer rapidamente un "decompilador" (patudamente lo llamo asi, no es un decompilador).

Mi decompilador funciona para los archivos "compilados" de Family Basic 3 (luego tal vez integre las otras versiones). Los programas que probe son los que vienen en la ROM "Family BASIC (Japan) (v3.0).nes": 4 juegos que para llamarlos hay que escribir "GAME 0", "GAME 1", etc...

El uso es bastante sencillo:

Código: Seleccionar todo

decompilador0 <binario> <base>
binario: el archivo con el bytecode
base: la base donde se encuentra el bytecode dentro del archivo
link de descarga

aqui esta el codigo fuente de esos 4 jueguillos decompilados (busque en internet y no encontre referencias)

GAME 0: (base 0x5410)
► Mostrar Spoiler
GAME 1: (base 0x5c0e)
► Mostrar Spoiler
GAME 2: (base 0x6692)
► Mostrar Spoiler
GAME 3: (base 0x7318)
► Mostrar Spoiler
Luego hare el compilador, mi idea final es conseguir uno de estos GLK y conectarlo al PC por uno de esos cables USB de tres-lukas-quinientos, teniendo BASIC ya es bastante facil.

Ahora necesito un GLK para seguir jugando, pero las posibilidades de verdad son infinitas y no se como esos GLK no son usados como plataforma de desarrollo aun.

Tambien seria bueno tener unas muestras de el audio que se grababa a las cintas ya que no he podido hacer funcionar el dispositivo de cinta del Nestopia.
Avisenme si alguien tiene algun buen dato sobre estos GLK.
Avatar de Usuario
ZZT
Site Admin
Site Admin
Mensajes: 10907
Registrado: Mar Nov 07, 2006 2:45 pm
Reputación: 10
Ubicación: La Florida-Santiago-Chile
Contactar:

Re: Family Basic

Mensaje por ZZT »

xt5 escribió:Avisenme si alguien tiene algun buen dato sobre estos GLK.
Estoy seguro que vi uno hace dos semanas, no creo que alguien haya comprado asi que el dgo. voy a por él. :-D
Avatar de Usuario
Walky
expert
expert
Mensajes: 3857
Registrado: Jue Nov 09, 2006 1:59 pm
Reputación: 0
Ubicación: No sé! XD
Contactar:

Re: Family Basic

Mensaje por Walky »

xt5 escribió:procrastinacion
¡Por fin otro seguidor de tan soberbio concepto!
xt5
expert
expert
Mensajes: 512
Registrado: Mar Sep 18, 2007 1:16 am
Reputación: 0
Contactar:

Re: Family Basic

Mensaje por xt5 »

ZZT escribió:
xt5 escribió:Avisenme si alguien tiene algun buen dato sobre estos GLK.
Estoy seguro que vi uno hace dos semanas, no creo que alguien haya comprado asi que el dgo. voy a por él. :-D
Seria genial que estuviera, se me hace que no son tan dificiles de encontrar ya que los siguen produciendo, pero de ahi a toparme con uno...
Walky escribió:¡Por fin otro seguidor de tan soberbio concepto!
Es un problema complicado, sobretodo cuando llegas a limites donde te distraes de las distracciones jaja.

Avancé bastante con el asunto y ahora hice un programa para extraer el bytecode de una cinta del Famicom Data Recorder, funciona para archivos de audio y las cintas generadas por el Nestopia.

link de descarga

su uso es bastante sencillo:
depwn <archivo> <tipo>
tipo 1: cintas del Nestopia
tipo 2: archivos PCM de 16bits


y esto nos generará un archivo llamado bytecode.bin con el bytecode extraido.

Este tema es bastante esquivo en internet la unica cinta que pude encontrar luego de MUCHA busqueda fue la que aparece en un thread de Famicom World

Entonces convirtiendo ese archivo a PCM de 16bits con cualquier editor de audio, hacemos:
depwm wrap.pcm 2
decompiler0 bytecode.bin 0


y obtenemos el codigo fuente original de la cinta:

Código: Seleccionar todo

100 CLS:CGSET1,1
110 SPRITEON
120 PA=164:PB=209:XA=13:YA=10:FM=0
130 A1$=CHR$(PA)+CHR$(PA+1)+CHR$(PA+2)+CHR$(PA+3)
140 A2$=CHR$(PA+1)+CHR$(PA)+CHR$(PA+3)+CHR$(PA+2)
150 A3$=CHR$(PA+8)+CHR$(PA+9)+CHR$(PA+10)+CHR$(PA+11)
160 A4$=CHR$(PA+10)+CHR$(PA+11)+CHR$(PA+8)+CHR$(PA+9)
170 B1$=CHR$(PB)
180 B2$=CHR$(PB+4)
200 '------
210 AX=0:AY=0:DX=0:DY=0
220 K=STICK(0):IF K=0 THEN PAUSE 2: GOTO 400
230 KK=K
240 IF K=1 THEN AX=1:PA$=A2$:DX=1
250 IF K=2 THEN AX=-1:PA$=A1$
260 IF K=4 THEN AY=1:PA$=A4$:DY=1
270 IF K=8 THEN AY=-1:PA$=A3$
280 XA=XA+AX:YA=YA+AY
290 IF XA>27 THEN XA=0
300 IF XA<0 THEN XA=27
310 IF YA>23 THEN YA=0
320 IF YA<0 THEN YA=23
330 DEF SPRITE 0,(0,1,0,DX,DY)=PA$
340 SPRITE 0,XA*8+12,YA*8+15
400 '-------
410 IF FM<>1 THEN PAUSE1: GOTO 500
420 NB=NB-1
430 IF NB<0 OR XB>27 OR XB<0 OR YB>23 OR YB<0 THEN FM=0:SPRITE 1:GOTO 500
440 XB=XB+BX:YB=YB+BY
450 SPRITE 1,XB*8+16,YB*8+19
460 GOTO 600
500 KG=STRIG(0):IF KG<>8 GOTO 600
510 NB=14:FM=1:XB=XA:YB=YA
520 IF KK=1 THEN BX=2:BY=0:PB$=B1$
530 IF KK=2 THEN BX=-2:BY=0:PB$=B1$
540 IF KK=4 THEN BX=0:BY=2:PB$=B2$
550 IF KK=8 THEN BX=0:BY=-2:PB$=B2$
560 DEF SPRITE 1, (3,0,0,0,0)=PB$
600 '------
610 GOTO 200
Me intriga saber como son los cartuchos de esos GLK, deberia traer algo de RAM y con algo de suerte una EEPROM :)
Avatar de Usuario
133MHz
expert
expert
Mensajes: 1950
Registrado: Sab Abr 05, 2008 2:06 pm
Reputación: 0
Ubicación: Santiago, Chile
Contactar:

Re: Family Basic

Mensaje por 133MHz »

xt5 escribió:En un minuto de procrastinacion, me puse a revisar algo de Family Basic (BASIC para Famicom), esta interesante, sobre todo por los famosos computadores GLK que son muy baratos y traen Family Basic incorporado.
Procrastinar puede ser tan perjudicial... y productivo a la vez :-X

Qué bueno que te metiste con Family BASIC, ya que yo rayo la papa con el Famicom ::ala
Pienso aportar con todo lo que pueda!
xt5 escribió:Ahora necesito un GLK para seguir jugando, pero las posibilidades de verdad son infinitas y no se como esos GLK no son usados como plataforma de desarrollo aun.
El proyecto playpower busca darle utilidad a estos trastos. Yo ya puse de mi parte, tengo uno de esos famiclones teclado con puerto paralelo integrado, el que te permite imprimir desde el editor de texto usando una impresora de matriz de punto. Le hice ingeniería inversa a la interfaz de impresora para que pueda ser replicada en clones que no la traen y para que se puedan desarrollar más programas que la utilicen. Puse la información a disposición del proyecto playpower y en mi blog.

Aunque el puerto implementa el mínimo común denominador para poder manejar una impresora de manera unidireccional pienso que igual se le podría sacar provecho para otros propósitos (parecido a lo que se hace con el puerto paralelo del PC por aficionados a la electrónica).
xt5 escribió:Avisenme si alguien tiene algun buen dato sobre estos GLK.
En San Diego los venden entre 5 y 8 lucas, nuevecitos de paquete completos hasta con mouse o pistola de luz. :wink:
Yo ya he comprado como tres, aparte del GLK-2016 con puerto paralelo que tengo :lol: los baisaneo al extranjero

Imagen
xt5 escribió:Me intriga saber como son los cartuchos de esos GLK, deberia traer algo de RAM y con algo de suerte una EEPROM :)
Exacto, el cartucho trae una RAM de 32KB si mal no recuerdo, y las típicas ROM glob top.

Sobre lo de la interfaz de audio, he aquí el esquemático del teclado original Family BASIC y como verás la etapa de audio consiste de inversores y unos cuantos pasivos conectados a las líneas E/S de expansión, por lo que podrían integrarse a un famiclon teclado común y corriente, incluso a una NES a través del puerto inferior (ideal para guardar los niveles personalizados de Excitebike o Wrecking Crew):

Imagen
Avatar de Usuario
smartfinder
hard player
hard player
Mensajes: 347
Registrado: Lun Nov 13, 2006 11:20 am
Reputación: 0
Ubicación: Entre Quilpué y la NETCOM

Re: Family Basic

Mensaje por smartfinder »

Oigan ponganse una fotito para los que no conocen del tema...

Imagen

PD: esto me suena a una nueva era CASSETTE para FAMICOM CLONE
Avatar de Usuario
Analog
advantage
advantage
Mensajes: 181
Registrado: Mar Ago 03, 2010 11:38 am
Reputación: 0

Re: Family Basic

Mensaje por Analog »

no entiendo absolutamente nada, pero se ve genial!
Avatar de Usuario
noisewave
hard player
hard player
Mensajes: 269
Registrado: Mié Sep 09, 2009 10:29 pm
Reputación: 0
Ubicación: Quilpué, Chile
Contactar:

Re: Family Basic

Mensaje por noisewave »

YO QUIERO UNOOOO!!!! (-o
Avatar de Usuario
Manuelink64
expert
expert
Mensajes: 3585
Registrado: Sab Feb 28, 2009 11:10 pm
Reputación: 0
Ubicación: La Serena...por ahora

Re: Family Basic

Mensaje por Manuelink64 »

como se aprende aquí!!! XD
estaré atento a sus progresos
maestros xt5 y 133mhz!!

Saludos!!

PD: procrastinaciòn user power!!! :-D
Avatar de Usuario
Analog
advantage
advantage
Mensajes: 181
Registrado: Mar Ago 03, 2010 11:38 am
Reputación: 0

Re: Family Basic

Mensaje por Analog »

osea, si mal no entiendo... se puede utilizar este teclado 8 bits para desarrollar programas, o inclusive correr diferentes roms?
?@
Avatar de Usuario
noisewave
hard player
hard player
Mensajes: 269
Registrado: Mié Sep 09, 2009 10:29 pm
Reputación: 0
Ubicación: Quilpué, Chile
Contactar:

Re: Family Basic

Mensaje por noisewave »

Analog escribió:osea, si mal no entiendo... se puede utilizar este teclado 8 bits para desarrollar programas, o inclusive correr diferentes roms?
?@
Tamos igual de perdidos parece... :(
Pero yo quiero aprender también!
Avatar de Usuario
Analog
advantage
advantage
Mensajes: 181
Registrado: Mar Ago 03, 2010 11:38 am
Reputación: 0

Re: Family Basic

Mensaje por Analog »

XD

vi un music composer en ese cart de SO por ahí!

trae un programa para hacer chiptunes!

q genial, pero de seguro es más limitado que las dotes cuequeras de lagos weber.
xt5
expert
expert
Mensajes: 512
Registrado: Mar Sep 18, 2007 1:16 am
Reputación: 0
Contactar:

Re: Family Basic

Mensaje por xt5 »

Analog escribió:no entiendo absolutamente nada, pero se ve genial!
osea, si mal no entiendo... se puede utilizar este teclado 8 bits para desarrollar programas, o inclusive correr diferentes roms?
En un resumen ejecutivo te podria decir que sirve para "trastear", para usar una maquina barata para desarrollar en BASIC o assembler.
Tal vez se puedan correr ROMs, tal vez se pueda usar Basic en un NES original, quien sabe, esto esta recien comenzando a desarrollarse.

Puedes hacer POKEs a los registros del APU :) pero ya depende de ti.
xt5
expert
expert
Mensajes: 512
Registrado: Mar Sep 18, 2007 1:16 am
Reputación: 0
Contactar:

Bootstrapping!!!

Mensaje por xt5 »

Mas avances:

Antes de tener aun un bicho real de estos me puse a buscar cuantas versiones de Basic modificado existen, y me sorprendio la cantidad de parches que tienen todas las versiones que circulan por alli.

La version pirata mas conocida es el G-BASIC, que es el Family Basic 2 con parches para:
-Cambiar el tipo de entrada de teclado Family a teclado Subor.
-Saltarse la enfermante introduccion del Family Basic 2.
-Reemplazar los creditos y el nombre del programa.
-Hacer uso de la RAM adicional (aqui hay algunos problemas).
-Traducir algunas cosas
-Incluir (cambiar) un easter egg
-Deshabilitar la funcion LOAD y SAVE de la cinta... :(

Las combinaciones de parches son muchisimos y las versiones de G-BASIC que andan por alli son montones, documentarlas no tiene mucho sentido.


Breve introduccion a como funciona este Basic:

-No hace chequeos de sintaxis cuando escribes los comandos, es un lenguaje altamente dinamico y evita limitarte, por eso que cualquier barbaridad que hagas se detecta en tiempo de ejecucion, ademas el NES es una plataforma muy piñufla para hacer un chequeo mas completo.
-Cada linea es transformada en una representacion de si misma con bytecode, este bytecode es el que ejecuta el interprete y tambien como se guardan los datos en la cinta.
-Las palabras claves del Basic son tokens, cada uno tiene un numero de identificacion, ejemplo PRINT (0x8B), PAUSE (0x8E), LOAD (0xA5), SAVE (0xA6)

como botaron el LOAD y SAVE?

Aqui hay un listado de los tokens originales que utiliza el BASIC

Código: Seleccionar todo

41C0h: 52 9A 4F 4E 9B 4F 46 46 9C 43 55 54 9D 4E 45 57  RšON›OFFœCUTNEW 
41D0h: 9E 50 4F 4B 45 9F 43 47 53 45 54 A0 56 49 45 57  žPOKEŸCGSET VIEW 
41E0h: A1 4D 4F 56 45 A2 45 4E 44 A3 50 4C 41 59 A4 42  ¡MOVE¢END£PLAY¤B 
41F0h: 45 45 50 A5 4C 4F 41 44 A6 53 41 56 45 A7 50 4F  EEP¥LOAD¦SAVE§PO 
4200h: 53 49 54 49 4F 4E A8 4B 45 59 A9 43 4F 4C 4F 52  SITION¨KEY©COLOR 
4210h: AA 44 45 46 AB 43 47 45 4E AC 53 57 41 50 AD 43  ªDEF«CGEN¬SWAP­C 
4220h: 41 4C 4C AE 4C 4F 43 41 54 45 AF 50 41 4C 45 54  ALL®LOCATE¯PALET 
4230h: B0 45 52 41 EF 58 4F 52 F0 4F 52 F1 41 4E 44 F2  °ERAïXORðORñANDò 
y aqui una version parchada

Código: Seleccionar todo

41C0h: 52 9A 4F 4E 9B 4F 46 46 9C 43 55 54 9D 4E 45 57  RšON›OFFœCUTNEW 
41D0h: 9E 50 4F 4B 45 9F 43 47 53 45 54 A0 56 49 45 57  žPOKEŸCGSET VIEW 
41E0h: A1 4D 4F 56 45 A2 45 4E 44 A3 50 4C 41 59 A4 42  ¡MOVE¢END£PLAY¤B 
41F0h: 45 45 50 A5 4C>0C<41 44 A6 53>0C<56 45 A7 50 4F  EEP¥L.AD¦S.VE§PO 
4200h: 53 49 54 49 4F 4E A8 4B 45 59 A9 43 4F 4C 4F 52  SITION¨KEY©COLOR 
4210h: AA 44 45 46 AB 43 47 45 4E AC 53 57 41 50 AD 43  ªDEF«CGEN¬SWAP­C 
4220h: 41 4C 4C AE 4C 4F 43 41 54 45 AF 50 41 4C 45 54  ALL®LOCATE¯PALET 
4230h: B0 45 52 41 EF 58 4F 52 F0 4F 52 F1 41 4E 44 F2  °ERAïXORðORñANDò
Trashearon el token! y es imposible que el parser reconosca esos tokens, es por eso que al poner LOAD o SAVE en esos Basic parchados da un error de sintaxis. Ademas encontre una version que deshabilita explicitamante la funcionon LOAD con un parche de 5 bytes.


Workaround

Como revertimos esto?
Podemos parchar esto? No: porque esta en la ROM.
Podriamos subir algo de codigo de maquina a la RAM (con POKES) y saltar alli? Si: pero, para recuperar la funcionalidad de Basic habria que escribir muchisimo codigo, no tendria sentido para re-habilitar la carga por cintas. Para algo con USB podria ser, pero para cinta no-no.

Al escribir PRINT "HOLA" en el interprete, este convierte esa linea a bytecode y la ejecuta de forma inmediata, pero cuando ponemos 10 PRINT "HOLA" no estamos pidiendo que ejecute la sentencia inmediatamente, estamos pidiendo que la almacene como la linea 10 de nuestro listado, la sentencia es parseada y convertida a bytecode y luego guardada en la RAM.

Entonces sabiendo donde guarda el bytecode en la RAM, podemos modificarlo y cambiar un token por otro, es decir si yo modifico el token de la linea en cuestion directamente en la RAM puedo transformarla por un 10 PAUSE "HOLA", a pesar de que PAUSE no espere tener argumentos se los podemos poner ya que el chequeo de esto se hace en tiempo de ejecucion como mencione antes.

La direccion de memoria donde se guarda el primer token en el Family Basic 2 es 0x7041, es facil encontrarlo con pequeños codigos como los que posteare abajo.

Entonces ponemos:
10 '
POKE &H7041, &HA5
GOTO 10

y tenemos un LOAD :)

10 '
POKE &H7041, &HA6
GOTO 10

y tenemos un WTF???

---
Pongo un video en youtube (hay que verlo en grande) donde muestro el proceso de como cargar una cinta a pesar de que la funcionalidad fue deshabilitada.

Y aqui unos snippets de codigo en Basic:

Código: Seleccionar todo

500 DIM P$(2):P$(1)=" 0":P$(2)=" "
501 GOTO 999
999 END

600 'HEXDUMP128 O=ADDRESS
601 FOR J=0 TO 16:
602 FOR I=0 TO 8:PRINT P$(LEN(HEX$(PEEK(O+I))));HEX$(PEEK(O+I));:NEXT
603 PRINT ""
604 O=O+8
605 NEXT
606 END
para dumpear 128 bytes del la direccion 0x8000:

GOTO 500

O=&H8000
GOTO 600

para los siguientes:
GOTO 600
y asi...

buscar un valor en memoria (yo lo use para buscar donde quedaban los tokens)
400 FOR I=&H6000 TO &H7FFE:IF PEEK(I)=&H8B THEN PRINT HEX$(I)
401 NEXT

GOTO 400


para sacar un checksum del PRGROM

Código: Seleccionar todo

20 A=0
30 FOR I=&H8000 TO &HFFFF:B=PEEK(I):A=A XOR B:NEXT
40 PRINT HEX$(A)

GOTO 20
para dumpear por la puerta paralela

Código: Seleccionar todo

800 'PARDUMP O=ADDRESS S=SIZE
801 FOR I=ADDRESS TO A+S:POKE &H800,PEEK(i):POKE &H4800,0:NEXT
802 END

O=&H8000:S=0x7FFF
GOTO 800
Con este pequeño ultimo codigo seria bueno que 133MHz dumpeara la ROM de su version de Basic, son solo 4 lineas y del lado del PC es similiar, seria genial que tuvieramos las versiones de Basic que vienen en el GLK para seguir jugando.


Que sigue?

-Cargar un cinta por la puerta paralela de un PC.
-Cargar una cinta por el lineout de algun reproductor, utilizando el circuito que 133MHz posteo.
-Conectar el GLK a un computador.
-Traspasar el hack a un NES sin teclado.
-???
Avatar de Usuario
133MHz
expert
expert
Mensajes: 1950
Registrado: Sab Abr 05, 2008 2:06 pm
Reputación: 0
Ubicación: Santiago, Chile
Contactar:

Re: Bootstrapping!!!

Mensaje por 133MHz »

hasta un easter egg pillaste ::ala
xt5 escribió: Que sigue?

-Cargar un cinta por la puerta paralela de un PC.
-Cargar una cinta por el lineout de algun reproductor, utilizando el circuito que 133MHz posteo.
-Conectar el GLK a un computador.
-Traspasar el hack a un NES sin teclado.
-???
PROFIT!

(obvio :-X)
Responder