( Programme de veille puzzle. Version 0.50 du 29 Aout 2010. Ecrit par jpb.forth . ) DECIMAL ( Zone obligatoire d'echange: 0 --> adresse du programme de veille sur 4 octets 4 --> adresse des limites de la zone affichable sur 4 octets mise a jour par le systeme 8 --> adresse du programme de configuration des parametres sur 4 octets a 0 si pas de parametres 12 --> adresse du programme d'initialisation sur 4 octets a 0 si pas d'initialisation ) HERE 8 ALLOT CONSTANT INDX_VEILLE ( Zone facultative des parametres: definie selon les necessites du programme de veille ) HERE 10 4+ 64 64 * + 4+ 64+ 2/ ALLOT CONSTANT ZONE_PUZZLE 32 VARIABLE TAILLE ( Zone du programme de veille: l'adresse du debut du programme principal doit etre mise dans les 4 premiers octets de INDX_VEILLE ce programme est appele toutes les 25 ms en mode veille il ne doit avoir aucun parametre d'entree et de sortie ) : PRGM_VEILLE ( - --> - ) ( etat,x,y,dx,dy,image ) ZONE_PUZZLE DUP >R @ ?DUP IF R@ 6+ @ ?DUP IF 65536 TAILLE @ + R@ [ 10 4+ 64 64 * + LITERAL ] + 2! DUP R@ 2+ +! INDX_VEILLE 4+ 2@ R@ [ 10 4+ 64 64 * + LITERAL ] + 3 PICK 0< NOT TAILLE @ 1- AND R@ 2+ @ + R@ 4+ @ LIT_REC R@ 10+ R@ 2+ @ R@ 4+ @ ECRIT_REC R@ [ 10 4+ 64 64 * + LITERAL ] + 3 PICK 0< IF TAILLE @ ELSE -1 THEN R@ 2+ @ + R@ 4+ @ ELSE R@ 8+ @ TAILLE @ SWAB 1+ R@ [ 10 4+ 64 64 * + LITERAL ] + 2! DUP R@ 4+ +! INDX_VEILLE 4+ 2@ R@ [ 10 4+ 64 64 * + LITERAL ] + R@ 2+ @ 4 PICK 0< NOT TAILLE @ 1- AND R@ 4+ @ + LIT_REC R@ 10+ R@ 2+ @ R@ 4+ @ ECRIT_REC R@ [ 10 4+ 64 64 * + LITERAL ] + R@ 2+ @ 4 PICK 0< IF TAILLE @ ELSE -1 THEN R@ 4+ @ + THEN ECRIT_REC DROP ABS - ELSE R@ 6+ @ TAILLE @ * R@ 2+ -! R@ 8+ @ TAILLE @ * R@ 4+ -! NPA ABS 65 AND DUP 64 < IF 0 R@ 8+ ! IF R@ 2+ @ TAILLE @ 2* + 1- INDX_VEILLE 4+ 2@ 4+ @ 1+ < IF TAILLE @ R@ 2+ +! -1 R@ 6+ ! ELSE TAILLE @ R@ 2+ -! 1 R@ 6+ ! THEN ELSE R@ 2+ @ TAILLE @ - INDX_VEILLE 4+ 2@ @ < IF TAILLE @ R@ 2+ +! -1 R@ 6+ ! ELSE TAILLE @ R@ 2+ -! 1 R@ 6+ ! THEN THEN ELSE 0 R@ 6+ ! 64- IF R@ 4+ @ TAILLE @ 2* + 1- INDX_VEILLE 4+ 2@ 6+ @ 1+ < IF TAILLE @ R@ 4+ +! -1 R@ 8+ ! ELSE TAILLE @ R@ 4+ -! 1 R@ 8+ ! THEN ELSE R@ 4+ @ TAILLE @ - INDX_VEILLE 4+ 2@ 2+ @ < IF TAILLE @ R@ 4+ +! -1 R@ 8+ ! ELSE TAILLE @ R@ 4+ -! 1 R@ 8+ ! THEN THEN THEN TAILLE @ DUP R@ 10+ ! DUP R@ 12+ ! INDX_VEILLE 4+ 2@ R@ 10+ R@ 2+ @ R@ 4+ @ LIT_REC DROP THEN R> ! ; FIND PRGM_VEILLE INDX_VEILLE 2! ( Zone facultative du programme d'initialisation: l'adresse du debut du programme principal doit etre mise dans les octets 12 a 15 de INDX_VEILLE ce programme est appele juste au debut d'entree en veille il ne doit avoir aucun parametre d'entree et de sortie ) " ./BINAIRES/puzzle.prm" STRING S_FICHIER : INIT_VEILLE ( - --> - ) S_FICHIER COUNT CHEMIN_CONCATENE ?DUP IF DUP >R -1 FOPEN R> MEMOIRE_LIBERE DROP 0> IF TAILLE 2 3 PICK FREAD DROP THEN FCLOSE DROP THEN ZONE_PUZZLE DUP >R [ 10 4+ 64 64 * + LITERAL ] 0 FILL INDX_VEILLE 4+ 2@ DUP >R @ R@ 4+ @ + 1+ 2/ TAILLE @ - R@ 2+ @ R> 6+ @ + 1+ 2/ TAILLE @ - R@ 4+ ! R> 2+ ! ; FIND INIT_VEILLE INDX_VEILLE 12+ 2! ( Zone facultative du programme de configuration des parametres: l'adresse du debut du programme principal doit etre mise dans les octets 8 a 11 de INDX_VEILLE ce programme est appele en cas de demande de modification de parametres il ne doit avoir aucun parametre d'entree et de sortie ) FEN_STRING" S_PARAMETRE_VEILLE Taille du carre (8 a 64):" Squarre size (8 to 64):" FEN: PRGM_CONFIG ( fen --> - ) TAILLE DUP @ BEGIN DUP 10 S_PARAMETRE_VEILLE 6 PICK FEN_DIALOGUE_NOMBRE DUP 8 < OVER 64 > OR IF DROP 0 ELSE SWAP THEN UNTIL SWAP ! S_FICHIER COUNT CHEMIN_CONCATENE ?DUP IF DUP >R 0 FOPEN R> MEMOIRE_LIBERE DROP 0< NOT IF TAILLE 2 3 PICK FWRITE DROP THEN FCLOSE DROP THEN DROP ; PRGM_CONFIG INDX_VEILLE 8+ 2! ( FIN ) ( Zone accueillant la somme du fichier pour validation. ) ( SOM_VEILLE 0000278044 )