Dudas descompilando la ROM
- Inicie sesión o regístrese para enviar comentarios
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.
- Inicie sesión o regístrese para enviar comentarios
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.
- Inicie sesión o regístrese para enviar comentarios
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
- Gaak -
- Inicie sesión o regístrese para enviar comentarios
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
;
@- Inicie sesión o regístrese para enviar comentarios
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 RastEl 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: CAS2Cuando 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
- Inicie sesión o regístrese para enviar comentarios
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 -
- Inicie sesión o regístrese para enviar comentarios
Ud. ha entendido a la perfección cómo es que trabajan los FPTR. Todo correcto.
- Gaak -
- Inicie sesión o regístrese para enviar comentarios
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)??
- Inicie sesión o regístrese para enviar comentarios
¿Cómo puedo actualizar la Rom del Emu48?
Hola a todos! los usuarios de AdictosHP
Alguien me puede ayudar con la duda
- Inicie sesión o regístrese para enviar comentarios















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.