Mercurial > vba-clojure
diff src/gba/remote.cpp @ 22:8870086b716c
remote.cpp must include config.h
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sun, 04 Mar 2012 17:35:30 -0600 |
parents | e0545ef33bb9 |
children |
line wrap: on
line diff
1.1 --- a/src/gba/remote.cpp Sun Mar 04 16:56:20 2012 -0600 1.2 +++ b/src/gba/remote.cpp Sun Mar 04 17:35:30 2012 -0600 1.3 @@ -1,6 +1,7 @@ 1.4 #include <cstdlib> 1.5 #include <cstdio> 1.6 #include <cstring> 1.7 +#include <config.h> 1.8 1.9 #ifndef WIN32 1.10 # include <unistd.h> 1.11 @@ -51,150 +52,147 @@ 1.12 #if (defined WIN32 && !defined SDL) 1.13 void remoteSetSockets(SOCKET l, SOCKET r) 1.14 { 1.15 - remoteSocket = r; 1.16 - remoteListenSocket = l; 1.17 + remoteSocket = r; 1.18 + remoteListenSocket = l; 1.19 } 1.20 1.21 #endif 1.22 1.23 int remoteTcpSend(char *data, int len) 1.24 { 1.25 - return send(remoteSocket, data, len, 0); 1.26 + return send(remoteSocket, data, len, 0); 1.27 } 1.28 1.29 int remoteTcpRecv(char *data, int len) 1.30 { 1.31 - return recv(remoteSocket, data, len, 0); 1.32 + return recv(remoteSocket, data, len, 0); 1.33 } 1.34 1.35 bool remoteTcpInit() 1.36 { 1.37 - if (remoteSocket == -1) 1.38 - { 1.39 + if (remoteSocket == -1) 1.40 + { 1.41 #ifdef WIN32 1.42 - WSADATA wsaData; 1.43 - int error = WSAStartup(MAKEWORD(1, 1), &wsaData); 1.44 + WSADATA wsaData; 1.45 + int error = WSAStartup(MAKEWORD(1, 1), &wsaData); 1.46 #endif // WIN32 1.47 - int s = socket(PF_INET, SOCK_STREAM, 0); 1.48 + int s = socket(PF_INET, SOCK_STREAM, 0); 1.49 1.50 - remoteListenSocket = s; 1.51 + remoteListenSocket = s; 1.52 1.53 - if (s < 0) 1.54 - { 1.55 - fprintf(stderr, "Error opening socket\n"); 1.56 - exit(-1); 1.57 - } 1.58 - int tmp = 1; 1.59 - setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp, sizeof(tmp)); 1.60 + if (s < 0) 1.61 + { 1.62 + fprintf(stderr, "Error opening socket\n"); 1.63 + exit(-1); 1.64 + } 1.65 + int tmp = 1; 1.66 + setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp, sizeof(tmp)); 1.67 1.68 - // char hostname[256]; 1.69 - // gethostname(hostname, 256); 1.70 + // char hostname[256]; 1.71 + // gethostname(hostname, 256); 1.72 1.73 - // hostent *ent = gethostbyname(hostname); 1.74 - // unsigned long a = *((unsigned long *)ent->h_addr); 1.75 + // hostent *ent = gethostbyname(hostname); 1.76 + // unsigned long a = *((unsigned long *)ent->h_addr); 1.77 1.78 - sockaddr_in addr; 1.79 - addr.sin_family = AF_INET; 1.80 - addr.sin_port = htons(remotePort); 1.81 - addr.sin_addr.s_addr = htonl(0); 1.82 - int count = 0; 1.83 - while (count < 3) 1.84 - { 1.85 - if (bind(s, (sockaddr *)&addr, sizeof(addr))) 1.86 - { 1.87 - addr.sin_port = htons(ntohs(addr.sin_port)+1); 1.88 - } 1.89 - else 1.90 - break; 1.91 - } 1.92 - if (count == 3) 1.93 - { 1.94 - fprintf(stderr, "Error binding \n"); 1.95 - exit(-1); 1.96 - } 1.97 + sockaddr_in addr; 1.98 + addr.sin_family = AF_INET; 1.99 + addr.sin_port = htons(remotePort); 1.100 + addr.sin_addr.s_addr = htonl(0); 1.101 + int count = 0; 1.102 + while (count < 3) 1.103 + { 1.104 + if (bind(s, (sockaddr *)&addr, sizeof(addr))) 1.105 + { 1.106 + addr.sin_port = htons(ntohs(addr.sin_port)+1); 1.107 + } 1.108 + else 1.109 + break; 1.110 + } 1.111 + if (count == 3) 1.112 + { 1.113 + fprintf(stderr, "Error binding \n"); 1.114 + exit(-1); 1.115 + } 1.116 1.117 - fprintf(stderr, "Listening for a connection at port %d\n", 1.118 - ntohs(addr.sin_port)); 1.119 + fprintf(stderr, "Listening for a connection at port %d\n", 1.120 + ntohs(addr.sin_port)); 1.121 1.122 - if (listen(s, 1)) 1.123 - { 1.124 - fprintf(stderr, "Error listening\n"); 1.125 - exit(-1); 1.126 - } 1.127 - 1.128 + if (listen(s, 1)) 1.129 + { 1.130 + fprintf(stderr, "Error listening\n"); 1.131 + exit(-1); 1.132 + } 1.133 + socklen_t len = sizeof(addr); 1.134 1.135 #ifdef WIN32 1.136 - int flag = 0; 1.137 - ioctlsocket(s, FIONBIO, (unsigned long *)&flag); 1.138 + int flag = 0; 1.139 + ioctlsocket(s, FIONBIO, (unsigned long *)&flag); 1.140 #endif // WIN32 1.141 - 1.142 - socklen_t len = sizeof(addr); 1.143 - 1.144 - int s2 = accept(s, (sockaddr *)&addr, &len); 1.145 - if (s2 > 0) 1.146 - { 1.147 - fprintf(stderr, "Got a connection from %s %d\n", 1.148 - inet_ntoa((in_addr)addr.sin_addr), 1.149 - ntohs(addr.sin_port)); 1.150 + int s2 = accept(s, (sockaddr *)&addr, &len); 1.151 + if (s2 > 0) 1.152 + { 1.153 + fprintf(stderr, "Got a connection from %s %d\n", 1.154 + inet_ntoa((in_addr)addr.sin_addr), 1.155 + ntohs(addr.sin_port)); 1.156 + } 1.157 + else 1.158 + { 1.159 +#ifdef WIN32 1.160 + int error = WSAGetLastError(); 1.161 +#endif // WIN32 1.162 + } 1.163 + char dummy; 1.164 + recv(s2, &dummy, 1, 0); 1.165 + if (dummy != '+') 1.166 + { 1.167 + fprintf(stderr, "ACK not received\n"); 1.168 + exit(-1); 1.169 + } 1.170 + remoteSocket = s2; 1.171 + // close(s); 1.172 } 1.173 - else 1.174 - { 1.175 -#ifdef WIN32 1.176 - int error = WSAGetLastError(); 1.177 -#endif // WIN32 1.178 - } 1.179 - char dummy; 1.180 - recv(s2, &dummy, 1, 0); 1.181 - if (dummy != '+') 1.182 - { 1.183 - fprintf(stderr, "ACK not received\n"); 1.184 - exit(-1); 1.185 - } 1.186 - remoteSocket = s2; 1.187 - // close(s); 1.188 - } 1.189 - return true; 1.190 + return true; 1.191 } 1.192 1.193 void remoteTcpCleanUp() 1.194 { 1.195 - if (remoteSocket > 0) 1.196 - { 1.197 - fprintf(stderr, "Closing remote socket\n"); 1.198 - close(remoteSocket); 1.199 - remoteSocket = -1; 1.200 - } 1.201 - if (remoteListenSocket > 0) 1.202 - { 1.203 - fprintf(stderr, "Closing listen socket\n"); 1.204 - close(remoteListenSocket); 1.205 - remoteListenSocket = -1; 1.206 - } 1.207 + if (remoteSocket > 0) 1.208 + { 1.209 + fprintf(stderr, "Closing remote socket\n"); 1.210 + close(remoteSocket); 1.211 + remoteSocket = -1; 1.212 + } 1.213 + if (remoteListenSocket > 0) 1.214 + { 1.215 + fprintf(stderr, "Closing listen socket\n"); 1.216 + close(remoteListenSocket); 1.217 + remoteListenSocket = -1; 1.218 + } 1.219 } 1.220 1.221 int remotePipeSend(char *data, int len) 1.222 { 1.223 - int res = write(1, data, len); 1.224 - return res; 1.225 + int res = write(1, data, len); 1.226 + return res; 1.227 } 1.228 1.229 int remotePipeRecv(char *data, int len) 1.230 { 1.231 - int res = read(0, data, len); 1.232 - return res; 1.233 + int res = read(0, data, len); 1.234 + return res; 1.235 } 1.236 1.237 bool remotePipeInit() 1.238 { 1.239 - char dummy; 1.240 - read(0, &dummy, 1); 1.241 - if (dummy != '+') 1.242 - { 1.243 - fprintf(stderr, "ACK not received\n"); 1.244 - exit(-1); 1.245 - } 1.246 + char dummy; 1.247 + read(0, &dummy, 1); 1.248 + if (dummy != '+') 1.249 + { 1.250 + fprintf(stderr, "ACK not received\n"); 1.251 + exit(-1); 1.252 + } 1.253 1.254 - return true; 1.255 + return true; 1.256 } 1.257 1.258 void remotePipeCleanUp() 1.259 @@ -202,514 +200,514 @@ 1.260 1.261 void remoteSetPort(int port) 1.262 { 1.263 - remotePort = port; 1.264 + remotePort = port; 1.265 } 1.266 1.267 void remoteSetProtocol(int p) 1.268 { 1.269 - if (p == 0) 1.270 - { 1.271 - remoteSendFnc = remoteTcpSend; 1.272 - remoteRecvFnc = remoteTcpRecv; 1.273 - remoteInitFnc = remoteTcpInit; 1.274 - remoteCleanUpFnc = remoteTcpCleanUp; 1.275 - } 1.276 - else 1.277 - { 1.278 - remoteSendFnc = remotePipeSend; 1.279 - remoteRecvFnc = remotePipeRecv; 1.280 - remoteInitFnc = remotePipeInit; 1.281 - remoteCleanUpFnc = remotePipeCleanUp; 1.282 - } 1.283 + if (p == 0) 1.284 + { 1.285 + remoteSendFnc = remoteTcpSend; 1.286 + remoteRecvFnc = remoteTcpRecv; 1.287 + remoteInitFnc = remoteTcpInit; 1.288 + remoteCleanUpFnc = remoteTcpCleanUp; 1.289 + } 1.290 + else 1.291 + { 1.292 + remoteSendFnc = remotePipeSend; 1.293 + remoteRecvFnc = remotePipeRecv; 1.294 + remoteInitFnc = remotePipeInit; 1.295 + remoteCleanUpFnc = remotePipeCleanUp; 1.296 + } 1.297 } 1.298 1.299 void remoteInit() 1.300 { 1.301 - if (remoteInitFnc) 1.302 - remoteInitFnc(); 1.303 + if (remoteInitFnc) 1.304 + remoteInitFnc(); 1.305 } 1.306 1.307 void remotePutPacket(char *packet) 1.308 { 1.309 - char *hex = "0123456789abcdef"; 1.310 - char buffer[1024]; 1.311 + char *hex = "0123456789abcdef"; 1.312 + char buffer[1024]; 1.313 1.314 - int count = strlen(packet); 1.315 + int count = strlen(packet); 1.316 1.317 - unsigned char csum = 0; 1.318 + unsigned char csum = 0; 1.319 1.320 - char *p = buffer; 1.321 - *p++ = '$'; 1.322 + char *p = buffer; 1.323 + *p++ = '$'; 1.324 1.325 - for (int i = 0; i < count; i++) 1.326 - { 1.327 - csum += packet[i]; 1.328 - *p++ = packet[i]; 1.329 - } 1.330 - *p++ = '#'; 1.331 - *p++ = hex[csum>>4]; 1.332 - *p++ = hex[csum & 15]; 1.333 - *p++ = 0; 1.334 - // printf("Sending %s\n", buffer); 1.335 - remoteSendFnc(buffer, count + 4); 1.336 + for (int i = 0; i < count; i++) 1.337 + { 1.338 + csum += packet[i]; 1.339 + *p++ = packet[i]; 1.340 + } 1.341 + *p++ = '#'; 1.342 + *p++ = hex[csum>>4]; 1.343 + *p++ = hex[csum & 15]; 1.344 + *p++ = 0; 1.345 + // printf("Sending %s\n", buffer); 1.346 + remoteSendFnc(buffer, count + 4); 1.347 1.348 - char c = 0; 1.349 - remoteRecvFnc(&c, 1); 1.350 - /* 1.351 - if(c == '+') 1.352 - printf("ACK\n"); 1.353 - else if(c=='-') 1.354 - printf("NACK\n"); 1.355 - */ 1.356 + char c = 0; 1.357 + remoteRecvFnc(&c, 1); 1.358 + /* 1.359 + if(c == '+') 1.360 + printf("ACK\n"); 1.361 + else if(c=='-') 1.362 + printf("NACK\n"); 1.363 + */ 1.364 } 1.365 1.366 void remoteOutput(char *s, u32 addr) 1.367 { 1.368 - char buffer[16384]; 1.369 + char buffer[16384]; 1.370 1.371 - char *d = buffer; 1.372 - *d++ = 'O'; 1.373 + char *d = buffer; 1.374 + *d++ = 'O'; 1.375 1.376 - if (s) 1.377 - { 1.378 - char c = *s++; 1.379 - while (c) 1.380 + if (s) 1.381 { 1.382 - sprintf(d, "%02x", c); 1.383 - d += 2; 1.384 - c = *s++; 1.385 + char c = *s++; 1.386 + while (c) 1.387 + { 1.388 + sprintf(d, "%02x", c); 1.389 + d += 2; 1.390 + c = *s++; 1.391 + } 1.392 } 1.393 - } 1.394 - else 1.395 - { 1.396 - char c = debuggerReadByte(addr); 1.397 - addr++; 1.398 - while (c) 1.399 + else 1.400 { 1.401 - sprintf(d, "%02x", c); 1.402 - d += 2; 1.403 - c = debuggerReadByte(addr); 1.404 - addr++; 1.405 + char c = debuggerReadByte(addr); 1.406 + addr++; 1.407 + while (c) 1.408 + { 1.409 + sprintf(d, "%02x", c); 1.410 + d += 2; 1.411 + c = debuggerReadByte(addr); 1.412 + addr++; 1.413 + } 1.414 } 1.415 - } 1.416 - remotePutPacket(buffer); 1.417 - // fprintf(stderr, "Output sent %s\n", buffer); 1.418 + remotePutPacket(buffer); 1.419 + // fprintf(stderr, "Output sent %s\n", buffer); 1.420 } 1.421 1.422 void remoteSendSignal() 1.423 { 1.424 - char buffer[1024]; 1.425 - sprintf(buffer, "S%02x", remoteSignal); 1.426 - remotePutPacket(buffer); 1.427 + char buffer[1024]; 1.428 + sprintf(buffer, "S%02x", remoteSignal); 1.429 + remotePutPacket(buffer); 1.430 } 1.431 1.432 void remoteSendStatus() 1.433 { 1.434 - char buffer[1024]; 1.435 - sprintf(buffer, "T%02x", remoteSignal); 1.436 - char *s = buffer; 1.437 - s += 3; 1.438 - for (int i = 0; i < 15; i++) 1.439 - { 1.440 - u32 v = reg[i].I; 1.441 - sprintf(s, "%02x:%02x%02x%02x%02x;", i, 1.442 - (v & 255), 1.443 - (v >> 8) & 255, 1.444 - (v >> 16) & 255, 1.445 - (v >> 24) & 255); 1.446 - s += 12; 1.447 - } 1.448 - u32 v = armNextPC; 1.449 - sprintf(s, "0f:%02x%02x%02x%02x;", (v & 255), 1.450 - (v >> 8) & 255, 1.451 - (v >> 16) & 255, 1.452 - (v >> 24) & 255); 1.453 - s += 12; 1.454 - CPUUpdateCPSR(); 1.455 - v = reg[16].I; 1.456 - sprintf(s, "19:%02x%02x%02x%02x;", (v & 255), 1.457 - (v >> 8) & 255, 1.458 - (v >> 16) & 255, 1.459 - (v >> 24) & 255); 1.460 - s += 12; 1.461 - *s = 0; 1.462 - // printf("Sending %s\n", buffer); 1.463 - remotePutPacket(buffer); 1.464 + char buffer[1024]; 1.465 + sprintf(buffer, "T%02x", remoteSignal); 1.466 + char *s = buffer; 1.467 + s += 3; 1.468 + for (int i = 0; i < 15; i++) 1.469 + { 1.470 + u32 v = reg[i].I; 1.471 + sprintf(s, "%02x:%02x%02x%02x%02x;", i, 1.472 + (v & 255), 1.473 + (v >> 8) & 255, 1.474 + (v >> 16) & 255, 1.475 + (v >> 24) & 255); 1.476 + s += 12; 1.477 + } 1.478 + u32 v = armNextPC; 1.479 + sprintf(s, "0f:%02x%02x%02x%02x;", (v & 255), 1.480 + (v >> 8) & 255, 1.481 + (v >> 16) & 255, 1.482 + (v >> 24) & 255); 1.483 + s += 12; 1.484 + CPUUpdateCPSR(); 1.485 + v = reg[16].I; 1.486 + sprintf(s, "19:%02x%02x%02x%02x;", (v & 255), 1.487 + (v >> 8) & 255, 1.488 + (v >> 16) & 255, 1.489 + (v >> 24) & 255); 1.490 + s += 12; 1.491 + *s = 0; 1.492 + // printf("Sending %s\n", buffer); 1.493 + remotePutPacket(buffer); 1.494 } 1.495 1.496 void remoteBinaryWrite(char *p) 1.497 { 1.498 - u32 address; 1.499 - int count; 1.500 - sscanf(p, "%x,%x:", &address, &count); 1.501 - // printf("Binary write for %08x %d\n", address, count); 1.502 + u32 address; 1.503 + int count; 1.504 + sscanf(p, "%x,%x:", &address, &count); 1.505 + // printf("Binary write for %08x %d\n", address, count); 1.506 1.507 - p = strchr(p, ':'); 1.508 - p++; 1.509 - for (int i = 0; i < count; i++) 1.510 - { 1.511 - u8 b = *p++; 1.512 - switch (b) 1.513 + p = strchr(p, ':'); 1.514 + p++; 1.515 + for (int i = 0; i < count; i++) 1.516 { 1.517 - case 0x7d: 1.518 - b = *p++; 1.519 - debuggerWriteByte(address, (b^0x20)); 1.520 - address++; 1.521 - break; 1.522 - default: 1.523 - debuggerWriteByte(address, b); 1.524 - address++; 1.525 - break; 1.526 + u8 b = *p++; 1.527 + switch (b) 1.528 + { 1.529 + case 0x7d: 1.530 + b = *p++; 1.531 + debuggerWriteByte(address, (b^0x20)); 1.532 + address++; 1.533 + break; 1.534 + default: 1.535 + debuggerWriteByte(address, b); 1.536 + address++; 1.537 + break; 1.538 + } 1.539 } 1.540 - } 1.541 - // printf("ROM is %08x\n", debuggerReadMemory(0x8000254)); 1.542 - remotePutPacket("OK"); 1.543 + // printf("ROM is %08x\n", debuggerReadMemory(0x8000254)); 1.544 + remotePutPacket("OK"); 1.545 } 1.546 1.547 void remoteMemoryWrite(char *p) 1.548 { 1.549 - u32 address; 1.550 - int count; 1.551 - sscanf(p, "%x,%x:", &address, &count); 1.552 - // printf("Memory write for %08x %d\n", address, count); 1.553 + u32 address; 1.554 + int count; 1.555 + sscanf(p, "%x,%x:", &address, &count); 1.556 + // printf("Memory write for %08x %d\n", address, count); 1.557 1.558 - p = strchr(p, ':'); 1.559 - p++; 1.560 - for (int i = 0; i < count; i++) 1.561 - { 1.562 - u8 v = 0; 1.563 - char c = *p++; 1.564 - if (c <= '9') 1.565 - v = (c - '0') << 4; 1.566 - else 1.567 - v = (c + 10 - 'a') << 4; 1.568 - c = *p++; 1.569 - if (c <= '9') 1.570 - v += (c - '0'); 1.571 - else 1.572 - v += (c + 10 - 'a'); 1.573 - debuggerWriteByte(address, v); 1.574 - address++; 1.575 - } 1.576 - // printf("ROM is %08x\n", debuggerReadMemory(0x8000254)); 1.577 - remotePutPacket("OK"); 1.578 + p = strchr(p, ':'); 1.579 + p++; 1.580 + for (int i = 0; i < count; i++) 1.581 + { 1.582 + u8 v = 0; 1.583 + char c = *p++; 1.584 + if (c <= '9') 1.585 + v = (c - '0') << 4; 1.586 + else 1.587 + v = (c + 10 - 'a') << 4; 1.588 + c = *p++; 1.589 + if (c <= '9') 1.590 + v += (c - '0'); 1.591 + else 1.592 + v += (c + 10 - 'a'); 1.593 + debuggerWriteByte(address, v); 1.594 + address++; 1.595 + } 1.596 + // printf("ROM is %08x\n", debuggerReadMemory(0x8000254)); 1.597 + remotePutPacket("OK"); 1.598 } 1.599 1.600 void remoteMemoryRead(char *p) 1.601 { 1.602 - u32 address; 1.603 - int count; 1.604 - sscanf(p, "%x,%x:", &address, &count); 1.605 - // printf("Memory read for %08x %d\n", address, count); 1.606 + u32 address; 1.607 + int count; 1.608 + sscanf(p, "%x,%x:", &address, &count); 1.609 + // printf("Memory read for %08x %d\n", address, count); 1.610 1.611 - char buffer[1024]; 1.612 + char buffer[1024]; 1.613 1.614 - char *s = buffer; 1.615 - for (int i = 0; i < count; i++) 1.616 - { 1.617 - u8 b = debuggerReadByte(address); 1.618 - sprintf(s, "%02x", b); 1.619 - address++; 1.620 - s += 2; 1.621 - } 1.622 - *s = 0; 1.623 - remotePutPacket(buffer); 1.624 + char *s = buffer; 1.625 + for (int i = 0; i < count; i++) 1.626 + { 1.627 + u8 b = debuggerReadByte(address); 1.628 + sprintf(s, "%02x", b); 1.629 + address++; 1.630 + s += 2; 1.631 + } 1.632 + *s = 0; 1.633 + remotePutPacket(buffer); 1.634 } 1.635 1.636 void remoteStepOverRange(char *p) 1.637 { 1.638 - u32 address; 1.639 - u32 final; 1.640 - sscanf(p, "%x,%x", &address, &final); 1.641 + u32 address; 1.642 + u32 final; 1.643 + sscanf(p, "%x,%x", &address, &final); 1.644 1.645 - remotePutPacket("OK"); 1.646 + remotePutPacket("OK"); 1.647 1.648 - remoteResumed = true; 1.649 - do 1.650 - { 1.651 - CPULoop(1); 1.652 - if (debugger) 1.653 - break; 1.654 - } 1.655 - while (armNextPC >= address && armNextPC < final); 1.656 + remoteResumed = true; 1.657 + do 1.658 + { 1.659 + CPULoop(1); 1.660 + if (debugger) 1.661 + break; 1.662 + } 1.663 + while (armNextPC >= address && armNextPC < final); 1.664 1.665 - remoteResumed = false; 1.666 + remoteResumed = false; 1.667 1.668 - remoteSendStatus(); 1.669 + remoteSendStatus(); 1.670 } 1.671 1.672 void remoteWriteWatch(char *p, bool active) 1.673 { 1.674 - u32 address; 1.675 - int count; 1.676 - sscanf(p, ",%x,%x#", &address, &count); 1.677 + u32 address; 1.678 + int count; 1.679 + sscanf(p, ",%x,%x#", &address, &count); 1.680 1.681 - fprintf(stderr, "Write watch for %08x %d\n", address, count); 1.682 + fprintf(stderr, "Write watch for %08x %d\n", address, count); 1.683 1.684 - if (address < 0x2000000 || address > 0x3007fff) 1.685 - { 1.686 - remotePutPacket("E01"); 1.687 - return; 1.688 - } 1.689 + if (address < 0x2000000 || address > 0x3007fff) 1.690 + { 1.691 + remotePutPacket("E01"); 1.692 + return; 1.693 + } 1.694 1.695 - if (address > 0x203ffff && address < 0x3000000) 1.696 - { 1.697 - remotePutPacket("E01"); 1.698 - return; 1.699 - } 1.700 + if (address > 0x203ffff && address < 0x3000000) 1.701 + { 1.702 + remotePutPacket("E01"); 1.703 + return; 1.704 + } 1.705 1.706 - u32 final = address + count; 1.707 + u32 final = address + count; 1.708 1.709 - if (address < 0x2040000 && final > 0x2040000) 1.710 - { 1.711 - remotePutPacket("E01"); 1.712 - return; 1.713 - } 1.714 - else if (address < 0x3008000 && final > 0x3008000) 1.715 - { 1.716 - remotePutPacket("E01"); 1.717 - return; 1.718 - } 1.719 + if (address < 0x2040000 && final > 0x2040000) 1.720 + { 1.721 + remotePutPacket("E01"); 1.722 + return; 1.723 + } 1.724 + else if (address < 0x3008000 && final > 0x3008000) 1.725 + { 1.726 + remotePutPacket("E01"); 1.727 + return; 1.728 + } 1.729 1.730 - for (int i = 0; i < count; i++) 1.731 - { 1.732 - if ((address >> 24) == 2) 1.733 - freezeWorkRAM[address & 0x3ffff] = active; 1.734 - else 1.735 - freezeInternalRAM[address & 0x7fff] = active; 1.736 - address++; 1.737 - } 1.738 + for (int i = 0; i < count; i++) 1.739 + { 1.740 + if ((address >> 24) == 2) 1.741 + freezeWorkRAM[address & 0x3ffff] = active; 1.742 + else 1.743 + freezeInternalRAM[address & 0x7fff] = active; 1.744 + address++; 1.745 + } 1.746 1.747 - remotePutPacket("OK"); 1.748 + remotePutPacket("OK"); 1.749 } 1.750 1.751 void remoteReadRegisters(char *p) 1.752 { 1.753 - char buffer[1024]; 1.754 + char buffer[1024]; 1.755 1.756 - char *s = buffer; 1.757 - int i; 1.758 - // regular registers 1.759 - for (i = 0; i < 15; i++) 1.760 - { 1.761 - u32 v = reg[i].I; 1.762 - sprintf(s, "%02x%02x%02x%02x", v & 255, (v >> 8) & 255, 1.763 - (v >> 16) & 255, (v >> 24) & 255); 1.764 - s += 8; 1.765 - } 1.766 - // PC 1.767 - u32 pc = armNextPC; 1.768 - sprintf(s, "%02x%02x%02x%02x", pc & 255, (pc >> 8) & 255, 1.769 - (pc >> 16) & 255, (pc >> 24) & 255); 1.770 - s += 8; 1.771 + char *s = buffer; 1.772 + int i; 1.773 + // regular registers 1.774 + for (i = 0; i < 15; i++) 1.775 + { 1.776 + u32 v = reg[i].I; 1.777 + sprintf(s, "%02x%02x%02x%02x", v & 255, (v >> 8) & 255, 1.778 + (v >> 16) & 255, (v >> 24) & 255); 1.779 + s += 8; 1.780 + } 1.781 + // PC 1.782 + u32 pc = armNextPC; 1.783 + sprintf(s, "%02x%02x%02x%02x", pc & 255, (pc >> 8) & 255, 1.784 + (pc >> 16) & 255, (pc >> 24) & 255); 1.785 + s += 8; 1.786 1.787 - // floating point registers (24-bit) 1.788 - for (i = 0; i < 8; i++) 1.789 - { 1.790 - sprintf(s, "000000000000000000000000"); 1.791 - s += 24; 1.792 - } 1.793 + // floating point registers (24-bit) 1.794 + for (i = 0; i < 8; i++) 1.795 + { 1.796 + sprintf(s, "000000000000000000000000"); 1.797 + s += 24; 1.798 + } 1.799 1.800 - // FP status register 1.801 - sprintf(s, "00000000"); 1.802 - s += 8; 1.803 - // CPSR 1.804 - CPUUpdateCPSR(); 1.805 - u32 v = reg[16].I; 1.806 - sprintf(s, "%02x%02x%02x%02x", v & 255, (v >> 8) & 255, 1.807 - (v >> 16) & 255, (v >> 24) & 255); 1.808 - s += 8; 1.809 - *s = 0; 1.810 - remotePutPacket(buffer); 1.811 + // FP status register 1.812 + sprintf(s, "00000000"); 1.813 + s += 8; 1.814 + // CPSR 1.815 + CPUUpdateCPSR(); 1.816 + u32 v = reg[16].I; 1.817 + sprintf(s, "%02x%02x%02x%02x", v & 255, (v >> 8) & 255, 1.818 + (v >> 16) & 255, (v >> 24) & 255); 1.819 + s += 8; 1.820 + *s = 0; 1.821 + remotePutPacket(buffer); 1.822 } 1.823 1.824 void remoteWriteRegister(char *p) 1.825 { 1.826 - int r; 1.827 + int r; 1.828 1.829 - sscanf(p, "%x=", &r); 1.830 + sscanf(p, "%x=", &r); 1.831 1.832 - p = strchr(p, '='); 1.833 - p++; 1.834 + p = strchr(p, '='); 1.835 + p++; 1.836 1.837 - char c = *p++; 1.838 + char c = *p++; 1.839 1.840 - u32 v = 0; 1.841 + u32 v = 0; 1.842 1.843 - u8 data[4] = {0, 0, 0, 0}; 1.844 + u8 data[4] = {0, 0, 0, 0}; 1.845 1.846 - int i = 0; 1.847 + int i = 0; 1.848 1.849 - while (c != '#') 1.850 - { 1.851 - u8 b = 0; 1.852 - if (c <= '9') 1.853 - b = (c - '0') << 4; 1.854 - else 1.855 - b = (c + 10 - 'a') << 4; 1.856 - c = *p++; 1.857 - if (c <= '9') 1.858 - b += (c - '0'); 1.859 - else 1.860 - b += (c + 10 - 'a'); 1.861 - data[i++] = b; 1.862 - c = *p++; 1.863 - } 1.864 + while (c != '#') 1.865 + { 1.866 + u8 b = 0; 1.867 + if (c <= '9') 1.868 + b = (c - '0') << 4; 1.869 + else 1.870 + b = (c + 10 - 'a') << 4; 1.871 + c = *p++; 1.872 + if (c <= '9') 1.873 + b += (c - '0'); 1.874 + else 1.875 + b += (c + 10 - 'a'); 1.876 + data[i++] = b; 1.877 + c = *p++; 1.878 + } 1.879 1.880 - v = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); 1.881 + v = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); 1.882 1.883 - // printf("Write register %d=%08x\n", r, v); 1.884 - reg[r].I = v; 1.885 - if (r == 15) 1.886 - { 1.887 - armNextPC = v; 1.888 - if (armState) 1.889 - reg[15].I = v + 4; 1.890 - else 1.891 - reg[15].I = v + 2; 1.892 - } 1.893 - remotePutPacket("OK"); 1.894 + // printf("Write register %d=%08x\n", r, v); 1.895 + reg[r].I = v; 1.896 + if (r == 15) 1.897 + { 1.898 + armNextPC = v; 1.899 + if (armState) 1.900 + reg[15].I = v + 4; 1.901 + else 1.902 + reg[15].I = v + 2; 1.903 + } 1.904 + remotePutPacket("OK"); 1.905 } 1.906 1.907 void remoteStubMain() 1.908 { 1.909 - if (!debugger) 1.910 - return; 1.911 + if (!debugger) 1.912 + return; 1.913 1.914 - if (remoteResumed) 1.915 - { 1.916 - remoteSendStatus(); 1.917 - remoteResumed = false; 1.918 - } 1.919 - 1.920 - while (true) 1.921 - { 1.922 - char buffer[1024]; 1.923 - int res = remoteRecvFnc(buffer, 1024); 1.924 - 1.925 - if (res == -1) 1.926 + if (remoteResumed) 1.927 { 1.928 - fprintf(stderr, "GDB connection lost\n"); 1.929 -#ifdef SDL 1.930 - dbgMain = debuggerMain; 1.931 - dbgSignal = debuggerSignal; 1.932 -#endif 1.933 - debugger = false; 1.934 - break; 1.935 + remoteSendStatus(); 1.936 + remoteResumed = false; 1.937 } 1.938 1.939 - // fprintf(stderr, "Received %s\n", buffer); 1.940 - char *p = buffer; 1.941 - char c = *p++; 1.942 - char pp = '+'; 1.943 - remoteSendFnc(&pp, 1); 1.944 + while (true) 1.945 + { 1.946 + char buffer[1024]; 1.947 + int res = remoteRecvFnc(buffer, 1024); 1.948 1.949 - if (c != '$') 1.950 - continue; 1.951 - c = *p++; 1.952 - switch (c) 1.953 - { 1.954 - case '?': 1.955 - remoteSendSignal(); 1.956 - break; 1.957 - case 'D': 1.958 - remotePutPacket("OK"); 1.959 + if (res == -1) 1.960 + { 1.961 + fprintf(stderr, "GDB connection lost\n"); 1.962 #ifdef SDL 1.963 - dbgMain = debuggerMain; 1.964 - dbgSignal = debuggerSignal; 1.965 + dbgMain = debuggerMain; 1.966 + dbgSignal = debuggerSignal; 1.967 #endif 1.968 - remoteResumed = true; 1.969 - debugger = false; 1.970 - return; 1.971 - case 'e': 1.972 - remoteStepOverRange(p); 1.973 - break; 1.974 - case 'k': 1.975 - remotePutPacket("OK"); 1.976 + debugger = false; 1.977 + break; 1.978 + } 1.979 + 1.980 + // fprintf(stderr, "Received %s\n", buffer); 1.981 + char *p = buffer; 1.982 + char c = *p++; 1.983 + char pp = '+'; 1.984 + remoteSendFnc(&pp, 1); 1.985 + 1.986 + if (c != '$') 1.987 + continue; 1.988 + c = *p++; 1.989 + switch (c) 1.990 + { 1.991 + case '?': 1.992 + remoteSendSignal(); 1.993 + break; 1.994 + case 'D': 1.995 + remotePutPacket("OK"); 1.996 #ifdef SDL 1.997 - dbgMain = debuggerMain; 1.998 - dbgSignal = debuggerSignal; 1.999 + dbgMain = debuggerMain; 1.1000 + dbgSignal = debuggerSignal; 1.1001 #endif 1.1002 - debugger = false; 1.1003 - emulating = false; 1.1004 - return; 1.1005 - case 'C': 1.1006 - remoteResumed = true; 1.1007 - debugger = false; 1.1008 - return; 1.1009 - case 'c': 1.1010 - remoteResumed = true; 1.1011 - debugger = false; 1.1012 - return; 1.1013 - case 's': 1.1014 - remoteResumed = true; 1.1015 - remoteSignal = 5; 1.1016 - CPULoop(1); 1.1017 - if (remoteResumed) 1.1018 - { 1.1019 - remoteResumed = false; 1.1020 - remoteSendStatus(); 1.1021 - } 1.1022 - break; 1.1023 - case 'g': 1.1024 - remoteReadRegisters(p); 1.1025 - break; 1.1026 - case 'P': 1.1027 - remoteWriteRegister(p); 1.1028 - break; 1.1029 - case 'M': 1.1030 - remoteMemoryWrite(p); 1.1031 - break; 1.1032 - case 'm': 1.1033 - remoteMemoryRead(p); 1.1034 - break; 1.1035 - case 'X': 1.1036 - remoteBinaryWrite(p); 1.1037 - break; 1.1038 - case 'H': 1.1039 - remotePutPacket("OK"); 1.1040 - break; 1.1041 - case 'q': 1.1042 - remotePutPacket(""); 1.1043 - break; 1.1044 - case 'Z': 1.1045 - if (*p++ == '2') 1.1046 - { 1.1047 - remoteWriteWatch(p, true); 1.1048 - } 1.1049 - else 1.1050 - remotePutPacket(""); 1.1051 - break; 1.1052 - case 'z': 1.1053 - if (*p++ == '2') 1.1054 - { 1.1055 - remoteWriteWatch(p, false); 1.1056 - } 1.1057 - else 1.1058 - remotePutPacket(""); 1.1059 - break; 1.1060 - default: 1.1061 - { 1.1062 - *(strchr(p, '#') + 3) = 0; 1.1063 - fprintf(stderr, "Unknown packet %s\n", --p); 1.1064 - remotePutPacket(""); 1.1065 - break; 1.1066 - } 1.1067 + remoteResumed = true; 1.1068 + debugger = false; 1.1069 + return; 1.1070 + case 'e': 1.1071 + remoteStepOverRange(p); 1.1072 + break; 1.1073 + case 'k': 1.1074 + remotePutPacket("OK"); 1.1075 +#ifdef SDL 1.1076 + dbgMain = debuggerMain; 1.1077 + dbgSignal = debuggerSignal; 1.1078 +#endif 1.1079 + debugger = false; 1.1080 + emulating = false; 1.1081 + return; 1.1082 + case 'C': 1.1083 + remoteResumed = true; 1.1084 + debugger = false; 1.1085 + return; 1.1086 + case 'c': 1.1087 + remoteResumed = true; 1.1088 + debugger = false; 1.1089 + return; 1.1090 + case 's': 1.1091 + remoteResumed = true; 1.1092 + remoteSignal = 5; 1.1093 + CPULoop(1); 1.1094 + if (remoteResumed) 1.1095 + { 1.1096 + remoteResumed = false; 1.1097 + remoteSendStatus(); 1.1098 + } 1.1099 + break; 1.1100 + case 'g': 1.1101 + remoteReadRegisters(p); 1.1102 + break; 1.1103 + case 'P': 1.1104 + remoteWriteRegister(p); 1.1105 + break; 1.1106 + case 'M': 1.1107 + remoteMemoryWrite(p); 1.1108 + break; 1.1109 + case 'm': 1.1110 + remoteMemoryRead(p); 1.1111 + break; 1.1112 + case 'X': 1.1113 + remoteBinaryWrite(p); 1.1114 + break; 1.1115 + case 'H': 1.1116 + remotePutPacket("OK"); 1.1117 + break; 1.1118 + case 'q': 1.1119 + remotePutPacket(""); 1.1120 + break; 1.1121 + case 'Z': 1.1122 + if (*p++ == '2') 1.1123 + { 1.1124 + remoteWriteWatch(p, true); 1.1125 + } 1.1126 + else 1.1127 + remotePutPacket(""); 1.1128 + break; 1.1129 + case 'z': 1.1130 + if (*p++ == '2') 1.1131 + { 1.1132 + remoteWriteWatch(p, false); 1.1133 + } 1.1134 + else 1.1135 + remotePutPacket(""); 1.1136 + break; 1.1137 + default: 1.1138 + { 1.1139 + *(strchr(p, '#') + 3) = 0; 1.1140 + fprintf(stderr, "Unknown packet %s\n", --p); 1.1141 + remotePutPacket(""); 1.1142 + break; 1.1143 + } 1.1144 + } 1.1145 } 1.1146 - } 1.1147 } 1.1148 1.1149 void remoteStubSignal(int sig, int number) 1.1150 { 1.1151 - remoteSignal = sig; 1.1152 - remoteResumed = false; 1.1153 - remoteSendStatus(); 1.1154 - debugger = true; 1.1155 + remoteSignal = sig; 1.1156 + remoteResumed = false; 1.1157 + remoteSendStatus(); 1.1158 + debugger = true; 1.1159 } 1.1160 1.1161 void remoteCleanUp() 1.1162 { 1.1163 - if (remoteCleanUpFnc) 1.1164 - remoteCleanUpFnc(); 1.1165 + if (remoteCleanUpFnc) 1.1166 + remoteCleanUpFnc(); 1.1167 } 1.1168