BasCom Code


Prolog

Wie jeder Compiler generiert auch BasCom am Anfang einen sogenannten Programm-Prolog, wo grundsätzliche Register gesetzt werden
Abgesehen von der Interrupt-Vektortabelle generiert BasCom am Beginn des Programms folgenden Code (Die Werte beziehen sich auf ATMega32)

BasCom Report ( .RPT)

Stack start : 85F hex
Stack size : 20 hex
S-Stacksize : 8 hex
S-Stackstart : 840 hex
Framesize : 10 hex
Framestart : 82F hex

--------- Set & Disable Watchdog Timer --------
LDI r24, $1F Set Watchdog Parameter
OUT WDTCR, r24
LDI r24, $17 Disable
OUT WDTCR, r24

--------- Aufbau Stacks & Frame -----------------
LDI r24,$5F Stack Start LSB
OUT SPL,r24
LDI YL,$40 S-Stackstart LSB
LDI ZL,$38 S-Stackstart - S-Stacksize LSB
MOV r4,ZL R4 = Frameregister
LDI r24,$08 Stack Start MSB
OUT SPH,r24
LDI YH,$08 S-Stackstart MSB
LDI ZH,$08 Framestart MSB
MOV r5,ZH R4 = Frameregister
--------- Clear SRAM -------------------------------
LDI ZL,$FE length SRAM LSB
LDI ZH,$07 length SRAM MSB
LDI XL,$60 Base SRAM LSB
LDI XH,$00 Base SRAM MSB
CLR r24
Loop:
ST X++,r24 clear
SBIW ZL,$0001 zählen
BRNE Loop
--------- Set Baudrate --------------------------------
LDI r24,$33
OUT UBRRL,r24
LDI r24,$18
OUT UCSRB,r24
--------- Clear Special Bit-Register -------------------
CLR r6

Hier folgen dann weitere Festlegungen, die durch CONFIG etc. generiert werden

Unklar ist, wieso sich der effektive Code vom Report unterscheidet. Die Frameregister sollten eigentlich am unteren Ende des Frames stehen, das ja von unten nach oben benutzt wird. De facto muß man also die Framesize zum SW-Stack dazuzählen, um letztlich die gewünschte Größe zu haben