#include #include "nand.h" #include "screen.h" #include "console.h" #include "config.h" typedef unsigned short int u16; typedef unsigned long int u32; extern unsigned short int sscreen[SCREEN_PIXELS]; #define BUFFER_SIZE (128*1024) #define PATH_SIZE 512 #define LINETEXT_SIZE 128 #define BOOT1MAP_ADDR 0x00100000 #define BOOT1ALT_ADDR 0xA0000000 #define BOOT1_SIZE 0x80000 char buf[BUFFER_SIZE]; #define CLASSIC_CX_NPARTS 5 #define CLASSIC_CX_NPARTS_TO_DUMP 3 u32 classic_parts_pages_offsets[CLASSIC_CX_NPARTS+1]={MANUF_PAGE_OFFSET,BOOT2_PAGE_OFFSET,BOOTD_PAGE_OFFSET,DIAGS_PAGE_OFFSET,FILES_PAGE_OFFSET,0}; char** classic_cx_parts_names[CLASSIC_CX_NPARTS+1]={"Manuf","Boot2","BootD","Diags","FileS","Boot1"}; u16 classic_cx_parts_to_dump[CLASSIC_CX_NPARTS_TO_DUMP]={0,1,3}; #define CX2_NPARTS 13 #define CX2_NPARTS_TO_DUMP 5 u32 cx2_parts_pages_offsets[CX2_NPARTS+1]={CX2_MANUF_PAGE_OFFSET,CX2_BOOTL_PAGE_OFFSET,CX2_PTTDT_PAGE_OFFSET,CX2_UNKN1_PAGE_OFFSET,CX2_DEVCR_PAGE_OFFSET,CX2_OSLDR_PAGE_OFFSET,CX2_INSTL_PAGE_OFFSET,CX2_OINST_PAGE_OFFSET,CX2_OSDAT_PAGE_OFFSET,CX2_DIAGS_PAGE_OFFSET,CX2_UNKN2_PAGE_OFFSET,CX2_LOGIN_PAGE_OFFSET,CX2_FILES_PAGE_OFFSET,0}; char** cx2_parts_names[CX2_NPARTS+1]={"Manuf","BtLdr","PTTData","Uknown1","DevCert","OSLdr","Instl","InstlAlt","OSDat","Diags","Uknown2","Logng","FileS","BtROM"}; u16 cx2_parts_to_dump[CX2_NPARTS_TO_DUMP]={0,1,5,6,9}; void str2lower(char* dest, char* src) { char c; while(c=*src) { if(c>='A' && c<='Z') c+='a'-'A'; *dest=c; src++; dest++; } *dest=0; } void dump(char* path, int size, int offset) { int csize; FILE* ofile = fopen(path, "wb"); if(ofile) { while(size) { csize=min(size,BUFFER_SIZE); bc_read_nand(buf, csize, offset, 0, 0, NULL); fwrite(buf, 1, csize, ofile); size-=csize; offset+=csize; } dispok("Done"); fclose(ofile); } else dispfail("Fail"); } void dispok(char* s) { setCurColorRGB(0,0x7F,0); displn(s,I_TRANSP); setCurColorRGB(0,0,0); } void dispfail(char* s) { setCurColorRGB(0xFF,0,0); displn(s,I_TRANSP); setCurColorRGB(0,0,0); } int main(int argc, char** argv) { char txt[LINETEXT_SIZE]; int i, k, size, offset, nparts, nparts_to_dump; u32* parts_pages_offsets; u16* parts_to_dump; char** parts_names; if (nl_hwsubtype() == 2) { // CX2 nparts=CX2_NPARTS; nparts_to_dump = CX2_NPARTS_TO_DUMP; parts_to_dump = cx2_parts_to_dump; parts_pages_offsets = cx2_parts_pages_offsets; parts_names = cx2_parts_names; } else { nparts = CLASSIC_CX_NPARTS; nparts_to_dump = CLASSIC_CX_NPARTS_TO_DUMP; parts_to_dump = classic_cx_parts_to_dump; parts_pages_offsets = classic_parts_pages_offsets; parts_names = classic_cx_parts_names; char* manufflashdata=malloc(FILES_OFFSET_OFFSET+4); bc_read_nand(manufflashdata,FILES_OFFSET_OFFSET+4,0,0,0,NULL); // TI-Nspire CX/CM partition table if(!memcmp(manufflashdata+PART_TABLE_OFFSET,PART_TABLE_ID,PART_TABLE_SIZE)) { long int offsets_offsets[CLASSIC_CX_NPARTS]={0,BOOT2_OFFSET_OFFSET,BOOTD_OFFSET_OFFSET,DIAGS_OFFSET_OFFSET,FILES_OFFSET_OFFSET}; printf("CX/CM partition table found\n"); for(i=1;i