Dudas funcionamiento librería CPCRSLIB
Re: Dudas funcionamiento librería CPCRSLIB
Kaos, no me he olvidado pero estoy pelín liadillo y no llego a todo
Salu2,
Arta
Arta
-
- Keeper of The Forum
- Mensajes: 712
- Registrado: Vie 27 Feb , 2009 12:21 pm
Re: Dudas funcionamiento librería CPCRSLIB
Na, tranquilo, a tu ritmo
Ando jugando con mas cosas de la lib....
En cierta parte del Tilemap.s haces esto:
que segun entiendo previamente en L cargas el byte del nº bloque de tiles, en H cargas cero (porque el nº bloques es un byte) y lo multiplicas x16 que es el "largo de un bloque de tiles", despues lo sumas a la direccion base de los tiles y dejas en HL el offset pleno del tile... bien, parece que lo entiendo...
Se me ha ocurrido cambiar lo que hay despues de _tiles. En lugar de los tiles (16 bytes) en bruto, he puesto 64 doble bytes para hacer una tabla de offsets hasta 64 tiles.
Fuera de la lib defino unos tiles como toda la vida, y tengo la direccion del inicio de tiles.
Inicializo asignando el offset de cada tile a cada elemento de la tabla de tiles de la lib.
El problema lo tengo en
ya que los ADD HL,HL los quito al no necesitar multiplicar por 16
el problema es que entiendo que LD BC,#_tiles hace referencia a cargar en BC la direccion _tiles, pero yo quiero cargar en BC el contenido de la direccion _tiles.
"Creo" que es LD BC,(#_tiles) pero no me funciona
Seguro que no es asi, pero no pillo como
Si no me termino de aclarar con el ASM MAXAM, como para empanarme del ASM ASXXXX
EDIT: ahiii que le encontrado un fallo a mi planteamiento, aunque sigo teniendo la misma duda del direccionamiento...
Ando jugando con mas cosas de la lib....
En cierta parte del Tilemap.s haces esto:
Código: Seleccionar todo
LD L,0 (IX)
LD H,#0
ADD HL,HL ;x2
ADD HL,HL ;x4
ADD HL,HL ;x8
ADD HL,HL ;x16
LD BC,#_tiles
ADD HL,BC ;hl apunta al tile a transferir
EX DE,HL
Se me ha ocurrido cambiar lo que hay despues de _tiles. En lugar de los tiles (16 bytes) en bruto, he puesto 64 doble bytes para hacer una tabla de offsets hasta 64 tiles.
Fuera de la lib defino unos tiles como toda la vida, y tengo la direccion del inicio de tiles.
Inicializo asignando el offset de cada tile a cada elemento de la tabla de tiles de la lib.
El problema lo tengo en
Código: Seleccionar todo
LD BC,#_tiles
el problema es que entiendo que LD BC,#_tiles hace referencia a cargar en BC la direccion _tiles, pero yo quiero cargar en BC el contenido de la direccion _tiles.
"Creo" que es LD BC,(#_tiles) pero no me funciona
Seguro que no es asi, pero no pillo como
Si no me termino de aclarar con el ASM MAXAM, como para empanarme del ASM ASXXXX
EDIT: ahiii que le encontrado un fallo a mi planteamiento, aunque sigo teniendo la misma duda del direccionamiento...
--------
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]
Re: Dudas funcionamiento librería CPCRSLIB
La idea de lo que quieres está clara pero con el registro BC no lo puedes hacer. Tienes que darte una vuelta, por ejemplo así:
"Creo" que es LD BC,(#_tiles) pero no me funciona
Seguro que no es asi, pero no pillo como
Si no me termino de aclarar con el ASM MAXAM, como para empanarme del ASM ASXXXX
EDIT: ahiii que le encontrado un fallo a mi planteamiento, aunque sigo teniendo la misma duda del direccionamiento...
Código: Seleccionar todo
PUSH HL
LD HL,#_tiles
LD C,(HL)
INC HL
LD B,(HL)
POP HL
Salu2,
Arta
Arta
Re: Dudas funcionamiento librería CPCRSLIB
Pero teóricamente, la instrucción LD BC,(dirección) sí estaría permitida, ¿no? ¿O es cosa de la librería?La idea de lo que quieres está clara pero con el registro BC no lo puedes hacer. Tienes que darte una vuelta, por ejemplo así:Código: Seleccionar todo
PUSH HL
LD HL,#_tiles
LD C,(HL)
INC HL
LD B,(HL)
POP HL
-
- Keeper of The Forum
- Mensajes: 712
- Registrado: Vie 27 Feb , 2009 12:21 pm
Re: Dudas funcionamiento librería CPCRSLIB
Ademas, quitando los 4 ADD, igual no se penaliza tanto... A ver si logro que "rule"
--------
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]
-
- Keeper of The Forum
- Mensajes: 712
- Registrado: Vie 27 Feb , 2009 12:21 pm
Re: Dudas funcionamiento librería CPCRSLIB
Puff, tras unos amagos de "casi victoria" creo que mejor cambio de estrategia...
He "quitado" literalmente del Tilemap.h de la lib todo el bloque de tiles, empezando por donde esta la etiqueta _tiles:
He creado un Tiles.h junto al resto de ficheros del programa en el que hay un "void contenedor" de un bloque ASM con lo que he quitado de Tilemap.h de la lib
Lo cual me da mas control sobre los tiles, ya puedo meter los mios sin tener que recompilar la lib, o sin tener que usar los de la lib como "buffer principal" como en marron en la euskal y tener copias en el codigo del juego que tener que escupir con memcpy's para ensamblar el tileset de cada pantalla al vuelo...
Ahora puedo jugar bien con definir en mi codigo directamente de 1 a 256 tiles, o definir 64 y usar la mitad como "fijos" y la otra mitad como "cambiantes" via memcpy de tilesets extra, o lo que me de la gana
Al loro a la etiqueta de marras despues del void... _tiles::
Va con doble dos puntos, si pones solo dos puntos (_tiles:) da un fallo el linker, y si bien cuando haces el scroll va pintando bien los tiles, al pasar sprites sobre los tiles, pinta "basura", al igual que el pintado full screen inicial...
por cierto MiguelSky, te llego el MP?
He "quitado" literalmente del Tilemap.h de la lib todo el bloque de tiles, empezando por donde esta la etiqueta _tiles:
He creado un Tiles.h junto al resto de ficheros del programa en el que hay un "void contenedor" de un bloque ASM con lo que he quitado de Tilemap.h de la lib
Código: Seleccionar todo
void tileblock()
{
__asm
_tiles::
; subb000,
.db #0xAB,#0x03
.db #0x03,#0x0C
.db #0x06,#0x5D
.db #0x06,#0xFF
.db #0x06,#0xFF
....
..
etc, etc, etc
__endasm;
}
Ahora puedo jugar bien con definir en mi codigo directamente de 1 a 256 tiles, o definir 64 y usar la mitad como "fijos" y la otra mitad como "cambiantes" via memcpy de tilesets extra, o lo que me de la gana
Al loro a la etiqueta de marras despues del void... _tiles::
Va con doble dos puntos, si pones solo dos puntos (_tiles:) da un fallo el linker, y si bien cuando haces el scroll va pintando bien los tiles, al pasar sprites sobre los tiles, pinta "basura", al igual que el pintado full screen inicial...
por cierto MiguelSky, te llego el MP?
--------
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]
Re: Dudas funcionamiento librería CPCRSLIB
Es cosa de que estoy tonto, tienes toda la razón, LD BC,(#_tiles) debe funcionarPero teóricamente, la instrucción LD BC,(dirección) sí estaría permitida, ¿no? ¿O es cosa de la librería?La idea de lo que quieres está clara pero con el registro BC no lo puedes hacer. Tienes que darte una vuelta, por ejemplo así:Código: Seleccionar todo
PUSH HL
LD HL,#_tiles
LD C,(HL)
INC HL
LD B,(HL)
POP HL
Salu2,
Arta
Arta
-
- Keeper of The Forum
- Mensajes: 712
- Registrado: Vie 27 Feb , 2009 12:21 pm
Re: Dudas funcionamiento librería CPCRSLIB
Pues mañana le pego otra mirada ya que se simplifica la cosa. A ver si me suena la flauta. Puede molar desempacar un exomizado de tiles en el mismo buffer donde has desempacado las chiribitas, logos y animaciones del menu y asignar los punteros. Toma reciclado de memoria y por extension saco la matriz de punteros de la lib y la declaro en los recursos del programa, como he hecho antes con los tiles
Que penalizara mas, los 4 ADDs seguiditos o el cargar posicion inicial, sumar offset y cargar direccion del tile?
Que penalizara mas, los 4 ADDs seguiditos o el cargar posicion inicial, sumar offset y cargar direccion del tile?
--------
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]
- ronaldo
- Forum Addict
- Mensajes: 358
- Registrado: Sab 14 Sep , 2013 9:31 pm
- Ubicación: Alicante
- Contactar:
Re: Dudas funcionamiento librería CPCRSLIB
Hola Kaos,
Con BC puedes usar direccionamiento inmediato e indirecto, pero ojo, no son lo mismo:
cargará en BC los valores ascii de las letras AB en orden inverso (el Z80 es little endian), por lo que BC valdrá 4241h. Si lo que querías era que BC tomase la dirección de memoria donde la cadena de texto empieza, tendrías que hacerlo sin paréntesis.
Aquí tienes un ejemplito que acabo de hacer directamente en el editor del WinAPE (en Maxam, que es distinto del ASZ80 que usa SDCC):
Espero que esto te ayude .
Saludines!
PD: Respecto a la eficiencia (contando sólo coste de procesador Z80, sin interrupciones del Gate Array)
Con BC puedes usar direccionamiento inmediato e indirecto, pero ojo, no son lo mismo:
- LD BC, etiqueta <= carga en BC el valor de la etiqueta, que es la posición de memoria donde esta se ubica.
- LD BC, (etiqueta) <= Carga en memoria los 2 bytes que están en la memoria donde etiqueta apunta.
Código: Seleccionar todo
LD BC, (texto)
texto: .ds "ABCDE"
Aquí tienes un ejemplito que acabo de hacer directamente en el editor del WinAPE (en Maxam, que es distinto del ASZ80 que usa SDCC):
Código: Seleccionar todo
ORG &4000
LD BC, string ;; BC = valor de la etiqueta string
;; = direccion de memoria donde esta ubicada esa etiqueta
;; Bucle para imprimir caracteres usando la VDU
;;
.print
LD A, (BC) ;; A = siguiente caracter
OR A
JP Z, end ;; Si es el caracter 0, terminamos
PUSH BC ;; Salvar BC (TXT_WR_CHAR lo corrompe)
CALL TXT_WR_CHAR ;; Escribir el caracter a pantalla
POP BC ;; Recuperar el puntero BC
INC BC ;; Pasar al siguiente caracter
JP print ;;
.end
RET ;; Fin
;; Zona de datos (cadena)
;;
.string
TEXT "Testing BC works!"
Saludines!
PD: Respecto a la eficiencia (contando sólo coste de procesador Z80, sin interrupciones del Gate Array)
- LD BC, etiqueta ;; 10 Tstates (2.5 us)
- LD BC, (etiqueta) ;; 20 Tstates (5 us)
- PUSH HL ;; 11 Tstates (2.75us)
- LD reg, (HL) ;; 7 Tstates (1.75 us)
- INC HL ;; 6 Tstates (1.5us)
- POP HL ;; 10 Tstates (2.5us)
- ADD HL, HL / ADD HL, BC ;; 11 Tstates (2.75us)
-
- Keeper of The Forum
- Mensajes: 712
- Registrado: Vie 27 Feb , 2009 12:21 pm
Re: Dudas funcionamiento librería CPCRSLIB
Al final me he dado cuenta que no hace falta entre otras cosas porque he planteado mal la sooluccion, asi que lo he resuelto de esta forma
Aun asi me falla, pero me toca repasar la funcion que copia las direcciones a tiles en la tabla de direcciones que esta ahora en _tiles
Os voy contando...
Código: Seleccionar todo
ld l,a ;Esta y
ld h,#0 ;esta cargan en HL el numero de tile
ADD HL,HL ;Duplica HL porque cada elemento es 16bits
LD BC,#_tiles ;carga en BC el inicio de tabla de direcciones a tiles
ADD HL,BC ;Suma a la direccion de tabla, el numero de tilesx2
LD C,(HL) ;Carga en C el valor bajo de la direccion al tile
INC HL ;Incrementa HL
LD B,(HL) ;Carga en B el valor alto de la direccion al tile
LD HL,#0 ;Forma guarra de pasar BC a HL...
ADD HL,BC ;Acabamos con la dir a datos del tile en HL
Os voy contando...
--------
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]
Re: Dudas funcionamiento librería CPCRSLIB
Bien va la cosa
Otra forma de pasar de BC a HL... sin pasar por BC.
Otra forma de pasar de BC a HL... sin pasar por BC.
Código: Seleccionar todo
ld l,a ;Esta y
ld h,#0 ;esta cargan en HL el numero de tile
ADD HL,HL ;Duplica HL porque cada elemento es 16bits
LD BC,#_tiles ;carga en BC el inicio de tabla de direcciones a tiles
ADD HL,BC ;Suma a la direccion de tabla, el numero de tilesx2
LD C,(HL) ;Carga en A el valor bajo de la direccion al tile
INC HL ;Incrementa HL
LD H,(HL) ;Carga en H el valor alto de la direccion al tile
LD L,C ; Y ahora en HL tienes lo que buscas...
Salu2,
Arta
Arta
-
- Keeper of The Forum
- Mensajes: 712
- Registrado: Vie 27 Feb , 2009 12:21 pm
Re: Dudas funcionamiento librería CPCRSLIB
Bieeen, parece que ya funciona... a la izquierda el que tira de tablas apuntando a tiles y a la derecha el tile directo original... (Composicion de mapa no pretende ser artistica, sino de mostrarme en orden todos los tiles...)
Las ñapas...
En el programa de ejemplo:
Definir una tabla de 128 bytes (64 words):Etiquetar los tiles de verdad
agregar este codigo para inicializar la tabla
En la funcion en asm de scroll despues de
En la LIB
Tilemap.h quitar _tiles: y lo demas de debajo
Tilemap.s
y
Lo que no me gusta, aunque funcione, es que en load_tilemap multiplico i por 8, cuando la logica me hace pensar que es 16... porque son 16 bytes cada tile, pero por 8 funciona como ha de ir... amazing...
Y todo esto porque, pues porque sacrificando 128 bytes (equivalente a 8 tiles) puedo tener de manera dinamica de 1 a 255 tiles, descomprimirlos en un buffer generico y apuntar la tabla a ellos. por buffer generico digo donde descomprimis cosas del menu que no se usa en el juego, bloques de 16 bytes esparcidos por toda la ram (No eran 46 bytes los que se desperdician en la memoria de video por cada 2k?? puedo colar tiles ahi )
Lo que no se es si penaliza mucho al codigo...
Las ñapas...
En el programa de ejemplo:
Definir una tabla de 128 bytes (64 words):
Código: Seleccionar todo
_tiles::
.dw 0,0,0,0,0,0,0,0
.dw 0,0,0,0,0,0,0,0
.dw 0,0,0,0,0,0,0,0
.dw 0,0,0,0,0,0,0,0
.dw 0,0,0,0,0,0,0,0
.dw 0,0,0,0,0,0,0,0
.dw 0,0,0,0,0,0,0,0
.dw 0,0,0,0,0,0,0,0
Código: Seleccionar todo
_tiles_set1::
; subb000,
.db #0xFF,#0xFF
.db #0xFF,#0xFF
......etc etc
Código: Seleccionar todo
extern unsigned int tiles[]; //Pointer to tiles in the library
extern unsigned int tiles_set1[]; //Pointer to self tiles
void load_tilemap(void)
{
unsigned int i;
for(i=0; i<64; i++)
{unsigned int sum;
sum=i*8;
tiles[i]=(unsigned int)(tiles_set1+sum);
}
}
Código: Seleccionar todo
dibuja_tile:
dibuja_tile:
; HL datos tile
; DE destino
; push bc
ld l,a
ld h,#0
ADD HL,HL
LD BC,#_tiles
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
LD HL,#0
ADD HL,BC
; _posiciones_super_buffer + ancho * y + x
Tilemap.h quitar _tiles: y lo demas de debajo
Tilemap.s
Código: Seleccionar todo
bucle_dibujado_fondo:
;Leo en HL el tile a meter en el superbuffer
LD L,0 (IX)
LD H,#0
;parche desde aqui
ADD HL,HL
LD BC,#_tiles
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
LD HL,#0
ADD HL,BC
;parche hasta aqui
;Salimos con hl apunta al tile a transferir
EX DE,HL
PUSH HL
call transferir_map_sbuffer ;DE origen HL destino
Código: Seleccionar todo
posicionar_tile:
LD HL,#_tabla_y_ancho_pantalla
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
LD L,E
LD H,#0
ADD HL,BC
; LD DE,#_pantalla_juego
; ADD HL,DE
LD L,(HL)
LD H,#0
;parche desde aqui
ADD HL,HL ;x2
LD DE,#_tiles
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
LD HL,#0
ADD HL,DE
;parche hasta aqui
;HL apunta a los datos del tile
;_saltate:
;ex de,hl
pop de ;hl
;RET
; de: Posición buffer
; hl: datos tile
transferir_map_sbuffer1: ;; ENVIA EL TILE AL SUPERBUFFER
Y todo esto porque, pues porque sacrificando 128 bytes (equivalente a 8 tiles) puedo tener de manera dinamica de 1 a 255 tiles, descomprimirlos en un buffer generico y apuntar la tabla a ellos. por buffer generico digo donde descomprimis cosas del menu que no se usa en el juego, bloques de 16 bytes esparcidos por toda la ram (No eran 46 bytes los que se desperdician en la memoria de video por cada 2k?? puedo colar tiles ahi )
Lo que no se es si penaliza mucho al codigo...
--------
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro
La Comunidad Española |