ZX81 France, les fichiers...

Modérateur : XavierSnp

Avatar du membre
jsm
Villager
Messages : 5
Enregistré le : 20-06-2018 12:54

Re: ZX81 France, les fichiers...

Message non lu par jsm » 13-11-2018 01:09

Merci pour ce joli teasing et cette introduction.

Pour les 2,2ko de gagné, c’est énorme :lol:

Avatar du membre
XavierSnp
Legendary
Messages : 511
Enregistré le : 22-02-2012 08:00
Contact :

Re: ZX81 France, les fichiers...

Message non lu par XavierSnp » 14-11-2018 04:27

Pour les 2,2ko de gagné, c’est énorme
et sans toucher aux valeurs en virgules flottantes !
Juste en concaténant les 'PRINT' et en réorganisant certaines routines.

2,2k c'est largement suffisant pour faire un menu déroulant en ASM pour le choix des actions...
:D

[EDIT]
Et encore 1665 octets... mais, dur de gagner plus !!!
4269 octets de libre...

Mais on perd grandement en vitesse d'exécution.
:shock:

Code : Tout sélectionner

# REM 5Z_Y _Y FW4__
     0  REM [HEX:\
21,BF,03,3E,80,D7,3E,00,\
2B,BC,20,F7,C9 ]


# REM (C)1984 BY CYRIL DUFER
    10  REM [HEX:\
10,28,11,1D,25,24,20,00,\
27,3E,00,28,3E,37,2E,31,\
00,29,3A,2B,2A,37 ]

    15 RAND 
    20 LET G$="µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ"
    30 LET F$="´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´"
    40 LET O$="********************************"
    50 DIM Q(CODE "8")
    60 DIM W$(VAL "9")
    75 LET S=VAL "4"
    77 LET G=VAL "16514"
    80 LET H3=NOT PI
    90 LET H4=NOT PI
   100 LET H5=NOT PI
   110 LET H10=NOT PI
   120 LET H1=CODE "="
   130 LET H2=CODE "¿"
   140 LET H11=NOT PI
   150 LET H12=NOT PI
   160 LET H30=NOT PI
   170 LET H6=NOT PI
   180 LET H14=NOT PI
   190 LET M1=PI/PI
   210 LET I=INT (RND*H1)+S
   230 LET P=INT (RND*H1)+S
   250 LET D=INT (RND*H1)+S
   270 LET R=INT (RND*H1)+S
   290 LET VO=INT (RND*H1)+S
   310 LET F=INT (RND*H1)+S
   330 LET E=INT (RND*H1)+S
   350 LET VI=INT (RND*H1)+S
   370 LET C=INT (RND*H1)+S
   390 LET A=INT (RND*H1)+S
   410 LET B1=INT (RND*H1)+S
   430 LET B2=INT (RND*H1)+S
   440 LET J=INT (RND*H1)+S
   450 GOSUB VAL "2920"
   460 PRINT AT CODE "+",VAL "7";"VOTRE NOM :       ";
   470 INPUT W$
   480 LET W$=W$( TO VAL "9")
   490 PRINT AT CODE "+",CODE "<";W$
   500 RAND SIN SIN SIN SIN PI
   510 RETURN 
   540 PRINT AT VAL "2",VAL "7";"Ž«transit«reussi«";AT VAL "5",INT PI;"vous«etes«dans«l•obscurite";AT VAL "9",PI/PI;"la«piece«est«assez«oppressante";AT VAL "11",VAL "5";"et«sent«le«renferme–––"
   580 LET N$="‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘"
   585 PRINT AT VAL "6",INT PI;N$
   590 PRINT AT CODE "+",VAL "7";"que«faites‘vous«Š"
   595 GOSUB VAL "2710"
   600 GOSUB VAL "3550"
   620 CLS 
   630 GOSUB VAL "4690"
   640 IF Q(CODE "£") THEN GOTO VAL "680"
   650 CLS 
   660 RAND USR G
   670 GOTO VAL "550"
   680 CLS 
   690 GOSUB VAL "5130"
   700 PRINT ,,"oN RECONNAIT AISEMENT LA PIECE  PRINCIPALE DÀUN ABRI ANTI -","ATOMIQUE.",,,,"lES MURS SONT COUVERTS","DÀETAGERES:LIVRES,VIDEOS,MUSIQUEBREF TOUT POUR SE DISTRAIRE","DURANT DES MOIS",,,,"oN VOIT 3 PORTES, ET UN ESCALIEREN SPIRALE;PRES DE LA PORTE SUD:UN INTERPHONE",,,,"¼-¸¸¯",,"º   °",,"I* O°  (5*5)",,"º   °",,"ª®®-¬"
   780 GOSUB VAL "4320"
   790 IF Q(CODE "4") THEN GOTO VAL "1010"
   800 IF Q(CODE "5") THEN GOTO VAL "1250"
   810 IF Q(CODE "6") THEN GOTO VAL "840"
   820 IF Q(CODE "¿") THEN GOTO VAL "1350"
   830 GOTO VAL "680"
   840 CLS 
   850 GOSUB VAL "5130"
   860 PRINT AT VAL "2",CODE "¿";"lE DORTOIR:",TAB CODE "¿";"----------",,,"oN Y TROUVE 18 COUCHETTES","SUPERPOSEES ET DES ARMOIRES","METALLIQUES VIDES.",,,,,"vOUS REMARQUEZ AUSSI UNE PORTE.",,,,,,,"¼¸-¯",,"º  °",,"º *I  (4*5)",,"º  °",,"ª®®¬"
   945 LET H30=PI/PI
   950 GOSUB VAL "4320"
   960 IF Q(CODE "2") THEN PRINT AT CODE "¿",NOT PI;"lES LITS SONT FAIT,ET IL NÀY A  AUCUNE AFFAIRE PERSONNELLE"
   965 IF Q(CODE "2") THEN GOSUB VAL "2920"
   970 IF Q(CODE "$") THEN GOSUB VAL "3550"
   980 IF Q(CODE "4") THEN GOTO VAL "1140"
   990 IF Q(VAL "8") OR Q(VAL "9") OR Q(CODE "7") THEN GOTO VAL "680"
  1000 GOTO VAL "840"
  1010 CLS 
  1020 GOSUB VAL "5130"
  1030 PRINT AT VAL "2",VAL "11";"lA RESERVE:",TAB VAL "11";"----------"
  1050 PRINT ,,"pLUSIEURS METRES CUBES DE","NOURRITURE",,,,"lES VIVRES SONT SUFFISANTS POUR 12 PERSONNES PENDANT 6 MOIS."
  1070 PRINT ,,,,,,"¼¸¸¸¯",,"º*  °  (5*3)",,"ª-®®¬"
  1100 GOSUB VAL "4320"
  1110 IF Q(CODE "<") THEN LET F=F+PI/PI
  1120 IF Q(VAL "8") OR Q(VAL "9") OR Q(CODE "5") THEN GOTO VAL "680"
  1130 GOTO VAL "1010"
  1140 CLS 
  1150 GOSUB VAL "5130"
  1160 PRINT AT VAL "2",CODE "$";"w‘c",TAB CODE "$";"---",,,,,"lES DOUCHES-TOILETTES DANS UN   COIN,UNE MACHINE A LAVER DANS   LÀAUTRE.",,,,,,,,"¼¸¸¯",,"º *°  (4*3)",,"ª®-¬"
  1220 GOSUB VAL "4320"
  1230 IF Q(CODE "5") OR Q(VAL "8") OR Q(VAL "9") THEN GOTO VAL "840"
  1240 GOTO VAL "1140"
  1250 CLS 
  1260 GOSUB VAL "5130"
  1270 PRINT ,,,,"lONGUE PIECE CONTENANT: LES     DIVERS RESERVOIRS DÀEAU,DÀAIR   AINSI QUE LES FILTRES DE        RECYCLAGE.",,,,,,,,"¼¸¸¸¸¸¸-¯",,"º      *°  (9*3)","ª®®®®®®®¬"
  1310 GOSUB VAL "4320"
  1320 IF Q(VAL "8") OR Q(VAL "9") OR Q(CODE "4") THEN GOTO VAL "680"
  1330 CLS 
  1340 GOTO VAL "1250"
  1350 CLS 
  1360 GOSUB VAL "5130"
  1370 PRINT ,," lÀESCALIER : VOUS MONTEZ...";
  1380 RAND SIN SIN SIN SIN SIN SIN SIN PI
  1390 PRINT AT VAL "4",CODE ":";"VOUS MONTEZ..."
  1400 RAND SIN SIN SIN SIN SIN SIN SIN PI
  1410 PRINT ,,"eT ENFIN 50 METRES PLUS HAUT,",,,
  1420 PRINT "vOUS VOUS TROUVEZ DANS UN LONG  COULOIR.",,"aUX 2 BOUTS: UNE PORTE FERME A   CLEF.",,"aU MILIEU: UNE PORTE OUVERTE.",,,"¼-¯"
  1460 LET Q$="º °"
  1470 PRINT Q$,,Q$,,"ºO°  (3*8)",,Q$,,"º*I",,Q$,,"ª-¬"
  1540 GOSUB VAL "4320"
  1550 IF H14 THEN GOTO VAL "1610"
  1560 LET H20=INT (RND*CODE "@64")+PI/PI
  1570 IF Q(CODE ".") AND (Q(CODE "4") OR Q(CODE "5")) THEN GOTO VAL "1830"
  1580 IF Q(CODE ",") AND (Q(CODE "4") OR Q(CODE "5")) AND H20>H6 THEN PRINT AT VAL "9",INT PI;"vOUS NÀETES PAS CAPABLE DE       CROCHETER CETTE SERRURE."
  1590 IF Q(CODE ",") AND (Q(CODE "4") OR Q(CODE "5")) AND H20>H6 THEN GOSUB VAL "2920"
  1600 IF Q(CODE ",") AND H20>H6 AND (Q(CODE "4") OR Q(CODE "5")) THEN GOTO VAL "2680"
  1605 IF Q(CODE ",") AND H20<H6 AND (Q(CODE "4") OR Q(CODE "5")) THEN GOTO VAL "1830"
  1610 IF Q(CODE "7") THEN GOTO VAL "1650"
  1620 IF Q(VAL "11") THEN GOTO VAL "680"
  1630 IF NOT H14 THEN GOTO VAL "2680"
  1640 IF Q(CODE "4") OR Q(CODE "5") THEN GOTO VAL "1830"
  1645 GOTO VAL "2680"
  1650 CLS 
  1660 GOSUB VAL "5130"
  1670 PRINT ,,"lE GARAGE: ECLAIRE PAR DES","MEURTRIERES,",,,,"aU SOL, 2 MOTOS ELECTRIQUES A   MOITIE DEMONTEES ET HORS DÀUSAGE",,,,"dE PLUS, VOUS REMARQUEZ LES","TRACES DÀUN VEHICULE PLUS GROS  MAIS CE VEHICULE A DISPARU.",,,"¼¸¸¸¯"
  1710 LET Q$="º   °"
  1720 PRINT Q$,,Q$,,Q$;"  (5*8)",,Q$,,"I * °",,Q$,,"ª®®®¬"
  1790 GOSUB VAL "4320"
  1800 IF Q(VAL "8") OR Q(VAL "9") OR Q(CODE "6") THEN GOTO VAL "2680"
  1810 CLS 
  1820 GOTO VAL "1650"
  1830 CLS 
  1840 GOSUB VAL "5130"
  1850 LET H14=PI/PI
  1860 PRINT AT VAL "2",VAL "6";" zONE DE SECURITE:",,,"lE SOL EST RECOUVERT DÀUNE","POUSSIERE BLEUATRE.","cETTE ZONE EST FERMEE PAR 3 SAS.",," ½½"
  1900 PRINT "» ¬®®®®®®",,"º       °",,"«‘««««««°"
  1930 LET Q$="««««««««°"
  1940 PRINT Q$,,Q$,,"«««««««« ½  (9*10)",Q$,,Q$,,Q$,,"«‘««««««°",,"º     * °",,"± ¯¸¸¸¸¸¸",," ½½"
  2040 LET H30=PI/PI
  2050 GOSUB VAL "4320"
  2060 CLS 
  2070 PRINT TAB VAL "11";"attention‰",,,"dORENAVANT,VOUS POUVEZ ETEINDRE VOTRE TORCHE:CETTE SALLE ET LES SUIVANTES SONT ECLAIREES."
  2080 IF Q(CODE "2") THEN PRINT ,,"fOUILLE:VOUS NE POUVEZ PAS","ANALYSER CETTE POUSSIERE."
  2090 IF Q(CODE "2") THEN PRINT ,,"dE PLUS VOUS TROUVEZ A COTE DU  SAS EST:DES ARMES"
  2100 LET Q$=" EST BLOQUE."
  2110 IF Q(CODE "4") THEN PRINT ,,"lE SAS NORD";Q$
  2120 IF Q(CODE "5") THEN PRINT ,,"lE SAS SUD";Q$
  2130 GOSUB VAL "2920"
  2140 IF Q(VAL "8") OR Q(VAL "9") OR Q(CODE "6") THEN GOTO VAL "2680"
  2150 IF Q(CODE "7") THEN GOTO VAL "2180"
  2160 CLS 
  2170 GOTO VAL "1830"
  2180 CLS 
  2190 GOSUB VAL "5130"
  2200 PRINT ,,"lA COMMANDE DU SAS ÀESTÀ MARCHE"
  2210 RAND SIN SIN SIN SIN SIN SIN PI
  2220 PRINT ,,"lA MASSIVE PORTE BLINDEE TOURNE LENTEMENT SUR SES GONDS."
  2230 RAND SIN SIN SIN SIN SIN SIN SIN SIN SIN SIN SIN SIN SIN PI
  2240 PRINT ,,"sI VOUS DESIREZ VIVRE LA SUITE  DE VOTRE MISSION SUR ÀVALIR 4À:",,,"- ˜) RECOPIEZ ATTENTIVEMENT",,TAB VAL "5";"CETTE LIGNE:",,,,("0" AND H1<CODE "¿");H1;("0" AND H2<CODE "¿");H2;("0" AND M1<CODE "¿");M1;("0" AND I<CODE "¿");I;("0" AND P<CODE "¿");P;("0" AND D<CODE "¿");D;("0" AND R<CODE "¿");R;("0" AND VO<CODE "¿");VO;("0" AND F<CODE "¿");F;("0" AND E<CODE "¿");E;("0" AND VI<CODE "¿");VI;("0" AND C<CODE "¿");C;("0" AND A<CODE "¿");A;("0" AND B1<CODE "¿");B1;("0" AND B2<CODE "¿");B2;("0" AND H10<CODE "¿");H10;W$,,,,"  - ™) METTEZ VOTRE MAGNETO SUR                 play"
  2660 GOSUB VAL "2920"
  2670 LOAD À
  2680 CLS 
  2690 GOSUB VAL "5130"
  2700 GOTO VAL "1420"
  2710 FOR Q=NOT PI TO VAL "500"
  2711 IF INKEY$="" THEN NEXT Q
  2714 RETURN 
  2720 IF INKEY$="" THEN GOTO VAL "2720"
  2722 FOR Q=NOT PI TO VAL "8"
  2724 SCROLL 
  2726 NEXT Q
  2730 PRINT AT CODE "$",NOT PI;
  2770 RETURN 
  2790 CLS 
  2792 PRINT ,,"- FUSIL 30/30 : ";H2;" BALLES",,,"- PARALYSANTS : ";H1;" JETS",,,,,"   -legende-",,,," ¼¸¸¸¯ --> CLOISON"," O     --> ESCALIER"," -  I  --> PORTES"," ½     --> SAS OU PORTE BLINDEE  *     --> VOTRE PERSONNAGE.",,,"   N",,"  O+E  --> ROSE DES VENTS","   S",,,," (3*6) --> (LONGUEUR * LARGEUR)"
  2890 GOSUB VAL "2920"
  2900 CLS 
  2910 RETURN 
  2920 PRINT AT CODE "+",VAL "7";"entrez«Žnew‘line"
  2930 LET A$=INKEY$
  2940 IF A$<>"" THEN GOTO VAL "2965"
  2950 PRINT AT CODE "+",VAL "7";"ENTREZ <NEW-LINE>"
  2960 GOTO VAL "2920"
  2965 PRINT AT CODE "+",VAL "7";"«««un««instant«««"
  2970 RETURN 
  2980 CLS 
  2990 PRINT TAB VAL "8";"que«faites‘vous«Š"
  3000 PRINT ,,"-  1) REGARDE DEVANT","-  2) REGARDE SUR LES COTES","-  3) REGARDE EN HAUT","-  4) REGARDE EN BAS","-  5) AVANCE NORMALEMENT","-  6) AVANCE ARME POINTE AU SOL","-  7) AVANCE ARME POINTEE DEVANT-  8) RECULE",,"-  9) RECULE RAPIDEMENT","- 10) MONTE LÀESCALIER","- 11) DESCEND LÀESCALIER","- 12) ALLUME TORCHE","- 13) ETEIND TORCHE","- 14) ANALYSE LÀATMOSPHERE","- 15) MET COMBINAISON SPATIALE","- 16) ENLEVE COMBI. SPATIALE","- 17) REPARE COMBI. SPATIALE","- 18) PREND AIR COMPRIME SECOURS- 19) MANGE",,"- 20) REPOS"
  3200 GOSUB VAL "2720"
  3210 PRINT "- 21) SOIGNE UN RESIDENT","- 22) SOIGNE SOI-MEME","- 23) TIRE UN JET DE PARALYSANT","- 24) TIRE UNE BALLE EXPLOSIVE","- 25) ATTAQUE AVEC LE COUTEAU","- 26) CROCHETE UNE SERRURE","- 27) FAIT EXPLOSER LA SERRURE","- 28) CONVAINC UN RESIDENT DE",TAB VAL "6";"FOURNIR UN RENSEIGNEMENT."
  3220 GOSUB VAL "2720"
  3330 PRINT "- 29) SEDUIT UN RESIDENT","- 30) FOUILLE",,"- 31) UTILISE LÀINTERPHONE","- 32) PREND LA PORTE ÀNORDÀ","- 33)";TAB CODE "+";"ÀSUDÀ","- 34)";TAB CODE "+";"ÀOUESTÀ","- 35)";TAB CODE "+";"ÀESTÀ","- 36) AVALE MEDICAMENTS"
  3510 RAND SIN SIN SIN SIN PI
  3520 SCROLL 
  3530 GOSUB VAL "2920"
  3540 RETURN 
  3550 POKE VAL "16418",VAL "2"
  3555 DIM Q(CODE "8")
  3560 GOSUB VAL "3700"
  3570 INPUT L$
  3575 IF L$="" THEN GOTO VAL "3570"
  3580 IF L$="A" OR L$="P" OR L$="R" OR L$="M" THEN GOTO VAL "3610"
  3585 LET L=VAL L$
  3590 IF L<=NOT PI OR L>CODE "C" THEN GOTO VAL "3570"
  3600 LET Q(L)=PI/PI
  3610 IF L$="A" THEN GOSUB VAL "2980"
  3620 IF L$="P" THEN GOSUB VAL "3890"
  3630 IF L$="R" THEN RETURN 
  3640 IF L$="M" THEN GOSUB VAL "2790"
  3650 GOTO VAL "3560"
  3700 CLS 
  3710 PRINT O$;AT CODE "+",NOT PI;O$
  3720 PRINT AT INT PI,VAL "11";"’«menu«’"
  3730 PRINT ,,,,"1-36  -> ACTION",,,,"ÀAÀ   -> LISTE ACTIONS",,,"ÀMÀ   -> LISTE MATERIEL",,,"ÀPÀ   -> PERSONNAGE",,,"ÀRÀ   -> VALIDER LE TOUR"
  3780 LET P$="ENTREZ VOTRE SELECTION"
  3790 FOR Q=PI/PI TO LEN P$
  3810 LET Z=CODE P$(Q)+CODE "«"
  3820 IF INKEY$<>"" THEN GOTO VAL "3880"
  3830 LET P$(Q)=CHR$ Z
  3840 PRINT AT CODE "<",VAL "5";P$
  3845 IF INKEY$<>"" THEN GOTO VAL "3880"
  3850 LET P$(Q)=CHR$ (Z-CODE "«")
  3860 NEXT Q
  3870 GOTO VAL "3790"
  3880 RETURN 
  3890 CLS 
  3900 PRINT TAB INT PI;"caracteristiques«de‰ ";W$;AT VAL "2",CODE ":";
  3910 FOR Q=VAL "2" TO VAL "11"
  3920 PRINT TAB CODE "?";"º"
  3930 NEXT Q
  3940 PRINT AT VAL "2",NOT PI;"intellec–«‰ ";I,"perception‰ ";P,,,"decision««‰ ";D,"reflexe«««‰ ";R,,,"volonte«««‰ ";VO,"force«««««‰ ";F,,,"equilibre«‰ ";E,"vitalite««‰ ";VI,,,"communic–«‰ ";C,"adaptation‰ ";A,,,,,,,"apparence«‰ ";B1,"reputation‰ ";B2
  4010 GOSUB VAL "2920"
  4020 RETURN 
  4030 CLS 
  4040 LET Z$="543210:."+CHR$ (PI/PI)+CHR$ (VAL "6")+CHR$ (VAL "7")
  4050 FOR Q=PI/PI TO VAL "11"
  4060 POKE VAL "16518",CODE Z$(Q)
  4090 RAND USR G
  4100 CLS 
  4110 NEXT Q
  4160 POKE VAL "16518",CODE "«"
  4170 RAND USR G
  4200 GOTO VAL "540"
  4320 GOSUB VAL "2920"
  4330 GOSUB VAL "3550"
  4340 CLS 
  4350 GOSUB VAL "4690"
  4360 CLS 
  4370 RETURN 
  4380 SAVE  "CRYSTALœ"
  4390 PRINT AT INT PI,CODE "£";"crystal«œ";AT VAL "5",VAL "4";"JE NE VOUS CACHE PAS QUE";AT VAL "7",INT PI;"LÀAVENTURE PEUT SE REVELER";AT VAL "9",PI/PI;"DANGEREUSE.VOUS PARTIREZ AVEC";AT VAL "11",NOT PI;"TOUTES LES PRECAUTIONS POSSIBLES";AT CODE "$",PI/PI;"ET NE PRENDREZ PAS DE RISQUES";AT CODE "?",PI/PI;"INUTILES SI VOUS DECOUVREZ QUÀ";AT CODE ")",VAL "4";"ILS SONT TOUS MORTS..."
  4470 GOSUB NOT PI
  4480 CLS 
  4490 GOSUB VAL "4580"
  4500 FOR Z=PI/PI TO VAL "11"
  4510 PRINT AT INT PI,CODE "£";"rEaDy Š";AT VAL "9",VAL "7";"ALORS , ACTION...";AT CODE "?",CODE "£";"TRANSIT";AT CODE "(",CODE "£";"-------";AT INT PI,CODE "£";"ReAdY«?"
  4560 NEXT Z
  4570 GOSUB VAL "4030"
  4580 FOR Z=NOT PI TO CODE "="
  4590 PRINT "¼¯                            ¼¯";
  4600 NEXT Z
  4610 PRINT "¸¸";TAB CODE "2";"¸¸"
  4620 FOR Z=CODE "+" TO NOT PI STEP -PI/PI
  4630 PRINT AT Z,VAL "2";"±";TAB CODE "1";"»"
  4640 RAND PI*PI
  4650 PRINT AT Z,VAL "2";"»";TAB CODE "1";"±"
  4660 PRINT AT Z,VAL "2";" ";TAB CODE "1";" "
  4670 NEXT Z
  4680 RETURN 
  4690 PRINT TAB VAL "11";"remarques";AT PI/PI,VAL "11";"---------"
  4700 IF Q(CODE ".") AND H2>NOT PI THEN LET H2=H2-PI/PI
  4705 IF Q(CODE ".") AND H2<=NOT PI THEN LET Q(CODE ".")=NOT PI
  4710 IF Q(CODE "(") THEN LET M1=PI/PI
  4720 IF Q(CODE "*") AND H1<=NOT PI THEN LET Q(CODE "*")=NOT PI
  4730 IF Q(CODE "*") AND H1>NOT PI THEN LET H1=H1-PI/PI
  4740 IF Q(CODE ":") THEN PRINT ,,"aTMOSPHERE : OK."
  4750 IF H1<=NOT PI THEN PRINT ,,"vOTRE PARALYSANT EST VIDE."
  4760 IF Q(CODE "/") AND H2<=NOT PI THEN LET Q(CODE "/")=NOT PI
  4770 IF Q(CODE "/") AND H2>NOT PI THEN LET H2=H2-PI/PI
  4780 IF Q(CODE "?") AND H10=NOT PI THEN LET M1=NOT PI
  4790 IF H2<=NOT PI THEN PRINT ,,"vOTRE FUSIL 30/30 EST VIDE"
  4800 IF Q(CODE "<") AND H3>=VAL "7" THEN LET F=F+PI/PI
  4810 IF Q(CODE "<") THEN LET H3=NOT PI
  4815 IF H3=VAL "7" OR H3=CODE "¿" OR H3=CODE "$" OR H3=CODE "(" OR H3=CODE "=" THEN LET F=F-PI/PI
  4820 IF Q(CODE "=") AND H4>=CODE "£" THEN LET VI=VI+PI/PI
  4830 IF Q(CODE "=") THEN LET H4=NOT PI
  4833 IF H4=CODE "£" OR H4=CODE "?" OR H4=CODE "<" OR H4=CODE "-" THEN LET VI=VI-PI/PI
  4840 IF Q(CODE "-") AND H5 THEN LET VI=VI+INT (RND*VAL "5")+PI/PI
  4850 IF Q(CODE ",") THEN LET H6=((P-CODE "¿")+(A-CODE "¿")+(I-CODE "¿"))*VAL "4"
  4860 IF Q(CODE "0") THEN LET H7=((C-CODE "¿")+(D-CODE "¿")+(I-CODE "¿"))*VAL "4"
  4870 IF Q(CODE "1") THEN LET H8=((C-CODE "¿")+(A-CODE "¿"))*VAL "4"
  4880 IF Q(CODE "1") AND B1>CODE "<" THEN LET H8=H8+CODE "¿"
  4890 PRINT 
  4891 IF M1 AND H10=VAL "5" THEN PRINT "vOUS AVEZ FROID."
  4893 IF M1 AND H10=VAL "5" THEN LET VI=VI-PI/PI
  4900 IF M1 AND H10=VAL "8" THEN PRINT "vOUS VENEZ DE TOUSSER"
  4905 IF H10=VAL "8" THEN LET VI=VI-PI/PI
  4910 IF M1 AND H10=CODE "£" THEN PRINT "vOUS TOUSSEZ POUR LA DEUXIEME   FOIS."
  4911 IF H10=CODE "£" THEN LET VI=VI-PI/PI
  4920 IF Q(CODE "8") THEN LET H12=NOT PI
  4930 IF Q(CODE "8") THEN LET H11=PI/PI
  4940 LET H12=H12+PI/PI
  4950 IF H12=VAL "6" THEN LET H11=NOT PI
  4960 IF H12=VAL "6" THEN LET H12=NOT PI
  4970 IF H12=VAL "6" THEN LET VI=VI-PI/PI
  4980 IF H11 AND M1 AND H10=CODE "?" OR H10=CODE "$" THEN PRINT "vOUS ETERNUEZ"
  4990 IF M1 AND H10=CODE "*" AND H11 THEN PRINT "vOUS AVEZ DE LA FIEVRE"
  5000 IF M1 AND (H10=CODE "2" OR H10=CODE "5" OR H10=CODE "8") AND H11 THEN PRINT "vOUS ETES TRES MALADE."
  5010 IF H11 AND M1 AND H10=CODE "?" OR H10=CODE "$" THEN LET VI=VI-INT PI
  5020 IF H11 AND M1 AND H10=CODE "=" THEN LET VI=VI-(INT (RND*VAL "4")+PI/PI)
  5030 IF H11 AND M1 AND (H10=CODE "2" OR H10=CODE "5" OR H10=CODE "8") THEN LET VI=VI-(INT (RND*VAL "6")+VAL "2")
  5060 LET H3=H3+PI/PI
  5070 LET H4=H4+PI/PI
  5080 LET H10=H10+PI/PI
  5090 IF Q(CODE "2") AND NOT H30 THEN PRINT ,,"fOUILLE : VOUS NE TROUVEZ RIEN  DE TRES INTERESSANT."
  5095 LET H30=NOT PI
  5100 IF Q(CODE "3") THEN PRINT ,,"lE VOYANT DE LÀINTERPHONE SÀEST ALLUME,MAIS PERSONNE NE REPOND"
  5110 IF VI<=NOT PI THEN GOTO VAL "5190"
  5120 GOSUB VAL "2920"
  5124 IF Q(CODE "$") AND NOT H14 THEN GOSUB VAL "5330"
  5125 RETURN 
  5160 PRINT F$
  5163 POKE VAL "16418",NOT PI
  5166 PRINT AT CODE "*",NOT PI;G$
  5170 PRINT AT PI/PI,NOT PI;
  5180 RETURN 
  5190 CLS 
  5195 RAND USR G
  5200 PRINT AT VAL "6",VAL "7";"HORREUR."
  5210 FOR Z=NOT PI TO CODE "+"
  5230 PRINT AT VAL "11",VAL "4";"++++++++++++++";AT Z,Z;"";AT VAL "11",VAL "4";"vous«etes«mort";AT Z,CODE "+"-Z;""
  5270 NEXT Z
  5280 LET A$="½½½½½½½½½½"
  5290 FOR Z=CODE "+" TO NOT PI STEP -PI/PI
  5300 PRINT AT Z,CODE "-";A$
  5310 NEXT Z
  5320 GOTO VAL "9999"
  5330 POKE VAL "16518",CODE "«"
  5340 CLS 
  5350 RAND USR G
  5360 PRINT AT VAL "6",INT PI;"vous«etes«dans«l•obscurite"
  5370 PRINT AT VAL "7",INT PI;N$
  5390 GOSUB VAL "4320"
  5400 IF Q(CODE "£") THEN RETURN 
  5410 GOTO VAL "5340"


Juste une petite chose:
Dans:

Code : Tout sélectionner

  4891 IF M1 AND H10=VAL "5" THEN PRINT "vOUS AVEZ FROID."
  4893 IF M1 AND H10=VAL "5" THEN LET VI=VI-PI/PI
  4900 IF M1 AND H10=VAL "8" THEN PRINT "vOUS VENEZ DE TOUSSER"
4891 IF NOT M1 THEN GOTO 4910
4893 IF H10=VAL "5" THEN LET VI=VI-PI/PI
4900 PRINT ("vOUS AVEZ FROID." AND H10=VAL "5")
;("vOUS VENEZ DE TOUSSER" AND H10=VAL "8" );
4910 ....

On peux appliquer des simplifications qui accélèrent le traitement et on gagne Encore des octets!

Avatar du membre
XavierSnp
Legendary
Messages : 511
Enregistré le : 22-02-2012 08:00
Contact :

Re: ZX81 France, les fichiers...

Message non lu par XavierSnp » 15-11-2018 02:39

Le plan complet de Cristal 5...
Plan.jpg

Avatar du membre
XavierSnp
Legendary
Messages : 511
Enregistré le : 22-02-2012 08:00
Contact :

Compression sur ZX81 32 images plein ecran dans 16k.

Message non lu par XavierSnp » 15-11-2018 06:03

Salut,

Voici une démo deux en un... avec compression par suppression de redondance, et LZ.

Donc, voici le fichier exemple.
CRUNCHED.zip
(13.03 Kio) Téléchargé 14 fois
Utitisant le compresseur DOS Pucrush.exe
32 images, soit 792*32= 25344 octets pour 16k de RAM!

Sources:
routine_LZ_ZX81.zip
(63.97 Kio) Téléchargé 14 fois
encodage_multi_zx81.zip
(10.22 Kio) Téléchargé 15 fois
PUCrunch_Z80.zip
(64.79 Kio) Téléchargé 14 fois

Code : Tout sélectionner

; ******************************************************
; **       Librería de rutinas para Amstrad CPC/GB    **
; **	   Raúl Simarro, 	  Artaburu 2007       **
; ******************************************************
;
; Addaptée pour le ZX81 par XavSnap.

; datos necesarios que vienen en la pila:
; ORIGEN	HL
; DESTINO	DE


;------- TASM ASM mnemonics. -------
; Compile this file using:
; Set TASMOPTS = -b
; tasm -80 ThisCode.tas MyBinary.BIN
;-----------------------------------
; Zx81 Program name: 

#define ORG  .org       ; TASM cross-assembler definitions
#define equ  .equ
#define db  .db
#define dw .word 
;-----------------------------------

#include "ZX81.sym" ; Load the symbol file.

ORG 16514

	pop af
	pop de
	pop hl

	; ****** Unpack pucrunch data ******

pucrunch:
	LD DE,(Dest_ADD) ; Entry Source packed data
	push   de        ; destination pointer to 2nd register  

        LD HL,(Sour_ADD) ; Destination for unpacked data

	exx             ; set  
	pop   de   
	push   hl
	push   de 
	push   bc 
	push   af 
	exx		; read the header self-modifying the
			; parameters straight into the code 
			; skip useless data 
	ld bc,6
	add hl,bc       ; skip "**PU**"
	ld   a, (hl) 	; starting escape 
	inc   hl  
	ld   (escPu+1), a 
	inc   hl        ; skip useless data "X"
	inc   hl  
	ld   a, (hl)       ; number of escape bits  
	inc   hl  
	ld   (escPub0+1), a 
	ld   (escPub1+1), a 
	ld   b, a          ; 8 - escape bits 
	ld   a, 8  
	sub   b 
	ld   (noescPu+1), a 
	ld   a, (hl)       ; maxGamma + 1 
	inc   hl  
	ld   (MaxGamma+1), a 
	ld   b, a          ; 8 - maxGamma  
	ld   a, 9
	sub   b  
	ld   (Max8Gamma+1), a 
	ld   a, (hl)       ; (1 << maxGamma) 
	inc   hl  
	ld   (Max1Gamma+1), a  
	add   a, a         ; (2 << maxGamma) - 1  
	dec   a  
	ld   (Max2Gamma+1), a   
	ld   a, (hl)       ; extra lz77_0 position bits
	inc   hl 
	ld   (ExtraBits+1), a 
	inc   hl           ; skip useless data 
	inc   hl
	ld   e, (hl) ; RLE table length  
	ld   (tablePu+1), hl       ; RLE table pointer 
	inc   hl
	ld   d, 0
	add   hl, de 
	ld   c, $80        ; start decompression 
	jr   loop_u 

newescPu:
	  ld   a, (escPu+1)  ; save old escape code  
	  ld   d, a 

escPub0:
	  ld   b, 2        ; ** parameter 
	  xor   a          ; get new escape code  
	  call   get_bits  
	  ld   (escPu+1), a  
	  ld   a, d 

noescPu:
	  ld   b, 6         ; ** parameter  
	  call   get_bits      ; get more bits to complete a byte 
	  exx            ; output the byte 
	  ld   (de), a 
	  inc   de 
	  exx 

loop_u:
	  xor   a 

escPub1:
	  ld   b, 2         ; ** parameter  
	  call   get_bits      ; get escape code 

escPu:
	  cp   0         ; ** parameter   
	  jr   nz, noescPu   
	  call   get_gamma      ; get length   
	  exx 
	  ld   b, 0   
	  ld   c, a   
	  exx   
	  cp   1   
	  jr   nz, lz77_0      ; lz77_0   
	  xor   a   
	  call   get_bit   
	  jr   nc, lz77_0_2    ; 2-byte lz77_0 
	  call   get_bit   
	  jr   nc, newescPu    ; escaped literal byte 
	  call   get_gamma     ; get length  
	  exx
	  ld   b, 1 
	  ld   c, a 
	  exx 

Max1Gamma:
	  cp   64              ; ** parameter   
	  jr   c, chrcode      ; short RLE, get bytecode 
Max8Gamma:
	  ld   b, 2            ; ** parameter
	  call   get_bits      ; complete length LSB
	  ex   af, af'  
	  call   get_gamma     ; length MSB  
	  exx  
	  ld   b, a   
	  ex   af, af'  
	  ld   c, a
	  exx 
chrcode:
	  call   get_gamma     ; get byte to repeat  
	  push   hl 
tablePu:
	  ld   hl, $0000       ; ** parameter   
	  ld   d, 0   
	  ld   e, a   
	  add   hl, de   
	  cp   32   
	  ld   a, (hl)  
	  pop   hl   
	  jr   c, dorle   
	  ld   a, e      ; get 3 more bits to complete the   
	  ld   b, 3      ; byte   
	  call   get_bits 
dorle:
	  exx            ; output the byte n times   
	  inc   c 
dorlei:
	  ld   (de), a   
	  inc   de   
	  dec   c   
	  jr   nz, dorlei   
	  dec   b   
	  jr   nz, dorlei   
	  exx
	  jr   loop_u 
lz77_0:
	  call   get_gamma ; offset MSB 
Max2Gamma:
	  cp   127         ; ** parameter   
	  ; ret   z   
	  jr   z, fin      ; EOF, return   
	  dec   a          ; (1...126 -> 0...125) 
ExtraBits:
	  ld   b, 0        ; ** parameter   
	  call   get_bits  ; complete offset MSB 
lz77_0_2:
	  ex   af, af'   
	  ld   b, 8        ; offset LSB   
	  call   get_bits   
	  cpl              ; xor'ed by the compressor   
	  exx              ; combine them into offset   
	  ld   l, a   
	  ex   af, af'   
	  ld   h, a   
	  inc   hl   
	  xor   a          ; CF = 0   
	  push   de        ; (current output position) - (offset) 
	  ex   de, hl  
	  sbc   hl, de
	  pop   de
	  inc   bc
	  ldir              ; copy
	  exx   
	  jp   loop_u 

;## Get a bit from the source stream. 
;## Return    CF = result 
get_bit:
	  sla   c         ; shift next bit into CF   
	  ret   nz   
	  ld   c, (hl)    ; get next byte   
	  inc   hl        ; increase source stream pointer   
	  rl   c          ; shift next bit into CF, bit0 = 1   
	  ret 

;## Get multiple bits from the source stream. 
;## In        B = number of bits to get 
;## Return    A = result 
get_bits:
	  dec   b   
	  ret   m   
	  sla   c         ; shift next bit into CF   
	  jr   nz, gb1   
	  ld   c, (hl)    ; get next byte   
	  inc   hl        ; increase source stream pointer   
	  rl   c          ; shift next bit into CF, bit0 = 1 
gb1:
          rla             ; rotate next bit into A 
	  jr   get_bits 

;## Get an Elias Gamma coded value from the source stream. 
;## Return    A = result 
get_gamma:
	  ld   b, 1 
MaxGamma:
	  ld   a, 7       ; ** parameter 
gg1:
	  call   get_bit  ; get bits until 0-bit or max 
	  jr   nc, gg2
	  inc   b  
	  cp   b
	  jr   nz, gg1 
gg2:
	  ld   a, 1         ; get the actual value
	  dec   b
	  jr   get_bits 

fin:   ; Restauramos los registros dobles y vuelta limpia
          exx
;	  LD HL,(Dest_ADD)
;	  EX DE,HL
;	  SBC HL,DE
;	  LD (PIC_LEN+1),HL
	  pop   af
	  pop   bc
	  pop   de
	  pop   hl
	  exx     ;ret   
	  ret   

Sour_ADD: ; Entry Source packed data
	dw Entry_DATAs

Dest_ADD: ; Destination for unpacked data
	dw $4400
LoadScr:
	LD HL,(Dest_ADD)
	LD DE,(RAM_D_FILE)
	INC DE
PIC_LEN:
	LD BC,$0318
	LDIR
	RET

Entry_DATAs:
.end

Avatar du membre
XavierSnp
Legendary
Messages : 511
Enregistré le : 22-02-2012 08:00
Contact :

L'ASM ZX81, six façons de programmer...

Message non lu par XavierSnp » 09-12-2018 04:46

Salut à tous,

Suite à une question sur le remplissage d'un écran avec un caractère...
J'ai trouvé 6 façons de programmer le ZX81, pour faire la même chose!
Cela démontre la richesse de ce langage à première vu simple et rudimentaire.
La vitesse d'exécution varie naturellement de routine en routine...

A vous d'en juger...

Voici la source:

Code : Tout sélectionner

#include ZX81.sym

#define ORG  .org       ; TASM cross-assembler definitions
#define equ  .equ
;-----------------------------------

;------- Rom and Ram Symbols -------
RAM_D_FILE equ $400C ; D_file address.
EXTERR equ $005B ; Basic Break function ! Ignore line instructions.
CURSEUR equ $8F5 ; Point to PRINT AT DEST.(BC=X,Y)
CHAINE equ $B6B ; PRINT A CHAINE (BC=LEN;DE=TEXT LOC)
	
ORG 16514

;--------- Routine 1 ----------	
	LD BC,0000
	CALL CURSEUR
	LD BC,22*32
LOOP1:
	LD A,157 ; '1'
	RST 10H
	DEC BC
	LD A,B
	OR C
	JR NZ,LOOP1
	RET
;--------- Routine 2 ----------

	LD HL,(RAM_D_FILE)
	LD B,158 ; '2'
	LD DE,32*24+23
LOOP2:
	LD A,$76
	INC HL
	CP (HL)
	DEC DE
	JR Z,LOOP2
	LD (HL),B
	LD A,D
	OR E
	RET Z
	JR LOOP2

;--------- Routine 3 ----------

	LD HL,(RAM_D_FILE)
LOOP3:
	INC HL
	LD D,H
	LD E,L
	INC DE
	LD A,159 ; '3'
	LD (HL),A
	LD BC,31
	LDIR
	LD A,$80
	EX DE,HL
	INC HL
	CP (HL)
	EX DE,HL
	RET Z
	INC HL
	JR LOOP3

;--------- Routine 4 ----------

	LD HL,(RAM_D_FILE)
	INC HL
	LD D,H
	LD E,L
	INC DE
	LD A,160 ; '4'
	LD (HL),A
	LD BC,31
	LDIR
	LD BC,$0100
	CALL CURSEUR
	LD L,21

LOOP4:

	LD DE,(RAM_D_FILE)
	INC DE
	LD BC,32
	CALL CHAINE
	DEC L
	RET Z
	RET Z
	JR LOOP4

;--------- Routine 5 ----------

Lb40A4:
	LD BC,0000
	CALL CURSEUR
		LD HL,$03BF 
Lb40A7:
		LD A,161 ; '5'
		RST 10H ; Display= A reg.
		LD A,$00 
		DEC HL 
		CP H 
		JR NZ, Lb40A7 ; [$40A7:16551]
		RET ; ==========================

;--------- Routine 6 ----------

	LD BC,0000
	CALL CURSEUR
		LD BC,$BF02 ; $FF+$FF+$BF
LOOP5:
		LD A,161 ; '6'
		RST 10H ; Display= A reg.
		LD A,$00 
		DJNZ LOOP5 ; if B<>0
		LD B,$FF 
		DEC C
		JR NZ, LOOP5
		RET ; ==========================
	
.end

Répondre