( Experimentation VT100. Version 2.50 du 21 Octobre 2012. Ecrit par jpb.forth . ) TELECHARGEMENT ( Ce programme experimental permet de profiter des attributs video du terminal VT100 pour en faire une demonstration visuelle des possibilite du noyau temps reel. ) DECIMAL 0 VARIABLE VT100_NB_TACHES 0 VARIABLE VT100_ETAT_TACHES : VT100_SAUVE_ATTRIBUTS PRIORITE DUP >R @ 32768 R@ ! 27 RS232_EMET 55 RS232_EMET R> ! ; : VT100_RESTITUE_ATTRIBUTS PRIORITE DUP >R @ 32768 R@ ! 27 RS232_EMET 56 RS232_EMET R> ! ; : VT100_CARACTERE_NORMAL PRIORITE DUP >R @ 32768 R@ ! 27 RS232_EMET 91 RS232_EMET 48 RS232_EMET 109 RS232_EMET R> ! ; : VT100_CARACTERE_GRAS PRIORITE DUP >R @ 32768 R@ ! 27 RS232_EMET 91 RS232_EMET 49 RS232_EMET 109 RS232_EMET R> ! ; : VT100_CARACTERE_SOULIGNE PRIORITE DUP >R @ 32768 R@ ! 27 RS232_EMET 91 RS232_EMET 52 RS232_EMET 109 RS232_EMET R> ! ; : VT100_CARACTERE_CLIGNOTANT PRIORITE DUP >R @ 32768 R@ ! 27 RS232_EMET 91 RS232_EMET 53 RS232_EMET 109 RS232_EMET R> ! ; : VT100_CARACTERE_INVERSE PRIORITE DUP >R @ 32768 R@ ! 27 RS232_EMET 91 RS232_EMET 55 RS232_EMET 109 RS232_EMET R> ! ; : VT100_GRAPHIQUE PRIORITE DUP >R @ 32768 R@ ! 27 RS232_EMET 40 RS232_EMET 48 RS232_EMET R> ! ; : VT100_ASCII PRIORITE DUP >R @ 32768 R@ ! 27 RS232_EMET 40 RS232_EMET 66 RS232_EMET R> ! ; : VT100_EFFACE_LIGNE PRIORITE DUP >R @ 32768 R@ ! 27 RS232_EMET 91 RS232_EMET 48 RS232_EMET 75 RS232_EMET R> ! ; : VT100_EFFACE_ECRAN PRIORITE DUP >R @ 32768 R@ ! 27 RS232_EMET 91 RS232_EMET 50 RS232_EMET 74 RS232_EMET R> ! ; : VT100_CURSEUR_POSITION ( x,y --> - ) PRIORITE DUP >R @ 32768 R@ ! >R 27 RS232_EMET 91 RS232_EMET 1+ 10 /MOD 10 MOD 48+ RS232_EMET 48+ RS232_EMET 59 RS232_EMET 1+ 10 /MOD 10 MOD 48+ RS232_EMET 48+ RS232_EMET 72 RS232_EMET R> R> ! ; 0 VARIABLE V_JPBFORTH TACHE: T_JPBFORTH VT100_ETAT_TACHES @ IF 111 T_JPBFORTH T_ACTIVE V_JPBFORTH DUP >R @ DUP 1+ 21 MOD R> ! CASE 0 OF VT100_SAUVE_ATTRIBUTS 0 0 VT100_CURSEUR_POSITION VT100_CARACTERE_INVERSE VT100_CARACTERE_GRAS 5 0 DO 32 RS232_EMET LOOP VT100_RESTITUE_ATTRIBUTS ENDOF 3 OF VT100_SAUVE_ATTRIBUTS 0 0 VT100_CURSEUR_POSITION VT100_CARACTERE_INVERSE VT100_CARACTERE_GRAS 32 RS232_EMET 32 RS232_EMET 74 RS232_EMET 32 RS232_EMET 32 RS232_EMET VT100_RESTITUE_ATTRIBUTS ENDOF 6 OF VT100_SAUVE_ATTRIBUTS 0 0 VT100_CURSEUR_POSITION VT100_CARACTERE_INVERSE VT100_CARACTERE_GRAS 32 RS232_EMET 74 RS232_EMET 32 RS232_EMET 80 RS232_EMET 32 RS232_EMET VT100_RESTITUE_ATTRIBUTS ENDOF 9 OF VT100_SAUVE_ATTRIBUTS 0 0 VT100_CURSEUR_POSITION VT100_CARACTERE_INVERSE VT100_CARACTERE_GRAS 74 RS232_EMET 32 RS232_EMET 80 RS232_EMET 32 RS232_EMET 66 RS232_EMET VT100_RESTITUE_ATTRIBUTS ENDOF 12 OF VT100_SAUVE_ATTRIBUTS 0 0 VT100_CURSEUR_POSITION VT100_CARACTERE_INVERSE VT100_CARACTERE_GRAS 70 RS232_EMET 79 RS232_EMET 82 RS232_EMET 84 RS232_EMET 72 RS232_EMET VT100_RESTITUE_ATTRIBUTS ENDOF ENDCASE ELSE VT100_SAUVE_ATTRIBUTS 0 0 VT100_CURSEUR_POSITION 5 0 DO 32 RS232_EMET LOOP VT100_RESTITUE_ATTRIBUTS T_JPBFORTH T_RETIRE 1 VT100_NB_TACHES -! THEN ; 0 VARIABLE V_OCCUPATION HERE 1 10 2/ + ALLOT CONSTANT F_MESURE 0 VARIABLE V_MESURE TACHE: T_PERF VT100_SAUVE_ATTRIBUTS 65 0 VT100_CURSEUR_POSITION VT100_ETAT_TACHES @ IF VT100_CARACTERE_INVERSE VT100_CARACTERE_GRAS VT100_GRAPHIQUE F_MESURE DUP 2+ SWAP @ 10 0 DO 1+ 10 MOD OVER OVER + C@ 20 / CASE 0 OF 95 ENDOF 1 OF 115 ENDOF 2 OF 114 ENDOF 3 OF 113 ENDOF 4 OF 112 ENDOF 111 ENDCASE RS232_EMET LOOP + C@ 10 /MOD 10 /MOD VT100_ASCII ?DUP IF 48+ RS232_EMET 48+ ELSE 32 RS232_EMET ?DUP IF 48+ ELSE 32 THEN THEN RS232_EMET 48+ RS232_EMET 37 RS232_EMET ELSE 14 0 DO 32 RS232_EMET LOOP 1 VT100_NB_TACHES -! THEN VT100_RESTITUE_ATTRIBUTS T_PERF T_RETIRE ; TACHE: T_OCCUPATION 1 V_OCCUPATION +! 0 T_OCCUPATION T_ACTIVE ; TACHE: T_MESURE VT100_ETAT_TACHES @ IF V_MESURE DUP >R @ DUP NOT R> ! IF 1000 TEMPS 2@ OVER U/MOD DROP - 0 MAX ELSE 100 V_OCCUPATION DUP >R @ 10 / 100 MIN - 0 R> ! DUP F_MESURE DUP >R @ 1+ 10 MOD DUP R@ ! 2+ R> + C! 32768 T_PERF T_AJOUTE 1 T_PERF T_ACTIVE 99 MIN 10 * THEN T_MESURE T_ACTIVE ELSE T_MESURE T_RETIRE T_OCCUPATION T_RETIRE 32768 T_PERF T_AJOUTE 1 T_PERF T_ACTIVE THEN ; " MiniFORTH " STRING S_MINIFORTH " ^T avant d'effectuer un copier/coller " STRING S_TELECHARGEMENT " ^T pour reinstaller les animations " STRING S_REINSTALLE TACHE: T_TELECHARGEMENT VT100_SAUVE_ATTRIBUTS 8 0 VT100_CURSEUR_POSITION VT100_CARACTERE_INVERSE VT100_CARACTERE_GRAS S_MINIFORTH COUNT 0 DO DUP C@ RS232_EMET 1+ LOOP DROP VT100_RESTITUE_ATTRIBUTS VT100_ETAT_TACHES @ IF VT100_SAUVE_ATTRIBUTS 23 0 VT100_CURSEUR_POSITION VT100_CARACTERE_INVERSE S_TELECHARGEMENT COUNT 0 DO DUP C@ RS232_EMET 1+ LOOP DROP VT100_RESTITUE_ATTRIBUTS 2000 T_TELECHARGEMENT T_ACTIVE ELSE VT100_SAUVE_ATTRIBUTS 23 0 VT100_CURSEUR_POSITION VT100_CARACTERE_INVERSE S_REINSTALLE COUNT 0 DO DUP C@ RS232_EMET 1+ LOOP DROP VT100_RESTITUE_ATTRIBUTS T_TELECHARGEMENT T_RETIRE 1 VT100_NB_TACHES -! THEN ; : VT100_INSTALLE_TACHES -1 VT100_ETAT_TACHES ! 1 VT100_NB_TACHES ! 32768 T_JPBFORTH T_AJOUTE 10 T_JPBFORTH T_ACTIVE 1 VT100_NB_TACHES +! 32768 T_TELECHARGEMENT T_AJOUTE 10 T_TELECHARGEMENT T_ACTIVE 1 VT100_NB_TACHES +! 0 V_OCCUPATION ! 0 V_MESURE ! 1 T_OCCUPATION T_AJOUTE 65535 T_MESURE T_AJOUTE 10 T_OCCUPATION T_ACTIVE 1000 T_MESURE T_ACTIVE ; : VT100_RETIRE_TACHES 0 VT100_ETAT_TACHES ! T_TELECHARGEMENT T_RETIRE ; TACHE: T_VT100_RS232_CONNECTE RS232_RECEIVE_FILE DUP @ SWAP 2+ @ - ?DUP IF 255 AND 256 INPUT_FILE DUP @ SWAP 2+ @ - 255 AND - MIN ?DUP IF >R INPUT_FILE 4+ DUP 4- @ BEGIN RS232_RECOIT DUP 20 = IF DROP VT100_ETAT_TACHES @ IF 0 VT100_ETAT_TACHES ! ELSE VT100_NB_TACHES @ IF BELL ELSE VT100_INSTALLE_TACHES THEN THEN ELSE 3 PICK 3 PICK + C! 1+ 255 AND THEN R> 1- DUP >R 0= UNTIL SWAP 4- ! R> DROP THEN THEN OUTPUT_FILE DUP @ SWAP 2+ @ - ?DUP IF 255 AND 256 RS232_TRANSMIT_FILE DUP @ SWAP 2+ @ - 255 AND - MIN ?DUP IF >R OUTPUT_FILE 4+ DUP 2- @ BEGIN OVER OVER + C@ RS232_EMET 1+ 255 AND R> 1- DUP >R 0= UNTIL SWAP 2- ! R> DROP THEN THEN 31 T_VT100_RS232_CONNECTE T_ACTIVE ; : CLS 0 0 VT100_CURSEUR_POSITION VT100_EFFACE_ECRAN ; : INIT_VT100 ." Configurer le terminal en mode VT100 avec passage automatique a la ligne suivante et appuyer sur une touche. " KEY DROP CLS T_RS232_CONNECTE T_RETIRE 32768 T_VT100_RS232_CONNECTE T_AJOUTE 10 T_VT100_RS232_CONNECTE T_ACTIVE VT100_INSTALLE_TACHES ; : RETIRE_VT100 VT100_RETIRE_TACHES T_VT100_RS232_CONNECTE T_RETIRE 32768 T_RS232_CONNECTE T_AJOUTE 10 T_RS232_CONNECTE T_ACTIVE ; INIT_VT100 ( FIN )