Glosario

Un programa que, usando un ROM, simula (o más correctamente, emula) una computadora en otra computadora. Emu48 emula casi completamente una HP4X bajo Windows, permitiendo a uno usar la calculadora en la pantalla de la computadora.

Dudas descompilando la ROM

9 respuestas [Último envío]
Integró: 30/05/2009
Envíos: 35
MonedasHP: 12
Imagen de woddo
Calc: HP50
Dudas descompilando la ROM
 
Mié, 20/01/2010 - 06:29

He estado descompilando la ROM de la HP50g y me he dado cuenta que hay diferencia en el codigo descompilado dependiendo de l forma en como se haga.
Me explico, si descompilo con EMACS el comando INV de UserRPL, se puede llegar al FPTR ^MATINV, si entramos en él obtenemos lo siguiente:

(^MATINV FPTR 6 34E=6:63C3A)
::
  FPTR2 ^BESTMATRIXTYPE
  PTR 547F4
  PTR 2F211
  PTR 6F13C
  PTR 63C5D
;
@

Si ahora entramos al PTR 547F4 obtenemos lo siguiente:

(6:547F4)
::
  DUPTYPEMATRIX?_
  COLANOTcase
;
@

Ahora, si en EMACS escribimos el PTR 547F4 y lo descompilamos, se obtiene esto

%547F4
GOC  27861
P=0
B=B-C  XS
LC 4
GOSUB 278F2
B=B-C  XS
LC 4
GOSUB 278FC
?B<C  B  ->  278DA
?B<C  B  ->  278DF
?B<C  B  ->  278E4
?B<C  B  ->  278E9
@

Probe de otra forma compilar con MASD el codigo de FPTR ^MATINV, es decir,

::
  FPTR2 ^BESTMATRIXTYPE
  PTR 547F4
  PTR 2F211
  PTR 6F13C
  PTR 63C5D
;

y aplicarlo a una matriz cuadrada en donde no debería haber problemas, la calculadora se cuelga al llegar al PTR 547F4.

A que se debe esta diferencia en los codigos obtenidos?.
Esto lo he visto en muchos comandos y se produce al ocupar FPTR entremedio del código compilado, aunque no con todos los comandos FPTR.
Esto lo probe en mi calculadora con ROM 2.08 y en el EMU con ROM 2.15.

Top
Integró: 25/05/2004
Envíos: 182
MonedasHP: 48
Imagen de HpCarnace
Calc: HP50 | ROM:2.15
 
#1
Dom, 24/01/2010 - 22:04

Bueno, cuando descompilas ^MATINV, ejecutas paso a paso el contenido?, según tengo entendido algunas cosas (especialmente loops) no se ejecutan correctamente paso a paso.

No he probado todavia ^MATINV, pero creo que ese comando sólo funciona con Matrices simbólicas (MATRIX ...; ) y no con ARRY, así que habria que verificar antes de pasarle una matriz como argumento a ese comando.

Con respecto a la forma de descompilar, a mi me aparece con Nosy em SystemRPL, habria que mirar el flag que controla la sintaxis de MASD/SystemRPL (la que permite NOCODE)

Salu2.

...

Top
Integró: 05/06/2003
Envíos: 295
MonedasHP: 92
Imagen de Gaak
Calc: HP50 | ROM:2.15
 
#2
Lun, 25/01/2010 - 13:35

Cuando Ud. entra al FPTR está accediendo al banco 6 (en este caso). Cuando vea direcciones pointer (PTR) mayores a #40000 asuma que ellas no pueden ser evaluadas directamente, sino que ellas pertenecen a un banco.

Para el programa que Ud. expone, deberá evaluarlo en el banco 6, y cómo se hace?

::
  '
  ::
    ( algo )
  ;
  FPTR 6 0
;

Evalúe ahora y me cuenta Wink

- Gaak -

Gustavo Portales | HPcalc | Foro | Videos

Top
Integró: 17/07/2003
Envíos: 107
MonedasHP: 2
Imagen de Oskr
Calc: HP50
 
#3
Mar, 26/01/2010 - 13:41


Cuando Ud. entra al FPTR está accediendo al banco 6 (en este caso). Cuando vea direcciones pointer (PTR) mayores a #40000 asuma que ellas no pueden ser evaluadas directamente, sino que ellas pertenecen a un banco.

Haber si entendí, digamos que tengo el comando:
Nombre: ^IfSetTitle
Dirección: 040004
FPTR 4 40

Dice usted Gaak que no podría compilarlo directamente??
Recuerde que ^IfMain pasa de los 40000 y compila perfecto.
O no aplica para estos?

Me interesa el tema por que estuve tratando con este código, me compila, pero al momento de ejecutarlo se reinicia la HP y creo que es por los bancos, que hago?. (Uso Emacs)

(FPTR 4 54=4:65F7A)
::
  CHECKPVARS
  DROP
  FALSE
  BINT29
  TestSysFlag
  NOT
  'NOP
  {
    LAM 'SHOWAX
    LAM 'AXES
    LAM 'Action
  }
  BIND
  NIBBHEX C2A2046500E0210000004131734001F20290110041601310F0D13202901A6C0060170F0213203100100C00601B0F0215302320010081601710F0F0311402320076002601C10F0F0F153023200C381601810F0F0300B302A200100C1601B10F0F0900B302A2013C1601B10F0F0900B302A20076C1601810F0F0900B302320023C1601710F0F0900B602A200700C3601830F0F0F0F0F0900F20310010041601310F0D00920232001011601F0F0800F202320010041601310F0D00D10310010080060170C005302C10010081601710F0F0300B302C100B2C1601710F0F09005302C1007681601410F0F0300F2031005241601310F0D00F2031004541601310F0D16902901513C2601820F0F0F0F0F0F0F0F03127029012734160210F0F0F0F0F0F1007202100D003872100570F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0D1C6023200913001601C0F0F0F0F0F0A1B70222016880080150CF101800801503181D00700200F10F0F0F0F031B702220053880080150CE3018008015032003A1E00400E30F0F0F0F03002702A200D134160210F0F0F0F0F0F00C602A200C4300160210F0F0F0F0F0900B70292016880080150CF101800801503181D00700200F10F0F0F0F0300C6023200A43001601C0F0F0F0F0F0A00B702920010180080150CE3018008015032003A1E00400E30F0F0F0F0300C42021005130072100D60F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0900C6023200513001601C0F0F0F0F0F0A00C6023200623001601C0F0F0F0F0F0A00C602C100913001601C0F0F0F0F0F0A00C602C100343001601C0F0F0F0F0F0A00B702B1016880080150CF101800801503181D00700200F10F0F0F0F03001A03100933C1B01A10F0F0F0F0F0F0F0F0E001A03100863C1B01A10F0F0F0F0F0F0F0F0E
  TOTEMPOB
  FPTR 4 4D=^IsUncompressDataString
  # 77A
  # 14
  FPTR 4 47=^IfSetAllLabelsMessages
  # 78E
  # 13
  FPTR 4 48=^IfSetAllHelpStrings
  # 7A1
  FPTR 4 40=^IfSetTitle
  '
  PTR 66D17
  PTR 244DF
  '
  PTR 66DFD
  PTR 244DF
  BINT12
  MINUSONE
  2REAL
  PTR 654AA
  TOTEMPOB
  2REAL
  PTR 65F0C
  BINT6
  NTHCOMPDROP
  PTR 654A5
  TOTEMPOB
  DUP
  'DROPFALSE
  BINT12
  MINUSONE
  2REAL
  PTR 65F25
  TOTEMPOB
  2REAL
  PTR 65F43
  TOTEMPOB
  2REAL
  SysITE
  PTR 65F43
  ::
    BINT18
    SysITE
    PTR 65F5C
    PTR 65F2A
  ;
  TOTEMPOB
  '
  PTR 67069
  PTR 244DF
  BINT1
  {
    BINT0
    BINT1
    BINT255d
    BINT5
    BINT6
    BINT8
    BINT9
    BINT13
  }
  BINT4
  MINUSONE
  BINT2
  NULL$
  PTR 16130
  SAFE@_HERE
  ?SKIP
  NULL$
  'DROPFALSE
  BINT1
  {
    BINT6
  }
  BINT5
  MINUSONE
  BINT2
  '
  ID X
  PTR 65F0C
  BINT3
  NTHCOMPDROP
  DUPTYPELIST?
  IT
  CARCOMP
  'DROPFALSE
  BINT32
  MINUSONE
  BINT1
  MINUSONE
  BINT2
  TRUE
  BINT31
  TestSysFlag
  NOT
  'DROPFALSE
  BINT32
  MINUSONE
  BINT1
  MINUSONE
  BINT2
  FALSE
  BINT28
  TestSysFlag
  'DROPFALSE
  BINT1
  {
    BINT0
  }
  BINT3
  MINUSONE
  BINT2
  %10
  PTR 65F0C
  BINT5
  NTHCOMPDROP
  DUPTYPECMP?
  ITE
  ::
    DROP
    %10
  ;
  ::
    DUPTYPELIST?
    NOT?SEMI
    DUP
    CARCOMP
    DUPTYPECMP?
    ITE
    ::
      DROP
      BINT2
      NTHCOMPDROP
      DUPTYPELIST?
      IT
      CARCOMP
    ;
    SWAPDROP
    DUPTYPEHSTR?
    IT
    HXS>%
  ;
  'DROPFALSE
  BINT1
  {
    BINT0
  }
  BINT3
  MINUSONE
  BINT2
  %10
  PTR 65F0C
  BINT5
  NTHCOMPDROP
  DUPTYPECMP?
  ITE
  ::
    DROP
    %10
  ;
  ::
    DUPTYPELIST?
    NOT?SEMI
    BINT2
    NTHCOMPDROP
    DUPTYPELIST?
    IT
    ::
      BINT2
      NTHCOMPDROP
    ;
    DUPTYPEHSTR?
    IT
    HXS>%
  ;
  'DROPFALSE
  BINT32
  MINUSONE
  BINT1
  MINUSONE
  BINT2
  TRUE
  PTR 65F0C
  BINT5
  NTHCOMPDROP
  DUPTYPECMP?
  ITE
  DROPTRUE
  ::
    BINT2
    NTHCOMPDROP
    DUPTYPELIST?
    IT
    CARCOMP
    TYPEHSTR?
  ;
  'DROPFALSE
  BINT1
  {
    BINT6
  }
  BINT5
  MINUSONE
  BINT2
  '
  ID Y
  PTR 65F0C
  BINT7
  NTHCOMPDROP
  DUPTYPELIST?
  IT
  CARCOMP
  'DROPFALSE
  BINT32
  MINUSONE
  BINT0
  MINUSONE
  BINT2
  FALSE
  FALSE
  '
  PTR 67254
  PTR 244DF
  BINT1
  {
    BINT3
  }
  BINT4
  MINUSONE
  BINT2
  NULL$
  PTR 2EFED
  ?SKIP
  NULL$
  '
  PTR 67318
  PTR 244DF
  BINT1
  {
    BINT0
    BINT255d
  }
  BINT3
  MINUSONE
  BINT2
  %1
  NULL$
  '
  PTR 6736A
  PTR 244DF
  BINT1
  {
    BINT0
    BINT255d
  }
  BINT3
  MINUSONE
  BINT2
  %2
  NULL$
  '
  PTR 67379
  PTR 244DF
  BINT1
  {
    BINT0
    BINT255d
  }
  BINT3
  MINUSONE
  BINT2
  Z0_
  PTR 65F0C
  BINT5
  NTHCOMPDROP
  DUPTYPELIST?
  ITE
  ::
    BINT3
    NTHELCOMP
    NOTcase
    Z0_
    DUPTYPECSTR?
    NOTcasedrop
    Z0_
    FPTR 2 CA
    NOTcase
    Z0_
  ;
  FPTR 6 2E0=^DROPZ0
  '
  PTR 673AD
  PTR 244DF
  BINT1
  {
    BINT0
    BINT255d
  }
  BINT3
  MINUSONE
  BINT2
  Z1_
  PTR 65F0C
  BINT5
  NTHCOMPDROP
  DUPTYPELIST?
  ITE
  ::
    BINT4
    NTHELCOMP
    NOTcase
    Z1_
    DUPTYPECSTR?
    NOTcasedrop
    Z1_
    FPTR 2 CA
    NOTcase
    Z1_
  ;
  FPTR 6 2DF=^DROPZ1
  '
  PTR 673BC
  PTR 244DF
  BINT32
  MINUSONE
  BINT1
  MINUSONE
  BINT2
  FALSE
  FALSE
  '
  PTR 674A2
  PTR 244DF
  BINT1
  {
    BINT0
    BINT1
    BINT255d
    BINT6
    BINT8
    BINT9
    BINT13
  }
  BINT3
  MINUSONE
  BINT2
  NULL$
  NULL$
  '
  PTR 674B1
  PTR 244DF
  BINT1
  {
    BINT0
    BINT1
    BINT255d
    BINT6
    BINT8
    BINT9
    BINT13
  }
  BINT3
  MINUSONE
  BINT2
  NULL$
  NULL$
  # 98
  {}N
  FPTR 4 42=^IfMain2
  IT
  ::
    PTR 67916
    DROP
  ;
  1GETABND
  COLA_EVAL
;
@


Saludos desde Ica - Perú
Yo solo puedo enseñarte la puerta, pero tú debes cruzarla...
Gmail: oscarlff

Top
Integró: 17/07/2003
Envíos: 107
MonedasHP: 2
Imagen de Oskr
Calc: HP50
 
#4
Mar, 26/01/2010 - 17:29


Estimados.

Hoy recibí un correo electrónico quejándose de que algunos puntos de entrada se movieron en la ROM 1.19-7 (que envié a un grupo cerrado de beta-testing).
Los puntos de entrada se encuentra en la dirección de 4EA37 (TICKSmin), etc ..
El uso de un punto de entrada que tiene una dirección mayor a 40000 no es realmente bueno y puedo garantizar que todos los programas con estos puntos de entrada harán que su calculadora colapse, las que tienen la ROM desde 1.05 hasta la 1.19-7.

La documentación listando tales puntos de entrada son (pero no limitados a:)
-Programming in System RPL por Eduardo Kalinowski y Carsten Dominic
-EXTABLE por Carsten Dominic
-EXTABLe por Thomas Rast

El problema con los punteros situado en una dirección mayor a 40000 es que no se garantiza de que siempre serán visibles. La ROM con punteros entre 40000 y 7FFFF cambian constantemente.

Una pequeña explicación, usted puede saltar a la Conclusion si lo desea.
Como usted probablemente ya sabra, el mapa de memoria de la HP49 esta compuesta de tres diferentes puntos de vistas o views:

ROM view 0 (0 a 3FFFF)
ROM view 1 (40000 a 7FFFF)
RAM (80000 a FFFFF)
ROM view 0 puede alternar entre 4 diferentes flash banks (bank 0 a 3)
ROM view 1 puede alternar a cualquier flash banks (bank 0 a 15)
ROM view 0 en la practica siempre es configurado para ver el bank 1 de la Flash ROM (excepto si el flash bank se ha dañado, por lo tanto sería otro. Hasta el momento no eh visto una HP49 con el flash bank dañado) el Bank 1 contiene el kernel RPL (administrador de memoria, display, flash support, math library y todos los puntos de entrada reservados).
ROM view 1 es alternado entre diferentes flash bank conteniendo diferentes partes del firmware:
Bank0: Filer, Matrix Writer, MetaKernel dev library, MASD y el plotter 3D.
Bank2: Main system outerloop, printing, solver, rpl compiler, plotter, matrix, self-test.
Bank3: Input Form manager, TVM, ChooseBox manager, Stack display, Table view, Catalog, Object Viewer)
Bank4: todos los input forms HP48, messages, key tables, Menus, diff eq, linear algebra, constant library etc..
Bank5: MetaKernel 3.0 part2: Decompiler, Algebraic compiler, Equation Writer, HP49 UI engine + HP49 input forms
Bank6: CAS
Bank7: CAS2

Cuando usted está en el stack standard el OuterLoop principal está funcionando, así que la vista típica es: Bank 1 | Bank 2 | RAM
Pero en el Filer es: Bank 1 | Bank 0 | RAM
En el CAS es: Bank 1 | Bank 6/7 | RAM
En el Equation Writer es: Bank 1 | Bank 5
Etc...

Los puntos de entrada con direcciones mayores a 40000 puede ser en cualquiera de estos Banks, y no son visible en todo momento.
Todas los puntos de entrada referenciados en los diferentes manuales de programación son del Bank 1. Probablemnte por que es el Bank con mas llamadas y tambien por que si usted inicia un programa desde el Stack principal (como un programa de búsqueda de reales) este vera el Bank 1 | Bank 2
Sin embargo el mismo programa ejecutado desde el Filer, verá: Bank 1 | Bank 0.

Por ejemplo: Si usted ejecuta cualquier programa usando estos puntos de entrada invalidos desde el Filer, el equation writer este colapsara: 100% garantizado.
Si usted crea una función de usuario llamando a uno de estos programas y ejecuta comandos matemáticos en él: colapsara, 100% garantizado.

CONCLUSIÓN:
Nunca use puntos de entrada localizados entre 40000 y 7FFFFF. Estos puntos de entrada son reservados solamente para el Sistema. Cualquier documentacion referida a estos puntos de entrada debe ser corregida lo antes possible.
Ha habido varios reportes de errores en los comandos system que colapsan o fallan cuando se les llama desde el Filer: esto es siempre por la misma razon: por error nosotros llamamos a algunos puntos de entrada entre sub-sistemas de banks.

Usted está advertido.

Saludos
Jean-Yves


Saludos desde Ica - Perú
Yo solo puedo enseñarte la puerta, pero tú debes cruzarla...
Gmail: oscarlff

Top
Integró: 05/06/2003
Envíos: 295
MonedasHP: 92
Imagen de Gaak
Calc: HP50 | ROM:2.15
 
#5
Mar, 26/01/2010 - 18:17

A ver Oscar, centrémonos en su código.

(FPTR 4 54=4:65F7A)
::
  ( un montón de cosas aquí incluyendo PTR 66D17 y cosas por el estilo )
;

Bien, si Ud. compila ese código y lo EVALúa directamente fallará, ya que por ejemplo la dirección #66D17 es mayor a #40000 entonces asumimos que pertenece a un banco, en este caso ya sabemos que pertenece al 4 porque al inicio vemos un 4:xxxxx.
La manera correcta de ejecutarlo para este caso sería.
::
  '
  ::
    ( un montón de cosas aquí incluyendo PTRs del banco 4 )
  ;
  FPTR 4 0
;

Sin embargo, es probable que por cosas de la vida y del amor el código funcione bien sin necesidad del FPTR 4 0, y es que por defecto la pila se encuentra operando en el banco 4, es por eso que en ocasiones funcionaría, pero ello fallaría desde el Filer que opera en el banco F, así el PTR 66D17 desde el banco F tiene otra estructura.
Use NosyRPL para comprobar lo que menciono así, :4:#66D17 NosyRPL vs. :F:#66D17 NosyRPL.

Ahora otra cosa a tener en cuenta cuando nos metemos en estos temas es la compatibilidad en las versiones de ROM, por ejemplo la dirección mencionada antes en una ROM 1-19-6 es cualquier cosa no válida.

- Gaak -

Gustavo Portales | HPcalc | Foro | Videos

Top
Integró: 30/05/2009
Envíos: 35
MonedasHP: 12
Imagen de woddo
Calc: HP50
 
#6
Vie, 29/01/2010 - 09:40

Gracias GaaK, con esta última respuesta me queda claro el funcionamiento de los PTR.
Favor confirmame la siguiente afirmación.

El PTR 547F4 funciona desde el banco 6, al igual que el ^MATINV (^MATINV FPTR 6 34E=6:63C3A), es este último FPTR que deja la pila funcionando en el banco 6 y por eso al momento de ejecutar PTR 547F4 dentro de ^MATINV la calculadora no se reinicia, pero al momento de ejecutar el código de ^MATINV, es decir:

::
  FPTR2 ^BESTMATRIXTYPE
  PTR 547F4
  PTR 2F211
  PTR 6F13C
  PTR 63C5D
;
@

La calculadora se cualga porque no está en banco 6.

Una última duda, porque al momento de descompilar el PTR 547F4 con Nosy, no me entrega el codigo que corresponde, es decir:

(6:547F4)
::
  DUPTYPEMATRIX?_
  COLANOTcase
;
@

Supongo que es por lo mismo de los bancos.

Top
Integró: 05/06/2003
Envíos: 295
MonedasHP: 92
Imagen de Gaak
Calc: HP50 | ROM:2.15
 
#7
Vie, 29/01/2010 - 09:44

Ud. ha entendido a la perfección cómo es que trabajan los FPTR. Todo correcto.

- Gaak -

Gustavo Portales | HPcalc | Foro | Videos

Top
Integró: 30/05/2009
Envíos: 35
MonedasHP: 12
Imagen de woddo
Calc: HP50
 
#8
Vie, 29/01/2010 - 13:37

Pero porque al ejecutar FPTR2 ^BESTMATRIXTYPE que trabaja en el banco 6 la calculadora no se cuelga?

Y si en la ejecución del código de arriba, al pasar a PTR 547F4 que también trabaja en banco 6, porque la calculadora se cae si ya esta en banco 6 (del comando FPTR2 ^BESTMATRIXTYPE que se ejecuta primero)??

Top
Integró: 18/06/2010
Envíos: 1
MonedasHP: 6
Imagen de mrp
mrp Usuario Desconectado. Visto por última vez 2 días 3 horas.
Calc: HP50 | ROM:2.09
 
#9
Vie, 18/06/2010 - 19:11

¿Cómo puedo actualizar la Rom del Emu48?

Hola a todos! los usuarios de AdictosHP Smile
Alguien me puede ayudar con la duda

Top

Twitter

Cargando...