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 CRFH,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 CRFH,U
STX 16,U ; Nombre d'octets lus
LDD CRFH,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 CRFH,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 CRFH1,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 CRFH,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
************************************************************************************************************
* DSKF
* Exécute la commande DSKF.
************************************************************************************************************
DSKF 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 CRFH
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 CRFH,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 CRFH1,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 CRFH2,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
cmdp3.asm.1767454788.txt.gz · Last modified: by fool-duplex
