( Outils de transfert par protocole XMODEM. Version 0.10 du 21 Avril 2013. Ecrit par jpb.forth . ) TELECHARGEMENT DECIMAL HERE 128 2/ ALLOT CONSTANT XMD_TMP 0 VARIABLE XMD_ETAT 0 VARIABLE XMD_BLOC 0 VARIABLE XMD_TEMPO 0 VARIABLE XMD_SOMME 0 VARIABLE XMD_PRIORITE 0 VARIABLE XMD_OCTET : XMD_KEY ( - --> - ) BEGIN IDLE XMD_OCTET @ ?DUP UNTIL ; PRGHERE ] 255 AND XMD_ETAT @ DUP 0> IF DROP XMD_OCTET ! ( emission ) ELSE ?DUP IF DUP -1 = ( reception ) IF SWAP DUP 1 = IF DROP 1- ELSE DUP 4 = SWAP 24 = OR IF DUP XOR -4 XMD_SOMME ! THEN THEN ELSE DUP -2 = IF SWAP XMD_BLOC @ 255 AND = IF 1- ELSE 1+ THEN ELSE DUP -3 = IF SWAP XMD_BLOC @ COM 255 AND = IF 1- 0 XMD_SOMME ! ELSE 2+ THEN ELSE DUP -132 > IF >R DUP XMD_SOMME +! R@ 4+ NEGATE XMD_TMP + C! R> 1- ELSE DROP XMD_SOMME DUP >R @ - 255 AND R> ! 0 THEN THEN THEN THEN XMD_ETAT ! ELSE DROP ( fin ) THEN THEN EXIT [ CONSTANT XMD_RXB CONSTANT XMD_RXH : XMODEM_OUVRE ( lecture/ecriture --> erreur ) XMD_ETAT @ IF DROP -1 ELSE IF ." Envoyer le fichier sous protocole XMODEM." -1 ELSE ." Initier la reception du fichier sous protocole XMODEM." 1 THEN DUP XMD_ETAT ! 1 XMD_BLOC ! 0 XMD_TEMPO ! CR 1000 TEMPO BEGIN KEYBOARD WHILE KEY DROP REPEAT PRIORITE DUP >R @ XMD_PRIORITE ! 32768 R> ! XMD_RXH ITRX1 DUP >R 2+ ! XMD_RXB R> ! 0< IF 21 EMIT THEN 0 THEN ; : XMODEM_OCTET_RECOIT ( - --> octet, erreur ) BEGIN XMD_ETAT @ ?DUP IF DUP 0> IF DUP >R XMD_TMP + C@ R> 1+ DUP 128 = OR DUP XMD_ETAT ! 0< IF 1 XMD_BLOC +! 6 EMIT 0 XMD_TEMPO ! THEN 0 -1 ELSE DROP 1 TEMPO XMD_TEMPO @ 1+ DUP 10000 < NOT IF -1 XMD_ETAT ! 21 EMIT DUP XOR THEN XMD_TEMPO ! 0 THEN ELSE XMD_SOMME @ ?DUP IF DUP 0< IF 4+ IF 1000 TEMPO -1 XMD_ETAT ! 0 DUP XMD_TEMPO ! 21 EMIT ELSE 0 -1 DUP 6 EMIT THEN ELSE DUP XOR -1 XMD_ETAT ! DUP XMD_TEMPO ! 21 EMIT THEN ELSE XMD_TMP C@ 1 XMD_ETAT ! 0 DUP XMD_TEMPO ! -1 THEN THEN UNTIL ; : XMODEM_OCTET_EMET ( octet --> erreur ) XMD_ETAT @ DUP 0> IF ( octet,etat ) DUP 2 < IF >R DUP XMD_SOMME ! XMD_TMP DUP 128 0 FILL C! R> 1+ 0 ELSE >R DUP XMD_SOMME +! XMD_TMP R@ 1- + C! R> 1+ 0 OVER 128 > IF DROP DROP 1 BEGIN 0 XMD_OCTET ! 1 EMIT XMD_BLOC @ DUP >R EMIT R> COM EMIT XMD_TMP DUP 128+ SWAP DO I C@ EMIT LOOP XMD_SOMME @ EMIT XMD_KEY DUP 6 = IF DROP 1 XMD_BLOC +! 0 -1 ELSE 24 = IF 1000 TEMPO BEGIN 0 XMD_OCTET ! 4 EMIT XMD_KEY 6 = UNTIL DUP XOR -1 DUP ELSE 0 THEN THEN UNTIL THEN THEN ( etat,erreur ) SWAP XMD_ETAT ! ELSE DROP DROP -1 THEN ; : XMODEM_FERME ( - --> - ) XMD_ETAT @ ?DUP IF DUP 0> IF 1 > IF 128 XMD_ETAT ! 0 XMODEM_OCTET_EMET DROP THEN XMD_ETAT @ IF BEGIN 0 XMD_OCTET ! 4 EMIT XMD_KEY 6 = UNTIL THEN ELSE DROP THEN 1000 TEMPO THEN 0 DUP XMD_ETAT ! DUP ITRX1 DUP >R ! R> 2+ ! XMD_PRIORITE @ PRIORITE ! ; ( Transfert du terminal vers le mini systeme FORTH: adresse XMODEM_RECOIT longueur longueur est modulo 65536 ) : 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 - si longueur = 0 alors emission de 65536 octets ) : XMODEM_EMET ( adresse, longueur --> - ) 127+ -128 AND 0 XMODEM_OUVRE IF DROP ELSE BEGIN OVER C@ XMODEM_OCTET_EMET DROP >R 1+ R> 1- DUP 0= UNTIL DROP THEN DROP XMODEM_FERME ; ( FIN )