How to find and display the Prizm's built-in MENU-icons
34 posts
• Page 1 of 4 • 1, 2, 3, 4
- SimonLothar
- Senior Member
-
- Posts: 605
- Joined: Sat Sep 15, 2012 6:59 am
- Location: Krautland ****
- Calculators: Casio fx-7400GII, Casio fx-7400GII (SH4), Casio fx-9750GII, Casio fx-9750GII (SH4), Casio fx-9860G, Casio fx-9860G SD, Casio fx-9860G Slim, Casio fx-9860GII SD, Casio fx-9860GII SD Power Graphic 2, Casio Classpad 330 plus, Casio fx-CG20, Casio fx-CG50, Casio Classpad fx-CP400
How to find and display the Prizm's built-in MENU-icons
First find the address of syscall 0x001E, f. i. 80 01 02 04 (this is an example, not a real address).
Then find the address of syscall 0x1515, f. i. 80 05 07 08 (this is an example, not a real address).
Search the OS-range for these 8 bytes (in the example above search for: 80 01 02 04 80 05 07 08). The sequence should occur only once.
The four bytes immediately preceding these 8 bytes represent the address to the built-in table.
The built-in table consists of 5 pointers per built-in.
The 1st pointer is the address of the built-in's MCS-name.
The 2nd pointer is the address of the built-in's syscall. The syscalls should not be called without knowing the interface. The built-ins' syscall interfaces differ even in number of arguments!
The 5th pointer is the address of the built-in's icon (64 lines x 92 words (16 bit-color pixels) per line).
built_in_table:
.data.l pointer to ASCIIZ "@RUNMAT"
.data.l sys1a03_APP_RUNMAT
.data.l 0
.data.l pointer to some other bitmap, purpose unknown yet, size the same as the icon
.data.l BuiltInIconBitmap_RUNMAT
.data.l pointer to ASCIIZ "@STAT"
.data.l sys1ced_APP_STAT_
.data.l 0
.data.l pointer to some other bitmap, purpose unknown yet, size the same as the icon
.data.l BuiltInIconBitmapSTAT
.data.l pointer to ASCIIZ "@EACT"
.data.l sys0a83_APP_EACT_
.data.l h'100
.data.l pointer to some other bitmap, purpose unknown yet, size the same as the icon
.data.l BuiltInIconBitmap_EACT
.data.l pointer to ASCIIZ "@SSHEET"
.data.l sys1b0f_APP_SHEET_
.data.l 0
.data.l pointer to some other bitmap, purpose unknown yet, size the same as the icon
.data.l BuiltInIconBitmap_SSHEET
a. s. o.
F. i. BuiltInIconBitmap_RUNMAT is the pointer to the MENU-bitmap of the built-in RunMat.
-------------------
Some example code
Then find the address of syscall 0x1515, f. i. 80 05 07 08 (this is an example, not a real address).
Search the OS-range for these 8 bytes (in the example above search for: 80 01 02 04 80 05 07 08). The sequence should occur only once.
The four bytes immediately preceding these 8 bytes represent the address to the built-in table.
The built-in table consists of 5 pointers per built-in.
The 1st pointer is the address of the built-in's MCS-name.
The 2nd pointer is the address of the built-in's syscall. The syscalls should not be called without knowing the interface. The built-ins' syscall interfaces differ even in number of arguments!
The 5th pointer is the address of the built-in's icon (64 lines x 92 words (16 bit-color pixels) per line).
built_in_table:
.data.l pointer to ASCIIZ "@RUNMAT"
.data.l sys1a03_APP_RUNMAT
.data.l 0
.data.l pointer to some other bitmap, purpose unknown yet, size the same as the icon
.data.l BuiltInIconBitmap_RUNMAT
.data.l pointer to ASCIIZ "@STAT"
.data.l sys1ced_APP_STAT_
.data.l 0
.data.l pointer to some other bitmap, purpose unknown yet, size the same as the icon
.data.l BuiltInIconBitmapSTAT
.data.l pointer to ASCIIZ "@EACT"
.data.l sys0a83_APP_EACT_
.data.l h'100
.data.l pointer to some other bitmap, purpose unknown yet, size the same as the icon
.data.l BuiltInIconBitmap_EACT
.data.l pointer to ASCIIZ "@SSHEET"
.data.l sys1b0f_APP_SHEET_
.data.l 0
.data.l pointer to some other bitmap, purpose unknown yet, size the same as the icon
.data.l BuiltInIconBitmap_SSHEET
a. s. o.
F. i. BuiltInIconBitmap_RUNMAT is the pointer to the MENU-bitmap of the built-in RunMat.
-------------------
Some example code
- Code: Select all
//
void F33_Handler(){
int ADR001E, ADR1515, pBuiltInTable, pIconBitmap;
int p, AppNo;
unsigned int key;
unsigned char hb[15];
TDispGraph Graph;
Bdisp_AllClr_VRAM();
// find syscall addresses 0x001E and 0x1515
p = *(int*)0x8002007C;
ADR001E = *(int*)(p + 0x001E * 4);
ADR1515 = *(int*)(p + 0x1515 * 4);
// display to check
locate( 1, 1 );
LongToAscHex( ADR001E, hb, 8 );
Print( hb );
locate( 10, 1 );
LongToAscHex( ADR1515, hb, 8 );
Print( hb );
// find the buit-in table
pBuiltInTable = 0;
p = 0x80020000;
while ( p < 0x80B60000 ){
if ( *(int*)p == ADR001E ){
if ( *(int*)(p+4) == ADR1515 ){
pBuiltInTable = *(int*)(p-4);
break;
}
}
p += 4;
}
// find the bitmap pointer and display
if ( pBuiltInTable ){
// display to check
locate( 1, 2 );
LongToAscHex( pBuiltInTable, hb, 8 );
Print( hb );
Graph.xofs = 0;
Graph.yofs = 0;
Graph.width = 92;
Graph.height = 64;
Graph.colormode = 2;
Graph.zero4 = 0x00;
Graph.P20_1 = 0x20;
Graph.P20_2 = 0x20;
Graph.color_idx1 = 0x01;
Graph.color_idx2 = 0x00;
Graph.color_idx3 = 0xFF;
Graph.P20_3 = 0x20;
Graph.writemodify = 0x01;
Graph.writekind = 0x01;
Graph.zero6 = 0x00;
Graph.one2 = 0x01;
Graph.transparency = 0;
AppNo = 0; // RunMat
pIconBitmap = *(int*)(pBuiltInTable+20*AppNo+4*4);
// display to check
locate( 1, 2 );
LongToAscHex( pIconBitmap, hb, 8 );
Print( hb );
Graph.x = 10;
Graph.y = 10;
Graph.bitmap = pIconBitmap;
Bdisp_WriteGraphVRAM( &Graph );
AppNo = 1; // Stat
pIconBitmap = *(int*)(pBuiltInTable+20*AppNo+4*4);
locate( 10, 2 );
LongToAscHex( pIconBitmap, hb, 8 );
Print( hb );
Graph.x = 110;
Graph.bitmap = pIconBitmap;
Bdisp_WriteGraphVRAM( &Graph );
AppNo = 2; // EACT
pIconBitmap = *(int*)(pBuiltInTable+20*AppNo+4*4);
locate( 1, 3 );
LongToAscHex( pIconBitmap, hb, 8 );
Print( hb );
Graph.x = 10;
Graph.y = 100;
Graph.bitmap = pIconBitmap;
Bdisp_WriteGraphVRAM( &Graph );
AppNo = 3; // Sheet
pIconBitmap = *(int*)(pBuiltInTable+20*AppNo+4*4);
locate( 10, 3 );
LongToAscHex( pIconBitmap, hb, 8 );
Print( hb );
Graph.x = 110;
Graph.bitmap = pIconBitmap;
Bdisp_WriteGraphVRAM( &Graph );
}
GetKey( &key );
}
I'll be back!
- AmazoNKA
- Senior Member
- Posts: 116
- Joined: Mon Mar 02, 2015 10:53 am
- Calculators: Casio fx-CG20
Re: How to find and display the Prizm's built-in MENU-icons
I assume it is for the first 16 icons (i.e. built-in ones) on the main menu only - or is there a way to find the other, not built-in icons too please? Or is the safest way to get them directly from the add-ins files themselves in the storage memory?
Determining the order in which all the add-ins appear on the main menu is tricky in itself - or is there a system call at least for that please - I posted similar question here https://www.cemetech.net/forum/viewtopic.php?t=11935 with some address reference listing order of add-ins if it helps but that appears to change with OS versions...
Also I was wondering what routine prints the main menu icons' titles - the font seems unique.
Many thanks in advance.
Determining the order in which all the add-ins appear on the main menu is tricky in itself - or is there a system call at least for that please - I posted similar question here https://www.cemetech.net/forum/viewtopic.php?t=11935 with some address reference listing order of add-ins if it helps but that appears to change with OS versions...
Also I was wondering what routine prints the main menu icons' titles - the font seems unique.
Many thanks in advance.
- SimonLothar
- Senior Member
-
- Posts: 605
- Joined: Sat Sep 15, 2012 6:59 am
- Location: Krautland ****
- Calculators: Casio fx-7400GII, Casio fx-7400GII (SH4), Casio fx-9750GII, Casio fx-9750GII (SH4), Casio fx-9860G, Casio fx-9860G SD, Casio fx-9860G Slim, Casio fx-9860GII SD, Casio fx-9860GII SD Power Graphic 2, Casio Classpad 330 plus, Casio fx-CG20, Casio fx-CG50, Casio Classpad fx-CP400
Re: How to find and display the Prizm's built-in MENU-icons
There exists a registered addin-table, the order of which corresponds with the main menu addin order.
First get the address returned by syscall 1e50 (this is the start of some VRAM cache or shadow VRAM). Add 0x28800. Then search for the first string which starts with "@". This should be the start of the addin-table, which consists of an eight byte addin-name (the name used in the main memory, t. i. preceeded by "@", f. i. "@CONV") and a four byte address, which is the pointer to the addin-header. This struct is repeated for each addin.
I did not find any syscall to get the address of the registered addin-table directly.
First get the address returned by syscall 1e50 (this is the start of some VRAM cache or shadow VRAM). Add 0x28800. Then search for the first string which starts with "@". This should be the start of the addin-table, which consists of an eight byte addin-name (the name used in the main memory, t. i. preceeded by "@", f. i. "@CONV") and a four byte address, which is the pointer to the addin-header. This struct is repeated for each addin.
I did not find any syscall to get the address of the registered addin-table directly.
I'll be back!
- AmazoNKA
- Senior Member
- Posts: 116
- Joined: Mon Mar 02, 2015 10:53 am
- Calculators: Casio fx-CG20
Re: How to find and display the Prizm's built-in MENU-icons
Thank you so much for this - I will give it a try for sure.
Is it known how to print the titles of the icons the way they are printed on the main menu as well please?
Is it known how to print the titles of the icons the way they are printed on the main menu as well please?
- AmazoNKA
- Senior Member
- Posts: 116
- Joined: Mon Mar 02, 2015 10:53 am
- Calculators: Casio fx-CG20
Re: How to find and display the Prizm's built-in MENU-icons
Your suggestion works - thank you.
In my G-Clock add-in I used the following to count add-ins before
but replacing with
I saw somewhere 1e50 and regular GetVRAMAddress listed as returning unsigned int I think which was the only way I could make 1e50 work, but it seems to me that regular GetVRAMAddress returns void* so I struggled for a while because of this confusion - I still need to understand how to fully use the new system call for example when looking up some pixels as the routines I used on regular VRAM don't work with what 1e50 returns but this is something else...
Also thank you so much for documenting how to add new system calls on a fly.
Thanks again and let me know if you have any idea about how icons' titles are printed please if you can.
In my G-Clock add-in I used the following to count add-ins before
- Code: Select all
typedef struct {
unsigned short id, type;
unsigned long fsize, dsize;
unsigned int property;
unsigned long address;
} file_type_t;
int g3a_count() {
unsigned short filename[0x10A];
unsigned short found[0x10A];
file_type_t fileinfo;
int findhandle;
int ret;
Bfile_StrToName_ncpy(filename,"\\\\fls0\\*.g3a", 0x10A);
ret = Bfile_FindFirst_NON_SMEM((const char*)filename, &findhandle, (char*)found, &fileinfo);
int totalsize = 1;
while(!ret) {
++totalsize;
ret = Bfile_FindNext_NON_SMEM(findhandle, (char*)found, (char*)&fileinfo);
}
Bfile_FindClose(findhandle);
return totalsize;
}
but replacing with
- Code: Select all
unsigned int VRAM2;
VRAM2 = getSecondaryVramAddress();
VRAM2 += 0x28800;
int z = 1;
while (*(char*)VRAM2 != '@') {
VRAM2++;
}
while (*(char*)VRAM2 == '@') {
z++;
VRAM2 += 12;
}
I saw somewhere 1e50 and regular GetVRAMAddress listed as returning unsigned int I think which was the only way I could make 1e50 work, but it seems to me that regular GetVRAMAddress returns void* so I struggled for a while because of this confusion - I still need to understand how to fully use the new system call for example when looking up some pixels as the routines I used on regular VRAM don't work with what 1e50 returns but this is something else...
Also thank you so much for documenting how to add new system calls on a fly.
Thanks again and let me know if you have any idea about how icons' titles are printed please if you can.
- SimonLothar
- Senior Member
-
- Posts: 605
- Joined: Sat Sep 15, 2012 6:59 am
- Location: Krautland ****
- Calculators: Casio fx-7400GII, Casio fx-7400GII (SH4), Casio fx-9750GII, Casio fx-9750GII (SH4), Casio fx-9860G, Casio fx-9860G SD, Casio fx-9860G Slim, Casio fx-9860GII SD, Casio fx-9860GII SD Power Graphic 2, Casio Classpad 330 plus, Casio fx-CG20, Casio fx-CG50, Casio Classpad fx-CP400
Re: How to find and display the Prizm's built-in MENU-icons
1E50 as well as 01E6 return an address in r0. The difference is the alignment. 01E6 returns a 4-aligned address (usually A8000000). 1E50 may return an odd address. You can use an odd address only to access char or unsigned char, t. i. you have to typecast such an address as (char*) or (unsigned char*). Any other pointer typecast will lead to an error.AmazoNKA wrote:I saw somewhere 1e50 and regular GetVRAMAddress listed as returning unsigned int I think which was the only way I could make 1e50 work, but it seems to me that regular GetVRAMAddress returns void* so I struggled for a while because of this confusion - I still need to understand how to fully use the new system call for example when looking up some pixels as the routines I used on regular VRAM don't work with what 1e50 returns but this is something else...
At present my Windows 10 machines deny to accept a CG20 as mass-storage device. Hence I cannot verify any assumptions. I am a bit short of time to see to that. The secret will be found around the DisplayMainMenu-syscall 1E6A.AmazoNKA wrote:Thanks again and let me know if you have any idea about how icons' titles are printed please if you can.
I'll be back!
- AmazoNKA
- Senior Member
- Posts: 116
- Joined: Mon Mar 02, 2015 10:53 am
- Calculators: Casio fx-CG20
Re: How to find and display the Prizm's built-in MENU-icons
Thanks for those explanations.
Regarding usb connection problems- a couple of times it helped me to reset the calculator and then connecting to pc restored itself. I hope it helps you.
Regarding usb connection problems- a couple of times it helped me to reset the calculator and then connecting to pc restored itself. I hope it helps you.
- SimonLothar
- Senior Member
-
- Posts: 605
- Joined: Sat Sep 15, 2012 6:59 am
- Location: Krautland ****
- Calculators: Casio fx-7400GII, Casio fx-7400GII (SH4), Casio fx-9750GII, Casio fx-9750GII (SH4), Casio fx-9860G, Casio fx-9860G SD, Casio fx-9860G Slim, Casio fx-9860GII SD, Casio fx-9860GII SD Power Graphic 2, Casio Classpad 330 plus, Casio fx-CG20, Casio fx-CG50, Casio Classpad fx-CP400
Re: How to find and display the Prizm's built-in MENU-icons
AmazoNKA wrote:Regarding usb connection problems- a couple of times it helped me to reset the calculator and then connecting to pc restored itself. I hope it helps you.
I used an USB-cable, which has been provided as accessory with some USB-charging device. Data-lines not connected. OMG.
Now I am operational again.
AmazoNKA wrote:Also I was wondering what routine prints the main menu icons' titles - the font seems unique.
First thing I found is syscall void*0x0D03( char Character, short*CharWidth ), which returns the address of the character's bitmap and the character's width in CharWidth.
If CharWidth is <=8, the Bitmap consists of 16 bytes, otherwise the bitmap consists of 16 words.
I'll be back!
- SimonLothar
- Senior Member
-
- Posts: 605
- Joined: Sat Sep 15, 2012 6:59 am
- Location: Krautland ****
- Calculators: Casio fx-7400GII, Casio fx-7400GII (SH4), Casio fx-9750GII, Casio fx-9750GII (SH4), Casio fx-9860G, Casio fx-9860G SD, Casio fx-9860G Slim, Casio fx-9860GII SD, Casio fx-9860GII SD Power Graphic 2, Casio Classpad 330 plus, Casio fx-CG20, Casio fx-CG50, Casio Classpad fx-CP400
Re: How to find and display the Prizm's built-in MENU-icons
syscall void*0x0D06( unsigned short Character, unsigned short*CharWidth )
Supports some E5- and E6-multibyte characters, too.
Supports some E5- and E6-multibyte characters, too.
I'll be back!
- SimonLothar
- Senior Member
-
- Posts: 605
- Joined: Sat Sep 15, 2012 6:59 am
- Location: Krautland ****
- Calculators: Casio fx-7400GII, Casio fx-7400GII (SH4), Casio fx-9750GII, Casio fx-9750GII (SH4), Casio fx-9860G, Casio fx-9860G SD, Casio fx-9860G Slim, Casio fx-9860GII SD, Casio fx-9860GII SD Power Graphic 2, Casio Classpad 330 plus, Casio fx-CG20, Casio fx-CG50, Casio Classpad fx-CP400
Re: How to find and display the Prizm's built-in MENU-icons
Syscall 0D07 displays a MMGlyphBitmap obtained by 0D03 or 0D06:
MMGlyphPrint( int x, int y, void*glyphbitmap, 2, int charwidth, 0, 0, 0, 0, unsigned short color, 0, 0 );
MMGlyphPrint( int x, int y, void*glyphbitmap, 2, int charwidth, 0, 0, 0, 0, unsigned short color, 0, 0 );
I'll be back!
34 posts
• Page 1 of 4 • 1, 2, 3, 4
Return to Tutorials & Code Snippets
Who is online
Users browsing this forum: No registered users and 2 guests