Rellenando la pantalla de color en c y en ensamblador (Pasmo, z88dk y sdcc) 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: 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 |