User Tools

Site Tools


utils.asm

This is an old revision of the document!


Retourner à la liste des fichiers

* NRDOS.MO5 version 3.5
* UTILS.ASM (Routines utilitaires)

************************************************************************************************************
* UNKRT4
* Routine d'utilité inconnue (calcul de quelque chose)
************************************************************************************************************
UNKRT4 SET    *
       PSHS   A,B
       LDA    #128
       PSHS   A
       LDD    UNKVR4

UK4LP1 ORCC   #1
       RORA
       RORB
       RORA
       RORB
       RORA
       RORB
       TSTA
       BNE    UK4LB1
       
       LDA    #$FF

UK4LB1 TSTB
       BNE    UK4LB2
       
       LDB    #$FF

UK4LB2 MUL
       DEC    ,S
       BNE    UK4LP1
       
       ADDD   UNKVR4
       STD    UNKVR4
       TFR    D,X
       PULS   A
       PULS   PC,B,A

UNKVR4 FDB    $0101

************************************************************************************************************
* MUL16B
* Multiplication 16 bits avec résultat sur 32 bits
************************************************************************************************************
MUL16B SET    *
       PSHS   X,Y
       LEAX   ,S
       LEAY   2,S
       LEAS   -4,S
       LEAU   ,S
       CLR    ,U
       CLR    1,U
       LDA    1,X
       LDB    1,Y
       MUL
       STD    2,U
       LDA    ,X
       LDB    1,Y
       MUL
       ADDD   1,U
       STD    1,U
       BCC    M16CR1
       
       INC    ,U

M16CR1 LDA    1,X
       LDB    ,Y
       MUL
       ADDD   1,U
       STD    1,U
       BCC    M16CR2
       
       INC    ,U

M16CR2 LDA    ,X
       LDB    ,Y
       MUL
       ADDD   ,U
       STD    ,U
       LDX    ,U
       LDD    2,U
       LEAS   8,S
       RTS

************************************************************************************************************
* PRSDSP
* Interprète une chaîne et affiche l'entier correspondant. Inutilisé.
************************************************************************************************************
PRSDSP SET    *
       JSR    PRSINT
       LBEQ   PRMERR
       
       LBCS   PRMERR
       
       TFR    Y,D
       JMP    DSPDC2

************************************************************************************************************
* UNKRT5
* Routine d'utilité inconnue et inutilisée.
************************************************************************************************************
UNKRT5 SET    *
       JSR    VALAZ
       LBCS   PRMERR
       
       STX    TMP16
       JSR    PRSINT
       LBEQ   PRMERR
       
       LBCS   PRMERR
       
       LDX    TMP16
       STY    ,X
       RTS

************************************************************************************************************
* UNKRT6
* Routine d'utilité inconnue et inutilisée.
************************************************************************************************************
UNKRT6 SET    *
       JSR    VALAZ
       LBCS   PRMERR
       
       STX    TMP16
       JSR    PRSINT
       LBEQ   PRMERR
       
       LBCS   PRMERR
       
       JSR    UNKRT4
       JSR    MUL16B
       LEAX   1,X
       LDY    TMP16
       STX    ,Y
       RTS

************************************************************************************************************
* VALAZ
* Transforme un caractère alphabétique isolé en une valeur entre 1 et 26
************************************************************************************************************
VALAZ  SET    *
       JSR    SKSPCL
       JSR    GETNCH
       BEQ    VAZERR
       
       SUBB   #'A
       CMPB   #26
       BCC    VAZERR
       
       LDX    #VALTAB
       ABX
       ABX
       JSR    GETNCH
       BEQ    VAZOK
       
       CMPB   #SPACE
       BNE    VAZERR

VAZOK  ANDCC  #$FE
       RTS

VAZERR ORCC   #1
       RTS

************************************************************************************************************
* GETNCH
* Recupère le prochain caractère dans la ligne de commande
************************************************************************************************************
GETNCH SET    *
       PSHS   A,X
       LDX    CLPTR
       LDA    CLTOGO
       BEQ    GNRTS
       
       LDB    ,X
       LEAX   1,X
       STX    CLPTR
       DECA
       STA    CLTOGO
       ANDCC  #$FB

GNRTS  PULS   PC,X,A

************************************************************************************************************
* UNKRT7
* Routine d'utilité inconnue et inutilisée.
************************************************************************************************************
UNKRT7 SET    *
       JSR    CLS             ; Efface l'écran

UK7LP1 JSR    UNKRT4
       LDY    #320
       JSR    MUL16B
       PSHS   X               ; Résultat = coordonnée X
       JSR    UNKRT4
       LDY    #200
       JSR    MUL16B
       TFR    X,Y             ; Résultat = coordonnée Y
       PULS   X
       JSR    PSET            ; Affiche le point
       JSR    KEYPRS
       BEQ    UK7LP1
       
       JSR    GETKEY
       CMPB   #SPACE          ; Espace permet de sortir
       BNE    UK7LP1
       
       JSR    CLS             ; Efface l'écran
       RTS

************************************************************************************************************
* PSET
* Exécute la commande PSET. Inutilisé.
************************************************************************************************************
PSET   SET    *
       CMPX   #320
       BCC    PSERR
       CMPY   #200
       BCC    PSERR
       GOTO   PLOTH

PSERR  PSHS   X,Y
       LDX    #BADARG
       JSR    DSPSTR
       PULS   B,A
       JSR    DSPDC2
       LDX    #YEG
       JSR    DSPSTR
       PULS   B,A
       JMP    DSPDC2

BADARG FCB    CR, LF
       FCS    "Mauvais argument pour PSET"
       FCB    CR, LF
       FCS    /X = /

YEG    FCB    CR, LF
       FCC    ", Y = "
       FCB    0

VALTAB FDB     1,  2,  3,  4,  5,  6,  7,  8
       FDB     9, 10, 11, 12, 13, 14, 15, 16
       FDB    17, 18, 19, 20, 21, 22, 23, 24
       FDB    25, 26

TMP16  FDB    $0000
       RMB    2               ; Deux octets inutilisés

************************************************************************************************************
* HEXLIN
* Affiche un dump hexadécimal de A octets de la zone pointée par X.
************************************************************************************************************
HEXLIN SET    *
       TSTA                   ; A contient le nombre de caractère total
       BEQ    HEXRTS          ; à afficher
       
       PSHS   A,X             ; et X pointe sur la zone à dumper
       LDB    #8              ; 8 caractères par ligne

HEXLP1 PSHS   B
       JSR    MEMFRM
       LDB    ,X+
       JSR    DHEX8           ; Affiche la valeur hexadécimale
       LDB    #SPACE
       LBSR   PCHAR
       PULS   B
       DECA
       BEQ    HXCONT

       DECB
       BNE    HEXLP1

       BRA    HEXSEP

HXCONT DECB

HEXTAB TSTB
       BEQ    HEXSEP
       
       PSHS   B
       LDB    #SPACE
       LBSR   PCHAR
       LBSR   PCHAR
       LBSR   PCHAR
       PULS   B
       DECB
       BRA    HEXTAB

HEXSEP PULS   X,A
       LDB    #SPACE           ; Séparation
       LBSR   PCHAR
       LBSR   PCHAR
       LDB    #8               ; 8 caractères par ligne

HEXLP2 PSHS   B
       JSR    MEMFRM
       LDB    ,X+
       CMPB   #SPACE
       BCS    HEXHI

       CMPB   #$7F
       BHI    HEXHI           ; Si ce n'est pas de l'ASCII

       BRA    HEXCHR

HEXHI  LDB    #POINT          ; Afficher un point à la place

HEXCHR LBSR   PCHAR           ; Affiche le caractère
       PULS   B
       DECA
       BEQ    HEXCR

       DECB
       BNE    HEXLP2

HEXCR  LBSR   DCRLF
       BRA    HEXLIN

HEXRTS RTS  

************************************************************************************************************
* PRSPTH
* Interprète une chaîne comme un chemin et récupère le nom de fichier
************************************************************************************************************
PRSPTH SET    *
       PSHS    A,Y             ; On sauve la longueur de la commande et le pointeur sur le nom de fichier
       CLRB                    ; Par défaut, disque = 0 (inconnu)
       STB     ,Y+
       LDD     #$200B          ; et 11 espaces pour le nom de fichier

PPLP1  STA     ,Y+
       DECB
       BNE     PPLP1

       PULS    Y,A             ; On récupère la longueur de la commande et le pointeur sur le nom de fichier
       PSHS    Y               ; On sauve le pointeur
       CMPA    #2              ; Longueur de 2 ?
       BCS     PPLEN2

       LDB     #COLON          ; 2ème car = ':' ?
       CMPB    1,X
       BNE     PPLEN2

       LDB     ,X
       CMPB    #'A             ; 1er caractère entre 'A' et 'J' ?
       LBCS    PPDONE

       CMPB    #'J
       LBHI    PPDONE

       SUBB    #AROB
       STB     ,Y              ; On range le numéro de disque
       LEAX    2,X             ; On saute 2 caractères dans le buffer
       DECA
       DECA                    ; Longueur réduite de 2
       LBEQ    PPDONE          ; Vide ? C'était juste un changement de disque.

PPLEN2 LEAY    1,Y
       PSHS    X
       LDB     #0
       STB     INPFLG
       LDB     #SLASH
       CMPB    ,X
       BNE     PPNSL1

       LDB     #$FF
       STB     INPFLG
       LEAX    1,X

PPNSL1 CLR     SBPTCT

PPLP2  LDB     ,X+
       CMPB    #SLASH
       BNE     PPSTOP

       INC     SBPTCT          ; Compte le nombre de '/' dans la chaîne
       BRA     PPLP2

PPSTOP LBSR    SPTBCR
       BNE     PPLP2

       PULS    X               ; Retour au début du token (-le disque si présent)
       PSHS    X,Y
       LDY     #DBUF01

PPLP3  LDB     ,X+
       LBSR    SPTBCR
       BEQ     PPCPOK

       STB     ,Y+
       BRA     PPLP3

PPCPOK CLR     ,Y+
       PULS    Y,X
       PSHS    Y
       LDY     #DBUF02
       LDB     #$FF
       CMPB    INPFLG
       BNE     PPNSL2

       LDB     #SLASH
       STB     ,Y+
       LEAX    1,X

PPNSL2 LDB     SBPTCT
       CMPB    #0
       BEQ     PPNSL3

PPLP4  LDB     ,X+
       CMPB    #SLASH
       BNE     PPNSL4

       DEC     SBPTCT
       BEQ     PPNSL3

PPNSL4 STB     ,Y+
       BRA     PPLP4

PPNSL3 CLR     ,Y
       PULS    Y
       LDB     #8

PPLP5  PSHS    B
       TSTA
       BEQ     PPCLN1

       LDB     ,X+
       DECA
       CMPB    #COLON
       BEQ     PPERR1

       CMPB    #SPACE
       BLS     PPERR1

       CMPB    #$7F
       BHI     PPERR1

       CMPB    #POINT
       BEQ     PPSUF1

       CMPB    #JOKER
       BEQ     PPJKR1

       LBSR    IDPOST          ; '@' est un identifiant de poste
       STB     ,Y+
       PULS    B
       DECB
       BEQ     PPFWD

       BRA     PPLP5

PPJKR1 LDB     #QMARK

PPLP6  STB     ,Y+             ; Remplit le nom avec des '?'
       DEC     ,S
       BNE     PPLP6

       PULS    B
       BRA     PPFWD

PPERR1 INCA
       LEAX    -1,X

PPCLN1 PULS    B
       BRA     PPDONE

PPFWD  TSTA
       BEQ     PPDONE

       LDB     ,X+
       DECA
       CMPB    #POINT
       BEQ     PPSUF2

       INCA
       LEAX    -1,X
       BRA     PPDONE

PPSUF1 PULS    B
       LEAY    B,Y

PPSUF2 LDB     #3              ; Trois caractères à identifier

PPSUFX PSHS    B
       TSTA
       BEQ     PPCLN2

       LDB     ,X+
       DECA
       CMPB    #COLON
       BEQ     PPERR2

       CMPB    #POINT
       BEQ     PPERR2

       CMPB    #SPACE
       BLS     PPERR2

       CMPB    #$7F
       BHI     PPERR2

       CMPB    #JOKER
       BEQ     PPJKR2

       LBSR    IDPOST          ; '@' est un identifiant de poste
       STB     ,Y+
       PULS    B
       DECB
       BEQ     PPDONE

       BRA     PPSUFX

PPJKR2 LDB     #QMARK

PPLP7  STB     ,Y+             ; Remplit le suffixe avec des '?'
       DEC     ,S
       BNE     PPLP7

       PULS    B
       BRA     PPDONE

PPERR2 LEAX    -1,X
       INCA

PPCLN2 PULS    B

PPDONE PULS    Y               ; On retourne au début du nom de fichier
       LDB     ,Y
       BNE     PPSKDK          ; Disque non précisé ?

       LDB     CDISK,PCR       ; Alors on prend le disque courant
       STB     ,Y

PPSKDK LDB     #SPACE
       TSTA

PPLP8  BEQ     PPRTS

       CMPB    ,X
       BEQ     PPRTS

       LEAX    -1,X
       DECA
       BRA     PPLP8

PPRTS  RTS     

INPFLG FCB     $00             ; Flag : se trouve-t-on dans un chemin ou dans un nom de fichier ?
SBPTCT FCB     $00             ; Nombre de sous-répertoires traversés

DBUF01 RMB     65              ; Buffers de chemin
DBUF02 RMB     65

************************************************************************************************************
* IDPOST
* Dans un nom de fichier, remplace @ par le numéro de poste de 1 à 9 ou de A à V.
************************************************************************************************************
IDPOST SET    *
       CMPB   #AROB
       BNE    IPRTS

       LDB    NUPO
       CMPB   #10
       BCC    IPALFA

       ADDB   #'0
       BRA    IPRTS

IPALFA ADDB   #$37

IPRT   RTS

Retourner à la liste des fichiers

utils.asm.1767355588.txt.gz · Last modified: by fool-duplex

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki