Regarding registers:
A7 is the stack pointer (also referred to as SP), it cannot be used for anything else.
A6 is your library base pointer. You may use/change it in your routine if you don't need the library base, but it cannot be used for arguments.
A5 is used by the compiler as base for the local variables. You might get the compiler into deep trouble if you use it for function arguments. At least it adds some overhead.
A4 is used by the compiler as base for the global variables when the small data model is used. Same trouble as above. No issue with large data model.
D0, D1, A0 and A1 are scratch-registers. You may use/change them in your routine and don't need to preserve their values. With the exception of D0 which is used as return value. If your routine shall return something, move it into D0.
All other registers must be preserved. This does not mean you may not use them, you only have to restore their values before you leave your routine.
Finally a word about the "register" attribute. The way you use it creates unnecessary overhead.
The register attribute tells the compiler to reserve a register for that variable. In case of a function argument which already comes in a register, this means the compiler reserves an additional register for the variable and moves the argument register into the reserved register.
For example if you declare a function argument as register __D0, the compiler will reserve a free register, for example D2 and move D0 into it.
To avoid this overhead (and excessive register usage) I suggest to omit the word register and only use __Dx or __Ax.