Die Lösung ist recht einfach.

Der SJA1000 hat ja etliche Register die angesprochen werden können (Konfiguration und Transfer).
Damit man Pinne spart ist dieser einen kombinierten Adress/Datenbus (D0-D7 plus Steuerleitungen (7 Stück)) so das nur 15 Leitungen für die komplette Steuerung nötig sind.
Der Rest ist beim SJA ja nur der CAN zum Transreciver und die Versorgungsleitungen sowie der Takt (Quarz).

Der Mega 8515 im Beispiel hat selber auch einen Externen Bus und der Author hat den SJA einfach an den Bus des Atmel gehangen (Steht aber auch groß im Quellcode ganz oben welche Leítung wohin gewandert ist) wobei sich durch die gewählte Verdrahtung die Basisadresse 4000h ergibt.

Die Einzelnen Adressen für die Funktionen sind dann als Constanten definiert (Direkt darunter "Const Can_ctrl = &H4000" bis "Const Can_clkdiv = &H401F") so das man die einzelenen Funktionen bzw. die Puffer direkt über ihren Namen ansprechen kann.

Ist das denn so schwer abzulesen ? (OK,du bist Anfänger wie du sagst da kann man jetzt keine größeren Masstäbe anlegen)
Für mich ist das nach 2 Minuten Studieren eigentlich ein sehr einfaches Beispiel gewesen bis auf den Umstand das der eigentliche Code etwas Spagettihaft geraten ist (Sprichwörtlich ohne Punkt und Komma)

Versuch einfach mal im Code dieeinzelnene Funktionsblöcke etwas räumlich zu trennen (Leerzeilen.Einrücken von Schleifen usw.) dann ergibt sich eine bessere Übersicht .