CODINGLISTINGS ★ Conversor de pantallas: de modo 2 a modo 1 sin perder un pixel ★

Conversor de pantallas: De modo 2 a modo 1 sin perder un pixel (Amstrad Semanal)Coding Listings
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

Los gráficos de cualquier programa pueden presentar problemas cuando se intenta que uno realizado en el modo 2, de alta resolución, imprima en la pantalla del ordenador en uno diferente al que ha sido realizado. La función de un conversor de gráficos es, precisamente, transformar un gráfico de un modo a otro sin que por ello se desfigure m se pierda información alguna en el proceso.

De todos es sabido que en el Amstrad podemos encontrar tres modos de pantalla, y para cada uno de ellos el tratamiento de los gráficos es totalmente distinto.

Así, por ejemplo, en el modo de mayor resolución (el 2), cada uno de los bits que componen los bytes que forman la pantalla, nos proporciona información únicamente de pixels apagados o encendidos. En los otros dos, además de llevar esa información, nos indica de qué color debe aparecer el pixel en la pantalla.

De esta forma, un gráfico realizado, por ejemplo, en modo 2 no podrá ser impreso en otro modo distinto de pantalla, ya que aparecería desfigurado.

Por todo lo dicho anteriormente, nos ha parecido oportuno realizar una rutina que sea capaz de transformar gráficos realizados en el modo de alta resolución a modo 1, con el color que se desee.

Dicha rutina será capaz de transformar un gráfico de cualquier dimensión entre los modos de pantalla mencionados anteriormente.

Veamos, pues, cómo funciona dicho conversor de gráficos y cuáles son los parámetros más importantes del programa.

En primer lugar deberemos indicar dónde se encuentra el gráfico que se quiere cambiar de modo y cuál es su longitud, así como la zona de memoria donde se debe colocar el gráfico ya convertido.

Estas condiciones se deberán indicar en los registros que se indican a continuación:

HL ... Dirección del gráfico en modo 1 (final)
DE . . . Dirección del gráfico en modo 2 (inicial)
BC . . . Longitud del gráfico (incial)

Debemos tener en cuenta, que la longitud del gráfico convertido, ocupará el doble de bytes que el gráfico inicial, ya que cada byte de modo 2 se convierte en dos bytes de modo 1, debido a que la memoria de pantalla en dicho modo debe ser el doble para el mismo formato de gráfico.

También debemos tener presente que todo el gráfico será traspasado en un color determinado. Si deseáramos obtener un gráfico con diferentes colores, deberíamos traspasarlo por bloques, indicando en cada operación el color que se desea obtener para cada uno de ellos.

Esta información se debe introducir al inicio de la rutina en la variable «Color», de la forma que se indica a continuación:

LD A,1
LD (COLOR),A

Según el valor indicado en dicha variable, obtendremos los diferentes colores posibles en modo 1, que se corresponden de la siguiente forma:

COLOR=0...PEN 1
COLOR=1... PEN 2
COLOR=2...PEN 3

El bucle principal de la rutina se encarga de leer cada uno de los bytes que conforman el gráfico, y llama a las diferentes rutinas de conversión según sea el color elegido para imprimir el gráfico. Veamos qué operaciones deben efectuarse para conseguir que un byte de modo 2, se convierta en dos bytes de modo 1 con tinta de color (PEN 1).

Supongamos que tenemos el siguiente valor:

bit  7bit 6bit 5bit 4bit 3bit 2bit 1bit 0
10011110

En primer lugar, deberemos tomar los cuatro bits de mayor peso, es decir, los bits del 7 al 4, y convertirlos a modo 1 tinta 1.

Dado que en este modo y con dicha tinta, los bits que se encargan de dar esta información son los cuatro de mayor peso, deberemos formar un byte con los cuatro bits más significativos del byte inicial, colocando los restantes a cero. Con lo que nos quedaría:

1 0 0 1 0 0 0 0

A continuación, tomamos los cuatro bits menos significativos del byte inicial, y los transformamos.

Como hemos dicho que la información nos la dan los cuatro bits más significativos, hay que rotar dicho byte cuatro veces hacia la izquierda, y colocar a cero los cuatro bits de menor peso, con lo que nos quedaría:

1 1 1 0 0 0 0 0

Esta operación se realizaría en dos bucles, de la forma que se indica:

LD (HL),0
LD B,4
BUC1: RRA
RR (HL)
DJNZ BUC1
INC HL
LD (HL),0
LD B,4
BUC2: RRA
RR (HL)
DJNZ BUC2

Teniendo en cuenta que en el acumulador se encuentra el byte inicial, y en la dirección indicada por el registro doble HL, se almacena el resultado final.

De esta forma habremos conseguido formar dos bytes del gráfico en modo 1 a partir de un byte de gráfico en modo de alta resolución.

Veamos qué operaciones se deberían efectuar si deseáramos traspasar el mismo byte inicial anterior, pero esta vez con tinta 2.

Dado que la información para este color nos la dan los cuatro bytes de menor peso, deberemos

realizar lo mismo que se ha hecho anteriormente, pero en este caso colocando siempre la información en los bits 3 a 0 y dejando los bits más significativos a cero.

Así pues, tomaríamos los bits superiores, y los traspasaríamos a los cuatro bits de menor peso, haciendo rotar el byte cuatro veces hacia la derecha y colocando a cero los cuatro superiores.

Con lo cual el primer byte nos quedaría de la siguiente manera:

0 0 0 0 1 0 0 1

Para obtener el otro byte del gráfico,

tomaríamos los cuatro bits de menor peso del byte inicial, poniendo a cero los de mayor peso, con lo que nos quedaría:

0 0 0 0 1 1 1 0

Esto se haría de la forma siguiente en Código Máquina:

RLD
LD (HL),A
INC HL
RLD
LD (HL),A

Por último, nos queda traspasar el byte inicial a modo 1 tinta 3. En este caso, la información se encuentra en todos los bits que componen el byte.

Así, pues, cogeremos en primer lugar los cuatro bits superiores del byte inicial, haciendo una copia de dichos bits en los cuatro de menor peso, con lo cual este primer byte nos quedaría como se indica:

1 0 0 1 1 0 0 1

A continuación tomaríamos los cuatro bits menos significativos del byte inicial, haciendo lo mismo que se ha dicho anteriormente.

En este caso, el segundo byte sería:

1 1 1 0 1 1 1 0

En nuestra rutina se haría de la forma que indicamos a continuación:

RRD
LD A,(HL)
RRD
RRD
INC HL
RRD
LD A,(HL)
RRD
RRD

De esta manera se van transformando todos los bytes que componen el gráfico inicial, obteniendo dos bytes finales por cada uno de los iniciales, con lo cual la longitud, es el doble que la del inicial.

Al linal de esta rutina hemos incluido otra de impresión en pantalla para poder observar el efecto que produce el convertidor de gráficos. Dicha rutina coloca el puntero en la dirección donde se ha almacenado el gráfico convertido y lo imprime en pantalla. Como ejemplo hemos tomado los bytes que forman el carácter de la letra A.

Con ella, podremos tomar cualquier gráfico realizado en Spectrum o MSX y transformarlo de forma que se pueda visualizar perfectamente en modo 1 de Amstrad.

Para poder utilizarla, copiar el listado ensamblador que aparece seguidamente y, para los que no posean ensamblador, se ha preparado un programa cargador.

Alberto Suñer , Amstrad Semanal

★ PUBLISHER: Amstrad Personal
★ YEAR: 1987
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LiCENCE: LISTING
★ COLLECTION: AMSTRAD SEMANAL 1987
★ AUTHOR: Alberto Suñer
 

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding Src's » ConvWAV v0.1 (DEMONIAK)
» Coding » Clefs2 53 - Cpm - Conversion du Cpm en Azerty
» Coding Src's » Conveyor Belt
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 150 millisecondes et consultée 74 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.