To allocate such big chunk of data, first of all you need that big contiguous data segment. For 180kB you need at least 180/16 --- 11 flash pages. So you may edit prm file to comment out PAGE_C0 to PAGE_CA segments and all references to them. Then you define new big segment specifing segment top and bottom using global addresses like this:
PAGES_C0_CA = READ_ONLY 0x700000'G/*0xCA8000*/ TO 0x72BFFF'G/*0xCABFFF*/;
Then you define placement into this segment:
BIGDATA INTO PAGES_C0_CA;
Then you come back to your source and put tab into BIGDATA like this
#pragma DATA_SEG __GPAGE_SEG BIGDATA
const int tab [300][300];
#pragma DATA_SEG DEFAULT
Unfortunately you can't use >64k array directly. You can initialize your 180k data in the code, but can't reference array elements like tab[i][j]. Instead, for >64k arrays you need to use __far24 pointers.
#define dimx 300ul
#define dimy 300
#pragma DATA_SEG __GPAGE_SEG BIGDATA
const int tab [dimx][dimy];
#pragma DATA_SEG DEFAULT
const int * __far24 tabptr = &tab[0][0];
unsigned int i,j;
int x;
void main(void) {
// accessing array elements
i = 0; j=0;
x = tabptr[i*dimx + j]; // data @ 0x700000'g
i = 0; j=dimy-1;
x = tabptr[i*dimx + j]; // data @ 0x700256'g
i = dimx-1; j=0;
x = tabptr[i*dimx + j]; // data @ 0x72BCC8'g
i = dimx-1; j=dimy-1;
x = tabptr[i*dimx + j]; // data @ 0x72BF1E'g
}
Please note that:
1)array index should be long integer. I made dimx long, so that all expressions in [] are long.
2) this is still tricky. Array elements must be word aligned, else you will certainly read wrong data if you try to read word from address % 0x10000 = 0xFFFF. For array of integers it is easy to satisfy this requirement and never read "dangerous" address, just align whole array. For array of structs it may be harder.