Difference between revisions of "MB ElementCount"
From WikiPrizm
Jump to navigationJump to search (This function should not modify the string, so it should it should take a const pointer. Also removed unneeded casts to (char*).) |
m |
||
(2 intermediate revisions by the same user not shown) | |||
Line 9: | Line 9: | ||
| example = The following example shows how a multi-byte string can take a memory space that's twice as large as the number of printed characters, and demonstrates how to count both size in bytes and graphical size: | | example = The following example shows how a multi-byte string can take a memory space that's twice as large as the number of printed characters, and demonstrates how to count both size in bytes and graphical size: | ||
<nowiki> | <nowiki> | ||
− | char MBstring | + | const char*MBstring="\xe6\x92\xe6\x93\xe6\xa5" |
− | |||
int bytelen = strlen(MBstring); | int bytelen = strlen(MBstring); | ||
// bytelen has a value of 6 | // bytelen has a value of 6 | ||
Line 23: | Line 22: | ||
<nowiki> | <nowiki> | ||
− | char MBstring | + | const char*MBstring="Empty box: \xe6\xa5"; |
− | |||
int bytelen = strlen(MBstring); | int bytelen = strlen(MBstring); | ||
// bytelen has a value of 13 | // bytelen has a value of 13 | ||
Line 32: | Line 30: | ||
locate_OS(2,3); | locate_OS(2,3); | ||
Print_OS(MBstring, 0, 0); // will print "Empty box: " followed by a square. | Print_OS(MBstring, 0, 0); // will print "Empty box: " followed by a square. | ||
+ | </nowiki> | ||
+ | | comments = | ||
+ | Here is a disassembly of the function. | ||
+ | <nowiki>! =============== S U B R O U T I N E ======================================= | ||
+ | |||
+ | |||
+ | MB_ElementCount: | ||
+ | tst r4, r4 ! Is r4 NULL? | ||
+ | bt MB_ElementCount_exit ! If yes, branch. | ||
+ | mov #0xFFFFFFE5, r1 | ||
+ | mov #0xFFFFFFE6, r7 | ||
+ | extu.b r1, r1 ! r1=229 | ||
+ | mov #0, r5 | ||
+ | bra loc_801A3478 | ||
+ | extu.b r7, r7 ! r7=230 | ||
+ | ! --------------------------------------------------------------------------- | ||
+ | |||
+ | MB_ElementCount_charLoop: | ||
+ | cmp/eq #0x7F, r0 | ||
+ | bt loc_801A3472 | ||
+ | cmp/eq r1, r0 | ||
+ | bt loc_801A3472 | ||
+ | cmp/eq r7, r0 | ||
+ | bt loc_801A3472 | ||
+ | mov #0xFFFFFFE7, r2 | ||
+ | extu.b r2, r2 | ||
+ | cmp/eq r2, r0 | ||
+ | bt loc_801A3472 | ||
+ | mov #0xFFFFFFF7, r2 | ||
+ | extu.b r2, r2 | ||
+ | cmp/eq r2, r0 | ||
+ | bt loc_801A3472 | ||
+ | mov #0xFFFFFFF9, r2 | ||
+ | extu.b r2, r2 | ||
+ | cmp/eq r2, r0 | ||
+ | bf loc_801A3474 | ||
+ | |||
+ | loc_801A3472: | ||
+ | add #1, r4 | ||
+ | |||
+ | loc_801A3474: | ||
+ | add #1, r4 | ||
+ | add #1, r5 | ||
+ | |||
+ | loc_801A3478: | ||
+ | mov.b @r4, r2 | ||
+ | extu.b r2, r0 | ||
+ | tst r0, r0 | ||
+ | bf MB_ElementCount_charLoop ! Branch if the character has a non-zero value. | ||
+ | rts | ||
+ | mov r5, r0 | ||
+ | ! --------------------------------------------------------------------------- | ||
+ | |||
+ | MB_ElementCount_exit: | ||
+ | rts | ||
+ | mov #0, r0 | ||
+ | ! End of function MB_ElementCount | ||
</nowiki> | </nowiki> | ||
}} | }} |
Latest revision as of 22:26, 14 February 2015
Contents
Synopsis
Header: fxcg/system.h
Syscall index: 0x1163
Function signature: int MB_ElementCount(const char* buf)
Counts the number of characters, as printed on screen, of a multi-byte string.
Parameters
- buf - pointer to the string to measure.
Returns
The number of characters in the string, as printed by multi-byte-aware syscalls.
Comments
Here is a disassembly of the function.
! =============== S U B R O U T I N E ======================================= MB_ElementCount: tst r4, r4 ! Is r4 NULL? bt MB_ElementCount_exit ! If yes, branch. mov #0xFFFFFFE5, r1 mov #0xFFFFFFE6, r7 extu.b r1, r1 ! r1=229 mov #0, r5 bra loc_801A3478 extu.b r7, r7 ! r7=230 ! --------------------------------------------------------------------------- MB_ElementCount_charLoop: cmp/eq #0x7F, r0 bt loc_801A3472 cmp/eq r1, r0 bt loc_801A3472 cmp/eq r7, r0 bt loc_801A3472 mov #0xFFFFFFE7, r2 extu.b r2, r2 cmp/eq r2, r0 bt loc_801A3472 mov #0xFFFFFFF7, r2 extu.b r2, r2 cmp/eq r2, r0 bt loc_801A3472 mov #0xFFFFFFF9, r2 extu.b r2, r2 cmp/eq r2, r0 bf loc_801A3474 loc_801A3472: add #1, r4 loc_801A3474: add #1, r4 add #1, r5 loc_801A3478: mov.b @r4, r2 extu.b r2, r0 tst r0, r0 bf MB_ElementCount_charLoop ! Branch if the character has a non-zero value. rts mov r5, r0 ! --------------------------------------------------------------------------- MB_ElementCount_exit: rts mov #0, r0 ! End of function MB_ElementCount
Example
The following example shows how a multi-byte string can take a memory space that's twice as large as the number of printed characters, and demonstrates how to count both size in bytes and graphical size:
const char*MBstring="\xe6\x92\xe6\x93\xe6\xa5" int bytelen = strlen(MBstring); // bytelen has a value of 6 int elemlen = MB_ElementCount(MBstring); // elemlen has a value of 3 locate_OS(2,3); Print_OS(MBstring, 0, 0); // will print three symbols on screen: an arrow up, an arrow down and a square.
Another example, which mixes standard and multi-byte characters:
const char*MBstring="Empty box: \xe6\xa5"; int bytelen = strlen(MBstring); // bytelen has a value of 13 int elemlen = MB_ElementCount(MBstring); // elemlen has a value of 12 locate_OS(2,3); Print_OS(MBstring, 0, 0); // will print "Empty box: " followed by a square.