Files
lt16lab/programs/scrolling.prog
2022-11-20 17:48:42 +01:00

329 lines
4.6 KiB
Plaintext

reset:
br always >main
nop
hardfault:
reti
nop
memfault:
reti
nop
.align
scrolling_addr: .word 0x000F00A0
scrolling_count_addr: .word 0x000F00A4
// scrolling_cnt_value: .word 0x0FC000 // for real board
scrolling_cnt_value: .word 0x100 // for simulation
// w_cnt_top: .word 0xFFC000 // for real board
w_cnt_top: .word 0x3000 //for simulation
write_mask:
.word 0x1000000
clear_mask:
.word 0x100
main:
ldr r8, >w_cnt_top
ldr r0, >scrolling_addr
ldr r1, >write_mask
ldr r2, >clear_mask
number_loop:
// Set scrolling speed
ldr r5, >scrolling_count_addr
ldr r7, >scrolling_cnt_value
st32 r5, r7
// --------- 132457689BACDFE0 ---------
clr r4
addi r4, 0x1
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0x3
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0x2
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0x4
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0x5
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0x7
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0x6
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0x8
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0x9
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0xB
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0xA
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0xC
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0xD
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0xF
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0xE
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0x0
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
// Turn on
clr r4
addi r4, 0x1
st32 r0, r4
call >wait
nop
// Turn off
clr r4
addi r4, 0x1
st32 r0, r4
// Double scrolling speed
ldr r5, >scrolling_count_addr
ldr r7, >scrolling_cnt_value
rsh r7, r7, 1 // Divide by 2
st32 r5, r7
// Clear
clr r4
or r4, r4, r2
st32 r0, r4
// --------- DEAD BEEF ---------
clr r4
addi r4, 0xD
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0xE
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0xA
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0xD
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0x10
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0xB
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0xE
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0xE
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0xF
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
// Turn on
clr r4
addi r4, 0x1
st32 r0, r4
call >wait
nop
// Turn off
clr r4
addi r4, 0x1
st32 r0, r4
// Clear
clr r4
or r4, r4, r2
st32 r0, r4
// --------- 1 ---------
clr r4
addi r4, 0x1
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
// Turn on
clr r4
addi r4, 0x1
st32 r0, r4
call >wait
nop
// Turn off
clr r4
addi r4, 0x1
st32 r0, r4
// Clear
clr r4
or r4, r4, r2
st32 r0, r4
// --------- 2 3 ---------
clr r4
addi r4, 0x2
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0x3
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
// Turn on
clr r4
addi r4, 0x1
st32 r0, r4
call >wait
nop
// Turn off
clr r4
addi r4, 0x1
st32 r0, r4
// Clear
clr r4
or r4, r4, r2
st32 r0, r4
// --------- 0 0 0 0 0 ---------
clr r4
addi r4, 0x0
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0x0
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
clr r4
addi r4, 0x0
lsh r4, r4, 16
or r4, r4, r1
st32 r0, r4
// Turn on
clr r4
addi r4, 0x1
st32 r0, r4
call >wait
nop
br always >reset
nop
//subroutine to iterate until counter overflow
wait:
clr r7 //inititalize inner counter
inc_i:
cmp neq r7,r8
br true >inc_i //if i=cnt_top
addi r7,1
ret //else
nop