User Tools

Site Tools


cmdp3.asm

This is an old revision of the document!


Retourner à la liste des fichiers

* NRDOS.MO5 version 3.5
* CMDP3.ASM (Commandes internes, troisième partie)

************************************************************************************************************
* COMPAR
* Exécute la commmande COMPARE. En réalité, cette commande n'est pas disponible et ce code n'est jamais
* utilisé.
************************************************************************************************************
COMPAR SET    *
       LBSR   SKSPCL
       BNE    CMPGO

       LBSR   PRMERR
       LBRA   CMPRET

CMPGO  LBSR   SETCTX
       LEAY   TWITH,PCR      ; Vérifie que le troisième atome est "WITH"
       LBSR   PRARG2
       BNE    CMPOP1

       LBSR   PRMERR         ; Erreur de paramètre
       LBRA   CMPRST

CMPOP1 LDB    #OUVFL
       STB    CSGNTA,PCR
       LBSR   XCNSGN         ; Ouvre le premier fichier
       LBNE   CMPRST         ; Erreur d'ouverture

       LEAU   CMPFL1,PCR
       LBSR   INITFR         ; Initialise le descripteur de fichier
       LEAY   FNMBF3,PCR     ; Copie le nom de fichier dans la consigne
       LEAX   CSGNDK,PCR
       LDA    #12            ; 12 octets à copier
       LBSR   MEMCPY
       LBSR   XCNSGN         ; Ouvre le deuxième fichier
       LBNE   CMPCL1         ; Erreur d'ouverture

       LEAU   CMPFL2,PCR
       LBSR   INITFR         ; Initialise le descripteur de fichier
       LDA    F1TYPE,PCR
       CMPA   F2TYPE,PCR
       BEQ    CMPMDE

       LEAX   TYPEST,PCR     ; Le type est différent
       LBSR   DSPSTR
       LBRA   CMPCL2

CMPMDE LDA    F1MODE,PCR
       CMPA   F2MODE,PCR
       BEQ    CMPLEN

       LEAX   MODEST,PCR     ; Le mode est différent
       LBSR   DSPSTR
       LBRA   CMPCL2

CMPLEN LDD    F1LENH,PCR     ; Comparaison de la taille, 16 bits supérieurs
       CMPD   F2LENH,PCR
       BNE    CMPLNE

       LDA    F1LENL,PCR     ; Comparaison de la taille, 8 bits inférieurs
       CMPA   F2LENL,PCR     ; (total 24 bits)
       BEQ    CMPLOK

CMPLNE LEAX   LENGST,PCR     ; La taille est différente
       LBSR   DSPSTR
       LBRA   CMPCL2

CMPLOK LEAU   CMPFL1,PCR
       LBSR   RDBYTE         ; Cherche un octet du premier fichier
       BEQ    CMPLP

       LEAX   IDNTST,PCR     ; Les fichiers sont identiques.
       LBSR   DSPSTR
       BRA    CMPCL2

CMPLP  PSHS   B
       LEAU   CMPFL2,PCR
       LBSR   RDBYTE         ; Cherche un octet du deuxième fichier
       BNE    CMPKO

       CMPB   ,S+            ; Compare les deux octets
       BEQ    CMPLOK

CMPKO  LEAX   DIFFST,PCR     ; Les fichiers sont différents
       LBSR   DSPSTR

CMPCL2 LDB    F2HNDL,PCR     ; Fermeture deuxième fichier
       STB    CSGNDK,PCR
       LDB    #FERFI
       STB    CSGNTA,PCR
       LBSR   XCNSGN

CMPCL1 LDB    F1HNDL,PCR     ; Fermeture premier fichier
       STB    CSGNDK,PCR
       LDB    #FERFI
       STB    CSGNTA,PCR
       LBSR   XCNSGN

CMPRST LBSR   RSTDIR         ; Retour au répertoire courant

CMPRET RTS

TYPEST FCC    /Les fichiers n'pas le m/
       FCB    ACC,'C,'e
       FCC    /me type./
       FCB    CR, LF, 0

MODEST FCC    /Les fichiers n'pas le m/
       FCB    ACC,'C,'e
       FCC    /me mode./
       FCB    CR, LF, 0

LENGST FCC    /Les fichiers n'pas la m/
       FCB    ACC,'C,'e
       FCC    /me longueur./
       FCB    CR, LF, 0

DIFFST FCC    /Les fichiers sont diff/
       FCB    ACC,'B,'e
       FCC    /rents./
       FCB    CR, LF, 0

IDNTST FCC    /Les fichiers sont identiques./
       FCB    CR, LF, 0

************************************************************************************************************
* INITFR
* Initialisation d'un descripteur de fichier.
* Cette routine comporte une erreur qui provoque l'écrasement de son propre code.
************************************************************************************************************
INITFR SET    *
       CLR    0,U            ; Etat courant à zéro (pas d'erreur)
       LDA    #6             ; 6 octets à copier
       LEAY   CRXT0,PCR      ; Copie des infos de compte-rendu : handle (1), type (1), mode (1), longueur (3)
       LEAX   $0001,PCR      ; Bug : LEAX 1,U est probablement l'instruction correcte
       LBSR   MEMCPY
       LDD    #0
       STD    11,U           ; Position courante dans le fichier à zéro
       STA    13,U           ; (24 bits)
       STD    14,U           ;
       STD    16,U           ; Nombre d'octets restant dans le buffer à zéro
       RTS

************************************************************************************************************
* RDBYTE
* Lit un octet dans le buffer de fichier
************************************************************************************************************
RDBYTE SET    *
       PSHS   A,DP,X,Y,U

RBLOOP LDX    16,U           ; Nombre d'octets restant dans le buffer
       BEQ    RBUPDT         ; Si 0, charge le bloc suivant

       LEAX   -1,X
       STX    16,U
       LDX    14,U
       TFR    X, Y
       LEAY   1,Y
       STY    14,U
       LDD    9,U
       LEAX   13,X
       LDB    ,X             ; Un octet
       ORCC   #4
       BRA    RBRTS

RBUPDT LDB    0,U            ; Statut d'erreur
       BNE    RBRTS
       LDB    #LIRFI
       LBSR   FLRDWR         ; Lit le bloc suivant
       BEQ    RBRDOK

       CMPB   #EFINF         ; Fin de fichier ?
       BNE    RBRTS

RBRDOK STX    16,U           ; Sauve le nombre d'octets lus
       BNE    RBLOOP
       ANDCC  #$FB

RBRTS  PULS   PC,U,Y,X,DP,A

************************************************************************************************************
* FLRDWR
* Lecture ou écriture d'un bloc dans un fichier
************************************************************************************************************
FLRDWR SET    *
       STB    CSGNTA,PCR    ; Prépare une consigne LIRFI ou ECRFI
       PSHS   B
       LDX    9,U
       STX    CSGNAD,PCR
       LDD    7,U
       STD    CSGNSZ,PCR
       CLR    CSGNPG,PCR
       LDA    #0
       STA    CSGDST,PCR
       LDA    #SYSFIC
       STA    CSGNTR,PCR
       LDA    1,U
       STA    CSGNDK,PCR
       LDD    11,U
       STD    CSGNFN,PCR   ; Position dans le fichier (24 bits)
       LDA    13,U
       STA    CSGSZ0,PCR
       LEAX   CNSGN,PCR
       PSHS   U
       LBSR   RESEAU       ; Exécute la consigne : lecture ou écriture
       PULS   U
       LDX    #0
       STX    14,U
       PSHS   B
       CMPB   #LIRFI
       BNE    FLWRIT       ; Nombre d'octets restant à écrire

       LDX    CRXT0,U
       STX    16,U         ; Nombre d'octets lus
       LDD    CRXT0,U
       BRA    FLUPDT

FLWRIT LDX    #0           ; Nombre d'octets restant à écrire
       STX    16,U
       LDD    7,U

FLUPDT ADDD   11,U         ; Position dans le fichier (24 bits)
       STD    11,U
       BCC    FLNOCY

       INC    13,U         ; Report de la retenue sur 24 bits

FLNOCY LDB    CRERR,PCR
       STB    0,U          ; Statut courant (erreur)
       RTS

************************************************************************************************************
* WRBYTE
* Ecrit un octet dans le buffer de fichier. Cette routine est inutilisée.
************************************************************************************************************
WRBYTE SET    *
       PSHS   A,B,DP,X,Y,U

WBLOOP LDX    16,U
       CMPX   7,U
       BCC    WBFLSH       ; Buffer plein ?

       LEAX   1,X
       STX    16,U
       LDX    14,U
       TFR    X, Y
       LEAY   1,Y
       STY    14,U
       PSHS   B
       LDD    9,U
       LEAX   D,X
       PULS   B
       STB    ,X           ; Range un octet dans le buffer
       ORCC   #4
       BRA    WBRTS

WBFLSH PSHS   B
       LDB    #ECRFI
       LBSR   FLRDWR       ; Ecriture du bloc dans le fichier
       PULS   B
       BEQ    WBLOOP

WBRTS  PULS   PC,U,Y,X,DP,B,A

************************************************************************************************************
* COPY
* Exécute la commande COPY.
************************************************************************************************************
COPY   SET    *
       LDB    #4
       CMPB   TOKNB        ; On vérifie qu'il y a 4 atomes sur la ligne de commande
       BEQ    CYP1OK

       LDB    #0
       STB    CDSUCS
       LBSR   PRMERR       ; Erreur de paramètre
       LBRA   CYRTS

CYP1OK LDX    TKOFS4       ; 4ème atome
       LEAX   CMDBUF,X
       LDA    #8
       LDY    #CYCDSK      ; Buffer de chemin courant
       LBSR   PRSPTH       ; Décode un chemin
       LDA    CYCDSK
       STA    CSGNDK
       LDX    #CYCDIR
       STX    CSGNAD
       LDX    #64
       STX    CSGNSZ
       LDA    #GETDIR
       STA    CSGNTA
       LDA    #9
       STA    CSGNTR
       LDX    #CNSGN
       JSR    RESEAU       ; On récupère le répertoire courant
       LBSR   SETCTX
       LDB    #$FF
       CMPB   CDSUCS       ; Est-ce que le 2e atome est bien un chemin existant ?
       BNE    CYP2OK

       LBSR   PRMERR       ; Erreur de paramètre
       BRA    CYRST

CYP2OK LEAY   TTO,PCR
       LBSR   PRARG2       ; On vérifie que le 3e atome est "TO"
       BNE    CYP3OK

       LBSR   PRMERR       ; Erreur de paramètre
       BRA    CYRST

CYP3OK LEAY   FNMBF3,PCR
       LEAX   CSGND2,PCR
       LDA    #12          ; 12 octets à copier
       LBSR   MEMCPY
       LDB    #SLASH
       CMPB   DBUF02
       BEQ    CYDRCT

       LDX    #CYCDIR
       LDY    #CYDDIR

CYLP01 LDB    ,X+
       BEQ    CYP4OK

       STB    ,Y+
       BRA    CYLP01

CYP4OK LDB    DBUF02
       BEQ    CYAPZR

       LDB    #SLASH
       CMPB   -1,Y
       BEQ    CYSKSL

       STB    ,Y+

CYSKSL LDX    #DBUF02

CYLP02 LDB    ,X+
       BEQ    CYAPZR

       STB    ,Y+
       BRA    CYLP02

CYAPZR CLR    ,Y+
       LDX    #CYDDIR
       BRA    CYGO

CYDRCT LDX    #DBUF02

CYGO   STX    CSGNAD
       LDX    #64
       STX    CSGNSZ
       LDA    #COPIEE
       STA    CSGNTA,PCR
       LBSR   XCNSGN       ; Réalise la copie de fichier

CYRST  LBSR   RSTDIR       ; On restaure le répertoire courant

CYRTS  RTS

CYFLN  RMB    11           ; Nom de fichier pour COPY
CYCDIR RMB    65           ; Répertoire courant pour COPY
CYDDIR RMB    65           ; Répertoire de destination pour COPY

************************************************************************************************************
* REN
* Exécute la commande REN.
************************************************************************************************************
REN    SET    *
       LBSR   SKSPCL
       BNE    RENOK1

       LDB    #0
       STB    CDSUCS
       LBSR   PRMERR
       BRA    RENRTS

RENOK1 LBSR   SETCTX       ; Récupère les noms de fichier
       LDB    #$FF
       CMPB   CDSUCS
       BNE    RENOK2

       LBSR   PRMERR
       BRA    RENRST

RENOK2 LEAY   TAS,PCR      ; Vérifie que le 3e atome est "AS"
       LBSR   PRARG2
       BNE    RENOK3

       LBSR   PRMERR
       BRA    RENRST

RENOK3 LEAY   FNMBF3,PCR   ; Prépare la consigne
       LEAX   CSGND2,PCR
       LDA    #12          ; 12 octets à copier
       LBSR   MEMCPY
       LDA    #RENFI
       STA    CSGNTA,PCR
       LBSR   XCNSGN       ; Renomme le fichier

RENRST LBSR   RSTDIR       ; Restaure le répertoire courant

RENRTS RTS

************************************************************************************************************
* LOCK
* Exécute la commande LOCK.
************************************************************************************************************
LOCK   SET    *
       LBSR    SETCTX          ; Récupère le contexte
       LDB     #$FF
       CMPB    CDSUCS
       BNE     LCKOK

       LBSR    PRMERR          ; Erreur de paramètre
       BRA     LCKRST

LCKOK  LDA     #RESFI
       STA     CSGNTA,PCR
       LBSR    XCNSGN          ; Réserve le fichier

LCKRST LBSR    RSTDIR          ; Restaure le répertoire courant
       RTS

************************************************************************************************************
* UNLOCK
* Exécute la commande UNLOCK.
************************************************************************************************************
UNLOCK SET    *
       LBSR   SETCTX           ; Récupère le contexte
       LDB    #$FF
       CMPB   CDSUCS
       BNE    UNLOK

       LBSR   PRMERR           ; Erreur de paramètre
       BRA    UNLRST

UNLOK  LDA    #RELFI
       STA    CSGNTA,PCR
       LBSR   XCNSGN           ; Relâche le fichier

UNLRST LBSR   RSTDIR           ; Restaure le répertoire courant
       RTS

************************************************************************************************************
* SYSTEM
* Exécute la commande SYSTEM.
************************************************************************************************************
SYSTEM LDX    #CSGNSY
       JSR    RESEAU           ; Appel privilège système

SYSW8T JMP    SYSW8T           ; Attente de prise de contrôle par le central

CSGNSY FCB    4, CENTRL, SYSFIC, SYSTEM    ; Consigne SYSTEM

************************************************************************************************************
* PRMERR
* Affiche une erreur de paramètre ou de répertoire inexistant.
************************************************************************************************************
PRMERR SET    *
       LDA    #0
       CMPA   CDSUCS
       BEQ    PRMGEN

       LDX    #DNEST
       BRA    PRMDSP

PRMGEN LEAX   PRMEST,PCR

PRMDSP LBSR   DSPSTR
       LBSR   FCLOSE
       LBSR   BEEP
       RTS

PRMEST FCS    /Erreur de parametre(s)./
DNEST  FCB    'R, ACC, 'B
       FCS    /'epertoire inexistant./

************************************************************************************************************
* SB1SZ
* Fixe la taille du premier tampon de lecture/écriture. Inutilisé.
************************************************************************************************************
SB1SZ  SET    *
       BSR    PBSIZE
       STD    F1BFSZ,PCR
       LDX    F1BFPT
       LEAX   D,X
       STX    F2BFPT
       RTS

************************************************************************************************************
* SB2SZ
* Fixe la taille du deuxième tampon de lecture/écriture. Inutilisé.
************************************************************************************************************
SB2SZ  SET    *
       BSR    PBSIZE
       STD    F2BFSZ,PCR
       RTS

************************************************************************************************************
* PBSIZE
* Récupère un nombre entier entre 1 et 4096 sur la ligne de commande.
************************************************************************************************************
PBSIZE SET    *
       BSR    PRSINT           ; Récupère un entier
       LBEQ   PRMERR

       LBCS   PRMERR

       TFR    Y,D
       CMPD   #4096            ; Entre 1 et 4096 inclus
       LBHI   PRMERR

       RTS

************************************************************************************************************
* CLONE
* Exécute la commande CLONE.
************************************************************************************************************
CLONE  SET    *
       BSR    PRSINT
       LBEQ   PRMERR

       BCS    PRMERR

       TFR    Y,D
       LDY    #31              ; Poste entre 1 et 31
       PSHS   Y
       CMPY   ,S++
       LBHI   PRMERR

       TSTB
       LBEQ   PRMERR

       TFR    B,A
       JMP    OEE              ; Appel à la routine ROM de copie d'écran

************************************************************************************************************
* PRSINT
* Convertit l'atome fourni en un entier
************************************************************************************************************
PRSINT SET    *
       PSHS   A,B,X,U
       LDX    CLPTR,PCR
       LDA    CLTOGO,PCR
       LBSR   SKPSPC

       BEQ    PINB

       CMPB   #DOLLAR         ; Préfixe hexadécimal ?
       BEQ    PIHEX

       CMPB   #'0             ; Entre 0 ...
       BCS    PIAZ

       CMPB   #'9             ; ... et 9 ?
       BHI    PIAZ

       LDB    #10             ; Conversion décimale
       BRA    PIPRS

PIHEX  LDB    #16             ; Conversion hexadécimale
       DECA
       LEAX   1,X

PIPRS  LBSR   PRSNMB          ; Décode le nombre
       ANDCC  #$FB

PINB   PSHS   CC
       STX    CLPTR,PCR
       STA    CLTOGO,PCR
       PULS   CC

PIRTS  PULS   PC,U,X,B,A

PIAZ   STX    CLPTR
       STA    CLTOGO
       JSR    VALAZ           ; Les lettres de A à Z
       BCC    PILT            ; sont aussi acceptées ...

       ANDCC  #$FB
       BRA    PIRTS

PILT   LDY    ,X              ; ... comme valeurs de 1 à 26
       ANDCC  #$FA
       BRA    PIRTS

************************************************************************************************************
* PRSKW
* Vérifie si l'atome fourni est un mot-clé connu.
************************************************************************************************************
PRSKW  SET    *
       PSHS   A,X
       LBSR   SKPSPC
       PSHS   A
       BEQ    PKERR
       LDB    ,Y+
       BEQ    PKERR

PKLOOP TST    ,S
       BEQ    PKERR

       DEC    ,S
       LDA    ,X+
       CMPA   ,Y+             ; Compare chaque caractère
       BNE    PKERR

       DECB
       BNE    PKLOOP

       TST    ,S
       BEQ    PKFND

       LDA    ,X
       CMPA   #SPACE
       BNE    PKERR

PKFND  PULS   A
       LEAS   3,S
       ANDCC  #$FB
       RTS

PKERR  PULS   A
       ORCC   #4
       PULS   PC,X,A

* Liste des mot-clés
TAS    FCB    2
       FCC    /AS/
TTO    FCB    2
       FCC    /TO/
TWITH  FCB    4
       FCC    /WITH/
TON    FCB    2
       FCC    /ON/
TOFF   FCB    3
       FCC    /OFF/

************************************************************************************************************
* CLS
* Exécute la commande CLS.
************************************************************************************************************
CLS    SET    *
       LDB    #FF
       JMP    PCHAR

************************************************************************************************************
* CLOSE
* Exécute la commande CLOSE. En réalité, cette commande n'est pas disponible et ce code n'est jamais
* utilisé.
************************************************************************************************************
CLOSE  SET    *
       JSR    BCNSGN          ; Prépare la consigne
       LDA    #FERFI
       STA    CSGNTA,PCR
       JSR    PRSINT          ; Récupère le numéro de handle
       BNE    CL1FL

       LDB    #ALLFLS         ; Tous les fichiers ouverts par le poste
       BRA    CLFNL

CL1FL  TFR    Y,D
       LDY    #16             ; Handle max : 16
       PSHS   Y
       CMPD   ,S++
       LBCC   PRMERR

CLFNL  STB    CSGNDK
       JSR    XCNSGN          ; Ferme le ou les fichiers
       RTS

************************************************************************************************************
* OPEN
* Exécute la commande OPEN. En réalité, cette commande n'est pas disponible et ce code n'est jamais
* utilisé.
************************************************************************************************************
OPEN   SET    *
       LDX    CLPTR
       LDA    CLTOGO
       LBSR   SKPSPC
       CMPB   #'O
       BNE    OPNRD

       LDB    #OUVFE          ; Ouverture en écriture
       BRA    OPNOK1

OPNRD  CMPB   #'I
       LBNE   PRMERR

       LDB    #OUVFL          ; Ouverture en lecture

OPNOK1 STB    CSGNTA,PCR
       TSTA
       LBEQ   PRMERR          ; Erreur de paramètre/chemin

       LDB    1,X
       DECA
       LEAX   1,X
       LBEQ   PRMERR          ; Erreur de paramètre/chemin

       STX    CLPTR,PCR
       STA    CLTOGO,PCR
       CMPB   #SPACE
       LBNE   PRMERR          ; Erreur de paramètre/chemin

       LBSR   SETCTX
       LBSR   XCNSGN          ; Ouvre le fichier
       BNE    OPNRTS

       LEAX   OPNSST,PCR      ; Affichage
       LBSR   DSPSTR
       LDB    CRXT0,PCR
       LBSR   DINT            ; Numéro de handle

OPNRTS RTS

OPNSST FCC    /Ouverture r/
       FCB    ACC,'B
       FCC    /eussie sous le num/
       FCB    ACC,'B
       FCS    /ero /

************************************************************************************************************
* DUMP / TYPE / TYPE2
* Exécute les commandes DUMP et TYPE. TYPE2 n'est pas utilisée.
************************************************************************************************************
DUMP   SET    *
       LDX    #DPFOFS
       CLRA
       STA    ,X+             ; Initialise la position dans le fichier
       STA    ,X+
       STA    ,X+
       BRA    DPSTRT

TYPE   SET    *
       LDA    #1
       BRA    DPSTRT

TYPE2  SET    *
       LDA    #2

DPSTRT STA    DPMODE,PCR
       LBSR   SKSPCL
       BNE    DPOK1

       LDB    #0
       STB    CDSUCS
       LBSR   PRMERR          ; Erreur de paramètre
       LBRA   DPRTS

DPOK1  LBSR   SETCTX          ; Récupère le contexte
       LDB    #$FF
       CMPB   CDSUCS
       BNE    DPOK2
       LBSR   PRMERR          ; Erreur de chemin
       LBRA   DPRST

DPOK2  LDA    #OUVFL
       STA    CSGNTA,PCR
       LBSR   XCNSGN          ; Ouverture du fichier en lecture
       LBNE   DPRST

       LDA    CRXT0,PCR
       STA    CSGNDK,PCR
       LDA    #LIRFI
       STA    CSGNTA,PCR
       LDD    #0
       STD    CNSGN+12,PCR
       CLR    CNSGN+14,PCR

DPLOOP LEAX   CNSGN,PCR
       JSR    RESEAU          ; Lit un bloc dans le fichier
       LDB    CRERR,PCR
       BEQ    DPOK3

       CMPB   #EFINF          ; Fin de fichier ?
       BEQ    DPOK3

       LBSR   ERRMSG          ; Une erreur de lecture est survenue
       BRA    DPCLOS

DPOK3  LDY    CRXT1,PCR
       BEQ    DPCLOS

       LDX    F1BFPT,PCR
       LDB    DPMODE
       BEQ    DPHEX           ; Mode DUMP

       DECB
       BEQ    DPASC           ; Mode TYPE

       LDB    #POINT          ; Mode TYPE2 (inutilisé)
       LBSR   PCHAR
       BRA    DPPAU

DPASC  LDB    ,X+             ; Boucle d'affichage texte
       CMPB   #EOF            ; Fin de fichier ?
       BEQ    DPCLOS

       LBSR   PCHAR
       LEAY   -1,Y
       BEQ    DPPAU

       BRA    DPASC

DPHEX  CMPY   #128            ; Affichage dump hexa
       BCS    DPTAIL

       LDA    #128
       LEAY   A,Y
       JSR    HEXBLK          ; Affiche un bloc complet
       BCC    DPNXT

       BRA    DPCLOS

DPNXT  LBSR   DCRLF           ; Retour à la ligne
       BRA    DPHEX

DPTAIL TFR    Y,D             ; Les quelques octets de la fin
       TFR    B,A
       LBSR   HEXLIN          ; Affiche le reste
       LBSR   DCRLF           ; Saute une ligne

DPPAU  BSR    PAUSE           ; Espace pour la suite ou STOP pour s'arrêter
       BCS    DPCLOS

       LDB    CRERR,PCR
       BNE    DPCLOS

       LDD    CSGNFN+1,PCR
       ADDD   CRXT0,PCR
       STD    CSGNFN+1,PCR
       BCC    DPLOOP

       INC    CSGNFN,PCR
       LBRA   DPLOOP

DPCLOS LDA    #FERFI          ; On est au bout
       STA    CSGNTA,PCR
       LBSR   XCNSGN          ; Fermeture du fichier

DPRST  LBSR   RSTDIR          ; Restauration du répertoire courant

DPRTS  RTS

DPMODE RMB    1               ; Mode d'affichage DUMP/TYPE/TYPE2
DPFOFS RMB    3               ; Addresse courante dans le fichier (24 bits)

************************************************************************************************************
* DFLOFS
* Affiche la position courante dans le fichier, en hexadécimal. Inutilisé.
************************************************************************************************************
DFLOFS SET    *
       PSHS   A,B,X,Y
       LDX    #DPFOFS
       LDB    ,X+
       JSR    DHEX8
       LDB    ,X+
       JSR    DHEX8
       LDB    ,X
       JSR    DHEX8
       LDB    #SPACE
       JSR    PCHAR
       LEAX   -1,X
       LDD    #$10
       ADDD   ,X
       STD    ,X
       BCC    DFORTS

       LEAX   -1,X
       INC    ,X

DFORTS PULS    PC,Y,X,B,A

************************************************************************************************************
* PAUSE
* Teste la pression de espace ou STOP pour arrêter DUMP / TYPE.
************************************************************************************************************
PAUSE  SET    *
       PSHS   A,B
       LBSR   KEYPRS
       BEQ    PBRK

       LBSR   GETKEY
       CMPB   #SPACE
       BNE    PSTOP

PLOOP  LBSR   GETKEY
       CMPB   #SPACE
       BEQ    PLOOP

PSTOP  CMPB   #STOP
       BNE    PBRK

       COMA
       BRA    PRTS

PBRK   CLRA

PRTS   PULS   PC,B,A

************************************************************************************************************
* HEXBLK
* Affiche un bloc hexadécimal
************************************************************************************************************
HEXBLK SET    *
       LDD    #$810            ; 16 lignes de 8 octets

HBLOOP BSR    PAUSE
       BCS    HBRTS

       PSHS   A,B
       JSR    HEXLIN           ; Affiche une ligne
       PULS   B,A
       DECB
       BNE    HBLOOP

       CLRA

HBRTS  RTS

************************************************************************************************************
* PONOFF
* Teste si le deuxième atome est ON ou OFF.
************************************************************************************************************
PONOFF SET    *
       JSR    SKSPCL
       BEQ    POORTS

       LDY    #TON             ; Comparaison avec le mot-clé ON
       JSR    PRSKW
       BEQ    POOOFF

       LDB    #$FF
       ANDCC  #$FA
       BRA    POOOK

POOOFF LDY    #TOFF            ; Comparaison avec le mot-clé OFF
       JSR    PRSKW
       BEQ    POONOK

       CLRB
       ANDCC  #$FA
       BRA    POOOK

POONOK ANDCC  #$FB             ; Ni l'un ni l'autre
       ORCC   #1
       BRA    POORTS

POOOK  PSHS   CC
       STX    CLPTR
       STA    CLTOGO
       PULS   CC

POORTS RTS

************************************************************************************************************
* TEMP
* Exécute la commande TEMP.
************************************************************************************************************
TEMP   SET    *
       JSR    BCNSGN
       BSR    PONOFF           ; Récupère le paramètre ON ou OFF
       LBLS   PRMERR           ; Ni ON ni OFF, erreur de paramètre

       STB    CSGNDK
       LDA    #SETMOD
       STA    CSGNTA
       JSR    XCNSGN           ; Exécute la consigne SETMODE
       RTS

************************************************************************************************************
* PRINT
* Exécute la commande PRINT.
************************************************************************************************************
PRINT  SET    *
       JSR    SETCTX           ; Récupère le contexte
       BNE    PTOK

       LBSR   PRMERR           ; Erreur de chemin
       LBRA   PTRST

PTOK   LDX    #CSGND2
       LDA    #1
       STA    ,X+              ; Par défaut, un exemplaire
       CLR    ,X+              ; sur l'imprimante 0
       CLR    ,X+              ; en mode transparent
       LDX    #CSGND2
       LDA    #3

PTARGS JSR    PRSINT           ; Lis les 3 paramètres optionnels
       BEQ    PTGO

       TFR    Y,D
       STB    ,X+
       DECA
       BNE    PTARGS

PTGO   LDB    #SPOOL           ; Construit la consigne
       STB    CSGNTR
       LDB    #PRINTF
       STB    CSGNTA
       JSR    XCNSGN           ; Lance l'impression
       LDA    #SYSFIC
       STA    CSGNTR,PCR

PTRST  LBSR   RSTDIR           ; Restaure le répertoire courant
       RTS

************************************************************************************************************
* CDSKF
* Exécute la commande DSKF.
************************************************************************************************************
CDSKF  SET    *
       JSR    SETCTX           ; Récupère le contexte
       LDB    #DSKF
       STB    CSGNTA
       JSR    XCNSGN           ; Exécute la consigne
       BNE    DKFRST

       LDX    #RESTST          ; Affiche le résultat
       JSR    DSPSTR
       LDD    CRXT0
       JSR    DISPDEC          ; Affiche en décimal la place restante (en Ko)
       LDX    #LIBRST
       JSR    DSPSTR
       LDB    CSGNDK
       ADDB   #AROB
       JSR    PCHAR            ; Affiche le disque
       LDB    #COLON
       JSR    PCHAR

DKFRST LBSR   RSTDIR           ; Restaure le répertoire courant
       RTS

RESTST FCB    CR, LF
       FCS    /Il reste /
LIBRST FCS    / K libres sur /

************************************************************************************************************
* SAVE
* Enregistre un fichier sur le disque. Cette routine n'est pas utilisée et fait appel à deux routines
* buggées et dont l'utilité est inconnue.
************************************************************************************************************
SAVE   SET    *
       LBSR   SETCTX          ; Récupère le contexte
       LBEQ   PRMERR

       LDA    #CREFI
       STA    CSGNTA,PCR
       LBSR   PRSINT          ; Récupère le type de fichier
       LBEQ   PRMERR

       LBCS   PRMERR

       CMPY   #4              ; Le type de fichier va de 0 à 3
       LBCC   PRMERR

       TFR    Y,D
       STB    CSGND2,PCR
       LBSR   PRSINT          ; Récupère le format ASCII ou binaire
       LBEQ   PRMERR

       LBCS   PRMERR

       TFR    Y,D             ; Le flag de mode doit être 0 ou FF
       TSTA
       LBNE   PRMERR

       TSTB
       BEQ    SVSIZE

       CMPB   #$FF
       LBNE   PRMERR

SVSIZE STB    CSGNF2,PCR
       LBSR   PRSINT          ; Taille du bloc à sauver
       LBEQ   PRMERR          ; Ne doit pas être 0

       LBCS   PRMERR

       STY    B2WRTL,PCR
       LBSR   XCNSGN          ; Crée le fichier
       LBNE   SVRTS

       LDB    CRXT0,PCR
       STB    CSGNDK,PCR
       LDA    #ECRFI
       STA    CSGNTA,PCR
       LDD    #0              ; Position 0 dans le fichier
       STD    CSGNFN,PCR
       CLR    CSGSZ0,PCR
       LBSR   UNKRT2

SVLOOP LDD    B2WRT,PCR
       BEQ    SVCLOS

       SUBD   F1BFSZ,PCR
       STD    B2WRT,PCR
       BPL    SVWRIT

       ADDD   F1BFSZ,PCR
       STD    CSGNSZ,PCR
       LDD    #0
       STD    B2WRT,PCR

SVWRIT BSR    UNKRT1
       LBSR   XCNSGN          ; Ecrit dans le fichier
       LDB    #POINT
       LBSR   PCHAR
       LDX    CSGNFN+1,PCR
       LDD    CSGNSZ,PCR
       LEAX   D,X
       STX    CSGNFN+1,PCR
       BRA    SVLOOP

SVCLOS LDA    #FERFI
       STA    CSGNTA,PCR
       LBSR   XCNSGN          ; Ferme le fichier

SVRTS  RTS

************************************************************************************************************
* UNKRT1
* Routine d'utilité inconnue, utilisée uniquement par SAVE, buggée.
************************************************************************************************************
UNKRT1 SET    *
       LDY    F1BSZ2,PC      ; N'a pas de sens (à cheval sur deux variables)
       BEQ    UK1RTS

       LDX    F1BFPT,PCR
       LEAU   WRDLB1,PCR     ; N'a pas de sens (au milieu du code de DIR)
       PSHS   U
       LDU    UNKVR1

UK1LP  CMPU   ,S
       BNE    UK1NXT

       BSR    I2STR
       LEAU   UNKVR2,PCR

UK1NXT LDB    ,U+
       STB    ,X+
       LEAY   -1,Y
       BNE    UK1LP

       STU    UNKVR1,PCR

UK1RTS PULS   PC,U

************************************************************************************************************
* I2STR
* Routine qui transforme un entier 16 bits en une chaîne de caractère (nombre décimal).
************************************************************************************************************
I2STR  SET    *
       PSHS   X,U
       LEAX   STRBUF,PCR
       LDB    #SPACE
       LDA    #5

ISLOOP STB    ,X+           ; Remplit le buffer d'espaces
       DECA
       BNE    ISLOOP

       LDD    INT16,PCR
       LEAX   STRBUF,PCR
       LBSR   BN2DC
       LDD    INT16,PCR
       ADDD   #32
       STD    INT16,PCR
       PULS   PC,U,X

************************************************************************************************************
* UNKRT2
* Routine d'utilité inconnue, utilisée uniquement par SAVE.
************************************************************************************************************
UNKRT2 SET    *
       LEAX   UNKVR2,PCR
       LEAY   IDBUFF,PCR
       LDA    #11             ; 11 octets à copier
       LBSR   MEMCPY
       LEAX   UNKVR2,PCR
       STX    UNKVR1,PCR
       LDX    #16
       STX    INT16,PCR
       BSR    I2STR
       RTS

B2WRT  FCB    0
B2WRTL FCB    0
UNKVR1 FDB    0
INT16  FDB    0
UNKVR2 FCB    '1,'2,'3,'4,'5,'6,'7,'8
       FCB    '1,'2,'3
       FCB    RIGHT, SPACE
       FCB    '1,'2,'3
STRBUF FCB    '4,'5
       FCB    RIGHT, RIGHT, SPACE

************************************************************************************************************
* DIR
* Exécute la commande DIR.
************************************************************************************************************
DIR    SET    *
       LBSR   SETCTX          ; Récupère le contexte
       LDA    #CATP
       STA    CSGNTA,PCR
       LDB    #$FF

WRDLB1 CMPB   JKFLAG
       BNE    DRLPCT

       LDX    #CSGNFN
       LDA    #QMARK
       LDB    #11             ; 11 octets à remplir

DIRJKL STA    ,X+             ; Par défaut, recherche sur "????????.???"
       DECB
       BNE    DIRJKL

DRLPCT LEAX   CNSGN,PCR
       JSR    RESEAU          ; Recherche du catalogue
       LDB    CRERR,PCR
       BEQ    DRMORE

       CMPB   #EFINX          ; Pas trouvé (fichier inexistant)
       BNE    DROK

       LEAX   NOFLST,PCR
       LBSR   DSPSTR
       LBRA   DRRST

DROK   CMPB   #EFINC          ; Fin de catalogue
       BEQ    DRMORE

       LBSR   ERRMSG
       LBRA   DRRST

DRMORE LDX    F1BFPT,PCR
       LDY    CRXT1,PCR
       LBEQ   DRRST

DRLPFL LDB    ,X
       ANDB   #$80            ; Flag de répertoire
       BEQ    DRISFL

       PSHS   X               ; Affiche le répertoire
       LDA    #8
       LBSR   DPSTLN
       LEAX   REPST,PCR
       LBSR   DSPSTR
       PULS   X
       LEAX   17,X
       BRA    DRKEYP

DRISFL LBSR   DISPFN          ; Affiche le nom de fichier
       LDB    CRXT2,PCR       ; Type de format de catalogue
       BEQ    DRKEYP

       PSHS   Y
       LDB    #SPACE
       LBSR   PCHAR
       LDB    #SPACE
       LBSR   PCHAR
       LDD    ,X+             ; Calcule la taille en Ko
       LSRA
       RORB
       LSRA
       RORB
       TFR    D,Y
       LDD    ,X++
       TSTB
       BNE    DRINC

       ANDA   #3
       BEQ    DRDPSZ

DRINC  LEAY   1,Y

DRDPSZ TFR    Y,D
       PSHS   X
       LBSR   DSPDC1          ; Affiche la taille en Ko
       LEAX   KST,PCR
       LBSR   DSPSTR
       PULS   X
       LBSR   D3NBS
       PULS   Y

DRKEYP LBSR   DCRLF
       LBSR   KEYPRS
       BEQ    DRNXT

       LBSR   GETKEY
       CMPB   #2
       BEQ    DRRST

       LBSR   GETKEY
       CMPB   #2
       BEQ    DRRST

DRNXT  LEAY   -1,Y
       BNE    DRLPFL
       LDA    CRERR,PCR
       CMPA   #EFINC         ; Fin de catalogue
       BEQ    DRRST

       LDA    #CATS
       STA    CSGNTA,PCR
       LBRA   DRLPCT

DRRST  LBSR   RSTDIR         ; Restaure le répertoire courant
       LBRA   DCRLF

UNKBF1 RMB    65             ; Ce buffer et ce qui suit est inutilisé
UNKCS1 FCB    12, 0, SYSFIC, SETDIR
       FDB    64, 0, 0, 1
       RMB    53

************************************************************************************************************
* DISPFN
* Affiche un nom de fichier et son suffixe.
************************************************************************************************************
DISPFN SET    *
       PSHS   A
       LDA    #8             ; 8 caractères
       BSR    DPSTLN
       LDB    #POINT         ; Un point
       LBSR   PCHAR
       LDA    #3             ; 3 caractères
       BSR    DPSTLN
       PULS   PC,A

************************************************************************************************************
* DPSTLN
* Affiche une chaîne de caractère de longueur fixe
************************************************************************************************************
DPSTLN SET    *
       LDB    ,X+
       ANDB   #$7F
       LBSR   PCHAR
       DECA
       BNE    DPSTLN

       RTS

REPST  FCS    /      <sous-catalogue>/
NOFLST FCS    /Aucun fichier ne convient./
KST    FCC    / K/
       FCB    RIGHT, SPACE, 0

* Buffer de consigne
CNSGN  FCB    60            ; Taille par défaut : 60 octets
CSGDST FCB    CENTRL        ; Destinataire par défaut : central
CSGNTR RMB    1             ; Code tâche réseau
CSGNTA RMB    1             ; Code tâche application
CSGNSZ RMB    2             ; Nombre d'octets (16 bits)
CSGNPG RMB    1             ; Page
CSGNAD RMB    2             ; Adresse (16 bits)
CSGNCP RMB    1             ; Ordinateur
CSGNAP RMB    1             ; Application
CSGNDK FCB    1             ; Disque par défaut : A:
CSGNFN FCC    /DEPART  NRD/ ; Fichier par défaut : DEPART.NRD
CSGND2 RMB    1             ; Deuxième disque
CSGNF2 RMB    11            ; Deuxième fichier
       RMB    30

************************************************************************************************************
* SETCTX
* Sauve le répertoire courant, se déplace vers le répertoire figurant dans le premier atome et récupère le
* nom de fichier dans le premier atome.
************************************************************************************************************
SETCTX SET    *
       LDA    #0
       STA    CDSUCS
       LEAY   FNMBF2,PCR
       LDX    CLPTR,PCR
       LDA    CLTOGO,PCR
       LBSR   SKPSPC         ; Ignore les séparateurs successifs
       LBSR   PRSPTH         ; Interprète l'atome comme un chemin
       PSHS   A,X,Y
       LDA    FNMBF2         ; No. de disque
       STA    CNSGN+11
       LDB    #$FF
       CMPB   NPFLG
       BEQ    SCNOCD

       LDX    #DBUF01
       LBSR   SWIDIR
       LDB    #$FF
       CMPB   CDSUCS
       BNE    SCSKP2

       LDX    #DBUF02
       LBSR   CHGDIR
       LDB    #0

SCSKP2 STB    JKFLAG
       PULS   Y,X,A
       LDB    #$FF
       CMPB   CDSUCS
       BEQ    SCRTS

SCNOCD STA    CLTOGO,PCR
       STX    CLPTR,PCR
       LEAX   CSGNDK,PCR
       LEAY   FNMBF2,PCR
       LDA    #12            ; 12 caractères
       LBSR   MEMCPY
       LEAX   CSGNFN,PCR
       LDB    ,X
       CMPB   #SPACE
       BNE    NOJOK

       LDB    #QMARK
       LDA    #11            ; 11 caractères

SCJKLP STB    ,X+
       DECA
       BNE    SCJKLP

NOJOK  BSR    BCFPT1
       LDA    #SPACE
       CMPA   FNMBF2

SCRTS  RTS

CDSUCS FCB    0              ; Flag de déplacement réussi vers le nouveau répertoire
JKFLAG FCB    0              ; Flag de présence de jokers dans le nom de fichier
NPFLG  FCB    0              ; Flag de présence d'un chemin

************************************************************************************************************
* BCFPT1
* Construit une consigne avec le premier buffer de fichier
************************************************************************************************************
BCFPT1 SET    *
       LDX    F1BFPT,PCR
       STX    CSGNAD,PCR
       LDD    F1BFSZ,PCR
       STD    CSGNSZ,PCR
       CLR    CSGNPG
       LDA    #CENTRL
       STA    CSGDST,PCR
       LDA    #SYSFIC
       STA    CSGNTR,PCR
       RTS

************************************************************************************************************
* BCFPT1
* Construit une consigne avec le deuxième buffer de fichier
************************************************************************************************************
BCFPT2 SET    *
       LDX    F2BFPT,PCR
       STX    CSGNAD,PCR
       LDD    F2BFSZ,PCR
       STD    CSGNSZ,PCR
       CLR    CSGNPG
       LDA    #CENTRL
       STA    CSGDST,PCR
       LDA    #SYSFIC
       STA    CSGNTR,PCR
       RTS

************************************************************************************************************
* PRARG2
* Interprète le deuxième argument
************************************************************************************************************
PRARG2 SET    *
       LDX    CLPTR,PCR
       LDA    CLTOGO,PCR
       LBSR   PRSKW
       BEQ    PARTS

       LBSR   SKPSPC
       BEQ    PARTS

       LEAY   FNMBF3,PCR
       LBSR   PRSPTH
       STA    CLTOGO,PCR
       STX    CLPTR,PCR
       ANDCC  #$FB

PARTS  RTS

************************************************************************************************************
* XCNSGN
* Exécute une consigne Nanoréseau.
************************************************************************************************************
XCNSGN SET    *
       LDB    #$FF
       STB    CRERR,PCR
       LEAX   CNSGN,PCR
       JSR    RESEAU
       LDB    CRERR,PCR
       BEQ    XCRTS

       CMPB   #$FF
       BEQ    XCNOCR

       PSHS   CC
       BSR    ERRMSG
       PULS   CC

XCRTS  RTS

XCNOCR LEAX   NOCRST,PCR
       LBSR   DSPSTR
       LDB    #$FF
       RTS
       
NOCRST FCB    CR, LF
       FCC    /Pas de r/
       FCB    ACC, 'B
       FCC    /eception du compte-rendu./
       FCB    CR, LF, 0
              

Retourner à la liste des fichiers

cmdp3.asm.1767457224.txt.gz · Last modified: by fool-duplex

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki