Radastan escribió:Y McLeod, no seré yo el que te corrija porque corro el riesgo de equivocarme, pero el puntero... tiene que ser de 16 bits, no queda otra para direccionar 64K. Una cosa es el puntero y otra el contenido del puntero.
Todos los punteros en el Spectrum son de 16 bits. Si defines:
Ambos, p1 y p2 son variables que ocupan 16 bits, pero p1, al escribir en su contenido, es equivalente a una escritura de un byte en memoria, mientras que al escribir en el contenido de p2, estás haciendo una escritura de una palabra de 16 bits en memoria.
Por tanto tu función corregida sigue siendo errónea: sigues escribiendo un valor de 16 bits en memoria y no un valor de 8 bits en memoria. Lo que hace exactamente tu función, de acuerdo con la semántica del lenguaje C es:
- Evalúa "valor". Es de 8 bits sin signo
- Mira el tipo de datos de la variable a la que apunta "puntero". Ese tipo de datos es "int": 16 bits con signo
- Se promociona automáticamente "valor" de 8 bits sin signo a 16 bits con signo. Para ello, se añaden 8 bits a 0 por la izquierda.
- El nuevo valor de 16 bits así obtenido se escribe en memoria, a partir de la dirección indicada en "puntero". Dado que el Spectrum no tiene instrucciones para realizar escrituras de 16 bits en donde el operando de memoria sea un registro que contenga la dirección del mismo, lo que se hacen son dos escrituras de 8 bits a la dirección "puntero" y a "puntero+1"
Convertida en ensamblador, haría algo como esto (dejando aparte el manejo del marco de pila, que no sé cómo es en el Z88DK) suponiendo que puntero estuviera en HL y valor en A:
Esta función, por otra parte:
Código: Seleccionar todo
void poke (unsigned char *puntero, unsigned char valor)
{
*puntero=valor;
}
Sí que se traduce a: