Ich programmiere gerade AVR Controller mit FPC. Dort sind in einer Unit "ATmega328P" die Register des Controllers definiert. Zum Beispiel für die IO-Ports:
Code: Alles auswählen
// PORTB
PORTB : byte absolute $00+$25; // Port B Data Register
DDRB : byte absolute $00+$24; // Port B Data Direction Register
PINB : byte absolute $00+$23; // Port B Input Pins
// PORTC
PORTC : byte absolute $00+$28; // Port C Data Register
DDRC : byte absolute $00+$27; // Port C Data Direction Register
PINC : byte absolute $00+$26; // Port C Input Pins
// PORTD
PORTD : byte absolute $00+$2B; // Port D Data Register
DDRD : byte absolute $00+$2A; // Port D Data Direction Register
PIND : byte absolute $00+$29; // Port D Input Pins
Code: Alles auswählen
PORTD := PORTD or Ppwm1; // LED ein
PORTD := PORTD and (not Ppwm1); // LED aus
Code: Alles auswählen
#define DDR_LED DDRD // LED Test
#define PORT_LED PORTD
Code: Alles auswählen
PORT_LED := PORT_LED or Ppwm1; // LED ein
PORT_LED := PORT_LED and (not Ppwm1); // LED aus
Das Mappen wäre halt schön, weil dann Routinen wie Software-I2C oder Software-Uart einfach auf andere Ports portiert werden könnten ohne an jeder Stelle die Portnamen zu ändern. Im Assembler hat sich das bewährt.