Created
April 12, 2014 15:28
-
-
Save kizzlebot/10541390 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.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