Skip to content

Instantly share code, notes, and snippets.

@kizzlebot
Created April 12, 2014 15:28
Show Gist options
  • Save kizzlebot/10541390 to your computer and use it in GitHub Desktop.
Save kizzlebot/10541390 to your computer and use it in GitHub Desktop.
.cdecls C,LIST,"msp430g2553.h"
.text
.retain
.retainrefs
.sect ".sysmem"
arg .space 0x0000
arg1 .space 0x0000
arg2 .space 0x0000
.sect ".const"
.text
.global _START
START mov.w #300h,SP
StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL
SetupP1 bis.b #01h,&P1DIR
call #Init_UART
;*****************************************************************
MainLoop
;*****************************************************************
xor.b #01,&P1OUT
Wait mov.w #0A000h,R15
_dec dec.w R15
jnz _dec
;call #readTwoArgs4
;call #CRLF
;call #addition
;call #subtraction
call #Prompt
;call #ModifyMemory
jmp MainLoop
;----------------------------------------------------------------
Prompt
;----------------------------------------------------------------
mov.w #0x3E,R4
call #OUTA
_prompt call #INCHAR
_hexCalc cmp.b #0x48,R4 ; 'H'
jnz _modMemory
call #OUTA
call #HexCalc
jmp _promptFin
_modMemory cmp.b #0x4D, R4 ; 'M'
jnz _readMem
call #OUTA
call #ModifyMemory
jmp _promptFin
_readMem cmp.b #0x44, R4 ; 'D'
jnz _prompt
call #OUTA
call #ReadMemory
_promptFin call #CRLF
ret
;----------------------------------------------------------------
HexCalc
;----------------------------------------------------------------
call #INCHAR
_chkAdd cmp.b #0x41, R4
jnz _chkSub
call #OUTA
call #SPACE
call #addition
ret
_chkSub cmp.b #0x53, R4
jnz HexCalc
call #OUTA
call #SPACE
call #subtraction
ret
;----------------------------------------------------------------
ModifyMemory
;----------------------------------------------------------------
push.w R5
call #SPACE
_getBaseAddress call #readHex4
mov.w R4, R5
jmp _valAtAddress
_cont call #CRLF
call #SPACE
call #SPACE
call #SPACE
mov.w R5, R4
call #printVal4
_valAtAddress call #SPACE
mov.w 0(R5), R4
call #printVal4
_getWriteData call #SPACE
call #readHex4A
cmp.b #0x70,R4 ; "p"
jz _prev
cmp.b #0x6E,R4 ; "n"
jz _next
cmp.b #0x20,R4 ; <space>
jz _retModMem
mov.w R4, 0(R5)
inc.w R5
jmp _cont
_prev dec.w R5
call #OUTA
jmp _cont
_next inc.w R5
call #OUTA
jmp _cont
_retModMem pop.w R5
ret
;----------------------------------------------------------------
ReadMemory
;----------------------------------------------------------------
ret
;----------------------------------------------------------------
readHex4A
;----------------------------------------------------------------
push.w R5
mov.w #0x0000, R5
call #readHex2A
cmp.b #0x70,R4 ; "p"
jz _rh4A
cmp.b #0x6E,R4 ; "n"
jz _rh4A
cmp.b #0x20,R4 ; <space>
jz _rh4A
mov.w R4,R5
swpb R5
call #readHex2A
cmp.b #0x70,R4 ; "p"
jz _rh4A
cmp.b #0x6E,R4 ; "n"
jz _rh4A
cmp.b #0x20,R4 ; <space>
jz _rh4A
and.w #0x00FF, R4
xor.w R5, R4
_rh4A pop.w R5
ret
;----------------------------------------------------------------
readHex2A
;----------------------------------------------------------------
push.w R5
call #readHexA
cmp.b #0x70,R4 ; "p"
jz _rh2A
cmp.b #0x6E,R4 ; "n"
jz _rh2A
cmp.b #0x20,R4 ; <space>
jz _rh2A
mov.b R4, R5
and.w #0x00FF,R5
rla.b R5
rla.b R5
rla.b R5
rla.b R5
call #readHexA
cmp.b #0x70,R4 ; "p"
jz _rh2A
cmp.b #0x6E,R4 ; "n"
jz _rh2A
cmp.b #0x20,R4 ; <space>
jz _rh2A
and.w #0x00FF,R4
xor.w R5, R4
_rh2A pop.w R5
ret
;*****************************************************************
readHexA ; Reads a asciiHex, prints it, converts it to the
; value it represents and returns
;*****************************************************************
call #INCHAR
cmp.b #0x70,R4 ; "p"
jz _rhA
cmp.b #0x6E,R4 ; "n"
jz _rhA
cmp.b #0x20,R4 ; <space>
jz _rhA
call #validateAsciiHex
cmp.b #0x00, R4
jz readHexA
call #OUTA
call #asciiToVal
_rhA ret
;--------------------------------------------------------------------
PrintStatus ; Takes SR values in R7
;--------------------------------------------------------------------
push.w R6
push.w R4
push.w R7
call #CRLF
mov.b #0x43,R4
call #OUTA
mov.b #0x3D,R4
call #OUTA
mov.w R7, R6
and.w #0x0001,R6
mov.w R6, R4
call #printVal1
rra.b R7
call #SPACE
mov.b #0x5A,R4
call #OUTA
mov.b #0x3D,R4
call #OUTA
mov.w R7, R6
and.w #0x0001,R6
mov.w R6, R4
call #printVal1
rra.b R7
call #SPACE
mov.b #0x4E,R4
call #OUTA
mov.b #0x3D,R4
call #OUTA
mov.w R7, R6
and.w #0x0001,R6
mov.w R6, R4
call #printVal1
call #SPACE
pop.w R7
push.w R7
mov.w R7, R6
swpb R6
mov.b #0x56,R4
call #OUTA
mov.b #0x3D,R4
call #OUTA
and.w #0x0001,R6
mov.w R6, R4
call #printVal1
call #CRLF
pop.w R7
pop.w R4
pop.w R6
ret
;--------------------------------------------------------------------
;---------------------------------------------------------------------------------------------------------
; ___ _ _ _ _ _
; / _ \ (_)| | | | | | (_)
; / /_\ \ _ __ _ | |_ | |__ _ __ ___ ___ | |_ _ ___
; | _ || '__|| || __|| '_ \ | '_ ` _ \ / _ \| __|| | / __|
; | | | || | | || |_ | | | || | | | | || __/| |_ | || (__
; \_| |_/|_| |_| \__||_| |_||_| |_| |_| \___| \__||_| \___|
;---------------------------------------------------------------------------------------------------------
;----------------------------------------------------------------
addition
;----------------------------------------------------------------
push.w R4
push.w R5
push.w R7
; Read first two hex digits
call #readHex4
mov.w R4, R5
call #PLUS
call #readHex4
call #EQUALS
; Calculate the sum into R4 and print it
add.w R5,R4
mov.w SR, R7
call #printVal4
call #PrintStatus
pop.w R7
pop.w R5
pop.w R4
ret
;----------------------------------------------------------------
subtraction
;----------------------------------------------------------------
push.w R4
push.w R5
push.w R6
push.w R7
call #readHex4
mov.w R4, R6
call #MINUS
call #readHex4
mov.w R4, R5
mov.w R6, R4
call #EQUALS
sub.w R5,R4
mov.w SR,R7 ; Save SR vals
jn _subNeg
jmp _printSub
_subNeg inv.w R4
add.w #0x0001, R4
call #NEGATIVE
_printSub call #printVal4
call #PrintStatus
pop.w R7
pop.w R6
pop.w R5
pop.w R4
ret
;---------------------------------------------------------------------------------------------------------
; ______ _ _
; | ___ \ (_) | |
; | |_/ /_ __ _ _ __ | |_
; | __/| '__|| || '_ \ | __|
; | | | | | || | | || |_
; \_| |_| |_||_| |_| \__|
;---------------------------------------------------------------------------------------------------------
;*****************************************************************
printVal4
;*****************************************************************
push.w R4
swpb R4
and.w #0x00ff, R4
call #printVal2
pop.w R4
push.w R4
and.w #0x00ff, R4
call #printVal2
pop.w R4
ret
;*****************************************************************
printVal2
;*****************************************************************
push.w R4 ; R4: (0011 1110)
rra.b R4 ; R4: (0001 1111)
rra.b R4 ; R4: (1000 1111)
rra.b R4 ; R4: (1100 0111)
rra.b R4 ; R4: (1110 0011)
and.w #0x000F, R4 ; R4: (0000 0011)
call #printVal1
pop.w R4
push.w R4
and.w #0x000F, R4 ; R4: (0000 1110)
call #printVal1
pop.w R4
ret
;*****************************************************************
printVal1 ; If R4 = 0x0A, will print 'A' to terminal
;*****************************************************************
cmp.b #0x0A, R4
jl isNum
add.b #0x37, R4
call #OUTA
sub.b #0x37, R4
ret
isNum add.b #0x30, R4
call #OUTA
sub.b #0x30, R4
ret
;---------------------------------------------------------------------------------------------------------
; ______ _
; | ___ \ | |
; | |_/ / ___ __ _ __| |
; | / / _ \ / _` | / _` |
; | |\ \| __/| (_| || (_| |
; \_| \_|\___| \__,_| \__,_|
;---------------------------------------------------------------------------------------------------------
;----------------------------------------------------------------
readHex4
;----------------------------------------------------------------
push.w R5
mov.w #0x0000, R5
call #readHex2
mov.w R4,R5
swpb R5
call #readHex2
and.w #0x00FF, R4
xor.w R5, R4
pop.w R5
ret
;----------------------------------------------------------------
readHex2
;----------------------------------------------------------------
push.w R5
call #readHex
mov.b R4, R5
and.w #0x00FF,R5
rla.b R5
rla.b R5
rla.b R5
rla.b R5
call #readHex
and.w #0x00FF,R4
xor.w R5, R4
pop.w R5
ret
;*****************************************************************
readHex ; Reads a asciiHex, prints it, converts it to the
; value it represents and returns
;*****************************************************************
call #INCHAR
call #validateAsciiHex
cmp.b #0x00, R4
jz readHex
call #OUTA
call #asciiToVal
ret
;----------------------------------------------------------------
validateAsciiHex ; Will put 0x00 into R4 if R4 isn't valid hex
; ascii range
;----------------------------------------------------------------
; check for 0-
cmp.b #0x30,R4 ; R4 < 0
jl invalid ; If less, read again
; check fo -9
cmp.b #0x3A,R4
jn verified
; check for ~A-
cmp.b #0x41,R4 ; 0x41 < R4
jl invalid ; If less, read again
; check fo -F
cmp.b #0x47,R4 ; R4-0x47 < 0
jn verified
; check for ~a-
cmp.b #0x61,R4 ; R4-0x2F > 0
jl invalid ; If n set, jump to ret
; check fo ~-f
cmp.b #0x67,R4
jn Cap
jmp invalid
Cap sub.b #0x20,R4
verified ret
invalid mov.b #0x00, R4
ret
;----------------------------------------------------------------
asciiToVal ; Takes ascii byte in R4 and makes it into
; hexadecimal digit. R4 must be verified to
; be a valid g
;----------------------------------------------------------------
and.w #0x00FF,R4
cmp.b #0x41, R4
jhs isChar
sub.b #0x30, R4
jmp asciiToValFin
isChar sub.b #0x37, R4
asciiToValFin ret
;---------------------------------------------------------------------------------------------------------
; _ _ _
; | | | | | |
; | |_| | ___ | | _ __ ___ _ __ ___
; | _ | / _ \| || '_ \ / _ \| '__|/ __|
; | | | || __/| || |_) || __/| | \__ \
; \_| |_/ \___||_|| .__/ \___||_| |___/
; | |
; |_|
;---------------------------------------------------------------------------------------------------------
;----------------------------------------------------------------
shiftLeftW
;----------------------------------------------------------------
rla.w R4 ; Move MSB to LSB
and.w #0xFFFE, R4 ; Zero out the LSB
ret
;----------------------------------------------------------------
shiftRightW
;----------------------------------------------------------------
rra.w R4
and.w #0x7FFF, R4
ret
;---------------------------------------------------------------------------------------------------------
; _____ _ _
; / __ \| | | |
; | / \/| |__ __ _ _ __ __ _ ___ | |_ ___ _ __ ___
; | | | '_ \ / _` || '__|/ _` | / __|| __|/ _ \| '__|/ __|
; | \__/\| | | || (_| || | | (_| || (__ | |_| __/| | \__ \
; \____/|_| |_| \__,_||_| \__,_| \___| \__|\___||_| |___/
;---------------------------------------------------------------------------------------------------------
;----------------------------------------------------------------
CR
;----------------------------------------------------------------
push.w R4
mov.b #0x0D, R4 ; CR
call #OUTA
pop.w R4
ret
;----------------------------------------------------------------
LF
;----------------------------------------------------------------
push.w R4
mov.b #0x0A, R4 ; LF
call #OUTA
pop.w R4
ret
;----------------------------------------------------------------
NULL
;----------------------------------------------------------------
push.w R4
mov.b #0x00, R4
call #OUTA
pop.w R4
ret
;----------------------------------------------------------------
CRLF
;----------------------------------------------------------------
call #CR
call #LF
call #NULL
ret
;----------------------------------------------------------------
SPACE
;----------------------------------------------------------------
push.w R4
mov.b #0x20, R4 ; SPACE
call #OUTA
pop.w R4
ret
;----------------------------------------------------------------
PLUS
;----------------------------------------------------------------
call #SPACE
push R4
mov.b #0x2B, R4 ; +
call #OUTA
pop R4
call #SPACE
ret
;----------------------------------------------------------------
MINUS
;----------------------------------------------------------------
call #SPACE
push R4
mov.b #0x2D, R4 ; -
call #OUTA
pop R4
call #SPACE
ret
;----------------------------------------------------------------
EQUALS
;----------------------------------------------------------------
call #SPACE
push R4
mov.b #0x3D, R4 ; =
call #OUTA
pop R4
call #SPACE
ret
;----------------------------------------------------------------
MULT
;----------------------------------------------------------------
call #SPACE
push R4
mov.b #0x2A, R4 ; =
call #OUTA
pop R4
call #SPACE
ret
;----------------------------------------------------------------
NEGATIVE
;----------------------------------------------------------------
push R4
mov.b #0x2D, R4 ; -
call #OUTA
pop R4
ret
;----------------------------------------------------------------
; _____ _ _
; |_ _| (_)| |
; | | _ __ _ | |_
; | | | '_ \ | || __|
; _| |_| | | || || |_
; \___/|_| |_||_| \__|
;----------------------------------------------------------------
;----------------------------------------------------------------
OUTA
;----------------------------------------------------------------
push R5
lpa mov.b &IFG2,R5
and.b #0x02,R5
cmp.b #0x00,R5
jz lpa
mov.b R4,&UCA0TXBUF
pop R5
ret
;----------------------------------------------------------------
INCHAR
;----------------------------------------------------------------
push R5
lpb mov.b &IFG2,R5
and.b #0x01,R5
cmp.b #0x00,R5
jz lpb
mov.b &UCA0RXBUF,R4
pop R5
ret
;----------------------------------------------------------------
Init_UART
;----------------------------------------------------------------
mov.b &CALBC1_1MHZ, &BCSCTL1
mov.b &CALDCO_1MHZ, &DCOCTL
mov.b #0x06,&P1SEL
mov.b #0x06,&P1SEL2
mov.b #0x00,&UCA0CTL0
mov.b #0x81,&UCA0CTL1
mov.b #0x00,&UCA0BR1
mov.b #0x68,&UCA0BR0
mov.b #0x06,&UCA0MCTL
mov.b #0x00,&UCA0STAT
mov.b #0x80,&UCA0CTL1
mov.b #0x00,&IE2
ret
;----------------------------------------------------------------
; Interrupt Vectors
;----------------------------------------------------------------
.sect ".reset" ; MSP430 RESET Vector
.short START
.end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment