EF9345 et le registre ROR

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Carl, Papy.G, fneck

joaopa
Messages : 422
Enregistré le : 14 sept. 2013 12:17

EF9345 et le registre ROR

Message par joaopa » 07 nov. 2014 18:15

Bonjour,

je voudrais écrire dans la deuxième page de la mémoire privée de l'EF9345:
Pour ceci je charge la valeur 28h dans le registre ROR comme indiqué dans le document de Thomson (dans le livre astuces pour Alice ils utilisent la même valeur)
J'obtiens le code

Code : Tout sélectionner

        org 5000h
	jp	debut

ef9345: d=numero du registre de l'ef9345 et e sa valeur
	push	bc
	call	3452
	call	busy
	pop	bc
	ret

busy:
	push	af
	call	646
	pop	af
	ret

debut:
	di
	push	hl
	push	ix	

	ld	d,33
	ld	e,0
	call	ef9345
	ld	d,40
	ld	e,129
	call	ef9345; ecrire dans le registre TGS (commandes longues)
	ld	d,33
	ld	e,127
	call	ef9345
	ld	d,40
	ld	e,131
	call	ef9345; ecrire dans le registre PAT
	ld	d,33
	ld	e,12
	call	ef9345
	ld	d,40
	ld	e,130
	call	ef9345; ecrire dans le registre MAT
	ld	d,33
	ld	e,35
	call	ef9345
	ld	d,40
	ld	e,132
	call	ef9345; ecrire dans le registre DOR
	
	ld	d,33
	ld	e,0+8
	call	ef9345
	ld	d,40
	ld	e,135
	call	ef9345; ecrire dans le registre ROR
	
	ld	d,33
	ld	e,65
	call	ef9345
	ld	d,34
	ld	e,1
	call	ef9345
	ld	d,35
	ld	e,50h
	call	ef9345
	ld	d,38
	ld	e,20
	call	ef9345
	ld	d,39
	ld	e,20
	call	ef9345
	ld	d,40
	ld	e,0
	call	ef9345
fin: jp fin
Mais la lettre A ne s'affiche pas. Si je change la valeur de ROR en 8 (premiere page), le A s'affiche. Quelqu'un voit-il le problème?
Je précise que je n'ai pas de vrai VG5000 à disposition en ce moment, donc je teste seulement sur DCVG5K.

Avatar du membre
Papy.G
Modérateur
Messages : 1878
Enregistré le : 10 juin 2014 13:40
Localisation : Haute-Garonne/Gers

Re: EF9345 et le registre ROR

Message par Papy.G » 07 nov. 2014 20:13

Je n'ai pas eu le temps de regarder en détail ce que tu essaies de faire avec le code, mais la doc du 9345 signale que le début de page écran doit se trouver dans un bloc pair, ce que tu appelles la page 2 n'est pas le deuxième bloc, par hasard?
Modifié en dernier par Papy.G le 08 nov. 2014 10:04, modifié 2 fois.
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.

joaopa
Messages : 422
Enregistré le : 14 sept. 2013 12:17

Re: EF9345 et le registre ROR

Message par joaopa » 08 nov. 2014 07:56

Bon, j'ai compris ce qu'il se passait (grâce a l'outil présent dans DCVG5k qui montre le contenu de la mémoire de l'EF9345 ).
Merci Daniel pour ce formidable outil.

Ce n'est pas précisé dans la doc technique de l'EF9345 ni dans les astuces de l'Alice (ou alors je ne l'ai pas vu :oops: ) mais pour afficher quelque chose sur la deuxième page, il faut ajouter 20h (32) pour le numéro de colonne. Il fallait le savoir :evil:

@Papy.g L premier bloc doit être pair (et non impair)

Avatar du membre
Papy.G
Modérateur
Messages : 1878
Enregistré le : 10 juin 2014 13:40
Localisation : Haute-Garonne/Gers

Re: EF9345 et le registre ROR

Message par Papy.G » 08 nov. 2014 10:20

J'ai corrige ce que je voulais dire, mais de toute façons, ROR ne pointe que vers les blocs pairs, n'ayant pas Z0.

Vérifié dans la doc du 9345 (tableau 3, page 15/38 de la doc de Thomson, édition de mars 1995), on nous dit:
ROR se compose de: Z3Z1Z2(bloc origin, even), puis Bits 4 à 0, origin row adress YOR=8 to 31
Donc, si tu veux pointer le bloc 2, tu mets 010, et à suivre, pour commencer ligne 1 en Y8, 01000, ce qui fait bien 48h

Désolé de ne pas avoir pris le temps hier soir de me pencher dessus. :oops:
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.

Daniel
Messages : 11609
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: EF9345 et le registre ROR

Message par Daniel » 08 nov. 2014 10:39

joaopa a écrit :Merci Daniel pour ce formidable outil.
Au départ l'outil de mise au point était destiné à contrôler le bon fonctionnement de l'émulateur. L'EF9345 est tellement difficile à comprendre que je ne suis pas encore sûr à 100% de la fidélité de l'émulation. Il ne faut pas trop lui faire confiance.
Je suis très content que cet outil puisse aussi servir aux développeurs 8)
Daniel
L'obstacle augmente mon ardeur.

joaopa
Messages : 422
Enregistré le : 14 sept. 2013 12:17

Re: EF9345 et le registre ROR

Message par joaopa » 09 nov. 2014 14:46

Daniel> Grâce a cet outil, on voit précisement ce qu'il se passe au niveau le plus bas de la machine. Pour debugger c'est génial.

Seul petit bémol, c'est qu'il n'existe qu'une version Windows. Je suis sous linux, donc j'utilise dcvg5k avec wine mais ce serait mieux d'avoir une version native de cet outil (le problème se pose aussi pour les utilisateurs d'un mac). Peux-tu adapter l'outil de debuggage pour la version sdl de dcvg5k?

Daniel
Messages : 11609
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: EF9345 et le registre ROR

Message par Daniel » 09 nov. 2014 18:43

Non, j'ai arrêté de développer pour Linux, je perdais trop de temps. A chaque nouvelle version des distributions, mes programmes ne fonctionnaient plus et il me fallait à chaque fois des heures, voire des jours, pour les mettre à niveau. En plus je ne suis pas à l'aise avec ce système car je le connais mal. Si un programmeur Linux veut prendre le relais pour développer la version SDL de dcvg5k, il est le bienvenu. La licence de l'émulateur le permet.

Avec Windows, au contraire, les programmes écrits en 1997 pour Windows 95 fonctionnent aujourd'hui dans Windows 8.1 sans aucune modification. C'est le rêve pour un développeur, il peut se consacrer entièrement à la logique de l'application sans être constamment gêné par des évolutions du système.
Daniel
L'obstacle augmente mon ardeur.

joaopa
Messages : 422
Enregistré le : 14 sept. 2013 12:17

Re: EF9345 et le registre ROR

Message par joaopa » 09 nov. 2014 19:42

Je veux bien essayer d'adapter l'outil de deboggage pour la version sdl. Peux tu distribuer le source de cette partie de l'emulateur?

Daniel
Messages : 11609
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: EF9345 et le registre ROR

Message par Daniel » 09 nov. 2014 20:29

Code : Tout sélectionner

//////////////////////////////////////////////////////////////////////////////
// DCVG5Kdebug.c - Debugger
// Author : Daniel Coulom - danielcoulom@gmail.com
// Creation : July 2005
//////////////////////////////////////////////////////////////////////////////

#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BYTE_TYPE_DEFINED
#include "Z80.h"
#include "dcvg5k.h"

#define GET8  c = Newcar(string, a++)
#define GET16 GET8; x = c << 8; GET8; x += c

// global variables //////////////////////////////////////////////////////////
HWND hwnddebug;   //handle for debug window
HFONT hfont;      //handle for dump and disassembly listbox font
int loadaddress;  // adresse de chargement fichier ou octets
int loadbyte;     // valeur des octets a charger
int dumpaddress;  // adresse dump memoire et desassemblage
int breakaddress; // adresse du breakpoint affiche
int breakpoint;   // adresse du breakpoint courant
int nextbreak;    // adresse du breakpoint suivant
int breaktype;    // nature du point d'arret
char ligne[80];   // chaine de travail
char text[5];     // chaine de travail
int pausestatus;  // sauvegarde du flag pause

// external variables ////////////////////////////////////////////////////////
extern HWND hwndstatus; //handle for status window
extern int xbitmap, ybitmap;
extern char ram[];
//extern char rom[];
extern char *rom;
extern char progdir[];
extern char filename[];
extern int pause;
extern Z80 CPU;
extern int language;
extern char *msg_string[][2];

//Acquisition d'un nouveau caractere
int Newcar(char *string, int address)
{
 char work[3];
 int c = 0xff & RdZ80(address);
 //ajout dans ligne (en hexadecimal)
 sprintf(work, "%02x", c);
 strcat(string, work);
 return c;
}

// Desassembly ///////////////////////////////////////////////////////////////
int DasmZ80(char *string, int a)
/*
string = pointeur vers une chaine recevant la ligne desassemblee
a = adresse des caracteres a desassembler
retour = nombre d'octets desassembles
*/
{
 char *depart;
 char instruction[80];
 int i, j, nbytes;

 //initialisation de la ligne avec l'adresse de l'instruction
 sprintf(string, "%04x  ", a);
 //desassemblage
 depart = (a < 0x4000) ? rom + a : ram + a - 0x4000;
 nbytes = DAsm(instruction, depart);
 //code hexadecimal
 for(i = 0; i < 4; i++)
 {
  if(i < nbytes) sprintf(string + 6 + 2 * i, "%02x", RdZ80(a++));
  else strcat(string, "  ");
 }
 strcat(string, " \t");
 //code operation
 for(i = 1; i < 10; i++)
 {
  if(instruction[i] == 0x00) {instruction[i + 1] = 0; break;}
  if(instruction[i] == 0x20) {instruction[i] = 0; break;}
 }
 strcat(string, instruction);
 for(j = i; j < 7; j++) strcat(string, " ");
 strcat(string, "\t");
 //operande
 strcat(string, instruction + i + 1);
 return nbytes;
}

// memory dump ///////////////////////////////////////////////////////////////
int Dump(char *string, int address)
/*
string = pointeur vers une chaine recevant la ligne dumpee
address = adresse des caracteres a dumper
retour = nombre d'octets dumpes
*/
{
 int i;
 char work[3];
 char text20[20] = {"\t  "};
 sprintf(string, "%04x", address);
 //strupr(string); //en majuscule, pb de tabulation si adresse DDDD
 for(i = 0; i < 16; i++)
 {
  int c = 0xff & RdZ80(address++);
  //dump hexadecimal
  sprintf(work, "\t%02x", c);
  strcat(string, work);
  //dump caracteres
  if((c < 0x20) || (c > 0x7f)) strcat(text20, ".");
  else {sprintf(work, "%c", c); strcat(text20, work);}
 }
 strcat(string, text20);
 return 16;
}

// video dump ///////////////////////////////////////////////////////////////
int Dumpvideo(char *string, int address)
/*
string = pointeur vers une chaine recevant la ligne dumpee
address = adresse des caracteres a dumper
retour = nombre d'octets dumpes
*/
{
 int i;
 char work[3];
 char text20[20] = {"\t  "};
 extern char EF9345ram[];
 sprintf(string, "%04x", address);
 //strupr(string); //en majuscule, pb de tabulation si adresse DDDD
 for(i = 0; i < 16; i++)
 {
  int c = 0xff & EF9345ram[address++];
  //dump hexadecimal
  sprintf(work, "\t%02x", c);
  strcat(string, work);
  //dump caracteres
  if((c < 0x20) || (c > 0x7f)) strcat(text20, ".");
  else {sprintf(work, "%c", c); strcat(text20, work);}
 }
 strcat(string, text20);
 return 16;
}

// I/O ports dump /////////////////////////////////////////////////////////////
int DumpIO(char *string, int address)
/*
string = pointeur vers une chaine recevant la ligne dumpee
address = adresse des caracteres a dumper
retour = nombre d'octets dumpes
*/
{
 int i;
 char work[3];
 char text20[20] = {"\t  "};
 extern char ioport[];
 sprintf(string, "%04x", address);
 //strupr(string); //en majuscule, pb de tabulation si adresse DDDD
 for(i = 0; i < 16; i++)
 {
  int c = 0xff & ioport[address++];
  //dump hexadecimal
  sprintf(work, "\t%02x", c);
  strcat(string, work);
  //dump caracteres
  if((c < 0x20) || (c > 0x7f)) strcat(text20, ".");
  else {sprintf(work, "%c", c); strcat(text20, work);}
 }
 strcat(string, text20);
 return 16;
}

// Modify registers //////////////////////////////////////////////////////////
void Registermodify(HWND hwnd)
{
 //get new values
 //GetDlgItemText(hwnd, 911, text, 5); X = strtol(text, NULL, 16);
 //GetDlgItemText(hwnd, 912, text, 5); Y = strtol(text, NULL, 16);
 //GetDlgItemText(hwnd, 913, text, 5); S = strtol(text, NULL, 16);
 //GetDlgItemText(hwnd, 914, text, 5); U = strtol(text, NULL, 16);
 //GetDlgItemText(hwnd, 915, text, 5); PC = strtol(text, NULL, 16);
 //GetDlgItemText(hwnd, 916, text, 3); *A = strtol(text, NULL, 16);
 //GetDlgItemText(hwnd, 917, text, 3); *B = strtol(text, NULL, 16);
 //GetDlgItemText(hwnd, 918, text, 3); *DP = strtol(text, NULL, 16);
 //GetDlgItemText(hwnd, 919, text, 3); CC = strtol(text, NULL, 16);
}

// Display registers and cycles ///////////////////////////////////////////////
void Registerdisplay(HWND hwnd)
{
 HWND hdumpbox = GetDlgItem(hwnd, 961); //handle hardware dump
 int i, a = 0x80;
 int tab[1] = {11}; //tabulation pour le dump
 extern Z80 CPU;
 extern char EF9345reg[];         //registres R0 à R7
 extern char EF9345status;        //registre status
 extern int cycleirq, cycleline, nline;
 extern int Indexram(int r);
 //extern int EF9345index;          //index ram EF9345
 //extern int videolinenumber, videolinecycle;
 //Z80 registers
 sprintf(text,"%04x", CPU.PC.W  & 0xffff); SetDlgItemText(hwnd, 911, text);
 sprintf(text,"%04x", CPU.SP.W  & 0xffff); SetDlgItemText(hwnd, 912, text);
 sprintf(text,"%04x", CPU.IY.W  & 0xffff); SetDlgItemText(hwnd, 913, text);
 sprintf(text,"%04x", CPU.IX.W  & 0xffff); SetDlgItemText(hwnd, 914, text);
 sprintf(text,"%02x", CPU.I     & 0xff  ); SetDlgItemText(hwnd, 915, text);
 sprintf(text,"%02x", CPU.R     & 0xff  ); SetDlgItemText(hwnd, 916, text);
 sprintf(text,"%04x", CPU.AF.W  & 0xffff); SetDlgItemText(hwnd, 917, text);
 sprintf(text,"%04x", CPU.BC.W  & 0xffff); SetDlgItemText(hwnd, 918, text);
 sprintf(text,"%04x", CPU.DE.W  & 0xffff); SetDlgItemText(hwnd, 919, text);
 sprintf(text,"%04x", CPU.HL.W  & 0xffff); SetDlgItemText(hwnd, 920, text);
 sprintf(text,"%04x", CPU.AF1.W & 0xffff); SetDlgItemText(hwnd, 921, text);
 sprintf(text,"%04x", CPU.BC1.W & 0xffff); SetDlgItemText(hwnd, 922, text);
 sprintf(text,"%04x", CPU.DE1.W & 0xffff); SetDlgItemText(hwnd, 923, text);
 sprintf(text,"%04x", CPU.HL1.W & 0xffff); SetDlgItemText(hwnd, 924, text);
 sprintf(text,"%02x", CPU.IFF   & 0xff  ); SetDlgItemText(hwnd, 925, text);
 //EF9345 registers
 sprintf(text,"%02x", EF9345reg[0] & 0xff); SetDlgItemText(hwnd, 980, text);
 sprintf(text,"%02x", EF9345reg[1] & 0xff); SetDlgItemText(hwnd, 981, text);
 sprintf(text,"%02x", EF9345reg[2] & 0xff); SetDlgItemText(hwnd, 982, text);
 sprintf(text,"%02x", EF9345reg[3] & 0xff); SetDlgItemText(hwnd, 983, text);
 sprintf(text,"%02x", EF9345reg[4] & 0xff); SetDlgItemText(hwnd, 984, text);
 sprintf(text,"%02x", EF9345reg[5] & 0xff); SetDlgItemText(hwnd, 985, text);
 sprintf(text,"%02x", EF9345reg[6] & 0xff); SetDlgItemText(hwnd, 986, text);
 sprintf(text,"%02x", EF9345reg[7] & 0xff); SetDlgItemText(hwnd, 987, text);
 sprintf(text,"%02x", EF9345status & 0xff); SetDlgItemText(hwnd, 905, text);
 sprintf(text,"%04x", EF9345_ramindex(7) & 0xffff); SetDlgItemText(hwnd, 906, text);
 sprintf(text,"%02x", EF9345reg[8] & 0xff); SetDlgItemText(hwnd, 900, text);
 sprintf(text,"%02x", EF9345reg[9] & 0xff); SetDlgItemText(hwnd, 901, text);
 sprintf(text,"%02x", EF9345reg[10] & 0xff); SetDlgItemText(hwnd, 902, text);
 sprintf(text,"%02x", EF9345reg[11] & 0xff); SetDlgItemText(hwnd, 903, text);
 sprintf(text,"%02x", EF9345reg[12] & 0xff); SetDlgItemText(hwnd, 904, text);

 //hardware registers
 SendMessage(hdumpbox, LB_RESETCONTENT, 0, 0);
 SendMessage(hdumpbox, LB_SETTABSTOPS, 1, (LPARAM)tab);
 for(i = 0; i < 3; i++)
 {
  a += DumpIO(ligne, a) + 16;
  SendMessage(hdumpbox, LB_ADDSTRING, 0, (LPARAM)ligne);
 }
 SendMessage(hdumpbox, LB_SETSEL, TRUE, 0);
 //cycles
 //sprintf(text, "%d", videolinenumber); SetDlgItemText(hwnd, 962, text);
 //sprintf(text, "%d", videolinecycle); SetDlgItemText(hwnd, 964, text);
 //compteurs
 sprintf(text,"%i", cycleirq); SetDlgItemText(hwnd, 991, text);
 sprintf(text,"%i", cycleline); SetDlgItemText(hwnd, 992, text);
 sprintf(text,"%i", nline); SetDlgItemText(hwnd, 993, text);

}

// Set next breakpoint ///////////////////////////////////////////////////////
void Setnextbreak()
{
 int address;
 address = CPU.PC.W & 0xffff;
 address += DasmZ80(ligne, address);
 nextbreak = -1;
 if(strstr(ligne, "CALL")) nextbreak = address & 0xffff;
 if(strstr(ligne, "HALT")) nextbreak = address & 0xffff;
}

// Disassembly at PC address /////////////////////////////////////////////////
void PCdasdisplay(HWND hwnd)
{
 HWND hpcdasbox = GetDlgItem(hwnd, 971); //handle listbox dasm PC
 int i, address;
 Setnextbreak();
 SendMessage(hpcdasbox, LB_RESETCONTENT, 0, 0);
 address = CPU.PC.W & 0xffff;
 for(i = 0; i < 20; i++)
 {
  address += DasmZ80(ligne, address);
  /*
  if(i == 0)
  {
   nextbreak = -1;
   if(strstr(ligne, "CALL")) nextbreak = address & 0xffff;
   if(strstr(ligne, "HALT")) nextbreak = address & 0xffff;
  }
  */
  SendMessage(hpcdasbox, LB_ADDSTRING, 0, (LPARAM)strupr(ligne));
 }
 SendMessage(hpcdasbox, LB_SETSEL, TRUE, 0);
}

// Display Break Point ///////////////////////////////////////////////////////
void BPdisplay(HWND hwnd)
{
 sprintf(text,"%04x", breakaddress & 0xffff);
 SetDlgItemText(hwnd, 932, text);
 CheckRadioButton(hwnd, 935, 938, 935 + breaktype);
}

// Display das and dump + copy to clipboard ///////////////////////////////////
void Dasdisplay(HWND hwnd)
{
 int address, addressmax;
 int tab[1]; //tabulation pour le dump
 HWND hdasbox = GetDlgItem(hwnd, 941); //handle listbox dasm BP
 HWND hdumpbox = GetDlgItem(hwnd, 942); //handle listbox dump BP
 HWND hvideobox = GetDlgItem(hwnd, 959); //handle listbox dump video
 sprintf(text, "%04x", dumpaddress & 0xffff);
 SetDlgItemText(hwnd, 944, text);
 sprintf(text,"%02x", RdZ80(dumpaddress) & 0xff);
 SetDlgItemText(hwnd, 947, text);
 sprintf(text, "%04x", loadaddress & 0xffff);
 SetDlgItemText(hwnd, 950, text);
 sprintf(text, "%02x", loadbyte & 0xff);
 SetDlgItemText(hwnd, 953, text);

 //Desassembly 0x1000 bytes at dasaddress
 address = dumpaddress;
 addressmax = dumpaddress + 0x1000;
 if(addressmax > 0xffff) addressmax = 0xffff;
 SendMessage(hdasbox, LB_RESETCONTENT, 0, 0);
 while(address < addressmax)
 {
  address += DasmZ80(ligne, address);
  SendMessage(hdasbox, LB_ADDSTRING, 0, (LPARAM)strupr(ligne));
 }
 SendMessage(hdasbox, LB_SETSEL, TRUE, 0);

 //Dump at dasaddress
 tab[0] = 10;
 address = dumpaddress;
 SendMessage(hdumpbox, LB_RESETCONTENT, 0, 0);
 SendMessage(hdumpbox, LB_SETTABSTOPS, 1, (LPARAM)tab);
 //sprintf(text, "%04x", address);
 //MessageBox(NULL, text, "rammax", MB_OK);
 while(address < addressmax)
 {
  address += Dump(ligne, address);
  SendMessage(hdumpbox, LB_ADDSTRING, 0, (LPARAM)ligne);
 }
 SendMessage(hdumpbox, LB_SETSEL, TRUE, 0);

 //Dump video memory
 address = 0;
 SendMessage(hvideobox, LB_RESETCONTENT, 0, 0);
 SendMessage(hvideobox, LB_SETTABSTOPS, 1, (LPARAM)tab);
 while(address < 0x4000)
 {
  address += Dumpvideo(ligne, address);
  SendMessage(hvideobox, LB_ADDSTRING, 0, (LPARAM)ligne);
 }
 SendMessage(hvideobox, LB_SETSEL, TRUE, 0);
}

// Run one program step //////////////////////////////////////////////////////
void Stepbystep(HWND hwnd)
{
 KillTimer(hwnd, 1);
 Run(1);
 Registerdisplay(hwnd);
 PCdasdisplay(hwnd);
 Refreshdisplay();
}

// Copy selected items to clipboard //////////////////////////////////////////
void Copytoclipboard(HWND hlistbox)
{
 HGLOBAL hClipboard;  // handle for the clipboard data
 LPTSTR lpClipboard;  // pointer to the clipboard text
 int clipmax = 65000; // taille maxi du clipboard
 int cliplength;      // taille du clipboard
 int j, i, imax;
 //choix de l'utilisateur
 i = MessageBox(NULL, msg_string[M_CLIPBOARD][language],
                msg_string[M_ACKNOWLEDGE][language],
                MB_OKCANCEL|MB_TOPMOST|MB_ICONWARNING);
 if(i == IDCANCEL) return;
 //int Prompt(int t, int m);
 //if(Prompt(2130, 2260) == IDNO) return;

 //Empty clipboard
 if(OpenClipboard(hlistbox)) EmptyClipboard();
 else{MessageBox(NULL, "OpenClipboard failed", "Error", MB_OK); return;}
 //Allocate global memory
 if((hClipboard = GlobalAlloc(GMEM_MOVEABLE, clipmax)) == NULL)
 {MessageBox(NULL, "GlobalAlloc failed", "Error", MB_OK); return;}
 //Lock global memory
 if((lpClipboard = GlobalLock(hClipboard)) == NULL)
 {MessageBox(NULL, "GlobalLock failed", "Error", MB_OK); return;}
 //Copy selected lines
 cliplength = 0;
 imax = SendMessage(hlistbox, LB_GETCOUNT, 0, 0);
 for(i = 0; i < imax; i++)
 {
  if(!SendMessage(hlistbox, LB_GETSEL, (WPARAM)i, 0)) continue;
  SendMessage(hlistbox, LB_GETTEXT, (WPARAM)i, (LPARAM)ligne);
  if((cliplength + lstrlen(ligne) + 3) >= clipmax) break;
  for(j = 0; j < lstrlen(ligne); j++) if(ligne[j] == 0x09) ligne[j] = 32;
  memcpy(lpClipboard + cliplength, ligne, lstrlen(ligne));
  cliplength += lstrlen(ligne);
  memcpy(lpClipboard + cliplength, "\r\n", 2); //add CR-LF
  cliplength += 2;
 }
 memcpy(lpClipboard + cliplength, "", 1); //end of clipbord text
 //send to clipboard
 GlobalUnlock(hClipboard);
 SetClipboardData(CF_TEXT, hClipboard);
 CloseClipboard();
}

// Chargement d'un fichier binaire ////////////////////////////////////////////
void Loadbinaryfile()
{
 FILE *fp;
 int i, c;
 if(Getnewfilename(7) < 0) return;
 fp = fopen(filename, "rb");
 if(fp == NULL) return;
 i = loadaddress;
 while((c = getc(fp)) != EOF) WrZ80(i++, c);
 fclose(fp);
}

// Initialisation des texte de la boite de dialogue ///////////////////////////
void Initdialogtext(HWND hwnd)
{
 SetWindowText(hwnd, msg_string[90][language]);
 SetDlgItemText(hwnd, 910, msg_string[91][language]);
 SetDlgItemText(hwnd, 928, msg_string[92][language]);
 SetDlgItemText(hwnd, 929, msg_string[93][language]);
 SetDlgItemText(hwnd, 960, msg_string[94][language]);
 SetDlgItemText(hwnd, 970, msg_string[95][language]);
 SetDlgItemText(hwnd, 930, msg_string[96][language]);
 SetDlgItemText(hwnd, 931, msg_string[97][language]);
 SetDlgItemText(hwnd, 933, msg_string[98][language]);
 SetDlgItemText(hwnd, 934, msg_string[99][language]);
 SetDlgItemText(hwnd, 935, msg_string[100][language]);
 SetDlgItemText(hwnd, 936, msg_string[101][language]);
 SetDlgItemText(hwnd, 937, msg_string[102][language]);
 SetDlgItemText(hwnd, 938, msg_string[103][language]);
 SetDlgItemText(hwnd, 940, msg_string[104][language]);
 SetDlgItemText(hwnd, 943, msg_string[105][language]);
 SetDlgItemText(hwnd, 945, msg_string[107][language]);
 SetDlgItemText(hwnd, 946, msg_string[106][language]);
 SetDlgItemText(hwnd, 949, msg_string[105][language]);
 SetDlgItemText(hwnd, 948, msg_string[108][language]);
 SetDlgItemText(hwnd, 951, msg_string[109][language]);
 SetDlgItemText(hwnd, 952, msg_string[110][language]);
 SetDlgItemText(hwnd, 954, msg_string[111][language]);
 SetDlgItemText(hwnd, 956, msg_string[112][language]);
}

// Callback for debug dialog /////////////////////////////////////////////////
INT_PTR CALLBACK DebugDlgProc
(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 HWND hlistbox;
 int i;
 switch(msg)
 {
  case WM_INITDIALOG:
   pausestatus = pause;
   Pause(1);  //arret du processeur
   breaktype = 2; //pas à pas
   Initdialogtext(hwnd);
   //font listbox
   hfont = CreateFont(14,8,0,0,0,0,0,0,ANSI_CHARSET,0,0,0,0, "Courier New");
   hlistbox = FindWindowEx(hwnd, NULL, "LISTBOX", NULL);
   SendMessage(hlistbox, WM_SETFONT, (WPARAM)hfont, TRUE);
   hlistbox = FindWindowEx(hwnd, hlistbox, "LISTBOX", NULL);
   SendMessage(hlistbox, WM_SETFONT, (WPARAM)hfont, TRUE);
   hlistbox = FindWindowEx(hwnd, hlistbox, "LISTBOX", NULL);
   SendMessage(hlistbox, WM_SETFONT, (WPARAM)hfont, TRUE);
   hlistbox = FindWindowEx(hwnd, hlistbox, "LISTBOX", NULL);
   SendMessage(hlistbox, WM_SETFONT, (WPARAM)hfont, TRUE);
   hlistbox = FindWindowEx(hwnd, hlistbox, "LISTBOX", NULL);
   SendMessage(hlistbox, WM_SETFONT, (WPARAM)hfont, TRUE);
   //variables
   Registerdisplay(hwnd);
   PCdasdisplay(hwnd);
   BPdisplay(hwnd);
   Dasdisplay(hwnd);
   return TRUE;

  case WM_COMMAND: switch(LOWORD(wParam))
  {
   case 961: case 971: case 941: case 942: case 959:
    if(HIWORD(wParam) == LBN_DBLCLK) Copytoclipboard((HWND)lParam);
    break;

   case 928: //Confirm change
    Registermodify(hwnd);
    Registerdisplay(hwnd);
    PCdasdisplay(hwnd);
    break;

   case 929: //Cancel change
    Registerdisplay(hwnd);
    break;

   case 933: //Exec
    if(IsDlgButtonChecked(hwnd, 935)) breaktype = 0; //No break
    if(IsDlgButtonChecked(hwnd, 936)) breaktype = 1; //Static
    if(IsDlgButtonChecked(hwnd, 937)) breaktype = 2; //Next step
    if(IsDlgButtonChecked(hwnd, 938)) breaktype = 3; //Step over
    GetDlgItemText(hwnd, 932, text, 5);
    breakaddress = breakpoint = strtol(text, NULL, 16);
    BPdisplay(hwnd); PCdasdisplay(hwnd);
    switch(breaktype)
    {
     case 2: //step by step
      Stepbystep(hwnd);
      break;
     case 3: //step over
      //pas d'appel subroutine -> step by step
      if(nextbreak < 0) {Stepbystep(hwnd); break;}
      //appel de subroutine -> exécution jusqu'à nextbreak
      breakpoint = nextbreak;
      BPdisplay(hwnd);
      SetTimer(hwnd, 1, 100, NULL);
      break;
     default: //execution jusqu'à breakpoint (si actif)
      SetTimer(hwnd, 1, 100, NULL);
      break;
    }
    break;

   case 934: //Stop
    KillTimer(hwnd, 1);
    PCdasdisplay(hwnd);
    break;

   case 945: //Display
    GetDlgItemText(hwnd, 944, text, 5);
    dumpaddress = strtol(text, NULL, 16);
    Dasdisplay(hwnd);
                          //{extern int cycle;
                          // extern char message[];
                          // sprintf(message, "%d", cycle);
                          // MessageBox(NULL, message, "Cycle", MB_OK);}
    break;

   case 948: //Modify
    GetDlgItemText(hwnd, 944, text, 5); //Address
    dumpaddress = strtol(text, NULL, 16);
    GetDlgItemText(hwnd, 947, text, 3); //Value
    WrZ80(dumpaddress, strtol(text, NULL, 16));
    dumpaddress++;
    Dasdisplay(hwnd);
    break;

   case 951: //Load binary file
    GetDlgItemText(hwnd, 950, text, 5);
    loadaddress = strtol(text, NULL, 16);
    Loadbinaryfile();
    break;

   case 954: //Load 4Kbytes
    GetDlgItemText(hwnd, 950, text, 5);
    loadaddress = strtol(text, NULL, 16);
    GetDlgItemText(hwnd, 953, text, 3);
    loadbyte = strtol(text, NULL, 16);
    for(i = 0; i < 0x1000; i++) WrZ80(loadaddress + i, loadbyte);
    break;

   case IDCANCEL:
    //if(OpenClipboard(hwnd)) {EmptyClipboard(); CloseClipboard();}
    //DeleteObject(hfont);
    if(OpenClipboard(hwnd)) CloseClipboard();
    GetDlgItemText(hwnd, 944, text, 5); //Address
    dumpaddress = strtol(text, NULL, 16);
    GetDlgItemText(hwnd, 950, text, 5);
    loadaddress = strtol(text, NULL, 16);
    GetDlgItemText(hwnd, 953, text, 3);
    loadbyte = strtol(text, NULL, 16);
    hwnddebug = NULL;
    Pause(pausestatus);
    DestroyWindow(hwnd);
    break;
  }
   return TRUE;

  case WM_TIMER:
   i = 5000;
   while(i--)
   {
    Run(1);
    if(breaktype > 0)
     if((CPU.PC.W & 0xffff) == (breakpoint & 0xffff))
      {KillTimer(hwnd, 1); PCdasdisplay(hwnd); i = 0;}
   }
   Registerdisplay(hwnd);
   return TRUE;

  default: return FALSE;
 }
}
Daniel
L'obstacle augmente mon ardeur.

joaopa
Messages : 422
Enregistré le : 14 sept. 2013 12:17

Re: EF9345 et le registre ROR

Message par joaopa » 10 nov. 2014 18:24

Merci beaucoup Daniel.
Quitte à faire, je pense même que je fais réécrire dcvg5k en opengl. Ce sera totalement portable. L'avantage de la sdl c'est que c'est portable et facilement mis en place. Mais tu as raison. C'est devenu une usine à gaz. La version2 n'est pas compatible en totalité avec la version 1.2. On est obligé d'installer les deux librairies si on a des applications utilisant les deux versions incompatibles :evil:

Avatar du membre
6502man
Messages : 9374
Enregistré le : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: EF9345 et le registre ROR

Message par 6502man » 10 nov. 2014 20:18

J'arrive un peu tard sur le sujet !

Tu dis ceci :
joaopa a écrit :je voudrais écrire dans la deuxième page de la mémoire privée de l'EF9345:
Mais avec l'EF9345 on parle de BLOC ça peut porter à confusion !

Il faut bien comprendre que l'EF9345 travail uniquement en rapport avec son partitionnement VRAM en bloc et de plus certains registres ne peuvent pas pointer sur n'importe quel bloc.

As tu lu le post que j'ai ouvert au sujet du EF-9345, j'explique justement l'organisation de la VRAM en bloc par l'EF9345 ?
Ou peut être que ce post n'est pas assez clair :? si c'est le cas je vais essayer de faire encore mieux :)
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.

joaopa
Messages : 422
Enregistré le : 14 sept. 2013 12:17

Re: EF9345 et le registre ROR

Message par joaopa » 14 mars 2015 06:17

Alors la c'est de plus en plus le mystère ce contrôleur graphique. J'arrive a avoir une corruption mémoire de l'EF9345 quand j'utilise deux blocs. L'un des blocs corrompt le second.
Voici le code: dans le block 0 j'affiche le dessin du robot dans le livre d'Alice. Dans le block 4, j'affiche le texte "texte d'essai". La premiere ligne dans le block 0 est corrompu comme vous pouvez le voir sur la capture d'écran. Quelqu'un a t'il une explication pour ca?

Code : Tout sélectionner

org 4b00h
	jp	debut

ef9345:; _________routine d'ecriture dans l'EF9345
	push	af
	push	bc
	call	3452
	call	646
	pop	bc
	pop	af
	ret

vggetchar:;_______routine de saisie clavier_________________
	push	hl
boucle_vggetchar:
	call	32b7h
	jp	c,boucle_vggetchar
	and	a
	jr	z,boucle_vggetchar
	pop	hl
	ret

robot:	db 3,1,54,127,62,28,8,8,20,34
texte:	db "Texte d'essai Texte d'essai",0

construit_sprite:
	ld	d,36
	ld	e,8
	call	ef9345
	ld	hl,robot
	xor	a
	ld	b,128+64
boucle_brique:
	ld	d,37
	ld	e,b
	call	ef9345
	ld	d,33
	ld	e,(hl)
	call	ef9345
	ld	d,40
	ld	e,52
	call	ef9345
	inc	b
	inc	b
	inc	b
	inc	b
	inc	a
	inc	hl
	cp	10
	jp	nz,boucle_brique
	ret

debut:
	di
	push	hl
	push	ix

	ld	d,33
	ld	e,0
	call	ef9345
	ld	d,32
	ld	e,129
	call	ef9345; ecrire dans le registre TGS (commandes longues)
	ld	d,33
	ld	e,127
	call	ef9345
	ld	d,40
	ld	e,131
	call	ef9345; ecrire dans le registre PAT
	ld	d,33
	ld	e,12
	call	ef9345
	ld	d,40
	ld	e,130
	call	ef9345; ecrire dans le registre MAT
	ld	d,33
	ld	e,35
	call	ef9345
	ld	d,40
	ld	e,132
	call	ef9345; DOR

	call	construit_sprite

    page1:;__________page du texte_________________
	ld	d,33; ecrire dans le registre ROR
	ld	e,40
	call	ef9345
	ld	d,40
	ld	e,135
	call	ef9345
	ld	d,34
	ld	e,1
	call	ef9345
	ld	d,35
	ld	e,50h
	call	ef9345
	ld	b,40
fill_page_1:
	ld	hl,texte
	ld	d,38
	ld	e,b
	call	ef9345
	ld	d,39
	ld	e,0
	call	ef9345
boucle_texte:
	ld	a,(hl)
	and	a
	jp	z,augmente_b
	ld	d,33
	ld	e,(hl)
	call	ef9345
	ld	d,40
	ld	e,1
	call	ef9345
	inc	hl
	jp	boucle_texte
augmente_b:
	inc	b
	ld  a,b
	cp 48
	jr  nz,fill_page_1

page2:;________page du robot___________________
	ld	d,33
	ld	e,8
	call	ef9345
	ld	d,40
	ld	e,135
	call	ef9345; ecrire dans le registre ROR
	ld	d,35
	ld	e,30h
	call	ef9345
	ld	d,34
	ld	e,128+1
	call	ef9345
	ld	d,33
	ld	e,32
	call	ef9345
	ld	b,31
fill_page_2:
	ld	d,38
	ld	e,b
	call	ef9345
	ld	d,39
	ld	e,0
	call	ef9345
	xor	a
fill_ligne_page_2:
	ld	d,40
	ld	e,1
	call	ef9345
	inc	a
	cp	40
	jr	nz,fill_ligne_page_2
	dec b
	ld a,b
	cp 10
	jr nz,	fill_page_2


	ld	h,8
intervertir:
	ld	a,h
	cp	8
	jp	z,changer
	ld	h,8
	jp	attend_touche
changer:
	ld	h,40
attend_touche:
	ld	d,33; ecrire dans le registre ROR
	ld	e,h
	call	ef9345
	ld	d,40
	ld	e,135
	call	ef9345
	call	vggetchar
	jp	intervertir
La capture d'écran
https://drive.google.com/file/d/0B0LM6E ... sp=sharing
et le fichier pour tester dans DCVG5K
https://drive.google.com/file/d/0B0LM6E ... sp=sharing

Avatar du membre
Papy.G
Modérateur
Messages : 1878
Enregistré le : 10 juin 2014 13:40
Localisation : Haute-Garonne/Gers

Re: EF9345 et le registre ROR

Message par Papy.G » 14 mars 2015 11:30

Comme ça, à chaud, j'aurais tendance à dire que ça pourrait être l'histoire du bit inversé Z3Z1Z2 (revoir en début de ce fil, surtout si tu es resté persuadé qu'il faille ajouter 20h systématiquement je ne sais trop où), et que ta page commençant normalement en bloc 4 se trouve en bloc 2, dernier bloc occupé par ta première page, si tu es en 24 bits fixe.
Sinon, tu as vérifié que les caractères utilisateurs ne sont pas définis dans un espace déjà utilisé pour une page?

Dans ROR, bits 7 à 5 bloc d'origine:

Bloc 4:
001

Bloc 2:
010

Pour les blocs occupés par les caractères perso, ne te reste que les blocs impairs 3 et 7, donc, tu ne pourras utiliser que:
G'0 en bloc 3 et 7
G'11 avec un début en bloc 2 ou 6
Q3 et Q7, avec un début en bloc 0

J'ai un peu de mal à comprendre la syntaxe des assembleurs, et ne connais pas le code 6502, mais il faut tant d'instructions pour écrire dans le registre ROR? :?
C'est un peu alambiqué de faire appel à une sous-routine qui fait elle-même appel à des routines en Rom, n'aurais-tu pas plus vite fait d'adresser directement le 9345 depuis ton code, surtout pour des valeurs statiques. A moins qu'il ne soit pas mappé en espace mémoire de façon fixe, désolé pour mon ignorance du matériel.
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.

joaopa
Messages : 422
Enregistré le : 14 sept. 2013 12:17

Re: EF9345 et le registre ROR

Message par joaopa » 14 mars 2015 17:40

Pour le bloc4 j'ai la valeur 40 (=28h) dans ROR
Pour le bloc0 ,j'ai la valeur 8.

La corruption ne vient pas d'un problème de redéfinition de caractère puisque lorsque j'utilise les caractères standards j'ai aussi cette corruption (voir la nouvelle capture d’écran)

https://drive.google.com/file/d/0B0LM6E ... sp=sharing

Des nouvelles idées?

Avatar du membre
Papy.G
Modérateur
Messages : 1878
Enregistré le : 10 juin 2014 13:40
Localisation : Haute-Garonne/Gers

Re: EF9345 et le registre ROR

Message par Papy.G » 14 mars 2015 19:35

Essaie d'inverser ce que tu mets dans tes pages, voir si le problème vient de ton code ou du "matériel" (code de l'émulateur)
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.

Répondre