( Outils de transfert par protocole XMODEM. Version 3.00 du 24 Octobre 2010. Ecrit par jpb.forth . ) TELECHARGEMENT ( Transfert du terminal vers le mini systeme FORTH: adresse XMODEM_RECOIT longueur ) DECIMAL FORGET XMODEM_TAMPON HERE 128 2/ ALLOT CONSTANT XMODEM_TAMPON 0 VARIABLE XMODEM_ETAT 0 VARIABLE XMODEM_BLOC 0 VARIABLE XMODEM_TEMPO 0 VARIABLE XMODEM_SOMME : INPUT_FILE? ( - --> nb_octets ) INPUT_FILE DUP @ SWAP 2+ @ - 255 AND ; : RS232_RECEIVE_FILE? ( - --> nb_octets ) RS232_RECEIVE_FILE DUP @ SWAP 2+ @ - 255 AND ; : RS232_TRANSMIT_FILE? ( - --> nb_octets ) RS232_TRANSMIT_FILE DUP @ SWAP 2+ @ - 255 AND ; : OUTPUT_FILE? ( - --> nb_octets ) OUTPUT_FILE DUP @ SWAP 2+ @ - 255 AND ; TACHE: T_XMODEM_CONNECTE XMODEM_ETAT @ DUP 0< IF DUP -134 > IF RS232_RECEIVE_FILE? ?DUP IF 0 DO RS232_RECOIT 255 AND OVER -1 = IF DUP 1 = IF DROP 1- ELSE DUP 4 = IF DROP 1+ 6 RS232_EMET LEAVE ELSE 24 = IF 1+ LEAVE ELSE DROP -133 THEN THEN THEN ELSE OVER -2 = IF XMODEM_BLOC @ 255 AND = IF 1- ELSE 1+ 21 RS232_EMET THEN ELSE OVER -3 = IF XMODEM_BLOC @ COM 255 AND = IF 1- 0 XMODEM_SOMME ! ELSE 2+ 21 RS232_EMET THEN ELSE OVER -132 > IF DUP XMODEM_SOMME +! XMODEM_TAMPON 3 PICK - 4- C! 1- ELSE OVER -133 > IF XMODEM_SOMME @ 255 AND = IF 1 XMODEM_BLOC +! 2- ELSE 21 RS232_EMET DROP -1 THEN LEAVE ELSE DROP THEN THEN THEN THEN THEN LOOP DUP -133 = IF 1000 ELSE 10000 THEN ELSE XMODEM_TEMPO @ 10- DUP 0< IF DROP DROP -1 10000 21 RS232_EMET THEN THEN XMODEM_TEMPO ! THEN DUP -133 < IF INPUT_FILE? 129 < IF 6 RS232_EMET INPUT_FILE 4+ DUP 4- @ XMODEM_TAMPON DUP 128+ SWAP DO I C@ 3 PICK 3 PICK + C! 1+ 255 AND LOOP SWAP 4- ! DROP -1 THEN THEN XMODEM_ETAT ! ELSE CASE 1 OF OUTPUT_FILE? 127 > IF OUTPUT_FILE 4+ DUP 2- @ XMODEM_TAMPON DUP 128+ SWAP DO OVER OVER + C@ I C! 1+ 255 AND LOOP SWAP 2- ! 2 XMODEM_ETAT ! ELSE XMODEM_TEMPO @ IF OUTPUT_FILE? ?DUP IF >R OUTPUT_FILE 4+ DUP 2- @ XMODEM_TAMPON DUP 128 0 FILL DUP R> + SWAP DO OVER OVER + C@ I C! 1+ 255 AND LOOP SWAP 2- ! 2 ELSE 5 THEN XMODEM_ETAT ! THEN THEN ENDOF 2 OF RS232_TRANSMIT_FILE? 125 < IF 1 DUP RS232_EMET XMODEM_BLOC @ DUP RS232_EMET DUP -1 XOR DUP RS232_EMET + + XMODEM_TAMPON DUP 128+ SWAP DO I C@ DUP RS232_EMET + LOOP RS232_EMET 3 XMODEM_ETAT ! THEN ENDOF 3 OF RS232_RECEIVE_FILE? IF RS232_RECOIT DUP 6 = IF DROP 1 XMODEM_BLOC +! 1 ELSE 24 = IF 1000 TEMPO 4 ELSE 2 THEN THEN XMODEM_ETAT ! THEN ENDOF 4 OF OUTPUT_FILE? ?DUP IF OUTPUT_FILE 2+ DUP >R @ + 255 AND R> ! ELSE RS232_RECEIVE_FILE? ?DUP IF 0 DO RS232_RECOIT DROP LOOP THEN 0 XMODEM_ETAT ! THEN ENDOF 5 OF 4 RS232_EMET 6 XMODEM_ETAT ! ENDOF 6 OF RS232_RECEIVE_FILE? IF RS232_RECOIT 6 = IF 0 ELSE 5 THEN XMODEM_ETAT ! THEN ENDOF 0 XMODEM_ETAT ! ENDCASE THEN XMODEM_ETAT @ IF 9 T_XMODEM_CONNECTE T_ACTIVE THEN ; : XMODEM_OUVRE ( lecture/ecriture --> erreur ) XMODEM_ETAT @ IF DROP -1 ELSE IF ." Envoyer le fichier sous protocole XMODEM." -1 ELSE ." Initier la reception du fichier sous protocole XMODEM." 1 THEN XMODEM_ETAT ! 1 XMODEM_BLOC ! 0 XMODEM_TEMPO ! CR BEGIN 1000 TEMPO INPUT_FILE? DUP IF DUP 0 DO KEY DROP LOOP THEN 0= UNTIL T_RS232_CONNECTE T_RETIRE 32768 T_XMODEM_CONNECTE T_AJOUTE 1 T_XMODEM_CONNECTE T_ACTIVE 0 THEN ; : XMODEM_OCTET_RECOIT ( - --> octet, erreur ) BEGIN INPUT_FILE? IF KEY 0 -1 ELSE XMODEM_ETAT @ 0< IF 0 ELSE 0 -1 DUP THEN THEN UNTIL ; : XMODEM_OCTET_EMET ( octet --> erreur ) XMODEM_ETAT @ 0> IF EMIT 0 ELSE DROP -1 THEN ; : XMODEM_FERME ( - --> - ) XMODEM_ETAT @ ?DUP IF 0> IF -1 XMODEM_TEMPO ! BEGIN XMODEM_ETAT @ 0= UNTIL ELSE BEGIN INPUT_FILE? IF 0 DO KEY DROP LOOP THEN XMODEM_ETAT @ 0= UNTIL THEN THEN T_XMODEM_CONNECTE T_RETIRE 32768 T_RS232_CONNECTE T_AJOUTE 24 T_RS232_CONNECTE [ FIND T_PERIODE DUP 0= FIND T_ACTIVE AND + LITERAL ] EXECUTE ; : XMODEM_RECOIT ( adresse --> longueur ) -1 XMODEM_OUVRE IF DROP 0 ELSE 0 BEGIN XMODEM_OCTET_RECOIT IF DROP -1 ELSE 3 PICK C! >R 1+ R> 1+ 0 THEN UNTIL SWAP DROP THEN XMODEM_FERME ; ( Transfert du mini systeme FORTH vers le terminal: adresse,longueur XMODEM_EMET - ) : XMODEM_EMET ( adresse, longueur --> - ) 0 XMODEM_OUVRE IF DROP ELSE 0 DO DUP C@ XMODEM_OCTET_EMET IF LEAVE THEN 1+ LOOP THEN DROP XMODEM_FERME ; ( FIN )