Forums Casio - Projets de programmation

Index du Forum | Projets de programmation | SH4 compatibility tool
Ziqumu
Hors ligne
Membre d'honneur
Niveau: Intermédiaire
Points: 2917
Défis: 9
Message
Posté le 13/07/2013 21:00

SH4 compatibility tool :

Certains l'on vu, je bosse depuis quelques jours sur un moyen de rendre compatible les addin pour les calculatrices SH4 (power graphic 2), sans qu'on ai besoin d'avoir les sources originales.

Nous avons actuellement connaissances de plusieurs problèmes de compatibilité des addin. Il faudra les résoudre un par un, voici l'état actuel :
- La fonction IsKeyDown de la FxLib : Ok
Détails
Remonter
Problème : Actuellement la fonction IsKeyDown lit directement sur le port du clavier. Mais avec les nouveaux processeurs, les connexion du clavier aux cpu ont changé, et les ports ne sont plus les mêmes, donc on ne peut plus relire directement aux mêmes endroit.
Solution : Comme Casimo nous l'a montré, les SH4 ont un registre clavier qui peut être lut facilement. La solution est alors simplement de remplacer le code assembleur de la fonction IsKeyDown par un nouveau qui jump vers une fonction compatible que j'ajoute à la fin du fichier.(il suffit juste de modifier l'entete, mais ce n'est pas difficile grâce à Simon Lothar et sa doc)
Donc voilà le code qui va remplacer la fonction IsKeyDown. J'ai la flemme de traduire les commentaires, donc si vous ne comprenez pas, demandez

_IsKeyUpReplacement ; put this at offset 0xc of the IsKeyUp function. (the first two byte replaced : 63f0) THe length of the IsKeyUp function is 0x4c
    ;before : there is call of _KeyCodeConvert that put an array of two byte that respectivly contain the col and the line in the stack
    mov r15,r4 ; first param of my _GetKeyState function
    mov #2,r5 ; set slowmode of my _GetKeyState function
    mov.l GetKeyStateAddress2,r0
    jsr @r0 ;call _GetKeyState
    nop
    nop
    ;after _GetKeyState
    not r0,r0
    and #1,r0
    add #4,r15
    lds.l @r15+,pr
    rts
    nop
GetKeyStateAddress2:
    .data.l h'00301234 ; addres of my compatible _GetKeyState function : the set this address manually after compilation

ma fonction compatible _GetKeyState
Remonter
Cette fonction est compatible avec les cpu et peut attendre pour émuler les ancienne fonction qui sont lentes. Cette fonction est assez rapide (enfin pas aussi fast que KeyDown, mais KeyDown n'est pas compatible SH4), donc je pense que si je l'optimise un peu cette fonction pourrait être bien pratique pour les nouveaux programmes. Mais bon je débute en assembleur, donc bon on peut sans doute améliorer.
;param 1 (in r4) : Adress of an array of two unsigned char, with in the first cell the col, and in the second the row
;param 2 (in r5) : slowMode : this determine the time this function will wait to emulate the olds functions
;        -n : number of loop
;        0 : fatest as possible
;        1 : = duration of IsKeyDown function
;        2 : = duration of IsKeyUp function
;        3 : = duration of KeyDown function
;return (in r0) 1 if the key is pressed.
_GetKeyState
    ;First put actual value in the stack
    sts.l    pr,@-r15
    mov.l    r1,@-r15
    mov.l    r2,@-r15
    mov.l    r3,@-r15
    mov.l    r6,@-r15
    mov.l    r7,@-r15
    mov.l    r8,@-r15
    mov.l    r9,@-r15
    mov r4,r8 ; first param
    mov r5,r9 ; second param
    
;check the os version with the syscall 0x0015 | if I use only 1 byte for chars, and 2 for short, it crash on all calc but not on emulator. But these type are valid because the syscall only edit the correct number of byte.
    add #-4,r15 ; main version : unsigned char
    mov r15,r4
    add #-4,r15 ; minor version : unsigned char
    mov r15,r5
    add #-4,r15 ; release : unsigned short
    mov r15,r6
    add #-4,r15 ; build : unsigned short
    mov r15,r7
    ;call syscall
    mov.l #h'80010070,r2
    jsr    @r2
    mov #h'15,r0
    ;put os version into r6
    add #8,r15
    mov.b @r15,r6 ; minor version
    add #4,r15
    mov.b @r15,r0 ; main version
    add #4,r15
    shll8 r0 ; r0 = r0<<8
    add r0,r6
;reserved registers :
    ;r9 second param
    ;r6 OS version
; read and checks coords
    mov.b @r8,r7 ; r7 = Key's column
    mov.b @(1,r8),r0
    mov r0,r8 ; r8 = Key's row
    ;verify the row value  : 0 ≤ row ≤ 9
    mov #0, r0
    cmp/gt r8,r0 ; if r0 > r8 ⇒ if 0 > row
    bt NegativeEnd
    mov #9,r1
    cmp/gt r1,r8 ; if r8 > r1 ⇒ if row > 9
    bt NegativeEnd
    ;verify the column value  : 0 ≤ row ≤ 6
    cmp/gt r7,r0 ; if r0 > r7 ⇒ if 0 > column
    bt NegativeEnd
    mov #6,r1
    cmp/gt r1,r7 ; if r7 > r1 ⇒ if column > 6
    bt NegativeEnd
;check if os is > 2.02
    mov.w #h'0202,r0
    cmp/ge r0,r6 ; r0 ≤ r6
    bt SH4
;reserved registers :
    ;r9 second param
    ;r8 Key's row
    ;r7 Key's col
;SH3 part
    ;r6 = smask = 0x0003 << (( row %8)*2);
    mov r8,r0 ; row->r0
    and #7,r0 ; %8
    add r0,r0 ; *2
    mov #3,r6
    shld r0,r6 ; 3<<
    ;r5 = cmask = ~( 1 << ( row %8) );
    mov r8,r0 ; row->r0
    and #7,r0 ; %8
    mov #1,r5
    shld r0,r5 ; 1<<
    not r5,r5 ; ~
;reserved registers :
    ;r9 second param
    ;r8 Key's row
    ;r7 Key's col
    ;r6 smask
    ;r5 cmask
;Preparation of the gbr register
    mov.l #h'A4000100,r0
    ldc r0,gbr
;RowCond : if(row <8)
    mov #8,r0
    cmp/gt r8,r0 ; if r0>r8 ; row>=8
    bf rowCond_Else
;rowCond_begin
    ;*PORTB_CTRL = 0xAAAA ^ smask;
    mov r6,r0
    mov.w #h'AAAA,r1
    xor r1,r0
    mov.w r0,@(h'02,gbr)
    ;*PORTM_CTRL = (*PORTM_CTRL & 0xFF00 ) | 0x00AA;
    mov.w @(h'18,gbr),r0 ; *PORTM_CTRL->r0
    mov.w #h'FF00,r1
    and r1,r0 ;  *PORTM_CTRL & 0xFF00
    or #h'AA,r0 ;  | 0x00AA;
    mov.w r0,@(h'18,gbr)
    ;delay()
    bsr delay
    mov #-10,r4
    ;*PORTB = cmask;
    mov r5,r0
    mov.b r0,@(h'22,gbr) ;PORTB = cmask
    ;*PORTM = (*PORTM & 0xF0 ) | 0x0F;
    mov.b @(h'38,gbr),r0 ; *PORTM->r0
    and #h'F0,r0 ; *PORTM & 0xF0
    or #h'0F,r0 ;  | 0x0F;
    mov.b r0,@(h'38,gbr)
    bra rowCond_End
    nop
rowCond_Else:
    ; *PORTB_CTRL = 0xAAAA;
    mov.w #h'AAAA,r0
    mov.w r0,@(h'02,gbr)
    ; *PORTM_CTRL = ((*PORTM_CTRL & 0xFF00 ) | 0x00AA)  ^ smask;
    mov.w @(h'18,gbr),r0
    mov.w #h'FF00,r1
    and r1,r0 ;  *PORTM_CTRL & 0xFF00
    or #h'AA,r0 ;  | 0x00AA;
    xor r6,r0 ;  ^ smask;
    mov.b r0,@(h'18,gbr)
    ;delay()
    bsr delay
    mov #-10,r4 ;In the begin this was 5, but as the delay function is faster, i need to put more
    ;*PORTB = 0xFF;
    mov.b #h'ff,r0
    mov.b r0,@(h'22,gbr) ;PORTB = 0xFF
    ;*PORTM = (*PORTM & 0xF0 ) | cmask;
    mov.b @(h'38,gbr),r0
    and #h'F0,r0 ; *PORTM & 0xF0
    or r5,r0 ;  | cmask;
    mov.b r0,@(h'38,gbr)
rowCond_End:
    ;reserved registers :
        ;r9 second param
        ;r8 Key's row
        ;r7 Key's col
    ;delay()
    bsr delay
    mov #-10,r4
    ;result = (~(*PORTA))>>column & 1;
    mov.b @(h'20,gbr),r0
    not r0,r6 ; r6 = ~r0
    neg r7,r0 ; r0 = -column
    shld r0,r6 ; r6 = r6>>column
    mov.b #1,r0
    and r0,r6
    ;reserved registers :
        ;r9 second param
        ;r8 Key's row
        ;r7 Key's col
        ;r6 result
    ;delay()
    bsr delay
    mov #-10,r4
    ; *PORTB_CTRL = 0xAAAA;
    mov.w #h'AAAA,r0
    mov.w r0,@(h'02,gbr)
    ;*PORTM_CTRL = (*PORTM_CTRL & 0xFF00 ) | 0x00AA;
    mov.w @(h'18,gbr),r0
    mov.w #h'FF00,r1
    and r1,r0 ;  *PORTM_CTRL & 0xFF00
    or #h'AA,r0 ;  | 0x00AA;
    mov.w r0,@(h'18,gbr)
    ;delay()
    bsr delay
    mov #-10,r4
    ; *PORTB_CTRL = 0x5555;
    mov.w #h'5555,r0
    mov.w r0,@(h'02,gbr)
    ;*PORTM_CTRL = (*PORTM_CTRL & 0xFF00 ) | 0x0055;
    mov.w @(h'18,gbr),r0
    mov.w #h'FF00,r1
    and r1,r0 ;  *PORTM_CTRL & 0xFF00
    or #h'55,r0 ;  | 0x0055;
    mov.w r0,@(h'18,gbr)
    ;delay()
    bsr delay
    mov #-10,r4
    ;End of SH3 part
    bra AllEnd
    nop
SH4:
    ;Add 3 to the second param (if >0)to select the right wait time
    mov #0,r0
    cmp/gt r0,r9
    bf negatif2ndParam
    add #3,r9
negatif2ndParam:
    ;get the main keyboard regsiter address+1
    mov.l #H'A44B0001,r1
    mov r8,r0
    tst #1,r0 ;if row is even T=1 else T=0
    add r8,r1
    bt row_even ; Jump if T=1
    add #-2,r1
row_even:
    mov.b @r1,r0 ; The byte that contain the row data is now in R0
    mov #1,r1
    shld r7,r1 ; R9 now contain 1<<col
    tst r1,r0 ; if key is pressed T=0
    movt r0
    not r0,r0
    and #h'1,r0
    mov r0,r6
    bra AllEnd
    nop
NegativeEnd:
    mov #0,r6
;reserved registers :
    ;r9 second param
    ;r8 Key's row
    ;r7 Key's col
    ;r6 result
AllEnd:
    ;Wait the correct time to emulate old functions
    bsr delay
    mov r9,r4
    ;put result to return register : r0
    mov r6,r0
    ;take out data from stack
    mov.l    @r15+,r9
    mov.l    @r15+,r8
    mov.l    @r15+,r7
    mov.l    @r15+,r6
    mov.l    @r15+,r3
    mov.l    @r15+,r2
    mov.l    @r15+,r1
    lds.l    @r15+,pr
    rts
    nop




; delay : Wait a defined time
;param 1 (in r4) : slowMode : this determine the time this function will wait to emulate the olds functions
;        -n : number of loop
;        0 : fatest as possible (equivalent to -1)
;        1 : = duration of IsKeyDown function for SH3
;        2 : = duration of IsKeyUp function for SH3
;        3 : = duration of KeyDown function for SH3
;        4 : = duration of IsKeyDown function for SH4
;        5 : = duration of IsKeyUp function for SH4
;        6 : = duration of KeyDown function for SH4
delay:
;if r4<=0 then it's the number of loop
    mov #0,r0
    cmp/ge r0,r4
    bf LoopNumber
;Search the number of loop needed
    add r4,r4 ; *2
    mova loopNumbersList,r0
    add r4,r4 ; *2 because there is 4 byte per number of loop (this method take less space than use "MUL.L")
    add r4,r0
    mov.l @r0,r1
    bra target_loopBegin
    nop ; this nop is added because without the loopNumbersList is not divisible per 4
loopNumbersList:
    .data.l h'0001    ;fastest
    .data.l h'0001    ;IsKeyDown SH3
    .data.l h'0001    ;IsKeyUp SH3
    .data.l h'0001    ;KeyDown SH3
    .data.l h'0001    ;IsKeyDown SH4
    .data.l h'0001    ;IsKeyUp SH4
    .data.l h'0001    ;KeyDown SH4
LoopNumber:
    neg r4,r1
;Begin : r1 contain the number of loop
target_loopBegin:
    dt r1 ; decrement and test if(r1==0)
    bf target_loopBegin
    rts
    nop

Voilà les mesures que j'ai fait pour calculer le temps que prend chaque fonction. (copier ce code dans un editeur texte pour mieux voir..)
;Loop numbers tests : Number of tick taked to execute 5000 times the function
;I made some change between and after theses test so it's possible that if you do it again, you don't find same number, but the little difference will not be really significant. Because this test is on a loop of 5000 times, and mesured in tick (I'm not sure, but I remember it's egal to 1/64 seconds) and one tick is not verry significant for human.
;--------------------------------------------------------------------------------
;                                   |Original   |   SH3         |   SH4         |
;--------------------------------------------------------------------------------
;IsKeyDown                          |0xb2       |0x17(miss 155) |0x11(miss 161) |
;IsKeyDown with 0x1000 waitloop     |----       |0x17b          |0x1cd          | : Conclusion 0x1000 loop takes 0x164 ticks to be executed on SH3=> (1024/89) loop/ticks
                                                                                | SH4=> (1024/111) loop/ticks | (I think I've make a mistake somewhere, because on my first try, number of loop was stored in Word (2byte),
                                                                                | and there was (1024/89) loop/ticks for both cpu, but since I change from word to longword (4byte) and now the sh4 is slower..No idee why.
;IsKeyDown|sh3:1783|sh4:1485        |----       |0xb2           |0xb2           |
;--------------------------------------------------------------------------------
;IsKeyUp                            |0x1a43     |0x17(miss 6700)|0x11(miss 6706)|
;IsKeyDown|sh3:0x12D1F|sh4:0xF1A8   |----       |0x1a42         |0x1a4a         |
;--------------------------------------------------------------------------------
;KeyDown                            |0x9        |0x11           |0xd            | : As the original function is faster than the compatible, we put the slowmode at the minimum for both cpu : 1
;--------------------------------------------------------------------------------

J'ai fais les tests avec ce code

int AddIn_main(int isAppli, unsigned short OptionNum)
{
    unsigned int timeBegin;
    unsigned int duration;
    char string[9];
    int i;
    while(1)
    {
        timeBegin = RTC_GetTicks();//RTC_GetTicks is a syscall documented in FxReverse
        for(i=0;i<5000;i++)
        {
            key_down(K_EXE);//Change this function here
        }
        duration = RTC_GetTicks()-timeBegin;
        intToHex(duration, string);
        
        Bdisp_AllClr_DDVRAM();
        locate(1,1);
        Print((unsigned char*)string);
        Bdisp_PutDisp_DD();
    }

    return 1;
}

void intToHex(unsigned int in, char* string)
{
    string[0] = nibbleToHex((unsigned char)in>>28);
    string[1] = nibbleToHex((unsigned char)(in>>24)&0xF);
    string[2] = nibbleToHex((unsigned char)(in>>20)&0xF);
    string[3] = nibbleToHex((unsigned char)(in>>16)&0xF);
    string[4] = nibbleToHex((unsigned char)(in>>12)&0xF);
    string[5] = nibbleToHex((unsigned char)(in>>8)&0xF);
    string[6] = nibbleToHex((unsigned char)(in>>4)&0xF);
    string[7] = nibbleToHex((unsigned char)in&0xF);
    string[8] = 0;
}


char nibbleToHex(unsigned char in)
{
    char out;
    if(in <= 9)
        out = 0x30 + (unsigned int)in;
    else
    {
        switch(in-10)
        {
            case  0 : out = 0x61; break;
            case  1 : out = 0x62; break;
            case  2 : out = 0x63; break;
            case  3 : out = 0x64; break;
            case  4 : out = 0x65; break;
            case  5 : out = 0x66; break;
        }
    }
    return out;
}

- La fonction IsKeyUp de la FxLib : ok
Details
Remonter
Problème : 2 grosse mais mauvaises surprises !
La première c'est que cette fonctione ne marche pas dutout pareil que IsKeyDown. Elle utilise le syscall 0x24C appelé "Chattering" dans la fxLib.
Le prototype semble être
int Chattering(unsigned char* coord);
avec dans coord un tableau de deux char, dans le premier la collonne de la touche et dans la seconde la ligne. The syscall retourne 1 quand une touche est pressé.
Seconde suprise : Les syscall sont écris dans l'OS, donc quand casio met à jour son OS, généralement ils mettent à jour les syscalls pour qu'ils fonctionnent de nouveau. Mais là ce n'est pas le cas, apparemement ils l'ont volontairement désactivé. (s'ils l'avaient juste oublié elle ne retournerais pas 0 sur les SH4 mais crasherais tout simplement)
Solution : Bref, j'ai utilisé la même solution que pour IsKeyDown, sauf que j'ai foutu un "not" à la fin.
_IsKeyUpReplacement ; put this at offset 0xc of the IsKeyUp function. (the first two byte replaced : 63f0) THe length of the IsKeyUp function is 0x4c
    ;before : there is call of _KeyCodeConvert that put an array of two byte that respectivly contain the col and the line in the stack
    mov r15,r4 ; first param of my _GetKeyState function
    mov #2,r5 ; set slowmode of my _GetKeyState function
    mov.l GetKeyStateAddress2,r0
    jsr @r0 ;call _GetKeyState
    nop
    nop
    ;after _GetKeyState
    not r0,r0
    and #1,r0
    add #4,r15
    lds.l @r15+,pr
    rts
    nop
GetKeyStateAddress2:
    .data.l h'00301234 ; addres of my compatible _GetKeyState function : the set this address manually after compilation

- La fonction KeyDown utilisé par plusieurs addins : ok
details
Remonter
Problème : Même problème que pour IsKeyDown, le port du clavier change donc c'est la merde. Ici pour identifier la fonction dans le fichier compilé, c'est un peu plus compliqué car le code n'est pas précompilé comme dans la fxlib et peut donc varier. J'ai trouvé deux formes de la fonction KeyDown. L'une lorsque l'offset de la première ligne de la fonction est divisible par 4 et l'autre lorsque que modulo 4 elle est egal à 2. J'explique cela par le fait qu'il y a certaines instructions qui ne fonctionnent pas correctement lorsque la ligne est divisible par 4 ou non : par exemple
mov.l @(h'4,pc),r0
parce qu'il peut lire un longword(4byte) qu'à un offset divisible par 4 et que le nombre en paramètre doit être un multiple de 4. Ca explique la différence.
Solution : Donc j'ai remplacé la fonction KeyDown trouvé par :
_KeyDownReplacement ; put this at beginning of the KeyDown function. (the first four byte replaced : 2FE6634C) THe length of the KeyDown function is 0x100
    ;before : keycode in r4 ; keycode=col<<4 + row
    sts.l pr,@-r15
    mov.l r1,@-r15
    mov.l r5,@-r15
    ; add #-2,r15 ;r15 need to always contain a number divisible by 4 (because when we put a longword of 4byte in the stack, we can only put it on adress multiple of 4)
    ;get the col
    mov #-4,r0
    mov r4,r1
    shld r0,r1
    ;get the row
    mov r4,r0
    and #h'f,r0
    ; mov.b r0,@-r15
    ; mov.b r1,@-r15
    ;prepartion of the array content
    shll8 r1
    add r0,r1
    shll16 r1
    mov.l r1,@-r15
    ;prepare _GetKeyState call
    mov r15,r4 ; get array address
    mov #3,r5 ; set slowmode of _GetKeyState function
    mov.l GetKeyStateAddress3,r0
    jsr @r0 ;call _GetKeyState
    nop
    ;after _GetKeyState
    add #4,r15
    mov.l @r15+,r5
    mov.l @r15+,r1
    lds.l @r15+,pr
    rts
    nop
GetKeyStateAddress3:
    .data.l h'00301234 ; addres of my compatible _GetKeyState function : the set this address manually after compilation

- Un problème d'appel de syscall, qui cause notamment l'incompatibilités de la monochromeLib : ok
details
Remonter
Problème : Dans la methode utilisé par la monochrome lib :
static int SysCallCode[] = {0xD201422B,0x60F20000,0x80010070};
static int (*SysCall)( int R4, int R5, int R6, int R7, int FNo ) = (void*)&SysCallCode;
char* ML_vram_adress()
{
    return (char*)((*SysCall)(0, 0, 0, 0, 309));
}

Le tableau SysCallCode est écris dans la mémoire (à l'adresse > 0x0810000, je ne sais pas quelle est cette mémoire, la seule chose que je sais, c'est que les addresse vers celle-ci sont écrite en dur dans le fichier et donc par conséquence elle est vide lors du chargement de l'addin). Quand ce tableau est écris en mémoire; il jump ensuite dessus (le contenu de ce tableau est un code binaire qui permet de lancer les syscall). Mais apparemment, sur les calculatrice SH4, on peut toujours lire et écrire dans cette mémoire mais on ne peut plus l'éxécuter et c'est pourquoi il plante et que l'addresse de PC à ce moment là est du style 0x0810000. Une solution simple est de ne pas copier ce tableau dans cette mémoire en le mettant en tant que constante. Ainsi, le tableau sera lu directement dans le fichier (enfin le fichier qui est chargé en mémoire) et cette partie est évidement exécutable donc il ne va pas planter.
static [red]const [/red]int SysCallCode[] = {0xD201422B,0x60F20000,0x80010070};
static int (*SysCall)( int R4, int R5, int R6, int R7, int FNo ) = (void*)&SysCallCode;
char* ML_vram_adress()
{
    return (char*)((*SysCall)(0, 0, 0, 0, 309));
}

Et ça fonctionne bien
Solution : Le code ci-dessus ne fonctionne pas pour nous car on ne peux pas modifier le C sans les sources.
Un autre problem est qu'il y a différents codes pour fonction d'appel de syscall car ca dépend des paramètres (ça change quand c'est une constante, une variable, un pointer..)
Voilà un code qui peut être généré.

mov.l @(H'114,pc),r3 ;//It get the address where is writed the address to the array, here it's 0x08100014
mov.l @(H'10c,pc),r2 ;//It get the syscall number, here it's 0x135
mov.l @r3,r0 ;//It get the address to the array, here it's 0x08100008
jsr @r0 ;//Jump to the array
mov.l r2,@-r15 ;//This is executed just before to jump : it put the syscall number in the stack

Pour régler ce problème je met ce code à la fin du fichier.

_SyscallFix
    mov.l #h'80010070,r2 ;//the syscall table (where we jump to execute a syscall)
    jmp @r2 ;//Jump to the syscall table
    mov.l @r15,r0 ;//Just before to jump, put the value in the stack to the register r0 (the value in the stack is the syscall number)

Et dans notre code original, je le modifie un peu :

mov.l @(H'114,pc),r3 ;// I change the value pointed to be the address of my function SyscallFix (added at the end of the file)
mov.l @(H'10c,pc),r2 ;
mov.l r3,r0 ;//change to put the address get at the first line in r0
jsr @r0 ;//Jump to the my added code
mov.l r2,@-r15 ;

Et ça marche bien. Cependant la partie la plus dure est de trouve le code à changer, mais toutes les lignes que je vous ai donné sont des lignes qui sont toujorus là, parfois séparé par d'autres instructions, mais elles sont toujours là et c'est comme ça qu'on peux le repérer.


Donc tout ce que je voulais faire est fini, mais malheureusement tous les addins ne sont pas compatible, il y a d'autres bug. Je pense qu'il y a un peu plus de la moitié des addin incompatible qui sont maintenant compatible.
La difficulté est de trouver quel est le problème en fait car on a pas d’émulateur SH4 pour voir ce qu'il se passe réellement.

Je garde la calculatrice SH4 jusqu'à la fin de la semaine, donc j’essaierais de régler quelques problèmes cette semaines, mais après je part sur d'autres projets.
Mais pour l'instant, dites moi s'il y a des addins incompatibles, j’essaierais de voir ce que je peux faire. Voilà un début de liste
Liste des incompatibilités
Remonter
- Dead Labs - come back to the main menu after the introduction
- Doodle jump - Reboot - maybe cause of the grayscale
- MarioLandCE - white screen after introduction (where the grayscale begin)


SH4 compatibility tool v1.01


Faites attention ! Cet outil, peut éventuellement se révéler dangereux pour votre calculatrice. En effet une minuscule erreur pourrait par exemple empêcher de faire démarrer votre calculatrice. Je met donc cet utilitaire à votre disposition, cependant c'est à vos risques et périls que vous l'utilisez et ni moi, ni Planet-Casio ne seront responsable en cas de dégât !

Comme preuve de son fonctionnement, je vous propose de découvrir une légende sur calculatrices casio, j'ai nommé
Wolfenstein 3D - Version SH4


Merci à :
- Casimo pour ses premiers codes de compatibilité SH4
- Simon Lothar et Andreas Bertheussen pour leur documentation et leurs syscall
- Kristaba pour ce topic
- Alphacreator et Maliafo pour avoir tester les premiers programmes de test SH4
- Ayfer-Marie pour le prêt de sa calculatrice (qui d'après ce qu'elle m'a dit s’appel Reviens)

English topic

Fichier joint



Dark storm
En ligne
Administrateur
Niveau: Aucun
Points: 9616
Défis: 170
Message
Dernier message de la page précédente :Posté le 05/08/2013 12:49 |
du genre Shift + up + down => Alpha + up + down (visible dans Gravity Duck)
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard



Pages: Précédente | 1, 2, 3 | Suivante

Ziqumu
Hors ligne
Membre d'honneur
Niveau: Intermédiaire
Points: 2917
Défis: 9
Message
Citer : Posté le 05/08/2013 13:33 | #
Oui, je suis au courant de ça, mais je crois que j'y peut rien, sachant que je lis le registre clavier directement, c'est lui qui doit comporter ces "bugs" (en soit c'est pas des bugs, ça doit être la disposition du clavier qui est comme ça). Je vois pas trop ce que je peux y faire.
Dark storm
En ligne
Administrateur
Niveau: Aucun
Points: 9616
Défis: 170
Message
Citer : Posté le 05/08/2013 13:40 | #
bah, tant pis, ce n'est qu'un détail
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Ziqumu
Hors ligne
Membre d'honneur
Niveau: Intermédiaire
Points: 2917
Défis: 9
Message
Citer : Posté le 05/08/2013 13:44 | #
Attend nan, sur SH3 ça devrait pas arriver, faudra que je regarde ce qui se passe.
Eiyeron
Hors ligne
Ancien modérateur
Niveau: Élite
Points: 5513
Défis: 57
Message
Citer : Posté le 05/08/2013 16:47 | #
Même sur SH3 ça arrive. Je n'ai jamais pu corriger l'éventuel problème. Je n'avais pas le niveau à l'époque. Je devrais me pencher sur ce douloureux problème.
Lancelot
Hors ligne
Membre
Niveau: Élite
Points: 1274
Défis: 160
Message
Citer : Posté le 27/08/2013 17:55 | #
L'astuce pour changer e contraste sur Orton SH4 ne fonctionne toujour pas. Mais j'ai trouvé le moyen de le remettre comme avant en mettant le jeu sur pause (menu) puis en éteinant la calculatrice. Mais il faut recommencer ceci à chaque niveau .
----------------------------------
Calculatrices : Casio 35+ SH4 (modifiée 75) et fx-CG 20 PRIZM
Projets que je soutiens
Des exemples parmi tant d'autres
Pokémon Jade de Dododormeur
Zelda de Smashmaster
Super Geek Brothers de Siapran
Mes Programmes
Mes Programmes
Mes Projets
Mes Projets
ColorLib
Add-ins Jetpack Joyride et Pac-Man sur PRIZM (les 2 non commencés mais en réflexion)
A la recherche des sprites jetpack Joride si quelqu'un les a en couleur
Btl
Hors ligne
Ancien modérateur
Niveau: Vétéran
Points: 3879
Défis: 107
Message
Citer : Posté le 08/02/2014 19:51 | #
Aujourd'hui je viens de résoudre une affaire qui m'embêtes depuis 2 mois....

Pourquoi MultiTask n'est pas compatible SH4.
Pourtant, j'avais bien rajouté tout le code nécessaire, changé celui de MonochromeLib, je n'utilisais pas les niveaux de gris...

Mais, je me suis rendu compte que l'outils de Ziqumu avait l'air de marcher vraiment bien pour les anciens jeux, alors j'ai viré le code qu'il fallait mettre en en-tête, et j'ai utilisé l'outils de Ziq' (qui ne marche pas, si vous avez mis le code spécial au début).

Et.... ça a fonctionné !

Tout ça pour dire que si le code d'en-tête ne marche pas, essayer de le supprimer et utilisez l'outils de Ziq', on ne sait jamais.
----------------------------------
Un excellent tuto video qui vous explique comment transférer des fichiers de l'ordinateur vers la calculatrice et vice versa ma chaine youtube
mes jeux
mes jeux

Jouez à 6 sur une seule calto : Curve Fever
Un die and retry qui vous fera bieeeen rager Test Andropov
un très bon sokoban
le seul vrai jeu de foot en basic : FIFA 12
Ca c'est ce que j'appelle un jeu de reflexion jewel master
Qui vaincra l'intelligence artificielle de cet othello
Le célèbre pacman
Et tant d'autres BTL's games

Le jeu du mois de Novembre et award du jeu le plus dur de l'année 2013 MultiTask, testez-le
Ziqumu
Hors ligne
Membre d'honneur
Niveau: Intermédiaire
Points: 2917
Défis: 9
Message
Citer : Posté le 08/02/2014 19:55 | #
Le concept du code en en-tete est justement de ne pas avoir besoin de l'outil, et c'est d'ailleurs mieux de pas utiliser l'outil, car c'est du bidouillage. (genre bourrain je remplace des morceau de code en plein milieu en esperant que ça fonctionne)
Btl
Hors ligne
Ancien modérateur
Niveau: Vétéran
Points: 3879
Défis: 107
Message
Citer : Posté le 08/02/2014 19:57 | #
Je le sais bien et c'est pour ça que je l'ai utilisé en dernière solution, car ça me paraissait impossible que l'en-tête ne marche pas, mais ton programme oui...

Mais comme je l'ai indiqué :
BTL a écrit :
Tout ça pour dire que si le code d'en-tête ne marche pas, essayer de le supprimer et utilisez l'outils de Ziq', on ne sait jamais.
----------------------------------
Un excellent tuto video qui vous explique comment transférer des fichiers de l'ordinateur vers la calculatrice et vice versa ma chaine youtube
mes jeux
mes jeux

Jouez à 6 sur une seule calto : Curve Fever
Un die and retry qui vous fera bieeeen rager Test Andropov
un très bon sokoban
le seul vrai jeu de foot en basic : FIFA 12
Ca c'est ce que j'appelle un jeu de reflexion jewel master
Qui vaincra l'intelligence artificielle de cet othello
Le célèbre pacman
Et tant d'autres BTL's games

Le jeu du mois de Novembre et award du jeu le plus dur de l'année 2013 MultiTask, testez-le
Alphacreator
Hors ligne
Membre
Niveau: Confirmé
Points: 1464
Défis: 43
Message
Citer : Posté le 08/02/2014 20:00 | #
Vous parlez que quel en-tête exactement?
----------------------------------
Lancelot
Hors ligne
Membre
Niveau: Élite
Points: 1274
Défis: 160
Message
Citer : Posté le 08/02/2014 20:21 | #
Le morceau de code qui permettait de faire compatible SH4, je pense
----------------------------------
Calculatrices : Casio 35+ SH4 (modifiée 75) et fx-CG 20 PRIZM
Projets que je soutiens
Des exemples parmi tant d'autres
Pokémon Jade de Dododormeur
Zelda de Smashmaster
Super Geek Brothers de Siapran
Mes Programmes
Mes Programmes
Mes Projets
Mes Projets
ColorLib
Add-ins Jetpack Joyride et Pac-Man sur PRIZM (les 2 non commencés mais en réflexion)
A la recherche des sprites jetpack Joride si quelqu'un les a en couleur
Theernest570
Hors ligne
Membre
Niveau: Intermédiaire
Points: 64
Défis: 5
Message
Citer : Posté le 02/11/2014 17:58 | #
Merci j'ai utilisé cet outil sur mon .G1A et maintenant les "IsKeyDown()" fonctionnent par contre, lorsque je déplace mon personnage vers le haut de l'écran, je remarque qu'il y a une bande de pixels (entre y=10 et y=18 environ) qui se clear à chaque tick

Ça ne vient apparemment pas de mon programme car il fonctionne très bien sur l’émulateur du SDK
Bon, je vais essayer de régler le problème sinon, je vais devoir me débrouiller pour ne pas utiliser ces pixels

Plus bizarre encore ...
J'ai trouvé un moyen d'empêcher les pixels de se clear :
je restart ma calto et que je lance le jeu 2 fois de suite ( attention ! surtout pas 3 ... )
----------------------------------
Calto : Graph 35+(tweaké)
Projets
Fermer

- Un pong multijoueur avec le cable 3pin
- Communication IR entre caltos (Arduino)
Lephenixnoir
En ligne
Administrateur
Niveau: Confirmé
Points: 10114
Défis: 130
Message
Citer : Posté le 02/11/2014 18:45 | #
C'est bizarre quand même.
On pourrait pas avoir le code ?
----------------------------------
La sagesse est la prunelle de tes yeux, et la gloire l’enveloppe de ton cœur.
Theernest570
Hors ligne
Membre
Niveau: Intermédiaire
Points: 64
Défis: 5
Message
Citer : Posté le 03/11/2014 22:00 | #
Zut ... J'ai fini par supprimer le prog mais j'en ai fait un autre pour test et il a exactement les mêmes problèmes :/

1. Soit ma calto bug ( n'ayant pas digeré le fait d'être tweak ... )

2. Soit je code comme un pied ( ce qui est très possible comme je débute en C ).

Je te passe le code de test demain après-midi quand je pourrais (en tout cas il fonctionne nikel sur emulateur)
----------------------------------
Calto : Graph 35+(tweaké)
Projets
Fermer

- Un pong multijoueur avec le cable 3pin
- Communication IR entre caltos (Arduino)
Lephenixnoir
En ligne
Administrateur
Niveau: Confirmé
Points: 10114
Défis: 130
Message
Citer : Posté le 03/11/2014 22:01 | #
J'ai jamais eu de problème avec le SH4 CT, donc je crois que ça doit pouvoir se corriger au niveau du code.
----------------------------------
La sagesse est la prunelle de tes yeux, et la gloire l’enveloppe de ton cœur.
Theernest570
Hors ligne
Membre
Niveau: Intermédiaire
Points: 64
Défis: 5
Message
Citer : Posté le 03/11/2014 22:30 | #
Le seul problème est que ça fonctionne sur l'emulateur du SDK :/ Du coup, je pourrais être tenté de dire que ma calto bug MAIS tous mes autres addins fonctionnent
Quand Ziqumu dit que SH4 CT peut causer des problèmes, est ce que ces problèmes pourraient être résolus en rechargeant l'OS d'une G75 sur ma 35+ ? (Histoire de virer les bugs)
-> si c'est le cas je sait ce qu'il me reste a faire :/

En tout cas si ça ne fonctionne toujours pas, je te passerais les codes et des screenshots demain si j'en ai le temps
----------------------------------
Calto : Graph 35+(tweaké)
Projets
Fermer

- Un pong multijoueur avec le cable 3pin
- Communication IR entre caltos (Arduino)
Lephenixnoir
En ligne
Administrateur
Niveau: Confirmé
Points: 10114
Défis: 130
Message
Citer : Posté le 04/11/2014 06:20 | #
Non, remettre un OS ne servirait à rien.
En fait ce que fait le SH4 CT -- et qui est un peu barbare à la base --, c'est qu'il repère des morceaux de code connus pour être non compatibles SH4 (IsKeyDown()) et autres, il les vire et les remplace par des nouvelles fonctions compatibles.
À la réflexion, ça tient un peu du miracle que ça fonctionne, mais on va pas s'en plaindre.
----------------------------------
La sagesse est la prunelle de tes yeux, et la gloire l’enveloppe de ton cœur.
Theernest570
Hors ligne
Membre
Niveau: Intermédiaire
Points: 64
Défis: 5
Message
Citer : Posté le 04/11/2014 19:26 | # | Fichier joint
Hum, tu as donc raison, ça surement de mon code (j'ai re-testé avec un programme sans IsKeyDown et SH4 CT -> et avec la library "usefull" et j'ai toujours ces problèmes de pixels :/ ) Je met une photo (de qualité médiocre ) en pièce jointe pour te montrer le problème :/ -> sur la photo, la ligne coupée est censée être entière (tu remarquera qu'il y a maintenant 2 zone sans pixels )

Sinon, voilà les codes (c'est pas très optimisé mais je le ferais plus tard )

pong.c :


[brown]#include [gray]"usefull.h"[/gray][/brown]
[brown]#include [gray]"pong.h"[/gray][/brown]

[purple]int[/purple] AddIn_main(int isAppli, unsigned short OptionNum)
{
    
    Player player = {
        8, [maroon]27[/maroon], [maroon]3[/maroon], [maroon]10[/maroon]
    };
    
    Player oPlayer = {
        116, [maroon]27[/maroon], [maroon]3[/maroon], [maroon]10[/maroon]
    };
    
    Ball ball = {
        63, [maroon]32[/maroon], [maroon]3[/maroon], [maroon]3[/maroon], [maroon]0[/maroon], [maroon]0[/maroon]
    };
    
    
    [b][blue]while[/blue][/b](1){
        
        [b][blue]if[/blue][/b](key_down(K_F6)) [b][blue]break[/blue][/b]; [green]// F6 - PROGRAM_END [/green]
        
        update(&player, &oPlayer, &ball);
        draw(&player, &oPlayer, &ball);
        
        setFps(64);
    }

    [b][blue]return[/blue][/b] 1;
}

void update(Player *player, Player *oPlayer, Ball *ball) {
    [green]// keys : 0=UP 1=DOWN 2=EXE[/green]
    [purple]char[/purple] key = checkKey();
    [b][blue]if[/blue][/b](key == [maroon]0[/maroon]) { [green]// UP PRESSED[/green]
        (*player).y--;
    }else [b][blue]if[/blue][/b](key == [maroon]1[/maroon]) { [green]// DOWN PRESSED[/green]
        (*player).y++;
    }
    
}

[purple]char[/purple] checkKey() {
    [b][blue]if[/blue][/b](key_down(K_UP)) [b][blue]return[/blue][/b] 0;            [green]// UP PRESSED[/green]
    [b][blue]else[/blue][/b] if(key_down(K_DOWN)) [b][blue]return[/blue][/b] 1;        [green]// DOWN PRESSED[/green]
    [b][blue]else[/blue][/b] return -1;
}

void draw(const Player *player, const Player *oPlayer, const Ball *ball) {
    Bdisp_AllClr_VRAM();
    
    Bdisp_DrawLineVRAM((*player).x, (*player).y, [maroon]1[/maroon], [maroon]1[/maroon]);
    
    Bdisp_AllClr_DD();
    Bdisp_PutDisp_DD();
}

void drawPlayer() {
    
}

[brown]#pragma section _BR_Size[/brown]
unsigned long BR_Size;
[brown]#pragma section[/brown]


[brown]#pragma section _TOP[/brown]

[purple]int[/purple] InitializeSystem(int isAppli, unsigned short OptionNum)
{
    [b][blue]return[/blue][/b] INIT_ADDIN_APPLICATION(isAppli, OptionNum);
}

[brown]#pragma section[/brown]



et pong.h :



[brown]#ifndef PONG[/brown]
[brown]#define PONG[/brown]

    typedef [purple]struct[/purple] Player Player;
    [purple]struct[/purple] Player {
        [purple]unsigned char[/purple] x;
        [purple]unsigned char[/purple] y;
        [purple]unsigned char[/purple] w;
        [purple]unsigned char[/purple] h;
    };
    
    typedef [purple]struct[/purple] Ball Ball;
    [purple]struct[/purple] Ball {
        [purple]unsigned char[/purple] x;
        [purple]unsigned char[/purple] y;
        [purple]unsigned char[/purple] w;
        [purple]unsigned char[/purple] h;
        [purple]char[/purple] velX;
        [purple]char[/purple] velY;
    };
    
    void update(Player*, Player*, Ball*);
        [purple]char[/purple] checkKey();
    
    void draw(const Player*, const Player*, const Ball*);
        void drawPlayer();

#endif



(j'ai aussi légèrement modifié usefull.c de manière a pouvoir écrire setFps(64) au lieu de setFps(2) par exemple)
je le met même si je ne pense pas que le problème vient de là


void setFps(int target)
{
[purple]unsigned int[/purple] fpsWish = [maroon]128[/maroon]/target;
static [purple]unsigned int[/purple] fps = [maroon]0[/maroon], fps_count = [maroon]0[/maroon];

[b][blue]do[/blue][/b]
{
Sleep(1);
fps = time_getTicks();
}
[b][blue]while[/blue][/b](fps < fps_count+fpsWish);
fps_count = time_getTicks();

}


[purple]int[/purple] max(int a,int b)
{
[b][blue]if[/blue][/b](a < b)return b;
[b][blue]return[/blue][/b] a;
}


désolé si c'est un peu long merci d'avance
----------------------------------
Calto : Graph 35+(tweaké)
Projets
Fermer

- Un pong multijoueur avec le cable 3pin
- Communication IR entre caltos (Arduino)
Dodormeur
Hors ligne
Ancien rédacteur
Niveau: Confirmé
Points: 3928
Défis: 82
Message
Citer : Posté le 04/11/2014 19:44 | #
Déjà, la ligne Bdisp_AllClr_DD(); ne sert a rien, quand on affiche l'écran il est automatiquement effacé avant d'etre affiché

Sinon, a mon avis le probleme viens des fonction de fxlib, tu devrais essayer de passer a MonochromeLib, bien plus efficace, rapide et simple d'utilisation
Il te faudra modifier un peu le code pour le rendre compatible SH4, mais il n'y a qu'une ligne a changer
----------------------------------
Pokemon !!!!!! => pokemon stadium/battle

mes meilleurs jeux
Cliquer pour enrouler
un jeu avec des niveaux de gris mais compatible SH4 (mais en monochrome pour les SH4) => bomberman
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2

projets
Cliquer pour enrouler

pokemon
Cliquer pour enrouler



encodage des données de combat (sprite, attaques et nom)
   100%

systeme de combat
   100%

encodage des données de pokemon (niveau d'apprentisage et evolution)
   100%


moteur de la carte
   50%

level design
   1%

finition de pokemon jade
   42%

merci a tout le monde pour son soutien


projets que je soutiens
Cliquer pour enrouler
minecraft de limachi
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm (dont je connais le nom, mais pas vous ) Arcuz !
Theernest570
Hors ligne
Membre
Niveau: Intermédiaire
Points: 64
Défis: 5
Message
Citer : Posté le 04/11/2014 20:14 | #
Merci beaucoup c'était bien fxlib qui buggait
Et effectivement la MonochromeLib est beaucoup plus rapide (l'écran de l'émulateur du SDK ne clignote même plus -> avec mon PC en carton c'est quasi miraculeux )

Je vais enfin pouvoir avancer dans mon projet (un pong en multi avec le cable 3pin ) ...
----------------------------------
Calto : Graph 35+(tweaké)
Projets
Fermer

- Un pong multijoueur avec le cable 3pin
- Communication IR entre caltos (Arduino)
Lephenixnoir
En ligne
Administrateur
Niveau: Confirmé
Points: 10114
Défis: 130
Message
Citer : Posté le 04/11/2014 21:26 | #
L'écran de l'émulateur ne clignoterait jamais si tu n'effaçais que la VRAM x)

Ben sinon, je me suis fais prendre de vitesse, mais tant mieux si tu as réussi à résoudre ton problème.
----------------------------------
La sagesse est la prunelle de tes yeux, et la gloire l’enveloppe de ton cœur.

Pages: Précédente | 1, 2, 3 | Suivante

Index du Forum | Projets de programmation | SH4 compatibility tool
Publicité et partenaires
Casio Education
Casio éducation

TI-Planet
Casiopeia
Casiopeia
CasioFan, la communauté ClassPad
CasioFan
CodeWalrus
CodeWalrus

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2015 | Il y a 71 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Rugby Manager | Jeu de basket | Jeu de handball | Jeu de tennis | Nova Raider | Réparation téléphone | Soccer Rush | Tasty Tale

Planète Casio est un site communautaire indépendant, géré bénévolement et n'est donc pas affilié à Casio | Toute reproduction de Planète Casio, même partielle, est interdite
Les fichiers, programmes et autres publications présents sur Planète Casio restent la propriété de leurs auteurs respectifs et peuvent être soumis à des licences ou des copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd