OpenCores
URL https://opencores.org/ocsvn/openmsp430/openmsp430/trunk

Subversion Repositories openmsp430

[/] [openmsp430/] [trunk/] [core/] [sim/] [rtl_sim/] [src/] [gpio_irq.s43] - Diff between revs 111 and 141

Only display areas with differences | Details | Blame | View Log

Rev 111 Rev 141
/*===========================================================================*/
/*===========================================================================*/
/* Copyright (C) 2001 Authors                                                */
/* Copyright (C) 2001 Authors                                                */
/*                                                                           */
/*                                                                           */
/* This source file may be used and distributed without restriction provided */
/* This source file may be used and distributed without restriction provided */
/* that this copyright statement is not removed from the file and that any   */
/* that this copyright statement is not removed from the file and that any   */
/* derivative work contains the original copyright notice and the associated */
/* derivative work contains the original copyright notice and the associated */
/* disclaimer.                                                               */
/* disclaimer.                                                               */
/*                                                                           */
/*                                                                           */
/* This source file is free software; you can redistribute it and/or modify  */
/* This source file is free software; you can redistribute it and/or modify  */
/* it under the terms of the GNU Lesser General Public License as published  */
/* it under the terms of the GNU Lesser General Public License as published  */
/* by the Free Software Foundation; either version 2.1 of the License, or    */
/* by the Free Software Foundation; either version 2.1 of the License, or    */
/* (at your option) any later version.                                       */
/* (at your option) any later version.                                       */
/*                                                                           */
/*                                                                           */
/* This source is distributed in the hope that it will be useful, but WITHOUT*/
/* This source is distributed in the hope that it will be useful, but WITHOUT*/
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or     */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or     */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public       */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public       */
/* License for more details.                                                 */
/* License for more details.                                                 */
/*                                                                           */
/*                                                                           */
/* You should have received a copy of the GNU Lesser General Public License  */
/* You should have received a copy of the GNU Lesser General Public License  */
/* along with this source; if not, write to the Free Software Foundation,    */
/* along with this source; if not, write to the Free Software Foundation,    */
/* Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA        */
/* Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA        */
/*                                                                           */
/*                                                                           */
/*===========================================================================*/
/*===========================================================================*/
/*                            DIGITAL I/O                                    */
/*                            DIGITAL I/O                                    */
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* Test the Digital I/O interface:                                           */
/* Test the Digital I/O interface:                                           */
/*                                   - Interrupts.                           */
/*                                   - Interrupts.                           */
/*                                                                           */
/*                                                                           */
/* Author(s):                                                                */
/* Author(s):                                                                */
/*             - Olivier Girard,    olgirard@gmail.com                       */
/*             - Olivier Girard,    olgirard@gmail.com                       */
/*                                                                           */
/*                                                                           */
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* $Rev: 111 $                                                                */
/* $Rev: 141 $                                                                */
/* $LastChangedBy: olivier.girard $                                          */
/* $LastChangedBy: olivier.girard $                                          */
/* $LastChangedDate: 2011-05-20 22:39:02 +0200 (Fri, 20 May 2011) $          */
/* $LastChangedDate: 2012-05-05 23:22:06 +0200 (Sat, 05 May 2012) $          */
/*===========================================================================*/
/*===========================================================================*/
 
 
.global main
.include "pmem_defs.asm"
 
 
.set   DMEM_BASE, (__data_start     )
 
.set   DMEM_200,  (__data_start+0x00)
 
.set   DMEM_208,  (__data_start+0x08)
 
.set   DMEM_210,  (__data_start+0x10)
 
.set   DMEM_218,  (__data_start+0x18)
 
.set   DMEM_220,  (__data_start+0x20)
 
.set   DMEM_228,  (__data_start+0x28)
 
.set   DMEM_230,  (__data_start+0x30)
 
.set   DMEM_238,  (__data_start+0x38)
 
.set   DMEM_240,  (__data_start+0x40)
 
.set   DMEM_248,  (__data_start+0x48)
 
.set   DMEM_250,  (__data_start+0x50)
 
.set   DMEM_258,  (__data_start+0x58)
 
.set   DMEM_260,  (__data_start+0x60)
 
 
 
.set   P1IN,  0x0020
.global main
.set   P1OUT, 0x0021
 
.set   P1DIR, 0x0022
 
.set   P1IFG, 0x0023
 
.set   P1IES, 0x0024
 
.set   P1IE,  0x0025
 
.set   P1SEL, 0x0026
 
.set   P2IN,  0x0028
 
.set   P2OUT, 0x0029
 
.set   P2DIR, 0x002A
 
.set   P2IFG, 0x002B
 
.set   P2IES, 0x002C
 
.set   P2IE,  0x002D
 
.set   P2SEL, 0x002E
 
 
 
main:
main:
        ; Disable interrupts
        ; Disable interrupts
        dint
        dint
        mov.b #0x00, &P1IE
        mov.b #0x00, &P1IE
        mov.b #0x00, &P2IE
        mov.b #0x00, &P2IE
        /* -------------- PORT 1: TEST INTERRUPT FLAGS  --------------- */
        /* -------------- PORT 1: TEST INTERRUPT FLAGS  --------------- */
        mov.b   #0x00, &P1IES       ;# TEST IF RISING EDGE ENABLED
        mov.b   #0x00, &P1IES       ;# TEST IF RISING EDGE ENABLED
        mov     #DMEM_200, r15        ;# Make sure rising edge is detected test 1
        mov     #DMEM_200, r15        ;# Make sure rising edge is detected test 1
p1ifg_re_loop1:
p1ifg_re_loop1:
        nop
        nop
        nop
        nop
        mov.b &P1IFG,  0(r15)
        mov.b &P1IFG,  0(r15)
        mov.b   #0x00, &P1IFG
        mov.b   #0x00, &P1IFG
        inc      r15
        inc      r15
        cmp     #DMEM_208, r15
        cmp     #DMEM_208, r15
        jne     p1ifg_re_loop1
        jne     p1ifg_re_loop1
        mov     #DMEM_210, r15        ;# Make sure falling edge is ignored
        mov     #DMEM_210, r15        ;# Make sure falling edge is ignored
p1ifg_fe_loop1:
p1ifg_fe_loop1:
        nop
        nop
        nop
        nop
        mov.b &P1IFG,  0(r15)
        mov.b &P1IFG,  0(r15)
        mov.b   #0x00, &P1IFG
        mov.b   #0x00, &P1IFG
        inc      r15
        inc      r15
        cmp     #DMEM_218, r15
        cmp     #DMEM_218, r15
        jne     p1ifg_fe_loop1
        jne     p1ifg_fe_loop1
        mov     #DMEM_220, r15        ;# Make sure rising edge is detected test 2
        mov     #DMEM_220, r15        ;# Make sure rising edge is detected test 2
p1ifg_re_loop2:
p1ifg_re_loop2:
        nop
        nop
        nop
        nop
        mov.b &P1IFG,  0(r15)
        mov.b &P1IFG,  0(r15)
        inc      r15
        inc      r15
        cmp     #DMEM_228, r15
        cmp     #DMEM_228, r15
        jne     p1ifg_re_loop2
        jne     p1ifg_re_loop2
        mov.b   #0x00, &P1IFG
        mov.b   #0x00, &P1IFG
        mov.b   #0xff, &P1IES       ;# TEST IF FALLING EDGE ENABLED
        mov.b   #0xff, &P1IES       ;# TEST IF FALLING EDGE ENABLED
        mov     #DMEM_230, r15        ;# Make sure falling edge is detected test 1
        mov     #DMEM_230, r15        ;# Make sure falling edge is detected test 1
p1ifg_fe_loop2:
p1ifg_fe_loop2:
        nop
        nop
        nop
        nop
        mov.b &P1IFG,  0(r15)
        mov.b &P1IFG,  0(r15)
        mov.b   #0x00, &P1IFG
        mov.b   #0x00, &P1IFG
        inc      r15
        inc      r15
        cmp     #DMEM_238, r15
        cmp     #DMEM_238, r15
        jne     p1ifg_fe_loop2
        jne     p1ifg_fe_loop2
        mov     #DMEM_240, r15        ;# Make sure rising edge is ignored
        mov     #DMEM_240, r15        ;# Make sure rising edge is ignored
p1ifg_re_loop3:
p1ifg_re_loop3:
        nop
        nop
        nop
        nop
        mov.b &P1IFG,  0(r15)
        mov.b &P1IFG,  0(r15)
        mov.b   #0x00, &P1IFG
        mov.b   #0x00, &P1IFG
        inc      r15
        inc      r15
        cmp     #DMEM_248, r15
        cmp     #DMEM_248, r15
        jne     p1ifg_re_loop3
        jne     p1ifg_re_loop3
        mov     #DMEM_250, r15        ;# Make sure falling edge is detected test 2
        mov     #DMEM_250, r15        ;# Make sure falling edge is detected test 2
p1ifg_fe_loop3:
p1ifg_fe_loop3:
        nop
        nop
        nop
        nop
        mov.b &P1IFG,  0(r15)
        mov.b &P1IFG,  0(r15)
        inc      r15
        inc      r15
        cmp     #DMEM_258, r15
        cmp     #DMEM_258, r15
        jne     p1ifg_fe_loop3
        jne     p1ifg_fe_loop3
        mov.b   #0x00, &P1IFG
        mov.b   #0x00, &P1IFG
        /* -------------- PORT 2: TEST INTERRUPT FLAGS  --------------- */
        /* -------------- PORT 2: TEST INTERRUPT FLAGS  --------------- */
        mov.b   #0x00, &P2IES       ;# TEST IF RISING EDGE ENABLED
        mov.b   #0x00, &P2IES       ;# TEST IF RISING EDGE ENABLED
        mov     #DMEM_200, r15        ;# Make sure rising edge is detected test 1
        mov     #DMEM_200, r15        ;# Make sure rising edge is detected test 1
p2ifg_re_loop1:
p2ifg_re_loop1:
        nop
        nop
        nop
        nop
        mov.b &P2IFG,  0(r15)
        mov.b &P2IFG,  0(r15)
        mov.b   #0x00, &P2IFG
        mov.b   #0x00, &P2IFG
        inc      r15
        inc      r15
        cmp     #DMEM_208, r15
        cmp     #DMEM_208, r15
        jne     p2ifg_re_loop1
        jne     p2ifg_re_loop1
        mov     #DMEM_210, r15        ;# Make sure falling edge is ignored
        mov     #DMEM_210, r15        ;# Make sure falling edge is ignored
p2ifg_fe_loop1:
p2ifg_fe_loop1:
        nop
        nop
        nop
        nop
        mov.b &P2IFG,  0(r15)
        mov.b &P2IFG,  0(r15)
        mov.b   #0x00, &P2IFG
        mov.b   #0x00, &P2IFG
        inc      r15
        inc      r15
        cmp     #DMEM_218, r15
        cmp     #DMEM_218, r15
        jne     p2ifg_fe_loop1
        jne     p2ifg_fe_loop1
        mov     #DMEM_220, r15        ;# Make sure rising edge is detected test 2
        mov     #DMEM_220, r15        ;# Make sure rising edge is detected test 2
p2ifg_re_loop2:
p2ifg_re_loop2:
        nop
        nop
        nop
        nop
        mov.b &P2IFG,  0(r15)
        mov.b &P2IFG,  0(r15)
        inc      r15
        inc      r15
        cmp     #DMEM_228, r15
        cmp     #DMEM_228, r15
        jne     p2ifg_re_loop2
        jne     p2ifg_re_loop2
        mov.b   #0x00, &P2IFG
        mov.b   #0x00, &P2IFG
        mov.b   #0xff, &P2IES       ;# TEST IF FALLING EDGE ENABLED
        mov.b   #0xff, &P2IES       ;# TEST IF FALLING EDGE ENABLED
        mov     #DMEM_230, r15        ;# Make sure falling edge is detected test 1
        mov     #DMEM_230, r15        ;# Make sure falling edge is detected test 1
p2ifg_fe_loop2:
p2ifg_fe_loop2:
        nop
        nop
        nop
        nop
        mov.b &P2IFG,  0(r15)
        mov.b &P2IFG,  0(r15)
        mov.b   #0x00, &P2IFG
        mov.b   #0x00, &P2IFG
        inc      r15
        inc      r15
        cmp     #DMEM_238, r15
        cmp     #DMEM_238, r15
        jne     p2ifg_fe_loop2
        jne     p2ifg_fe_loop2
        mov     #DMEM_240, r15        ;# Make sure rising edge is ignored
        mov     #DMEM_240, r15        ;# Make sure rising edge is ignored
p2ifg_re_loop3:
p2ifg_re_loop3:
        nop
        nop
        nop
        nop
        mov.b &P2IFG,  0(r15)
        mov.b &P2IFG,  0(r15)
        mov.b   #0x00, &P2IFG
        mov.b   #0x00, &P2IFG
        inc      r15
        inc      r15
        cmp     #DMEM_248, r15
        cmp     #DMEM_248, r15
        jne     p2ifg_re_loop3
        jne     p2ifg_re_loop3
        mov     #DMEM_250, r15        ;# Make sure falling edge is detected test 2
        mov     #DMEM_250, r15        ;# Make sure falling edge is detected test 2
p2ifg_fe_loop3:
p2ifg_fe_loop3:
        nop
        nop
        nop
        nop
        mov.b &P2IFG,  0(r15)
        mov.b &P2IFG,  0(r15)
        inc      r15
        inc      r15
        cmp     #DMEM_258, r15
        cmp     #DMEM_258, r15
        jne     p2ifg_fe_loop3
        jne     p2ifg_fe_loop3
        mov.b   #0x00, &P2IFG
        mov.b   #0x00, &P2IFG
        /* --------------            CLEAR MEMORY        --------------- */
        /* --------------            CLEAR MEMORY        --------------- */
        mov     #DMEM_200, r5
        mov     #DMEM_200, r5
mem_clear_loop:
mem_clear_loop:
        mov     #0x00,  0(r5)
        mov     #0x00,  0(r5)
        incd      r5
        incd      r5
        cmp     #DMEM_260, r5
        cmp     #DMEM_260, r5
        jne     mem_clear_loop
        jne     mem_clear_loop
        /* -------------- PORT 1: TEST INTERRUPT VECTOR  --------------- */
        /* -------------- PORT 1: TEST INTERRUPT VECTOR  --------------- */
        mov     #DMEM_250, r1     ; Initialize stack
        mov     #DMEM_250, r1     ; Initialize stack
        eint                    ; Enable interrupts
        eint                    ; Enable interrupts
        mov.b   #0x0001, r6
        mov.b   #0x0001, r6
        mov.b        r6, &P1IE
        mov.b        r6, &P1IE
        mov     #DMEM_200, r15;
        mov     #DMEM_200, r15;
p1_irq_loop:
p1_irq_loop:
        mov.b        r6, &P1IFG ; Generate soft interrupt
        mov.b        r6, &P1IFG ; Generate soft interrupt
        nop
        nop
        nop
        nop
        nop
        nop
        rla          r6
        rla          r6
        mov.b        r6, &P1IE
        mov.b        r6, &P1IE
        inc         r15
        inc         r15
        cmp     #DMEM_208, r15
        cmp     #DMEM_208, r15
        jne     p1_irq_loop
        jne     p1_irq_loop
        /* -------------- PORT 2: TEST INTERRUPT VECTOR  --------------- */
        /* -------------- PORT 2: TEST INTERRUPT VECTOR  --------------- */
        mov     #DMEM_250, r1     ; Initialize stack
        mov     #DMEM_250, r1     ; Initialize stack
        eint                    ; Enable interrupts
        eint                    ; Enable interrupts
        mov.b   #0x0001, r6
        mov.b   #0x0001, r6
        mov.b        r6, &P2IE
        mov.b        r6, &P2IE
        mov     #DMEM_210, r15;
        mov     #DMEM_210, r15;
p2_irq_loop:
p2_irq_loop:
        mov.b        r6, &P2IFG ; Generate soft interrupt
        mov.b        r6, &P2IFG ; Generate soft interrupt
        nop
        nop
        nop
        nop
        nop
        nop
        rla          r6
        rla          r6
        mov.b        r6, &P2IE
        mov.b        r6, &P2IE
        inc         r15
        inc         r15
        cmp     #DMEM_218, r15
        cmp     #DMEM_218, r15
        jne     p2_irq_loop
        jne     p2_irq_loop
        /* ----------------------         END OF TEST        --------------- */
        /* ----------------------         END OF TEST        --------------- */
end_of_test:
end_of_test:
        nop
        nop
        br #0xffff
        br #0xffff
        /* ----------------------      INTERRUPT ROUTINES    --------------- */
        /* ----------------------      INTERRUPT ROUTINES    --------------- */
PORT1_VECTOR:
PORT1_VECTOR:
        mov.b &P1IFG,  0(r15)
        mov.b &P1IFG,  0(r15)
        mov.b  #0x00, &P1IFG
        mov.b  #0x00, &P1IFG
        reti
        reti
PORT2_VECTOR:
PORT2_VECTOR:
        mov.b &P2IFG,  0(r15)
        mov.b &P2IFG,  0(r15)
        mov.b  #0x00, &P2IFG
        mov.b  #0x00, &P2IFG
        reti
        reti
        /* ----------------------         INTERRUPT VECTORS  --------------- */
        /* ----------------------         INTERRUPT VECTORS  --------------- */
.section .vectors, "a"
.section .vectors, "a"
.word end_of_test  ; Interrupt  0 (lowest priority)    
.word end_of_test  ; Interrupt  0 (lowest priority)    
.word end_of_test  ; Interrupt  1                      
.word end_of_test  ; Interrupt  1                      
.word PORT1_VECTOR ; Interrupt  2                      
.word PORT1_VECTOR ; Interrupt  2                      
.word PORT2_VECTOR ; Interrupt  3                      
.word PORT2_VECTOR ; Interrupt  3                      
.word end_of_test  ; Interrupt  4                      
.word end_of_test  ; Interrupt  4                      
.word end_of_test  ; Interrupt  5                      
.word end_of_test  ; Interrupt  5                      
.word end_of_test  ; Interrupt  6                      
.word end_of_test  ; Interrupt  6                      
.word end_of_test  ; Interrupt  7                      
.word end_of_test  ; Interrupt  7                      
.word end_of_test  ; Interrupt  8                      
.word end_of_test  ; Interrupt  8                      
.word end_of_test  ; Interrupt  9                      
.word end_of_test  ; Interrupt  9                      
.word end_of_test  ; Interrupt 10                      Watchdog timer
.word end_of_test  ; Interrupt 10                      Watchdog timer
.word end_of_test  ; Interrupt 11                      
.word end_of_test  ; Interrupt 11                      
.word end_of_test  ; Interrupt 12                      
.word end_of_test  ; Interrupt 12                      
.word end_of_test  ; Interrupt 13                      
.word end_of_test  ; Interrupt 13                      
.word end_of_test  ; Interrupt 14                      NMI
.word end_of_test  ; Interrupt 14                      NMI
.word main         ; Interrupt 15 (highest priority)   RESET
.word main         ; Interrupt 15 (highest priority)   RESET
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.