OpenCores
URL https://opencores.org/ocsvn/plasma/plasma/trunk

Subversion Repositories plasma

[/] [plasma/] [trunk/] [tools/] [bootldr.c] - Blame information for rev 183

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 142 rhoads
/* bootldr.c */
2
#include "plasma.h"
3
 
4
#define MemoryRead(A) (*(volatile unsigned long*)(A))
5
#define MemoryWrite(A,V) *(volatile unsigned long*)(A)=(V)
6
 
7
void putchar(int ch);
8
int puts(const char *string);
9
int getch(void);
10
int kbhit(void);
11
 
12
typedef void (*FuncPtr)(void);
13
 
14
char *xtoa(unsigned long num)
15
{
16
   static char buf[12];
17
   int i, digit;
18
   buf[8] = 0;
19
   for (i = 7; i >= 0; --i)
20
   {
21
      digit = num & 0xf;
22
      buf[i] = digit + (digit < 10 ? '0' : 'A' - 10);
23
      num >>= 4;
24
   }
25
   return buf;
26
}
27
 
28
unsigned long getnum(void)
29
{
30
   int i;
31
   unsigned long ch, ch2, value=0;
32
   for(i = 0; i < 16; )
33
   {
34
      ch = ch2 = getch();
35
      if(ch == '\n' || ch == '\r')
36
         break;
37
      if('0' <= ch && ch <= '9')
38
         ch -= '0';
39
      else if('A' <= ch && ch <= 'Z')
40
         ch = ch - 'A' + 10;
41
      else if('a' <= ch && ch <= 'z')
42
         ch = ch - 'a' + 10;
43
      else if(ch == 8)
44
      {
45
         if(i > 0)
46
         {
47
            --i;
48
            putchar(ch);
49
            putchar(' ');
50
            putchar(ch);
51
         }
52
         value >>= 4;
53
         continue;
54
      }
55
      putchar(ch2);
56
      value = (value << 4) + ch;
57
      ++i;
58
   }
59
   putchar('\r');
60
   putchar('\n');
61
   return value;
62
}
63
 
64
int main(void)
65
{
66
   int i, j, ch;
67
   unsigned long address, value, count;
68
   FuncPtr funcPtr;
69
   unsigned char *ptr1;
70
 
71
   puts("\nGreetings from the bootloader ");
72
   puts(__DATE__);
73
   puts(" ");
74
   puts(__TIME__);
75
   puts(":\n");
76
   for(;;)
77
   {
78
      puts("\nWaiting for binary image linked at 0x10000000\n");
79
      puts("Other Menu Options:\n");
80
      puts("1. Memory read word\n");
81
      puts("2. Memory write word\n");
82
      puts("3. Memory read byte\n");
83
      puts("4. Memory write byte\n");
84
      puts("5. Jump to address\n");
85
      puts("6. Raw memory read\n");
86
      puts("7. Raw memory write\n");
87
      puts("8. Checksum\n");
88
      puts("9. Dump\n");
89
      puts("> ");
90
      ch = getch();
91
      address = 0;
92 183 rhoads
      if('0' <= ch && ch <= '9')
93 142 rhoads
      {
94
         putchar(ch);
95
         puts("\nAddress in hex> ");
96
         address = getnum();
97
         puts("Address = ");
98
         puts(xtoa(address));
99
         puts("\n");
100
      }
101
      switch(ch)
102
      {
103
      case '1':
104
         value = MemoryRead(address);
105
         puts(xtoa(value));
106
         puts("\n");
107
         break;
108
      case '2':
109
         puts("\nValue in hex> ");
110
         value = getnum();
111
         puts(xtoa(value));
112
         MemoryWrite(address, value);
113
         break;
114
      case '3':
115
         value = *(unsigned char*)address;
116
         puts(xtoa(value));
117
         puts("\n");
118
         break;
119
      case '4':
120
         puts("\nValue in hex> ");
121
         value = getnum();
122
         puts(xtoa(value));
123
         *(unsigned char*)address = value;
124
         break;
125
      case '5':
126
         funcPtr = (FuncPtr)address;
127
         funcPtr();
128
         break;
129
      case '6':
130
         puts("\nCount in hex> ");
131
         count = getnum();
132
         //puts(xtoa(count));
133
         //puts("\n");
134
         for(i = 0; i < count; ++i)
135
         {
136
            ch = *(unsigned char*)(address + i);
137
            putchar(ch);
138
         }
139
         break;
140
      case '7':
141
         puts("\nCount in hex> ");
142
         count = getnum();
143
         //puts(xtoa(count));
144
         //putchar('\n');
145
         for(i = 0; i < count; ++i)
146
         {
147
            ch = getch();
148
            *(unsigned char*)(address+i) = ch;
149
         }
150
         break;
151
      case '8':
152
         puts("\nCount in hex> ");
153
         count = getnum();
154
         value = 0;
155
         for(i = 0; i < count; ++i)
156
         {
157
            value += *(unsigned char*)(address+i);
158
         }
159
         puts(xtoa(value));
160
         putchar('\n');
161
         break;
162
      case '9':
163
         puts("\nCount in hex> ");
164
         count = getnum();
165
         value = 0;
166
         for(i = 0; i < count; i += 4)
167
         {
168
            if((i & 15) == 0)
169
               puts("\r\n");
170
            value = *(unsigned long*)(address+i);
171
            puts(xtoa(value));
172
            putchar(' ');
173
         }
174
         puts("\r\n");
175
         break;
176
      case 0x3c:   //raw test.bin file
177
         ptr1 = (unsigned char*)0x10000000;
178
         for(i = 0; i < 1024*1024; ++i)
179
         {
180
            ptr1[i] = (unsigned char)ch;
181
            for(j = 0; j < 10000; ++j)
182
            {
183
               if(kbhit())
184
                  break;
185
            }
186
            if(j >= 10000)
187
               break;       //assume end of file
188
            ch = getch();
189
         }
190
         funcPtr = (FuncPtr)0x10000000;
191
         funcPtr();
192
         break;
193
      }
194
   }
195
   return 0;
196
}
197
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.