69
ret = LIO_SendData(buf, 4);
70
ret = LIO_SendData(buf, 4);
73
74
ret = LIO_SendData(data, len);
77
78
sum = CheckSum(buf, 4) + CheckSum(data, len);
82
83
ret = LIO_SendData(buf, 2);
88
int RecvPacket(uint16_t* cmd, uint16_t* len, uint8_t* data)
89
static int RecvPacket(uint8_t* buf, uint16_t* cmd, uint16_t* len, uint8_t* data)
97
// any packet has always at least 4 bytes (cmd, len)
98
// any packet has always at least 4 bytes (cmd, len)
98
99
ret = LIO_RecvData(buf, 4, TIMEOUT);
99
100
if(ret) return ret;
101
*cmd = (buf[1] << 8) | buf[0];
102
*cmd = (buf[1] << 8) | buf[0];
102
103
*len = (buf[3] << 8) | buf[2];
103
tmp = CheckSum(buf, 4);
104
tmp = CheckSum(buf, 4);
108
ret = LIO_RecvData(data, *len, TIMEOUT);
109
ret = LIO_RecvData(data, *len, TIMEOUT);
109
110
if(ret) return ret;
113
ret = LIO_RecvData(buf+*len, 2, TIMEOUT);
114
ret = LIO_RecvData(buf+*len, 2, TIMEOUT);
114
115
if(ret) return ret;
116
117
sum = (buf[*len+1] << 8) | buf[*len+0];
118
119
if (sum != CheckSum(data, *len) + tmp)
124
125
// --- Command Layer
126
inline int Send_OK(void)
128
return SendPacket(CMD_OK, 0, NULL);
131
inline int Send_KO(void)
133
return SendPacket(CMD_KO, 0, NULL);
136
inline int Send_SIZE(uint32_t size)
127
static inline int Send_OK(uint8_t* buf)
129
return SendPacket(buf, CMD_OK, 0, NULL);
132
static inline int Send_KO(uint8_t* buf)
134
return SendPacket(buf, CMD_KO, 0, NULL);
137
static inline int Send_SIZE(uint8_t* buf, uint32_t size)
138
139
uint32_t le_size = LE_BE(size);
140
return SendPacket(CMD_REQ_SIZE, 4, (uint8_t *)&le_size);
141
return SendPacket(buf, CMD_REQ_SIZE, 4, (uint8_t *)&le_size);
143
inline int Send_DATA(uint16_t len, uint8_t* data)
144
static inline int Send_DATA(uint8_t* buf, uint16_t len, uint8_t* data)
145
return SendPacket(CMD_DATA1, len, data);
146
return SendPacket(buf, CMD_DATA1, len, data);
148
inline int Send_RDATA(uint16_t data)
149
static inline int Send_RDATA(uint8_t* buf, uint16_t data)
152
153
tmp[0] = LSB(BLK_SIZE);
153
154
tmp[1] = MSB(BLK_SIZE);
154
155
tmp[2] = LSB(data);
155
156
tmp[3] = MSB(data);
157
return SendPacket(CMD_DATA2, 4, tmp);
160
inline int Send_EXIT(void)
162
return SendPacket(CMD_EXIT, 0, NULL);
165
inline int Send_ERR(void)
167
return SendPacket(CMD_ERROR, 0, NULL);
158
return SendPacket(buf, CMD_DATA2, 4, tmp);
161
static inline int Send_EXIT(uint8_t* buf)
163
return SendPacket(buf, CMD_EXIT, 0, NULL);
166
static inline int Send_ERR(uint8_t* buf)
168
return SendPacket(buf, CMD_ERROR, 0, NULL);
170
171
// --- Dumper Layer
173
static int Dump(uint8_t* buf)
184
185
// wait for command
185
ret = RecvPacket(&cmd, &len, buf);
186
ret = RecvPacket(buf, &cmd, &len, buf);
186
187
//if(ret) continue; // pb with ret val
195
196
case CMD_IS_READY:
202
203
case CMD_REQ_SIZE:
204
Send_SIZE(buf, ROM_size);
205
206
sprintf(str, "Size: %lu KB", ROM_size >> 10);
206
DrawStr(0, 60, str, A_REPLACE );
207
DrawStr(0, 60, str, A_REPLACE);
208
209
case CMD_REQ_BLOCK:
209
addr = ((uint32_t)buf[0] << 0); addr |= ((uint32_t)buf[1] << 8);
210
addr |= ((uint32_t)buf[2] << 16); addr |= ((uint32_t)buf[3] << 24);
210
addr = ((uint32_t)buf[0] << 0); addr |= ((uint32_t)buf[1] << 8);
211
addr |= ((uint32_t)buf[2] << 16); addr |= ((uint32_t)buf[3] << 24);
212
213
if(addr > ROM_size)
216
217
if(addr >= 0x10000 && addr < 0x12000) // read protected (certificate)
218
219
if(addr >= 0x18000 && addr < 0x1A000) // read protected (certificate)
222
223
sprintf(str, "Done: %lu/%luKB ", addr >> 10, ROM_size >> 10);
223
DrawStr(0, 60, str, A_REPLACE );
224
DrawStr(0, 60, str, A_REPLACE);
225
226
// Check for filled blocks (like 0xff)
226
227
ptr = (uint8_t *)(ROM_base + addr);
227
228
for(i = 0; i < BLK_SIZE; i++)
228
229
if(ptr[i] != ptr[0])
231
232
if(i == BLK_SIZE)
233
Send_RDATA(buf, ptr[0]);
234
Send_DATA(BLK_SIZE, (uint8_t *)(ROM_base + addr));
235
Send_DATA(buf, BLK_SIZE, (uint8_t *)(ROM_base + addr));
247
248
// --- Main Function
254
uint8_t buf[BLK_SIZE + 3*2];
254
// Ugly hack to find LIO_SendData and LIO_RecvData...
255
LIO_SendData=(void*)ERD_dialog;
256
while (*(void**)LIO_SendData!=OSLinkTxQueueInquire) LIO_SendData+=2;
257
LIO_RecvData=(void*)LIO_SendData;
259
while (*(void**)LIO_RecvData!=OSReadLinkBlock) LIO_RecvData+=2;
257
// Ugly hack to find LIO_SendData and LIO_RecvData...
258
LIO_SendData=(void*)ERD_dialog;
259
while (*(void**)LIO_SendData!=OSLinkTxQueueInquire) LIO_SendData+=2;
260
LIO_RecvData=(void*)LIO_SendData;
262
while (*(void**)LIO_RecvData!=OSReadLinkBlock) LIO_RecvData+=2;
266
sprintf(str, "RomDumper v%s", VERSION);
267
DrawStr(0, 0, str, A_NORMAL);
269
sprintf(str, "RomDumper v%s", VERSION);
270
DrawStr(0, 0, str, A_NORMAL);
270
sprintf(str, "Type: TI-92 %i", TI92_VERSION);
273
sprintf(str, "Type: TI-92 %i", TI92_VERSION);
272
sprintf(str, "Type: HW%i", HW_VERSION);
275
sprintf(str, "Type: HW%i", HW_VERSION);
274
DrawStr(0, 20, str, A_NORMAL);
276
sprintf(str, "ROM base: 0x%lx", (uint32_t)ROM_base);
277
DrawStr(0, 40, str, A_NORMAL);
279
sprintf(str, "by The TiLP Team");
280
DrawStr(0, 80, str, A_NORMAL);
277
DrawStr(0, 20, str, A_NORMAL);
279
sprintf(str, "ROM base: 0x%lx", (uint32_t)ROM_base);
280
DrawStr(0, 40, str, A_NORMAL);
282
sprintf(str, "by The TiLP Team");
283
DrawStr(0, 80, str, A_NORMAL);