010
05.10.2014, 01:39 Uhr
timetube
|
Ich finde man kann die Frage, warum die Z80 immer nur WORTE, keine BYTES auf/vom Stack transferiert, durchaus mal stellen.
Und man kann darauf auch sachlich antworten.
Die Z80 ist zwar ein 8bitter, wie die 650X auch, hat aber bereits ein fast vollwertigen 16Bit Core.
Natürlich könnte man zwei unterschiedliche POP/PUSH Opcodes haben.
Da der Stack bei Interrupt und Unterprogrammen immer 16Bit Adressen speichern muss, braucht es zwingend einen 16Bit Stack und passende Opcodes.
8Bit Push/Pop käme also oben drauf, auf das Set von Opcodes.
Die Z80 ist ja eine Weiterentwicklung der 8080, mit diese Opcode-kompatible.
Die 8080 hatte ausnahmslos 1 Byte Opcodes. Mit nur einem Byte "wusste" das Core was zu tun ist. Um nun bereits beim 8080 weiter 8bit-Push/Pops zu implementieren, hätte man auf andere, wichtigen Befehlen verzichten müssen oder den Befehlssatz auf 2Byte-Opcodes erweitern müssen. Der Nachteil wiegt bei weiten den Vorteil nun auch 8bit zwischen dem Stack zu transferieren nicht auf.
Ein acht Bit Push/Pop für jedes der [a,f,b,c,d,e,h,l,i,r] 10 Register bedeutete ja, dass 2 x 10 also 20 Opcodes der 256 möglichen nur dafür zu belegen sind.
Mit der Z80 kommen nun die Prefix-Opcodes hinzu, da wäre Platz für solche "nice to have but not really necessary" Opcodes gewesen. Da die ja um kompatible zu bleiben mit Prefix wären, wären die vom Timing her er ungünstig. Man würde ein 1 Byte weniger speichern/laden dafür aber ein Byte längeren Code. Also was brächte es?
Dann kann man die Sache ja auch anders sehen. Die 8080/Z80 hat nur 16Bit Register, die intern auch als zwei getrennte MSB/LSB angesprochen werden können.
Man hätte statt dem jeweiligen Anteil der 16 Bit Registers eigenen Bezeichner zu vergeben, ja auch das folgende definieren können.
Es gibt nur 16Bit Register in der Assembler Mnemonics. A,B,D,H,X,Y,I Alle 16bit! (AF,BC,DE,HL,IX,IY,IR)
Aus
LD HL, nnnn LD H, nn LD L, B
würde dann zu
LD H, nnnn LD high(H), nn LD low(H), high(B)
Dann wäre die 16Bit Charakteristik deutlicher geworden.
Man darf sich die Register nämlich nicht so als Schubladen vorstellen, für jedes eine eigene Schublade. Intern sind es 16Bit Register und F gibt es als Register gar nicht, das sind zusammengefasste Ausgänge der ALU. Die Werden in der Mnemonics halt asl F-Register zusammen mit AF angesprochen.
Du wünscht Dir von daher nicht ein PUSH/POP für einzelne Register sondern eins für halbe Register Du erkennst nun sicher das die 650x einfach nicht mit der Z80 zu vergleichen ist. Du könntest genauso gut fragen warum die ARM nur 32 (Thrump 16) BIT Befehle kennt. mfg j. -- "Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt." Ein Stein. Dieser Post wurde am 05.10.2014 um 01:58 Uhr von timetube editiert. |