Vous n'êtes pas identifié.
Salut !
J'ai téléchargé la dernière beta de gcomm, et il est fourni avec sa police de charactere.
Alors voila la grande question :
Comment utiliser ce fichier si, par exemple, je veux l'inclure à mes propres progs (histoire de rentabiliser ce téléchargement) ???
Hors ligne
lol
tu ouvres le fichier 'FONT' avec les routines memzone de 2072
ensuite tu px faire un truc du genre
unsigned char far* ascii = (unsigned char far*)MK_FP(bf.b_segment, bf.b_inneroffset)
un caractère prend 8 octets donc pour accéder à la première ligne d'un caractère tu fais : ascii[lettre * 8]
sachant que le police fait 5 pixels de hauteur et 4 de largeur.
Hors ligne
deux semaines plus tard ...
Merci beaucoup !
avec l'aide de Bija, j'ai crée une petite fonction qui permet d'afficher un chaine de caractere
# include <memzones.c> # include <casio2.h> unsigned char far* font; void main () { loadfont(3,"FONT"); textbm (0,0,"J'AIME LE POULET !"); textbm (0,6,"J'aime le poulet !"); textbm (0,13,"MADJAR IL EST TROP BEAU"); textbm (0,20,"Madjar il est trop beau"); textbm (0,27,"BIJA EST PAS MAL NON PLUS"); textbm (0,34,"Bija est pas mal non plus"); } int textbm (int x, int y, char texte []) { int i=0; while (texte [i]) { printb (texte [i],x+5*i,y); i++; } return (0); } int printb (char lettre,int x,int y) { int a,b,c,d; for (a=0; a<5; a++) { b=font[lettre*8+a]; for (c=7; c>3; c--) { if (b & 1<<c) setPix(x+7-c,y+a,0,1); else setPix(x+7-c,y+a,0,0); } } return (0); } int loadfont (int zone,char police []) { struct memory_zone bf; search_mem_zone(zone,police,&bf); font = (unsigned char far*)MK_FP(bf.b_segment, bf.b_inner_offset); return (0); }
comme je connais pas encore l'affichage octet par octet, j'utilise setpix()
donc c'est basé sur le boulo de Bija, et voici un prog de demo
les includes sont casio2.h et memzones.h
utilisation très simple :
on place
unsigned char far* font;
au debut du prog
on appelle loadfont (zone du fichier de police, non du fichier) pour charger la police
on appelle textbm (x,y,"Le texte") l'origine (0,0) est le premier pix en haut à droite
Hors ligne
Chouette, je sens que cette fonction va bcp me servir, merci madjar
Hors ligne
oui ça peut être utile mais... c'est un affichage pix/pix, donc "un peu" lent :?
Il doit y avoir moyen de le faire octet/octet... avis aux amateurs
Hors ligne
merci Bija, merci Dada66 !
malheuresement, les minuscules de la police sont pas terib !
Vous remarquerez que si vous voulez introduire un autre police, c'est aisément faisable ! (la question etant : comment la créer ?)
PS : désolé Bija de pas t'avoir prévenu, jlé fait en 1h et t'étais pas là !
Hors ligne
oui ça peut être utile mais... c'est un affichage pix/pix, donc "un peu" lent :?
Il doit y avoir moyen de le faire octet/octet... avis aux amateurs
Vais-je devoir rajouter quelques fonctions pour ça dans drawlib comme krach l'avait suggéré?
Hors ligne
"malheuresement, les minuscules de la police sont pas terib ! " t' as qu' a en proposer si t' en es pas content! non mais tu crois que c' est facile de faire des minuscules qui ressemblent vraiment à des minuscules en 4*5 pixel?? mdr t' es un marrant toi!
De plus vous pouvez toujours faire votre propre police!
Il suffit pour cela d' utiliser un nom de fichier différent de FONT et de rajouter vos 128 sprites ( codés sur 8 octets, la ligne la plus haute correspondant au 1er octet le plus bas) les uns à la suite des autres comme c' est spécifié dans le readme!
Quand au pixel/pixel je tiens à préciser que cette police n' est absollument pas fait pour le pxl/pxl mais bien en octet/octet!
Hors ligne
Ah booooon c'était pas prévu pour du pix/pix cette fonte? :ptdr:
Hors ligne
il faudrait étendre cette fonte en 8 bits (256 caractères), pour avoir les lettres accentuées...
Hors ligne
oui mais je connais pas trop (meme pas du tout) l'octet/octet donc j'utilise le pixel/pixel
mais comme c'est une police 4*5, je pense qu'il faut l'utiliser uniquement avec des majuscules !
merci dada66 !
Hors ligne
pour ce qui du octet/octet, je bosse dessus ! (j'essaye!)
"comme spécifié dans le readme" Quel readme ?
Hors ligne
g tjrs mes fonctions qui sont en octet/octet si tu vx.
Hors ligne
oué envoye, ça permetra d'eviter de refaire le boulo déjà fait !
Hors ligne
sources:
http://g100storage.free.fr/GComm/src.rar
Remarque : Code pour VC++1.5, certaines lignes ne sont pas compatible avec TC3, notament (__segment)&"var" qui peut être remplacé par _DS pour les pointeur non "far"
Pour les pointeurs far, remplacez par la macro _FP_SEG();
Hors ligne
et aussi de comprendre l'octet/octet
Commence d'abord par comprendre comment fonctionne la mémoire vidéo, apres avec quelques notions d'assembleur ca ira tout seul...
Hors ligne
bah bija et moi on est en train de bosser dessus ...
Hors ligne
non ca na va pas tout seul ! :evil: :evil:
ca fait pas mal de temps que j'essaie de comprendre comment fonctionne la mmoire vidéo, j'ai lu plein de tutos mais je n'y suis toujours pas arrivé.
j'ai calculé la position pour le mode C3
j'ai mis dans ax la ligne du sprite que je veux afficher en tenant compte du décalage
mais je ne sais pas comment l'affichre à l'écran !
Hors ligne
tu mets la bonne valeur dans es (0x1A20 pour afficher direct à l'écran par exemple), puis la bonne valeur dans di (mode C3: 0 pour les 8 pixels tout en bas à droite, 1 pour les 8 pixels juste au dessus, 64 pour les 8 pixels juste à gauche etc), et puis tu fais "and es:di, ax" et voilou
Hors ligne
bah voila ça marche !
le blem c'est qu'on appellait l'adresse video direct, sans la stoquer dans di avant ...
Hors ligne
bon voilà le résultat de notre boulot, malheuresement, ça n'a pas l'air de marcher normalement, et je vois pas où est le bug
ce qui est bizarre, c'est que ça marche en lettre pas lettre, mais si j'apelle une chaine de caractère directement, via la meme fonction que pour la version précédente, ça planté (colones de pixel blanches un peu n'importe ou (je croi que c'est un signe de l'écriture là ou il faut pas))
si quelqu'un pouvoait jeter un coup d'oeil... (j'ai commenté le source!)
//textbm 2 : la revenche du octet par octet (il revien et il est pas content) par Bija et Madjar #include <memzones.c> unsigned char far* font; void loadfont (int zone,char police []) //on prend le fichier spécifié dans la zone choisie, et on en extrait la police { struct memory_zone bf; search_mem_zone(zone,police,&bf); font = (unsigned char far*)MK_FP(bf.b_segment, bf.b_inner_offset); } void printbm (int x,int y,char lettre) { char a; int i,debut=0,fin=8; int adresse_video; char decalage; if (y<0) debut=-y; // clipping haut if (y>63) fin=127-y; // clipping bas if (x>=0) // si le caractère n'est pas à gauche de l'écran { for (i=debut;i<fin;i++) //boucle pour chaque ligne à afficher { a= font [lettre*8+i]; //recupere la bonne ligne de la bonne lettre adresse_video = 1023; // adresse_video = adresse_video - y; // definit où ecrire adresse_video = adresse_video - ( x / 8 ) *64 - i ; // decalage = x%8; //definit le decalage de la lettre sur l'octet asm mov ax, 0x1A20 //on ecrit l'adresse du buffer video asm mov es, ax //on le déplace dans es asm xor ax, ax //on vide ax asm mov ah, a //on met le bout à afficher dans ah asm mov cl, decalage //on définit le décalage dans cl asm shr ax,cl //on le décale asm mov di,adresse_video //on met l'adresse video ou ecrire dans di if (i<=4) asm mov bx,0x0F00 //on genere la partie haute du masque if (i>=5) asm mov bx,0xFF00 //la partie basse asm shl bx,cl //on decale le masque if (x<=120) asm and [es:di], bh //on affiche le masque if (x<=127) asm and [es:di-64], bl // les if sont pour le cas ou on veut ecrire à droite if (x<=120) asm or [es:di], ah //on affiche la lettre if (x<=127) asm or [es:di-64], al } } } void textbm (int x, int y, char texte []) { int i=0; while (texte [i]) { printbm (x+5*i,y,texte [i]); i++; } } void main () { loadfont (3,"FONT"); textbm (0,0,"J'AIME LE POULET !"); textbm (0,6,"J'aime le poulet !"); textbm (0,12,"MADJAR IL EST TROP BEAU"); textbm (0,18,"Madjar il est trop beau"); textbm (0,24,"BIJA EST PAS MAL NON PLUS"); textbm (0,30,"Bija est pas mal non plus"); }
Hors ligne
8O
ne mélange pas des instructions asm avec du C comme ca!!
Les instructions en C utilisent les registres et modifient leur contenu, donc tu ne peux absolument pas écrire qq chose comme ca:
if (x<=120) asm and [es:di], bh if (x<=127) asm and [es:di-64], bl if (x<=120) asm or [es:di], ah if (x<=127) asm or [es:di-64], al
Il y a des instructions asm pour faire des if, il faut les utiliser!
Hors ligne
sinon tu utilises un pointeur far.
unsigned char far* seg = 0x1A20;
et comme ca tu n'as k'a faire seg[1] = valdel'octet.
Mais dans les sources que g données ya le code (DrawSprite) qui le fait très bien et qui se compile sous TC3....
Hors ligne