Rellenando la pantalla de color en c y en ensamblador (Pasmo, z88dk y sdcc)

Click here to see in English

El Amstrad cpc tiene tres modos de video: "Mode 0" 160×200 píxeles con 16 colores, "Mode 1" 320×200 píxeles con 4 colores y "Mode 2" 640×200 píxeles con 2 colores. La memoria de video está situada entre las direcciones C000 a FFFF, es decir, tiene un tamaño de 3FFF (16383) bytes. En función del modo, cada byte representa 2, 4 o 8 pixeles de la pantalla. En este ejemplo, simplemente vamos a rellenar toda la pantalla con el mismo valor 256 veces (con valores de 0 a 255), así que simplemente veremos la pantalla cambiando de color rápidamente, lo haremos ademas en modo 0, para tener 16 colores. Al final del tutorial se puede bajar un zip con todos los ficheros.

Código fuente para z88dk:

#include <strings.h>

main()
{
  unsigned char nColor = 0;

  //set mode 0
  #asm
    ld  a,0
    call  $BC0E
  #endasm

  for(nColor = 0; nColor < 255; nColor++)
  {
    memset(0xC000, nColor, 0x3FFF);
  }

  //wait char
  #asm
    call  $BB06
  #endasm
}

 

Código fuente para sdcc:

#include <string.h>

void main()
{
  unsigned char nColor = 0;

  //set mode 0
  __asm
    ld  a, #0
    call  #0xBC0E
  __endasm;

  for(nColor = 0; nColor < 255; nColor++)
  {
    memset(0xC000, nColor, 0x3FFF);
  }

  __asm
    call #0xBB06
  __endasm;
}

 

Código fuente en ensamblador para Pasmo:

org #6000
KM_WAIT_CHAR      EQU #BB06

;set mode 0
ld  a, 0
call  #BC0E

;from 0 to 255
ld  d,#00

startloop:
  ld  a, d
  sub #FF
  jr  NC,endloop
  ld  e,d
  push  de

;memset
  ld  hl,#C000
  ld  (hl), e
  ld  e, l
  ld  d, h
  inc de
  ld  bc, #3FFF
  ldir

  pop de
  inc d
  jr  startloop
endloop:

CALL KM_WAIT_CHAR

RET

 

Deberias ver algo similar a esto:

fill

Los tres binarios ejecutan a la misma velocidad (ya que usan ldir para rellenar), pero curiosamente el binario generado por z88dk ocupa 193 bytes, el generado por sdcc ocupa 93 bytes y el generado por Pasmo ocupa 34 bytes.

Podéis bajar un zip con todos ficheros aquí: Rellenando_la_pantalla_de_color_en_c_y_en_ensamblador_Pasmo_z88dk_sdcc.zip

 

www.CPCMania.com 2012