U pravu si. Posto MMA ima sve kao PASCAL osim PASCAL iskaza, sada radim na prevodu tih iskaza. Tacno je da sam na pocetku. Kao sto si mogao da primetis sintaksa je takva da nije potrebna asm..end struktura, ali moracu da je uvedem kako bih vodi racuna da se u pisanju asemblerskih naredbi ne desi da se promeni stek pointer, jer onda ce biti netacne adrese lokalnih varijabli i dolazice do greske u PASCAL izrazima. Doduse, za to sam uveo strukturu stackcorrect n do.. koja za n pomera adrese svih lokalnih varijabli.
Pitao si za deljenje kada je rezultat veci od 255. Da to je problem jer naredna idiv deli vrednost u reg paru HA sa vrednoscu u reg X, a rezultat je u reg A a ostatak u reg H. Evo ti postupka: neka je broj koji delis h:l a delis sa d (h,l i d su bajtovi) rezultat je u rh:rl
1. l/d -> rl; ostatak na stek
2. h/d -> rh
3. ostatak koji je u H podelis sa d i rezultat dodas na rh:rl
4. ostatak iz predhodnog deljenja saberes sa onim na steku i resultat saberes sa rh:rl
i to je to. Evo ti i koda:
Code:
procedure Div16_8;
var
w,r : word;
begin
sthx s[w];
tax;
clrh;
ldaa s[w.1];
idiv;
staa s[r.1];
pshh;
stackcorrect 1 do
begin
clrh;
ldaa s[w.0];
idiv;
staa s[r.0];
clra;
idiv;
adda s[r.1]; staa s[r.1];
ldaa s[r.0]; adca 0; staa s[r.0];
pshh;
pula;
adda s[0];
clrh;
idiv;
adda s[r.1]; staa s[r.1];
ldaa s[r.0]; adca 0; staa s[r.0];
end;
pulh;
ldhx s[r];
end;
vidis i upotrebu stackcorrect..do strukture. Broj koji delis stavis u HX registar, a broj kojim se deli u A registar, rezultat se dobija u HX registru.
Procedure je dugacka 67 bajtova, izvrsava se za 115 ciklusa i za klok od 20MHz trosi 5.75us.
Za ovo sam se malo pomucio, pa cu ti sutra odgovoriti na drugo pitanje.
Pozdrav.