Buenas.
Esa función te devuelve la dirección de memoria de pantalla donde empieza la celda de caracter que le especifiques en los parámetros. Como la organización de la pantalla del Spectrum no es lineal, obtener la dirección de memoria de una posición de caracter determinada precisa un cálculo que se encapsula en esa función.
Para hacer lo que quieres, supongo que, dado que splib2 mantiene un buffer con los tiles de fondo de cada celda de carácter para hacer sus cosas, lo suyo sería consultar en dicho buffer.
Sin mirar, supongo que dicho estará añadido de forma estática dentro del binario del juego cuando se compila con splib2. Para acceder a él supongo que lo suyo sería tocar el código fuente de splib2 para que exporte ese símbolo, y luego consultar la memoria a partir de ahí.
Mirando un poco el código, veo que hay una rutina ".SPCompDListAddr" que recibe las coordenadas en A y C (fila y columna, respectivamente) y devuelve la posición de memoria donde se almacena la información relativa al tile de fondo que hay en esa posición. Según veo, atributos y nºs de tile están intercalados, por lo que habría que sumar 1 a la dirección devuelta y leer el byte almacenado en esa dirección para obtener el carácter.
Sin embargo, esta rutina se utiliza de forma interna y no extá exportada "al exterior" para se empleada desde tu programa. Exportarla implica escribir un wrapper en C. Al estar todo encapsulado dentro de una biblioteca no sé si esto será posible de hacer desde "el exterior" o habrá que crear el wrapper y recompilar splib2.
Ahora mismo no tengo tiempo para hacer pruebas, pero habría que hacer una función que sacase los parámetros, lo metiese en los registros, y obtuviese el resultado para devolverlo. Como no tengo mucha idea de como hacer estas cosas, me he buscado una función similar (que tome dos unsigned char y devuelva un puntero). No he tenido que buscar mucho: la que tú nombrabas es exactamente así. Viendo su código dentro de splib2 y extrapolando, esto debería funcionar:
Código: Seleccionar todo
void *sp_CompDListAddr(uchar row, uchar col)
{
#asm
LIB SPCompDListAddr
ld hl,2
add hl,sp
ld c,(hl)
inc hl
inc hl
ld a,(hl)
call SPCompDListAddr
#endasm
}
Pero no sé si se puede usar desde "el exterior" o habrá que meterla en splib2. Habría que hacer pruebas.
Usar esto para obtener el nº del tile en una posición podría hacerse así: