program testme3;
{$mode objfpc}{$bitpacking on}{$packset 1}{$packenum 1}{$modeswitch typehelpers}
{.$define ADCSRA_REAL} //define for real processor
{$I-}
type
TADCSRA_pins = (ADPS0, ADPS1, ADPS2, ADIE, ADIF, ADATE, ADSC, ADEN);
TADCSRA_set = bitpacked set of TADCSRA_pins;
TADCSRA_range = ADPS0..ADEN;
TADCSRA_sethelper = type helper for TADCSRA_set
procedure PinHi(const pin:TADCSRA_pins);inline;
procedure PinLo(const pin:TADCSRA_pins);inline;
procedure Toggle(const pin:TADCSRA_pins);inline;
function IsOn(const pin:TADCSRA_pins):Boolean;inline;
function IsOff(const pin:TADCSRA_pins):Boolean;inline;
function AsByte:Byte;inline;
function AsString:string;
function AsBin:string;
end;
procedure TADCSRA_sethelper.PinHi(const pin:TADCSRA_pins);inline;
begin
include(self,pin);
end;
procedure TADCSRA_sethelper.PinLo(const pin:TADCSRA_pins);inline;
begin
exclude(self,pin);
end;
procedure TADCSRA_sethelper.Toggle(const pin:TADCSRA_pins);inline;
begin
//if pin in self then exclude(self,pin) else include(self,pin);
self := self >< [pin] //same as above but more fun for noobs <sadistic grin>
end;
function TADCSRA_sethelper.IsOn(const pin:TADCSRA_pins):Boolean;inline;
begin
Result := pin in self;
end;
function TADCSRA_sethelper.IsOff(const pin:TADCSRA_pins):Boolean;inline;
begin
Result := not (pin in self);
end;
function TADCSRA_sethelper.AsByte:byte;inline;
begin
result := byte(self);
end;
function BitAsString(pin:TADCSRA_pins):string;
begin
writestr(result,pin:6);
end;
function TADCSRA_sethelper.AsString:string;
var
t:TADCSRA_pins;
begin
result :='';
for t in self do
result+=BitAsString(t);
end;
function TADCSRA_sethelper.AsBin:string;
begin
Result :=Binstr(byte(self),8);
end;
/////////////////////////////////////////////////
// example code
/////////////////////////////////////////////////
const
TADCSRA = $7A;
var
ADCSRA:TADCSRA_set {$ifdef ADCSRA_REAL}absolute TADCSRA{$else}=[]{$endif};
begin
writeln(ADCSRA.IsOn(ADPS0));
writeln(ADCSRA.AsString);
ADCSRA.PinHi(ADPS0);
writeln(ADCSRA.IsOff(ADPS0));
writeln(ADCSRA.AsString);
ADCSRA.PinHi(ADPS1);
writeln(ADCSRA.AsString);
ADCSRA.PinHi(ADPS2);
writeln(ADCSRA.AsString);
ADCSRA.PinHi(ADIE);
writeln(ADCSRA.AsString);
writeln(ADCSRA.AsBin);
ADCSRA.PinHi(ADIF);
writeln(ADCSRA.AsString);
ADCSRA.PinHi(ADATE);
writeln(ADCSRA.AsString);
ADCSRA.PinHi(ADSC);
writeln(ADCSRA.AsString);
ADCSRA.PinHi(ADEN);
writeln(ADCSRA.AsBin);
writeln(ADCSRA.AsString);
ADCSRA.PinLo(ADPS0);
writeln(ADCSRA.AsString);
ADCSRA.PinLo(ADPS1);
writeln(ADCSRA.AsString);
writeln(ADCSRA.AsBin);
ADCSRA.PinLo(ADPS2);
writeln(ADCSRA.AsString);
ADCSRA.PinLo(ADIE);
writeln(ADCSRA.AsString);
ADCSRA.PinLo(ADIF);
writeln(ADCSRA.AsString);
ADCSRA.PinLo(ADATE);
writeln(ADCSRA.AsString);
ADCSRA.PinLo(ADSC);
writeln(ADCSRA.AsString);
ADCSRA.PinLo(ADEN);
writeln(ADCSRA.AsString);
writeln(ADCSRA.AsBin);
ADCSRA.Toggle(ADIE);
writeln(ADCSRA.IsOn(ADIE));
ADCSRA.Toggle(ADIE);
writeln(ADCSRA.IsOn(ADIE));
ADCSRA.Toggle(ADIE);
writeln(ADCSRA.IsOn(ADIE));
ADCSRA.Toggle(ADIE);
writeln(ADCSRA.IsOn(ADIE));
end.