vecchie C-storie: scrividiretto e attributizonavideo

Mi è saltato tra le mani un sorgente C di moooooolti anni fa dentro al quale ho ritrovato vecchie procedure che non ho mai dimenticato e che costituivano, al quel tempo (1988), i miei trucchi del mestiere…

Ormai sono inutili sequenze di stringhe di caratteri…. ma oggi mi sentivo particolarmente nostalgico e quindi ho voluto condividerne una con voi.

In c per mandare un output allo schermo si usava la cprintf che scriveva alla posizione del cursore. Lenta, anzi lentissima. Inoltre dovevi prima mandare un comando che posizionasse il cursore nella posizione in cui volevi comparisse la tua stringa di testo, indicando X e Y (80×25 posizioni nello schermo in modalità testo, valido sia per CGA che EGA e VGA).

Il trucco per rendere tutto veloce, velocissimo, anzi… istantaneo era quello di saltare a piè pari la questione e posizionare direttamente il proprio testo all’indirizzo di memoria appropriato. L’indirizzo base per la modalità testo era il “0xB800”. A coppie di bytes si andava a definire il carattere (nel primo) e il suo attributo di colore (nel secondo). Ed ecco quindi due procedurine che facevano parte delle “luca’s” per scrivere direttamente nella memoria della scheda video con la velocità di un fulmine… e per impostare l’opportuno colore alla zona dello schermo.

void scrividiretto (char x,char y, char *s, char c)
   {
      char *punta;
      unsigned char co,co1;
      if (x==0)
         x = 40-strlen(s)/2;
         punta = MK_FP (0xB800,160*(y-1)+2*(x-1));
         co1 = strlen (s);
         for (co=0;co<co1*2;co+=2)
            {
               *(punta+co) = *(s++);
               if (c != 0)
                  *(punta+co+1) = c;
            }
   }

void attributizonavideo (char x1,char y1,char x2,char y2,char att,char sfondo)
   {
      char *punta = MK_FP (0xB800,160*(y1-1)+2*(x1-1)+sfondo);
      int co1;
      unsigned char co2;

      for (co1=0;co1<=(y2-y1)*160;co1+=160)
         for (co2=0;co2<=(x2-x1)*2;co2+=2)
            *(punta+co1+co2) = att;
   }

Leave a Reply