00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00074 #include <sys/ports.h>
00075
00076 int __attribute__((noreturn)) main ();
00077 static unsigned short get_char ();
00078
00079 void
00080 _start()
00081 {
00082 set_bus_expanded ();
00083
00084 main ();
00085 }
00086
00087
00088 static void
00089 put_char (unsigned char c)
00090 {
00091 while (!(_io_ports[M6811_SCSR] & M6811_TDRE))
00092 continue;
00093
00094 _io_ports[M6811_SCDR] = c;
00095 _io_ports[M6811_SCCR2] |= M6811_TE;
00096 }
00097
00098
00099 static void
00100 put_byte (unsigned char c)
00101 {
00102
00103
00104 if (c == '\n' || c == '\033')
00105 {
00106 put_char ('\033');
00107 c ^= 0x20;
00108 }
00109 put_char (c);
00110 }
00111
00112 static inline void
00113 reboot()
00114 {
00115 #ifndef NO_REBOOT
00116
00117
00118 typedef void __attribute__ ((noreturn)) (* func)();
00119
00120 func handler;
00121
00122 set_bus_single_chip ();
00123
00124
00125 handler = *((func*) 0xbffe);
00126 handler ();
00127 #endif
00128 }
00129
00130 int
00131 main ()
00132 {
00133 unsigned char* addr;
00134 unsigned char c;
00135
00136 while (1)
00137 {
00138
00139 put_char ('\n');
00140 put_char ('>');
00141
00142
00143 c = get_char ();
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 if (c == 'R')
00158 {
00159 unsigned char size;
00160 unsigned char crc;
00161
00162 c = get_char ();
00163 addr = (unsigned char*) ((c << 8) | get_char ());
00164 size = get_char ();
00165
00166
00167 put_byte (size);
00168
00169 crc = 0;
00170 do
00171 {
00172 c = *addr++;
00173 crc ^= c;
00174 put_byte (c);
00175 }
00176 while (--size != 0);
00177 put_byte (crc);
00178 }
00179
00180
00181
00182
00183
00184
00185
00186 else if (c == 'Z')
00187 {
00188 put_char (c);
00189 put_char ('\n');
00190
00191 reboot ();
00192 }
00193
00194
00195 else
00196 {
00197 put_char ('?');
00198 }
00199 }
00200 }
00201
00202 #ifndef NO_BREAK
00203 static inline void
00204 restart ()
00205 {
00206 unsigned short i;
00207 volatile unsigned char* ports = &_io_ports[0];
00208
00209
00210 while (!(ports[M6811_SCSR] & M6811_TDRE))
00211 continue;
00212
00213
00214 ports[M6811_SCCR2] |= M6811_SBK;
00215
00216
00217 for (i = 1000; --i != 0;)
00218 (void) ports[M6811_TCTN];
00219
00220 ports[M6811_SCCR2] &= ~M6811_SBK;
00221
00222
00223
00224 __asm__ __volatile__ ("lds #0x0ff");
00225 __asm__ __volatile__ ("bra main");
00226 }
00227 #endif
00228
00229 static unsigned short
00230 get_char ()
00231 {
00232 unsigned char c;
00233 volatile unsigned char* ports = &_io_ports[0];
00234
00235 while (1)
00236 {
00237 c = ports[M6811_SCSR];
00238
00239 #ifndef NO_BREAK
00240
00241
00242
00243 if (c & M6811_FE)
00244 restart ();
00245 #endif
00246
00247 if (c & M6811_RDRF)
00248 break;
00249 }
00250 return ports[M6811_SCDR];
00251 }