Posted By: Busy (Slavko Labsky) on 'CZspeccy'
Title:     Este raz R a IN reg,(C)
Date:      Tue May 13 07:59:53 1997

> < > Jinak mam dojem, ze zadna instrukce nijak zvlast neuvlivnuje registr R.
< < > Relk bych, ze po kazde instrukci se R incne (ale jen 7bitove)
< 
> < Dikes za tu CRAZY, ale s tim incnutim Rka uplne pravdu nemas, protoze co
< < ja vim, tak po refixovany instrukci se to incne, ale o 2 !!!!!
> < U dvojite a vice prefixovanejch to prave nevim........
< 
> Mne sa zda, ze kazdy operacny kod inkrementne R o jednotku.
< Cize kolko op-kodov (prefixy + samotny kod) ma instrukcia,
> o tolko sa inkrementne dolnych 7 bitov registra R.
< (ale neviem to naisto, este som si to prakticky neoveroval).

No, takze vcera som si to overil aj prakticky,
a zistil som zaujimave veci. Podme na to:

< < Napr. rekne mi nekdo, co se stane, kdyz necham provest tenhle kod ???:
> <     #ED #ED #ED #ED #00 #C9

Konkretne toto INCne R-register (dolnych 7 bitov) o hodnotu 6.

Moja dalsia uvaha sa bude tykat hlavne toho suboru instrukcii,
ktory som spisal (codes.txt) a ktory mam aj na mojej stranke.
Mozete si ho pozriet: http://www.elf.stuba.sk/~busy/codes.txt

> Ak je to moje vyssie uvedene zdanie spravne, tak kazdy #ED
< incne R o jednotku presne tak, ako keby to bol NOP.
> Tak isto to plati aj o prefixoch #DD a #FD a #CB.

Zistil som, ze toto co som napisal minule az tak celkom neplati.
Ale uz dost chodenia okolo horucej kase, podme na konrektnosti.

Vsetky instrukcie v stlpci *Asm* inkrementuju R o jednotku.
Pri instrukciach v stplci *DD* a *FD* sa inkrementuje R o dva,
pretoze prvy inkrement spravi prefix (DD/FD) a druhy inkrement
spravi samotny operacny kod instrukcie (ako v stlpci *Asm*).
Akonahle date pred instruckcie viac prefixov DD alebo FD, potom
kazdy dalsi prefix sposobi inkrementnutie o dalsiu jednotku.
Tu presne plati to co som pisal minule - prefix DD/FD za ktorymi
ide dalsi prefix DD/FD sa uplatni presne ako NOP - zdrzi procesor
o dobu 4 takty, inkrementne R a nic uzitocneho neurobi.
A pritom vobec nezalezi na tom, ci dana instrukcia ma
nieco do cinenia s registrami HL (IX,IY) alebo nie.

Malicku vynimku tvori instrukcia HALT. Jej zvlasnost spociva
v tom, ze ked procesor najde HALT, tak ho vykona ako klasicky
NOP ale s tym rozdielom, ze "zabudne" inkrementnut register PC.
Tym padom stale cykli na tomto HALTe a PC sa inkrementne az ked
pride nejake prerusenie. Toto ma specialny vplyv na register R.
V ramci vykonavania NOPov sa aj inkrementuje R (kazde 4 takty o 1),
a tym padom R sa inkrementne tolko krat, kolko krat sa stihol
vykonat NOP od zaciatku instrukcie az do nejakeho prerusenia.
Vlastne ked HALT berieme ako slucku NOPov, tak ani vynimka nie je.

Ovela zaujimavejsie je to so stlpcami v ktorych je prefix CB.
Mozno to bude prekvapujuce, ale VSETKY instrukcie s prefixom CB
inkrementuju R o dva - a to nezavisle na tom, ci pred instrukciou
je prefix DD/FD alebo nie! Teda napriklad taky BIT 1,A [kod CB-4F]
zvecsi R o dva presne tak isto, ako BIT 1,(IX+#FF) [kod DD-CB-FF-4E].
Ak ma instrukcia viac prefixov DD/FD, potom plati to iste ako vyssie -
do instrukcie sa zarava len posledny prefix a ostatne sa uplatnia ako
NOPy. Napriklad FD + BIT 1,(IX+#FF) [kod FD-DD-CB-FF-4E] zvecsi R o 3.

Pomerne jednoduche je to s instrukciami v stlpci *ED*. Prefix ED rusi
platnost prefixov DD/FD, preto tam nenastavaju s tymto ziadne problemy
a akykolvek prefix pred instrukciou po ED straca svoju platnost a meni
sa na NOP (4 takty, inkrement R o 1). Vsetky instrukcie po ED inkrementuju
R register o dvojku. Prvy krat pri dekodovani prefixu ED a druhy krat
pri dekodovani samotneho operacneho kodu (hned za prefixom).

Velmi zaujimavo sa spravaju blokove instrukcie. Instrukcie bez opakovania
(LDI,INI,CPI...) su presne ako vsetky ostatne po ED - zvecsia R o dva.
Instrukcie s opakovanim su vlastne len cyklicke opakovanie instrukcii
bez opakovania (vecsinou sa opakuju BC-krat), preto inkrementuju R
o hodnotu 2*BC. Malu vynimku tvoria CPIR a CPDR, ktore mozu predcasne
skoncit najdenim hladaneho bajtu. Potom samozrejme R bude zvecseny
len o hodnotu dvojnasobku kolko krat sa CPIR/CPDR stihlo vykonat.
Este jedna vynimka moze nastat, ak blokova instrukcia pri zapisovani
do pameti sama seba prepise. Tym padom je v pameti uz ina instrukcia
a R je pred jej vykonanim zvecseny len o dvojnasobok poctu ktory sa
stihla blokova instrukcia vykonat pred sebaprepisanim. Teda vlastne
je to principialne to iste ako pri predcasnom ukonceni CPIR/CPDR.

===

A teraz este zopar slov k IN T,(C).

> < Apropo, v Busyho vypisu codes.txt je mi nejasna jedna vec:
< <     #ED #70 je dle tohoto vypisu toto: IN T,(C)
> <   A ted mi vysvetlete co je to  T   ?!?!????!!!!!!
< 
> Aha, tak toto budem musiet vysvetlit podrobnejsie.
< Oficialne tabulky Z80 uvadzaju ze toto je IN F,(C).
> Teda akoze dany bajt sa nacita do Flag registra.
< ALE TO NIE JE PRAVDA !!! Pretoze vo flag registri nie je.
> Vsetky instrukcie IN reg,(c) nastavuju prizraky podla
< nacitaneho bajtu (zero podla nulovosti, signum podla bitu 7,...)
> Tieto priznaky nastavuje aj instrukcia IN F,(C).
< Lenze samotny bajt, ktory sa nacita z portu, sa jaxi nikam
> neulozi. Ani na (HL), ako by to logicky z op-code vyplyvalo.
< Preto predpokladam, ze sa ten udaj nacita do dakeho temporary
> registra (preto to T) a potom sa z neho len urcia flagy.

Takze, dal som si trosku namahy a inkriminovanu instrukciu IN T,(C)
som podrobil podrobnej analyze a poriadne preveril jej spravanie.
Vsetky instrukcie IN reg,(C) nacitaju do registra udaj z portu BC
a potom nastavia FLAG register podla nacitaneho udaja nasledovne:

      Znacka Bit Zmeny/vyznam
      ------ --- ------------
           C  0  nemeni sa
           N  1  nuluje sa
         P/O  2  parita udaja
              3  bit 3,udaj (kopiruje)
          AC  4  nuluje sa
              5  bit 5,udaj (kopiruje)
           Z  6  indikuje nulovost udaja
           S  7  bit 7,udaj (znamienko)

"reg" moze byt jeden z tychto registrov: A,B,C,D,E,H,L a nejaky T.
Zhrnutie: Bity 1 (N) a 4 (AC) sa vykonanim tychto instrukcii vynuluju,
bit 0 (C) sa nezmeni, bit 6 (Z) sa nastavi ak je nacitany udaj nulovy
(ako je zvykom) a do bitov 3,5 a 7 (S) sa skopiruju prislusne bity udaja.
Siedmy bit je vlastne zaroven aj znamienko udaja (ako je zvykom).

Instrukcie OUT (C),??? zachovavaju FLAG register nezmeneny.

===

Takze tak. Dufam, ze teraz uz v tom budeme mat vsetci jasno :)  Vas Busy.

Search the boards