Tengo algunas rutinas que cada cierto tiempo retomo para ver si puedo rascar unos bytes o mejor aún, unos ciclos de ejecución. De algunas de ellas he utilizado diferentes variantes que a veces no suponen mejora pero sí un triunfo intelectual por abordar el problema de otro modo.
El caso es que me gustaría encontrar otros puntos de vista o ideas para abordar estas rutinas/funciones ya que creo que yo ya estoy contaminado y siempre voy a acabar a las mismas soluciones. Esto es como un brainstorming para buscar ideas, no os cortéis. Igual la solución propuesta no es buena pero la idea de fondo es excelente y se puede desarrollar. De hecho, algunas mejoras que suelo aplicar en algunas rutinas vienen de ideas de otras que he leído que, aunque básicas (o complejas) no se me había ocurrido que podrían funcionar.
Para empezar, una sencilla. Se trata de guardar una lista de coordenadas (x,y) comprobando que no haya valores duplicados. No importa que los valores estén ordenados o desordenados, es irrelevante.
Los valores a guardar llegan en el registro DE.
Mi propuesta es la siguiente:
Usa una tabla “_tabla_de_coordenadas” en la que se marca el final de los datos con el byte &FF (no puede haber una coordenada con este valor)
Código: Seleccionar todo
_tabla_de_coordenadas:
db 1,2
db 3,4
db 8,9
db &FF
La rutina recorre la tabla hasta encontrar el valor &FF, para añadir las coordenadas nuevas. Cada valor que va encontrando antes de llegar a este &FF los compara con las coordenadas.
Según el ejemplo anterior primero encuentra el valor 1, que no es &FF así que lo compara con la coordenadax (D). Si no coincide sigue leyendo porque no habrá coincidencia. Si coincide comprueba el siguiente byte con la coordenaday (E). Si no coincide, sigue recorriendo la tabla. Si coincide termina porque la pareja de coordenadas ya existe en la tabla y no se guardan duplicados.
Resetear la tabla es fácil, se pone el valor &FF en el primer byte.
Recorrer la tabla para leer las coordenadas en una fase posterior también es sencillo, basta leer los pares de bytes hasta que encuentra que el primer byte es &FF que marca fin de la tabla.
Código: Seleccionar todo
LD D, coordenadax
LD E, coordenaday
rutina_añadir_coordenadas
LD HL,tabla_de_coordenadas ; Puedo guardar la tabla de coordenadas en una posición determinada para poder usar INC L en lugar de INC HL
bucle_recorrido_tabla_coordenadas:
LD A,(HL)
CP &FF
JP Z, add_coordenadas ;Solo se incorpora al llegar al final de los datos de la tabla
CP D
JP Z, comprobar_segundo_byte
INC HL ;inc l
INC HL ;inc l
JP bucle_recorrido_tabla_coordenadas
comprobar_segundo_byte:
INC HL
LD A,(HL)
CP E
RET Z ;los dos bytes son iguales, mismas coordenadas. No se añaden y se sale de la rutina.
INC HL ;inc l
JP bucle_recorrido_tabla_coordenadas
add_coordenadas:
LD (HL),d
INC HL
LD (HL),e
INC HL
LD (HL), &FF ;End of data
RET