Program do kompilacji pod Free Pascala pod DOSa. Założenie jest takie : program ma zmieniać godzinę w czasie systemowym o +1 po naciśnięciu strzałki do góry i odpowiednio o -1 po naciśnięciu strzałki w dół na klawiaturze.
Wymyśliłem sobie to tak:
1. odczytam aktualną godzinę ( przerwanie 21h funkcja 2Ch)
2. dodam lub odejmę 1
3. zapiszę poprawionę godzinę ( przerwanie 21h funkcja 2Dh)
Problem jest taki, że nie zapisuje poprawionej godziny.
Proszę o pomoc bo w asemblerze za bardzo się nie orientuję i pewnie coś zwaliłem.
program czas;
uses crt, graph;
var gd,gm:integer;
var dana:byte;
var dana1,k:string;
begin
gd:=D4bit; {na d4bit nie przelacza stron an D8bit przelacza}
gm:=m640x480;
initgraph(gd,gm,'');
repeat
{ Odczytanie czasu }
asm
MOV AH,2Ch
int 21h
mov dana,CH {kopiowanie godziny do zmiennej dana}
mov AH,4Ch
end;
{Funkcja zwraca czas w rejestrach CX i DX: CH - godzina, CL - minuta, DH - sekunda, DL - 1/100 sekundy.}
str(dana,dana1);
outtextxy(200,200,dana1);
outtextxy(300,300,'+1 godz- strzalka do gory');
outtextxy(300,310,'-1 godz- strzalka do na dol ');
if keypressed then k:=readkey;
if k=(#72) then
begin
dana:=dana+1;
str(dana,dana1);
outtextxy(300,400,dana1);
ASM
MOV AH,2Dh {ustawienie godziny}
MOV CH,dana
INT 21h
end;
k:=('a');
asm
mov dana,AL { rejestr pokazuje czy operacja się wykonała poprawnie jesli jest -0 , FFh - niewykonane}
int 21h
end;
str(dana,dana1);
outtextxy(300,450,dana1); {wyswietlenie stanu rejestru AL}
end;
if k=(#80) then
begin
dana:=dana-1;
str(dana,dana1);
outtextxy(300,400,dana1);
ASM
MOV AH,2Dh
MOV CH,dana
INT 21h
end;
k:=('a');
end;
until k='k'
end.
Dodano po 1 [godziny] 19 [minuty]:
Odpowiadam sam sobie:
W funkcji 2Dh przerwania 21h trzeba zapisać wszystkie rejestry tzn.
CH- godziny
CL- minuty
DH- Sekundy
DL- Setne części sekundy
A zmyliło mnie to, że zapisując tylko rejestr CH- godziny , przed wejściem w pętlę REPEAT UNTIL , wszystko działało OK. Czyli godziny zmieniały się. Ciekawe ??
Wymyśliłem sobie to tak:
1. odczytam aktualną godzinę ( przerwanie 21h funkcja 2Ch)
2. dodam lub odejmę 1
3. zapiszę poprawionę godzinę ( przerwanie 21h funkcja 2Dh)
Problem jest taki, że nie zapisuje poprawionej godziny.
Proszę o pomoc bo w asemblerze za bardzo się nie orientuję i pewnie coś zwaliłem.
Kod: text
program czas;
uses crt, graph;
var gd,gm:integer;
var dana:byte;
var dana1,k:string;
begin
gd:=D4bit; {na d4bit nie przelacza stron an D8bit przelacza}
gm:=m640x480;
initgraph(gd,gm,'');
repeat
{ Odczytanie czasu }
asm
MOV AH,2Ch
int 21h
mov dana,CH {kopiowanie godziny do zmiennej dana}
mov AH,4Ch
end;
{Funkcja zwraca czas w rejestrach CX i DX: CH - godzina, CL - minuta, DH - sekunda, DL - 1/100 sekundy.}
str(dana,dana1);
outtextxy(200,200,dana1);
outtextxy(300,300,'+1 godz- strzalka do gory');
outtextxy(300,310,'-1 godz- strzalka do na dol ');
if keypressed then k:=readkey;
if k=(#72) then
begin
dana:=dana+1;
str(dana,dana1);
outtextxy(300,400,dana1);
ASM
MOV AH,2Dh {ustawienie godziny}
MOV CH,dana
INT 21h
end;
k:=('a');
asm
mov dana,AL { rejestr pokazuje czy operacja się wykonała poprawnie jesli jest -0 , FFh - niewykonane}
int 21h
end;
str(dana,dana1);
outtextxy(300,450,dana1); {wyswietlenie stanu rejestru AL}
end;
if k=(#80) then
begin
dana:=dana-1;
str(dana,dana1);
outtextxy(300,400,dana1);
ASM
MOV AH,2Dh
MOV CH,dana
INT 21h
end;
k:=('a');
end;
until k='k'
end.
Kod: text
Dodano po 1 [godziny] 19 [minuty]:
Odpowiadam sam sobie:
W funkcji 2Dh przerwania 21h trzeba zapisać wszystkie rejestry tzn.
CH- godziny
CL- minuty
DH- Sekundy
DL- Setne części sekundy
A zmyliło mnie to, że zapisując tylko rejestr CH- godziny , przed wejściem w pętlę REPEAT UNTIL , wszystko działało OK. Czyli godziny zmieniały się. Ciekawe ??