Ok. Doczytałem i rzeczywiście nie muszą być zerowane. Akcję wywołuje sama operacja zapisu jakiejś wartości więc masz rację, że outclr też mogłoby mieć 0xFF jeśli to wpisałeś. Z drugiej strony to bez większego znaczenia, bo jeśli chcesz jakiś pin wyzerować i tak umieszczasz 1 na odpowiednim polu w outclr i reszta pól cię w tym momencie nie obchodzi. A, że rejestr zapisujesz całym bajtem, a nie manipulujesz bitowo (bo po to właśnie jest to rozbicie na 3) to pozwala prosto zapalać, gasić i zamieniać te bity, które chcemy bez ruszania pozostałych. Po operacji zawartość tego rejestru jest bez znaczenia, bo i tak potrzebujesz znów go na nowo zapisać żeby zadziałał.
edit: nie ma to jak pomroczność jasna... w dokumentacji jak byk stoi
Cytat: Reading the SET or CLR registers returns the value of the main register.
Czyli zapisując outset/outclr wklepujesz dane rzeczywiście do tych rejestrów (a ich zapis jednocześnie wywołuje reakcję na out). Czytając - otrzymujesz wartość rejestru out. Czyli po operacji porta.outclr=0xff i odczytaniu outclr otrzymujesz prawidłowo 0x00, to samo powinieneś otrzymać czytając w tym momencie outset. Z kolei po zapisie porta.outset=0xff i odczycie rejestrów outset i outclr powinieneś otrzymać 0xff.