Files
lt16lab/programs/dmem_test.prog
Thomas Fehmel 657a54ba18 Initial Commit
2016-10-18 14:21:45 +02:00

166 lines
2.3 KiB
Plaintext

//big endian data memory test
//after the initialization, should the LED become a value differnt from 0, an error occured
reset:
br always >main
nop
hardfault:
reti
nop
memfault:
reti
nop
.align
pointer:
.word =constants
constants:
.word 256
.word 0x00010203
.word 0x04040404
.word 0x000000FF
main:
clr r10
call_1:
clr r0 //error msg / state
call always >echo_error
nop
ldr r11,>pointer
ld32 r1,r11 //DMEM addr
addi r11,4
ld32 r2,r11
addi r11,4
ld32 r3,r11 //increment
addi r11,4
ld32 r8,r11 //mask
addi r11,-12
//test 1: store 32 bit, load bytes
test1:
mov r4,r2
st32 r1,r4
addi r1,3 //check the LSB first
ld08 r6,r1 //r6: loaded value
and r5,r4,r8 //r5: masked constant
cmp neq r5,r6
call true >echo_error
addi r10,1
addi r1,-1
rsh r4,r4,8
ld08 r6,r1 //r6: loaded value
and r5,r4,r8 //r5: masked constant
cmp neq r5,r6
call true >echo_error
addi r10,1
addi r1,-1
rsh r4,r4,8
ld08 r6,r1 //r6: loaded value
and r5,r4,r8 //r5: masked constant
cmp neq r5,r6
call true >echo_error
addi r10,1
addi r1,-1
rsh r4,r4,8
ld08 r6,r1 //r6: loaded value
and r5,r4,r8 //r5: masked constant
cmp neq r5,r6
call true >echo_error
addi r10,1
//test 1 end
add r2,r2,r3
addi r1,4
//test 2: store bytes, load word
test2:
mov r4,r2
addi r1,3
st08 r1,r4
rsh r4,r4,8
addi r1,-1
st08 r1,r4
rsh r4,r4,8
addi r1,-1
st08 r1,r4
rsh r4,r4,8
addi r1,-1
st08 r1,r4
rsh r4,r4,8
ld32 r6,r1
cmp neq r6,r2
call true >echo_error
addi r10,1
ldr r9,>LEDaddr
st08 r9,r8
//test 3
// prewrite memory with value==baseaddress+offset,
// load 32 bit values and check if correct
test3:
ld32 r1,r11 //DMEM base address
add r8,r1,r1 //out-of-range address, incidentally equals baseaddress*2 since baseaddress==length
clr r2
test3_prewrite_mem_loop:
st08 r1,r2
addi r1,1
cmp neq r1,r8
br true >test3_prewrite_mem_loop
addi r2,1
ld32 r1,r11 //DMEM addr
addi r11,4
ld32 r2,r11 //CMP value
addi r11,4
ld32 r3,r11 //increment
addi r11,-8
add r8,r1,r1 //out-of-range address, incidentally equals baseaddress*2 since baseaddress==length
test3_loop:
ld32 r4,r1
cmp neq r4,r2
call true >echo_error
addi r0,1
addi r1,4
add r2,r2,r3
cmp neq r1,r8
br true >test3_loop
nop
//end test3
end:
nop
br >end
nop
.align
LEDaddr:
.word 0x000F0000
//expects an error code in r0
echo_error:
nop
ldr r9,>LEDaddr
st08 r9,r0
ret
nop