102 lines
4.7 KiB
NASM
102 lines
4.7 KiB
NASM
;-------------------------------------------------------------------------------
|
|
; MSP430 Assembler Code Template for use with TI Code Composer Studio
|
|
; Lab3_ArrayFill_a2.asm
|
|
;
|
|
; Description; Initialize and fill a 16 element array
|
|
;
|
|
; Notes: The specific storage mapping between sections and the address
|
|
; space can be found in the lnk_msp430f149.cmd file
|
|
;
|
|
; D. Phillips, 365_20053; RIT ; 25Mar06 ; Built with CCE for MSP430 V.1.00
|
|
;
|
|
; Updated for CCS v4 by Dorin Patru 03/20/11
|
|
; Updated for CCS v5.4 by Dorin Patru 09/19/13
|
|
;*******************************************************************************
|
|
; Labels used as constants by the assembler
|
|
;-------------------------------------------------------------------------------
|
|
NUMROWS .equ 0x04
|
|
NUMCOLS .equ 0x04
|
|
FULL .equ 0x10
|
|
;-------------------------------------------------------------------------------
|
|
.cdecls C,LIST,"msp430g2553.h" ; Include device header file
|
|
;-------------------------------------------------------------------------------
|
|
; Uninitialized volatile storage
|
|
;-------------------------------------------------------------------------------
|
|
Array: .bss ROW0,4 ; A 16 element 1-D array that can also
|
|
.bss ROW1,4 ; be considered as a 4x4 2-D array
|
|
.bss ROW2,4 ; .bss is an assembler directive to indicate where
|
|
.bss ROW3,4 ; to allocate uninitialized space in memory
|
|
; The first location is at 0x200
|
|
.bss SUM,2 ; a sixteen bit storage location
|
|
;-------------------------------------------------------------------------------
|
|
; Initialized volatile storage
|
|
;-------------------------------------------------------------------------------
|
|
; Constants
|
|
;-------------------------------------------------------------------------------
|
|
Constants: .sect ".const" ; designate which section to store these constants
|
|
|
|
Zeroes: .byte 0x00 ;
|
|
Ones: .byte 0xff ;
|
|
Odds: .byte 0x55 ;
|
|
Evens: .byte 0xaa ;
|
|
;-------------------------------------------------------------------------------
|
|
; Code
|
|
;-------------------------------------------------------------------------------
|
|
.text ; Assemble into program memory
|
|
.retain ; Override ELF conditional linking
|
|
; and retain current section
|
|
.retainrefs ; Additionally retain any sections
|
|
; that have references to current
|
|
; section
|
|
;-------------------------------------------------------------------------------
|
|
RESET mov.w #__STACK_END,SP ; Initialize stackpointer
|
|
StopWDT mov.w #WDTPW|WDTHOLD,&WDTCTL ; Stop watchdog timer
|
|
|
|
;-------------------------------------------------------------------------------
|
|
; Main loop here
|
|
;-------------------------------------------------------------------------------
|
|
Mainloop:
|
|
clr r4 ; row counter
|
|
clr r5 ; column counter
|
|
clr r6 ; array index
|
|
clr &SUM ; clear the accumulator location
|
|
InitLoop: ;
|
|
cmp.b #FULL, r6 ; passed end of array?
|
|
jeq DoubleLoop ; yep, done initializing
|
|
mov.b &Ones, Array(r6); initialize an element of the array
|
|
add.b #1, r6 ; point to the next location
|
|
jmp InitLoop ; go again
|
|
DoubleLoop: ;
|
|
clr r6 ; clear the array index
|
|
ROWLOOP: ; outer loop, process a row at a time
|
|
cmp.b #NUMROWS, r4 ; finished last row?
|
|
jeq FINI ; yep, done
|
|
COLLOOP: ; inner loop,
|
|
cmp.b #NUMCOLS, r5 ; finished last column?
|
|
jeq NEXTROW ; yep, done, get the nextrow
|
|
mov.b r6, ROW0(r6) ; store the array index in the array
|
|
add r6, SUM ; update the summation of the array index
|
|
add.b #1, r5 ; move to the next element in the row
|
|
add.b #1, r6 ; update the array index
|
|
jmp COLLOOP ; try another column
|
|
NEXTROW: ;
|
|
clr.b r5 ; clear the column counter
|
|
add.b #1, r4 ; update the row counter
|
|
jmp ROWLOOP ; try another row
|
|
FINI: ;
|
|
jmp Mainloop ; start over
|
|
;-------------------------------------------------------------------------------
|
|
; Stack Pointer definition
|
|
;-------------------------------------------------------------------------------
|
|
.global __STACK_END
|
|
.sect .stack
|
|
;-------------------------------------------------------------------------------
|
|
; Interrupt Vectors
|
|
;-------------------------------------------------------------------------------
|
|
; This stores away the address of where to jump to when the MCU is reset
|
|
; (Take a look at the linker command file to find the specific address
|
|
; associated with the section .reset)
|
|
;-------------------------------------------------------------------------------
|
|
.sect ".reset" ; MSP430 RESET Vector
|
|
.short RESET
|