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

Subversion Repositories c16

[/] [c16/] [trunk/] [loader.c] - Blame information for rev 26

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jsauermann
// LOADER
2
//-----------------------------------------------------------------------------
3
int getchr()
4
{
5
   while (! (ASM(" IN   (IN_STATUS), RU") & 0x01))   /* wait */ ;
6
   ASM("IN   (IN_RX_DATA), RU");
7
}
8
//-----------------------------------------------------------------------------
9
void putchr(char c)
10
{
11
   while (ASM(" IN (IN_STATUS), RU") & 0x02)   /* wait */ ;
12
   ASM(" MOVE 2(SP), RU");
13
   ASM(" OUT  R, (OUT_TX_DATA)");
14
}
15
//-----------------------------------------------------------------------------
16
void print_string(const char * buffer)
17
{
18
    while (*buffer)   putchr(*buffer++);
19
}
20
//-----------------------------------------------------------------------------
21
unsigned char get_nibble()
22
{
23
unsigned char c  = getchr();
24
 
25
   if (c <  '0') return 0xFF;
26
   if (c <= '9') return  c - '0';
27
   if (c <  'A') return 0xFF;
28
   if (c <= 'F') return  c - 0x37;
29
   if (c <  'a') return 0xFF;
30
   if (c <= 'f') return  c - 0x57;
31
   return 0xFF;
32
}
33
//-----------------------------------------------------------------------------
34
int get_byte()
35
{
36
unsigned char hi = get_nibble();
37
unsigned char lo;
38
 
39
   if (hi != 0xFF)
40
      {
41
        lo = get_nibble();
42
        if (lo != 0xFF)   return (hi << 4) | lo;
43
      }
44
 
45
   print_string("\r\nERROR: not hex\r\n");
46
   ASM(" HALT");
47
}
48
//-----------------------------------------------------------------------------
49
int main(int argc, char * argv[])
50
{
51
unsigned char record_length;
52
unsigned int  address;
53
unsigned char record_type;
54
unsigned char check_sum;
55
unsigned char  i;
56
unsigned char c;
57
 
58
   for (;;)
59
       {
60
         print_string("\r\nLOAD > ");
61
         for (;;)
62
            {
63
              // wait for start of record...
64
              while ((c = getchr()) != ':')   ;
65
              check_sum = 0;
66
 
67
              c = get_byte();   check_sum += c;   record_length = c;
68
              c = get_byte();   check_sum += c;   address       = c << 8;
69
              c = get_byte();   check_sum += c;   address      |= c;
70
              c = get_byte();   check_sum += c;   record_type   = c;
71
 
72
              for (i = 0; i < record_length; i++)
73
                  {
74
                    c = get_byte();
75
                    ((char *)address)[i] = c;
76
                    check_sum += c;
77
                  }
78
 
79
              c = get_byte();   check_sum += c;
80
              if (check_sum)   break;
81
              putchr('.');
82
 
83
              if (record_type == 1)
84
                 {
85
                   print_string("\r\nDONE.\r\n");
86
                   ((void (*)())address)();
87
                 }
88
            }
89
 
90
         print_string("\r\nCHECKSUM ERROR.");
91
       }
92
}
93
//-----------------------------------------------------------------------------

powered by: WebSVN 2.1.0

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