Ankkaserver


    __
  >(' )
    )/
    /(
   /  `----/
   \  ~=- /
 ~^~^~^~^~^~^~^

Navigointi
Etusivu
PhpSysInfo
~sami/
Blogi
vnstat
Ladattavaa
Virityksiä
Muuta
Linkkejä
Monsujen tappopeli
Vieraskirja
Chat

Grafiikkaa ilman kirjastoja

#define COLS 80


void printtxt(unsigned char row, unsigned char col, unsigned char *str, unsigned char color, unsigned char __far *dest)
{
  unsigned char __far *destptr = (char __far*)&dest[(row*COLS+col)*2];
  while(*str)
  {
    *destptr++=*str++;
    *destptr++=color;
  }
}

unsigned int abs(int num)
{
  return ((num<0)?(-num):(num));
}

void put_pixel(unsigned int x, unsigned int y, unsigned char color, unsigned char __far *dest)
{
  dest[(y<<8)+(y<<6)+x] = color;
}

void video_mode(unsigned char mode)
{
  __asm
  {
    mov ah, 0x00
    mov al, mode
    int 0x10
  }
}

void wait_refresh(void)
{
  __asm
  {
    mov dx, 0x03da
    jump1:    
    in al, dx
    test al, 0x08
    jnz jump1
    jump2:
    in al, dx
    test al, 0x08
    jz jump2
  }
}

void draw_line(unsigned int x0, unsigned int y0, unsigned int x1, unsigned int y1, unsigned char color, unsigned char __far *dest)
{
  int dx=x1-x0;
  int dy=y1-y0;
  unsigned int n,a=0;
  unsigned int absdx,absdy;

  absdx=abs(dx);
  absdy=abs(dy);

  put_pixel(x0,y0,color,dest);
  if(absdx>absdy)
    for(n=absdx;n--;a+=absdy)
    {
      if(a>=absdx)
      {
        if(dy>0)y0++;
        else y0--;
        a-=absdx;
      }
      if(dx>0)x0++;
      else x0--;
      put_pixel(x0,y0,color,dest);      
    }
  else if(absdx<absdy)
    for(n=absdy;n--;a+=absdx)
    {
      if(a>=absdy)
      {
        if(dx>0)x0++;
        else x0--;
        a-=absdy;
      }
      if(dy>0)y0++;
      else y0--;
      put_pixel(x0,y0,color,dest);            
    }
  else
    for(n=absdx;n--;)
    {
      if(dx>0)x0++;
      else x0--;
      if(dy>0)y0++;
      else y0--;
      put_pixel(x0,y0,color,dest);
    }
}

void main()
{
  unsigned char __far *vgatxtbuff = (unsigned char __far*)0xB0008000L;
  unsigned char __far *vgagbuff = (unsigned char __far*)0xA0000000L;

  unsigned int x=0;
  unsigned int y=0;
  unsigned long l;
  unsigned char m=0x03;

  video_mode(0x13);

  while(m--)
  {
      for(y=0;y<200;y++)
      {
        draw_line(0, 0, 319, y, m, vgagbuff);
        wait_refresh();        
      }
      for(x=319;x;x--)
      {
        draw_line(0, 0, x, 199, m, vgagbuff);
        wait_refresh();        
      }
  }   

  video_mode(0x03);
  
  printtxt(0, 0, "The end!", 0x30, vgatxtbuff);  
}

Yllä oleva ohjelmakoodi vaihtaa näyttötilaksi VGA:n näyttötilan 0x13 (256 väriä, 320x200 pikseliä) ja piirtää näytölle viivoja. Ohjelman suoritus on synkattu näytön virkistystaajuuteen, joka kyseisessä näyttötilassa on 70 hertsiä. Ohjelmakoodi kääntyy Watcomilla sellaisenaan .COM-päätteiseksi flättibinääriksi. Ehkäpä tässä olisi hyvä pohja johonkin mahdollisimman pieneen binäärin kokoon pyrkivään demoon?

 04:50:38 up 38 days,  7:33,  2 users,  load average: 0.17, 0.19, 0.18
               total        used        free      shared  buff/cache   available
Mem:             493         120         119           3         252         356
Swap:            486         126         360

Valid HTML 4.01 Strict Valid CSS!

http://sininenankka.dy.fi
Tietoja ylläpitäjästä

Sivun generointi kesti 1.029 s