[[code_source_de_nrdos.mo5_version_3.5|Retourner à la liste des fichiers]] * NRDOS.MO5 version 3.5 * PARSER.ASM (Décodage de la ligne de commande) ************************************************************************************************************ * INPUT * Cette routine récupère une ligne de commande de 80 caractères maximum soit en direct, soit depuis un * fichier de script. Elle convertit ensuite la ligne de commande en majuscules, puis établit la liste * des atomes (séparés par espace ou tabulation). Une ligne de commande se termine toujours par CR. * LF est ignoré. ************************************************************************************************************ INPUT SET * LBSR GETLN ; Lit une ligne de 80 caractères max. LBSR TOUP ; Convertit en majuscules LBSR CNTTOK ; Compte le nombre d'atomes sur la ligne et en établit la liste des offsets RTS ************************************************************************************************************ * GETLN * Cette routine lit une ligne de 80 caractères maximum depuis le clavier ou depuis un fichier. * Depuis un fichier, LF est ignoré. En mode direct, les flèches gauche, droite, haut, bas, ainsi que les * touches INS, EFF sont gérées. ENTREE (CR) termine la ligne. ************************************************************************************************************ GETLN SET * LDA #0 STA INSFLG ; Pas de mode insertion LDX #0 ; Initialisation pointeurs dans buffers LDY #0 GLLOOP TST FOFLG,PCR ; Est-ce qu'un fichier est ouvert ? BNE GLFILE ; Allons lire un caractère LBSR GETKEY ; Sinon, une touche du clavier BRA GLCHKK GLFILE LBSR KEYPRS ; Touche pressée ? BEQ GLFGET ; Non, on continue LBSR FCLOSE ; Sinon, on s'arrête là LBSR GETKEY LDY #0 LDB #CR BRA GLCHKK GLFGET LBSR FGETCH ; Lecture d'un caractère dans le fichier GLCHKK CMPB #LEFT ; Flèche gauche ? BNE GLRGHT * En cas de flèche gauche, on efface le caractère précédent dans les buffers et à l'écran CMPY #0 ; Début de buffer ? BNE GLBACK ; Non, on efface le caractère LBSR BEEP ; Sinon, bip d'erreur BRA GLSKER ; Et on saute cette étape GLBACK LEAY -1,Y ; En arrière buffer courant CMPX #0 BEQ GLERAS LEAX -1,X ; En arrière buffer de copie GLERAS LBSR DISPBS ; Efface le caractère à l'écran GLSKER LBRA GLDONE GLRGHT CMPB #RIGHT ; Flèche droite ? BNE GLUP * En cas de flèche droite, on réaffiche le caractère suivant, sauf en fin de ligne LDA CLCOPY,X CMPA #CR ; Fin de ligne ? BEQ GLSKDS ; Oui, on saute cette étape LDB CLCOPY,X ; Sinon on récupère le caractère STB CMDBUF,Y LEAX 1,X LEAY 1,Y LBSR PCHAR ; Affichage à l'écran GLSKDS LBRA GLDONE GLUP CMPB #UP ; Flèche haut ? BNE GLDOWN * En cas de flèche haut, on efface toute la ligne. LDB #LEFT GLLPUP CMPY #0 BEQ GLUPOK LBSR DISPBS ; Efface un caractère à l'écran LEAY -1,Y BRA GLLPUP GLUPOK LDX #0 ; Y compris dans le buffer de copie BRA GLDONE GLDOWN CMPB #DOWN ; Flèche bas BNE GLEFF * En cas de flèche bas, on reproduit le buffer de la commande précédente * dans le buffer courant et on l'affiche LDA #0 ; Pas de mode insertion STA INSFLG GLLPDN LDA CLCOPY,X CMPA #CR ; Fin de ligne ? BEQ GLDNOK CMPY #80 ; Fin de buffer ? BEQ GLDNOK LDB CLCOPY,X ; Copie de CLOPY vers CMDBUF STB CMDBUF,Y LEAX 1,X LEAY 1,Y LBSR PCHAR BRA GLLPDN GLDNOK BRA GLDONE GLEFF CMPB #EFF BNE GLINS * En cas de touche EFF, effacement du caractère suivant sur la ligne LDA CLCOPY,X CMPA #CR ; Sauf si c'est la fin de ligne BEQ GLSKEF LEAX 1,X GLSKEF BRA GLDONE GLINS CMPB #INS BNE GLCR * En cas de touche INS, activation/désactivation du mode insertion COM INSFLG BRA GLDONE * La touche ENTREE est acceptée comme un caractère normal GLCR CMPB #CR BEQ GLUPDT * Et tout les caractères à partir de l'espace sont autorisés CMPB #SPACE BGE GLUPDT LBSR BEEP ; Sinon bip d'erreur BRA GLDONE * Mise à jour des buffers et de l'écran en conséquence GLUPDT LDA INSFLG CMPA #0 BNE GLDISP ; Mode insertion ? LDA CLCOPY,X CMPA #CR BEQ GLDISP LEAX 1,X GLDISP STB CMDBUF,Y ; Mise à jour LEAY 1,Y LBSR PCHAR ; Et affichage GLDONE CMPB #CR BEQ GLFINL ; La touche ENTREE signale la validation CMPY #80 LBNE GLLOOP LDA #CR ; Si le buffer est plein, validation automatique STA CMDBUF,Y GLFINL LDX #CMDBUF ; Copie du buffer courant vers la sauvegarde LDY #CLCOPY GLLPCP LDA ,X+ STA ,Y+ CMPA #CR BNE GLLPCP RTS INSFLG FCB 0 ; Flag de mode insertion CLCOPY RMB 81,0 ; Buffer de copie et précédente ligne de commande CMDBUF RMB 81,0 ; Buffer de ligne de commande ************************************************************************************************************ * CNTTOK * Parcours le buffer de ligne de commande à la recherche de séparateurs. A chaque séparateur trouvé, la * position courante est rangée dans la table des atomes. Une succession de séparateurs compte comme un seul. ************************************************************************************************************ CNTTOK SET * CLR TOKNB ; Nombre d'atome à zéro LDX #0 ; Début de chaîne CTSKLP LDA CMDBUF,X ; On parcours la ligne de commande à la recherche CMPA #SPACE ; d'espaces ou de tabulations (séparateurs) BEQ CTSPC CMPA #RIGHT BNE CTNRGT CTSPC CMPX #81 ; jusqu'à la fin du buffer BEQ CTNRGT LEAX 1,X BRA CTSKLP CTNRGT LDA CMDBUF,X CMPA #CR ; ou jusqu'à la fin de ligne BEQ CTENDL LDA TOKNB ; Numéro courant d'atome ASLA ; Multiplié par 2 LDY #TKOFST ; On range la position courante dans la ligne STX A,Y ; de commande dans la table d'atomes INC TOKNB ; Atome suivant CTIGNS LDB CMDBUF,X ; On saute les éventuels séparateurs successifs LBSR SPTBCR BEQ CTENDL LEAX 1,X ; Position suivante BRA CTIGNS CTENDL CMPA #CR ; Fin de ligne ? BNE CTSKLP ; Non, on continue RTS TOKNB RMB 1,0 ; Nombre d'atomes TKOFST SET * ; Table des atomes (maximum 16) TKOFS1 RMB 2,0 TKOFS2 RMB 2,0 TKOFS3 RMB 2,0 TKOFS4 RMB 2,0 TKMOFS RMB 24,0 ************************************************************************************************************ * SPTBCR * Teste le caractère pointé comme espace, tabulation ou retour chariot. ************************************************************************************************************ SPTBCR SET * CMPB #SPACE ; Espace ? BEQ SPTEND CMPB #RIGHT ; Tabulation ? BEQ SPTEND CMPB #CR ; Retour chariot ? SPTEND RTS ************************************************************************************************************ * TOUP * Convertit la ligne de commande en majuscules ************************************************************************************************************ TOUP SET * LDX #0 TULOOP LDB CMDBUF,X CMPB #CR ; Jusqu'à la fin de la ligne BEQ TUEND LBSR UPCASE STB CMDBUF,X LEAX 1,X BRA TULOOP TUEND RTS ************************************************************************************************************ * DISPBS * Efface le dernier caractère à l'écran ************************************************************************************************************ DISPBS SET * LDB #LEFT LBSR PCHAR ; Reviens en arrière LDB #SPACE LBSR PCHAR ; Efface le caractère LDB #LEFT LBSR PCHAR ; Reviens en arrière RTS [[code_source_de_nrdos.mo5_version_3.5|Retourner à la liste des fichiers]]