Konference: SAPI-1 a československé mikropočítače

Od: Jiri Biba
Datum: 14.2.2013 17:48
Předmět: asmbler, kterak na to


Mam tady trosku programatorskej problem a nebo mam dnes nakej slabej den.

Porovnani dvou 16 bitovych cisel v Z80, neco jako je 8 bitu instrukce CP neco, tedy compare A s necim.

Bude rovnocene fungovat tohle:

                OR          A

                SBC        HL,BC

                ADD       HL,BC

Bude to umet priznak C a Z jako instrukce CP ?   Podle me by do melo dat Z pri rovnosti a CY  pokud bude BC vetsi nez HL. HL ani BC se nezmeni.  Nenastavuje to jeste neco jinyho, pripadne nemuze to jeste neco ovlivnit na vstupu, kdyz tam nuluju CY? Nemuzu nikde nalyzt jak se presne nastavujou priznaky u 16 bitovejch operacich.  Neco mi v tom useku nahodne nejde, a nemuzu to nalyzt.

 

A jeste jedna vec.  Mam 16 bitu stary cislo stopy, kde aktualne sedi disk. Pri pozadavku vystavit na novou stopu je potreba poslat prikaz „Step in“ (do stredu disku),nebo „Step out“ (ke kraji disku) tolikrat, kolik je rozdil mezi starou a novou hodnotou.  Rozdil muze byt samozrejme kladnej i zapornej.  Stopa je nejvic 1024 dec. Takze jsem to udelal takhle, HL je aktualni, DE nova pozadovana stopa:

SEEK:

                OR          A

                SBC        HL,DE                    ;stara – nova = +/- rozdil

                RET        Z                             ;stejny, nemusis nic

                JP           NC,SEEK_IN       ;kladny, smer in

                LD           A,H

                CPL                                        ;dvojkovej doplnek high

                LD           H,A

                LD           A,L

                CPL                                        ;dvojkovej doplnek low

                LD           L,A

                INC        HL                          ;pricteni 1 k doplnku

                LD           E,COM_OUT      ;command Step out

                JP           SPOL

SEEK_IN:

                LD           E,COM_IN          ;command Step in

SPOL:

                LD           C,RADIC

LOOP:

                OUT       (C),E                      ;prikaz do radice

                DEC        HL

                LD           A,H

                OR          L

JP           NZ,LOOP             ;dokud nejsou vsechny

                RET                                       

Muze to chodit? Hlavne, jestli ta cast kolem doplku je spravne, nebo zda to nejde udelat nejak jinak a ne takhle klopotne nadvakrat. Kdyz to nepujde na prvni slapnuti, zkurvim disk....

Jsem jedno ucho a voko.

Diky

Jirka

 
[2013/1 (16)] [2013/2 (90)] [2013/3 (37)] [2013/4 (48)] [2013/5 (36)] [2013/6 (128)] [2013/7 (27)] [2013/9 (29)] [2013/10 (64)] [2013/11 (63)]


[2010 (676)] [2011 (586)] [2012 (976)] [2013 (538)]