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 ; Buffer de copie et précédente ligne de commande
CMDBUF RMB ; Buffer de ligne de commande
**************************************************************************************************************
* CNTTOK
*
**************************************************************************************************************
CNTTOK SET *
(To be continued ...)
parser.asm.1765210553.txt.gz · Last modified: by fool-duplex
