Skip to content

Instantly share code, notes, and snippets.

@Zardoz89
Last active March 3, 2020 11:43
Show Gist options
  • Save Zardoz89/f92a06c8a5bd921b4b50f82478b8a690 to your computer and use it in GitHub Desktop.
Save Zardoz89/f92a06c8a5bd921b4b50f82478b8a690 to your computer and use it in GitHub Desktop.
Apuntes de como ascii.dll de Tizo pasa cadenas a DIV
int* empiezatexto = &mem[text_offset]; // Posición en memoria donde DIV guarda los textos generados por el interprete
int primertxt = (int)empiezatexto[0]; // primertxt obtiene el primer valor que hay la memoria de textos de DIV (un puntero?)
int* realpunteroascii;
int cantidaddetexto= X bytes
// A reservar memoria....
int* nuevopunteroascii = (int*) div_malloc(cantidaddetexto + 8); //Reservamos X bytes + 8 bytes extra
int mitxt = (int)nuevopunteroascii[0]; // extrae el primer valor que hay en la memoria que acabamos de reservar
// Se manipula mitext
mitxt+=3; // ¿Intenta poner el 3ter bit mas bajo a 1 si alguno de los dos bits mas bajos está a 1?
mitxt&=-4; // & 0xFFFF FFFC -> pone a 0 los dos bits mas bajos
// Si entiendo bien esto, lo que hace es ir al siguiente dirección de memoria con alienación de 4 bytes si no está ya alineado
int* realpunteroascii = (int*) mitxt; // obtiene el puntero real donde escribir el texto y la marca
realpunteroascii[0] = MARCA_CADENA_TIZO_ASCII ; // Pone la marca 111333
realpunteroascii++; // Saltamos la marca
mitxt=(int)realpunteroascii[0]; // Ponemos en mitxt el valor a continuación de la marca (es un puntero interno de div?)
int nuevoascii= (mitxt-primertxt) / 4; // Obtenemos la diferencia en INTs entre mitxt y primertxt (offset de donde escribir en la tabla mem?)
char* ptr2=(char*)mitxt; // ptr2 apunta a la dirección de memoria que hay en mytxt
// Aquí se escribe en ptr2 "cantidaddetexto" caracteres
...
// Forzado de null al final
ptr2[cantidaddetexto]=0;
retval(nuevoascii);
void ascii_dup(){
int primertxt;
int nuevoascii;
int *empiezatexto;
int *realpunteroascii;
char *texto1;
int cantidaddetexto=getparm();
int caracterelegido=getparm();
// A reservar memoria....
nuevopunteroascii=(int *)div_malloc(cantidaddetexto+8);
mitxt=(int)nuevopunteroascii[0];
//y calculamos el offset del nuevo puntero
empiezatexto=&mem[text_offset];
primertxt=(int)empiezatexto[0];
mitxt+=3;
mitxt&=-4;
// puntero colocado....
// Guarda valores internos....
realpunteroascii=(int *) mitxt;
*realpunteroascii=MARCA_CADENA_TIZO_ASCII ;
realpunteroascii++;
mitxt=(int)realpunteroascii[0];
nuevoascii=(mitxt-primertxt)/4;
char * ptr2;
ptr2=(char*)mitxt;
int contador;
for (contador=0;contador<cantidaddetexto;contador++){
ptr2[contador]=(char)caracterelegido;
}
ptr2[cantidaddetexto]=0;
retval(nuevoascii);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment