Newsgroup: it.comp.lang.pascal
Titolo: Come si pulisce lo schermo in pascal?

Per favore mi sapreste scrivere tutti i passi per pulire lo schermo in
pascal?
Grazie

 Grazie
Per quel che so io basta utilizzare la unit CRT (uses crt ;)
e poi scrivere quando nei hai bisogno CLRSCR; (che equivale a clear screen)

 ha scritto nel messaggio
news:qDe18.35194$cU4.1...@twister1.libero.it...


 wrote in message
u0f18.4140$Qu1.1...@news2.tin.it...


 ha scritto nel messaggio
news:UBd18.3942$Qu1.1...@news2.tin.it...


 wrote in message
news:3c45...@news.cis.it...


> Oppure puoi agire direttamente sulla RAM video per guadagnare in velocità.
Anche, ma chi chiamerebbe talmente tante volte la clrscr da rallentare in
modo consistente il sistema? :)
Io agirei sulla memoria video solo dovendo eseguire particolari modifiche o
se mi fosse esplicitamente richiesto dal programm.
...poi ognuno programma come vuole :-)


una volta volevo farmi male, e ho fatto un editor esadecimale
che lavorava totalmente sulla memoria video... viaggia come
una lippa (tipo 20/30 schermate al secondo sotto win...)
ci fai anche giochini divertenti tipo il plasma in modo testo :-)
--
Dreadnaut (dn)
drea...@liberoDALLASPAM.it
(Life would be easier if I had the source code)

Io mi sono limitato a gestire la memoria video solo per fini didattici:
l'unica soddisfazione che ho avuto è stata quella di scoprire che il mio
programma veniva riconosciuto dal norton antivirus come un trojan horse e
non poteva essere eseguito(????) :-))
....dopo averlo riscritto cambiando qua e la qualche istruzione, tutto ha
funzionato bene...


Io mi sono limitato a gestire la memoria video solo per fini didattici:
l'unica soddisfazione che ho avuto č stata quella di scoprire che il mio
programma veniva riconosciuto dal norton antivirus come un trojan horse e
non poteva essere eseguito(????) :-))
non so perchč ma anche  a me altri antivirus non solo norton mi faceva la
stessa
cosa..
io ho da chiedere una cosa: io di gestire memoria video sono a zero.. mi
piacerebbe
imparare. non č che mi potresti inviare quello che hai fatto? cosě guardo il
prog e capisco..
inoltre sai dove andare a cercare info x quest argoment?
grazie & ciao, by augusto

All'indirizzo
http://www.cs.cmu.edu/afs/cs.cmu.edu/user/ralf/pub/WWW/
trovi forse la più completa ed aggiornata lista di interrupt che ci sia in
circolazione.
...mi è un po' difficile inviarti i miei vecchi programmi sulla memoria
video, perché, sinceramente, non so dove andarli a riprendere :-P ...3 anni
fa salvavo tutto su floppy ma ora non so proprio dove li ho messi...
Chiederò a qualche amico e cercherò di recuperare qualcosa, ma non ti
garantisco nulla.


> inoltre sai dove andare a cercare info x quest argoment?
spolveratina iniziale... sufficiente per qualche esperimento
mi limito al modo testo, altri potranno parlare di grafica...
la memoria video sta' mappata in ram in un posto fisso, in un
formato fisso, se sai dov'e' ci puoi scrivere dentro evitandoti
writeln & C, cioe' tagliando fuori chiamate all' int 10Hx che si
occupa dell'output, il che si traduce in Velocita' e Flessibilita'
(-: che bello scriverle maiuscole... :-)
in modo testo 25 o 50 righe ogni posizione dello schermo
e' rappresentata da una coppia di byte: uno contiene il carattere
l'altro gli attributi, memorizzati su otto bit come
| 4 bit colore sfondo  | 4 bit colore primo piano |
[per lavorarci sopra si usano maschere bit e shift, ci stai dentro?
altrim ci riempio un altro mex :-) ]
le posizione nella memoria video non sono equivalenti alle
coordinate testo:
1----50
|
|
|
80
le righe sono in "verticale" (esiste un verticale nella ram ??)
dall'alto in basso e da sinistra a destra... ma con una comoda
array pascal si risolve tutto (pheeeww....)
ok.. now some codice
 type
  CrtCell = record Ch,At: byte; end;
  CrtMap  = array [1..50,1..80] of CrtCell;
comodi tipi: CrtMap rappresenta uno "schermo equivalente"
se lavori a 25 righe semplicemente non considerare quelle
dalla 26 in poi... ma se switchi a 50 le puoi usare... oppure
puoi fare il page-flipping in modo testo in un solo buffer
[ma questa e' un'altra storia...]
[in realta' il modo testo 25 righe dovrebbe offrire 4 pagine
di visualizzazione... in basic ci si poteva accedere... non so'
in pascal... ma con i buffer chissenefrega ]
 const
  CRTPtr : pointer = Ptr($b800,$0000);
  Text25  =   3;
  Text50  = 259;
il puntatore punta (e' il suo mestiere) alla mem video testo
le due costanti servono per passare da 50 a 25 righe
le puoi usare come parametri nella normale procedura TextMode( )
 var
  CrtMem : CrtMap absolute $B800:$0000;
ok questo e' il nostro punto di partenza: CrtMem ** e' ** la memoria
video [ absolute sovrappone una struttura/variabile ad una locazione
di memoria, permettendoti di "dare un formato" alla ram ... fico ! ]
se leggi ottieni quello che c'e' sullo schermo, se scrivi modifichi cio'
che appare sullo schermo... subito e senza undo
NB: le coordinate testo sono nella forma Y,X !! cioe' riga, colonna
basta... non serve altro... ora tocca a te inventarti cosa scrivere
visualizzare... se lo recupero posto il plasma...
altre proc utili
Function CellPtr(y,x: byte): pointer;
  begin
   CellPtr := Ptr($B800,y - 1 + 10 * (x-1) shl 4);
  end;
ritorna un puntatore ad uno specifica posizione dello schermo
 Procedure FWrite(y,x:byte; s:string);
  var
   n : byte;
  begin
   for n := 0 to length(s)-1 do
    CrtMem[y,x+n].Ch := ord(s[n+1]);
  end;
l'equivalente della write... ma non cambia gli attributi dove
scrive !! (puoi fare scritte multicolori colorando prima le celle
e poi scrivendoci)
 Procedure FWriteEx(y,x:byte; s:string; a:byte);
  var
   n : byte;
  begin
   for n := 0 to length(s)-1 do
    CrtMem[y,x+n].Ch := ord(s[n+1]);
   for n := 0 to length(s)-1 do
    CrtMem[y,x+n].At := a;
  end;
estensione, prende in piu' come parametro gli attributi con
cui visualizzare la stringa...
ultima procedura non c'entra molto ma e' una feature in
sordina del bios... lo scroll !!!
 Procedure ScrollUp(x1,y1,x2,y2,s:byte); assembler;
  asm
   MOV   ah,$06
   mov   bh,0
   mov   al,byte ptr s
   mov   cl,byte ptr x1
   mov   ch,byte ptr y1
   mov   dl,byte ptr x2
   mov   dh,byte ptr y2
   dec   cl
   dec   ch
   dec   dl
   dec   dh
   INT   $10
 end;
per ottenere la ScrollDown oltre a cambiare il nome basta
mettere $07 al posto di $06 (cambia la funzione richiesta all'int)
i parametri indicano gli estremi della zona da scrollare (alto-sx
basso-dx) e il numero di righe
[[ miiih quanto ho scritto... scusate :-) posto nuovo mex su
questo problema... ma probabilmente lo avrete gia' letto ]]


plasma in modo testo...
se non avete la fcrt (ops molto probabile... e' mia...)
basta che ci mettiate le definizioni del post prima
la spaventosa funzione matematica non e' mia, e'
spudoratamente copiata da un plasma mi sembra in vga256
di Master degli Spp, quindi a lui il copyright :-)
ho messo piu' palette intercambiabili per piu' sfumature
di colori (tanto siamo in txt... piu 'di tanti...)
se potete compilate e poi lanciate l'eseguibile da prompt...
all'uscita avrete un dos molto piu' allego :-)
{ --- texteng.pas --- }
uses fcrt, crt;
 type
  fpal = array[0..15] of byte;
 const
  pal1 : fpal = ( 0, 8, 8, 1, 1, 9, 9,11,11, 9, 9, 1, 1, 8, 8, 0);
  pal2 : fpal = ( 0, 6, 6, 4, 4,12,12,14,14,12,12, 4, 4, 6, 6, 0);
  pal3 : fpal = ( 0, 8, 7,15,14,12, 4, 5,13, 1, 9, 2,10,11, 3, 8);
 var
  f,u,v,z2,x,y,ax,ay : longint;
  z,un,du,tr,qu,ci,se,st,ot: real;
  aa,bb : integer;
  g, s:integer;
  col : fpal;
 begin
  TextMode(text50);
  ClrScr;
  for aa := 1 to 50 do
   for bb := 1 to 80 do
    crtmem[aa,bb].ch := ord('ů');
  col := pal3;
  repeat
    inc (g);
    for y := 1 to 50 do
     begin
      u := ( y shl 8 ) + ( y shl 6 );
      for x := 1 to 80 do
       begin
        v  := x+u;
 un := 6 * cos(g/250);
 du := 5 * sin(g/270);
        tr := 22 * cos( x / 35 + un / 3 - 10 * sin(du/10) / cos(du/10) );
 qu := 25 * cos(y/45+du);
 z  := un*(du+tr+qu)+du*(un+tr+qu)+tr*(un+du+qu)+qu*(un+du+tr);
 z  := z/20+x+y+g/2;
        z  := z / 10;
        CrtMem[y,x].at := col[ trunc(z) and 15 ];
       end;
      end;
  until keypressed;
 end.
{--- fine texteng.pas ---}


     crtmem[aa,bb].ch := ord('ů');
il carattere che viene visualizzato come una "ů"
e' in realta' #249... sorry ma non avevo pensato che
l'avrei mai postato... maledetti 7 bit :-)
