Y-a-t-il une limitation sur l'utilisation des "commandes étendues", genre LD DE,(**) code hexa ED5B avec le CPC ou le CPC/CPM ? J'ai l'impression que ça ne marche pas :O
Merci de ta réponse! Je m'amuse avec le TurboPascal v3 du CPC6128, et j'utilise beaucoup les accès firmware. Malheureusement contrairement aux versions suivantes le TurboPascalv3 n'intègre pas d'assembleur, il faut intégrer des codes hexa comme suit par exemple :
Code :
Procedure ScrHorizontal(EncodedInk:Byte; XStart,XEnd,Y:Integer); Begin Inline($3a/EncodedInk/$ed/$5b/XStart/$ed/$4b/XEnd/$2a/Y/$cd/$fc5a/$bc5f) End;
Ca ne marchait pas car je 'compactais' bêtement $ed/$5b en $ed5b, ce qui ne génère pas le bon code... En TurboPascal sous CPM+ l'accès firmware se fait par : CALL $fc5a AdrFirmware car les banques mémoires sont organisées différemment. La RAM video n'est pas accessible directement par MEM[$Addr].
C'est ton encodage qui n'est pas bon ($ed/$5b), essai comme ca: $5b/$ed
/$ed/$5b/ fonctionne... C'est /$ed5b/ qui ne fonctionne pas. Je suppose que le Turbo Pascal inverse les deux octets quand il 'compile' une séquence de 16bits comme ça...
Ma bibliothèque graphique pour Turbo-Pascal/CPC6128 avance bien ;D Voilà ce que ça donne en vitesse réelle pour la résolution du pb du cavalier (passer par toutes les cases de l'échiquier sans repasser deux fois par la même). Un choix aléatoire permet de trouver plusieurs solution en partant de la même case de départ.
Ma bibliothèque graphique pour Turbo-Pascal/CPC6128 avance bien ;D Voilà ce que ça donne en vitesse réelle pour la résolution du pb du cavalier (passer par toutes les cases de l'échiquier sans repasser deux fois par la même). Un choix aléatoire permet de trouver plusieurs solution en partant de la même case de départ.
Bonjour, Disponible en téléchargement quelque part ?
Je vais mettre çà en ordre avant ;D Là j'essaie de comprendre comment accéder directement à la RAM Vidéo en Pascal et je découvre le joyeux bazar des banks mémoires (mes souvenirs du CPC datent du CPC464 avec 64ko)... en plus avec CPM+ qui en rajoute une couche.. C'est chaud! Je me suis dit "tiens je vais débuger un truc aussi simple que la commande SCR READ du firmware (BDE5), en fait je ne comprends à peu près rien à partir des RST8 (çà switche les banks mémoire? Pour précision l'accès au firmware en CPM+ n'est pas direct, voir au dessus) et ma maitrise du Z80 est sommaire. Je vais laisser tomber çà pour le moment. Pourtant l'idée est assez simple : placer le code machine en Bank7 (bank commune en CPM+ et accessible pour partie par le Pascal, switcher en entrée de routine les banks 1 et 3, et reswitcher en sortie de routine... En CPM/TP la vidéo est en &4000). Cette partie de code sera en assembleur et les échanges avec le Pascal se feront via des variables "Absolute" (forcées en bank7, au dessus de #C000) ou le tableau MEM (en Pascal c'est une array qui correspond à toute la mémoire, enfin les 64ko 'actifs')... Il y probablement des trucs qui m'échappent (les interruptions? mais hors le switch des banks 1 et 3, le reste ne change pas ) donc çà devrait marcher?. Si je fais fausse route dites moi ;D ...
Me suis fait une police vectorielle proportionnel en TP aussi (en passant par le firmware). C'est pas très rapide (tout est tracé avec des GRA LINE du firmware) mais largement utilisable dans un jeu d'aventure texte+graphique, c'est plus rapide que l'affichage du texte dans Anathor par ex.)... En mode 2, 1 et 0 ça donne :
je suis moi-même surpris du résultat parce que ma façon de faire est vraiment très simple. Bon évidemment si on essaie d'écrire trop petit dans une résolution trop basse, ça fait de la bouillie. Ca rend bien en mode 1 mais je dois vérifier la lisibilité sur un vrai CPC
Ma bibliothèque graphique pour Turbo-Pascal/CPC6128 avance bien ;D Voilà ce que ça donne en vitesse réelle pour la résolution du pb du cavalier (passer par toutes les cases de l'échiquier sans repasser deux fois par la même). Un choix aléatoire permet de trouver plusieurs solution en partant de la même case de départ.
Nouvelle version avec les minuscules et accents...
Le principe est très simple, on part d'une matrice genre :
Code :
A B C D E F G H I J K L M N O P Q R S T U V W X Y
Avec cette 'résolution' : A est codé 'UCY-LM' B est codé 'ADJNL-NTXU-VB C est codé 'EBFPVY' etc...
Le tracé se fait alors en bouclant sur le code ASCII de chaque lettre de 'UCY-LM' par ex. comme suit: LINE((Ascii MOD 5)*EchelleX, (Ascii div 5) *EchelleY)
où div est la division entière. Bon c'est l'idée. Faut gérer ensuite le décalage des lettres etc. et le 'levé' ou 'baissé' du stylo.
Si ont veut plus (ou moins) de 'détail', il suffit de changer le 5 par la largeur de la "matrice" de "dessin" des lettres. C'est facilement adaptable à tous les langages...
Tu n'utilises pas l'extension graphique du turbo pascal ?(Turbo Pascal Extension Graphique -Turbo Pascal GX)
Non, j'utilise les accès au firmaware dans une unité dédiée (enfin il n'y a pas de UNIT en TP3 malheuresement, c'est juste des 'include'). J'arrive aussi maintenant à accèder directement à la RAM vidéo mais de temps à y consacré pour le moment). Les accès firmware sont comme çà :
Procedure SetTxtCur(X,Y:Byte); Begin InLine($3a/X/$67/$3a/Y/$6f/$cd/$fc5a/$bb75); End;
Procedure GetTxtCur(Var X,Y:Byte); Begin InLine($cd/$fc5a/$bb78/$7c/$32/X/$7d/$32/Y); End;
Procedure DspTxtCur; Begin InLine($cd/$fc5a/$bb7b); End;
Procedure HidTxtCur; Begin InLine($cd/$fc5a/$bb7e); End;
Procedure SetTxtPap(Paper:byte); Begin InLine($3a/Paper/$cd/$fc5a/$bb96); End;
Procedure SetTxtPen(Pen:byte); Begin InLine($3a/Pen/$cd/$fc5a/$bb90); End;
Procedure IniGra; Begin InLine($cd/$fc5a/$bbba);End;
Procedure SetMod(Mode:Byte); Begin InLine($3a/Mode/$cd/$fc5a/$bc0e); End;
Function CodInk(InkNumber:Byte):Byte; Begin InLine($3a/InkNumber/$cd/$fc5a/$bc2c/$32/BGraph); CodInk:=BGraph; End;
Procedure SetInk(Ink,C1,C2:Byte); Begin InLine($3a/C1/$47/$3a/C2/$4f/$3a/Ink/$cd/$fc5a/$bc32); End;
Procedure SetBdr(C1,C2:Byte); Begin InLine($3a/C1/$47/$3a/C2/$4f/$cd/$fc5a/$bc38); End;
Procedure DrwScrFldBox(EncodedInk:Byte; Adr:Integer; WidthBytes,Height:Byte); Begin InLine($3a/EncodedInk/$4f/$2A/Adr/$3a/WidthBytes/$57/$3a/Height/$5f/$cd/$fc5a/$bc47); End;
Procedure DrwScrHorLin(EncodedInk:Byte; XStart,XEnd,Y:Integer); Begin Inline($3a/EncodedInk/$ed/$5b/XStart/$ed/$4b/XEnd/$2a/Y/$cd/$fc5a/$bc5f); End;
Procedure DrwScrVerLin(EncodedInk:Byte; YStart,YEnd,X:Integer); Begin Inline($3a/EncodedInk/$ed/$5b/X/$ed/$4b/YEnd/$2a/YStart/$cd/$fc5a/$bc62); End;
Procedure GetScrDotAdr(X,Y:Integer; Var Addr:Integer; Var Mask:Byte); Begin InLine($ed/$5b/X/$2a/Y/$cd/$fc5a/$bc1d/$22/IGraph1/$79/$32/BGraph); Addr:=IGraph1; Mask:=BGraph; End;
Procedure MovAbs(x,y:Integer); Begin InLine($2a/x/$eb/$2a/y/$cd/$fc5a/$bbc0) End;
Procedure MovRel(x,y:Integer); Begin InLine($2a/x/$eb/$2a/y/$cd/$fc5a/$bbc3) End;
Procedure SetOrg(x,y:Integer); Begin InLine($2a/x/$eb/$2a/y/$cd/$fc5a/$bbc9) End;
Procedure SetWinWdt(x1,x2:Integer); Begin inline($2a/x2/$eb/$2a/x1/$cd/$fc5a/$bbcf) End;
Procedure SetWinHht(y1,y2:Integer); Begin InLine($2a/y2/$eb/$2a/y1/$cd/$fc5a/$bbd2) End;
Procedure DrwLinAbs(x,y:Integer); Begin InLine($2a/x/$eb/$2a/y/$cd/$fc5a/$bbf6) End;
Procedure DrwLinRel(x,y:Integer); Begin InLine($2a/x/$eb/$2a/y/$cd/$fc5a/$bbf9) End;
Procedure DrwPntAbs(x,y:Integer); Begin InLine($00/$ed/$ff/$2A/x/$eb/$2A/y/$cd/$fc5a/$bbea/$ed/$ff) End;
Procedure DrwPntRel(x,y:Integer); Begin InLine($2A/x/$eb/$2a/y/$cd/$fc5a/$bbed) End;
Function GetPntAbs(x,y:Integer):Byte; Begin InLine($2a/x/$eb/$2a/y/$cd/$fc5a/$bbf0/$32/BGraph); GetPntAbs:=BGraph; End;
Function GetPntRel(x,y:Integer):Byte; Begin InLine($2a/x/$eb/$2a/y/$cd/$fc5a/$bbf3/$32/BGraph); GetPntRel:=BGraph; End;
Procedure SetGraPen(Pen:Byte); Begin InLine($3a/Pen/$cd/$fc5a/$bbde) End;
Procedure SetGraPap(Paper:Byte); Begin InLine($3A/Paper/$cd/$fc5a/$bbe4) End;
Procedure GetGraCur(Var X,Y:Integer); Begin InLine($cd/$fc5a/$bbc6/$22/IGraph2/$eb/$22/IGraph1); X:=IGraph1; Y:=IGraph2; End;
Procedure ClrGraWin; Begin InLine($cd/$fc5a/$bbdb) End;
Procedure DrwGraChr(Ch:char); Begin InLine($3a/Ch/$cd/$fc5a/$bbfc) End;
Procedure SetLinMsk(Mask:Byte); Begin InLine($3A/Mask/$cd/$fc5a/$bd4c) End;
Procedure SetPalMod1(c0,c1,c2,c3:Byte); Begin SetInk(0,c0,c0);SetInk(1,c1,c1);SetInk(2,c2,c2);SetInk(3,c3,c3); End;
Procedure DrwScrRec(E:Byte; x1,y1,x2,y2:Integer); Begin DrwScrHorLin(E,x1,x2,y1); DrwScrHorLin(E,x1,x2,y2); DrwScrVerLin(E,y1,y2,x1); DrwScrVerLin(E,y1,y2,x2); End;
Procedure SetTxtWin(c1,c2,l1,l2:Byte); Begin InLine($3a/c1/$67/$3a/c2/$57/$3a/l1/$6f/$3a/l2/$5f/$cd/$fc5a/$bb66); End;
Procedure GrafOut(ch:Char); Begin InLine($3a/ch/$cd/$fc5a/$bbfc); End;
Procedure Tag; Begin If Not TagFlag Then Begin TagAddr:=ConOutPtr; TagFlag:=True; ConOutPtr:=Addr(GrafOut); End; End;
Procedure TagOff; Begin If TagFlag Then Begin ConOutPtr:=TagAddr; TagFlag:=False; End; End;
Le nom des commandes peut sembler ésotérique mais c'est très pratique et mnémotechnique en fait. Ca reprend la logique des IBM AS/400 ou iserie pour ceux qui connaissent ;D Blocs de 3 lettres "Verbe - nom - nom"
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 94 invité(s)
Vous ne pouvez pas publier de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas insérer de pièces jointes dans ce forum