Migajacy ekran w programie Zegarek

0

Witam serdecznie, mam ogomny problem, ktory probowalem rozwiazac, lecz mimo wielu prob, nie udaje mi sie ;/. Zegar mial byc napisany na przerwaniach, prosilbym o jakakolwiek rade, ktora mogla by rozwiazac moj problem, z gory wielkie dzieki :)

program so1;
uses crt, dos;

var
reg:registers;

procedure clean2;
begin
FillChar(Mem[$A000:0],6400,0);
end;

procedure clean;
var
w:word;
begin
for w:=0 to 1000 do meml[$b800:w shl 2] :=$07200720;
end;

procedure video;
begin
with reg do
begin
AH:=$00;
AL:=$13;
Intr($10,reg);
end;
end;

procedure kropka(x,y:integer);
var
i,j:integer;
begin
for j:=y to y+1 do
for i:=x to x+1 do
with reg do
     begin
     Ah:=$0c;
     Bh:=0;
     al:=4;
     cx:=i;
     dx:=j;
     intr($10,reg);
     end;
     end;

procedure zegar(l,x,y:integer);
var
colour:byte;
i,j:integer;
begin
colour:=4;
if ((l=1) or (l=2) or (l=3) or (l=7) or (l=8) or (l=9) or (l=0))  then
begin
for j:=y to y+10 do
with reg do
     begin
     Ah:=$0c;
     Bh:=0;
     al:=colour;
     cx:=x+10;
     dx:=j;
     intr($10,reg);
     end;
     {prawagora}
end;
if ((l=2) or (l=3) or (l=5) or (l=6) or (l=7) or (l=8) or (l=9) or (l=0)) then
begin
for i:=x to x+10 do
with reg do
     begin
     Ah:=$0c;
     Bh:=0;
     al:=colour;
     cx:=i;
     dx:=y;
     intr($10,reg);
     end;
     {srodekgora}
end;
if ((l=4) or (l=5) or (l=6) or (l=8) or (l=9) or (l=0)) then
begin
for j:=y to y+10 do
with reg do
     begin
     Ah:=$0c;
     Bh:=0;
     al:=colour;
     cx:=x;
     dx:=j;
     intr($10,reg);
     end;
     {lewagora}
end;
if ((l=2) or (l=3) or (l=4) or (l=5) or (l=6) or (l=8) or (l=9)) then
begin
for i:=x to x+10 do
with reg do
     begin
     Ah:=$0c;
     Bh:=0;
     al:=colour;
     cx:=i;
     dx:=y+10;
     intr($10,reg);
     end;
     {srodek}
end;
if ((l=1) or (l=3) or (l=4) or (l=5) or (l=6) or (l=7) or (l=8) or (l=9) or (l=0)) then
begin
for j:=y+10 to y+20 do
with reg do
     begin
     Ah:=$0c;
     Bh:=0;
     al:=colour;
     cx:=x+10;
     dx:=j;
     intr($10,reg);
     end;
     {dolprawy}
writeln('dp');
end;
if ((l=3) or (l=2) or (l=5) or (l=6) or (l=8) or (l=9) or (l=0)) then
begin
for i:=x to x+10 do
with reg do
     begin
     Ah:=$0c;
     Bh:=0;
     al:=colour;
     cx:=i;
     dx:=y+20;
     intr($10,reg);
     end;
     {dolsrodek}
writeln('dd');
end;
if ((l=2) or (l=6) or (l=8) or (l=0)) then
begin
for j:=y+10 to y+20 do
with reg do
     begin
     Ah:=$0c;
     Bh:=0;
     al:=colour;
     cx:=x;
     dx:=j;
     intr($10,reg);
     end;
{lewydol}
end;
end;

procedure czas;

var
h1,h2,m1,m2,s1,s2:integer;
begin
with reg do
begin
ah:=$2C;
intr($21,reg);
h1:=ch div 10;
h2:=ch mod 10;
m1:=cl div 10;
m2:=cl mod 10;
s1:=dh div 10;
s2:=dh mod 10;
zegar(h1,0,10);
zegar(h2,15,10);
kropka(30,19);
kropka(30,22);
zegar(m1,35,10);
zegar(m2,50,10);
kropka(65,19);
kropka(65,22);
zegar(s1,70,10);
zegar(s2,85,10);

end;
end;

procedure data;
var
d1,d2,m1,m2,r1,r2,r3,r4:integer;
begin
with reg do
begin
ah:=$2A;
intr($21, reg);
d1:=dl div 10;
d2:=dl mod 10;
m1:=dh div 10;
m2:=dh mod 10;
r1:=cx div 1000;
r2:=((cx mod 1000) div 100);
r3:=((cx mod 100) div 10);
r4:=cx mod 10;

zegar(d1,0,35);
zegar(d2,15,35);
kropka(30,55);
zegar(m1,35,35);
zegar(m2,50,35);
kropka(65,55);
zegar(r1,70,35);
zegar(r2,85,35);
zegar(r3,100,35);
zegar(r4,115,35);
end;
end;

begin
video;
repeat
video;
clean2;
czas;
data;
until keypressed;
readln;
end.

poprawienie tytułu wątku + dodanie znacznika <code class="pascal"> - fp

0

Ale jaki problem?

0

podczas wyswietlania, ekran miga(widac jak czysci sie i wyswietla ponownie), teoretycznie, dajac delay(cos), pozbawiam sie w pewnym stopniu tego problemu, ale dalej sa odczuwalne skoki :(

1

Nie czyść całego ekranu.

0

Tak jak sugeruje @spartanPAGE - nie czyść całego ekranu, a tylko obowiązkowe miejsca, przez co zyskasz na szybkości;

Po drugie - procedura zegar jest do optymalizacji, bo w kółko powtarzasz jeden i ten sam schemat; To samo tyczy się procedur data i czas - do skrócenia, bo użycie zmiennych jest zbędne (używasz każdej z nich tylko raz po przypisaniu wartości, więc możesz od razu wynik dzielenia przekazać do argumentu procedur);

Dodatkowo możesz skrócić przykładowo taki warunek:

if ((l=2) or (l=3) or (l=4) or (l=5) or (l=6) or (l=8) or (l=9)) then

do krótszej postaci:

if (l in [2 .. 6, 8 .. 9]) then

ale nie wiem czy TP obsługuje takie zbiory (choć powinien, ale nie pamiętam).

0

optymalizacje kodu zrobie na koncu :) to chyba kwestia drugorzedna, najwazniejsze w tym momencie zeby dzialal bez problemu. Co nieco pomoglo, ale ciagle da sie zauwazyc migniecia, coz, widocznie nie ma inneog wyjscia tylko sie z tym pogodzic :P mam jeszcze jedno pytanko, co do obslugi pliku, nie mam pomyslu jak zabrac sie do odczytu zawartosci pliku(nie moge uzywac funkcji pascala, same przerwania)

AH:=$3d;
AL:=0;
DS:=seg(sciezka[1]);
DX:=ofs(sciezka[1]);
intr($21,reg);

to jest otwarcie pliku, dalej moje pytanie: jak teraz, odczytac jego zawartosc?

dodanie znacznika <code class="pascal"> - fp

0 użytkowników online, w tym zalogowanych: 0, gości: 0