3000 77e1 0000 I ... ASM.COM DOC6B
;
9.6.13.___Bittest-_und_-Setzbefehle_(Bitmanipulation)


Die  Bitmanipulationsbefehle erlauben,  Bits in einem Register 
oder  auf einem Speicherplatz zu setzen,  zu loeschen  und  zu 
testen.

 ____________________________________________________________
|          |              |                                  |
| 8080-    | Z80-         |                                  |
| Mnemonik | Mnemonik     | Wirkungsweise der Befehle        |
|__________|______________|__________________________________|
|          |              |                                  |
|   ---    | SET  b,r     | Die durch b gekennzeichnete Bit- |
|          |              | position wird in dem Register r  |
|          |              | gesetzt.                         |
|__________|______________|__________________________________|

 ____________________________________________________________ 
|          |              |                                  |
| 8080-    | Z80-         |                                  |
| Mnemonik | Mnemonik     | Wirkungsweise der Befehle        |
|__________|______________|__________________________________|
|          |              |                                  |
|   ---    | SET  b,M     | Die durch b gekennzeichnete Bit- |
|          |              | position wird in der Speicher-   |
|          |              | stelle gesetzt, die durch das    |
|          |              | Register HL adressiert ist.      |
|          |              |                                  |
|   ---    | SET  b,(IX+d)| Die durch b gekennzeichnete Bit- |
|          |              | position wird in der Speicher-   |
|          |              | stelle gesetzt,  die durch  den  |
|          |              | Inhalt des Indexregisters IX plus|
|          |              | Verschiebung adressiert ist.     |
|          |              |                                  |
|   ---    | SET  b,(IY+d)| Die durch b gekennzeichnete Bit- |
|          |              | position wird in der Speicher-   |
|          |              | stelle gesetzt, die durch den In-|
|          |              | halt des Indexregisters IY  plus |
|          |              | Verschiebung adressiert ist.     |
|          |              |                                  |
|   ---    | RES  b,t     | Die durch b gekennzeichnete Bit- |
|          |              | position in t wird geloescht.    |
|          |              |                                  |
|   ---    | BIT  b,t     | Die durch b gekennzeichnete Bit- |
|          |              | position in t wird getestet. Das |
|          |              | Komplement des zu testenden Bits |
|          |              | wird in das Z-Flag geladen.      |
|__________|______________|__________________________________|


9.6.14.___Eingabebefehle


Die  Ein- und  Ausgabegruppe gestattet einen  weiteren  Anwen-
dungsbereich  von Datentransfer zwischen Speicherplaetzen oder 
den Universalregistern der CPU und den externen E/A-Geraeten.
Die  Eingabebefehle  setzen automatisch das  Flagregister,  so 
dass  keine zusaetzlichen Befehle noetig sind,  um den  Status 
der Eingabedaten zu ermitteln.

 ____________________________________________________________ 
|          |              |                                  |
| 8080-    | Z80-         |                                  |
| Mnemonik | Mnemonik     | Wirkungsweise der Befehle        |
|__________|______________|__________________________________|
|          |              |                                  |
| IN   n   | IN   A,(n)   | Kanaladresse wird mittels Direkt-|
|          |              | operand eingestellt.             |
|          |              | Zielregister ist der Akkumulator |
|          |              | A <--- (n)                       |
|__________|______________|__________________________________|


 ____________________________________________________________
|          |              |                                  |
| 8080-    | Z80-         |                                  |
| Mnemonik | Mnemonik     | Wirkungsweise der Befehle        |
|__________|______________|__________________________________|
|          |              |                                  |
|   ---    | IN   r,(C)   | Kanaladresse wird indirekt ueber |
|          |              | das Register C eingestellt.      |
|          |              | r <--- (C)                       |
|          |              |                                  |
|   ---    | INI          | Kanaladresse wird indirekt ueber |
|          |              | Register C eingestellt. Zieladr. |
|          |              | ueber Register HL. B kann als    |
|          |              | Bytezaehler arbeiten.            |
|          |              | B wird dekrementiert, HL inkre-  |
|          |              | mentiert.                        |
|          |              | (HL) <--- (C)                    |
|          |              | B    <--- B-1                    |
|          |              | HL   <--- HL+1                   |
|          |              |                                  |
|   ---    | INIR         | Kanaladresse wird indirekt ueber |
|          |              | Register C eingestellt, Zieladr. |
|          |              | ueber Register HL. B arbeitet    |
|          |              | als Bytezaehler. B wird dekremen-|
|          |              | tiert, HL inkrementiert. Es wird |
|          |              | eine Blockuebertragung durchge-  |
|          |              | fuehrt bis B=0 ist.              |
|          |              | (HL) <--- (C)                    |
|          |              | B    <--- B-1                    |
|          |              | HL   <--- HL+1                   |
|          |              | Wiederholen bis B=0.             |
|          |              |                                  |
|   ---    | IND          | Kanaladresse wird indirekt ueber |
|          |              | Register C eingestellt. Zieladr. |
|          |              | ueber Register HL. B kann als    |
|          |              | Bytezaehler arbeiten.     B und  |
|          |              | HL werden dekrementiert.         |
|          |              | (HL) <--- (C)                    |
|          |              | B    <--- B-1                    |
|          |              | HL   <--- HL-1                   |
|          |              |                                  |
|   ---    | INDR         | Kanaladresse wird indirekt ueber |
|          |              | Register C eingestellt. Zieladr. |
|          |              | ueber Register HL. B arbeitet    |
|          |              | als Bytezaehler.  B und HL werden|
|          |              | dekrementiert. Es wird eine      |
|          |              | Blockuebertragung durchgefuehrt, |
|          |              | bis B = 0 ist.                   |
|          |              | (HL) <--- (C)                    |
|          |              | B    <--- B-1                    |
|          |              | HL   <--- HL-1                   |
|          |              | Wiederholen  B = 0.              |
|__________|______________|__________________________________|

.pa
Die  Kanaladresse liegt auf der unteren Haelfte des  Adressen-
busses  A0  - A7.  Auf der oberen Haelfte  des  Adressenbusses 
liegt  bei  IN A,(n) der Akkumulatorinhalt bei den  restlichen 
Befehlen der Inhalt des Registers B.


9.6.15.___Ausgabebefehle

 ____________________________________________________________
|          |              |                                  |
| 8080-    | Z80-         |                                  |
| Mnemonik | Mnemonik     | Wirkungsweise der Befehle        |
|__________|______________|__________________________________|
|          |              |                                  |
| OUT  n   | OUT  (n),A   | Kanaladresse wird mit Direktope- |
|          |              | rand eingestellt. Quellregister  |
|          |              | ist der Akkumulator: (n) <--- A. |
|          |              |                                  |
|   ---    | OUT  C,r     | Kanaladresse wird indirekt ueber |
|          |              | Register C eingestellt. Quellre- |
|          |              | gister ist r: (C) <--- r.        |
|          |              |                                  |
|   ---    | OUTI         | Kanaladresse wird indirekt ueber |
|          |              | das Register C eingestellt,      |
|          |              | Quelladresse ueber Register HL.  |
|          |              | B kann als Bytezaehler arbeiten. |
|          |              | B wird dekrementiert, HL inkre-  |
|          |              | mentiert.                        |
|          |              | (C) <--- (HL)                    |
|          |              | B   <--- B-1                     |
|          |              | HL  <--- HL+1                    |
|          |              |                                  |
|   ---    | OTIR         | Kanaladresse wird indirekt ueber |
|          |              | das Register C eingestellt,      |
|          |              | Quelladresse ueber Register HL.  |
|          |              | B arbeitet als Bytezaehler.      |
|          |              | B wird dekrementiert, HL inkre-  |
|          |              | mentiert. Es wird eine Block-    |
|          |              | uebertragung durchgefuehrt, bis  |
|          |              | B = 0 ist.                       |
|          |              | (C) <--- (HL)                    |
|          |              | B   <--- B-1                     |
|          |              | HL  <--- HL+1                    |
|          |              | Wiederholen bis B = 0            |
|          |              |                                  |
|   ---    | OUTD         | Kanaladresse wird indirekt ueber |
|          |              | Register C eingestellt, Quell-   |
|          |              | adresse ueber Register HL. B kann|
|          |              | als Bytezaehler arbeiten. B und  |
|          |              | HL werden dekrementiert.         |
|          |              | (C) <--- (HL)                    |
|          |              | B   <--- B-1                     |
|          |              | HL  <--- HL-1                    |
|__________|______________|__________________________________|
.pa
 ____________________________________________________________
|          |              |                                  |
| 8080-    | Z80-         |                                  |
| Mnemonik | Mnemonik     | Wirkungsweise der Befehle        |
|__________|______________|__________________________________|
|          |              |                                  |
|   ---    | OTDR         | Kanaladresse wird indirekt ueber |
|          |              | das Register C eingestellt,      |
|          |              | Quelladresse ueber Register HL. B|
|          |              | arbeitet als Bytezaehler. B und  |
|          |              | HL werden dekrementiert. Es wird |
|          |              | eine Blockuebertragung durchge-  |
|          |              | fuehrt, bis B=0 ist.             |
|          |              | (C) <--- (HL)                    |
|          |              | B   <--- B-1                     |
|          |              | HL  <--- HL-1                    |
|          |              | Wiederholen bis B=0 ist.         |
|__________|______________|__________________________________|


9.6.16.___Abkuerzungsverzeichnis_zur_Befehlsbeschreibung


r,r' : Register A, B, C, D, E, H und L koennen eingesetzt     
       werden.

dd   : Doppelregister BC, DE, HL und SP koennen eingesetzt     
       werden.

qq   : Doppelregister AF, BC, DE und HL sind moeglich.

pp   : Doppelregister BC, DE und SP sind erlaubt.

bb   : Doppelregister BC, DE, HL, SP, IX und IY sind erlaubt.
 
s    : r, n, M, (IX+d) und (IY+d) sind erlaubt.

t    : r, M, (IX+d) und (IY+d) sind moeglich.

n    : 8-Bit-Direktoperand

nn   : 16-Bit-Direktoperand

d    : Verschiebung bei Adressierung ueber Indexregister,
       erlaubt im Bereich von -128 <= d <= 127
       Die Bereichsgrenzen werden vom Assembler nicht geprueft!

e    : relative Sprungsadresse,
       erlaubt im Bereich von -128 <= e <= 127
       Die Bereichsgrenzen werden vom Assembler nicht geprueft!

b    : Bit, das in den Bitmanipulierbefehlen behandelt werden     
       soll 0 <= b <= 7

M    : Inhalt des durch HL adressierten Speicherplatzes

k    : Die Werte 0, 1, 2, 3, 4, 5, 6, 7 sind erlaubt.

p    : Die  Werte 00H,  08H,  10H,  18H,  28H,  30H,  38H sind 
       erlaubt.

CY   : Carry-Flag


Anmerkung:


In  der  8080-Mnemonik wird fuer die Operanden nur  der  erste 
Buchstabe geschrieben:

     . H fuer HL
     . D fuer DE
     . B fuer BC.

Aber es bleibt SP, und fuer AF wird PSW verwendet.
Fuer M darf nicht (HL) geschrieben werden.


6.6.17.___Arbeit_mit_den_Bedingungsbits_(Flags)


Das Flagregister F gibt Auskunft ueber das Ergebnis der  letz-
ten Prozessoroperation.
Es dient im wesentlichen dazu,  bedingte Programmverzweigungen 
bzw.  bedingte Unterprogrammaufrufe oder -rueckspruenge auszu-
fuehren.         

Flagregister

         _______________________________ 
        |_7_|_6_|_5_|_4_|_3_|_2_|_1_|_0_|
        |_S_|_Z_|_X_|_H_|_X_|P/V|_N_|_CY|

S    - Vorzeichenbit (Sign - Flag)
Z    - Nullbit (Zero - Flag)
H    - Halbbyteueberlaufbit (Half - Carry - Flag)
N    - Additions- / Subtraktionsbit
P/V  - Paritaets- / Uebertragsbit (Parity / Overflow - Flag)
CY   - Uebertragsbit (Carry - Flag)
X    - nicht belegt


Vorzeichenbit_(S-Flag)


Bei  bestimmten Befehlen wird das hoechstwertige Bit des Akku-
mulators geladen.
Bei  Ausfuehrung von arithmetischen Befehlen mit vorzeichenbe-
hafteten Zahlen wird eine positive Zahl durch eine 0 und  eine 
negative  Zahl  durch eine 1 in der hoechstwertigen  Bitstelle 
gekennzeichnet.

Nullbit_(Z-Flag)


Es  wird bei arithmetischen und  logischen  1-Byte-Operationen 
gesetzt,  wenn das Ergebnisbyte des Akkumulators 0 ist.  Sonst 
wird das Ergebnisbyte zurueckgesetzt.

Bei  Vergleichs- und  Suchbefehlen  wird das  Z-Flag  gesetzt, 
sobald der Vergleich positiv ausgeht.

Bei  den Bit-Befehlen wird das Z-Flag mit dem  komplementaeren 
Wert des getesteten Bits geladen.

Bei der Uebertragung eines Bytes zwischen einer Speicherstelle 
und einer E/A-Schnittstelle (INI, IND, OUTI, OUTD) wird das Z-
Flag 1 gesetzt, wenn der Wert des Zaehlregisters 0 wird.
Bei  IN r,(C) wird das Z-Flag gesetzt,  wenn die  eingezogenen 
bzw. am E/A-Tor anliegenden Daten den Wert 0 haben.


Halbbyte-Uebertragsbit_(H-Flag)


Das  H-Flag wird entsprechend dem  Uebertragungsergebnis  zwi-
schen  den Bits 3 und 4 einer arithmetischen  1-Byte-Operation 
gesetzt (falls Uebertrag) oder rueckgesetzt (falls kein Ueber-
trag).  Es  wird  beim Befehl DAA verwendet,  um das  Ergebnis 
einer gepackten BCD-Addition bzw. -Subtraktion zu korrigieren.

 __________________________________________________
|   |                     |                        |
| H | Addition            | Subtraktion            |
|___|_____________________|________________________|
|   |                     |                        |
| 1 | Uebertrag von Bit 3 | Negativer Uebertrag    |
|   | zu Bit 4            | von Bit 4              |
|___|_____________________|________________________|
|   |                     |                        |
| 0 | Kein Uebertrag von  | Kein negativer Ueber-  |
|   | Bit 3 zu Bit 4      | trag von Bit 4         |
|___|_____________________|________________________|


Paritaets-_/_Ueberlaufbit_(P/V-Flag)


Es wird unterschiedlich genutzt.
Bei arithmetischen Befehlen wird das P/V-Flag gesetzt, wenn im 
Ergebnis das hoechste Bit des Akkumulators gesetzt wird.

Bei  logischen  Operationen und Verschiebebefehlen  dient  das 
P/V-Flag zur Ueberpruefung der Paritaet des  Ergebnisses.  Ist 
die  Anzahl  der gesetzten Bits im angesprochenen Byte  gerade 
(0,  2,  4,  6,  8),  so wird das P/V-Flag gesetzt,  ansonsten 
rueckgesetzt.

Bei Blocktransport- (LDI, LDIR, LDD, LDDR) und Blocksuchbefeh-
len (CPI,  CPIR,  CPD,  CPDR) gibt das P/V-Flag Auskunft ueber 
den  Stand des Bytezaehlers.  Das P/V-Flag wird  rueckgesetzt, 
wenn nach Dekrementieren des Bytezaehlers (=<BC>) als Ergebnis 
0 entsteht. In allen uebrigen Faellen bleibt das P/V-Flag 1.


Additions-_/_Subtraktionsbit_(N-Flag)


Es wird intern bei dem DAA-Befehl benutzt,  um zwischen  Addi-
tions- und  Subtraktionsbefehlen zu unterscheiden.  Bei  allen 
Additionsbefehlen wird das N-Flag rueckgesetzt.  Subtraktions-
befehle setzten das N-Flag.


Uebertragsbit_(CY-Flag)


Das Setzen / Ruecksetzen des CY-Flags wird je nach ausgefuehr-
ter Operation verschieden behandelt.

Das CY-Flag wird gesetzt, wenn

  - bei Additionsbefehlen ein Uebertrag und
  - bei Subtraktionsbefehlen ein negativer Uebertrag entsteht.

Es wird rueckgesetzt,

  - bei Additionsbefehlen, die keinen Uebertrag erzeugen und
  - bei Subtraktionsbefehlen, die keinen negativen Uebertrag
    erzeugen.

Bei Verschiebebefehlen (RLA, RLC, RL, RR) wird das CY-Flag als 
Zwischenspeicher  fuer  die Uebertragung des  niederwertigsten 
bzw.  hoechstwertigen Bits eines CPU-Registers bzw.  Speicher-
platzes benutzt.

Bei  den Befehlen RLCA,  RLC und SLA enthaelt das CY-Flag  den 
Wert  des hoechstwertigen Bits,  das durch den Befehl aus  dem 
behandelten Register bzw. Speicherplatz hinausgeschoben wurde.

Bei  den Befehlen RRCA,  RRC,  SRA,  SRL enthaelt das  CY-Flag 
analog den Wert des niederwertigsten Bits.

Die logischen Befehle AND,  OR,  XOR setzen das CY-Flag grund-
saetzlich zurueck.

Die speziell fuer das CY-Flag vorgesehenen Befehle SCF (Setzen 
CY-Flag) und CCF (Komplement C-Flag) erlauben das Setzen  bzw. 
Komplementieren des CY-Flags.