Solch trickreiche Varianten wird man in C in Inlineassembler schreiben, da man sonst keinen direkten Zugriff auf die Flags hat.
Ja, mit inline-ASM ist klar. Aber Du hattest ja schon ein paar Beispiele gezeigt, wo der Compiler recht gut optimiert - wenn man den Code entsprechend verfaßt.
In #9 wurde zB die If Then Geschichte rausoptimiert.
Daß ich grundsätzlich zwei Wege sehe, hatte ich ja schon angedeutet:
1.: das Input-Bein wird in irgendeiner Variante abgefragt (Laden, maskieren, Vergleichen und dann bedingt springen, oder direkt im I/O abfragen mit SBIC etc...)
2.: der Pin Zustand wird irgendwo zwischengespeichert (idealerweise im T ) und dann (irgendwie) in das geschobene Result übertragen.
Beide Varianten gabs hier ja schon ansatzweise - den Code aus #9 könnte man wie folgt verfeinern...
R28=Result wieder mit 0x01 vorinitialisiert, wie gehabt...
bei jeder gewählten Clock-Flanke:
CodeBox Assembler
LSL R28
IN R24, 0x19
BST R24, 3
BLD R28, 0
anschließend kann dann wie gehabt das eventuelle Carry ausgewertet werden, um das ganze Byte zu erkennen.
Wie gefordert kein konditionaler Sprung (wie SBIC), dafür ein Register mehr im Einsatz. Wahrscheinlich auch etwas(!) langsamer.