Files
Embedded-Systems-Labs/content/dxp_Lab3_ArrayFill_a2.asm
2018-03-18 00:56:37 -04:00

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