I'm used to both GNU and RISCOS assembler so the 0x and & are familiar to me. In fact as I'm trying to communicate between two Pis, one being bare metal and the other running RISCOS I have had to use both notations.
Ah. And RISC OS simplifies bare-metal development so much. The assembly language tools we have on RISC OS are so easy to deal with compared to the Unix styled tools of BSD and Linux.
As rpdom said, 0x8000 is being used as a starting point for a full descending stack to save off the atags temporarily while the zero page system vectors are set up and are then retrieved later on.
I could change the registers used in the zero page vector setup process so this temporary stack doesn't need to be used but I don't think the atags address in the register will be any different.
It should be fairly easy to get that far without using the stack, with no trouble at all. If you are not using the stack you have R0,R1, and R3 through R13 to work with, that is 13 registers, just save R14 to a register when making a call, and keep the calls only one level deep until everything is setup (or move down through the top 4 registers before each call, making a sort of register stack).
I would like to interpret the atags at some point but at present it's not vital.
I do not see why. Now all the information in the atags is provided by the mailbox interface from the GPU, and you already need to deal with the mailbox interfaces so why add code for atags?
My current issue is trying to create a bare metal SPI slave, data gets written into the TX FIFO and eventually fills it with no data being released on the wire to the master. The master is communicating and supplying both data and clock, which is read by the slave.
Yes, I am.