( Pilote des ports A et B. Version 0.20 du 30 Aout 2009. Ecrit par jpb.forth . ) DECIMAL ( Entrees sorties discretes A et B: --------------------------------- Ecriture: valeur[15..0] Lecture: (valeur&entree)[15..0] Voyant allume si valeur&entree = 1 ) 272 CONSTANT CW_PORT_A 273 CONSTANT CW_PORT_B 0 VARIABLE MSQ_PORT_A 0 VARIABLE MEM_PORT_A 0 VARIABLE PRG_PORT_A 0 VARIABLE MSQ_PORT_B 0 VARIABLE MEM_PORT_B 0 VARIABLE PRG_PORT_B TACHE: T_PORT_A CW_PORT_A CW@ DUP MEM_PORT_A @ XOR MSQ_PORT_A @ AND IF DUP MEM_PORT_A ! PRG_PORT_A 2@ EXECUTE ELSE DROP THEN ; TACHE: T_PORT_B CW_PORT_B CW@ DUP MEM_PORT_B @ XOR MSQ_PORT_B @ AND IF DUP MEM_PORT_B ! PRG_PORT_B 2@ EXECUTE ELSE DROP THEN ; : SYNC_PORT_A ( adr_prg,msq --> - ) OVER 0= OVER 0= OR IF DROP DROP MSQ_PORT_A @ IF T_PORT_A T_RETIRE 0 MSQ_PORT_A ! THEN ELSE DUP CW_PORT_A DUP >R CW@ OR R@ CW! R> CW@ OVER AND MEM_PORT_A ! MSQ_PORT_A ! PRG_PORT_A 2! 20 T_PORT_A 49152 OVER T_AJOUTE T_PERIODE THEN ; : SYNC_PORT_B ( adr_prg,msq --> - ) OVER 0= OVER 0= OR IF DROP DROP MSQ_PORT_B @ IF T_PORT_B T_RETIRE 0 MSQ_PORT_B ! THEN ELSE DUP CW_PORT_B DUP >R CW@ OR R@ CW! R> CW@ OVER AND MEM_PORT_B ! MSQ_PORT_B ! PRG_PORT_B 2! 20 T_PORT_B 49152 OVER T_AJOUTE T_PERIODE THEN ; : SORT_PORT_A ( n --> - ) MSQ_PORT_A @ OR CW_PORT_A CW! ; : SORT_PORT_B ( n --> n' ) MSQ_PORT_B @ OR CW_PORT_B CW! ; ( Masquage des instructions inutilisees ) ' SYNC_PORT_A 4- DUP ' MSQ_PORT_A 4- DUP 2@ - - SWAP 2! DICO_INIT ( FIN )