URL
https://opencores.org/ocsvn/test_project/test_project/trunk
Subversion Repositories test_project
[/] [test_project/] [trunk/] [sw/] [tick/] [tick.S] - Rev 52
Compare with Previous | Blame | View Log
#include "spr_defs.h".global _main/* Within the test we'll use following global variables:r16 interrupt counterr17 current tick timer comparison counterr18 sanity counterr19 loop counterr20 temp value of SR regr21 temp value of TTMR reg.r23 RAM_STARTr25-r31 used by int handlerThe test do the following:We set up the tick timer to trigger once and then we trigger interrupts incrementallyon every cycle in the specified test program; on interrupt handler we check if data computedso far exactly matches precalculated values. If interrupt has returned incorreclty, we candetect this using assertion routine at the end.*/#define RAM_START 0x00010000.section .vectors, "ax" // section begins at 0x200 so the handler is installed at 0x500 (0x200+0x300).org 0x300## Interrupt handler#l.addi r31,r3,0# get interrupted program pcl.mfspr r25,r0,SPR_EPCR_BASE# calculate instruction addressl.movhi r26,hi(_ie_start)l.ori r26,r26,lo(_ie_start)l.addi r3,r25,0 #print insn indexl.nop 2l.sub r25,r25,r26l.addi r3,r25,0 #print insn indexl.nop 2l.addi r3,r31,0 # restore r3l.sfeqi r25, 0x00l.bf _i00l.sfeqi r25, 0x04l.bf _i04l.sfeqi r25, 0x08l.bf _i08l.sfeqi r25, 0x0cl.bf _i0cl.sfeqi r25, 0x10l.bf _i10l.sfeqi r25, 0x14l.bf _i14l.sfeqi r25, 0x18l.bf _i18l.sfeqi r25, 0x1cl.bf _i1cl.sfeqi r25, 0x20l.bf _i20l.sfeqi r25, 0x24l.bf _i24l.sfeqi r25, 0x28l.bf _i28l.sfeqi r25, 0x2cl.bf _i2cl.sfeqi r25, 0x30l.bf _i30l.sfeqi r25, 0x34l.bf _i34l.sfeqi r25, 0x38l.bf _i38l.nop# value not defined_die:l.nop 2 #print r3l.addi r3,r0,0xeeeel.nop 2l.addi r3,r0,1l.jal _or32_exitl.nop1:l.j 1bl.nop.section .text_main:l.nopl.nop## set tick counter to initial 3 cycles#l.addi r16,r0,0l.addi r17,r0,1l.addi r18,r0,0l.addi r19,r0,0l.addi r22,r0,0l.movhi r23,hi(RAM_START)l.ori r23,r23,lo(RAM_START)## unmask all ints#l.movhi r5,0xffffl.ori r5,r5,0xffffl.mtspr r0,r5,SPR_PICMR # set PICMR# Set r20 to hold enable exceptions and interruptsl.mfspr r20,r0,SPR_SRl.ori r20,r20,SPR_SR_SM|SPR_SR_TEE|SPR_SR_F# Set r21 to hold value of TTMRl.movhi r5,hi(SPR_TTMR_SR | SPR_TTMR_IE)l.add r21,r5,r17## MAIN LOOP#_main_loop:# reinitialize memory and registersl.addi r3,r0,0xaaaal.addi r9,r0,0xbbbbl.sw 0(r23),r3l.sw 4(r23),r9l.sw 8(r23),r3# Reinitializes tick timerl.addi r17,r17,1l.mtspr r0,r0,SPR_TTCR # set TTCRl.mtspr r0,r21,SPR_TTMR # set TTMRl.mtspr r0,r0,SPR_TTCR # set TTCRl.addi r21,r21,1# Enable exceptions and interruptsl.mtspr r0,r20,SPR_SR # set SR##### TEST CODE #####_ie_start:l.movhi r3,0x1234 #00l.sw 0(r23),r3 #04l.movhi r3,hi(RAM_START) #08l.lwz r3,0(r3) #0cl.movhi r3,hi(RAM_START) #10l.addi r3,r3,4 #14l.j 1f #18l.lwz r3,0(r3) #1cl.addi r3,r3,1 #201:l.sfeqi r3,0xdead #24l.jal 2f #28l.addi r3,r0,0x5678 #2c_return_addr:2:l.bf _die #30l.sw 8(r23),r3 #34_ie_end:l.nop #38##### END OF TEST CODE ###### do some testingl.j _main_loopl.nop_i00:l.sfeqi r3,0xaaaal.bnf _diel.nopl.j _resumel.nop_i04:l.movhi r26,0x1234l.sfeq r3,r26l.bnf _diel.nopl.lwz r26,0(r23)l.sfeqi r26,0xaaaal.bnf _diel.nopl.j _resumel.nop_i08:l.movhi r26,0x1234l.sfeq r3,r26l.bnf _diel.nopl.lwz r27,0(r23)l.sfeq r27,r26l.bnf _diel.nopl.j _resumel.nop_i0c:l.sfeq r3,r23l.bnf _diel.nopl.j _resumel.nop_i10:l.movhi r26,0x1234l.sfeq r26,r3l.bnf _diel.nopl.j _resumel.nop_i14:l.sfeq r3,r23l.bnf _diel.nopl.j _resumel.nop_i18:l.addi r26,r23,4l.sfeq r3,r26l.bnf _diel.nopl.j _resumel.nop_i1c:l.j _diel.nop_i20:l.j _diel.nop_i24:l.mfspr r26,r0,SPR_ESR_BASEl.addi r30,r3,0l.addi r3,r26,0l.nop 2l.addi r3,r30,0l.andi r26,r26,SPR_SR_Fl.sfeq r26,r0l.bf _diel.nopl.sfeqi r3,0xbbbbl.bnf _diel.nopl.j _resumel.nop_i28:l.mfspr r26,r0,SPR_ESR_BASEl.addi r30,r3,0l.addi r3,r26,0l.nop 2l.addi r3,r30,0l.andi r26,r26,SPR_SR_Fl.sfeq r26,r0l.bnf _diel.nopl.sfeqi r22,1l.bf _resumel.addi r22,r0,1l.sfeqi r9,0xbbbbl.bnf _diel.nopl.j _resumel.nop_i2c:l.movhi r26,hi(_return_addr)l.ori r26,r26,lo(_return_addr)l.sfeq r9,r26l.bnf _diel.nopl.sfeqi r3,0xbbbbl.bnf _diel.nopl.j _resumel.nop_i30:l.sfeqi r3,0x5678l.bnf _diel.nopl.j _resumel.nop_i34:l.sfeqi r3,0x5678l.bnf _diel.nopl.lwz r26,8(r23)l.sfeqi r26,0xaaaal.bnf _diel.nopl.j _resumel.nop_i38:l.lwz r26,8(r23)l.sfeqi r26,0x5678l.bnf _diel.nop## mark finished ok#l.movhi r3,hi(0xdeaddead)l.ori r3,r3,lo(0xdeaddead)l.nop 2l.addi r3,r0,0l.jal _or32_exitl.nop_ok:l.j _okl.nop_resume:l.mfspr r27,r0,SPR_ESR_BASEl.addi r26,r0,SPR_SR_TEEl.addi r28,r0,-1l.xor r26,r26,r28l.and r26,r26,r27l.mtspr r0,r26,SPR_ESR_BASEl.rfel.addi r3,r3,5 # should not be executed
