Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » Z80 Befehl gesucht » Themenansicht

Autor Thread - Seiten: -1-
000
09.01.2015, 10:12 Uhr
Ralph



Kennt ihr einen Z80 Befehl der aus max. 1 Byte OP-Code besteht und das Z-Flag löscht ?
Ich brauche eine Alternative zu XOR A + DEC A --> erzeugt NZ

Meiner Meinung nach gibt es keinen solchen Befehl, oder ?

Danke sagt Ralph
--
Es geht alles erst richtig los !

Dieser Beitrag wurde am 09.01.2015 um 10:12 Uhr von Ralph editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
09.01.2015, 10:25 Uhr
Wusel_1



OR A
--
Beste Grüße Andreas
______________________________________
DL9UNF ex Y22MF es Y35ZF
JO42VP - DOK: Y43 - LDK: CE

*** wer glaubt, hört auf zu denken ***
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
09.01.2015, 10:34 Uhr
Ralph




Zitat:
Wusel_1 schrieb
OR A


falsch Andreas.. was ist wenn A=00H ist ? genau Z=1 nach OR A
--
Es geht alles erst richtig los !

Dieser Beitrag wurde am 09.01.2015 um 10:34 Uhr von Ralph editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
09.01.2015, 10:47 Uhr
Wusel_1



Ist richtig. Wenn du immer löschen willst, dann nehme doch H,L,B,C,D oder E, wo du genau weißt, dass dieses Register immer ungleich 0 ist -> z.B. OR B.
--
Beste Grüße Andreas
______________________________________
DL9UNF ex Y22MF es Y35ZF
JO42VP - DOK: Y43 - LDK: CE

*** wer glaubt, hört auf zu denken ***
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
09.01.2015, 10:55 Uhr
Ralph



Jup, das ist ne Idee die passen könnte wo ich das brauche. Danke !
--
Es geht alles erst richtig los !
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
09.01.2015, 10:56 Uhr
Early8Bitz

Avatar von Early8Bitz

Mit einem Ein-Byte Befehl geht das nicht, wenn Du als Ausgangssituation
jeden beliebigen Inhalt aller Register berücksichtigen musst.

Wenn Dein Programm vor dem Befehl "X" in A einen Wert != 00
garantieren kann, dann "OR A" (wie <001> schon schrieb).
Alternativ "AND A".

Wenn Du an der Programmstelle ein anderes 8-bit Register hast,
was definitv != 00 steht (z.B. C), dann ginge auch "OR C".

Edit: Ups, da hat mich einer während des Schreibens überholt. Gleiche Lösung.
--
Gruß
Ralf

Ist ein alter Schaltkreis ein Schaltgreis?

Dieser Beitrag wurde am 09.01.2015 um 11:11 Uhr von Early8Bitz editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
09.01.2015, 11:30 Uhr
Early8Bitz

Avatar von Early8Bitz

Weitere Möglichkeit, falls o.g. nicht anwendbar ist:

Man drehe die Ausgangsvoraussetzung um, sprich:

Wenn eines der 8bit-Register definitiv == 00 ist und dessen Wert
verändert werden kann, dann tun es "INC r" bzw. "DEC r".

Falls HL definitiv auf eine Speicherstelle mit Inhalt != 00 verweist,
geht auch noch "OR (HL)" bzw. "OR M" (je nach Assembler) als 1-Byte Befehl.
--
Gruß
Ralf

Ist ein alter Schaltkreis ein Schaltgreis?

Dieser Beitrag wurde am 09.01.2015 um 11:32 Uhr von Early8Bitz editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
11.02.2015, 17:09 Uhr
Ralph



Habt ihr ne Idee das Z-Flag beim Z80 einfach invertiert werden kann, möglichst ohne A zu ändern.
--
Es geht alles erst richtig los !
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
11.02.2015, 20:25 Uhr
ambrosius



Einen direkten Befehl dafür gibt es nicht. Wenn das nicht zu lang wird, müßte es aber folgendermaßen gehen:

DI - evtl. Interrupt sperren, um Stackveränderungen zu vermeiden
PUSH AF - Akku und Flags auf Stack, Inhalt von AF bleibt unverändert
POP HL - H=A, L=F
BIT 6, L - Z-Flag wird invertiert, da L den Inhalt von F hat
EI

Statt HL geht natürlich auch DE oder BC, deren Inhalt Du evtl vorher auch noch sichern mußt und im Anschluß zurückholen. Möglicherweise gibt es auch den illegalen Befehl 'BIT 6, F', dann würde sich das Z-Flag selbst in einem Befehl negieren.
Etwas anderes fällt mir auf die Schnelle nicht ein.

Beste Grüße
Holger
--
Viele Grüße
Holger
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
11.02.2015, 21:05 Uhr
Ralph




Zitat:
ambrosius schrieb
DI - evtl. Interrupt sperren, um Stackveränderungen zu vermeiden
PUSH AF - Akku und Flags auf Stack, Inhalt von AF bleibt unverändert
POP HL - H=A, L=F
BIT 6, L - Z-Flag wird invertiert, da L den Inhalt von F hat
EI


Das ist zu lang, aber ein interessanter Ansatz Holger
--
Es geht alles erst richtig los !
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
11.02.2015, 21:26 Uhr
Wusel_1



falscher Gedanke von mir - gelöscht
--
Beste Grüße Andreas
______________________________________
DL9UNF ex Y22MF es Y35ZF
JO42VP - DOK: Y43 - LDK: CE

*** wer glaubt, hört auf zu denken ***

Dieser Beitrag wurde am 11.02.2015 um 21:28 Uhr von Wusel_1 editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
011
11.02.2015, 22:11 Uhr
ambrosius



Hallo Ralph,

habe gerade mal nachgesehen: einen direkten illegalen Befehl 'BIT 6, F' gibt es leider nicht. Kürzer als oben beschrieben wird es also leider höchstwahrscheinlich nicht gehen. Aber vielleicht läßt sich das Problem ja ganz anders umgehen. Dazu müßte man aber die genaueren programmtechnischen Hintergründe wissen.

Beste Grüße
Holger
--
Viele Grüße
Holger
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
012
11.02.2015, 22:33 Uhr
Early8Bitz

Avatar von Early8Bitz


Zitat:
Ralph schrieb
Habt ihr ne Idee das Z-Flag beim Z80 einfach invertiert werden kann, möglichst ohne A zu ändern.



Braucht man das wirklich oder ist das ne Denksportaufgabe?

Was richtig kurzes habe ich auch nicht, aber eine Abwandlung der Lösung aus <008>:

DI/EI halte ich für überflüssig, eine saubere Interruptroutine sollte Stack- und registerneutral sein, so dass im Hauptprogramm niemals was versaut wird.
Also mein Vorschlag:

PUSH AF ; AF in den Stack
EX (SP),HL ; und dann nach HL, dafür ist jetzt HL im Stack
BIT 6,L ; siehe <008>
POP HL ; HL und SP wieder im Originalzustand

Diese Sequenz ändert keine Register ausser F
--
Gruß
Ralf

Ist ein alter Schaltkreis ein Schaltgreis?
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
013
11.02.2015, 22:40 Uhr
Ralph




Zitat:
Early8Bitz schrieb
Braucht man das wirklich oder ist das ne Denksportaufgabe?

.. beides Ralf

Ich stand vor der Aufgabe das zu lösen und wollte auch mal wissen, wie es andere Programmierer machen.
Meine Lösung war der Umbau der Routine und so kam ich effektiv sogar mit nur 2Bytes mehr aus.
--
Es geht alles erst richtig los !

Dieser Beitrag wurde am 11.02.2015 um 22:48 Uhr von Ralph editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
014
11.02.2015, 23:45 Uhr
PIC18F2550

Avatar von PIC18F2550

daa a,a

Z: Set if Acc. is Zero after operation, reset otherwise
--
42 ist die Antwort auf die "Frage nach dem Leben, dem Universum und dem ganzen Rest"
Aktuelle Projektdokumentationen
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
015
12.02.2015, 07:46 Uhr
Early8Bitz

Avatar von Early8Bitz


Zitat:
PIC18F2550 schrieb
daa a,a



DAA manipuliert immer nur A, braucht also keinen Operanden, und schon garnicht zwei Register.

Ausserdem war die Denkaufgabe, das Z-Flag zu invertieren, und nicht
das Z-Flag abhängig vom Stand in A zu setzten/rückzusetzen.
Sonst könntest Du auch OR A oder AND A nehmen.


Zitat:
Ralph schrieb
Ich stand vor der Aufgabe das zu lösen



Ich bin neugierig - was ist der praktische Nährwert dieser Flag-Manipulation?
--
Gruß
Ralf

Ist ein alter Schaltkreis ein Schaltgreis?
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
016
12.02.2015, 09:16 Uhr
Ralph




Zitat:
Early8Bitz schriebIch bin neugierig - was ist der praktische Nährwert dieser Flag-Manipulation?

das hier war die Aufgabe

JR Z,TimeOut ; TimeOutZähler=0=A=0 & Z
IN A,(IdeCmd) ; GIDE Status lesen
RLA ; Bit 7 ins Carry (immer NZ)
JR C,WaitRD1 ; GIDE nicht bereit -> weiter warten
M1: POP HL
RET
TimeOut: XOR A ;A=0
DEC A ; A=FF & NZ
JR M1 ; zurück

Ich brauchte bei der Rückkehr (M1) ein NZ falls TimeOut auftritt und Z falls kein TimeOut aber GIDE bereit CARRY=0. Das wäre einfach zu lösen gewesen,
indem Z einfach invertiert wird. Daher auch die Frage..

gelöst hab ich das dann so:
JR Z,WaitRET ; TimeOutZähler=0=A=0 & Z
IN A,(IdeCmd) ; GIDE Status lesen
RLA ; Bit 7 ins Carry
LD A,01H ;
JR C,WaitRd1 ; GIDE nicht bereit -> weiter warten
; wenn hier dann ist A<>0 und NC sowie Z je nach OR H
WaitRET:
DEC A ; bei TimeOut A=FFH & NZ, sonst A=0 und Z
M1: POP HL
RET
--
Es geht alles erst richtig los !

Dieser Beitrag wurde am 12.02.2015 um 09:18 Uhr von Ralph editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
017
12.02.2015, 09:51 Uhr
PIC18F2550

Avatar von PIC18F2550


Zitat:
Ralph schrieb
Kennt ihr einen Z80 Befehl der aus max. 1 Byte OP-Code besteht und das Z-Flag löscht ?


Das war die Aufgabe. Löschen nicht setzen, und das macht DAA.

wenn du A natürlich weiter verwenden willst brauchst du natürlich noch einen push und pop.
--
42 ist die Antwort auf die "Frage nach dem Leben, dem Universum und dem ganzen Rest"
Aktuelle Projektdokumentationen
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
018
12.02.2015, 11:44 Uhr
jmueller



@PIC18F2550:

Die Aufgabe wurde von dir aber auch nicht gelöst
...und ist aus meiner Sicht auch nicht lösbar.

Bei A=0 ist nach DAA das Z-Flag gesetzt.

Jens
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
019
12.02.2015, 13:00 Uhr
Micha

Avatar von Micha

wenn in der Restart-Area noch irgendwo ein Plätzchen frei ist könnte man als Notlösung einen RST Befehl, sozusagen als 1-Byte-Subroutinenaufruf missbrauchen um diese Aktion im Programmablauf in ein Byte zu quetschen?
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
020
12.02.2015, 13:52 Uhr
Ralph




Zitat:
PIC18F2550 schrieb

Zitat:
Ralph schrieb
Kennt ihr einen Z80 Befehl der aus max. 1 Byte OP-Code besteht und das Z-Flag löscht ?


Das war die Aufgabe. Löschen nicht setzen, und das macht DAA.

wenn du A natürlich weiter verwenden willst brauchst du natürlich noch einen push und pop.


Nein diese Aufgabe war schon erledigt.. Es war die neue Aufgabe aus 007 gemeint. Ich wollte keinen neuen POST aufmachen.

Wir müssen uns auch bitte keinen Kopf weiter machen. Ist ja alles erledigt.

Danke sagt Ralph
--
Es geht alles erst richtig los !
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek