Skip to main content

magazine poms23

  • PublicationApple Periodicals
  • Pages76
  • Sourcemagazine_poms23.pdf
← Magazines magazine poms23
/ 76
Source: Internet Archive — Aggregated Apple-era periodicals, 1981–2012.
Page 1
Loading…
Text content (OCR)
. La revue francophone indépendante pour les utilisateurs des 1 Apple J[+, //e, //e+, //c™ et Macintosh™ @ Du graphique en Turbo Pascal sous CP/M © Routines binaires et carte langage @ Le Jeu de la Vie sur le Macintosh @ Le //c composeur téléphonique @ Vos listings Basic formatés @ Routine de saisie sur Mac @ Vos impots sur Multiplan @ Désassembleur 65C02 @ Rubrique MacAstuces @ Marche arriére Basic @ Patches au DOS 3.3 @ Une UNIT Pascal @ SoftCopie ProDOS @ Undécruncher NUMERO 23. - PRIX 40 F . ('M2366-23-40 F ISSN : 0294-6068 ISSN 0766-4915 -BONDECOMMANDE =——s—™ — @ retourner @ INFOMAG, 5 place du Colonel Fabien, 75491 Paris cedex 10 OUI je désire m’abonner pour 7 numéros & INFOMAG au prix de 215 F Je désire recevoir, au prix de 35F l'un. Dlenuméro! Ollenuméro2 Cle numéro3 Je vous adresse mon reglement por cheque bancaire & ordre de INFOMAG zy fm NOM PRENOM Os eet elisa ee ee DECEMBRE 85 N° 3 Editorial re: Hervé Thiriez Page 5 Le Turbo Pascal Nicolas Montsarrat ae) pe Page 6 Jeu de la vie Dominique Bernardi Page 40 Un composeur sur Routine de saisie en Basic Gérard Michel Ses] Page 48 Mac 4 ee Astuces Page 51 eile Erne Bruno Fénart Page 9 GENUTILE <= pe Jean-Claude Lengrand el] 7e =) Ss) es Page 11 Impéts sur Multiplan Christian Piard ee Un formateur de listing Basic — Sylvie Gattet S a. Bruno Fénart ——J Page 57 Retour dans le Basic Halte aux Scrolls Gites Caraux (it+} [ve l We —_—_—_>_ _ — Page 61 +} [ve (eas) ( ee it Page 17 Navette Jean-Paul Arbel Ie) [vel] py ss) (es) = Page 24 Un “Décruncher” ie 7, Patrice Neveu e == i ey Ec Page 28 Patches au DOS 3.3 6 > Patrice Ne Or) 7/e]| IE] atrice Neveu Un Désassembleur 65 C 02 Yvan Koenig (} [ve]] Ss) =) Page 35 (es) (es) ee] Page 66 Courrier GS des Lecteurs Page 69 Micro- a} informations Page 70 Les annonceurs : Apple : pages 31, 38 et 39. IEF : page 75. Infomag : page 2. Ordinateur Individuel : Page 76. Editions MEV - 12, rue d'Anjou - 78000 Versailles. Directeur de la publication : Hervé Thirlez Pom's n° 23 Des le 20 Avril : LE RECUEIL 3 s9a12 de Pom's Le recueil n°3 : quatre La de Pom's Le recueil n°3 : listings“ Le recueil n°3 : plus de cinquante programmes Le recueil n°3 : une référence/indispensable eS 7 Maisie ee Recueil 3 (regroupant les numéros 9-12 de Pom's) : 140,00 F TTC franco Disquettes d'accompagnement 9 a 12 (J[+, /e, //e+,//c) : 190,00 F TTC franco Bon de commande page 74 L'Editeur Plein Ecran =PI= version 5.0 Vous permet toujours de : * lister vos programmes Basic en avant et en arriére ; * modifier, insérer, effacer des caractéres en plein écran sans relire les lignes ; * rechercher toute chaine de caractéres ; * choisir vous-méme les codes de contréle d'EPE. mais il fonctionne maintenant : t+ sous DOS- + en 40 colonnes - sur Apple ][+ ~- sur Apple //e+ + sous Prodos - en 80 colonnes ~ sur Apple //e_ + sur Apple //c EPE version 5.0 ; 200,00 F TTC franco Echange ancienne version contre version 5.0 : 80,00 F TTC franco bon de commande page 74 E H H i i i t H t t gee eeennenenenenee 7 > Pom's n° 23 Editorial Ce numéro de printemps, outre ses treize programmes, vous présente deux nouveautés : le recueil n°3 d’abord, qui regroupe les numéros 9 a 12 de Pom's. Il vous séduira particuliérement pour ses listings sortis sur la LaserWriter (toujours la communication entre Apple // et Mac !). Une soixantaine de programmes et plus de 200 pages : une mine de renseignements a portée de main. Deuxiéme nouveauté : E.P.E. 5.0. Nombre d’entre vous avait en effet pris la plume pour déplorer l'impossibilité d’éditer avec E.P.E. sous ProDOS en 80 colonnes. Des aujourd'hui, cette nouvelle version est disponible, et elle fonctionnera également sur votre IIc. Vous n’avez pas E.P.E. ? au prix de 200,00 F, c'est un éditeur sans égal. Vous avez E.P.E. ? retournez-nous la disquette originale, nous la mettrons a niveau au prix de 80,00 F. Depuis plus de deux années (Pom’s n° 9), vous trouviez les disquettes d'accompagnement Apple // @ 55,00 F ou 4 280,00 F par abonnement : elles resteront sans concurrence, mais nous devons avouer que nous étudions une ‘remise a jour’ de ces prix. Ne tardez pas a renouveler votre abonnement ! Pascal et Turbo Pascal, CP/M, DOS et ProDOS, assembleur et Basic, 6502, 65C02 et 68000 : vous trouverez certainement ce numéro trés riche ; vos contributions nous montrent que vous étes particuliérement actifs devant vos claviers. Dans le numéro 24 probablement, vous trouverez le trés beau fruit de cette activité sous la forme d'un programme en CP/M, CP/M que nous avions quelque peu délaissé. Nous vous donnons rendez-vous au Sicob Boutique, du 14 au 19 avril, stand 2A203 et n‘oubliez pas notre petit questionnaire page 73 ! Hervé Thiriez Ont collaboré A ce numéro : Jean-Paul Arbel, Alexandre Avrane, Jean-Luc Bazanegue, Dominique Bernardi, Gilles Caraux, Gaétan Dagron, Delphine Declercq, Alexandre Duback, Bruno Fénard, Sylvie Gallet, Jean-Michel Gourévitch, Olivier Herz, Jacques Honorez, Berard Hoyez, Yvan Koenig, Niels Kgge, Jean-Claude Lengrand, Gérard Michel, Nicolas Montsarrat, Jean-Luc Nail, Patrice Neveu, Christian Piard, Hervé Thiriez. Directeur de la publication, rédacteur en chef : Hervé Thiriez. Rédacteurs : Alexandre Avrane, Olivier Herz. Sigge social : Editions MEV - 12, rue d'Anjou - 78000 Versailles. Tél. : (1) 39.51.24.43. Publicité : Editions MEV. Diffusion : N.M.P.P. Impression : Rosay - 47, avenue de Paris - 94300 Vincennes. Tél. : (1) 43.28.18.63. Pom's est une revue indépendante non rattachée 4 Apple Computer, Inc. ni & Apple Computer France S.A.R.L. Apple, le logo Apple, Mac et le logo Macintosh sont des marques dépos¢es d'Apple Computer, Inc. Pom's n° 23 whe? Nicolas Montsarrat ommercialisé en France par FRACIEL - 42, rue des Prébendes - 37000 TOURS au prix de 625,00 francs HT (soit 741,25 francs TTC) dans sa version CP/M, le TURBO-PASCAL est un des meilleurs compilateurs Pascal disponibles sur Apple ][+, He et //c. Le systeme comporte le compilateur TURBO.COM rési- dant en mémoire centrale, avec éditeur incorporé, le programme d'installation TINST.COM, TLIST.COM qui liste les fichiers-source, ainsi qu'un petit tableur de démonstration nommé “Microcalc”. Le systéme TURBO-PASCAL Aprés avoir appelé TURBO -COM, le programme propose un menu permettant d'éditer un fichier-source, de le compiler, de l'exécuter, de le sauver. II propose quelques commandes de manipulation des disquettes (catalogue, appel d'un programme extéricur, ctc.), et des commandes diverses (compilation en mémoire centrale ou sur disquette, adresse de départ du programme objet,...). L'Editeur L'éditeur reprend la majorité des commandes de WORDSTAR, le traitement de texte bien connu tournant sous CP/M. Outre les commandes de contréle du curscur, on y trouve des commandes de déplacements et de copie de blocs de texte, de recherche et de remplacement, ainsi que de mise en place du systéme de _ tabulation automatique. La place disponible pour les textes est d'environ 22 Ko sous CP/M 60Ko et de 18 Ko sous CP/M 56Ko. C'est largement suffisant pour les programmes de taille moyenne, d'autant plus que le compilateur permet de compiler des programmes dont le source est composé de plusieurs fichiers (“include files”) Cet éditeur est pratique & utiliser, rapide et puissant. Un petit défaut toutefois : pour les possesseurs d'Apple J[+, il y a des problémes de reconnaissance de la vidéo inverse sur certaines cartes 80 colonnes destinées au ][+ (Par exemple la carte U-Term), en particulier le curscur n'est pas visible a l'écran, ce qui n'est pas sans poser quelques problémes... Pour les cartes 80 colonnes des //e et //c, aucun probléme. Le Compilateur Le compilateur, résident en mémoire centrale, est sirement le compilateur Pascal le plus rapide disponible sur Apple : Il compile les programmes en une seule passe, directement en code machine (et non en code-P comme le Pascal UCSD). Deux options sont proposées : la compilation en Une application mémoire, oi le code et le source résident en mémoire, et la compilation sur fichier COM, oi seul le source est en mémoire. Cette deuxiéme possibilité permet de compiler des programmes dont le source est trop important pour laisser de la place au code, ou simplement pour obtenir un fichier exécutable indépendant du systtme TURBO-PASCAL. La vitesse d'exécution des fichiers objet est également impres- sionante : un petit peu plus d'une seconde pour une boucle de 1 a 10000, contre 8 pour le Pascal UCSD, bien que le code généré soit du code Z80, plus lent que l'équivalent 6502. En conclusion, un compilateur simple 4 utiliser, dont les performances sont inégalées sur Apple. Le langage Pascal proprement dit Le TURBO-PASCAL reprend toutes les caractéristiques du Pascal standard, plus quelques extensions : Le type BYTE permet de définir des nombres entiers entre 0 et 255, n'occupant qu'un seul octet en mémoire. Les conversions en INTEGER se font automa- tiquement, sans générer d'erreurs. Le type REAL définit les nombres réel entre 1 38 et 1*3® sur une mantisse de 11 chiffres, on est loin des maigres 6 chiffres du Pascal UCSD. Pom's n° 23 Les chaines de caractéres sont présentes, avec le type STRING et les instructions DELETE, INSERT, STR, VAL et les fonctions COPY, CONCAT, LENGTH, POS. Les types énumérés (par exemple VAR HUMAIN : [HOMME, FEMME)]) sont utilisables, contrairement au Pascal UCSD, sans écrire de routines de conversion : ainsi on peut écrire WRITELN (HUMAIN) et on aura a l'écran "HOMME" ou "FEMME" en toutes lettres. De méme pour READLN (HUMAIN), qui attend les caractéres HOMME ou FEMME. Les "TYPED CONSTANTS" permettent de forcer le type d'une constante. Ainsi on peut définir CONST CR : CHAR = *M qui définit le caractére ‘Retour chariot’. On peut utiliser ces constantes comme paramétres de procédures de _ fonctions, contrairement a certaines constantes normales. On peut de méme les utiliser pour initialiser des tableaux de constantes, permettant de simuler les READ/DATA du basic : on peut définir CONST DEUX : ARRAY [0.7] OF BYTE = (1,2,4,8,16,32,64,128), et manipuler DEUX comme un tableau (voir programme GRAPHIC). La gestion des fichiers est comparable 4 la gestion UCSD, avec fichiers séquentiels et fichiers directs. Comme en Pascal UCSD, on accéde aux périphériques par des fichiers portant le nom des ‘devices’ CP/M : “CON:” pour I'écran, “KBD:” pour le clavier sans écho, “LST:” pour l'imprimante, “AUX:” pour la carte série, etc. On trouve également les UNTYPED FILES du Pascal UCSD, qui permettent d'accéder a des fichiers CP/M par blocs de 128 octets. Toutes les procédures de gestion de l'écran sont présentes, avec vidéo inverse (sur //e et //c) et contréle du curseur. Dans la version CP/M, on peut définir des variables A une position absolue en mémoire (directive ABSOLUTE, voir programme GRAPHIC), chainer des programmes, et appeler des sous programmes en assembleur : il suffit d'insérer les codes hexadécimaux de la routine. Quelques restrictions : pour optimiser la vitesse d'exécution, le Turbo Pascal ne génére de code pour les appels récursif que sur demande de l'utilisateur par loption {$A+}, et n'effectue la vérification des indices de tableau qu'avec l'option {$X+}. Les limites On peut faire au Turbo Pascal deux reproches principaux : « dans la version Apple CP/M, il n'y a aucune gestion possible des graphiques. On peut lever cette barritre partiellement (voir programme GRAPHIC), mais les routines ne seraient trés performantes qu'en assembleur ; + il n'y a pas de possibilité de créer des ‘librairies’ et des ‘unités’ : la seule entité compilable est un PROGRAM. On ne peut donc pas créer de gros programmes, séparés cn modules d'une dizaine de Ko s'appelant les uns les autres. Conclusion On I'a vu, le TURBO-PASCAL posséde des performances €poustouflantes en compilation et en vitesse d'exécution. Les débutants pourront l'utiliser de maniére beaucoup plus pratique que le Pascal UCSD pour se former, le dialogue avec l'utilisateur étant trés intéractif, et les attentes nettement moins longues... L'utilisateur chevronné pourra s'en servir pour exécuter des programmes plus rapidement, la conversion depuis le systéme UCSD étant relativement aisée avec un programme comme UNIVERSAL FILE CONVER- SION. —a G Programme ‘GRAPH.PAS’ Le signe — indique que le retour chariot précédent ne doit étre saisi. Il ne sert qu’a la mise en page. PROGRAM GRAPHIC; {Pour executer ce programme, il faut le compiler en Option C OM et demander une START ADDRESS de $5000. apres compilatio n, quitter Lurbo pascal et executer le programme sous CPM) {ATTENTION en mode graphique, i de WRITELN) il ne faut pas fairede WRITR n CONST DEUX:ARRAY[0..7) OF BYTE=(1,2,4,8, 16,32, 64,128); TYPE PA-PACKED ARRAY[0..1] OF 0..255; MAGIC=RECORD CASE BOOLEAN OF TRUE: (INT: INTEGER) + FALSE: (PTR: *PA); END; VAR ECRAN: PACKED ARRAY[0..8191] OF BYTE ABSOLUTE $3000; A, RtREAL? OX, OY, X, Ys INTEGER; FUNCTION PEEK (X: INTEGER) : INTEGER; VAR C:MAGIC; BEGIN C.INT:=X; PEEK: =C.PTR*[0] Pom's n° 23 \ EEK ($E050) +P BEGIN A:=PEEK (SE051) +P. CLRSCR; END? PROCEDURE HGR; BEGIN GRAFIXON; FILLCHAR (ECRAN, 8192, 0) END? PROCEDURE PLOT (X, Y: INTEGER) ; VAR D, I: INTEGER; BEGIN D:=¥ MOD 64; T:=1024*(D MOD 8)+128*(D DIV 8)+40*(¥ DIV 64)+(XDIV 7); ECRAN[I} :=ECRAN[I] OR DEUX[X MOD 7] END? PROCEDURE LINE (X1,Y1,X2, Y2: VAR XT, TX, XX,X, ¥:REAL; C. I: INTEGER: + POKE(SE00D, 0); BEGIN IF X1>X2 THEN BEGIN Cr=X1z; X1i=X2; X2:-C; Cr=¥1; Y1:=¥2; Y2:=¢ END; IF X1=xX2 THEN IF Y1<Y2 THEN FOR I ELSE FOR I ELSE IF Y1=Y2 THEN FOR I2=X1 ELSE BEGIN TX2=(Y2-Y1) / (X2-X. IF XT>1 THEN XT atxXT? REPEAT PLOT (TRUNC (X) , TRUNC (Y) ) 7 Xs=X4+XT Ys=Y+XX UNTIL X>Xx2 END END; BEGIN HGRe Ri=0.0; Az=07 OX2=140; OY:=95; REPEAT X:=TRUNC (140+R*COS(A)); Y:=TRUNC(9O+R*SIN(A))7 LINE (OX, OY, X,Y)? OX:=X; Rz=R+1.5; Az=At1.5533; UNTIL (R>95) OR KEYPRESSED; READLN; TEXT END. Une application Une des limitations du TURBO-PASCAL est de ne pas permettre la gestion des graphiques. Ce petit programme y remédie, de facon rudimentaire car ses performances ne sont pas celles d'une routine en assembleur. Pour transférer le programme de la disquette Pom's vers une disquette CP/M sous le nom GRAPH.PAS, il est nécessaire d'avoir UNIVERSAL FILE CONVERSION (dans le cas contraire, 4 vos claviers !). Il faut donc transférer le fichier GRAPH.PAS puis passer sous CP/M et faire un REN GRAPH.PAS=GRAPHPAS. Ensuite, passer sous TURBO PASCAL, puis compiler le programme en option COM FILE en spécifiant une START ADDRESS de $5000. Le programme lui-méme trace un petit dessin de démonstration, un carré qui tourne. Les procédures utilisables sont : HGR passe en mode graphique et efface l'écran. GRAFIXON passe en mode graphique sans effacer I'écran. TEXT passe en mode texte. PLOT(X,Y) met un point en X,Y 4 l'écran LINE(X1,Y1,X2,Y2) trace une ligne entre X1,Y1 et X2,Y2. Attention, une restriction : il ne faut pas faire de WRITE ni de WRITELN en mode graphique, sous peine de plantage... 8 Pom's n° 23 sup le //c es propriétaires d'un Apple //c ont sans doute été dégus en s'aperce- vant que le programme de Bernard Hoyez et Jean-luc Nail permettant de composer automati- quement un numéro de téléphone (Pom's n° 22), ne pouvait pas fonctionner sur leur machine. Qu'ils se réjouissent, voici une version d'AGENDA et de COMPOSEUR qui permet de l'adapter 4 votre machine favorite. Pour cela, on utilisera le port série n° 2 "consacré" normalement au modem et plus particuligrement le niveau logique DTR "Data Terminal Ready", qui se trouve sur la broche 1 du connecteur (voir schéma). La valeur de cette sortie est soit -12V soit +12V. C'est cette sortie que l'on va utiliser 4 la place de ANO pour commander le relais, bien que les valeurs de ANO soient 0 et +5V. Pour protéger le transistor on rajoutera une diode en dérivation. Pour l'alimentation, la meilleure solution est d'utiliser une pile (de 4,5 ou 9 volts suivant le relais utilisé). Le reste du schéma est identique. Pour commander le niveau de la broche DTR, il faut utiliser le tegistre de commande du port considéré (adresses : Port 1 = $CO9A - Port 2 = $COAA). Suivant la valeur de ce registre, DTR et par suite la tension de la broche 1, passe d'un niveau a l'autre (voir le tableau). Les modifications 4 apporter au programme AGENDA sont les suivantes : 380 POKE 49322, 8 Prise de ligne 550 POKE 49322,0 Coupe la ligne N CO POSeUlR Bernard Hoyez, Jean-Luc Nail, Bruno Fénart — Connecteur 4 150 Q Port série n° 2 12 2N2219 Schéma de branchement Broche | Portl I Port2 | Signification | 1 DTRI DTR2 Data Terminal Ready Sortie 2 TDI TD2 Transmit Data Sortie 3 GND GND Masse mécaniquelsignal “ 4 RDI RD2 Read Data Enwée 5 DSRI DSR2 Data Set Ready Entrée Les broches du connecteur série Adresse Adresse jhexadécimale décimale Port! SCO9A 49306 Port2 $COAA 49322 Octet: 17}615)41/3}2]1]0 Valeur du —— Tension Registre | | RTS | Broche 1 $00 00 Haut -12V 504 Ol Bas +12V $08 10 Bas +12V SOE 11 Bas +12V Signification des bits du registre de commande Pom's n° 23 ‘Oo 5 30 ONERR GOTO 3/0 340 CALL - 868: PRINT T$(I,1),TS(I, Pour COMPOSEUR:S voir le 100 PRINT " COMPOSITION AUTOMAT 2 listing du nouveau source. IQUE DE" 350 coro 250 Remarque : on a utilisé le port 210 Priwr ~ NUMERO TELEPHON 360 XS - T9(I,2) n° 2, pawl le pot a ral ar nratt 20 ee CHRS (4) :"BLOADCOMPOSEOR' AE pee vga Sele ae di fe: nn . 1 Ss 2” f Bs rise de ligne de changer l'adresse du registre 230 DIM T$(100,2) 390 FOR I ~ 1 70 700: NEXT I de commande. 140 N= 0 400 Home ibli. ie: 150 N= + t "JE COMPOSE LE NUM Bibliographie : The Apple /Ic a ge ac 410 ee PRINT "JE Reference Manual - Volume 1. 70 READ TS(N,J) 420 FORI-1 TO LEN (X$) 180 NEXT J 430 A= ASC ( MIDS (X$,I,1)) + 128 Co 190 GOTO 150 440 POKE 7,4 200 VTAB (8) 450 CALL 768 210 PRINT “UTILISEZ LES FLECHES “;: 460 PRINT CHRS (A); INVERSE : PRINT "=>";: NORMAL 470 FORT = 1 TO 600: NEXT T PRINT " ET “;: INVERSE : PRINT “ 480 NEXT I <=": NORMAL 490 HTAB 1: VTAB 5: PRINT “DECROCHEZ 220 PRINT "POUR SELECTIONNEK LE NOM LE COMBINE, MAINTENANT..." Programme DE L'ABONNE" 500 VTAB 8: PRINT ".... AVANT" ‘ » 230 - PRINT : PRINT “VALIDEZ AVEC TAT 510 FORI = 400 701 STEP ~1 ‘AGENDA OUCHE RETURN™ 520 VTAB (15): HTAB (11) 2401-0 530 PRINT INT (I / 50);" SECONDES" 10 REM ***COMPOSEUR DE NUMERO*** 250 GET AS 540 NEXT I 20 REM * par * 260 Ab = ASC (AS) 550 POKE 49322,0: REM Coupe 30 REM * Bernard HOYEZ * 270 IF A#< > 13 AND At < > 21 AND 560 GOTO 580 40 REM * et Jean-Luc NAIL " AS < > 8 THEN 260 570 IF PEEK (222) = 42 THEN 200 50 REM heveesesanessessesee ey 280 IF A& = 13 THEN 360 580 HOME + RESTORE 60 REM ==>ENTRER LES NOMS ET LES NUM 290 IF At = 21 THENI=-I¢2 590 PRINT *. PRET POUR UN AUTRE APP EROS EN DATA A LA SUITE DES AUTR 300 IF At = 8 THENI =I -1 EL ...": GOTO 140 ES 310 IF I>N-1THENI=N-1 600 DATA RENSEIGNEMENTS, 3612 TE BN SHARAN SRT ESE SEER TS ESEy 320 IF I< 1 THENI = 1 620 DATA AUTRES RENSEIGNEMENTS, 3611 80 HOME 330 VTAB 15 630 DATA JULIETTE, 12345678 Source 21 LDA CHIFFRE 45 STY COMREG 22 CMP #"0"-1 46 JSR WAIT ‘COMPOSEUR.S’ # ace ERROR ‘7k toe 24 CMP #"9"+1 48 Loy #08 Assembleur Big Mac 25 BCS ERKOX 49 STY COMREG PA 50 JSR WAIT 1 Aeneabankeahantanenenanean 27 AND #41112 51 ser 2e * :filtrage 3° Composeur * 28 BNE COMPOSE 4% * 29 LDA #10 5 tenernennnannetnenensnnene ;CHIFFRE=0 => <A>=10 6 30 COMPOSE TAX . . 7 #8 novembre 85 x Récapitulation é 32 BOUCLE = Ls 7 i 9 33 JSR PULSE OMPOSEUR 10 * ADRESSE 34 DEX 11 35 BNE BOUCLE Apres avoir salsi ce code sous 12 COMREG = $COAA ;Port 2. 36 RTS moniteur, vous le sauvegarderez par $C09A pour le port 1 37 BSAVE COMPOSEUR,A$300,L$32 13 WAIT SFCA8 38 ERROR = # 14 CHIFFRE 7 see n’etait pas un chiffre 0300- AS 07 C9 AF 90 12 C9 BA 15 RRRFUR = & 39 LDA #SFF 0308- BO OE 29 OF DO 02 A9 OA 16 40 STA ERREUR 0310- AA 20 1D 03 CA DO FA 60 17 ORG $300 4 RTS 0318- A9 FF 85 08 60 A9 9F AO 18 42 0320- 00 8C AA CO 20 AB FC Ag 19 ENTREE = * 43 PULSE LDA #159 0328- 6C AO 08 BC AA CO 20 AB 20 44 Lby #$00 0330- FC 60 Dés le 20 avril, dans votre bibliothéque : Le Recueil 3 Pom's n° 23 ENUTILE est un ensemble de PROCE- DUREs et FUNC- TIONs d'intérét général constituant une INTRINSIC UNIT au sens du compilateur PASCAL, et qui est incorporé a la SYSTEM LIBRARY sous les numéros de SEGMENTs 16 (programme) et 17 (données). GENUTILE définit un TYPE CHOIDECA:SET OF CHAR, et une variable ALFANUM de ce type. ALFANUM désigne l'ensemble des caractéres alphanumériques depuis " " (espace) jusqu'a "~" (caret). GENUTILE deéfinit diverses variables de TYPE CHAR qui, lorsqu'elles sont envoyées sur OUTPUT, ont I'effet suivant : SON émet un BIP BS recul du curseur EFL efface la fin de ligne EFB efface le bas de I'écran INV met l'affichage en mode inverse NORM «et I'affichage en mode normal CR envoie le curseur 4 la ligne HOME efface I'écran ou va a la page GENUTILE définit aussi ESC et FLD (fléche droite) de TYPE CHAR. Toutes ces variables sont définies comme le CHR( ) de 7, 8, 29, 11, 18,20, 13, 12; 27,.21 respectivement. PROCEDURE PRENRETURN Attend qu'un <RETURN> ait été frappé au clavier. Programme ‘GENUTILE’ * LENGRAND, LE 9/12/82 *) Gil) (*ss+*) UNIT GENUTILE; INTRINSIC CODE 16 DATA 17; INTERFACE TYPE CHOIDECA=SET OF CHAR; VAR BS, SON, EFL, EFB, INV, NORM, CR, ESC, FLD, HOME: CHAR; ALPANUM :CHOTDECA; PROCEDURE PRENRETURN; FUNCTION PRENCAR (BONSET:CHOIDECA) :CHAR; FUNCTION OUI:BOOLEAN; PROCEDURE MESSAGE (Y: INTEGER; S: STRING) ; PROCEDURE ALARME (S:STRING) ; PROCEDURE PRENCHAINE (LONGMAX: INTEGER; BONSET: CHOIDECA;VAR S:STRING) ; PROCEDURE ENTIER (LONGMAX: INTEGER; VAR S: INTEGER) ; PROCEDURE CONTINU (Y: INTEGER) ; PROCEDURE ALITEXT (LONGMAX: INTEGER; S:STRING) ; PROCEDURE SATSTE(X, Y, LONGMAX: INTEGER; BONSET : CHOIDECA; LIBELLE: STRING; VAR $:STRING) ; FUNCTION PEEK (ADRESSE: INTEGER) : INTEGER; PROCEDURE POKE (ADRESSE, CONTENU: INTEGER) ; PROCEDURE ERROR (L: INTEGER; VAR S:STRING) 7 PROCEDURE VALBOOL(£1STRINC; VAR N:BOOLEAN) ; PROCEDURE VALREEL (S:STRING; VAR K:REAL) ¢ PROCEDURE, TRING; VAR K: INTEGER) ; PROCEDURE OOLEAN; L: INTEGER; VAR S:STRING; VAR ERREUR: INTEGER) ; PROCEDURE STRFTX(N:RFAT.21.,D:TNTRGER; VAR S:STRING; VAR ERREUR: INTEGER) : PROCEDURE STRFLOT(N:REAL;L,D+:INTECER; VAR $:STRING; VAR ERREUR: INTEGER); PROCEDURE STRENT (N, L: INTEGER; VAR S:STRING; VAR ERREUR: INTEGER) ; IMPLEMENTATION PROCEDURE PRENRETURN; VAR SORT :CHAR; BEGIN REPEAT READ (KEYBOARD, SORT) UNTIL EOLN (KEYBOARD) END; FUNCTION PRENCAR; VAR CH CHAR; BON :BOOLEAN; BEGIN REPEAT READ (KEYBOARD, CH) ; IF EOLN(KEYBOARD) THEN CH:=CR; BON:=CH IN ONSET; IF NOT BON THEN WRITE (SON) ELSE IF CH IN [' '..'*"] THEN WRITE (CH) UNTIL BON; PRENCAR:=CH FND; FUNCTION OUI; BEGIN OUI:=PRENCAR(['Y', '0', 'N']) IN ['¥', '0'] END; PROCEDURE MESSAGE; BEGIN Jean-Claude Lengrand Pom's n° 23 FUNCTION PRENCAR (BONSET:CHOIDECA): CHAR Renvoie un caractére frappé au clavier. Ce caractére doit faire partie de BONSET, défini préalablement comme un SET OF CHAR, sinon, émct un BIP et attend un autre caractére. FUNCTION OUI:BOOLEAN Attend un caractére au clavier et renvoie TRUE s'il s'agit de O ou de Y et renvoie FALSE s'il s'agit de N. Emet un BIP et attend un autre caractére dans tous les autres cas. PROCEDURE MESSAGE (Y:INTEGER;S:STRING) Ecrit le message S A partir du début de la ligne Y (0<Y<23) et efface la fin de la ligne. Le curseur reste immédiatement aprés le message. PROCEDURE ALARME(S:STRING) Efface l'écran sauf la lére ligne, affiche le message S et attend un <RETURN>. PROCEDURE PRENCHAINE (LONGMAX:INTEGER; BONSET:CHOIDECA; VAR S:STRING) Saisit au clavier la chaine S, avec limitation 4 LONGMAX carac- téres choisis dans BONSET. Si l'on répond par un simple <RETURN>, la valeur précédente de S est conservée. La correction par la fléche gauche (BS) est permise. PROCEDURE ENTIER(LONGMAX: INTEGER; VAR S:INTEGER) Saisit au clavier l'entier positif S, avec limitation 4 LONGMAX caractéres choisis dans '0'..'9'. Si l'on repond par un simple <RETURN3, la valeur précédente GOTOXY (0, ¥) ;WRITE(S, EFL) END; PROCEDURE ALARME; BECIN GOTOKY (0, 1) ; WRITE (SON, EFB) MESSAGE (10, 5)7 MESSAGE (12, 'FAITES <RETURN> '); PRENRETURN END; PROCEDURE PRENCHAINE; fo (* SAISIT UNE CHAINE DE CARACTERES AVEC LONGURUR MAXT ET VALEUR PAR DEFAUT *) (a) VAR S1 STRING [1]; CONT :STRING; BEGIN Sl:e! cont: REPEAT IF LENGTH (CONT) =O THEN $1[1] :=PRENCAR (BONSET+[CK]) ELSE IF LENGTH (CONT)=LONGMAX THEN S1[1] :=PRENCAR([CR, BS}) ELSE S1/1]:=PRENCAR (BONSET+/CR, BS) ; IF $1[1] IN BONSET THEN CONT:=CONCAT (CONT, $1) ELSE IF $1[1]-BS THEN BEGIN WRITE(BS,' ', BS); DELETE (CONT, LENGTH (CONT) , 1) END; UNTIL $1[1]=CR; IF LENGTH (CONT) <>0 THEN S:=CONT ELSE WRITE (S) END; PROCEDURE ENTIER; eg (* SAISIT UN NOMBRE ENTIER POSITIF *) a) VAR $1 :STRING/11: I INTEGER; CONT :STRING; OKSET :CHOIDECA; BEGIN OKSET:=['0'..'9"]¢S1:=" ";CONT:=""2 REPRAT IF LENCTH (CONT) -0 THEN £1{1]:~PRENCAR (OKSET) [CR]) ELSE IF LENGTH (CONT) =LONGMAX THEN SI [1] :=PRENCAR([CR,BS}) ELSE S1|1) :=PRENCAR (OKSET+|CR,BS]); IF S1[1] IN OKSET THEN CONT:=CONCAT (CONT, 51) ELSE IF $1[1]=BS THEN BEGIN WRITE (BS, ' ', BS); DELETE (CONT, LENGTH {CONT}, 1) END; UNTIL $1[1]=CR: IF LENGTH (CONT) <>0 THEN BEGIN Si=0; FOR I:=1 TO LENGTH (CONT) DO BEGIN S!=8*10;S!=S+ (ORD (CONT[T])-ORD('0')) END; END ELSE WRITE (S) END; PROCROURE. CONTINU: ony (* INVITE L‘OPERATEUR A CONTINUER *} cry BEGIN WRITE (INV) 2 MESSAGE (23, "FAIRE <RETURN>POUR CONTINUER') ; WRITE (NORM) PRENRETURN; GOTOXY (0, ¥); WRITE (EFS) END; (aa PROCEDURE ALITEXT; Pom's n° 23 de S est conservée. La correction par la fléche gauche (BS) est pemmise. PROCEDURE CONTINU(Y:INTEGER) Affiche sur la derniére ligne de l'écran une invitation 4 frapper <RETURN> pour continuer, attend <RETURN3>, envoie le curseur en (0,Y) et efface le bas de l'écran. PROCEDURE ALITEXT(LONGMAX: INTEGER;S:STRING) Affiche le texte S cadré 4 gauche sur LONGMAX positions, aprés troncature si nécessaire. PROCEDURE SAISIE(X,Y,LONGMAX: INTEGER;BONSET: CHOIDECA;LIBELLE: STRING);VAR S:STRING) Méme fonction que PREN- CHAINE, mais avec écriture de LIBELLE au point de l'écran (X,Y), juste avant la saisie. La valeur par défaut est affichée pendant la saisie, elle est éventuellement tronquée a LONGMAX caractéres. FUNCTION “PEEK(ADRESSE: INTEGER) Renvoie le contenu décimal de la mémoire ADRESSE. PROCEDURE POKE(ADRESSE, CONTENU:INTEGER) Met CONTENU dans la mémoire ADRESSE, Aucun test n'est effectué sur la valeur des paramétres. C'est une procédure a utiliser avec précaution. PROCEDURE ERROR(L:INTEGER;VAR S:STRING) Remplit une chaine S de longueur Lavec L astérisques. cn) (* EDITE UNE CHAINE CADREE A GAUCHE *) (#4) BEGIN IF LENGTH (S)>LONGMAX THEN $:=COPY(S, 1, LONGMAX) ; WRITE (S, '' :LONGMAX-LENGTH (5) ) END; ry PROCEDURE SAISIE; £9) (* SAISIT UNE CHAINE DE CARACIERES EN UN POINT DONNE DE L'ECRAN, AVEC LONGUEUR MAXI ET VALEUR PAR DEFAUT *) (4) BECIN IF LENGTH (S)>LONGMAX THEN S:-COPY(S, 1, LONGMAX) ; GOTOXY (X, ¥) {WRITE (LIBELLE) ALITEXT (LONGMAX, S) ; GOTOXY (X+LENGTH (LIBELLE) , ¥) ; PRENCHAINE (LONGMAX, BONSET, S) : WRITE ('' : LONGMAX-LENGTH (S)} END; FUNCTION PEEK;EXTERNAL; PROCEDURE POKE; EXTERNAL; on PROCEDURE ERROR; cn) (* REMPLIT UNE CHAINE S DE L ASTERISQUES *) cr) VAR I: INTEGER; BEGIN S:='*; FOR I:=1 TO L DO S:=CONCAT('*',S); END; (7a) PROCEDURE VALBOOL; Cr (* CONVERTIT UNE CHAINE EN BOOLEEN *) (e#) REGIN IF LENGTH (5) <>0 THEN CASE S[1] OF oy PROCEDURE VALREEL; ms (* CONVERTIT UNE CHAINE EN REEL *) (+4) TYPE PARTIE~ (BLK, SGN, ENT, DEC, SEXP, EXPO) ; VAR REGION PARTIE; SIGNE, PUISS,I,L + INTEGER; FAC REAL? c CHAR; PROCEDURE CALCULE; VAR I: INTEGER; BEGIN IF PUISS<-37 THEN K:~0.0 ELSE IF PUISS>37 THEN K:=1,01E37 ELSE IF PUISS<O THEN FOR I:=1 70 -PUISS DO ELSE FOR I: 12K/10.0 70 PUISS DO K:-K*10.0 END; BEGIN K:=0.0;SIGNE:=1;FAC:=1.0;PUISS:=0; REGION! ~BLK;L:~LENGTH (S) 7 IF L=0 THEN EXIT (VALREEL) ; FOR I:=1 TO L DO BEGIN C:=S/I1; CASE REGION OF BLK :BEGIN EF NOT( CIN [' ','=") "64, 4.4, 10%. . 19" T) THEN EXIT (VALREEL) 7 CASE C OF "+" :REGION: =SGN; "= ':BEGIN Pom's n° 23 PROCEDURE VALBOOL(S:STRING;VAR N:BOOLEAN) Si S commence par Y,O,T,V,1, rend N égal A TRUE. Si S commence par N,F,0, rend N égal 4 FALSE. Laisse N inchange dans les autres cas. PROCEDURE VALREEL(S:STRING;VAR K:REAL) Renvoie dans K la valeur réelle représentée par la chaine S. L'interprétation s'arréte dés que la procédure trouve un caractére inattendu, comme la fonction VAL du BASIC. En particulier, elle s'arréte sur le premier espace rencontré. La forme avec exposant est reconnue. le nombre peut étre précédé de 1 ou plusieurs espaces placés avant tout caractére significatif. La forme de l'exposant est libre. II peut étre absent. Le point décimal peut étre absent. Le nombre peut étre précédé de un ou plusieurs signes qui se combinent. Ex: +-+3.14E sera interprété comme -3.14 (exposant=0). S peut étre une chaine vide. K vaut alors 0. Une valeur absolue inférieure a 1E-37 est considérée comme nulle. Une valeur absolue supérieure 4 1E37 est prise égale a 1.01E37, un test sur la valeur renvoyée peat permettre de détecter un dépassement éventuel. PROCEDURE VALENT(S:STRING; VAR K:INTEGER) Remplit la méme fonction que VALREEL, notamment pour la reconnaissance d'un nombre sous n'importe qu'elle forme, mais renvoie la valeur entiére la plus proche du nombre représenté. Les entiers dont la valeur absolue excéde MAXINT, soit 32767, sont ramenés a +-32767. PROCEDURE STRBOOL(N:BOOLEAN; L:INTEGER;VAR S:STRING; VAR ERREUR:INTEGER) RECION:~SCN; SICNE:~-SICNE END; 10%, 81%, 124, 13%, 489 (5%, 16 Ty 18%, 19" ZBEGIN REGION: =ENT; END; "|. "REGION: =DEC; K:=ORD (C)-ORD('0') TF NOT ( CIN ['=', 18,824, 10". STGNE; Dit TE 2G 88%, 45S IE) NT BY, OF 19']) THEN EXTT(VALREEL) ; BEGIN REGION: =ENT;K:=SIGNE* (ORD (C)-ORD('0'}) END: ". ":RECION:=DEC; END; END; ENT :BEGIN IF NoT( CIN {2 , 1BY10".. CASE C OF ". "SRECION:=DEC; "BE" :REGION: SEXP; WONG TAN, 1285 89 041 NDE, 1886 97% FON Oe END; END; "9'}) THEN EXIT (VALREEL) ; K1=K*10.0+SIGNE* (ORD (C)-ORD ("0") IF NOT( CIN ['0"..'9','E"]) THEN EXIT(VALREEL); CASE C OF 1B": REGION: =SEXP; HON ITN 24 134, 48, ISH, F6N, DN, A FAC:=FAC/10.0; END; END; END; SEXP :BEGIN IF NOT( C IN ['-", "+", '0'., IF C=!'-' THEN SIGNE: ELSE SIGNE JE CIN ['0".. REGION: =EXPO END; EXPO: REGIN IF (NOT( CIN ['0'.. THEN BEGIN CALCULE;EXIT(VALREEL) END; PUISS:=PUISS*10+SIGNE* (ORD (C)-ORD('0'}) END; END (* CASE *) END; (* FOR *) CALCULE; END; (**) PROCEDURE VALENT: any (* CONVERTIT UNE CHAINE EN ENTIER *) ea VAR X:REAL; BEGIN VALREEL (S, x); IF ABS (X)>MAXINT THEN IF X>0.0 THEN K:=MAXINT ELSE K:=-MAXINT ELSE K:=ROUND (X) ENN; Lei) PROCEDURE STRBOOL; ed (* CONVERTTT UN ROOLERN EN CHATNE *) (ny VAR I: INTEGER; BEGIN ERREUR:=0; IF N THEN S:="VRAI' ELSE S:='FAUX'; IF Lé1 THEN BEGIN ERREUR:~1;S:~'';EXIT(STRBOOL) END; IF L>80 THEN L:-80; IF L>4 THEN FOR I:= TO L DO S:=CONCAT(' ',S); IF L<4 THEN S:=COPY(S,1,L) (cae) '9":BEGIN -K+STGNE*PAC* (ORN(C)-ORN('0')) '9"J) THEN EXIT(VALREEL) '9'] THEN PUISS:=SIGNE* (ORD (C)-ORD(0") ); '91])) OR (ABS (PUISS)>MAXINT DIV 10) Pom's n° 23 Tenvoie une chaine de longueur L contenant VRAI ou FAUX, €ventuellement tronquée ou cadrée a droite, selon la valeur de N. ERREUR prend la valeur 1 si L<1, et 0 dans les autres cas. PROCEDURE STRFIX(N:REAL;L, D:INTEGER:VAR S:STRING;VAR ERREUR:INTEGER) Renvoie une chaine S de longueur L représentant le nombre réel N avec D décimales, en format FIXE : -xxx.yy Si L<3 ou D<0 ou L<D+2, on obtient ERREUR=1. Si le nombre est trop grand (/n/ >32767), on obtient l'erreur 2. Si le nombre est trop grand pour le nombre de caractéres total imposé, on obtient I'erreur 3. Dans les autres cas, ERREUR reste nul. Si L est supérieur 4 80, il est considéré comme étant égal a 80, sans que cela soit signalé. Le nombre de décimales peut étre réduit d'office par la procédure si la partie décimale est représentée par un entier superieur 4 32767. Aucune erreur n'est alors signalée, et le nombre total de caractéres est respecté. Si l'on est sir que le nombre est positif, on peut ne pas prévoir de place pour le signe. PROCEDURE STRFLOT(N:REAL; L,D:INTEGER;VAR S:STRING;VAR ERREUR:INTEGER) Méme fonction que STRFIX, mais la chaine contient le nombre en représentation flottante -1.2344E+03 avec un chiffre avant le point décimal et un exposant de 4 caractéres. L'erreur 2 de STRFIX ne peut pas se produire, Les conditions d'apparition de l'erreur 1 sont : L<7 ou D<0 ou L<D+6. PROCEDURE NTEGER; VAR ERREUR:INTEGER) Renvoie une chaine de longueur L PROCEDURE STRFIX; ss (* CONVERTIT UN REEL EN CHAINE DE TYPE -XXXX.xx *) VAR I,J SINTECER; NEGATIF :BOOLEAN; ND, EX ?REAL} Sl :STRING; BEGIN IF 1380 THEN L:=80; IF (L<3) OR (D<0) OR (L<D+2) THEN BEGIN ERROR (L, S) ;ERREUR:~1;EXIT(STRFIX) END ELSE ERREUR:=0; NEGATIF: = (N<O.0) ;N:=ABS (N) ; IF N>32767.0 THEN BEGIN ERROR (L, $) ;ERREUR:=2;EXIT(STRFIX) END; IF D-0 THEN BEGIN STR (ROUND (N),S1);S:='" END ELSE BEGIN STR (TRUNC (N) , $1)? REPEAT EX:=1;FOR T:=1 TO D DO EX:=EX*10.0; |: EX* (N-TRUNC (N) ) ;D:=D~17 UNTIL ND<=32767.0; J*ROUND (ND) 7 STR (J, S) ;D!=D#1; FOR J:=LENGTH(S)+1 TO D DO S:=CONCAT('0',S); END; S:=CONCAT(S1,'.',S)7 IF NEGATIF THEN $:-CONCAT('-', 53); JE LENGTH (S)>L THEN BEGIN ERROR (1, S) ;ERREUR:=3;EXIT(STRFIX) END; FOR J:=LENGTH(S)+1 TO L DO S:=CONCAT(' ',S); END; ony PROCEDURE STRFLOT; (**) (* CONVERTIT UN REEL EN CHAINE DE TYPE -XXXX.XXE+YY *) on VAR 31 #STRING; Ex INTEGER? NEGATIF :BOOLEAN; BEGIN IF L>80 THEN L:=80; IF (L<7) OR (D<O) OR (L<D+6) THEN BEGIN ERROR (L,S) ;ERREUR:=1;EXIT(STRFLOT) END ELSE ERREUR:=0; NEGATIF:= (N<O.0) ;N:=ABS (N) ;EX:=0; TF Ne>0.0 THEN BECIN WHILE N>=10.0 DO BEGIN N:=N/10.0;EX:"EX+1 END; WHILE N<1.0 DO BEGIN N:=N*10.0;EX:-EX-1 END; END; STR (ABS (EX), S); IF ABS(EX)<10 THEN S:=Co! IF EX<O THEN S:=CONCAT( ELSE S. IF NEGATIF THEN N: LraL=4; STRFIX (N, L, Dy Sl, ERREUR) + S:=CONCAT (SI, S) END; iT ('0', S) 7 ory PROCEDURE STRENT; (#9) (* CONVERTIT UN ENTIER EN CHAINE *) wry VAR T,J: INTEGER: BEGIN IF £>80 THEN L. ERREUR:=0; STR(N, S) ;T:=LENGTH (S) ; IF L>I THEN FOR J:=1 TO L-I DO S:=CONCAT(' ',S); IF L<I THEN DEGIN ERROR (L, 5) sERREUR:~1 END END; (* INITIALISATION *) Pom's n° 23 représentant l'entier N. L'erreur 1 se produit si L<1 ou si L.>80. Les PROCEDURES PREN- CHAINE et SAISIE peuvent provoquer des diagnostics 4 la compilation si la paramétre actuel S est une chaine de longucur déclarée (STRING{xx}). II faut alors compiler le programme (ou la fraction de programme concernée) avec l'option (*$V-*) du compilateur pour éviter le diagnostic. En cas d'erreur dans les procédures STRxxxx, la chaine qui est renvoyée ne contient que des *** mais cela n'entraine pas derreur d'exécution. En cas d'espace en trop dans ces procédures, les chaines sont cadrées a droite. La_ version PASCAL de GENUTILE (obtenue aprés transfert de la disquette Pom's et nommée alors UTIDIV.TEXT) déclare PEEK et POKE comme étant EXTERNAL. PEEK et POKE ont été écrits en assembleur (fichier PEEKPOKE. TEXT). On doit donc * compiler UTIDIV.TEXT, * assembler PEEK POKE. TEXT, ¢ linker PEEKPOKE.CODE dans UTIDIV.CODE pour obtenir GENUTILE.CODE, * placer GENUTILE.CODE dans SYSTEM.LIBRARY par lutilitaire LIBRARY.CODE. Accompagné d'une cinquantaine de pages de documentation, Sisk Manager permet de recréer les commandes du Dos, redéfinir l'organisation d'une disquette, grace 4 un jeu d'instructions qui en fait un langage simple d‘accés a la disquette. II offre également un programme simple d’édition # ESC :=CHR(27); FLD:=CHR(21); EFB:-CHR(12)7 ALFANUM:=[' ‘,.°**] END. NORM: ~CHR (20); ra] om HR (25) CHR (7); BS INV: 1=CHR (8); =CHR(18) ; Les identificateurs déclarés par GENUTILE sont : ALFANUM ALARME ALITEXT BS CHOIDECA CONTINU CR EFB EFL ENTIER ERROR Esc HOME INV MESSAGE NORM our PEEK POKE PRENCAR PRENCHAINE PRENRETURN SAISIE SON STRBOOL STRENT STRFIX STRFLOT VALBOOL VALENT VALREEL. Source a ‘PEEKPOKE.TEXT’ RIS »PROC POKER, 2 »FUNC PEEK, 1 RET .EQU 0 RET .EQU 0 ADR .EQU 2 ADR .EQU 2 VAL .EQU 4 PLA PLA STA RET STA RET PLA PLA STA RET+1 STA RET+1 PLA PLA PLA STA VAL PA PLA PLA PLA PLA STA ADR STA ADR PLA PLA STA ADR+1 STA ADR+1 LDX #0 LDX #0 LDA VAL TXA STA @ADR,X PHA LDA RET+1 LDA @ADK,X PHA PHA LDA RET LDA RET+1 PUA PHA RTS LDA RET .END a l'aide de commandes évoluées. 4 utilitaires figurent aussi sur la disquette : Utili-disque : reconstruction d'une disquette détruite, Vérification, Plan d’occupation Ultra-copie : pour un backup particuliérement rapide Edicat : Edition du catalogue, classement des fichiers, Titres... Multi-disque : pour le classement de tous vos programmes (tri instantané). Oisk Manager, le Dos en Kit de Dan Steerey Pom's n° 23 u'est-ce qu'un formateur de programme Apple- soft ? C'est une routine qui affiche ou imprime un programme Basic pour en faciliter la lecture. La mise au point en sera done facilitée et, une fois terminée, on obtient une documentation d'allure profes- sionnelle. Inspiré d'une routine écrite elle-méme en Basic dans Call-Apple, FORMATEUR est réalisé entiérement en assembleur pour des raisons évidentes de tapidité. Une fois chargé en mémoire, il peut étre utilisé 4 tout moment. Le programme Applesoft est listé de la facgon suivante: * ume seule instruction par ligne (les ‘:’ excédentaires entre deux instructions sont ignorés) ; + une ligne blanche entre deux lignes de programme ; + décalage de 4 caractéres dans les boucles FOR-NEXT; remplacement des NEXT X,Y,Z par NEXT X : NEXT Y:NEXTZ; + décalage de 4 caractéres aprés THEN ; + décalage de 4 caractéres pour les instructions dont la longueur dépasse une ligne (sauf cas de force majeure, les mots ne sont pas coupés) ; + en début de ligne, on rajoute LET avant I'affectation d'une variable. Bien entendu, le programme listé n'est absolument pas modifié par FORMATEUR. Le format par défaut est 80 colonnes sur 66 lignes, mais l'utilisateur a la possibilité de modifier ces valeurs. Le saut de page et la pagination sont automatiques. Enfin, on peut également imprimer un titre et une date. Utilisation Le programme se charge par BRUN FORMAT. Les commandes disponibles sont : éL Liste l'ensemble du programme a l'écran. Comme la commande LIST de l'Applesoft, on peut la faire suivre d'un numéro de ligne : &L 10 sont des &L 10,20 formats &L 10, acceptés &L ,10 &LP Liste sur l'imprimante. Le format est identique que é&L. L'imprimante est supposée connectée en slot 1. Notez que les instructions PR#n ne sont pas imprimées. &éT Saisie du titre sur au plus 32 caractéres. Le format est libre. Effectuer la séquence : &T <Return> titre <Return> On peut également y inclure des codes de contréle pour limprimante (sauf ESC). &D Saisie de la date sur 32 caractéres en format libre. éPn n définit la longueur d'une page (de 21 4 127 sinon message d'erreur). écn n définit la largeur d'une page (de 40 4 127 sinon message d'erreur). Le listing peut étre interrompu par CTRL-C. Utilisez CTRL-S pour une interruption temporaire. Fonctionnement Sous DOS 3.3, le programme se charge en $90D1 et fixe Himem a $9100. Le programme initialise l'Ampersand et les valeurs par défaut du format, puis rend la main. Lorsqu'il est appelé pour une liste, il scanne le programme Basic en mémoire en effectuant, d'une part le méme travail que la routine LIST de l'Applesoft (conversion des numéros de ligne stockés en binaire en valeurs affichables, traduction des tokens en mots-clés, etc.), d’autre part en améliorant l'affichage comme décrit précédemment. FORMATEUR utilise un grand nombre d'adresses inutilisées en page zéro ; cela ne pose pas de problémes car il est prévu pour étre activé en mode direct et non a l'intérieur d'un programme. De plus, la zone $300-$33F sert a sauvegarder le titre et la date éventuellement saisis. N.D.L.R. : les routines d'accés aux périphériques du programme ont été légérement modifiées afin de permettre un fonctionnement normal avec une carte 80 colonnes, ainsi qu'une exécution au choix sous DOS 3.3 ou ProDOS. Le programme T.FORMAT est le fichier source au format Big Mac. L'assemblage sous DOS 3.3 se fait simplement en mettant la variable PRODOS a0. Pom's n° 23 Pour ProDOS§, elle doit étre mise 4] et le source doit étre resauvé sur disque. L'assemblage S‘effectue en chargeant DARWIN.S (pour les détails d'utilisation, voir Pom's 22) ; la derniére ligne doit devenir "PUT FORMAT" et on assemble en chargé sous ProDOS par : donnant les paramétres : BRUN FORMAT. PRODOS, A$6000 DESI S = oUt (il se relogera au dessus des DARWIN _F = $95FF buffers de ProDOS). VA_DEBUT = 1 Le module objet peut alors étre 03 mars 1986 PAGE 1 ae Un listing formaté par 6 a FORMAT 400 LET Je 5+ 420 NEXT Ce listing partiel de ‘CONVERT publié dans ces nu a l'imprimante en faisant : ae POR is pages, a été obtenu a limp 430 REM INCLUSION DES BRK + BRUN FORMAT + LOAD CONVERT 440. HRRR. CORO: 4a0 + &T pour la saisie du titre ‘Convert’ 450 LET P$ = F$(3) + + &D pour la date '03 mars 1986" : PRINT DS*BLOAD"FS : + &LP 400,680 pour le listing proprement dit. soto 470 460° CALL 768 = Note : sous ProDOS, il faut faire GosuB 1080 : BRUN FORMAT.PRODOS,A$6000 Goro 440 et il vous faut un Basic.System dont la version est supérieure a 1.1. 470 CALL 27500 480 ¥OR 1 = 1 TO NL 490 Ir INT (I / 500) = I / 500 THEN PRINT = O3 mars 1986 PAGE 2 PRINT “PATIENCE JE FAIS LE MENAGE!"; : CALL 37500 : Convert PRINT “C'EST FINI” + PRINT 990 LETM = 3 +2 $00 FOR J = 1 TO 12 600 LET YS = «# Sie 4¥ MIDS (A$(2),d-1) < > “u" THEN 610 IF J > 4 THEN 670 LET YS = LEFTS {(A$(I).J - 4) 520 LET I = 9 +13 620 FOR R= 1 TO N2 IF MIDS (AS{I),J,1) < > “S" THEN 550 630 TRT Lo BEN (Z8(K)) 330 LET Is IF+1l: 640 Iv LEN {AS{i})}) + M+ i <b THEN IF MIDS (AS(I),J,1) ¢ > “R" THEN 660 670 = 650 IF MIDS (AS(I),;M,l) = 25(K) THEN 540 LET £3 = 219 LET AS{I) = YS + 2S + Z29(K} = GOTO 590 PRINT AS({I), "LIGNE N{ *s1 : PRINT + $50 IF MIDS {AS(I),d,1) < > "M" THEN LET K = N2 670 660 NEXT Kot $60 wtsyI-73+1: LeT J = 12 If MIDS (A${I),d,1) < > “P™ THEN 670 670, NEXT J: NEXT T $70 LET 28 = 229 680 HOME > $80 REM ON A UN JSR OU JUMP PRINT "SAUVER LE FICHIER TRANSFORME 2” : PRINT PRINT * SUR DISQUETTE? <O,N>"; se: Pom's n° 23 Th eee Source ‘DARWIN.S’ (ppeecatneS 49 * 2 ~ Copie vers l'adresse d’implantation Assembleur BIG MAC oe 47 DARWINZO JSR $FF58 contient un ATS 1 eaeesessesssensenenenenenee a rsx 2° DARWIN , “a DEX 3 pbesensssnsnenseeeneneneses 50 cic 4 51 LDA $100,X recherche sur la pile 5 * Routine d'initialisation 4 ProDOS 52 ADC #DARWINS9-DARWIN20-2 ; adresse debut routine 6 * d'un programme assembleur DOS 3.3 53 STA $3C Al 7 ‘Sa LDA $101,X 2 * (C) 1985 Alexandre Avrane 55 apc 40 9 * Modi fla: 24/11/85 56 STA $3c+1 10 * Créé: 16/11/85 57 LDA $3C adresse de fin u 38 ADC #<DARWIN_L 12 * Ce source est assemblé an conjonction 59 STA $3E a2 13 * avec le programme 4 adepter ProDos 60 LDA $3c+2 rr) 6 ‘ADC #>DARWIN_L 15 DARWIN_D OD sadeaee de début DOS 3.3 #2 ‘STA $3E+1 16 DARWIN F KBD adresse de fin DOS 3.3 63 IDA #<DARWIN_A adresse dlarrivée 17 VA_DEBUT KBD seaute en début de pgm apres chargement? 64 STA $42 a 18 65 PHA 19 * Calcul des adzusses sous ProDos 66 EDA #>DARWIN_A 20 DARNINVI = DARWIN _F/3100+1 ° Sra $4241 21 DAKWINV2 = DARWIN_D/$100 68 PHA 22 DARWINV3 = DAKWINV1~OARWINV2 6 wr 40 23 DARWINVé = — $100*DAKWINVZ 70 JeR $FE2C déplace le bloc par MOVE 24 DARWINVS = — DARWIN_D-DARWINVE (25 DARWINVE = DARWINV3*$100-DARWINVS seca 26 73 * 3 = Appel du module et sortie 27 DARWIN A = $9AQ0-DARWINV6 ; adresse de début ProDOS 26:0 Serr 28 DARWIN.L = DARWIN _F-DARWIN_D ; longueur ProDOS 1s ‘PLA 23 76 STA $42¢1 30 ORG DARWIN A-73 :DARWIN prend 72 octets 7 PLA 3 78 STA $42 32 ¢ eeceewmesecereeeeeeeeseseeneeeese 73 DO VA_DEBUT 33 * 1 - Recherche de 1a place mémoire 80 JMe ($42) saute en début de programm 36 * sominmneemnesaenieesonsnn - 31 ELSE ‘3s LDA SBFFD IVERSION 82 RTS ++-0u retour 4 l'Applesoft 36 BEQ DARWINIO Basic.System 1.0 83 ‘NOP 37 LDA $0~DARWIN_A/$100+S9R 84 NOP ELD JSR $BEFS GETBUFR 85 FIN 39 BCC DARWINI2 6 DARWINGS = * 40 DARWINIO LDA #14 PROGRAM TOO LARGE * Inclut le source du programme 4 adapter (format TEXT) a omp $BE09 PUT FORMAT 42 DARWINI1 = + ND - 00 90 2¢ c9 50 6180- 20 24 ED 84 06 A9 00 18 Récapitulation 6088- FF 20 Bl pitulano 6090- FO 07 C9 00 DO 11 4c A 6188- 69 07 85 1A 38 E5 06 AB en version ProDOS 6098- 94 AS D6 FO 05 C6 D6 4c 6190- 88 AS 20 20 5C DB 88 DO ‘FORMAT. 60A0- C9 DE E6 D6 4C 40 94 C9 6198- FA AQ 00 85 1E 85 1D 8 PRODOS’ 60A8- 2C FO 03 4C C9 DE AS FB 61A0- D7 85 EB A4 07 20 F@ 96 60B0- FU 03 4C CY DE E6 FB AC 61A8- DO 03 4c FE 94 C9 3A FO P 3 60B8- 40 94 20 OC DA AS FR 00 61RO- F4 C9 8? DO 7C Ad OT AS Aprés avoir saisi ce code 60CO- OD AS 50 65 FC AS 51 85 61B8- EB 38 AS EC E9 04 10 02 sous moniteur, a partir de 60C8- FD 20 B7 00 DO BE AS 50 61C0- A9 00 85 EC AA £8 AQ 20 l'adresse $6000, vous le 60D0- 85 FE AS 51 85 FF 20 B7 61C8- 20 F2 96 CA DO FA A2 00 sauvegarderez par BSAVE 60D8- 00 FO 03 4C C9 DE AS FD 61D0- BD DO 98 FO 06 20 F2 96 FORMAT,A$6000,L$55E 60E0- C5 FF 90 OE DO 06 AS FE 61D8- E&8 DO F5 4C FE 95 4c 63 60E8- C5 FC BO 06 20 F3 98 4C 61E0- 96 85 07 A6 EC £8 A9 20 60F0- 00 BE AD 31 RE 49 FD an 61E8- 20 F2 96 CA DO FA AS 07 6000- AD FD BF FO 07 A9 07 20 60F8- 14 99 FO 05 A9 33 8D 14 61F0- 30 EC C9 30 90 32 C9 3A 6008- F5 BE 90 05 A9 OE 4c 09 6100- 99 AS D6 FO 07 Ag 31 20 61F8- BO 0D A9 20 20 F2 96 AS 6010- BE 20 58 FF BA CA 18 BD 6108- F6 98 C6 D6 85 FB 85 18 6200- 07 20 F2 96 4C FE 95 C9 6018- 00 01 69 36 85 3C BD 01 6110- 85 1A 85 1D 85 1C 85 1E 6208- 41 90 1D C9 5B BO 19 A2 6020- 01 69 00 85 3D AS 3C 69 6118- 85 EC 85 D7 AS FC 85 50 6210- 00 85 07 BD D7 98 FO 06 6028- 20 85 3E AS 3D 69 05 a5 6120- AS FD 85 51 20 1A D6 AO 6218- 20 F2 96 E8 DO F> AS 07 6030- 3F A9 00 85 42 48 A9 94 6128- 03 BO 0A AO 00 FO OF 4c 6220- 20 F2 96 4C FE 95 AS 07 6038- 85 43 48 AO 00 20 2C FE 6130- FE 94 4C Ad 94 20 49 97 6228- C9 22 FO 03 4c D4 96 AS 6040- 68 85 43 68 85 42 6c 42 6138- 20 68 97 4C 2B 95 20 49 6230- 1D 49 01 85 1D A9 20 20 6048- 00 A9 4C 8D F5 03 A9 2B 6140- 97 20 68 97 4c 01 95 20 6238- F2 96 A9 22 4C E9 96 a9 6050- 8D F6 03 AS 94 8D F? 03 6148- F8 96 20 F8 96 FO 9D AD 6240- 3A 4C E9 96 4C FE 94 20 6058- AY 42 85 19 AY 50 85 1B 6150- 00 CO 10 0A C9 83 D0 06 6248- F@ 96 FO F8 30 SE AG FB 6060- AS 07 85 09 AO 3F AS 03 6158- AD 10 CO 4c A3 94 20 FB 6250- EO 01 DO OD A2 00 86 FB 6068- 85 CF A9 00 85 CE 20 1A 6160- 96 85 50 20 Fe 96 85 51 6258- 85 07 A9 20 20 F2 96 AS 6070- 98 85 D6 60 C9 4c FO 03 6168- C5 FF 90 08 DO C4 AS FE 6260- 07 C9 22 DO OB AS 1D 49 6078- 4¢ C3 97 AD 00 85 FB a5 6170- C5 50 90 BE 20 49 97 20 6268- 01 85 1D AY 22 4c E9 96 6080- FC 85 FD A9 FF 85 FE 85 6178- 49 97 AS 51 AG 50 84 07 6270- C9 3A DO 1A AS 1D DO C7 Pom's n° 23 Source ‘T.FORMAT’ Assembleur BIG MAC Sauvegarde sous format TEXT (voir texte) #1 Source pour DOS 3.3/ProD0e propos = 0 +) (mettem 0 pour DOS eu 1 pour Pranos) 70° $98 *SCB-SCF *Compteur lignes *Décalage riéc0 Ligne « 1h sDerniére Ligne szarce gauche ‘Longueur page SCompteur "Largeur page ‘Numéro de page "Drapeau " *weealag si then ‘Devel. fur-next 07 * (S2F est utilisé par 80 col. du //e) 100 101 102 403 104 105 106 107 108 109 110 a 122 ug ue u7ze FIN LDA STA LDA Sta LOA 57a wy 1a STA LOA STA 152 * Longueur 66 1i gnes par défaut NLMAX #520 * Largeur 80 par rau womax 7 « targeur marge gauche woRce 137 4503 STOCK+1 —# Ef face xonn at ockage titre et 450 * date ($300 4 $ 3tf) stock v2 PRT " Indicateur inp rimante 20 1 Assenblable directement pour ! 71 GeTLN QU SrDER uesliser DARKIN pour! 72 capo FOU «SDAPR ! 73 awwen FOU $3F5 we parandtres: : 74 BASIC -EQU. $PEBS 122 peur = : 75 StxBRR EQU SDECD 123 cw att ' 76 ovmo = QU. $DBSC 324 BEQ 100 . ! 77 LINGET BQU $0A0C 125 IMP TITRE = * 6L Liste le pr — 78 LiNpRNT QU $8024 ‘gramme entier A 79 FNDLIN QU $D61A 126 LOO LOA 480 . Hating 4 Iéeren ! 30 PRBLI—-BQU. SF9EC 127 STA VIRGULE Listing 4 2impeimante 1 4“ 128 STAM aie de 1a dace ! ae 429 STA MeL inte dy cite ' a 130 WA aster longueur d'une page} ae 132 STAN ‘une page : a5 * awrrraLzsariow 332 ‘STA Net slot inprimante ae 133+ wanna nanan nnnnnm 7 134201 -38R cancer DO 1-PRODOS pas d'ORG pour Pan + 195 no? Ree OR . FebOs 89 IDA 44 136 cM 4'Pt *EIP Tate aur 7 ORG $9001 90 ‘STA AMPER imprimante P aeamataac #2 LDA #DEBUT 137 BEQ 103 * bd om, 9 STA AMPER?1 138 CMP 450 bed 93 ‘DO 1-PRODOS pas touche pas 4 139 ‘BNE LOS 41 cHRoET «QU SBL Himem sous ProDOS! 140 MP LISTE <2 Cancer. SF 987 cas ‘STA #IMEM 142 103 LDA PRT 42 TxXTPTR FOU $88 95 FIN 12 BEQ 104 44 Lim QU 550 irs WA puswr 43 osc par 45 wiMEN BOD $72 97 STA AMPERe2 ae me Srxene “ 8 DO = t~PRODOS 443 20d INC PRE 47 Fac Ro 00 ” STA. HIMENe 146 me wat 6278- AS D7 DO C3 85 EB AS 20 6370- AS 04 65 EC 85 F9 A 01 6468- 60 20 FB DA AZ UU BD C/ 6280- 20 SC DR AQ 3A 20 F2 96 6278- 85 FB 20 49 97 AS 09 18 6470- 98 FO 06 20 5c DR ER DO 6288- 20 31 97 4c 5c 95 C9 2c 6380- 65 1E 65 F9 85 1A AA CA 647€- F5 20 FB DA 4C B3 FE C9 6290- FO 03 4C D4 96 AG EB DO 6388- A9 AO 20 4c F9 Ad 00 AS 6480- 50 FO 03 4C 59 98 20 BI 6298- 03 4C D4 96 A 20 20 SC 6390- F9 60 A9 00 85 1A 20 FB 6488- 00 90 03 4c A3 94 20 OC 62A0- DB AS 3A 20 F2 96 20 31 6398- DA E6 18 AS 18 C5 19 90 6490- DA AS 51 DO 30 AS 50 30 62A8- 97 4C 6C 95 A2 00 86 FB 63A0- 03 20 5C 97 60 AS 1¢ FO 6498- 2¢ C9 15 90 3B 85 19 4c 62B0- 38 E9 7F AA 85 07 C9 33 63A8- 08 A2 04 20 FB DA CA DO 64A0- A3 94 CY 43 FU U3 4C CY 62B8- DO 07 A9 01 85 D7 4c AZ 63B0- FA 84 07 E6 1C AS 08 85 64A8- DE 20 B1 00 90 03 4c A3 62C0- 96 C9 02 DU UY Ad EC 69 6388-18 AY 20 85 CE 20 B4 9” 64B0- 94 20 OC DA AS 51 DO OD 62C8- 03 85 EC 4C A2 96 C9 45 63C0- 84 1A AS 1B 38 E9 OF ES 64BA- AS 50 30 09 C9 28 90 34 62D0- DO 19 A2 00 BD DD 98 FO 63Cé- 1A 10 02 AY 02 AA AY AU 64C0- 85 1B 4C AZ 94 20 FB DA 62D8- 06 20 5C DB E8 DO F5 AS 63D0- 20 4C F9 A2 00 AD Fa 98 64C8- A2 00 BD E9 98 FO 06 20 62E0- 1E 69 03 85 1E 20 31 97 63D8- FO 06 20 SC DB E8 DO F5 64D0- 5C DB £8 DO FS 4C A 94 62E8- 4C SC 95 AS 07 AA 84 06 63E0- A9 00 A6 1C 20 24 ED 20 64D8- 20 FB DA A2 00 BD A2 98 62F0- AO DO 84 9D AO CF 84 9E 63E8- FB DA 20 FB DA A9 00 85 64E0- FO 06 20 5C DB E& DO FS 62F8- AQ FF CA FO 0A 20 00 97 63F0- CE 20 B4 97 20 FB DA 20 64E8- 4C AZ 94 07 07 4D 49 4E 6300- 10 FB 30 F6 20 08 97 a9 63F8- FB DA A4 07 60 AO 00 Bl 64F0- 2E 32 31 00 20 FB DA A2 6308- 20 20 F2 96 20 00 97 30 6400- CE FO 08 20 SC DB CB CO 64F@- 00 BD BE 98 FO 06 20 5C 6310- 05 20 F? 96 NO F& 20 F2 6408- 21 90 F4 60 C9 54 FO 07 6500- DR FB DO FS 4c A3 94 07 6318- 96 A4 06 A9 20 C9 OA DO 6410- C9 44 FO 11 4C 36 98 AS 6508- 07 4D 49 4E 2E 34 30 00 6320- 0A 20 4D 97 AG 1A A9 AO 6418- 00 85 CE AS 03 85 CF 20 6510- 07 07 4D 41 58 2E 33 32 6328- 20 4¢ F9 C9 08 DO 03 4c 6420- 16 98 4C E7 97 A9 20 85 6518- 00 20 4B 45 58 54 20 00 6330- FE 95 20 F2 96 20 08 97 6428- CE A9 03 85 CF 20 16 98 6520- 20 4C 45 54 20 00 20 54 6338- 4C FE 95 20 SC DB EE 1A 6130- AS 38 48 AS 39 48 AS FF 6528- 18 45 4B 00 50 41 47 45 6340- 60 C8 DO 02 6 9C BL 9B 6438- 85 38 AS 97 85 39 20 6A 6530- 20 00 07 07 4D 41 58 2E 6348- 60 C8 DO 02 Fé 9E BI 9D 6440- FD EO 21 90 03 4c 20 98 6538- 31 32 37 00 AD 14 99 BD 6350- 60 85 07 38 AD 1B £9 OB 6448- AO 00 B9 00 02 C¥ aD FO 6540- 11 99 AZ 00 BL OF 99 FU 6358- 85 FA A6 1A E4 FA 90 2D 6450- 05 91 CE C8 DO F4 68 85 6548- 08 09 80 9D 00 02 £8 DO 6360- AS 07 C9 20 FO 0A C9 20 6458- 39 68 85 38 4C B3 FE AS 6550- F3 20 03 BE A9 00 60 50 6368- FO 06 A6 1A £4 1B DO 1D 6460- 00 AO 1F 91 CE 88 10 FB 6558- 52 23 31 OD 00 31 — Pom's n° 23 201 ee 257 bro prs * Pin programe ow 8, 202 ne $0800 25a 1A $c000 ——* Arde chu Ifa RRQ 106 203 Pm 259 pL 125 * ting af Ctrl C mp STXERR 260 cue 4503 261 BNE 1S LDA VIRGULE 262 LDA $C010 BEQ 107 263 ome RTS IMP STXERR 264125 «JSR LIREY INC VIRGULE 265 STA LINNUM me 101 266 JSR LIREL 267 ‘STA. LINWUMH2 sk Lamoer 268 cre Nel IDA VIRGULE 269 Bcc 126 ‘pxe 109 270 BNE RTS IDA LINVOM 272 DAN STA 4 272 ce Lene IDA reves 217 RoR 4SFO ssrore 2 273 cc rst STA Mel 218 STA. storsave 274126 JSR CROOL JSR cuRGOT 219 0 120 275 Ise capo! BNE 102 220 WDA 43° painon slot 3 276 LDA Linwome 221 STA SLOTSAVE 277 ox Liew IDA LiInww 222120 DA PRT 278 STY AUXe STA N 223 eq 122 279 JSR LINRVT —* Impression du IDA LINvoMeL 2 1A Astor no de Ligne STA Nel 25 JSR GO_PR2 240 sry aux JSR CHRGOT 220121 DBC PRT 2a DA 450 . wo Lie 227 422 STA oF we cu * one STAERA 220 STA ML 203 ax 487 . 229 STA Ne 204 ‘STA Ne * Marge aprés nu IA wt 230 STA quore mézo de Lene cor 231 STA PAGE 205 sec + bec | Liste 232 STA TF 286 sac x0X . one RTS 233 STA FF 287 my * WAN 24 STA RP 288 bey + ce x 235 LDA 289 LDA 4820 . cS LISTE 236 STA LINWOM 290 427 JSR. OUTDO 237 LA M1 201 bey 238 ‘STA Liwwoted 292 BNE 127 239 JSR FNDLIN 293 DA 480 20 by 453 204 sma TF 241 acs 123 295 ‘STA quore 22 wy 480 296 STA RF 20 bo PREMLGN 297 = Z ae ome CHAINAGE 298 00 1-Prooos no + 299 IDA sLoTsave 246 Arete nts 500 eq 112 207+ 3or 1a #000 249123 Jer cnoot 202 * LECTURE 16R OCTET D*UNE LIGNE pp 111 attente clavier 249 yea ewrere ear PRED peut effacer 1'éc 750 me 126 ran 251 precy = * 196 1a sco10 252 JsR cRo01 306 DESIGN JSR LIREL 197 Pw 253 3sa swrere 307 198 12 JSR GOPR 254 ne 14 308 199 D0 -PRooos 255 cuarNace JSR LIREL 309 Lat + Elimine les *: 200 IMP BASIC 256124 JSR LIRE ra = . 9148- DA AS FB DO OD A5 50 85 9238- 85 D7? 85 EB Ad 07 20 DA Récapitulation 9150- FC AS 51 85 FD 20 B7 00 9240- 93 DO 03 4C EO 91 C9 3A en version 9156- DO BE AS 50 85 FE AS 51 9248- FO F4 C9 82 DO 2C A 01 9160- 85 FF 20 B7 00 FO 03 4c 9250- @5 EB 38 AS EC E9 04 10 DOS 9168 C9 DE AS FD C5 FF 90 1B 9258- 02 A9 00 85 EC AN BB AD 9170- DO 06 AS FE C5 FC BO 13 ¥26U- 20 20 D4 93 CA DO FA AZ FORMAT 9178- AD F7 95 FO 08 AD 00 co 976A8- 00 RN R? 95 FO 06 20 Da 9180- 10 FB AD 10 CU 20 D5 95 9270- 93 E8 DO F5 4C EO 92 4C 91RA- 4C RI FE AD 54 AA 49 FD 9278- 45 93 85 07 AG FC FA AQ Aprés avoir saisi ce code 9190- 8D F7 95 FO 05 AY 33 8D 9280- 20 20 D4 93 CA DO FA AS sous moniteur, vous 9198- F7 95 AS D6 FO 07 A 31 9288- 07 30 EC C9 30 90 32 C9 Je sauvegarderez par 91A0~ 20 DB 95 C6 DE 85 FB 85 9290- 3A BO OD AS 20 20 D4 93 BSAVE FORMAT,A$90D1,L$527 91A8- 18 85 1A 85 1D @5 1C 85 9298- AS 07 20 D4 93 4C EO 92 91B0- 1 85 EC 85 D7 AS FC 85 92A0- C9 41 90 1D C9 5B BO 19 91B8- 50 AS FD 85 51 20 1A D6 92A8- AZ 00 85 07 BD B9 95 FO 90D1- AY 4C 8D F5 03 AY 00 91C0- AN 03 BO 0A AO 00 FO OF 92B0- 06 20 D4 93 E8 DO FS AS 90D8- 8D F6 03 85 73 AS 91 8D 91C8- 4c £0 91 4C 78 91 20 2B 92B8- 07 20 D4 93 4C EO 92 AS 90E0- F7 03 85 74 A9 42 85 19 91D0- 94 20 4A 94 4C OD 92 20 92C0- 07 C9 22 FO 03 4c B6 93 90E8- AS 50 85 1B AI 07 85 09 91D8- 2B 94 20 4A 94 4C E3 91 92C8- AS 1D 49 01 85 1D AY 20 90FO- AO 3F A 03 85 CF AS 00 91E0- 20 DA 93 20 DA 93 FO 90 92D0- 20 D4 93 AS 22 4c CB 93 90F8- 85 CE 20 FC 94 85 Dé 60 91E8- AD 00 CO 10 0A C9 83 DO 92D8- AS 3A 4C CB 93 1C £0 91 9100- C9 4C FO 03 4C AD 94 Ag 91F0- 06 AD 10 CO 4¢ 78 91 20 92E0- 20 DA 93 FO F8 30 SE AG 9108- 00 85 FR AS FC AS FD AG 91F8- DA 93 85 50 20 DA 93 85 92E8- FB FO 01 0 On A2 00 86 9110- FF 85 FE 85 FF 20 B1 00 9200- 51 C5 FF 90 08 DO C4 AS 92F0- FB 85 07 A9 20 20 D4 93 9118- 90 2¢ C9 50 FO 07 C9 00 9208- FE C5 50 90 BE 20 2B 94 92F8- AS 07 C9 22 DO OB AS 1D 9120- DO 11 4C 6B 91 AS DG FO 9210- 20 2B 94 AS 51 AG 50 84 9300- 49 01 85 1D AS 22 4¢ cB 9128@- 05 C6 D6 4C C9 DE E6 D6 9218- 07 20 24 ED 84 06 A9 00 9308- 93 C9 3A DO 1A AS 1D DO 9130- 4C 15 91 C9 2C FO 03 4C 9220- 18 69 07 85 1A 38 E5 06 9310- C7 AS D7 DO C3 85 EB AQ 9138- C9 DE AS FB FO 03 40 C9 9228- AB 88 AJ 20 20 SC DB 8B 9318- 20 20 5C DB AY 3A 20 D4 9140- DF F6 FR 4C:15 91 20 0¢ 9230- DO FA AQ 00 85 1F 85 1D 9320- 93 20 13 94 4c 3E 92 C9 Pom's n° 23 310 Bro eaicw 269 JsR ovmpot au IDA ant cM asez + Next > tee mx as sR 312 BNE Lat 265 ANE 145 416 sR * Saut Ligne pou 313 NEXT = «WA 481 366 146 = LDA. AUXS1 F nouvelle inst. ae STA NP 36? JsR ovToo! 417 TMP DEBLGN 315 sic * Rédult le décala 368 me 428 54 cM at," ge et isprine 369 DA + te caractére 1 9 BEQ. 199 ne LA FF * NEXT ‘est pas un noe 420 Me PRINT 317 SAC 454 370147 CP 422.0550 1x RF us BPL Laz 371 EQ 422 BNE 156 uy wa 450 372 oe 422 we Rie 320 n32 STA FF 373 143A 424.256 LDA #820 321 Tax i for 425 JsR ouTDo 322 Nx 375 STA QUOTE 426 IA ast 323 DA 4820 376 DOA 4920 427 JSR OUTDO! 324123 3sR oommo? 37 yor Gvrvor 428 JSR NI BS x 398 aoe ase 429 Me NEXT 179 327 Lox 430 oe _ s = 328134 LOA NXT, sn rate” 432 * 328 BEQ. 135 We PRI + te : est entre 133 * LECTURE ET IMPRESSION DES TOKENS 30 38k ovTDo! quillenets bee — 332 BNE 134 we CHATNAGE 436 + 333135 MP LIRE 427 TOKEN LOX 490 * Annute indicat pals 386 Lins JSR LIREI ‘eur coupure de ligne 235 roe! ne ronan BEO x Ode tines 18" — 397 Ltt STA AUK + bEfectue déce- 398 ust ma sae 40* 208 wx PF + lage for-next 349 aoe or 442 SEC 339 max oe ce gai 4a SOC 4S7F 340 1a = me cae «@ TAX 341 142 ask ey ok oe a ‘STA AUK . 32 Dex 30 ox oF “ cue 451 303 axe 2 Sta axe us as 10 ae 6 395 EDA #820 + Décale de les {hy pane 346 cue . sie Ae ARES Re ROEETA, 449 me 164 30 occ regs yen corooi "” siphanuntriove {39 240 Gar tot * buen ExT bas cue * THEN décale ay mani 451 ame et. humane come espace en + oe: | Ge ee eur décalage “oS ie Se ts s Bz ae m 400 DA QUOTE tat pie cabs = 401 Bor 4801 ts me ae ae Easy 402 STA QUOTE Are ey a =. = o oe e« EF ost fsa 408 me panera 355144 cue Winmidoe fers Ge gue oe Be 356 Boe + rable en débu fog gue ase as ae f Instruction imprine TET Yop ian aeoee “ = oF oe ie zs 408 BNE CHAINE <a oe ee 358 Bos 147 ioe on « m 360 SA hin pr oe ee 46446) wa TP 360 STA AUX+ re = te a °° Bee 422 BDA 4820 "i" Séparateur {eg = 43 JSR OUTDO 9328- 2C FO 03 4C B6 93 AG EB 9418- 18 65 1E 65 F9 85 1A AA 9508- A9 95 FO 06 20 SC DB EB 9330- DO 03 4C B6 93 AY 20 20 9420- CA A9 AO 20 4C F9 AY 00 9510- DO F5 20 FB DA 4C B3 FE 9338- 5C DB A9 3A 20 D4 93 20 9128- 85 F9 60 A9 00 85 1A 20 9518- C9 50 FO 03 4C 3B 95 20 9340- 12 94 4¢ 4R 92 A2 00 86 £6 18 Ad 18C> 19 9520- B1 00 90 03 4C 78 91 20 9348- FB 38 E9 7F AA 85 07 C9 9438- 90 03 20 3E 94 60 AS IC 9528- OC DA AS 52 DO 30 AS 50 9350- 33 DO 07 A9 01 85 D7 4C 9440- FO 08 AZ 04 20 FB DA CA 9530- 30 2¢ C9 15 90 3B 85 19 9358 84 93 C9 02 DO 09 AS EC 9448- DO FA 84 07 E6 1C AS 08 9538- 4C 78 91 C9 43 FO 03 4C 9360- 69 03 85 EC 4C 84 93 C9 9450- 65 18 A9 20 85 CE 20 96 9540- C9 DE 20 BI 00 90 03 4c 9368- 15 DO 19 A2 00 BD BF 95 9458- 94 84 1A AS 1B 38 E9 OF 9548- 78 91 20 OC DA AS 51 DO 9370- FO 06 20 5C DB E8 DU F> 9460- E5 1A 10 02 AS 02 AA AD 9550- 0D AS 50 30 09 C9 28 90 9378- AS 1E 69 03 85 1E 20 13 9468- AO 20 4C F9 A2 00 BD C5 9558- 34 85 1B 4C /8 91 20 FB 9380- 94 4C 3E 92 AS 07 AA 84 9470- 95 FO 06 20 5C DB £8 DO 9560- DA A? 00 BD CB 95 FO 06 9388- 06 AO DO 84 9D AO CF 84 9478- 5 A9 00 AG 1c 20 24 ED 9568- 20 SC DB E8 DO F5 4c 78 9390- 9E AO FF CA FO 0A 20 E2 94R80- 20 FR NA 70 FR DA AY 00 9570- 91 20 FB DA A2 00 BD 84 9398- 93 10 FB 30 F6 20 EA 93 9488- 85 CE 20 96 94 20 FB DA 9578- 95 FO 06 20 SC DB E8 DO 93A0- A9 20 20 D4 93 20 B2 93 9490- 20 FB DA A4 07 60 AO 00 9580- F5 4C 78 91 07 07 4D 49 93A8- 30 05 20 D4 93 DO Fé 20 9498- Bl CE FO 08 20 5C DB Cé 9588- 4E 2E 32 31 00 20 FB DA 93B0- D4 93 A4 06 A9 20 C9 OA 94A0- CO 21 90 F4 60 C9 54 FO 9590- A2 00 BD AO 95 FO 06 20 9348- DO 0A 20 2F 94 AG 1A Ad 94A8- 07 C9 44 FO 11 4c 18 95 9598- 5C DB E8 DO FS 4¢ 78 91 93¢0- AD 20 4c F9 C9 08 DO 03 94B0- A9 00 85 CE A9 03 85 CF 99A0- 07 07 4D 49 4E 2E 34 30 93C8- 4C EO 92 20 D4 93 20 EA 94B8- 20 F8 94 4C C9 94 AB 20 95A8- 00 07 07 4D 41 58 2E 33 93D0- 93 4C E0 92 20 5C DB E6 94C0- 85 CE AY 03 85 CF 20 FB 95B0- 32 00 20 4E 45 58 54 20 93D8- 1A 60 C8 DO 02 E6 9C Bl 94CR- 94 AS 28 48 AS 39 48 AG 95B8- 00 20 4C 45 54 20 00 20 93E0- 9B 60 C8 DO 02 E6 9E BI 94D0- E1 85 38 A9 94 85 39 20 95C0- 54 48 45 4E 00 50 41 47 93E8- 9D 60 85 07 38 AS 1B E9 94D8- 6A FD EO 21 90 03 4C 02 95C8- 45 20 00 07 07 4D 41 58 93F0- UB 85 FA A6 1A E4 FA 90 94E0- 95 AO 00 B9 00 02 C9 BD 95D0- 2E 31 32 37 00 AD F7 95 93FR- 2D AS 07 C9 20 FO 0A C9 94E8- FO 05 91 CE C8 DO F4 68 95D8- 8D F4 95 20 FB DA A9 04 9400- 2C FO 06 A6 1A E4 1B D0 94F0- 85 39 68 85 38 4C B3 FE 95E0- 20 SC DB A2 00 BD F1 95 9408- 1D A9 04 65 EC 85 F9 Ad 94F8- AJ 00 AO IF 91 CE 88 10 95E8- FO 06 20 5c DB E8 DO F5 9410- 01 95 FB 20 2B 94 .A5 09 9500- FR 60 20 FR DA A? 00 BD 95F0- 60 50 52 23 31 OD 00 31 22 Pom's n° 23 553 554 555 556 337 339 560 ser 562 564 565 169 PRINT 72 pains? LIREL a ‘LIRE2 * coupe RIS STA TDA + * la ligne SBC STA 1x ex Bo LDA ow BE ome BEQ 1x wr ADK . LIT DANS BASIC sun LoRTRS? (QONTR).¥ * LIT DANS LA TABL DES MOTS CLES PACH WAC)» auxid nema ATT carne. a @ fin de Ligne ai 7 ou 458 DEC ectuer ast * Marqueur coupy re de ligne oF cRoo1 * Décalage en ae but d'instruction MARGE * Décelage a eff 7 bre xe 4510 PRALI S66 RETURN 567 ‘LDA 568 STA 569 RIS 570 cROOl = 571 DA 572 STA 573 CRO ISR a” Inc 373 WA 376 ow 377 BoC 378 aR 579 L110 RTS 580 sti2 LDA 58 BEO 582 1x 583 SL13. ISR DEX NE ENTETE STY INC WDA STA WA STA sR sty WA sBC BC sac BPL DA sizl TAX ‘IDA sR 10x S22 «WA BEQ JSR INK BNE 5t23 LDA wx aR von sR 1a STA ISR ISR sR wy RTS. PRIMG = «WY Sial WUA BEG se any cry Bec suaa RTS. TITRE = cw 635 BEQ 636 oe 637 BE 538 we 29 * 540 * Séleccion a+ 642 rm 10a oar sta eee wa “as TA 46 JSR a7 me 648 ore IDA 649 STA 650 IDA 651 STA 652 JSR 653 StS ‘DA 554 PRA 655 ‘WDA 636 HA 67 LDA 658 STA 639 DA 560 STA 661 Jen 662 Cex 663 ace 664 oe 665 INPUT Loy 666 SLE1. LDA 450 @ local * Annule décalag g . Mime page # Page suivante ENTETE —* Sf lére page n ¢ fait pas de saut 484 * de 4 Ligne: cRoO * DATE * Inprime “page #30 LINPRNT 480 * TITRE PRIMG * Inprine titre ADx+1 #50 (sTucK) Sudz 822 uaa ar * Saisie du tite ¢ ou de 1a date TTR in TE LoNcPG: encede dace ou citre 430 stock 4503 sTock+1 VIDE sus 4520 funeur $38 @rneor $39 cern “2a rwpor ERR 450 §200,¥ * Transfert dans zone de stockage 672 SL62 vibe 699 sL80 700 702 702 sL#1 203 708 705 706 707 708 708 70 ms 712 LARGPG 13 me 78 716 S190 m7 7148 719 sugt 720 721 722 723 724 25 726 BR? 8° 729 ERREUR 730 7 732 sui01 742 stiit 74 m5 746 747 SULIz 748 bei. 749 750 751+ 282 MINC 753 754 755 sul2i 756 a8 RQ RSESURRS SER EREREREER 4 Et RQEEESGERSEE g" 8 4 3 ‘ QRRSERRBESS' REEGEERE" & BR g8 RRRR RRRSEREES seo (stocn).¥ SL61 $39 $38 BASIC 430 sir (sT0cK) ,¥ * Longueur page * Maxi 127 Ligne * Largeur de 1a Pom's n° 23 23 L’Applesoft est un peu a I’ réservée a imagination débordante. Les 48Ko qui vous sont genéreusement alloués se revélent parfois insuffisants lorsque vos programmes Basic utilisent des images HGR et ou des routines en langage machine zone mémoire étroit dans la votre importantes. Si, de plus, votre programme utilise des tableaux alphanumériques, il ne vous reste qu'une peau de... pomme. Le programme NAVETTE va vous permettre d'utiliser les 16 Ko de la carte langage pour placer l'ensemble des programmes binaires dont a besoin votre programme Basic. Les solutions Programmes binaires n'utilisant pas de routines Applesoft Le plus simple consiste 4 recopier le Moniteur de la ROM vers la RAM aux mémes adresses (de $F800 4 $FFFF). Tout appel au Moniteur 4 partir de la carte langage scra alors dirigé vers la RAM. Ainsi, 4 chaque utilisation de notre programme binaire, une routine en RAM principale (sous l'adresse $9600), se chargera de transférer le contréle a la carte langage, puis de reprendre la main en finale en commutant vers la ROM avant de retourner au programme Basic. Programmes utilisant des routines Moniteur et Applesoft Le probléme se complique car il y a conflit entre l'utilitaire en langage machine et la ROM Applesoft ; ceux-ci commencent en effet 4 la méme adresse (a partir de $D000). Comme dans le cas précédent, une routine fera la liaison entre le programme Basic et la carte langage, mais elle servira de plus d'aiguillage pour tout appel (et retour) de routine ROM (Applesoft ou Moniteur). C'est l'objet du programme NAVETTE. Principe Le programme NAVETTE va servir d'interface entre le programme en ‘carte langage’ et les sous-programmes en ROM. Son principe repose sur _une utilisation de l'instruction BRK pour passer le relais 4 NAVETTE. Il suffit de placer, dans le programme destiné 4 étre logé dans la RAM supéricure, un BREAK (BRK:00) avant chaque appel d'une routine de la ROM. A la rencontre de ce code, le moniteur saute a l'adresse vectorisée par $FFFE et $FFFF, en l'occurence, on saute a NAVETTE qui, comme sont nom l'indique, fera la navette entre la RAM et la ROM. Nuele Jean-Fiul Arbel Pratiquement... Dans votre programme Basic, charger NAVETTE et I'utilitaire par une séquence telle que : 10 DS$= CHR$(4): PRINT D$"B RUN NAVETTE" 20 A = PEEK (-16255) : A= PEEK (-16255): PRINT D$ "BLOAD UTILITAIRE": A = PEEK (-16254) Liutilitaire sera ensuite exécuté par l'instruction '&' dite ampersand, Modification de l'utilitaire Assembler le programme que l'on veut charger dans Ia carte langage, a partir de l'adresse $D000, en ayant pris soin de placer des BRK. avant chaque appel a la ROM par JSR ou JMP ou avant chaque instruction accédant 4 la ROM (par exemple LDA $FBB3 qui détermine le type de la machine). Il est a noter que tout programme existant peut étre modifié et assemblé de la sorte. Si ce programme utilise l'ampersand, il suffit de supprimer la partie Suite du source ‘T.FORMAT’ listé pages précédentes "4 169 nex 00 703 20 1-PRoD0s 298 ane coz 70 tet ase ter Jae Sea cx00 390030 mm ex 00 705 wa Ht ctried 200 30 Proves 7a tn asc THEW ras Jor Gor 801 Gee $3603 as tax 00 i im soz A 40 774 wompace Ase “PAGE yas ix 40 003 rin m5 mex 00 789 co? OA PR_DATA,X to ars 776 maxr tx 0707 330 280. 003 205 339 ec “a. 327° os oo, 1-PRoo0s S06 PROATA Asc 'PRAI* re tmx 00 bo Jen O07 307 hex 0000 770 793 LSE 08 Storsavr asc '1' 70 copR = + mo ea saa #09 20 1-PRooos 281 TA Suorsave 295 Sta $200-x a0 zo 782 GO PR? STA PRDATA+ saccxslot destin 796 Fn at FIN tialze 7 INK Ne Pom's n° 23 WU CnnmMent gerer des routines binaires sur la carte lagggee., relative a li'initialisation de celui-ci. Par contre les instructions Basic utilisant cet artifice restent inchangées. L'utilisation de NAVETTE 4 lintérieur d'un programme Basic est entiérement transparente. Facilités Le programme CONVERT permet d'ajouter les BRK dans les sources devant les instructions JSR et IMP appelant un sous- programme en ROM. Ce programme se charge didentifier toutes les adresses en ROM, définies par des labels grace a l'opcode "EQU" ou "=", d'un programme source écrit avec BIG MAC, sauvegardé sous forme de fichier TEXT. Il insére ensuite les BRK automa- tiquement ; il sauve enfin sur disquette, le programme modifié, en ajoutant le suffixe ".LC". Tl utilise les routines suivantes : + INPUT: input généralisé acceptant tous caractéres ; + DIM.VAR.OBJ : routine publiée dans Pom's 12 ; * FRE (16) : routine de ‘garba- ge’ publiée dans Pom's 2. Techniquement... A chaque appel de l'ampersand le scénario est le suivant : 1] NAVETTE commute sur la mémoire supérieure (carte langage) ; 2) exécution de l'utilitaire jusqu'a la rencontre d'un BRK qui dirige sur NAVETTE ; 3] les registres sont alors sauvegardés. On recherche ensuite l'instruction suivant BRK. On commute alors l'accés 4 la ROM et cette instrution est exécutée ; 4] enfin, NAVETTE commute de nouveau sur notre utilitaire ; 5] le retour au Basic ne saurait se réaliser sans un petit passage (le dernier jusqu'au prochain) par NAVETTE. qui se charge de Teplacer correctement les commutateurs RAM/ROM, avant de rendre la main au programme Basic. NAVETTE a été testé sur ICARE de P. CANTOT, version compléte (SUPER PRINT et TORTUE inclus). Avec quelques aména- gements bien sir, il semble donner toute satisfaction. Précisions, limites « NAVETTE est assemblé en page 3 a partir de l'adresse $300, l'utilitaire étant placé au-dessus du DOS, HIMEM conserve sa valeur fixée par le DOS soit $9600 (38400) ; * NAVETTE est incompatible avec les DOS déplacés dans la carte langage, de méme qu'avec PRODOS qui utilise lui aussi cet espace mémoire ; « NAVETTE commute sur le Banc 2 et la mémoire commune de 8Ko. Pour commuter sur le Banc 1 voir la remarque S. Pour plus de précisions voir Yarticle de Gérard Michel dans le numéro 19 de Pom's, page + il ne faut pas que I'utilitaire fasse appel 4 des interruptions (BRK), les vecteurs d'inter- tuptions étant modifiés par NAVETTE ; * si vous voulez placer plusieurs utilitaires indépendants sur la carte langage, il vous suffit, avant l'appel de l'un d'eux, de POKer son adresse d'implan- tation en $31E (798) et $31F (799) dans l'ordre habituel : adresse basse puis haute. Si vous voulez utilisez le BANC 1, POKez 0 4 la place de 128 en $324 (804). GS Programme ‘CONVERT’ 10 REM ! INSERTION DES BRK ! 1 DANS PGM SOURCE BIG MAC ! 1 JEAN PAUL ARBEL 1 ! ! 20 HIMEM: 37490: HOME : TEXT 30 REM AMPERSAND -> DIM, VAR 40 POKE 1013, 76: POKE 1014,124: POK E 1015,146 50 DIM AS(1): DIM ZS(1): DIM FS(3) 60 FS(1) = "INPUT":FS(2) = "DIM. VAR. OBI": FS (3) = "FRE(16)" 70 DS = CHRS (13) + CHRS (4) 80 ONERR GOTO 100 90 FOR I = 1 TO 2:F$ = FS(I): PRINT DS"BLOAD"F$ (I): NEXT : GOTO 110 100 CALL 768: GOSUB 1080: Goro 80 110 Z1S = " BRK" + CHRS (13) + * US x 120 225 = “ BRK" + CHRS (13) + ” UM Pp? 130 REM LECTURE FICHIER 140 vr = 10 150 VIAB VI: INVERSE :$ = "NOM DU FICHIER SOURCE A TRANSFORMER?": GOSUB 1010 160 VTAB VT + 1: HTAB 3: CALL 762 I NPUT FI$ 170 ONERR GOTO 190 180 PRINT D$"OPEN"F1$: GOTO 210 190 5 = PEEK (222): IF E = 4 THEN E -7 195 IFE< SE"F19 200 CALL 768: GOSUB 1090: GoTo 150 210 PRINT DG"READ"F19 220 ONERR GOTO 250 = “CHARGEMENT DU FICHI GOSUB 1010: VTAB 5: INVERS - F19: GosuB 1010 1 TO 2000: CALL 762 INP UT AS (I): & As + 250 CALL 768:N1 - I 260 PRINT D$*CLOSE*F1$ 270 IF I < 2 THEN PRINT DS"DELETE" FI$:E - 7: COTO 200 280 REM RECHERCHE DES LABELS... 290 REM ...APPLESOFT OU MONITEUR 300 HOME :R$ = "VOICI LA LISTE DES IABELS": GOSUB 1010: VTAB 3:R$ ~ "DE LA ROM APPLESOFT OU MONITEU R:": GOSUB 1010 310 FOR I = 1 TO N1:K - LEN (A$(I) ) = 6: IF K < 3 THEN 110 320 BS = MIDS (A$(I),K,4):C$ - LEF TS (B$,1): IF C$ = "=" ORCS =" u" THEN 340 330 GOTO 410 340 AS = RIGHTS (BS, 2) 350 IF RS = "SD" OR BS = "SE" OR BS = "SF" THEN 370 360 GoTo 410 370 IF CS = "=" THEN 2$(J) = (AS(I),K- 2): 628+: > 11 THEN PRINT D$*CLO : NEXT lig=1 LEFTS GoTo 39 r) 380 IF CS = "U" THEN 2S(J) = (AS(T),K = 4): & 23 + 390 PRINT 2$(J) 400 T= I+) LEFTS 420 N2 = J -1 430 REM INCLUSION DES BRK 440 ONERR GOTO 460 450 FS = F$(3): PRINT DS"BLOAD"FS: G oro 470 460 CALL 768: GOSUR 1080: GOTO 440 470 CALL 37500 480 FORI = 1 70 N1 490 IF INT (I / 500) = 1 / 500 THE N_ PRINT : "PATIENCE JE FA CALL 37500: PRI PRINT NT "C'EST FINI": 500 FORJ= 1 70 12 Pom's n° 23 25 510 IF MIDS (AS (I),d,1) < HEN 670 5205-5 + 2: IF MIDS (AS(I),J,2) < > "S" THEN 550 530-5 + 2: IF MIDS (AS(I),I,1) < > "R" THEN 670 540 2 — 218: GOTO 590 550 IF MID$ (AS(I),J,1) < HEN 670 560 J - J+ 1: IF MIDS (AS(I),I,1) <> "P" THEN 670 570 28 = 22s 560 REM ON A UN JSR OU UMP 590M =o +2 600 Ys 610 IF J > 4 THEN Yo = a- 4) 620 FOR K ~ 1 70 N2 630 L - LEN (Z$(K}) 640 IF LEN (AS(I)) N 660 650 IF MIDS (AS(I),M,L) ~ 29(K) TH EN AS(I) ~ YS + 29 ¢ 28(K): PRIN T AS(I), "LIGNE N{ "7Iz PRINT :K 2 pe? > MT LEFTS (AS(IT -M+tleL THE 660 NEXT K:J = 12 670 NEXT J: NEXT I 680 HOME : PRINT "VOULEZ-VOUS SAUVE R LE FICHIER TRANSFORME"; PRINT : PRINT SUR DISQUETTE 2 <0,N>"; 690 GET RS 700 IF RS = "N” THEN END 710 IF RS < > "0" THEN 690 720 PRINT 730 F2S = FI$ + ™.L0" 740 ONERR GOTO 760 750 PRINT DS*"OPEN*F2S: PRINT DS"DEL ETE"F2$: PRINT DS*OPEN"F2S: PRIN T DS"WRITE"F2S: GOTO 770 760 CALL 768: GOSUB 1080: GOTO 749 770 FOR I= 1 TO NI 780 PRINT AS(I): NEXT 790 PRINT DS"CLOSE"F2S 800 END 1000 REM SOUS-PGM DE MESSAGES D'ERR FUR 1010 HTAB (40 ~ LEN (RS)) / 2: PRI NTRS: NORMAL : RETURN 1020 VTAB 21: PRINT "APPUYEZ SUR RE TURN POUR UN NOUVEL ESSAI": VTA B 23: PRINT " OU APPUYEZ SUR E SCAPE POUR QUITTER";: RETURN VIAB 19:RS = "POUR VOIR LE CAT ALOGUE TAPEZ 2": GOSUB 1010: RE TURN 1030 1040 VTAB 23: HTAB 38: GET RS: IF ASC (RS) = 13 THEN HOME :VT = 10; RETURN 1050 IF ASC (RS) = 27 THEN END 1055 ONERR GOTO 190 1060 IF ASC (RS) = 63 THEN HOME : PRINT DS; "CATALOG": GET RS:VT = 23: RETURN 1070 GoTo 1040 1080 E = PEEK (222) 1090 HOME : VTAB 5 1100 ON E GOTO 1190, 1190, 1190, 1190, 1210, 1210, 1230, 1170,1110, 1150, 250, 1150, 1150 1105 PRINT CHRS (7);"BREAK IN "; P EEK (218) + PEEK (219) * 256: END : RESUME 1110 R$ = "DISQUETTE PLEINE": GOSUB 1010: VTAB 10:R$ = "VEUILLEZ CH ANGER DE DISQUETTE": GOSUB 1010 1120 GOSUB 1020: GOSUB 1040: RETURN 1130 R$ = "FICHIER NON TROUVE" 1135 GOSUB 1010: VTAB 10:RS = "vous AVEZ TAPE:"; GOSUB 1010: VTAB 12: INVERSE :R$ = F1S: GOSUB 10 10 GOSUB 1020: GOSUB 1030: GOsUB 1040: RETURN 1190 RS = "LE FICHIER SOURCE NE PEUT ETRE"; GOSUB 1010; VTAB 7:RS = “QU'UN FICHIER DE TYPE 1 GOSUB 1010: VIAB 10:K$ = "CREE PAK L'ASSEMBLEUK BIG MAC": GUS ue 1010 GOsUB 1020: GuSsUB 1030; GosUB 41040: KETURN 1170 RS = “VERIFIEZ LA FERMETURE DE LA PORTE": GUSUB 1010: VYAB 12: R$ = “OU PLACEZ UNE DISQUETTE D ANS LE LECTEUR™: PRINT RS GOSUB 1020; GOSUB 1040: RETURN 11490 1160 1180 1190 RS — "DISQUETTE PROTEGEE": CosU B 1010: VTAB 10:R$ = "VEUILLEZ ENLEVER LA PROTECTION ET": CosU B 1010 GOSUB 1020: COSUB 1040: RETURN RS - "LE FICHIER " + FS +" EST ABSENT": GOSUB 1010:R$ = "VEUI LLE2 PLACER LA BONNE DISQUETTE ET"; VTAB 7: GOSUB 1010 GOSUB 1020: COSUB 1040: RETURN 1250 R9 = “NOM DE FICHIER INCORRECT” GOTO 1135 Source ‘T.NAVETTE’ Assembleur Big Mac 1 2 3 ae ” se NAVETTE * 60 ” 7 ” @** PAR Jean paul ARBEL ** re * 10 1] seeteseeessnssesssensssesees 12 33 one $300 1 AMPERV = © S3F5 15 url, = $n000 16 RAMI = SCI 17 RAMZ = SC 18 ROM = sco82 19 ROM? - score 20 ROMP == $c0aT 21 TRO - SPPRE 22 23 teeeenessressresarenenenese ee 24 *** VRCTORISR T.!AMPRRSAND #9 25 26 TDA 45a 27 STA AMPERV mA 10a #eDRRUT 29 STA AMPERV+2 0 LOA #>0EB0T 3 STA AMPERV+2 32 RTS VECTORISE LE BREAK *##* JSR COMMUT ——;Commute 1a R (OM et le Rank 1 ou 2 oo LDA #¢00 Vectorize le ARK vers NAVETTE 39 STA TRO 40 LDA $360 a STA IRQ a JSR UTIL sExéoute Ltut ilitalre aa BIT ROW Retour au BA SIC “a ars 45 RANK = DFR $80 20= Bank 1, $80 = Bank 2 49 ** NAVETTE entre 1a RAM et 1a ROM ** SO sasee8 0 s1 s2* Sauvegarde des paranétres 53 co STA SAVA aa 54 STY SAVY ” 55 PLA 56 STA SAVP 2 57 LDA $6 se STA SAV6 oRE 59 IDA $7 60 STA SAV? +R? 6 PLA 62 STA $6 DRL BREE 63 PLA 4 STA 37 ADRH BRES2 6s 66 * Recherche I'instruction eprés le BR 6 oe WA 36 oo BNE SAUT 9 DEC $7 70 saur =e $6 m1 Loy 432 72 goUCLE LDA ($6),¥ —_;Praneniesion de 1'nateuction 23 STA INSTR, Y 74 Dey 25 BPL BOUCLE 7 cue #S4C 4ORCODE — IMP 7 BEQ JUMP 79 cue 4S6C ZOPCODE ~ Jur Indirect ? 79 BEQ JUMP 30 CMP S70 FOPCODE - Mr préindéxé ? a BEQ) JUMP 92 83 * Calcul adresse de retour en Carte 1 engage (souf si JuD) a4 cle 65 LOA 96 56 aoc 432 ZADRL BRK+3 37 TAY 98 LOA $7 39 aoc #50 ZADRH BRE+3 90 PHA sADRII Retour utilitaire - 1 2 YA 92 PHA ADRL Retour utliitalre ~ 2 93 94 * Restauration des paranétres 96 JUMP = «BIT BANK sBank 1 ou 2 37 BPL Jt 98 BIT ROM2 99 BIT ROM2 100 UMP 2 101 Jt BIT ROME 102 BIT ROME 103 v2 LDA SAV6 2R6 104 STA 36 105 LOA SAV7 aR? 106 STA $7 107 Lor savy a 108 LOA SAVE 2P 109 PHA 120 ‘LOA SAVA aA ua PLE 42 JSR INSTR u3 dia oe 119" COMMUTE LA CAKTE LANGAGE * 447 commur— eHE 48 BIT BANK Bank 1 ov 2 uy BeL CL 41Z0 BIT RAMZ 121 BLT KAMZ 422 ume ce 123 cL BIT KAML 124 BIT KAML 4125 C2 PLE 126 KIS 127 128 teeeeessreesrensenen: 129 ** EXECUTE L'INSTRUCTION ** 131 INSTR DS 3. sInstruction aprés le BRK 132 RTs 133 ey ereereeteerererereeeeeeeteneay 135 ** SAUVEGARDE PARAMETRES ** 136 137 SAVA oS 138 SAVY OS 139 SAVE OS 140 SAVé DS 141 SAV? oS Routine ‘FRE(16)’ Aprés avoir saisi ce code sous moniteur, vous le sauvegarderez par BSAVE FRE(16),A$927C,L$1F9 927C- 4C 86 92 B5 9280- 6E C9 04 90 01 60 20 04 9288- 94 AG 73 AS 74 B6 6F 85 26 Pom's n° 23 — — 3290- 70 AY 55 AZ 00 85 SE 86 0300- A9 00 85 D& 68 AB 68 AG 92F8- 19 AS 1A 65 18 4C ES 92 $298- SF C5 5? FO 05 20 IF 93 0308- DF GA 48 9A 48 60 20 RI 9300- AO 02 Bl 18 18 65 18 &5 32A0- FO F7 A 07 05 OF AS 69 0320- 00 20 £3 DF 85 85 84 86 9308- 1A C8 BI 18 65 19 85 1B 92A8- AG 6A 85 SE 86 5F E4 6C 0318- 20 2C D5 C8 E8 20 E9 E3 9310- 60 AS 18 85 42 AS 19 85 92B0- DO 04 C5 6B FO 05 20 12 0320- 4¢ 9A DA 9318- 43 C8 Bl 18 85 08 C8 BI 92B8- 93 FO F3 85 94 86 95 AS 9320- 18 85 09 20 00 93 Ad 1A 92C0- 03 85 OF AS 94 AG 95 E4 9328- 85 3C AS 1B 85 3D AS 6D 92C8- 6E DO 07 C5 6D DO 03 4c 9330- 85 3E AS 6E 85 3F AO 00 92D0- BA 93 8&5 SE &6 5F AO 00 E P E. 5. 0 9338- 20 2C FE AS 6M 38 F5 08 92D8- Bl SE AA C8 Bl SE 08 C8 af skew . 9340- 65 6D AS 6E ES 09 85 6E 92E0- Bl SE 65 94 85 94 C8 BI 9348- A6 1B DO 03 20 Bl 00 60 S2F0- @A 30 D0 C8 BI SE AD 00 — 3358-01 DO FI 20 00 83 AS 1D 92F8- 0A 69 05 65 SE 85 SE 90 Sous ProDOS, 9360- FO 09 C6 08 AS 08 38 ES 9300- 02 E6 5F A6 SF E4 35 DO en 40 colonnes, 9368- 1D 85 08 AS IC FO 38 AO 9308- 04 C5 94 FO BA 20 1F 93 en 80 colonnes, 9370- 06 Bl 18 38 £9 01 91 18 9310- FO F3 Bl 5E 30 05 C8 Bl 9376- 68 Bl 18 £9 00 91 18 AO 9318- 5E 30 03 4C A9 93 C8 BI 9380- 02 Bl 18 38 E5 08 91 18 9320- 5E FO F8 85 18 C8 Bl 5E 9388- C8 Bl 18 E9 00 91 18 AS 9328- 85 19 C5 6F C8 Bl SE 85 9390- 1A 48 AS 1E 48 20 00 93 9330- 1A E5 70 BO E6 AS 19 CD Sur 9398- 85 43 AS 1A 85 42 68 85 9338- 14 94 AS 1A ED 15 94 90 93A0- 3D 68 85 3C 4C 2H 93 AO 9340- 68 AS 19 C5 6D AS 1A FS Apple J[+ 93A8- 06 RI 18 18 69 01 91 18 9348- 6E 90 DO A2 21 CA CA AS Apple lle 93B0- 88 BI 18 69 00 91 18 AO 9350- 19 DD 13 94 AS 1A FD 14 Apple //e+ 93B@- 02 Bl 18 18 65 08 91 18 9358- 94 90 F2 86 1B A2 03 BD 93C0- C& Bl 18 69 00 91 18 AS 9360- 13 94 9D 11 94 BD 14 94 Apple //ce 93C8- 6B 85 07 85 09 AS 6D 85 9368- 9D 12 94 BD 34 94 9D 32 93D0- 06 18 65 08 85 ED 85 08 9370- 94 BD 33 94 9D 31 94 BD 93D8- 90 04 £6 6E E6 09 AO 00 9378- 54 94 9n 52 94 AN 53 94 93E0- Bl 06 91 08 AS 07 C5 1E 9380- 9D 51 94 E4 1B E8 £8 30 93E8- DO 09 AS 06 Co 1A DU 03 9388- D6 A6 1B AS 19 9D 13 94 93F0- 4C 4C 93 C6 06 AS 06 C9 9390- AS 1A 9D 14 94 AS 18 9D Vous le trouverez 93F8- FF DO 02 C6 07 C6 08 AS 9398- 34 94 AS SE 9D 53 94 AS 9400- 08 C9 FF DO DR CE 09 AC 93A0- SF 9D 54 94 AS OF 9D 33 page 74. 9408- EO 93 93A8- 94 AS BF 18 65 5E 85 SE Vous avez déja 93B0- 90 02 E6 5F A6 SF AO 00 E.P.E. ? SSO PGCEG GOAL ee Iss Nous le mettrons a Récapitulation 93C8- 85 6F AS 70 E9 00 85 70 niveau ! ‘NA VETTE’ 93D0- BD 13 94 85 1C BD 14 94 93D8- 85 1D 88 CO FF FO 06 Bl 8s avoir saisi ce code sous 93E0- 1C 91 6F 30 F5 BD 33 94 Naik 9388-29 04 4A AB CB BD 53 94 ‘moniteur, vous le sauvegarderez par BSAVE NAVETTE,A$300,L$B6 93F0- 85 1C BD 54 94 85 1D AS H eos Beet owe face oe oe eae 7 VAR.OBU? 222-42 46 20 F5 03. a9 10 80 9400- CA CA 10 Bé AZ IF A9 00 f a wor 3 99 ee ot ere eseese - F7 5d if a do ced Aprés saisie de ce code sous moniteur, 0318- A9 03 8D FF FF 20 00 DO 9418- FF FF FF FF FF FF FF FF vous le sauvegarderez par : 0320- 2C 82 CO 60 80 8D B1 03 9420- FF FF FF FF FF FF FF 9428- FF FF EF FF EF FF FF BSAVE DIM.VAR.OBJ,A$927C,L$18E 0328- 8C B2 03 68 8D B3 03 AS 0330- 06 8D B4 03 AS 07 8D BS 9430. FF FF FF FF FF FF FF BUR gy 927c- Ad 6B a4 18 0338- 03 68 85 06 68 85 07 AS 2 a = Atel abe 9280- Ad 6C 84 19 AO 05 84 08 0340- 06 D0 02 C6 07 C6 06 AO Sa aa 9288- A2 00 86 07 86 1B 86 1C 0348- 02 R1 06 99 AN 03 88 10 9448- FF FF FF FF EF FF FF FF 9290- 86 1D 86 09 FO 19 20 D1 0350- F8 C9 4c FO 15 C9 6c FO 9450- FF FF FF FF FF FF FF FF Sea. GEE Eee we 9298- 00 DO 04 E6 1B DO 35 C9 0358- 11 C9 7C FO 0D 18 AS 06 92A0- 24 FO 11 C9 25 FO 33 C9 0360- 69 02 Ad AS 07 69 00 48 9460- FF OFF FF FF OFF OFF OFF OFF Biss ec ies San 92A8- CB FO 21 C9 C9 FO 20 95 0368- 98 48 2C 24 03 10 09 2c a 92B0- 06 £8 DO E2 E6 1D AS 07 0370- 81 CO 2¢ 81 CO 1 7E 03 MURS EAE An 92B8- 09 BU 8> U7 AU OL BL BB 0378- 2¢ 89 CO 2C 89 CO AD BA 92C0- 20 BA 00 FO OF 20 B1 00 0380- 03 85 06 AD BS 03 85 07 . ‘ ’ 92CB- C9 CB DO 03 4C 50 93 £6 0388- AC B2 03 AD BI 03 48 AD Routine ‘INPUT 92n0- 1¢ 4C 50 93 20 E5 92 4C 0390- B1 03 28 20 AD 03 08 2c 92D8- 11 93 E6 1D AS 06 09 80 0396- 24 03 10 09 2C 83 CO 2c Apras avoir saisi ce code sous 92E0- 85 06 4C B4 92 AQ 00 BI 03A0- 83 CO 4C AB 03 2C 8B CO moniteur, vous le sauvegarderezpar: -92E8- 18 C5 06 DO 07 ce Bl 18 03A8- 2C @B CO 28 60 00 00 00 BSAVE INPUT,A$300,L$23 92F0- C5 07 FO 1C 20 00 93 85 0380- 60 00 00 00 00 00 Pom's n° 23 e doute que personne n'ai jamais eu de problémes de lecture ou de correction sur une ligne malheureusement trop grosse pour ére claire ou encore pour que le curseur puisse la parcourir d'une cxtrémité a l'autre. D'autre part, certains possédent peut-étre un CRUNCHER (celui du Pom's 22 par exemple...), programme qui installe sur une méme ligne plusieurs autres consécutives en les séparant avec les ‘deux-points’ (:) habituels. Il est toutefois utile de pouvoir transformer son programme Applesoft afin qu'il n'y ait qu'une instruction par ligne car il est alors facile de lire un listing, de le comprendre et de le modifier. C'est ce que le DECRUNCHER est 4 méme de faire. Comment faire ? Pour I'utiliser, il suffit de charger par un LOAD le programme Basic comme vous le faites d’habitude, puis de taper : BRUN DECRUNCHER ou CALL 35072 sil est déja en mémoire. Les changements que le DECRUNCHER effectue sont : * une instruction par ligne sauf aprés IF étant donné que ce qui le suit est conditionné par le test ; * un renumérotage de 1 en 1 avec modification des GOTO, GOSUB, DEL, des THEN, LIST, RUN lorsqu'ils sont suivis de numéros de ligne, et enfin, des ON XX GOTO/ GOSUB. Il existe toutefois quelques HERUNCHER limitations : ¢ le texte original écrit en Basic ne peut prendre plus de 14336 octets soit 14 Ko, auquel cas il affichera : TEXTE TROP LONG ; ¢ ilne doit pas avoir plus de 640 lignes & l'origine. (Le nombre de lignes qui résulte du décrunchage n'est limité que par l'Applesoft lui-méme) ; + le programme décrunché ne doit pas pouvoir faire plus de 18688 octets, soit 18,25 Ko. (Le programme décrunché étant généralement plus important que l'original) ; * au cas ol le programme découvre un GOTO, GOSUB, DEL, LIST, se référant 4 une ligne inexistante, il enverra : PAS DE LIGNE X. Le principe Il est tout d'abord nécessaire, voire indispensable d'étudier tapidement la structure du texte d'un programme Applesoft en mémoire. L'adresse de début du texte se trouve en TXTTAB ($67.68) et la fin en PRGEND (SAF.BO). Ce sont donc les octets situés entre ces deux adresses qu'il s'agira de traiter. Ce traitement se déroulera globa- lement ainsi : + lire les 2 premiers octets qui représentent l'adresse de la prochaine ligne ; * lire les 2 suivants qui ne sont autres que le numéro de la ligne ; * puis étudier la suite de la ligne afin de trouver ‘:’ ; * sion les trouve, marquer la fin de la ligne actuelle par un octet nul puis commencer une nouvelle ligne sur laquelle on mettra la suite ; Patrice Neveu * sinon, passer 4 la prochaine ligne. En cours de route, 4 chaque fois qu'on lira une nouvelle ligne de loriginal, on mémorisera son numéro ainsi que celui de celle qui suivra. (N'oublions pas qu'il y a renumérotation !) Avec un tel processus, on obtient le programme décrunché, mais sans que les GOTO, GOSUB etc. soient modifiés. Une deuxiéme passe s'impose alors ; il faut : * lire la ligne comme précédemment mais en cherchant tous les mots-clé susceptibles d'étre suivis par un ou plusieurs numéros de ligne ; + identifier ce ou ces numéros et les rechercher dans la table construite précédemment ; * si on a trouvé, échanger l'ancien numéro par le nouveau qui est issu. de la renumérotation ; + sinon, il y a une erreur et on S'arréte ; * puis, si tout va bien, on passe a la prochaine instruction. Il est alors utilisable, mais mieux vaut le sauver avant car, s'il empiéte sur la page graphique 1 et qu'il l'utilise, gare aux problémes ! Enfin, 4 titre d'exemple, voici un listing et sa représentation en mémoire : 10 TEXT : 20 GOTO 10 HOME 0800- 00 09 08 OA 00 89 3A 97 O808- 00 11 08 14 00 AB 31 30 0810- 00 00 00 $801.802 : adresse de la prochaine ligne 28 Pom's n° 23 $803.804 : numéro de ligne décrunché s'écrira ainsi : $80B : token de HOME $000A = 10 0 TEXT $80C : fin de ligne $805 : token de TEXT 1 HOME $80D.80E : adresse de la 2 GOTO Oo prochaine ligne $80F.810 : numéro de la ligne $808 : fin de ligne 800- 00 07 08 00 00 89 00 OD $811 : token de GOTO $809.80A : adresse de la BOQ> 08:01 0-97 00-24 08-02 $812 : code ASCII de 0 ($30) prochaine ligne 10> 005830500 90.100 $813 : fin de ligne $80B.80C : numéro de ligne $814.815 : fin de programme $0014 — 20 ee $801.802 : adresse de la ee $80D : token de GOTO prochaine ligne = , $80E.80F : codes ASCII de 1 $803.804 : numéro de la ligne mi — des lignes suivantes ($31) et de 0 ($30 t et les numéros de lignes sont $810:: fin de ligne » $806 : fin de ligne inscrits avec l'octet bas suivi de $811.812 : fin de programme $807.808 : adresse de la Yoctet haut. prochaine ligne es Le méme programme mais $809.80A : numéro de la ligne gr ; Programme DECRUNCHER.S ‘DECRUNCHER DEMO’ Assembleur Big Mac 10 YEXT ; HOME : INVERSE : PRINT “ D i EMONSTRATION DE DECRUNCHAGE “: NO H LEE RMAL : POKE 34,1 20 PRINT “VOICI LE LISTING DE CE PROGRAMM ‘ ee E:": PRINT : LIST 6 30 VYAB 22: FLASH : PRINT “ FRAPPEZ UNE T 7 OUCHE POUR LE DECRUNCHER PUIS FAITES g teeenasensnseneeesensceneneeeeene LIST POUR VOIR LE RESULTAT";: GET R$: P 9 * DECRUNCHER 1.3 . RINT 2 NORMAL Ty seersebesas sepaneparsrceenepaiene 40 POKE 34,0: PRINT CHR$ (4)"BRUN DECRUN 5 PARSEAABICE NEVEY CHER™ 13 FERRE EEEEEAEUEEAEAAEAEAER TET TETE a* ’ 15 * = UNE INSTRUCTION PAR LIGNE # ig * SAUF APRES ‘IF* Sa 17 * - RENUMEROTATION DE 1 EN 1 # Ze les AVEC LES GOTO/GOSUB/RUN é 3 = LIST/ON/DEL REMIS A JOUR ’ Le méme programme, , cas ; mais ‘décrunché 21 * - SOURCE MAXIMUM: 14K # 22 * 640 LIGNES # 23 * - RESULTAT MAX. : 18.25K £ @ FRET 24+ 64000 LIGNES# 1 HOME 2 2 # 2 INVERSE 26 tHteeeeneeeesnenenansenneanenstee 3 PRINT" DEMONSTRATION DE DECRUNCHA 27 GE ss = 4 NORMAI, e 5 POKE 34,1 ai 6 PRINT "VOICI LE LISTING DE CE PROGRAMME. 32 BASIC —-EQU $0300 RETOUR A L'APPLESOFT EAs 33 STXTPT EQU $D697 7 ~PRINT MET TXTPTR A LA VALEUR DE & LIstT (TXTTAB) -1 9 VTAB 22 34 STROUT — EQU $DB3A SOUS-PROGRAMME D'AFFICHAGE 10 FLASH D'UNE CHAINE 11 PRINT " FRAPPEZ UNE TOUCHE POUR LE DEC eS bli ped pele iy hee pa TSIEN GEE RUNCHER PUIS FAITES LIST POUR VOIR LE 37 FIN FQU SEC4A NOMBRE FLOTTANT ==> FAC PA RESULTAT"; R CHRGET GET R$ 38 LINPTR EQU $ED24 CONVERTIR ET AFFICHER X,A PRINT EN DECIMAL NORMAL 39 FouT EQU SED34 FAC ~-> CHAINE DE CHIFFRE POKE 34,0 40 CROUT EQU $FC62 RETOUR CHARIOT & PRINT CHRS (4) "BRUN DECRUNCHER" é au Eiigenen Bi CONES 43 LIMITE EQU $4000 LES DEUX ZONES: $0800. 3FFF J Pom’'s n° 23 29 7$4000.4900 103 STX LINLEN DE LA LONGUEUR DE LA LIGNE 44 ESPACE — BQU $3800 ETENDUE DE LA 1ERE ZONE 104 STX LINNUM ET DE SON NUMERO 45 105 STX LINNUM+2 46 106 47 LINADR EOU $06 ADRESSE LIGNE COURANTE 107 IDA #>TABLE PREPARE LA TABLE OU SER( 48 TXTPTRS EQU $08 SAUVEGARDE DE TXTPTR RANGES LES 49 NOMPTR © BQU 918 POINTEUR 108 STA TABPTR+2 ANCIENS NUMEROS DE LIGNE 50 LINLEN EQU $10 LONGUEUR NOUVELLE LIGNE UIVIS DES 51 ONFLAG = EQU SIE =1: ON XX, >=2: ON XX GOTO 109 LDA #<TABLE NOUVEAUX » 20 SINON 110 STA TABPTR+1 52 LISTFLAG EQU $1F ~ 1 SI LIST (XXXX), 0 SINO 111 N 112 LDX #90 MAIS IL FAUT LA REMPLIR D@ 53 LINNUM —-EQU $50 REGISTRE CONTENANT LE NUME SEF AVANT: RO DE LIGNE 113 LDA #<TABLE 54 TXTTAB —- EQU $67 DEBUT DU TEXTE RASTC 114 STA CLR+1 55 LOMEM EQU $69 DEBUT DE LA ZONE DES VARIA 115 LDA #>TABLE BLES SIMPLES 116 STA CLR+2 56 ARYTAB —-EQU $6B DEBUT ZONE DES TABLEAUX = 117 IDA #SFF 57 STREND —_EQU SéD FIN DES TABLEAUX, DEBUT DE 118 LbY #500 ZONE LIBRE 119 CLR STA TABLE, ¥ 58 HOHO EQU $9E 2EME OCTET DE FAC 120 INY 59 MOH EQU $9F SEME UCTET DE FAC 121 BNE CLR 60 PGREND -EQU SAF ADRESSE DE LA FIN DU TEXTE 122 INC CLR+2 Dil PROGRAMME 123 INX 61 CHRGET — EQU $D1 PREND LE PROCHAIN CARACTER 124 CPX #10 — OU TEXTE 125 BNE CLR 62 CHRGOT — EQU $87 PREND LE CARACTERE POINTE 126 ACTUELLEMENT 127 63 IXTPTR —-EQU $B8 POINTEUR DE CARACTERE DANS 128 * SAUVE LE TXTPTR LE TEXTE 129 teennn nnn -- 64 DELFLAG QU SCE = 1 SI DEL XXXXX (,XXXXX), 130 =0 SINON 131 LDA TXTPTR 65 TEMP1 EQU SEB 4 OCTETS (SER.FF), PARTIE 132 STA TXTPTRS DE CURGET 133 LDA TXTPTR+1 +66 CHAINPTR EQU SEE POINIEUK DS LA CHAINE DUN 134 STA TXTPTRS+1 0 DE LIGNE 135 67 REMFLAG QU $FC =1 SI ON FST DANS UN REM, 136 *--—- 0 SINON 137 * VERIFIE SI LE PROGRAMME PET 68 IFFLAG QU SED =1 SI ON EST DANS UN IF, 0 138 * ETRE DECRUNCHE SINON 139 *-— 69 ACC EQU SFE SAUVEGARDE DE L'ACCUMULATE 140 oR 141 LDA PGREND+1 C'EST LE HAUT DE LA FIN 0a 70 GUILLELAG EQU $FF -1 SI ON EST DANS UNE CHAI ‘PROGRAMME NE, 0 SINON 2142 CMP #>LIMITE DEPASSE LA LIMITE FIXEE ? n 143 BCC BEGIN NON, ON PEUT Y ALLER... 72 CUILL EQU $22 TOKENS APPLESOFT 144 73 DEL BQU 985 145 74 GOTO EQU SAB 146 * ERREUR, IMPOSSIBLE A DECRUNCHER 75 RUN EQU SAC 147 76 IF FQU SAD 148 77 GosuB EQU $80 149 LDY #>LENMSG 78 REM EQU $B2 150 LDA #<LENMSG 79 ON EQU $B4 152 vSR STROUT AFFICHER LE CHARMANT MESSA 80 LIST EQU $BC GE QUI SUIT: 81 THEN EQU $c4 152 JSR BELL SUIVI D'UN BIP DE MAUVAIS 82 AUGURE 83 153 UMP WAOU REMETTRE TOUT EN ORDRE AVA 84 #---- NT DE SORTIR 85 * INITIALISE 154 155 LENMSG HEX @D REVENIR A LA LIGNE 156 ASC "TEXTE TROP LONG" 88 LDY #SEA SEA = NOP 157 HEX @D00 89 IDX #3 ON VA DONC MODIFIER CHRGET 158 (ET CHRGOT) 159 90 INIT LDA $BE,X EN Y METTANT 4 NOP AFIN D' 160 * COMMENCE A DECRUNCHER EVITER DE 161 * 9 STA TEMP1,X SAUTER LES ESPACES DANS UN 162 REM OU UNE 163 BEGIN JSR STXTPT FIXE TXTPTR AU DEBUT DU PA 92 STY $BE,X CHAINE. DE CARACTERES. OGRAMME -1 33 DEX 164 LDY TXTTAB ADDITIONNE LA LONGURUR DE 94 BPL INIT L'ESPACE 95 165 STY TXTPTR2+1 DISPONIBLE A L'ADRESSE DE 96 INX REMETTRE X-0 POUR L'INITIA DEBUT DU LISATION 166 STY LINADR TEXTE -> TXTPTR2 POUR CHRB 97 STX GUILLFLAG DU DRAPEAU A CUILLEMETS oe 98 STX IFFLAG IE 167 LDA TXTTAB+1 — -> LINADR 99 STX REMFLAG REMARQUES 168 cLe 100 STX ONFLAG ON XXXXX GOTO/GOSUB 169 ADC #>ESPACE 101 STX LISTFLAG — LIST (XXXX, XXXX) 170 STA TXTPTR2+2 102 SIX DELFLAG DELETE XKXX (, XXXX) 171 STA LINADR+1 <a Pom's n° 23 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 220 221 222 223 224 225 226 227 ze 223 LIGNE LIN LINCHR LINCHRS LINCHR6 LINCHR4 LINCHR1 BOI DECRUNCH Del BOL JSR CURGET JSR CHRPUT JSR CHRGET cLe ADC #>ESPACE JSR CHRPUT JSR CHRCET STA NUMPTR JSR CHRGET STA NUMPTR+1 JSR LINTAB JSR LINPUT JSR CHRGET STA ACC BEQ EOI LDA ACC JSR CHRPUT CMP #REM BNE LINCHR6 LDA #1 STA REMFLAG CMP #IF BNE LINCHR4 LDA #01 STA IFFLAG CMP #GUILL BNE LINCHR1 LDA GUILLFLAG EOR #$01 STA GUILLFLAG UMP LINCHR LDA ACC BNE DECRUNCH JSR EOL UMP BOL LDA GUILLFLAG BNE LINCHRS TDA REMFLAG BNE LINCHRS LDA IFFLAG BNE LINCHRS LDA #0 JSR BOL LDA LINADR JSR CHRPUT LDA LINADR+1 USR CHRPUT INC LINNUM BNE DC1 INC LINNUM+1 UMP LIN JSR CHRGET PREND & STOKE L'ADRESSE DE LA PROCHAINE LIGNE PREND LE NUMERO DE LA LIGN B A METTRE DANS NUMPTR POUR QUE LINTAB ET LINPUT S'EN SERVENT PRENDRE UN CARACTERE EOI=FIN D' INSTRUCTION: FIN DE LIGNE METTRE LE CARACTERE POUR I. E RESULTAT MAIS CE N'EST PAS UN REM.. SINON IL FAUT SE LE SIGNAL ER SI CE N'EST PAS UN IF. AUTREMENT, LE SIGNALER SI CE N*EST RIEN DE TOUT C ELA SI PAS DE GUILLEMET (0) AL ORS DEVIENT 1 SI ON EST DEJA DANS UNE CH AINE (1) CA DOIT DONC DEVENIR 0 PASSE AU PROCHAIN CARACTER E CETTE FIN D' INSTRUCTION C’ EST QUOI ? C'EST UN : ALORS CREER UNE AUTRE LIGNE SINON C'EST UNE FIN DE LIG NE (00) ST CE : RTATT DANS UNE CHA INE, UN REM OU UN TEST (IF) ALORS ON N E DOIT PAS DECRUNCHER SOUS PEINE DE C ATASTROPHE ! CALCULER ADRESSE DE LA PRO CHAINE LIGNE QU'IL FAUT STOKER EN DEBUT DE LA LIGNE ACTUELLE ET AUSSI A LA FIN POUR LA PROCHAINE. INCREMENTE LE NUMERO DE LI GE POUR FAIRE LA PROCHAINE... VA LE STOCKER PUIS LIT LA LIGNE IL FAUT PRENDRE LES 2 PROC 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 HAINS OCTETS JSR CHRGET POUR SAVOIR SI ON A FINI BEQ FINI CE QUT FST LR CAS ST A=00 IDA LINADR SINON ON REMPLACE CES 2 0¢ TETS JSR CHRPUT IDA LINADR+1 JSR CHRPUT INC LINNUM (EN FAIT ICI, ON EST EN D ECRUNCHAGE ) BNE BOL1 (MAIS ON FAIT PAREIL QUE PRECEDEMENT) INC LINNUM?+1 BOLL UMP LIGNE FINI LDA 480 METTRE 3 OCTETS NULS POUR MARQUER LA JSR CHRPUT FIN DU TEXTE DECRUNCHE JSR CHRPUT JSR CHRPUT UMP AJUSTE * C'EST DECRUNCHE, RENUMEROTE wAOU IDA #$00 MAINTENANT QUE LES GOTO ET GOSUB SONT JSR CHRPUT MIS A JOUR, ON MARQUE LA F IN DU PROGR. JSR CHRPUT QUI EST DORENAVANT TERMINE JSR CHKPUT LDA TXTPTRS REMET LE TXTPTR TEL QU'ON L'A TROUVE STA TXTPTR AVANT DE DECRUNCHER LDA TXTPTRS+1 STA TXTPTR+1 IDX #3 ET RETIRER LES NOP POUR RF. MBTTRE CHRGET i fi NY APPLE COMPUTER FRANCE recherche pour développer son Service Clientéle, des SUPPORTS TECHNIQUES ¢ Possédant une trés bonne connaissance de la micro-informatique. ¢ Capables de proposer des solutions utilisant les produits APPLE. @ Ayant le sens du service et de la communication. ¢ Disponibles rapidement pour rejoindre Apple Computer France au si¢ge des ULIS. ¢ Connaissance technique du matériel, langages de pro- grammation, télécommunications souhaitée, 5 i 6 Merci d’adresser lettre manuscrite, C.V, et prétentions (sous réf, D 1231) a; a Jean-Luc FARAT APPLE COMPUTER FRANCE Avenue de l’Océanie 4 Z.A. de Courtabeeuf - B.P. 131 91944 LES ULIS Cedex. Apple Pom's n° 23 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 260 FINI * AJUSTE LES GOTO / cosUB AJUSTE COPYLIN CHRCHGO CHRCHGOO CHRCHGOL CHRCHGOZ LDA STA STA STA STA STA LDA STA STA STA STA PIA PLA oMP LDX STX STX INK STX STX STA STA STA JSR JSR JSR JSR BEQ BEQ CMP BEQ TEMP1,X SBE, X FINI1 TXTPTR2+1 PGREND LOMEM ARYTAB STREND TXTPTR2+2 PGREND+1 LOMEM+1 ARYTABHL STREND+1 BASIC A SON ETAT D'ORIGINE ET FIXE DIFFERENTS POINTEU RS HOP, C'EST FINI TXTPTR2+1 LINADR TXTTAD+ TXTPTR2+2 LINADR+1 #>LIMITE TXTPTR+1 EOLO CHRGET CHRPUT CHRGET waou #>ESPACE CHRPUT CHRGET CHRPUT CHRGET CHRPUT ONFLAG #2 GOFOUND LISTFLAG TESTNUM DELFLAG E GOFOUNDI CHRCET CHRPUT COPYLIN 40N cHRCHGO2 ONFLAG curcHGoo #G0TO GOFOUND #COSUB GOFOUND #RUN TESTNUM INITIALISE: TA LONGUEUR DE LA LIGNE LE POINTEUR SOURCE LE POINTEUR RESULTAT L'ADRESSE DE LA LIGNE EN C ours CALCULE ADR. LIGNE QUE L'0 N COMMENCE PRENDRE L'ADRESSE DE LA LI GNE SUIVANTE ET LA STOCKER COMME RESULT ar SI LA PARTIE HAUTE EST NUL LE C'EST FINI SINON CE RESULTAT COMMENCE EN $0800 C'EST AU TOUR DU NUMERO DE LIGNE CONTENU EN 2 OCTETS ON RECOPIE LA LIGNE EN REC HERCHANT UN SAUT (GOTO / GOSUB OU THEN XXXKK) 00 SIGNIFIE UNE FIN DE LIC NE GOTO: TRAITEMENT SPECIAL D E LA SUITE GOSUB EGALEMENT LE RUN (XXXXX) EST TRAITE COMME UN THEN 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 343 350 351 352 353 354 355 356 357 358 359 360 361 36z 363 364 365 366 367 36R 363 370 371 se 373 374 375 376 377 378 379 380 3a1 382 383 384 CMP BNE INC BNE CHRCHGO3 CMP ANE Inc BNE CHRCHGOS =CMP aLIST CHRCHEO3 LISTFLAG CHRCHGO 4#DEL CHRCHGOS DELFLACG CHRCHGO #THEN QUAND AU THEN, PEUT-ETRE.. CE N'EST RIEN DE TOUT CELA + CONTINUER CHRCHGO * POUR LE THEN IL FAUT UN NUMERO . SSEE TESINUM JSR CHRGET ON PREND LE CARACTERE SUIV ANT LE THEN CMP #530 ASCII INFERIEUR AU CODE DE 0 BCC CHRCHGOl = AU QUEL CAS ON CONTINUE DE COPIER... CMP #534 SINON PEUT-ETRE EST-CE SUP ERIEUR A 9 ? BCS CHRCHGOl ET ALORS ON COPIE BETEMENT LA SUITE BCC GETEND SINON ON TRITURE LE NUMERO DE LIGNE !! * POSITIONNE SUR LE NUMERO GOFOUND INC ONFLAG GOFOUNDI JSR CHRGET POUK LES GOTO / GOSUB (ET ASSIMILES) * TRANSFORME LA CHAINE EN 2 OCT. GETEND © EQU * JSR FIN GRACE A CUIRGET ON CHARGE D ANS FAC LE NO JSR GETADR PUIS ON LE TRANSFORME EN Z OcTETS LDA #>TABLE ON SE PLACE AU DEBUT DE LA TABLE OU STA NUMPTR+1 — SONT RANGES LES ANCIENS NU MEROS DE LDA #<TABLE LIGNES ET LEURS REMPLACANT 3 STA NUMPTR IDENTIFY LDy #0 LDA (NUMPTR),Y LE BAS DU VIEUX NUMERO DE LA TABLE EST CMP LINNUM COMPARE A CELUI QU'ON RECH ERCHE BNE NEXTIDO SI CE N'EST PAS LE MEME, A U SUIVANT ! Iny LDA (NUMPTR),Y PUIS ON PASSE AU HAUT DU N UMERO CMP #250 QUI DOIT ETRE INF. 2494256 +255 = 63999 BCS GOERR SI C'EST PLUS ALORS ERREUR iy CMP LINNUM+1 — SINON ON COMPARE AU HAUT R ECHERCHE BEQ CHANGE ET ON LE CHANGE SI C'EST T ROUVE NEXTIDO EQU * ON PASSE AU NUMERO SUIVANT 32 Pom's n° 23 385 386 387 398 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 41a 419 420 421 422 423 124 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 44a DE LA TABLE CMP 4SFF DES $FF SIGNALENT LA FIN D 5 LA TABLE BEQ GOERR ALORS LE NUMERO N'EST PAS TROUVE, ERR ! NEXTID LDA NUMPTR AUTREMENT, ON VA 4 OCTETS PLUS LOIN cLc POUR TROUVER UN NOUVEAU NU MERO ADC #4 ( 2 POUR L'ANCIEN + 2 POUR LE NOUVEAU ) STA NUMPTR BCC NEXTEND PAS DE RETENUE POUR L*ADDI TION INC NUMPTR+1 — SINON, EN TENIR COMPTE NEXTEND JUMP IDENTIFY ET CA REPART POUR UN TOUR. * ERREUR, UN NUMERO DE LIGNE QUI * EST APPELE N'EXISTE PAS GOERR LDY #>GOMSG AFFICHER UN IGNOBLE MESSAG E D'ERREUR LDA #<GOMSG JSR STROUT EDA LINNUM+1 ON PREND LE NUMEKO DE LIGN E RECHERCHE LDX LINNUM JSR LINPTR POUR L'AFFICHER JSR CROUT PUIS ON PASSE A LE LIGNE USK BELL AVEC UN BIP AGACANT UMP WAOU GOMSG HEX 8D ASC "PAS DE LIGNE ” HEX 00 ee = = “ ICI S'EFFECTUE LE CHANGEMENT DE * NUMEKO DE LIGNE CHANGE —INY ON POINTE DANS LA TABLE SU R LE NUMERO LDA (NUMPTR),Y TROUVE APRES GOTO/GOSUB DO NC ON STA MOH POURSUIT EN PRENANT LE NOU VEAU QUI EST any 45SU DE LA RENUMEKOTATION ET ON LE MET LDA (NUMPTR),Y DANS FAC. STA HOHO Y eee a = * TRANSFORME LE NUMERO EN CHAINE LOX #$90 CECI EST PRESQUE UN LINPTR ($ED24) SEC CAR CA COMMENCE PAREIL, JSR AXFAC JSR FOUT STY CHAINPTR+1 MAIS CA N'AFFICHE PAS FAC ! STA CHAINPTR LDY 40 WRITENUM LDA (CHAINPTR), YPRENDRE LA CHAINE REPRESEN TANT LE BEQ WRITEND NOUVEAU NUMERO, ET L'INCLU RE DANS LE JSR CHRPUT PROGRAMME DECRUNCHE APRES LE GOTO INY LE GOSUB OU ENCORE LE THEN BNE WRITENUM WRITEND JSR CHRGOT PUIS IL FAUT LIRE LE DERNL ER CARACTERE JSR CHRPUT LU APRES LE NOMBRE ET LEC 445 446 447 448 449 450 451 RRQ WRITENDI UMP CHRCHGO EQU * UMP COPYLIN * S0US-PROGRAMMES OPIER SI C'EST UN 0 -> FIN DE LI ONE SINON, SUITE DE LIGNE... END OF LINE CALCULE L'ADRE SSE DE LA LIGNE SUIVANTE EN ADDITION NANT LA LONGUEUR DE LA LIGNE ACTUE LLE ET SON ADRESSE DE DEBUT LE RESULTAT EST REMIS DANS LE PROGRAMME POUR CONSERVER SA COHERENC E CECI SERVIRA A LA LIGNE SU IVANTE ON VA RECOMMENCER UNE LIGN & DONC: LONGUEUR DE LA LIGNE - 0 ON XXXX GOTO/GOSUB EST TER MINE LIST XXXXX, XXXXX FGALEMENT » AINSI QUE DEL XXXXX, XKKXK LA CHAINE DE CARACTERE ENT RE GUILLEMETS LE TEST AVEC IF LE REM OU IL NE FALLAIT RI EN CHANGER CETTE ROUTINE EFFECTUE LA TACHE OPPOSEE A CELLE DE CHRGET, R REMETTRE UN OCTET PRIS PAR CHRGET, S LE RESULTAT EN METTANT A JOUR LA LONGU EUR DE LA LIGNE. A SAVOI DAN CECI POUR CONSERVER LE REG ISTRE D'ETAT STOCKE LE NUMERO DE LA LIG NE ACTUELLE EN 2 OCTETS MIS EN LINNUM (950.52) 452 *. 453 454 EOL zQu * 455 JSR CHRPUT 456 FOLO LDA LINADR 457 IDX LINADR+1 458 IDY #0 459 cic 460 ADC LINLEN 462 STA (LINADR),¥ 46

Showing the first 100000 of 255879 characters.

mp.ls