52 lines
826 B
ArmAsm
52 lines
826 B
ArmAsm
.globl _start
|
|
#
|
|
# NOTE: Registers r10-r11 are reserved for the interrupt handler
|
|
# while the others can be used by the main loop/start code.
|
|
|
|
_start:
|
|
# patch the external interrupt handlers entry
|
|
add r1, r0, handler
|
|
ldw r2, @(r1, 0)
|
|
ldw r3, @(r1, 4)
|
|
add r1, r0, 0xfffff138
|
|
stw r2, @(r1, 0)
|
|
stw r3, @(r1, 4)
|
|
|
|
# enable external interrupts - cr0 == PSW
|
|
mvfsys r2, cr0
|
|
or r2, r0, 0x04000000
|
|
mvtsys cr0, r2
|
|
|
|
|
|
# wait for flag to be set
|
|
loop:
|
|
add r2, r0, flag
|
|
ldw r3, @(r2, 0)
|
|
bratzr r3, loop
|
|
|
|
# clear the flag
|
|
stw r0, @(r2, 0)
|
|
|
|
add r2, r0, tick
|
|
# putstr
|
|
.long 0x0e000001, 0x00f00000
|
|
|
|
bra loop
|
|
|
|
# finished
|
|
add r2, r0, r0 || nop
|
|
.long 0x0e000004, 0x00f00000
|
|
|
|
|
|
handler:
|
|
jmp real_handler
|
|
real_handler:
|
|
add r10, r0, 1
|
|
add r11, r0, flag
|
|
stb r10, @(r11,0)
|
|
reit
|
|
|
|
|
|
flag: .long 0
|
|
tick: .ascii "Tick\r\n"
|