LEX 'CHRONOLX' * (c) 1987 PPC Paris et l'Auteur ID #5E ID inutilisÅ MSG 0 POLL 0 FLREG EQU #2F6F8 Add. drapeaux utilisateurs BSPCL? EQU #020B6 Effacer l'Åcran CMPT EQU #125B2 Heure actuelle en 1/512s * depuis le 1 jan 0000 AFF1 EQU #2F494 Add. dans le buffer du * dÅbut de 00:00:00.00 DSP EQU #2F478 Drapeaux d'affichage KEYPTR EQU #2F443 Pointeur buffer de touches SLEEP EQU #006C2 Met la machine en attente SETALR EQU #12917 RÅgler une alarme DELAYT EQU #2F948 OË est stockÅe la valeur * de delay ALMSRV EQU #1257D Actualisation des alarmes ATNFLG EQU #2F442 Compteur de touches CKSREQ EQU #00721 Controleur des timers RCD0D1 EQU #12A83 Rappel D0&D1 situÅs en R4 STD0D1 EQU #12A5C Sauvegarde D0&D1 dans R4 BLDDSP EQU #01898 Construit l'affichage * d'aprÉs le buffer FLOAT EQU #1B322 Conv. dÅc ent./12digFloat STRHDR EQU #0F09A TRUNCC EQU #12B4A Conv 15dig/12dig EXPR EQU #0F23C Pour sortir de chrono$ DEBAFF EQU #2F480 Add. debut buffer d'aff. CLRFRC EQU #0C6F4 Efface la partie frac. DV2-12 EQU #0C4A8 Division de 2 nbres FNRTN1 EQU #0F216 Pour sortir de chrono HXDCW EQU #0ECB4 Convs. hex/dÅc IDIV EQU #0EC7B Divi. de 2 nbres entiers ENTRY T1 CHAR #F ENTRY T2 CHAR #F KEY 'CHRONO$' TOKEN 100 KEY 'CHRONO' TOKEN 101 ENDTXT * Routine pris dans TIME TIME GOSBVL CMPT Lit l'heure en 1/512s A=C W C=0 W P= 4 LCHEX 2A3 C=24 Heures en 1/512s GOSBVL IDIV Divise l'heure depuis 0 GOSBVL HXDCW par 24H & conv en dÅc. A=C W GOSBVL FLOAT Transf. le nbr en virgule * flottante(12digit) C=0 W P= 12 LCHEX 512 C=5.12 GOSBVL DV2-12 Divise l'heure par 5.12 GOSBVL CLRFRC Supprime la partie frac. GOSBVL TRUNCC Convs. 15dig/12dig P=C 0 Exposant du nbr CSR M Origine n=.ccccccc........ CSR M CSR M CSR M CSR M CSR W CSR W Maint. n=........ccccccc. P=P-1 Retranche È p 7 ou P=P-1 ajoute 9 È p P=P-1 p reprÅsente l'exposant:E P=P-1 P=P-1 P=P-1 P=P-1 LOU CSR W DÅcale C pour Åliminer P=P+1 les 0 si E<5 GONC LOU RTN C=Heure en 1/100s(entier) NIBHEX 00 T2 GOSBVL STD0D1 Sauvegarde de D0&D1 P= 1 C=P 2 Mise È 1 du D0=(5) FLREG drapeau 60 DAT0=C XS GOTO OK NIBHEX 00 T1 GOSBVL STD0D1 C=0 XS D0=(5) FLREG Mise È 0 du DAT0=C XS drapeau 60 OK SETHEX ST=1 8 raz du curseur ST=1 5 Effacer l'Åcran GOSUB STOSTA Sauvegarde des drapeaux P= 0 GOSBVL BSPCL? Routine pour Åffacer D0=(5) DEBAFF P= 0 LCASC 'onorhC ' Pour afficher DAT0=C 14 D0=D0+ 14 la prÅsentation LCASC '0:00 : ' DAT0=C 14 D0=D0+ 14 LCASC '00.00:0' Stocke la chaine dans le DAT0=C 14 buffer d'affichage D0=D0+ 14 ST=1 6 EnlÉve le curseur ST=0 1 Ecran non correct donc È GOSUB STOSTA refaire&construction GOSBVL BLDDSP C=0 A ATEN C=IN Touche pressÅe ? ?C=0 A GOYES ATEN ATT C=IN Attend que la touche ?C#0 A soit relachÅe GOYES ATT GOSUB TIME R2=C Valeur initiale du temps BOF GOSUB TIME Heure actuelle A=C W C=R2 Rappel heure initiale A=A-C W Temps ecoulÅ R1=A D1=(5) AFF1 Affichage temps ASR W Eliminer les centiÉmes ASR W C=A W GOSUB DV60 A=Min,B=Secondes D=C W GOSUB DV60 A=Heures,B=C=Min,D=Sec R3=C GOSUB ASCII Copie heures ds le buffer LCASC ':' DAT1=C B Copie ':' ds le buffer D1=D1+ 2 A=R3 GOSUB ASCII Copie min ds le buffer LCASC ':' DAT1=C B D1=D1+ 2 C=D A A=C A GOSUB ASCII Copie les sec ds le buffer LCASC '.' DAT1=C B D1=D1+ 2 A=R1 GOSUB ASCII Copie les centiÉmes SETHEX ST=1 6 EnlÉve le curseur ST=0 1 Ecran non correct GOSUB STOSTA GOSBVL BLDDSP Afficher C=0 A C=IN ?C#0 A Touche pressÅe? GOYES BOUSO Sort de la boucle GOTO BOF BOUSO SETHEX A=0 A ST=1 5 Efface l'ecran ST=1 8 GOSUB STOSTA P= 0 GOSBVL BSPCL? Effacer D0=(5) KEYPTR A=0 XS Vide le buffer de touches DAT0=A XS SETDEC A=R1 temps R2=A D1=(5) DELAYT A=0 A A=DAT1 B Valeur du delay*32 ASL A A=A*16(1/512s) ?A=0 A GOYES TEST LCHEX 4 RÉgle l'alarme 5 GOSBVL SETALR avec la valeur dans A WAIT10 GOSBVL ALMSRV Actualisation des alarmes ?ST=1 4 GOYES TEST Si le temps est ÅcoulÅ D1=(5) ATNFLG Touche pressÅe? C=DAT1 P ?C#0 P GOYES TEST C=0 A TESA C=IN Touche relachÅe? ?C#0 A GOYES TESA GOSBVL SLEEP Machine en attente GONC TEST Sort si une touche a ÅtÅ * pressÅe lors de l'attente GOSBVL CKSREQ Controleur de timer GOTO WAIT10 INTER GOTO NOMB * BUT : teste le drapeau 60 pour voir sous quelle * forme il faut envoyer le rÅsultat TEST D0=(5) FLREG C=DAT0 XS ?C#0 XS GOYES INTER Fin fonction chrono * BUT : construire la chaine reprÅsentant le * rÅsultat(format=hh:mm:ss.cc) sur la math stack GOSBVL RCD0D1 C=0 A P= 0 Assez de mÅmoire? LCHEX 16 Si oui,crÅe l'entÁte de la GOSBVL STRHDR chaine sur la Math Stack SETDEC A=R2 GOSUB TRA Ecrit les centiÉmes sur MS A=R2 ASR W Elimine les ASR W centiÉmes LCASC '.' DAT1=C B D1=D1+ 2 C=A W GOSUB DV60 A=Minutes,B=Secondes D=C W GOSUB DV60 A=Heures,B=C=Minutes,D=Sec CDEX A R3=A A=C A GOSUB TRA Ecrit les secondes sur MS LCASC ':' DAT1=C B Ecrit ':' sur MS D1=D1+ 2 CDEX A A=C B GOSUB TRA Ecrit les minutes sur MS LCASC ':' DAT1=C B D1=D1+ 2 A=R3 GOSUB TRA Ecrit les secondes sur MS D1=D1- 16 D1=D1- 6 Replace D1 au debut D1=D1- 16 de la math stack (MS) GOVLNG EXPR Fin de la fonction chrono$ * BUT : envoyer le temps en secondes sur la * Math Stack NOMB A=R2 GOSBVL FLOAT Convs. dÅc/12dig C=A W C=C-1 X Divise le temps par 100 C=C-1 X pour faire app. les sec. GOSBVL RCD0D1 GOVLNG FNRTN1 * BUT : enregistrer les drapeaux d'affichage * puis lancer la routine d'affichage STOSTA D0=(5) DSP C=ST Sauvegarde des DAT0=C X status bits RTN * BUT : Divise A par C DV60 P= 1 C=0 W C=60 LCHEX 6 GOVLNG IDIV Divise * BUT : envoyer È l'espace memoire pointÅ par D1 * la chaÑne ASCII reprÅsentant les 2 premiers * chiffres de A(B) * A la sortie la chaine est en A ASCII P= 0 LCHEX 30 Chr$(48)="0" B=0 W B=A P Premier chiffre B=B+C B Converti en ASCII BSL A DÅcale les 2 premiers BSL A quartets de la * reprÅsentation ASCII du premier chiffre de A ASR A Elimine le 1er chif. de A B=A P de mÁme pour B=B+C B le deuxiÉme A=B A chiffre DAT1=A 4 Ecrit la chaine D1=D1+ 4 en mÅmoire RTN TRA P= 0 I B=0 W I inversion B=A P I des BSL B I 2 BSL X I premiers P= 2 I caractÉres A=B P I ASR X I GOTO ASCII END