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

************************************************************************************************************
* LUSTR
* Recherche une chaîne de caractères dans une table
************************************************************************************************************
LUSTR  SET    *
       PSHS   A
       TSTA

LULOOP BEQ    LUNOTF
       CMPB   ,X+
       BEQ    LUFND

       DEC    ,S
       BRA    LULOOP

LUNOTF LEAS   1,S
       ANDCC  #$FB
       RTS

LUFND  SUBA   ,S+
       ASLA
       PSHS   A,B
       LEAX   A,Y
       LDD    ,X
       LEAX   START,PCR
       LEAX   D,X
       ORCC   #4
       PULS   PC,B,A

************************************************************************************************************
* ENTREE
* Attends de presser ENTREE pour continuer. Inutilisé.
************************************************************************************************************
ENTREE SET    *
       PSHS   A,B,X,Y
       LEAX   CNTSTR,PCR
       LBSR   DSPSTR

ENTKEY LBSR   GETKEY
       CMPB   #CR
       BNE    ENTKEY

       PULS   PC,Y,X,B,A

CNTSTR FCB    CR, LF
       FCB    US, $40+24, $40+1
       FCC    /<entr/
       FCB    ACC, 'B
       FCS    /ee> pour continuer. /

************************************************************************************************************
* SKPSPC
* Saute les caractères espace dans une chaîne
************************************************************************************************************
SKPSPC SET    *
       TSTA
       BEQ    SKRTS

       LDB    ,X
       CMPB   #SPACE
       BNE    SKRTS

       DECA
       LEAX   1,X
       BRA    SKPSPC

SKRTS  RTS

************************************************************************************************************
* UPCASE
* Convertit un caractère minuscule en majuscule
************************************************************************************************************
UPCASE SET    *
       CMPB   #'A
       BCS    UPRTS

       CMPB   #'Z
       BHI    UPRTS

       SUBB   #$20

UPRTS  RTS

************************************************************************************************************
* STRUPR
* Convertit une chaîne de caractères minuscules en majuscules
************************************************************************************************************
STRUPR SET    *
       PSHS   A,B,X
       TSTA

SULOOP BEQ    SURTS

       LDB    ,X
       BSR    UPCASE
       STB    ,X+
       DECA
       BRA    SULOOP

SURTS  PULS   PC,X,B,A

************************************************************************************************************
* MEMCPY
* Copie une zone mémoire
************************************************************************************************************
MEMCPY SET    *
       TSTA

MCLOOP BNE    MCNXT
       RTS

MCNXT  LDB    ,Y+
       STB    ,X+
       DECA
       BRA    MCLOOP

************************************************************************************************************
* PRSH16
* Convertit 4 caractères représentant un nombre hexadécimal en entier 16 bits. Inutilisé.
************************************************************************************************************
PRSH16 SET    *
       LDY    #0
       PSHS   Y
       LBSR   SKPSPC
       PSHS   CC
       LEAX   1,X
       PULS   CC
       BEQ    PHRTS

       BRA    PHLP1

PHNXTC BSR    GETACH
       BNE    PHLP1

PHRTS  PULS   PC,Y

PHLP1  BSR    ISHEX
       BCC    PHCONV

       LEAX   -1,X
       INCA
       BRA    PHRTS

PHCONV LDY    #4

PHLP2  ASL    1,S
       ROL    ,S
       LEAY   -1,Y
       BNE    PHLP2

       ADDB   1,S
       STB    1,S
       BRA    PHNXTC

************************************************************************************************************
* ISHEX
* Convertit un caractère représentant un chiffre hexadécimal en entier 4 bits
************************************************************************************************************
ISHEX  SET    *
       LBSR   UPCASE
       SUBB   #'0
       BCS    IHRTS

       CMPB   #10
       BCS    IHDONE

       SUBB   #7
       CMPB   #10
       BCS    IHERR

       CMPB   #16
       BCC    IHERR

IHDONE ANDCC  #$FE

IHRTS  RTS

IHERR  ORCC   #1
       RTS

************************************************************************************************************
* GETACH
* Récupère le prochain caractère dans une chaîne
************************************************************************************************************
GETACH SET    *
       TSTA
       BEQ    GCRTS

       LDB    ,X+
       DECA
       ANDCC  #$FB

GCRTS  RTS

************************************************************************************************************
* PRSNMB
* Convertit une chaîne de caractère en entier
************************************************************************************************************
PRSNMB SET    *
       CLR    ,-S
       CLR    ,-S
       PSHS   B
       TSTA
       BEQ    PNERR

PNLOOP TSTA
       BEQ    PNRTS1

       LDB    ,X
       LBSR   UPCASE
       CMPB   #SPACE
       BEQ    PNRTS1

       SUBB   #'0
       CMPB   #10
       BCS    PNVLD

       CMPB   #17
       BCS    PNERR

       SUBB   #7

PNVLD  CMPB   ,S
       BCC    PNERR

       LEAX   1,X
       DECA
       PSHS   A
       LDA    1,S
       PSHS   A
       LDA    #0

PNMUL  ADDD   3,S
       BCS    PNRTS2
       DEC    ,S
       BNE    PNMUL

       STD    3,S
       PULS   A
       PULS   A
       BRA    PNLOOP

PNRTS1 ANDCC  #$FE
       PULS   PC,Y,B

PNERR  ORCC   #1
       PULS   PC,Y,B

PNRTS2 PULS   B
       PULS   PC,Y,B,A

************************************************************************************************************
* PRSPFX
* Demande un nombre décimal ou hexadécimal. Inutilisé.
************************************************************************************************************
PRSPFX SET    *
       LEAX   BUF06C,PCR
       LBSR   TINPUT
       BNE    PPCHK

       LDY    #0
       RTS

PPCHK  PSHS   CC
       LBSR   DCRLF
       LDB    ,X
       CMPB   #DOLLAR
       BNE    PPDEC

       LEAX   1,X
       DECA
       LDB    #16
       BRA    PPDOIT

PPDEC  LDB    #10

PPDOIT LBSR   PRSNMB
       PULS   PC,CC

************************************************************************************************************
* BN2HX
* Convertit un entier 16 bits en chaîne de caractères hexadécimale
************************************************************************************************************
BN2HX  SET    *
       PSHS   U
       LEAU   BASE16,PCR
       BRA    BN2GO

************************************************************************************************************
* BN2DC
* Convertit un entier 16 bits en chaîne de caractères décimale
************************************************************************************************************
BN2DC  SET    *
       PSHS   U
       LEAU   BASE10,PCR

BN2GO  PSHS   A,B
       LDA    ,U+
       STA    1,S
       PULS   A

BN2LP1 BSR    DIVISE
       BNE    BN2CNV

       DEC    ,S
       BNE    BN2LP1

       LDB    #'0
       STB    ,X+
       BRA    BN2RTS

BN2LP2 BSR    DIVISE

BN2CNV PSHS   B
       LDB    ,X
       ADDB   #'0
       CMPB   #'9
       BLS    BN2DGT

       ADDB   #7

BN2DGT STB    ,X+
       PULS   B
       DEC    ,S
       BNE    BN2LP2

BN2RTS PULS   PC,U,A

************************************************************************************************************
* DIVISE
* Effectue une division
************************************************************************************************************
DIVISE SET    *
       CLR    ,X

DVLOOP SUBD   ,U
       BCS    DVDONE

       INC    ,X
       BRA    DVLOOP

DVDONE ADDD   ,U++
       TST    ,X
       RTS

BASE10 FCB    5
       FDB    10000
       FDB    1000
       FDB    100
       FDB    10
       FDB    1

BASE16 FCB    4
       FDB    $1000
       FDB    $100
       FDB    $10
       FDB    $1

************************************************************************************************************
* DINT
* Affiche un entier 8 bits en décimal
************************************************************************************************************
DINT   SET    *
       CLRA
       BSR    CNVDEC
       LEAX   -2,X
       LBRA   DSPSTR

************************************************************************************************************
* DSPDC1
* Affiche un entier 16 bits en décimal
************************************************************************************************************
DSPDC1 SET    *
       BSR    CNVDEC
       LEAX   -5,X
       LBRA   DSPSTR

************************************************************************************************************
* DSPDC2
* Affiche un entier en décimal
************************************************************************************************************
DSPDC2 BSR    CNVDEC
       LEAX   CNVBUF,PCR
       LBRA   DSPSTR

************************************************************************************************************
* CNVDEC
* Convertit un entier 16 bits en décimal
************************************************************************************************************
CNVDEC SET    *
       LEAX   CNVBUF,PCR
       BSR    BN2DC
       CLR    ,X
       RTS

************************************************************************************************************
* DISPHX
* Affiche un entier 16 bits en hexadécimal. Inutilisé.
************************************************************************************************************
DISPHX SET    *
       LEAX   CNVBUF,PCR
       PSHS   X
       LBSR   BN2HX
       CLR    ,X
       PULS   X
       LBRA   DSPSTR
       
       FCC    /    /
       
CNVBUF RMB    5       

Retourner à la liste des fichiers

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

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki