Du point de vue du "kernel", c'est plutôt CALCULATOR qui est foireux, ça l'oblige à créer une variable en mémoire pour avoir un pointeur valide. Mais je suppose que c'est parce qu'il n'y a pas de cmp #imm,#imm ni de tst #imm et que l'utilisation habituelle de CALCULATOR est de le comparer avec une valeur fixe.
Du point de vue du C, ce sont les KEY_* qui sont foireux, parce que ce sont des valeurs relogées comme si c'étaient des adresses, du coup on est obligés de prendre l'adresse d'une "variable" dont l'"adresse" est en réalité une valeur.