CPC Rulez
https://cpcrulez.fr/forum/

Z80 CPC et Extended instructions (ED)
https://cpcrulez.fr/forum/viewtopic.php?f=4&t=6407
Page 1 sur 1

Auteur :  Nemo59 [ 18 Oct 2020, 22:21 ]
Sujet du message :  Z80 CPC et Extended instructions (ED)

Bonjour,

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

Auteur :  marcel [ 19 Oct 2020, 07:47 ]
Sujet du message :  Re: Z80 CPC et Extended instructions (ED)

Qu'est-ce qui ne fonctionne pas? Un logiciel?

L'opcode est supporté par le Zilog 80, il doit s'exécuter dans tous les cas

Auteur :  Nemo59 [ 19 Oct 2020, 08:59 ]
Sujet du message :  Re: Z80 CPC et Extended instructions (ED)

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].

Auteur :  hERMOL [ 20 Oct 2020, 10:34 ]
Sujet du message :  Re: Z80 CPC et Extended instructions (ED)

Salut!

C'est ton encodage qui n'est pas bon ($ed/$5b), essai comme ca:
$5b/$ed

Auteur :  Nemo59 [ 20 Oct 2020, 21:23 ]
Sujet du message :  Re: Z80 CPC et Extended instructions (ED)

hERMOL a écrit :
Salut!

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...

Auteur :  Nemo59 [ 21 Oct 2020, 22:24 ]
Sujet du message :  Re: Z80 CPC et Extended instructions (ED)

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.

https://youtu.be/T7Q0yJRmKzk

Auteur :  genesis8 [ 25 Oct 2020, 19:21 ]
Sujet du message :  Re: Z80 CPC et Extended instructions (ED)

Nemo59 a écrit :
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.

https://youtu.be/T7Q0yJRmKzk


Bonjour,

Disponible en téléchargement quelque part ?

Auteur :  Nemo59 [ 25 Oct 2020, 21:59 ]
Sujet du message :  Re: Z80 CPC et Extended instructions (ED)

genesis8 a écrit :
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! :sweatingbullets: :mdr: 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 :

Image

Image

Image

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

Auteur :  marcel [ 26 Oct 2020, 09:22 ]
Sujet du message :  Re: Z80 CPC et Extended instructions (ED)

Chouette cette fonte true type :D

Auteur :  norecess464 [ 26 Oct 2020, 16:24 ]
Sujet du message :  Re: Z80 CPC et Extended instructions (ED)

Oui, ça pourrait être chouette dans un soft de dessin genre OCP ou même le tool de AST!

Auteur :  Nemo59 [ 26 Oct 2020, 21:20 ]
Sujet du message :  Re: Z80 CPC et Extended instructions (ED)

genesis8 a écrit :
Nemo59 a écrit :
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.

https://youtu.be/T7Q0yJRmKzk


Bonjour,

Disponible en téléchargement quelque part ?


Bonsoir, exécutable + sources : https://drive.google.com/file/d/1pNl7Cu ... sp=sharing

UGraph.inc : Bib Graphique
Cavalcad.pas : Source du prog

Auteur :  Nemo59 [ 03 Nov 2020, 21:49 ]
Sujet du message :  Re: Z80 CPC et Extended instructions (ED)

marcel a écrit :
Chouette cette fonte true type :D


Nouvelle version avec les minuscules et accents...

Image

Image

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...

C'est hyper lisible sur mon CPC+ (monochrome :/ )

Auteur :  Plissken [ 04 Nov 2020, 11:23 ]
Sujet du message :  Re: Z80 CPC et Extended instructions (ED)

Tu n'utilises pas l'extension graphique du turbo pascal ?(Turbo Pascal Extension Graphique -Turbo Pascal GX)

Auteur :  Nemo59 [ 05 Nov 2020, 16:31 ]
Sujet du message :  Re: Z80 CPC et Extended instructions (ED)

Plissken a écrit :
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 çà :

Code :
{ =================================================
   UGraph : Unite graphique CPC6128 v0.1 - GC 2020
  ------------------------------------------------- }

Const TagFlag : Boolean = False;
      TagAddr : Integer = 0;
Var BGraph:Byte; IGraph1,IGraph2:Integer;

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"

Page 1 sur 1 Le fuseau horaire est UTC+1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/