Advertisement
Guest User

Untitled

a guest
Mar 1st, 2018
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 3.04 KB | None | 0 0
  1.     ORG 0
  2. ivt_start:
  3.     b reset         ; RESET 0x00000000, Reset
  4.     b undef_short   ; UNDEF 0x00000004, Undefined Instruction
  5.     b swi_short     ; SWI   0x00000008, Software Interrupt
  6.     b pabt_short    ; PABT  0x0000000C, Prefetch Abort
  7.  
  8.     b dabt_short    ; DABT  0x00000010, Data Abort
  9.     b rsv_short     ; RSV   0x00000014, Reserved
  10.     b irq_short     ; IRQ   0x00000018, Interrupt Request
  11.     b fig_short     ; FIQ   0x0000001C, Fast Interrupt Request
  12.  
  13.     undef_isr_addr: dd hang
  14.     swi_isr_addr:   dd hang
  15.     pabt_isr_addr:  dd hang
  16.     dabt_isr_addr:  dd hang
  17.     rsv_isr_addr:   dd hang
  18.     irq_isr_addr:   dd irq_isr
  19.     fig_isr_addr:   dd hang
  20.  
  21. undef_short:
  22.     mov r0, 0x10000
  23.     ldr r1, [undef_isr_addr]
  24.     add r1, r0
  25.     mov pc, r1
  26. swi_short:
  27.     mov r0, 0x10000
  28.     ldr r1, [swi_isr_addr]
  29.     add r1, r0
  30.     mov pc, r1
  31. pabt_short:
  32.     mov r0, 0x10000
  33.     ldr r1, [pabt_isr_addr]
  34.     add r1, r0
  35.     mov pc, r1
  36. dabt_short:
  37.     mov r0, 0x10000
  38.     ldr r1, [dabt_isr_addr]
  39.     add r1, r0
  40.     mov pc, r1
  41. rsv_short:
  42.     mov r0, 0x10000
  43.     ldr r1, [rsv_isr_addr]
  44.     add r1, r0
  45.     mov pc, r1    
  46. irq_short:          
  47.     mov r0, 0x10000
  48.     ldr r1, [irq_isr_addr]
  49.     add r1, r0
  50.     mov pc, r1
  51. fig_short:
  52.     mov r0, 0x10000
  53.     ldr r1, [fig_isr_addr]
  54.     add r1, r0
  55.     mov pc, r1
  56. ivt_end:
  57.     ;***************
  58.     ;* Timer MMIO  *
  59.     ;***************      
  60.     TIMER_CVR    EQU 0x04 ; Current Value Register, TimerXValue
  61.     TIMER_CR     EQU 0x08 ; Control Register, TimerXControl
  62.     TIMER_INTCLR EQU 0x0C ; Interrupt Clear Register, TimerXIntClr
  63.     TIMER_BGLOAD EQU 0x18 ; Background Load Register
  64.     ;*************
  65.     ;* Uart MMIO *
  66.     ;*************
  67.     UART_CR      EQU 0x30 ; Control Register
  68.     UART_ICR     EQU 0x44 ; Interrupt Clear Register
  69.     UART_FR      EQU 0x18 ; Flag Register
  70.     UART_IMSC    EQU 0x38 ; Interrupt Mask Register
  71.     UART_ICR     EQU 0x44 ; Interrupt Clear Register
  72.  
  73. ;*********************************
  74. ;* IRQ Interrupt Service Routine *
  75. ;*********************************    
  76. irq_isr:
  77.     push {r0-r12, r14}
  78.     ldr r0, [VIC_IRQSTATUS]
  79.     ldr r1, [r0]
  80.     ; Timer0 IRQ Source Check
  81.     ands r1, #0x10
  82.     bne irq_isr_timer
  83.     ldr r1, [r0]
  84.     ; UART IRQ Source Check
  85.     ands r1, #0x1000
  86.     bne irq_isr_uart
  87.     b done
  88. UART_CHAR_RX dw 0
  89. irq_isr_uart:
  90.     ldr r0, [UART_BASE]
  91.     ldr r1, [r0]
  92.     str r1, [UART_CHAR_RX]
  93.     bl uart_put32
  94.  
  95.     ldr r0, [UART_BASE]
  96.     mov r1, #0x10
  97. ; Reseting the IRQ source (?) fucks up the futher Rx?
  98. ;    str r1, [r0, UART_ICR]
  99.  
  100.     pop {r0-r12, r14}
  101.     subs pc, r14, #4
  102. irq_isr_timer:
  103. ; Any write to INTCLR clears the timer interrupt.
  104.     ldr r0, [TIMER_BASE]
  105.     str r1, [r0, TIMER_INTCLR]
  106. done:
  107.     pop {r0-r12, r14}
  108.     subs pc, r14, #4
  109.  
  110. reset:
  111.     mov sp, #0x20000
  112.     mov r0, #0x10000
  113.     mov r1, #0
  114.     mov r10, ivt_end - ivt_start
  115.     lsr r10, #3
  116. relocate:
  117.     ldmia r0!, {r2, r3, r4, r5, r6, r7, r8, r9}
  118.     stmia r1!, {r2, r3, r4, r5, r6, r7, r8, r9}
  119.     subs r10, #1
  120.     bne relocate
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement