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
* 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 #TKOFSTB ; 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 LOC_53C0
LEAX 1,X ; Position suivante
BRA CTIGNS
CTENDL CMPA #CR ; Fin de ligne ?
BNE CTSKLP ; Non, on continue
RTS
TOKNB RMB 1 ; Nombre d'atomes
TKOFST RMB 32 ; Table des atomes (maximum 16)
************************************************************************************************************
* 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 #$D
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 #LF
LBSR PCHAR
LDB #SPACE
LBSR PCHAR
LDB #LF
LBSR PCHAR
RTS
parser.asm.1765212864.txt.gz · Last modified: by fool-duplex
