# Copyright (c) 2002, Jason Riffel - TotalEmbedded LLC. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # Neither the name of TotalEmbedded nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # .text .align 2 .globl start .ent start start: .set noat # Use memory location 0xFF2FFFFC which lives in EJTAG dmseg as a push # pop stack. The EJTAG port will handle the magic. All we have to do # is write and read things ito this address in a LIFO format. This # way we can use the ONLY scratch register to hold the original value # of R15, load R15 with our push/pop stack address, and then we can # push any registers we so desire at the location pointed to by R15. # On exit we pop out everything from the EJTAG stack and restore R15 # from the scratch register. mtc0 $15, $31 lui $15, 0xFF2F ori $15, $15, 0xFFFC # Store R1 R2 R3 on the debug stack sw $1, ($15) sw $2, ($15) sw $3, ($15) # Load R1 with the address of the address register lui $1, 0xFF2F ori $1, 0xFE00 # Load R2 with the address for the write lw $2, ($1) # Move R1 to the data register addiu $1, $1, 0x04 # Load R3 with the data from @R1 lw $3, 0($1) # Store the half word at @R2 (the address) sh $3, ($2) # Pop our stored R1 R2 R3 in order lw $3, ($15) lw $2, ($15) lw $1, ($15) # Restore R15 from the scratch register mfc0 $15, $31 # !!! MUST USE BEQ TO RETURN !!! # This is because an absolute jump to 0xFF200200 will not be # encoded properly by the listing from the .S file. The assignment # of physical addresses is done by the linker which is never invoked. # Using of BEQ uses a relative address from the PC which is always # valid. Use a compare of R0 to R0 since its always 0 its always # equal. You must also insert NOP's because the assembler assumes # the valid usage of branch delay slots. The assembler will insert # the previous instruction AFTER the branch because at runtime the # processor uses delay slots (executes an instruction AFTER the branch # because of the pipeline). This doesn't happen in debug mode over # EJTAG so we must insert NOP's to fill the slot and make sure the # instructions are executed in the order we want. nop beq $0, $0, start .end start