ORG 0000h ; 01 Code wird auf feste Speicheradresse fixiert
Start: ; 02 hier geht das ganze Elend los
MOV R1,#00h ; 03 Register R1 kommt das fertige byte rein,
initial = 00
MOV R2,#07h ; 04 Register R2 zählt die Bits (0-7)
jb P3.1,Start2 ; 05 wenns am Port3 bit 1 hochgeht dann gehts los
..
sjmp Start ; 06 war wohl nix, nochmal Däumchen drehen gehen
Start2: ; 07 jetzt wirds ernst: es kommt 1 bit !
MOV A,P3 ; 08 Datenwert einholen (P3)
ANL A,#01h ; 09 alles wegschmeissen ausser dem Bit 0 (dem
datenbit)
MOV R3,A ; 10 Nutzbit nach Register 3 zwischenlagern
MOV A,R1 ; 11 bisher aufgelaufenes in den Akku laden
MOV A,R3 ; 12 (FEHLER IM ASSEMBLER-PROGRAMM)
RL A ; 13 schon mal vorsorglich in Bitposition 0 Platz
machen
MOV R1,A ; 14 das bis dahin schon aufgelaufene in R1
zwischenbunkern
Warte: ; 15 warten auf das nächste bit
jb P3.1,Warte ; 16 ist die 1 am Port3 bit 1 schon wieder runter?
wenn nicht dann warte
DJNZ R2,Start2 ; 17 jetzt ist endlich das vorherige bit fertig,
das nächste kann eingeholt werden
rr A ; 18 die letzte Rotaion aus Zeile 13 war zuviel,
halt wieder aufheben
MOV P0,A ; 19 das fertige Byte auf Port P0 ausgeben
sjmp Start ; 20 kurzer relativer Sprung zum Anfang des Elends
end ; alles hat ein Ende, auch dieses Programm ....
Programmzeile 12 ist wohl fehlerhaft.
wenn da irgendwas wäre der art: ORL A,R3 würde es Sinn machen:
verknüpfe den Inhalt von Register 3 (es ist eh nur dessen Bitposition 0
relevant) mit dem Akku
PS: Ich habe keine Ahnung welcher Prozessor das ist, aber der
Assemblercode ist doch selbserklärend ....