--- title: "ETAT_BIN: A SuperBASIC Extension" type: "article" slug: "etat_bin-a-superbasic-extension" url: "http://localhost/article/etat_bin-a-superbasic-extension/" markdown_url: "http://localhost/article/etat_bin-a-superbasic-extension.md" published_at: "2026-11-11T11:07:21+00:00" modified_at: "2026-11-11T11:07:21+00:00" featured_image: url: "http://localhost/wp-content/uploads/2022/04/20230809-041332.jpg" excerpt: "ETAT_BIN by W. Lenerz, from the QLCF, adds a SuperBASIC function ETAT that tests whether a file exists before a program tries to copy or open it, returning 0 or the QDOS error code instead of stopping the program with an error. The article explains how to load and call it, gives two usage examples (one a safe file-copy routine), and lists the commented 68000 assembler source, a table of the returned codes, and a universal BASIC loader (CHARGEUR_BAS) with the DATA lines that create ETAT_BIN." post_tag: - name: "French language" slug: "french-language" taxonomy: "post_tag" url: "http://localhost/tag/french-language/" - name: "Machine language programming" slug: "machine-language" taxonomy: "post_tag" url: "http://localhost/tag/machine-language/" - name: "QL" slug: "ql" taxonomy: "post_tag" url: "http://localhost/tag/ql/" - name: "Superbasic (programming language)" slug: "superbasic-programming-language" taxonomy: "post_tag" url: "http://localhost/tag/superbasic-programming-language/" - name: "Type-in program" slug: "type-in-program" taxonomy: "post_tag" url: "http://localhost/tag/type-in-program/" model: - name: "Sinclair QL" slug: "sinclair-ql" taxonomy: "model" url: "http://localhost/model/sinclair-ql/" publication: "QL_DOC" publication_r: id: 52925 title: "QL_DOC" type: "periodical" url: "http://localhost/periodical/ql_doc/" authors: "W. Lenerz" issue: "12" issues_articles: - id: 76728 title: "QL_DOC n12" type: "issue" url: "http://localhost/issue/ql_doc-n12/" pages: "5-7" pubdate: "October-November 1989" archive_link: false volumeissue: "n12" --- # ETAT_BIN: A SuperBASIC Extension **In English:** ETAT_BIN by W. Lenerz, from the QLCF, adds a SuperBASIC function ETAT that tests whether a file exists before a program tries to copy or open it, returning 0 or the QDOS error code instead of stopping the program with an error. The article explains how to load and call it, gives two usage examples (one a safe file-copy routine), and lists the commented 68000 assembler source, a table of the returned codes, and a universal BASIC loader (CHARGEUR_BAS) with the DATA lines that create ETAT_BIN. *Printed title: ETAT_BIN. The article below is in French, as printed in QL_DOC n12 (October-November 1989).* *** Ce nouveau mot-clé S-Basic peut vous aider dans la manipulation de vos fichiers. En effet, un des désavantages du S-Basic est que, lorsqu’on veut faire une opération sur un fichier (copie, ouverture etc…) et que celui-ci n’existe pas, le S-Basic s’arrête avec une erreur. Ce n’est pas grave lorsqu’on travaille en mode directe, mais c’est embêtant dans un programme, car l’erreur va arrêter le programme. ETAT est une nouvelle fonction qui vous permettra de tester l’état d’un fichier avant de faire une opération dessus. Le nouveau mot-clé se charge par: ``` a=RESPR(200): LBYTES _etat_bin,a:CALL a ``` Vous disposez à ce moment d’une nouvelle fonction, appelée ETAT. Syntaxe: ETAT (“nom_du_fichier”); où nom_du_fichier doit être le nom du fichier à tester, y compris le nom de l’unité microdrive, disquette ou ramdisque. Ce nom doit être compris entre guillemets et entre parenthèses. Cependant, on peut utiliser aussi un nom de variable, qui contient le nom du fichier. Dans ce cas, il ne faut plus mettre les guillemets – mais il faut toujours mettre les parenthèses (v. exemple 2). Le nouveau mot-clé ETAT est une fonction. Il faut donc l’utiliser dans des lignes du genre: PRINT ETAT (‘nom du fichier’) ou LET a=ETAT(‘Nom du fichier’). La fonction ETAT vous renverra un code d’erreur. Si ce code est égal à 0, le fichier en question existe sur l’unité en question. Sinon, la valeur renvoyée par ETAT correspond aux différents codes d’erreur du QDOS. Vous trouverez dans le manuel du QL (section ‘CONCEPTS’ – titre ‘Error Handling’) le sens de chacun des codes d’erreur (négatifs) ren-voyés. ### EXEMPLES D’UTILISATION Exemple.1 Utilisation en mode direct: ``` PRINT ETAT('mdv1_coucou') ``` Ceci va imprimer un chiffre à l’écran, qui correspond au code d’erreur. Exemple 2: On demande le nom d’un fichier à copier, source et destination: ``` 10 INPUT "Vous voulez copier quel fichier ?";a$ 20 testa=ETAT(a$) 30 IF testa<>0 THEN PRINT "Ce fichier n'existe pas!": GOTO 10 40 INPUT "Copier vers quel fichier?";b$ 50 testb=ETAT(b$) 60 IF testb<>-7 THEN PRINT "Ce fichier existe déjà ou est en usage!":GOTO 40 70 COPY a$ TO b$ ``` ETAT_BIN de W. Lenerz (QLCF) ``` ******************************* * ETAT_BIN * * de W. Lenerz * * source QLCF * ******************************* debut MOVE.W $110,A2 Vecteur pour lier mots dans la liste LEA procs,A1 des mots S-basic JMP (A2) A1 pointe vers le mots-clé procs DC.W 0 nombre de procédures DC.W 0 fin des procédures DC.W 1 nombre de fonctions DC.W etat-* pointeur vers début de la routine DC.B 4 longueur du nom DC.B 'ETAT' nom DC.L 0 fin du bloc de définition etat MOVEA.W $0116,A0 vecteur pour chercher un paramètre alpha, qui JSR (A0) est mis sur le pile, avec un mot indiquant TST.L D0 sa longueur. Ce paramètre, c'est le nom du fichier BNE.S sortie si erreur: on sort CMPI.W #1,D3 D3 contient le nombre de paramètres BNE.S sortie si <> de 1, il y a une erreur: on sort MOVE.L A1,A2 A1 (et maintenant A2) pointe vers la pile, par rapport ADDA.L A6,A2 à A6. En additionnant A6, A2 en devient indépendant MOVE.W (A2)+,D2 D2 contient le mot indiquant sa longueur LEA buffer,A1 MOVE.W D2,(A1)+ et on le transfère dans le buffer SUBQ.W #1,D2 boucle MOVE.B (A2)+,(A1)+ DBF D2,boucle puis on transfère le nom du fichier dans le MOVEQ #0,D3 buffer, qu'on va utiliser pour ouvrir MOVEQ #-1,D1 le fichier LEA buffer,A0 MOVEQ #1,D0 TRAP #2 et on tente d'ouvrir le fichier TST.L D0 BNE.S sortie MOVEQ #2,D0 on referme le fichier TRAP #2 sortie MOVEA.L $58(A6),A1 $58(A6) contient la pile S-Basic SUBQ.W #2,A1 on se fait de la place MOVE.L A1,$0058(A6) et on y met le paramètre de retour, MOVE.W D0,$00(A6,A1.L) à savoir le code d'erreur contenu dans D0 MOVEQ #$03,D4 on signale qu'on va retourner un entier MOVEQ #$00,D0 RTS et on y va buffer DS.L 10 END ``` ``` +--------------------------------------------------------+ : Codes retournés par la fonction ETAT : : : : 0 Opération OK : : -7 Fichier n'existe pas (not found) : : -8 Fichier existe déjà (already exists) : : -9 Fichier non-disponible (in use) : : -11 Lecteur plein (drive full) : : -16 Erreur d'opération : : (bad or changed medium) : +--------------------------------------------------------+ ``` Chargeur BASIC universel ``` 100 REMark CHARGEUR_BAS 110 REMark pour QL_DOC 120 : 130 INPUT "Où sauver les codes (ex. flp1_)?";sauve$ 140 IF LEN(sauve$)=0:sauve$="flp1_" 150 PRINT "Un instant s.v.p."; 160 : 170 RESTORE 1000 180 memoire=RESPR(1000):base_memoire=memoire 190 compte=0 200 : 210 REPeat boucle 220 IF EOF:EXIT boucle 230 READ octet:POKE memoire,octet:memoire=memoire+1 240 compte=compte+1 250 PRINT "."; 260 END REPeat boucle ``` ( insérer içi les DATA nécessaires ) DATA pour la création de ETAT_BIN ``` 900 PRINT"Une touche pour sauver "&sauve$&"ETAT_BIN " 910 PRINT "("&compte&" octets)" 920 PAUSE 930 SBYTES sauve$&"etat_bin",base_memoire,compte 940 PRINT "Ok!" 950 : 1000 DATA 52, 120, 1, 16, 67, 250, 0, 4, 78, 210 1001 DATA 0, 0, 0, 0, 0, 1, 0, 12, 4, 69 1002 DATA 84, 65, 84, 0, 0, 0, 0, 0, 48, 120 1003 DATA 1, 22, 78, 144, 74, 128, 102, 46, 12, 67 1004 DATA 0, 1, 102, 40, 36, 73, 213, 206, 52, 26 1005 DATA 67, 250, 0, 52, 50, 194, 83, 66, 18, 218 1006 DATA 81, 202, 255, 252, 118, 0, 114, 255, 65, 250 1007 DATA 0, 34, 112, 1, 78, 66, 74, 128, 102, 4 1008 DATA 112, 2, 78, 66, 34, 110, 0, 88, 85, 73 1009 DATA 45, 73, 0, 88, 61, 128, 152, 0, 120, 3 1010 DATA 112, 0, 78, 117, 0, 0, 0, 0, 0, 0 1011 DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ```