Norimasa Okamoto / Mbed 2 deprecated emuISP

Dependencies:   mbed

Committer:
va009039
Date:
Wed Mar 23 09:11:05 2016 +0900
Revision:
4:05f33cc747fd
Parent:
3:ccc673a10485
Child:
5:e2c275b33bbf
remove std::vector.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 4:05f33cc747fd 1 // BaseEmuISP.cpp 2016/3/23
va009039 1:4ff199bddbc1 2 #include <stdio.h>
va009039 1:4ff199bddbc1 3 #include <stdlib.h>
va009039 1:4ff199bddbc1 4 #include <string.h>
va009039 1:4ff199bddbc1 5 #include <stdarg.h>
va009039 1:4ff199bddbc1 6 #include "BaseEmuISP.h"
va009039 1:4ff199bddbc1 7
va009039 1:4ff199bddbc1 8 void BaseEmuISP::Reset() {
va009039 1:4ff199bddbc1 9 mode = M_RESET;
va009039 1:4ff199bddbc1 10 }
va009039 1:4ff199bddbc1 11
va009039 1:4ff199bddbc1 12 void BaseEmuISP::Poll() {
va009039 2:e3c085ac77f1 13 Mode_t prev_mode = mode;
va009039 1:4ff199bddbc1 14 int result;
va009039 1:4ff199bddbc1 15 char buf[32];
va009039 1:4ff199bddbc1 16 switch(mode) {
va009039 1:4ff199bddbc1 17 case M_RESET:
va009039 1:4ff199bddbc1 18 echoFlag = true;
va009039 1:4ff199bddbc1 19 lockFlag = true;
va009039 4:05f33cc747fd 20 version.Major = BootCodeVersion() >>8;
va009039 4:05f33cc747fd 21 version.Minor = BootCodeVersion() & 0xff;
va009039 1:4ff199bddbc1 22 mode = M_SYNC;
va009039 1:4ff199bddbc1 23 break;
va009039 1:4ff199bddbc1 24 case M_SYNC:
va009039 1:4ff199bddbc1 25 if (sync()) {
va009039 1:4ff199bddbc1 26 mode = M_CMD;
va009039 1:4ff199bddbc1 27 }
va009039 1:4ff199bddbc1 28 break;
va009039 1:4ff199bddbc1 29 case M_CMD:
va009039 1:4ff199bddbc1 30 if (line_proc()) {
va009039 4:05f33cc747fd 31 result = cmd(line.C_str());
va009039 1:4ff199bddbc1 32 snprintf(buf, sizeof(buf), "%d", result);
va009039 1:4ff199bddbc1 33 putln(buf);
va009039 4:05f33cc747fd 34 line.Clear();
va009039 1:4ff199bddbc1 35 }
va009039 1:4ff199bddbc1 36 break;
va009039 1:4ff199bddbc1 37 case M_CMD_W_DATA:
va009039 3:ccc673a10485 38 if (cmd_w_data()) {
va009039 1:4ff199bddbc1 39 mode = M_CMD;
va009039 1:4ff199bddbc1 40 }
va009039 1:4ff199bddbc1 41 break;
va009039 1:4ff199bddbc1 42 case M_CMD_R_DATA:
va009039 3:ccc673a10485 43 if (cmd_r_data()) {
va009039 1:4ff199bddbc1 44 mode = M_CMD;
va009039 1:4ff199bddbc1 45 }
va009039 1:4ff199bddbc1 46 break;
va009039 1:4ff199bddbc1 47 case M_CMD_J:
va009039 2:e3c085ac77f1 48 snprintf(buf, sizeof(buf), "%d", PartID());
va009039 1:4ff199bddbc1 49 putln(buf);
va009039 1:4ff199bddbc1 50 mode = M_CMD;
va009039 1:4ff199bddbc1 51 break;
va009039 2:e3c085ac77f1 52 case M_CMD_K:
va009039 4:05f33cc747fd 53 snprintf(buf, sizeof(buf), "%d", version.Major);
va009039 3:ccc673a10485 54 putln(buf);
va009039 4:05f33cc747fd 55 snprintf(buf, sizeof(buf), "%d", version.Minor);
va009039 3:ccc673a10485 56 putln(buf);
va009039 2:e3c085ac77f1 57 mode = M_CMD;
va009039 2:e3c085ac77f1 58 break;
va009039 2:e3c085ac77f1 59 case M_CMD_N:
va009039 2:e3c085ac77f1 60 mode = M_CMD;
va009039 2:e3c085ac77f1 61 break;
va009039 2:e3c085ac77f1 62 case M_CMD_S:
va009039 2:e3c085ac77f1 63 mode = M_CMD;
va009039 2:e3c085ac77f1 64 break;
va009039 1:4ff199bddbc1 65 }
va009039 1:4ff199bddbc1 66 if (prev_mode != mode) {
va009039 1:4ff199bddbc1 67 seq = 0;
va009039 4:05f33cc747fd 68 line.Clear();
va009039 1:4ff199bddbc1 69 }
va009039 1:4ff199bddbc1 70 }
va009039 1:4ff199bddbc1 71
va009039 1:4ff199bddbc1 72 bool BaseEmuISP::sync() {
va009039 1:4ff199bddbc1 73 switch(seq) {
va009039 1:4ff199bddbc1 74 case 0:
va009039 1:4ff199bddbc1 75 if (Getch() == '?') {
va009039 1:4ff199bddbc1 76 putln("Synchronized");
va009039 4:05f33cc747fd 77 line.Clear();
va009039 1:4ff199bddbc1 78 echoFlag = true;
va009039 1:4ff199bddbc1 79 seq++;
va009039 1:4ff199bddbc1 80 }
va009039 1:4ff199bddbc1 81 break;
va009039 1:4ff199bddbc1 82 case 1:
va009039 1:4ff199bddbc1 83 if (line_proc()) {
va009039 1:4ff199bddbc1 84 if (line == "Synchronized") {
va009039 1:4ff199bddbc1 85 putln("OK");
va009039 4:05f33cc747fd 86 line.Clear();
va009039 1:4ff199bddbc1 87 seq++;
va009039 1:4ff199bddbc1 88 } else {
va009039 1:4ff199bddbc1 89 seq = 0;
va009039 1:4ff199bddbc1 90 }
va009039 1:4ff199bddbc1 91 }
va009039 1:4ff199bddbc1 92 break;
va009039 1:4ff199bddbc1 93 case 2:
va009039 1:4ff199bddbc1 94 if (line_proc()) {
va009039 4:05f33cc747fd 95 freq = atoi(line.C_str());
va009039 1:4ff199bddbc1 96 putln("OK");
va009039 1:4ff199bddbc1 97 return true;
va009039 1:4ff199bddbc1 98 }
va009039 1:4ff199bddbc1 99 break;
va009039 1:4ff199bddbc1 100 }
va009039 1:4ff199bddbc1 101 return false;
va009039 1:4ff199bddbc1 102 }
va009039 1:4ff199bddbc1 103
va009039 4:05f33cc747fd 104 static int split(myvector<char*> &param, char *buf, const char* delimiters = " ") {
va009039 1:4ff199bddbc1 105 param.clear();
va009039 1:4ff199bddbc1 106 char* p = strtok(buf, delimiters);
va009039 1:4ff199bddbc1 107 while(p != NULL) {
va009039 1:4ff199bddbc1 108 param.push_back(p);
va009039 1:4ff199bddbc1 109 p = strtok(NULL, delimiters);
va009039 1:4ff199bddbc1 110 }
va009039 1:4ff199bddbc1 111 return param.size();
va009039 1:4ff199bddbc1 112 }
va009039 1:4ff199bddbc1 113
va009039 2:e3c085ac77f1 114 ReturnCode_t BaseEmuISP::cmd(const char *str) {
va009039 1:4ff199bddbc1 115 char buf[strlen(str) + 1];
va009039 1:4ff199bddbc1 116 strcpy(buf, str);
va009039 4:05f33cc747fd 117 myvector<char*> p;
va009039 2:e3c085ac77f1 118 if (split(p, buf) == 0) {
va009039 1:4ff199bddbc1 119 return INVALID_COMMAND;
va009039 1:4ff199bddbc1 120 }
va009039 2:e3c085ac77f1 121 vint_t param;
va009039 1:4ff199bddbc1 122 param.push_back(p[0][0]);
va009039 2:e3c085ac77f1 123 for(size_t i = 1; i < p.size(); i++) {
va009039 2:e3c085ac77f1 124 param.push_back(atoi(p[i]));
va009039 1:4ff199bddbc1 125 }
va009039 1:4ff199bddbc1 126 switch(param[0]) {
va009039 2:e3c085ac77f1 127 case 'U': return cmd_u(param);
va009039 2:e3c085ac77f1 128 case 'A': return cmd_a(param);
va009039 2:e3c085ac77f1 129 case 'W': return cmd_w(param);
va009039 2:e3c085ac77f1 130 case 'R': return cmd_r(param);
va009039 2:e3c085ac77f1 131 case 'P': return cmd_p(param);
va009039 2:e3c085ac77f1 132 case 'C': return cmd_c(param);
va009039 2:e3c085ac77f1 133 case 'E': return cmd_e(param);
va009039 2:e3c085ac77f1 134 case 'I': return cmd_i(param);
va009039 2:e3c085ac77f1 135 case 'J': return cmd_j(param);
va009039 2:e3c085ac77f1 136 case 'K': return cmd_k(param);
va009039 2:e3c085ac77f1 137 case 'N': return cmd_n(param);
va009039 2:e3c085ac77f1 138 case 'S': return cmd_s(param);
va009039 1:4ff199bddbc1 139 default: return INVALID_COMMAND;
va009039 1:4ff199bddbc1 140 }
va009039 1:4ff199bddbc1 141 }
va009039 1:4ff199bddbc1 142
va009039 2:e3c085ac77f1 143 ReturnCode_t BaseEmuISP::cmd_a(vint_t &param) {
va009039 2:e3c085ac77f1 144 if (param.size() > 1) {
va009039 2:e3c085ac77f1 145 if (param[1] == 0 || param[1] == 1) {
va009039 2:e3c085ac77f1 146 echoFlag = (param[1] == 1) ? true : false;
va009039 2:e3c085ac77f1 147 return CMD_SUCCESS;
va009039 2:e3c085ac77f1 148 }
va009039 2:e3c085ac77f1 149 }
va009039 2:e3c085ac77f1 150 return PARAM_ERROR;
va009039 2:e3c085ac77f1 151 }
va009039 2:e3c085ac77f1 152
va009039 2:e3c085ac77f1 153 ReturnCode_t BaseEmuISP::cmd_u(vint_t &param) {
va009039 2:e3c085ac77f1 154 if (param.size() > 1) {
va009039 2:e3c085ac77f1 155 if (param[1] == 23130) {
va009039 2:e3c085ac77f1 156 lockFlag = false;
va009039 2:e3c085ac77f1 157 return CMD_SUCCESS;
va009039 2:e3c085ac77f1 158 }
va009039 2:e3c085ac77f1 159 }
va009039 2:e3c085ac77f1 160 return PARAM_ERROR;
va009039 2:e3c085ac77f1 161 }
va009039 2:e3c085ac77f1 162
va009039 2:e3c085ac77f1 163 ReturnCode_t BaseEmuISP::cmd_w(vint_t &param) {
va009039 2:e3c085ac77f1 164 if (param.size() > 2) {
va009039 2:e3c085ac77f1 165 if (param[1] % 4 != 0) {
va009039 2:e3c085ac77f1 166 return ADDR_ERROR;
va009039 2:e3c085ac77f1 167 }
va009039 2:e3c085ac77f1 168 if (param[2] % 4 != 0) {
va009039 2:e3c085ac77f1 169 return COUNT_ERROR;
va009039 2:e3c085ac77f1 170 }
va009039 2:e3c085ac77f1 171 addr = param[1];
va009039 3:ccc673a10485 172 dataCount = param[2];
va009039 2:e3c085ac77f1 173 mode = M_CMD_W_DATA;
va009039 1:4ff199bddbc1 174 return CMD_SUCCESS;
va009039 1:4ff199bddbc1 175 }
va009039 1:4ff199bddbc1 176 return PARAM_ERROR;
va009039 1:4ff199bddbc1 177 }
va009039 1:4ff199bddbc1 178
va009039 2:e3c085ac77f1 179 ReturnCode_t BaseEmuISP::cmd_r(vint_t &param) {
va009039 2:e3c085ac77f1 180 if (param.size() > 2) {
va009039 2:e3c085ac77f1 181 if (param[1] % 4 != 0) {
va009039 2:e3c085ac77f1 182 return ADDR_ERROR;
va009039 2:e3c085ac77f1 183 }
va009039 2:e3c085ac77f1 184 if (param[2] % 4 != 0) {
va009039 2:e3c085ac77f1 185 return COUNT_ERROR;
va009039 2:e3c085ac77f1 186 }
va009039 2:e3c085ac77f1 187 addr = param[1];
va009039 3:ccc673a10485 188 dataCount = param[2];
va009039 2:e3c085ac77f1 189 mode = M_CMD_R_DATA;
va009039 1:4ff199bddbc1 190 return CMD_SUCCESS;
va009039 1:4ff199bddbc1 191 }
va009039 1:4ff199bddbc1 192 return PARAM_ERROR;
va009039 1:4ff199bddbc1 193 }
va009039 1:4ff199bddbc1 194
va009039 2:e3c085ac77f1 195 ReturnCode_t BaseEmuISP::cmd_p(vint_t &param) {
va009039 2:e3c085ac77f1 196 if (param.size() > 2) {
va009039 2:e3c085ac77f1 197 for(int sector = param[1]; sector <= param[2]; sector++) {
va009039 2:e3c085ac77f1 198 if (!Prepare(sector)) {
va009039 2:e3c085ac77f1 199 return INVALID_SECTOR;
va009039 2:e3c085ac77f1 200 }
va009039 2:e3c085ac77f1 201 }
va009039 2:e3c085ac77f1 202 return CMD_SUCCESS;
va009039 1:4ff199bddbc1 203 }
va009039 2:e3c085ac77f1 204 return PARAM_ERROR;
va009039 1:4ff199bddbc1 205 }
va009039 1:4ff199bddbc1 206
va009039 2:e3c085ac77f1 207 ReturnCode_t BaseEmuISP::cmd_c(vint_t &param) {
va009039 2:e3c085ac77f1 208 if (lockFlag) {
va009039 2:e3c085ac77f1 209 return CMD_LOCKED;
va009039 2:e3c085ac77f1 210 }
va009039 2:e3c085ac77f1 211 if (param.size() > 3) {
va009039 2:e3c085ac77f1 212 if (param[1] % 4 != 0) {
va009039 2:e3c085ac77f1 213 return DST_ADDR_ERROR;
va009039 2:e3c085ac77f1 214 }
va009039 2:e3c085ac77f1 215 if (param[2] % 4 != 0) {
va009039 2:e3c085ac77f1 216 return SRC_ADDR_ERROR;
va009039 2:e3c085ac77f1 217 }
va009039 2:e3c085ac77f1 218 if (param[3] != 64 && param[3] != 128 && param[3] != 256 &&
va009039 2:e3c085ac77f1 219 param[3] != 512 && param[3] != 1024) {
va009039 2:e3c085ac77f1 220 return COUNT_ERROR;
va009039 2:e3c085ac77f1 221 }
va009039 2:e3c085ac77f1 222 CopyData(param[1], param[2], param[3]);
va009039 2:e3c085ac77f1 223 return CMD_SUCCESS;
va009039 2:e3c085ac77f1 224 }
va009039 2:e3c085ac77f1 225 return PARAM_ERROR;
va009039 2:e3c085ac77f1 226 }
va009039 2:e3c085ac77f1 227
va009039 2:e3c085ac77f1 228 ReturnCode_t BaseEmuISP::cmd_e(vint_t &param) {
va009039 2:e3c085ac77f1 229 if (lockFlag) {
va009039 2:e3c085ac77f1 230 return CMD_LOCKED;
va009039 1:4ff199bddbc1 231 }
va009039 2:e3c085ac77f1 232 if (param.size() > 2) {
va009039 2:e3c085ac77f1 233 for(int sector = param[1]; sector <= param[2]; sector++) {
va009039 2:e3c085ac77f1 234 if (!Erase(sector)) {
va009039 2:e3c085ac77f1 235 return INVALID_SECTOR;
va009039 2:e3c085ac77f1 236 }
va009039 2:e3c085ac77f1 237 }
va009039 2:e3c085ac77f1 238 return CMD_SUCCESS;
va009039 1:4ff199bddbc1 239 }
va009039 2:e3c085ac77f1 240 return PARAM_ERROR;
va009039 2:e3c085ac77f1 241 }
va009039 2:e3c085ac77f1 242
va009039 2:e3c085ac77f1 243 ReturnCode_t BaseEmuISP::cmd_i(vint_t &param) {
va009039 2:e3c085ac77f1 244 if (param.size() > 2) {
va009039 2:e3c085ac77f1 245 for(int sector = param[1]; sector <= param[2]; sector++) {
va009039 2:e3c085ac77f1 246 if (!Blank(sector)) {
va009039 2:e3c085ac77f1 247 return SECTOR_NOT_BLANK;
va009039 2:e3c085ac77f1 248 }
va009039 2:e3c085ac77f1 249 }
va009039 2:e3c085ac77f1 250 return CMD_SUCCESS;
va009039 2:e3c085ac77f1 251 }
va009039 2:e3c085ac77f1 252 return PARAM_ERROR;
va009039 2:e3c085ac77f1 253 }
va009039 2:e3c085ac77f1 254
va009039 2:e3c085ac77f1 255 ReturnCode_t BaseEmuISP::cmd_j(vint_t &param) {
va009039 2:e3c085ac77f1 256 mode = M_CMD_J;
va009039 1:4ff199bddbc1 257 return CMD_SUCCESS;
va009039 1:4ff199bddbc1 258 }
va009039 1:4ff199bddbc1 259
va009039 2:e3c085ac77f1 260 ReturnCode_t BaseEmuISP::cmd_k(vint_t &param) {
va009039 2:e3c085ac77f1 261 mode = M_CMD_K;
va009039 1:4ff199bddbc1 262 return CMD_SUCCESS;
va009039 1:4ff199bddbc1 263 }
va009039 1:4ff199bddbc1 264
va009039 2:e3c085ac77f1 265 ReturnCode_t BaseEmuISP::cmd_m(vint_t &param) {
va009039 2:e3c085ac77f1 266 if (param.size() > 3) {
va009039 2:e3c085ac77f1 267 if (param[1] % 4 != 0 || param[2] % 4 != 0) {
va009039 2:e3c085ac77f1 268 return ADDR_ERROR;
va009039 2:e3c085ac77f1 269 }
va009039 2:e3c085ac77f1 270 if (param[3] % 4 != 0) {
va009039 2:e3c085ac77f1 271 return COUNT_ERROR;
va009039 2:e3c085ac77f1 272 }
va009039 2:e3c085ac77f1 273 if (!Compare(param[1], param[2], param[3])) {
va009039 2:e3c085ac77f1 274 return COMPARE_ERROR;
va009039 2:e3c085ac77f1 275 }
va009039 2:e3c085ac77f1 276 return CMD_SUCCESS;
va009039 1:4ff199bddbc1 277 }
va009039 2:e3c085ac77f1 278 return PARAM_ERROR;
va009039 2:e3c085ac77f1 279 }
va009039 2:e3c085ac77f1 280
va009039 2:e3c085ac77f1 281 ReturnCode_t BaseEmuISP::cmd_n(vint_t &param) {
va009039 2:e3c085ac77f1 282 mode = M_CMD_N;
va009039 1:4ff199bddbc1 283 return CMD_SUCCESS;
va009039 1:4ff199bddbc1 284 }
va009039 1:4ff199bddbc1 285
va009039 2:e3c085ac77f1 286 ReturnCode_t BaseEmuISP::cmd_s(vint_t &param) {
va009039 2:e3c085ac77f1 287 mode = M_CMD_S;
va009039 1:4ff199bddbc1 288 return CMD_SUCCESS;
va009039 1:4ff199bddbc1 289 }
va009039 1:4ff199bddbc1 290
va009039 4:05f33cc747fd 291 void uudecode(vbyte_t &dst, const char* src) {
va009039 3:ccc673a10485 292 dst.clear();
va009039 3:ccc673a10485 293 int len = strlen(src);
va009039 3:ccc673a10485 294 if (len > 0) {
va009039 3:ccc673a10485 295 size_t size = (src[0]^0x20)&0x3f;
va009039 3:ccc673a10485 296 uint8_t b[4];
va009039 3:ccc673a10485 297 int k = 0;
va009039 3:ccc673a10485 298 for(int i = 1; i < len && dst.size() < size; i++) {
va009039 3:ccc673a10485 299 b[k] = (src[i]^0x20)&0x3f;
va009039 3:ccc673a10485 300 if (k == 0) {
va009039 3:ccc673a10485 301 k++;
va009039 3:ccc673a10485 302 } else if (k == 1) {
va009039 3:ccc673a10485 303 dst.push_back(b[0]<<2|b[1]>>4);
va009039 3:ccc673a10485 304 k++;
va009039 3:ccc673a10485 305 } else if (k == 2) {
va009039 3:ccc673a10485 306 dst.push_back(b[1]<<4|b[2]>>2);
va009039 3:ccc673a10485 307 k++;
va009039 3:ccc673a10485 308 } else {
va009039 3:ccc673a10485 309 dst.push_back(b[2]<<6|b[3]);
va009039 3:ccc673a10485 310 k = 0;
va009039 3:ccc673a10485 311 }
va009039 3:ccc673a10485 312 }
va009039 3:ccc673a10485 313 }
va009039 3:ccc673a10485 314 }
va009039 3:ccc673a10485 315
va009039 3:ccc673a10485 316 bool BaseEmuISP::cmd_w_data() {
va009039 3:ccc673a10485 317 int c;
va009039 3:ccc673a10485 318 switch(seq) {
va009039 3:ccc673a10485 319 case 0:
va009039 3:ccc673a10485 320 dataCurrent = 0;
va009039 3:ccc673a10485 321 if (UuencodeMode()) {
va009039 3:ccc673a10485 322 seq = 2;
va009039 3:ccc673a10485 323 } else {
va009039 3:ccc673a10485 324 seq = 1;
va009039 3:ccc673a10485 325 }
va009039 3:ccc673a10485 326 break;
va009039 3:ccc673a10485 327 case 1: // binary mode
va009039 3:ccc673a10485 328 if (dataCurrent >= dataCount) {
va009039 3:ccc673a10485 329 return true;
va009039 3:ccc673a10485 330 }
va009039 3:ccc673a10485 331 c = Getch();
va009039 3:ccc673a10485 332 if (c != (-1)) {
va009039 3:ccc673a10485 333 if (echoFlag) {
va009039 3:ccc673a10485 334 Putch(c);
va009039 3:ccc673a10485 335 }
va009039 3:ccc673a10485 336 WriteData(addr++, c);
va009039 3:ccc673a10485 337 dataCurrent++;
va009039 3:ccc673a10485 338 }
va009039 3:ccc673a10485 339 break;
va009039 3:ccc673a10485 340 case 2: // uuencode mode
va009039 3:ccc673a10485 341 dataLine = 0;
va009039 3:ccc673a10485 342 dataCksum = 0;
va009039 4:05f33cc747fd 343 line.Clear();
va009039 3:ccc673a10485 344 seq++;
va009039 3:ccc673a10485 345 break;
va009039 3:ccc673a10485 346 case 3: // uu data start
va009039 3:ccc673a10485 347 if (line_proc()) {
va009039 3:ccc673a10485 348 vbyte_t data;
va009039 4:05f33cc747fd 349 uudecode(data, line.C_str());
va009039 3:ccc673a10485 350 for(size_t i = 0; i < data.size(); i++) {
va009039 3:ccc673a10485 351 int c = data[i];
va009039 3:ccc673a10485 352 WriteData(addr++, c);
va009039 3:ccc673a10485 353 dataCksum += c;
va009039 3:ccc673a10485 354 dataCurrent++;
va009039 3:ccc673a10485 355 }
va009039 3:ccc673a10485 356 dataLine++;
va009039 3:ccc673a10485 357 if (dataLine >= 20 || dataCurrent>= dataCount) {
va009039 3:ccc673a10485 358 seq++;
va009039 3:ccc673a10485 359 }
va009039 4:05f33cc747fd 360 line.Clear();
va009039 3:ccc673a10485 361 }
va009039 3:ccc673a10485 362 break;
va009039 3:ccc673a10485 363 case 4: // check sum
va009039 3:ccc673a10485 364 if (line_proc()) {
va009039 4:05f33cc747fd 365 if (line == dataCksum) {
va009039 3:ccc673a10485 366 putln("OK");
va009039 3:ccc673a10485 367 if (dataCurrent >= dataCount) {
va009039 3:ccc673a10485 368 mode = M_CMD;
va009039 3:ccc673a10485 369 } else {
va009039 3:ccc673a10485 370 seq = 2;
va009039 3:ccc673a10485 371 }
va009039 3:ccc673a10485 372 } else {
va009039 3:ccc673a10485 373 putln("RESEND");
va009039 3:ccc673a10485 374 seq = 2;
va009039 3:ccc673a10485 375 }
va009039 3:ccc673a10485 376 }
va009039 3:ccc673a10485 377 break;
va009039 3:ccc673a10485 378 }
va009039 3:ccc673a10485 379 return false;
va009039 3:ccc673a10485 380 }
va009039 3:ccc673a10485 381
va009039 3:ccc673a10485 382 bool BaseEmuISP::cmd_r_data() {
va009039 3:ccc673a10485 383 int c;
va009039 3:ccc673a10485 384 switch(seq) {
va009039 3:ccc673a10485 385 case 0:
va009039 3:ccc673a10485 386 dataCurrent = 0;
va009039 3:ccc673a10485 387 if (UuencodeMode()) {
va009039 3:ccc673a10485 388 dataLine = 0;
va009039 3:ccc673a10485 389 dataCksum = 0;
va009039 4:05f33cc747fd 390 line.Clear();
va009039 3:ccc673a10485 391 seq = 2;
va009039 3:ccc673a10485 392 } else {
va009039 3:ccc673a10485 393 seq = 1;
va009039 3:ccc673a10485 394 }
va009039 3:ccc673a10485 395 break;
va009039 3:ccc673a10485 396 case 1: // binary mode
va009039 3:ccc673a10485 397 if (dataCurrent >= dataCount) {
va009039 3:ccc673a10485 398 return true;
va009039 3:ccc673a10485 399 }
va009039 3:ccc673a10485 400 c = ReadData(addr++);
va009039 3:ccc673a10485 401 Putch(c);
va009039 3:ccc673a10485 402 dataCurrent++;
va009039 3:ccc673a10485 403 break;
va009039 3:ccc673a10485 404 case 2:
va009039 3:ccc673a10485 405 break;
va009039 3:ccc673a10485 406 }
va009039 3:ccc673a10485 407 return false;
va009039 3:ccc673a10485 408 }
va009039 3:ccc673a10485 409
va009039 3:ccc673a10485 410
va009039 1:4ff199bddbc1 411 void BaseEmuISP::putln(const char *s) {
va009039 1:4ff199bddbc1 412 debugPrintf("send: %s<CR><LF>\n", s);
va009039 1:4ff199bddbc1 413 while(*s) {
va009039 1:4ff199bddbc1 414 Putch(*s++);
va009039 1:4ff199bddbc1 415 }
va009039 1:4ff199bddbc1 416 Putch('\r');
va009039 1:4ff199bddbc1 417 Putch('\n');
va009039 1:4ff199bddbc1 418 }
va009039 1:4ff199bddbc1 419
va009039 1:4ff199bddbc1 420 bool BaseEmuISP::line_proc() {
va009039 1:4ff199bddbc1 421 int c = Getch();
va009039 1:4ff199bddbc1 422 if (c != (-1)) {
va009039 1:4ff199bddbc1 423 if (echoFlag) {
va009039 4:05f33cc747fd 424 if (version.Major >= 4 || c != '\n') {
va009039 3:ccc673a10485 425 Putch(c);
va009039 3:ccc673a10485 426 }
va009039 1:4ff199bddbc1 427 }
va009039 1:4ff199bddbc1 428 if (c == '\n') {
va009039 1:4ff199bddbc1 429 debugPrintf("<LF>\n");
va009039 1:4ff199bddbc1 430 return true;
va009039 1:4ff199bddbc1 431 } else if (c == '\r') {
va009039 1:4ff199bddbc1 432 debugPrintf("<CR>");
va009039 1:4ff199bddbc1 433 } else {
va009039 4:05f33cc747fd 434 if (line.Size() == 0) {
va009039 1:4ff199bddbc1 435 debugPrintf("recv: ");
va009039 1:4ff199bddbc1 436 }
va009039 1:4ff199bddbc1 437 debugPrintf("%c", c);
va009039 1:4ff199bddbc1 438 line += c;
va009039 1:4ff199bddbc1 439 }
va009039 2:e3c085ac77f1 440 }
va009039 1:4ff199bddbc1 441 return false;
va009039 1:4ff199bddbc1 442 }
va009039 1:4ff199bddbc1 443
va009039 1:4ff199bddbc1 444 void BaseEmuISP::debugPrintf(const char *format, ...) {
va009039 1:4ff199bddbc1 445 char buf[256];
va009039 1:4ff199bddbc1 446 va_list args;
va009039 1:4ff199bddbc1 447 va_start(args, format);
va009039 1:4ff199bddbc1 448 vsprintf(buf, format, args);
va009039 1:4ff199bddbc1 449 for(const char *s = buf; *s; s++) {
va009039 1:4ff199bddbc1 450 DebugPutch(*s);
va009039 1:4ff199bddbc1 451 }
va009039 1:4ff199bddbc1 452 va_end(args);
va009039 1:4ff199bddbc1 453 }
va009039 1:4ff199bddbc1 454