User Tools

Site Tools


parser.asm

This is an old revision of the document!


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             ; Buffer de copie et précédente ligne de commande
CMDBUF RMB    81             ; Buffer de ligne de commande

**************************************************************************************************************
* CNTTOK
*
**************************************************************************************************************
CNTTOK SET    *

       (To be continued ...)
parser.asm.1765210717.txt.gz · Last modified: by fool-duplex

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki