I can give a statement-by-statement description. Whenever you see a LOAD statement (L), the loaded value goes into ACCU1, and the existing contents of ACCU1 move to ACCU2.
A #FEHLER - AND parameter #FEHLER (normally open contact)
R #FEHLER - RESET parameter #FEHLER (if above bit is ON, reset #FEHLER)
L #Adresse - LOAD parameter #Adresse into ACCU1
T #TEMP_PW_ADR - TRANSFER ACCU1 to parameter #TEMP_PW_ADR
L 256 - LOAD +256 into ACCU1
<I - TRUE if ACCU2 > ACCU1 (#Adresse > 256)
JC FEHL - JUMP to FEHL label if above is true
A L 1.0 AND bit L 1.0 (local bit address - look in block interface TEMP variables for where the bit is located)
JC FEHL - JUMP to FEHL label if above is true
-I - Integer SUBTRACT (ACCU2 - ACCU1 - store result in ACCU1)
SRW 1 - shift ACCU1 to the right 1 bit
L #Anzahl - LOAD parameter #Anzahl
+I - Integer ADD (ACCU2 + ACCU1 - store result in ACCU1)
L 128 - LOAD +128
>I - TRUE if ACCU2 > ACCU1 ((#Adresse - 256)/2) + #Anzahal > 128)
JC FEHL - JUMP to FEHL label if above is true
JU OK - unconditionally jump to OK
FEHL: AN #FEHLER - Label here is FEHL, AND NOT #FEHLER
S #FEHLER - SET #FEHLER bit if above is true
BEU - END THE BLOCK UNCONDITIONALLY
OK: NOP 0 - Label here is OK, NO OPERATION