| Win3x.Org http://www.win3x.org/win3board/ |
|
| Postez vos petits programmes en QBasic http://www.win3x.org/win3board/viewtopic.php?f=24&t=5047 |
Page 4 sur 5 |
| Auteur : | gm86 [ 10 avr. 2010 14:31 ] |
| Sujet du message : | Re: Postez vos petits programmes pour DOS en QBasic |
| Pour le jour où vous reprendrez la programmation, je vous donne un conseil supplémentaire. En mode SCREEN 2 pour PONG, vous pouvez vous inspirer de l'exemple pour PUT (graphique) donné dans l'aide de QuickBASIC 4.5. Il s'agit d'afficher une image plus grosse que l'objet à représenter afin de recouvrir le dessin précédent. Cela évite d'effacer, rend l'animation rapide, sans clignotement et l'image est presque stable. Cependant, il faut utiliser un timer pour cadencer l'animation sinon la vitesse sera proportionnelle à celle du processeur. Si vous voulez allez plus loin, je peux vous présenter une méthode d'animation sans contrainte de palette mais plus gourmande en mémoire. Une animation consiste à afficher une image un certain laps de temps puis à l'effacer avant de l'afficher ailleurs mais à proximité, ce qui crée l'illusion du mouvement. L'organisation de la mémoire vidéo fait qu'on manipule le rectangle capable de l'image à l'écran. Les pixels non significatifs ont alors une valeur nulle. C'est pourquoi l'affichage d'une image avec XOU impose un fond uni, c'est-à-dire, constitué de pixels nuls aussi. Cependant, une carte EGA dispose de 16 registres de couleur programmables, celui numéroté 0 déterminant la couleur de fond. Pour pouvoir ajouter des pixels blancs (étoiles), on attribue la couleur blanche au registre 1 et on regroupe les 14 registres de couleur suivants deux à deux ; il n'y a plus que 8 couleurs sur 16 affichées à l'écran : celle du fond, le blanc brillant et les 7 couleurs correspondant aux 14 derniers registres. Le principal avantage de XOU (OU EXCLUSIF) est qu'il est réversible, deux mêmes copies s'annulent ce qui facilite l'effacement. Pour afficher une image devant un arrière-plan sans restriction de couleurs, il faut mettre à zéro les pixels de l'arrière-plan à remplacer par ceux de l'image avant la copie avec OU -- INCLUSIF, EXCLUSIF peu importe. Pour cela, on applique un masque grâce à l'opérateur ET logique. Vu qu'on travaille en mode 16 couleurs, il sera constitué de deux attributs : 15 et 0. Le premier préserve, le second annule.
En conclusion, au lieu de travailler avec une seule image comme précédemment, on manipule aussi son masque et une copie de l'arrière-plan modifié, tous trois nécessitant la même quantité de mémoire. Le masque utilise la possibilité du ET logique de forcer un bit à zéro, le sprite, la possibilité contraire du OU logique. En pratique, toutes ces copies sont longues à effectuer et il faut travailler en dehors de la mémoire vidéo avant d'afficher. Surtout que la mémoire vidéo des vieilles cartes sur connecteur ISA est lente. Malheureusement sous BASIC, il est plus facile de travailler en mémoire vidéo. En revanche, on peut avoir recours à deux pages vidéos, une sur laquelle on travaille les sorties et une utilisée pour afficher à l'écran. Voici quelques informations à détenir :
Il faut la ligne 3130 pour la synchronisation verticale sous QuickBASIC 4.5, PDS, VB/DOS et sous IBM BASICA. A noter que le message de la ligne 1110 ne s'applique pas à la version 3.21 d'IBM qui est un GW/BASIC 2, et que le Compaq BASIC 3.20 considère LOCATE 25 comme une erreur, même après KEY OFF. P.S. : la synchronisation verticale doit s'effectuer après l'échange d'écran et avant les différentes manipulations vidéo afin d'éviter que le dessin animé ne disparaisse à certaines hauteurs d'écran -- phénomène à prendre en compte pour les processeurs les moins rapides capables d'assurer une animation fluide. 16/4/21 : autant d'éditions que de versions BASIC. Ouf ! |
| Auteur : | Dr Frankenstein [ 10 avr. 2010 20:09 ] |
| Sujet du message : | Re: Postez vos petits programmes pour DOS en QBasic |
| gm86 : Merci pour l'article détaillé, très pertinant. |
| Auteur : | gm86 [ 10 avr. 2010 20:18 ] |
| Sujet du message : | Re: Postez vos petits programmes pour DOS en QBasic |
| S'agissant de la ligne 3130, j'ai testé le programme sous une version patchée de IBM BASICA. En effet, BASICA livré avec les anciens PC/DOS nécessite un PC ou XT ou AT d'IBM, ou encore un PS/2. Ce sont pratiquement les seuls à posséder un BASIC en ROM. Donc, je ne fais que supposer son fonctionnement et j'aurai besoin de l'avis d'une personne possédant un vrai IBM. P.S. : merci pour le compliment. Je regrette seulement d'avoir joué la facilité : il aurait été plus judicieux de travailler directement avec les tableaux en mémoire, ce qui évite l'usage de deux pages d'écran. C'est justement la raison de déclarer des tableaux d'entiers. |
| Auteur : | joeydu79100 [ 20 avr. 2010 20:08 ] |
| Sujet du message : | Re: Postez vos petits programmes pour DOS en QBasic |
| Ouah 6120 lignes j'aurai pas fait Sinon en QBasic j'ai fait (enfin commencé) une sorte de test sur les fonctions de MS-DOS, pour voir si on le connait bien (je sais ça sert pas vraiment à grand chose Et on pourrait faire chacun sa partie du test, par exemple moi la partie 1 que j'ai commencé (nommée "Une seule commande", et ça consiste à... bah à utiliser une seule commande à chaque fois). Par contre il est là haut dans ma chambre, sur mon 3.1. Je l'apporterais plus tard. |
| Auteur : | 0597534 [ 20 avr. 2010 23:40 ] |
| Sujet du message : | Re: Postez vos petits programmes pour DOS en QBasic |
| @gm86 vu que j'ai un IBM ps/2 avec basic en rom je le testerai et je t'en redirai des nouvelles, si ca fonctionne ou pas |
| Auteur : | gm86 [ 22 avr. 2010 10:10 ] |
| Sujet du message : | Re: Postez vos petits programmes pour DOS en QBasic |
| Pour copier le code inscrit dans mon message dans un fichier ASCII, il faut procéder ainsi : - sélectionner le code et faire « copier » ; - ouvrir Wordpad, créer un nouveau fichier texte ; - faire « coller » ; - s'assurer que la dernière ligne soit suivie d'un retour à la ligne afin qu'elle soit prise en compte lorsque le programme est lancée par l'interprète depuis la ligne de commande ; - enregistrer sous le format de fichier texte MS-DOS (ASCII) si possible ; - remplacer l'extension .TXT par .BAS . A présent, il doit tourner sous GW-BASIC ou IBM BASICA. Reste à voir son fonctionnement sous ce dernier avec ou sans la ligne 3130. Pour note, la version 3.20 ou supérieure de BASICA.COM est livrée avec PC-DOS de la version 3.20 à la version 5. P.S. : Finalement, j'ai utilisé la technique proposée par votre oncle puisque le BASIC préconise cette méthode. S'il s'agit d'un modèle 25 ou 30, il comporte un circuit MCGA et non VGA qui peut être incompatible avec le mode EGA. De toute façon, mieux vaut essayer avec un modèle supérieur car les animations en BASIC interprété, sans le secours de routines en code machine, sont très lentes. ---- Publié : mardi 6 juillet 2010 19:52 Veuillez excuser mon double-post mais je crains d'encombrer le précédent. Il est inutile de scruter les codes BREAK et MAKE des touches suivantes pour savoir si elles sont enfoncées : Alt, Ctrl, Maj, Inser, Verr Maj, Arrêt défil et Sys Req. En effet, le BIOS note leur état dans deux octets (voir détail ci-dessous). Remarquez comment j'ai fait dans mon programme précédent pour désactiver les verrouillages numérique, majuscule et défilement.
Le jeu « Night Mission Pinball » de Bruce Artwick utilise l'octet 0040:0017 (adresse 20 bits segment:offset en hexadécimal) pour contrôler les touches Maj gauche et droite. J'ai trouvé sur Internet une version de Space Invaders en QuickBASIC datant de décembre 2000 et écrite par James Eibisch qui lit aussi cet octet : http://www.calhoun.edu/WD/GamesPage/Spa ... v78-02.bas http://www.rakelly.com/space_invaders/d ... v78-02.bas (remplacer l'extension .bas de l'adresse par .txt pour lire le fichier d'accompagnement et par .exe pour obtenir la version compilée) De plus, ce jeu joue sa célèbre musique avec le synthétiseur FM des cartes Adlib et Sound Blaster. A essayer. Revenant à mon exemple de programmation en GW-BASIC, il se peut qu'il n'y ait pas besoin d'ajouter la ligne 3130 pour la synchronisation verticale sous IBM BASICA et QuickBASIC. Je m'explique. Un problème de GW-BASIC est que la palette est réinitialisée à chaque emploi de SCREEN ou de PCOPY. Une solution est de la redéfinir à chaque fois. Le plus pratique est d'employer PALETTE USING tableau(début) qui peut s'avérer être, hélas, trop lente sur une machine antérieure au Pentium. Dans mon programme, le problème est de maintenir le fond bleu. Je l'ai rempli de pixels bleus mais l'idéal reste de définir l'attribut 0 avec la couleur 1 tout en sachant que COLOR , fond% est aussi une commande de palette : PALETTE 0, 1 ou COLOR , 1. Or, j'ai l'impression que ces deux instructions résolvent aussi le problème de synchronisation verticale sous IBM BASICA et QuickBASIC tant que le matériel n'est pas des plus récents. Entrez les lignes suivantes dans mon programme afin d'implanter la couleur de fond tout en supprimant l'instruction de remplissage PAINT :
NOTA : sous QuickBASIC 4.5, les trois instructions graphiques COLOR, PALETTE et SCREEN se comportent comme sous le BASICA d'IBM et non comme sous GW-BASIC ou les versions précédentes de QuickBASIC. Le fichier exécutable produit par QuickBASIC 4.5 est fluide et son instruction SCREEN n'attend pas le retour du balayage d'écran ; l'instruction PALETTE ou COLOR qui suit permet donc cette synchronisation. Au contraire, l'exécutable produit par une version antérieure de QuickBASIC est lente et son instruction SCREEN attend le retour du balayage mais réinitialise la palette ; l'instruction PALETTE ou COLOR sert alors à réactiver la palette ce qui peut faire clignoter l'écran. Paradoxalement, ce phénomène est plus visible sous QuickBASIC 3.x et surtout 2.x que sous GW-BASIC, sans parler de l'interception manquée de la plupart des codes clavier. En fait, l'instruction SCREEN perd du temps durant l'échange des deux pages d'affichage. En acceptant le risque de perdre en qualité d'animation, on peut remplacer l'échange de pages d'écran par une copie grâce à l'instruction PCOPY et ainsi préserver la palette sous GW-BASIC et QuickBASIC 2.x, 3.x et 4.0. Voici les changements à effectuer :
Je rappelle que sous QuickBASIC 4.5 et IBM BASICA cette copie est inutile et ne fait que baisser les performances. En conclusion, mieux vaut utiliser l'échange de pages avec le BASICA d'IBM comme interpréteur sur un micro IBM avec BASIC de ROM — sur un compatible, cf. viewtopic.php?f=2&t=6199. En effet, l'instruction SCREEN du GW-BASIC correspond à celle du BASICA suivie de l'instruction PALETTE sans paramètre. Or, cette dernière réinitialise la palette de couleurs et, à l'instar de PALETTE USING qui modifie toute la palette, est plus lente que si elle possédait des paramètres dans le but de modifier un seul attribut de couleur. Il est désolant de constater que l'instruction SCREEN du GW-BASIC avec ces deux défauts peut empêcher une animation de profiter d'un échange fluide des pages d'écran. Néanmoins, si l'animation est lisse et avec un grain fin, il devient possible d'augmenter le pas, en pixels, à la ligne 21080. ---- Publié: lundi 11 octobre 2010 17:46 Je comprends enfin qu'il s'agit d'une application faite par QuickBASIC PDS. Depuis DOS 3, un compteur 16 bits et la spécification complète du fichier exécutée suivent le mot nul signalant la fin de l'environnement du programme. Sous QuickBASIC, on peut compiler le programme d'exemple suivant avec le fichier à inclure QBX.BI (ou QB.BI) et grâce à la bibliothèque QBX.QLB (ou QB.QLB) :
---- Publié: mercredi 13 mars 2013 23:49 Je vais présenter une technique intéressante pour traiter les différents éléments d'une chaîne de caractères. J'ai pris l'exemple du numéro de sécurité sociale car la décomposition des nombres le constituant n'est pas fixe. Les extraire est facile avec l'instruction FIELD# décrivant les champs d'accès direct à un fichier. Comme on ne veut pas créer un fichier physique, on va utiliser un périphérique qui ne fait rien sous DOS, et c'est là son rôle, le fichier NUL : OPEN"R",1,"NUL" L'intérêt de FIELD# est de s'en servir autant de fois qu'on a besoin de représentations du numéro de sécu. La première représentation sera le numéro entier lui-même. Deux autres seront suffisantes pour les trois différentes interprétations de ce numéro. Le numéro de sécu comporte 13 chiffres pour faire simple. Il peut donc être stocké dans une variable double précision (14 chiffres).
La clef du numéro de sécu, pratique pour éviter les erreurs de saisie, est la différence entre 97 et le reste de la division euclidienne du numéro de sécu par 97 (plus grand nombre premier inférieur à 100) : CLEF% = 97-(S.NOSS#-INT(S.NOSS#/97)*97) Pour ce calcul, les départements 2A et 2B sont remplacés respectivement par 19 et 18. Cf. http://therese.eveilleau.pagesperso-ora ... s/cles.htm En prenant les symboles suivants pour les valeurs à obtenir, S : SEXE% A : ANNEE% M : MOIS% D : DEPARTEMENT$ C : COMMUNE% O : ORDRE% P : PAYS% on représente ainsi les trois cas (métropole, DOM, étranger),
L : lieu d : DOM V : ville En utilisant la variable bidon D$, on obtient les champs suivants depuis le même objet : FIELD#1,13 AS NOSS$ FIELD#1,5 AS D$,2 AS DEP$,3 AS LIEU$,3 AS ORDRE$ FIELD#1,1 AS SEXE$,2 AS ANNEE$,2 AS MOIS$,3 AS DOM$,2 AS VILLE$ Le premier champ est le numéro entier de sécu. Le deuxième champ décrit les chiffres 6-10 pour les cas A & C et les derniers chiffres. Le troisième champ décrit les chiffres 1-5 ainsi que les chiffres 6-10 pour le cas B. Le programme suivant en BASIC Microsoft effectue quelques vérifications sur la chaîne obtenue S.NOSS$ avant de continuer le traitement : - treize caractères forment le numéro ; - le chiffre du sexe correspond à 1 ou 2 ; - les caractères sont tous des chiffres à l'exception des départements la Corse ; - demande si la clef obtenue est bonne (le modulo 97 évite pratiquement toute erreur) ; - le mois est valide.
- Entrée : saisie du numéro de sécu et vérification ; - Traitement : interprète les valeurs ; - Sortie : affiche les valeurs concernées par le cas (A, B ou C). ---- Publié: mercredi 3 juin 2015 18:44 Aujourd'hui, je poste rapidement un petit programme linéaire qui calcule pi en double précision. J'avais écrit l'original pour une calculatrice TI-82. La fonction récursive utilisée n'est pas rapidement convergente. Elle équivaut au quadruple de l'arc-tangente de 1 radian. C'est la formule Gregory : Pi/4=1-1/3+1/5... J'avais remarqué que la moyenne de l'avant-dernier résultat et de la moyenne elle-même de l'antépénultième résultat et du dernier résultat donnait une bien meilleure approximation du quart de pi. Ce programme démontre cette convergence progressive vers le nombre pi.
|
| Auteur : | INDEPTEKNO [ 03 juin 2015 19:15 ] |
| Sujet du message : | Re: Postez vos petits programmes pour DOS en QBasic |
On va essayer de faire un démarrage de windows
|
| Auteur : | gm86 [ 04 juin 2015 17:40 ] |
| Sujet du message : | Re: Postez vos petits programmes pour DOS en QBasic |
| En parlant de bug, mon programme ne fonctionne pas de manière souhaitée sous QBasic. Je l'ai conçu dans un interprète BASIC Microsoft, les nombres sont donc sous la forme propriétaire de Microsoft. Sous QBasic, la formule ne permet pas de converger ainsi vers Pi ! J'ai donc ajouté les valeurs à obtenir dans un post-scriptum. Je tiens à expliquer deux lignes :
L'actuelle ligne 160 comporte donc une valeur empirique pour arrêter la programme lorsqu'il dépasse par erreur le nombre pi et s'en rapproche à nouveau. On a donc affaire à un faux programme de calcul ! Quant à la ligne 220, elle évite au programme d'utiliser une valeur de comparaison inférieure à la précédente, et donc de boucler trop longtemps. |
| Auteur : | gm86 [ 23 mai 2017 19:42 ] |
| Sujet du message : | Re: Postez vos petits programmes en QBasic |
| J'avais mis auparavant un programme de calcul d'oculaires pour télescope. Soyez indulgent ! Le grossissement se mesure par le rapport entre le champ apparent de l'oculaire et le champ réel observé. Le rapport entre la focale du télescope et celle de l'oculaire n'est qu'une grossière approximation. Il nous faut connaître le diaphragme de l'oculaire (field stop).
Sans transition, un petit programme. Allez, hop ! Un menu pour la route :
|
| Auteur : | gm86 [ 04 déc. 2019 15:43 ] |
| Sujet du message : | Re: Postez vos petits programmes en QBasic |
| Comme tous les 2/3 ans, un nouveau message. La touche COS¯¹ des calculatrices n'a pas d'équivalent en BASIC. Heureusement, le guide du GW-BASIC donne la solution : http://www.antonis.de/qbebooks/gwbasman ... x%20B.html Prenons par exemple une formule trigonométrique utile en astronomie, cos A/2 = - tg D . tg L tirée du lien suivant : http://oncle.dom.pagesperso-orange.fr/p ... tm#Maisons Elle donne la valeur angulaire de l'arc que parcourt une étoile dans le ciel sous la forme A = 2 arc cos (- tg D . tg L) avec D la déclinaison de l'astre et L la latitude du lieu. Vu que le BASIC Microsoft travaille en radians, les données en degrés seront converties pour obtenir le résultat intermédiaire T=-TAN(D)*TAN(L). Avec A=2*FNARCCOS(T), DEF FNARCCOS(X)=ATN (X/SQR(-X*X+1)) + PI/2 soit ATN (X/SQR(-X*X+1)) + ATN(1)*2 puisque PI=ATN(1)*4 en simple précision (355/113). Lors de la recopie du code suivant, faites sauter les sauts à l'intérieur des lignes numérotées ! Les éditeurs de texte ne connaissent pas Ctrl+J.
En attendant 2021 ou 2022... |
| Page 4 sur 5 | Fuseau horaire sur UTC+02:00 |
| Développé par phpBB® Forum Software © phpBB Limited Traduction française officielle © Qiaeru |
|