Wie rechne ich ich bitte in TC3 diese 2 Werte um in Seg und Offs Adre.

OP #6150439
Lesenswert?

Hallo , guten Tag.

Ich habe hier 2 Malloc-Adressen.

Wie rechne ich die jetzt bitte in Segm und Offs um.
Ich habe mit Large kompiliert.

Ich weiß das sie sich ändern, wollte nur bitte das Rechenschema.

Das haut nicht hin:
seg1=*p/16;
offs1=*p-seg1;

Danke.
Angehängte Dateien:
Gast #6150550
Lesenswert?

Und wie immer: nicht ohne Beispiel?

Es ist nicht klar ob du vielleicht deinen ptr falsch castest oder sowas 
und deswegen komische Ergebnisse kommen...

MK_FP erzeugt einen far pointer

Also sollte etwas in der Form funktionieren
1
int far* cptr = ... malloc oder sonstiger far pointer
2
assert(MK_FP(cptr),MK_OFS(cptr))==cptr);
Gast #6150551
Lesenswert?

cppbert schrieb:
> Und wie immer: nicht ohne Beispiel?
>
> Es ist nicht klar ob du vielleicht deinen ptr falsch castest oder sowas
> und deswegen komische Ergebnisse kommen...
>
> MK_FP erzeugt einen far pointer
>
> Also sollte etwas in der Form funktionieren
> int far* cptr = ... malloc oder sonstiger far pointer
> assert(MK_FP(cptr),MK_OFS(cptr))==cptr);

Auf dem Tablet tippen ist muell...

assert(MK_FP(MK_SEG(cptr),MK_OFS(cptr))==cptr);
OP #6150673
Lesenswert?

Hallo,guten Tag.


Ich möchte mit "movedata" den bestimmten Bereich aus malloc jeweils in 
den VGA-Bereich kopieren.
movedata(segment,offset,0xa000,0,64000);

-----------------------------------------------
Meinst du nicht vielleicht einfach einen Pointer?.......
----------------------------------------------
Wenn der Wert dann so  genannt wird : ja.


> Es ist nicht klar ob du vielleicht deinen ptr falsch castest oder sowas

Das mit dem Poken funktioniert ja:
---------------------------------------------
void mal_vga1(unsigned char* p)
{
  unsigned short y;

  for (y = 0; y <=63999; y++)
  {
     pokeb (VIDEO_SEGMENT, y,*(p+y));
  }
}

void mal_vga2(unsigned char* pp)
{
  unsigned short y;

  for (y = 0; y <=63999; y++)
  {
    pokeb (VIDEO_SEGMENT, y,*(pp+y));
  }
}
---------------------------------------------



Das ist mein Programm welches nicht funktioniert:

--------------------------------------------
#include <dos.h>
#include <conio.h>
#include <io.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <mem.h>

#define VIDEO_SEGMENT  0xA000
#define SCREEN_WIDTH   320

unsigned   char *p;
unsigned   char *pp;

void SetTextMode ()
{
    _AH = 0;
    _AL = 0x03;
    geninterrupt (0x10);
}

void SetMode13h ()
{
    _AH = 0;
    _AL = 0x13;
    geninterrupt (0x10);
}

void vga_cls ()
{
  long y;

  for (y = 0; y <= 64000; y++)
  {
    pokeb (VIDEO_SEGMENT, y, 0);
  }
}

void voll(unsigned char* p, unsigned char* pp)
{
  unsigned short y;

  for (y = 0; y <=63999; y++)
  {
    *(p+y)=117;
    *(pp+y)=45;
  }
}

int main ()
{
char cmd;

p = malloc(64000 * sizeof(char));
pp = malloc(64000 * sizeof(char));

SetMode13h ();

do
{
 cmd = toupper(getch());

 switch (cmd)
 {
   case 'Q':
     voll(p, pp);
   break;

   case 'W':
     movedata(segment,offset,0xa000,0,64000);
   break;

   case 'S':
     movedata(segment1,offset1,0xa000,0,64000);
    break;

   case 'C':
     vga_cls ();
   break;

  }

 } while (cmd != 'E');

   SetTextMode();
}
---------------------------------------
#6150736
Lesenswert?

Dafür sind die Makros FP_OFF und FP_SEG (aus dos.h) da.
(Ich habe hier ein Buch für Quick-C 2.0. Da steht, dass die Makros auch 
in Turbo-C 2 existieren.)
1
movedata(FP_SEG(pp),FP_OFF(pp),0xa000,0,64000);

Bedenke, dass du dafür far-Pointer brauchst.
Die kann man explizit definieren oder ein entsprechendes Speichermodell 
verwenden.
#6150747
Lesenswert?

Peter B. schrieb:
> for (y = 0; y <= 64000; y++) // macht 64001 Durchläufe
> ....
> for (y = 0; y <=63999; y++)  // macht 64000 Durchläufe

Du solltest dir endlich mal den C-Style aneignen
1
for (y = 0; y < 64000; y++) // macht 64000 Durchläufe
Weil in der Bedingung die 64000 steht, sieht man sofort ohne 
Nachrechnen wieviele Durchläufe es sind.

Beachte auch, dass dort nur ein < steht (kein <=).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren