[[code_source_de_nrdos.mo5_version_3.5|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 D,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 #CYFLN ; Buffer de chemin courant LBSR PRSPTH ; Décode un chemin LDA CYFLN 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 12,0 ; Nom de fichier pour COPY CYCDIR RMB 65,0 ; Répertoire courant pour COPY CYDDIR RMB 65,0 ; 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 BCFPT1 ; 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 CSGNFN,PCR CLR CSGSZ0,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 CRXT0,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,0 ; Mode d'affichage DUMP/TYPE/TYPE2 DPFOFS RMB 3,0 ; 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 BCFPT1 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 DSPDC2 ; 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 B2WRT,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 F1BFSZ,PCR ; 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 FDB 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 CRXT0,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,0 ; Ce buffer et ce qui suit est inutilisé UNKCS1 FCB 12, 0, SYSFIC, SETDIR FDB 64, 0, 0, 1 RMB 53,0 ************************************************************************************************************ * 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 / / 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,0 ; Code tâche réseau CSGNTA RMB 1,0 ; Code tâche application CSGNSZ RMB 2,0 ; Nombre d'octets (16 bits) CSGNPG RMB 1,0 ; Page CSGNAD RMB 2,0 ; Adresse (16 bits) CSGNCP RMB 1,0 ; Ordinateur CSGNAP RMB 1,0 ; Application CSGNDK FCB 1,0 ; Disque par défaut : A: CSGSZ0 EQU *+2 ; CSGNFN FCC /DEPART / CSGNFE FCC /NRD/ ; Fichier par défaut : DEPART.NRD CSGND2 RMB 1,0 ; Deuxième disque CSGNF2 RMB 11,0 ; Deuxième fichier RMB 30,0 ************************************************************************************************************ * 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 [[code_source_de_nrdos.mo5_version_3.5|Retourner à la liste des fichiers]]