Dudas funcionamiento librería CPCRSLIB

Programando el Amstrad en BASIC, C, etc.
Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor Artaburu » Jue 26 Feb , 2015 9:25 pm

Kaos, no me he olvidado pero estoy pelín liadillo y no llego a todo o8P o8P
Salu2,
Arta

KaosOverride
Keeper of The Forum
Keeper of The Forum
Mensajes: 712
Registrado: Vie 27 Feb , 2009 12:21 pm

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor KaosOverride » Mar 03 Mar , 2015 9:22 pm

Na, tranquilo, a tu ritmo ;)

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
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

Código: Seleccionar todo

LD BC,#_tiles
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 #-o

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]

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor Artaburu » Mié 04 Mar , 2015 8:37 am


"Creo" que es LD BC,(#_tiles) pero no me funciona >|

Seguro que no es asi, pero no pillo como #-o

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...
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

Avatar de Usuario
MiguelSky
Lord of Short Time
Lord of Short Time
Mensajes: 6969
Registrado: Sab 08 Oct , 2005 2:02 am
Contactar:

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor MiguelSky » Mié 04 Mar , 2015 1:02 pm

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
Pero teóricamente, la instrucción LD BC,(dirección) sí estaría permitida, ¿no? ¿O es cosa de la librería?

KaosOverride
Keeper of The Forum
Keeper of The Forum
Mensajes: 712
Registrado: Vie 27 Feb , 2009 12:21 pm

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor KaosOverride » Mié 04 Mar , 2015 3:25 pm

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]

KaosOverride
Keeper of The Forum
Keeper of The Forum
Mensajes: 712
Registrado: Vie 27 Feb , 2009 12:21 pm

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor KaosOverride » Mié 04 Mar , 2015 5:32 pm

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

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;
}
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 :mrgreen:

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? :D
--------
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor Artaburu » Mié 04 Mar , 2015 10:28 pm

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
Pero teóricamente, la instrucción LD BC,(dirección) sí estaría permitida, ¿no? ¿O es cosa de la librería?
Es cosa de que estoy tonto, tienes toda la razón, LD BC,(#_tiles) debe funcionar :oops: :oops:
Salu2,
Arta

KaosOverride
Keeper of The Forum
Keeper of The Forum
Mensajes: 712
Registrado: Vie 27 Feb , 2009 12:21 pm

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor KaosOverride » Jue 05 Mar , 2015 1:29 am

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 :D 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?
--------
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor ronaldo » Jue 05 Mar , 2015 8:09 pm

Hola Kaos,

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.
Es decir, el siguiente código:

Código: Seleccionar todo

LD BC, (texto)
texto: .ds "ABCDE"
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):

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!"
Espero que esto te ayude :).

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)

KaosOverride
Keeper of The Forum
Keeper of The Forum
Mensajes: 712
Registrado: Vie 27 Feb , 2009 12:21 pm

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor KaosOverride » Jue 05 Mar , 2015 10:49 pm

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

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
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...
--------
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor Artaburu » Vie 06 Mar , 2015 8:35 am

Bien va la cosa

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

KaosOverride
Keeper of The Forum
Keeper of The Forum
Mensajes: 712
Registrado: Vie 27 Feb , 2009 12:21 pm

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor KaosOverride » Vie 06 Mar , 2015 1:19 pm

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):

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
Etiquetar los tiles de verdad

Código: Seleccionar todo

_tiles_set1::
; subb000,
.db #0xFF,#0xFF
.db #0xFF,#0xFF
......etc etc
agregar este codigo para inicializar la tabla

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);

}

}
En la funcion en asm de scroll despues de

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
En la LIB

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
y

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
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 :mrgreen: )

Lo que no se es si penaliza mucho al codigo...
Adjuntos
compara.gif
--------
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
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic