TARGET = main
#MCU = msp430f5529
-MCU = msp1
-#MCU = msp430x2013
+#MCU = msp1
+MCU = msp430x2013
# List all the source files here
# eg if you have a source file foo.c then list it here
SOURCES = main.c ns430-uart.c msp4th.c
+#SOURCES = main.c ns430-uart.c
# Include are located in the Include directory
#INCLUDES = -IInclude
INCLUDES = -I.
#######################################################################################
#CFLAGS = -mmcu=$(MCU) -g -Os -Wall -Wunused $(INCLUDES)
#CFLAGS = -mmcu=$(MCU) -Werror -Wall -Wunused -mendup-at=main $(INCLUDES)
+#CFLAGS = -mmcu=$(MCU) -g -Os -Werror -Wall -Wunused $(INCLUDES)
CFLAGS = -mmcu=$(MCU) -g -Os -Werror -Wall -Wunused $(INCLUDES)
#ASFLAGS = -mmcu=$(MCU) -x assembler-with-cpp -Wa,-gstabs
#ASFLAGS = -mmcu=$(MCU) -Wall -Wunused -mendup-at=main $(INCLUDES)
} > data
PROVIDE (__data_load_start = LOADADDR(.data) );
PROVIDE (__data_size = SIZEOF(.data) );
+ PROVIDE (__data_end = LOADADDR(.data) + SIZEOF(.data) );
/* Bootloader. */
.bootloader :
{
#define DEVBOARD_CLOCK 12000000L
-#define BAUDRATE 4800L
+#define BAUDRATE 19200L
-/*NAKED(_reset_vector__){*/
void __attribute__ ((naked)) _reset_vector__(void) {
__asm__ __volatile__("br #main"::);
}
__asm__ __volatile__ ( "eint" :: );
}
+
+
+
+
+
int main(void){
uint16_t tmp;
+ volatile int16_t *dirMemory;
+ dirMemory = 0;
+
dint();
+
+ // chip setup for UART0 use
PAPER = 0x0030;
PAOUT = 0x0000;
PAOEN = 0x0010; // set data direction registers
UART0_BCR = BCR(DEVBOARD_CLOCK, BAUDRATE);
UART0_CR = UARTEn;
+ // a read clears the register
tmp = UART0_SR;
- uart_putchar('!');
+
+ /*
+ uart_puts((uint8_t *)"UART echo mode, ` to exit:");
char c;
while (1) {
c = uart_getchar();
break;
uart_putchar(c);
}
+ */
+
+
+
+ /*
+ * dump contents of all RAM
+ */
+ volatile uint16_t *addr;
+
+ uart_puts((uint8_t *)"Memory dump:");
+ uart_putchar('\r');
+ uart_putchar('\n');
+
+ for (addr = (uint16_t *)0x4000; addr < (uint16_t *)0xfffe; addr++) {
+ printHexWord((int16_t)addr);
+ uart_putchar(' ');
+ printHexWord((int16_t)*addr);
+ uart_putchar('\r');
+ uart_putchar('\n');
+ }
+
+
+
+
+
+
+ /*
+ * memtest starting at end of program code
+ */
+
+ const int16_t patterns[] = {
+ 0x0000,
+ 0x0001,
+ 0x0002,
+ 0x0004,
+ 0x0008,
+ 0x0010,
+ 0x0020,
+ 0x0040,
+ 0x0080,
+ 0x0100,
+ 0x0200,
+ 0x0400,
+ 0x0800,
+ 0x1000,
+ 0x2000,
+ 0x4000,
+ 0x8000,
+ 0xaaaa,
+ 0x5555,
+ 0xffff,
+ 0x0000,
+ };
+
+ volatile int16_t idx;
+ volatile int16_t readback;
+ volatile int16_t pattern;
+
+ const int16_t dend = (int16_t)0x51f0;
+ const int16_t memend = (int16_t)0xff80;
+
+ uart_puts((uint8_t *)"*** Memtest patterns ***");
+
+ printHexWord((int16_t)dend);
+ uart_puts((uint8_t *)" -- start address");
+
+ printHexWord((int16_t)memend);
+ uart_puts((uint8_t *)" -- end address");
+
+ for (idx=0; idx < sizeof(patterns)/sizeof(int16_t); idx++) {
+ pattern = patterns[idx];
+
+ printHexWord(pattern);
+ uart_puts((uint8_t *)" -- write pattern");
+
+ // write pattern to all locations
+ for (addr = (uint16_t *)dend; addr < (uint16_t *)memend; addr++) {
+ *addr = (uint16_t)pattern;
+ }
+
+ printHexWord(pattern);
+ uart_puts((uint8_t *)" -- readback pattern");
+
+ // readback pattern
+ for (addr = (uint16_t *)dend; addr < (uint16_t *)memend; addr++) {
+ readback = (int16_t)*addr;
+
+ if (readback != pattern) {
+ printHexWord((int16_t)addr);
+ uart_putchar(' ');
+ printHexWord(pattern);
+ uart_putchar(' ');
+ printHexWord(readback);
+ uart_putchar('\r');
+ uart_putchar('\n');
+ }
+ }
+ }
- uart_putchar('t');
- uart_putchar('e');
- uart_putchar('s');
- uart_putchar('t');
- uart_putchar('i');
- uart_putchar('n');
- uart_putchar('g');
- uart_puts((uint8_t *)"This is a test of the UART serial printing\r\nit really does work ...\r\n");
+ uart_puts((uint8_t *)"*** Memtest done ***");
init_msp4th();
processLoop();
wordBuffer[0] = 0;
- uart_putchar('.');
- uart_putchar('.');
+ /*uart_putchar('.');*/
+ /*uart_putchar('.');*/
/*while (wordBuffer[0] == 0) {*/
waiting = 1;
while ((c <= ' ') && (c != 0)) {
c = getKeyB(); /* strip leading spaces */
+ uart_putchar('a');
/*uart_putchar(c);*/
}
/*}*/
/*} else {*/
while (c > ' ') {
+ uart_putchar('b');
wordBuffer[k++] = c;
- uart_putchar(c);
+ /*uart_putchar(c);*/
c = getKeyB();
}
/*}*/
wordBuffer[k] = 0;
waiting = 0;
} else {
+ uart_putchar('c');
wordBuffer[0] = 0;
getLine();
}
k = 1;
j = mathStack[0];
- uart_putchar('1');
- uart_putchar('2');
+ /*uart_putchar('1');*/
+ /*uart_putchar('2');*/
for (i=1;i<MATH_STACK_SIZE;i++) {
- uart_putchar('s');
+ /*uart_putchar('s');*/
mathStack[i-1] = mathStack[i];
}
- uart_putchar('3');
+ /*uart_putchar('3');*/
k = 0;
return(j);
}
{
volatile uint16_t i;
volatile uint16_t tmp;
- printNumber(n);
- uart_puts((str_t *)"<-- push math");
+ /*printNumber(n);*/
+ /*uart_puts((str_t *)"<-- push math");*/
for (i=MATH_STACK_SIZE - 2; i > 0; i--) {
tmp = i - 1;
mathStack[i] = mathStack[tmp];
volatile int16_t j;
volatile int16_t n;
- uart_puts((str_t *)"in numFunc()");
+ /*uart_puts((str_t *)"in numFunc()");*/
// first check for neg sign
i = 0;
i = i + 1;
}
- uart_puts((str_t *)"there");
+ /*uart_puts((str_t *)"there");*/
if ((wordBuffer[i] >= '0') && (wordBuffer[i] <= '9')) {
- uart_puts((str_t *)"num");
+ /*uart_puts((str_t *)"num");*/
// it is a number
j = 1;
// check if hex
if(wordBuffer[0] == '0' && wordBuffer[1] == 'x'){
- uart_puts((str_t *)"hex");
+ /*uart_puts((str_t *)"hex");*/
// base 16 number ... just assume all characters are good
i = 2;
n = 0;
i = i + 1;
}
} else {
- uart_puts((str_t *)"dec");
+ /*uart_puts((str_t *)"dec");*/
// base 10 number
n = 0;
while(wordBuffer[i]){
}
}
} else {
- uart_puts((str_t *)"not number");
+ /*uart_puts((str_t *)"not number");*/
n = 0;
j = 0;
}
- uart_putchar('.');
+ /*uart_putchar('.');*/
pushMathStack(n);
- uart_putchar('.');
+ /*uart_putchar('.');*/
pushMathStack(j);
- uart_putchar('.');
+ /*uart_putchar('.');*/
}
void ifFunc(int16_t x){ // used as goto if x == 1
volatile uint16_t tmp;
volatile int16_t i;
- uart_puts((str_t *)"in ifFunc");
+ /*uart_puts((str_t *)"in ifFunc");*/
if(progCounter > 9999){
tmp = progCounter - 10000;
addr = prog[progCounter];
}
- printNumber(addr);
- uart_puts((str_t *)"<-- addr");
+ /*printNumber(addr);*/
+ /*uart_puts((str_t *)"<-- addr");*/
progCounter = progCounter + 1;
- uart_putchar('.');
+ /*uart_putchar('.');*/
if(x == 1){
// this is a goto
- uart_putchar('g');
+ /*uart_putchar('g');*/
progCounter = addr;
/*uart_puts((str_t *)"goto");*/
} else {
// this is the "if" processing
- uart_putchar('i');
+ /*uart_putchar('i');*/
i = popMathStack();
/*uart_putchar('a');*/
/*printNumber((int16_t)addr);*/
if(i == 0){
progCounter = addr;
}
- uart_puts((str_t *)"<-- if");
+ /*uart_puts((str_t *)"<-- if");*/
}
- uart_putchar('.');
+ /*uart_putchar('.');*/
}
void pushnFunc(){
void execN(int16_t n){
volatile int16_t i,j,k,m;
- int32_t x,y,z;
- uart_puts((str_t *)"execN: ");
- printNumber(n);
- uart_puts((str_t *)"");
+ int16_t x,y,z;
+ /*uart_puts((str_t *)"execN: ");*/
+ /*printNumber(n);*/
+ /*uart_puts((str_t *)"");*/
switch(n){
+ case 0:
+ break;
case 1:
// xit = 1;
break;
ifFunc(0);
break;
-// case 23: // then ( trapped in ':')
-// break;
+ case 23: // then ( trapped in ':')
+ break;
-// case 24: // else ( trapped in ':')
-// break;
+ case 24: // else ( trapped in ':')
+ break;
case 25: // begin
pushAddrStack(progCounter);
printHexWord(popMathStack());
break;
+ case 29:
+ break;
case 30: // num
- uart_puts((str_t *)"in case 30");
+ /*uart_puts((str_t *)"in case 30");*/
numFunc();
break;
break;
default:
- uart_puts((str_t *)"opcode ");
+ /*uart_puts((str_t *)"opcode "); */
break;
}
}
void init_msp4th(void);
void processLoop(void);
+uint8_t getKeyB(void);
+void getLine(void);
+void getWord(void);
+void listFunction(void);
+int16_t popMathStack(void);
+void pushMathStack(int16_t n);
+int16_t popAddrStack(void);
+void pushAddrStack(int16_t n);
+int16_t lookupToken(uint8_t *x, uint8_t *l);
+void luFunc(void);
+void numFunc(void);
+void ifFunc(int16_t x);
+void pushnFunc(void);
+void overFunc(void);
+void dfnFunc(void);
+void printNumber(int16_t n);
+void printHexChar(int16_t n);
+void printHexByte(int16_t n);
+void printHexWord(int16_t n);
+void execN(int16_t n);
+void execFunc(void);
#endif