Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
BaseEmuISP.cpp@4:05f33cc747fd, 2016-03-23 (annotated)
- 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?
| User | Revision | Line number | New 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*> ¶m, 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 ¶m) { |
| 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 ¶m) { |
| 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 ¶m) { |
| 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 ¶m) { |
| 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 ¶m) { |
| 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 ¶m) { |
| 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 ¶m) { |
| 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 ¶m) { |
| 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 ¶m) { |
| 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 ¶m) { |
| 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 ¶m) { |
| 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 ¶m) { |
| 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 ¶m) { |
| 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 |