Autor Thema: Pascal Textausgabe  (Gelesen 4702 mal)

pascal

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« am: 28. November 2009, 14:54 »
Hallo erstmal, ich bin der neue  :-)

Ich habe ein problem mit dem Code, den ich vergangene Nacht geschrieben habe  :-(
Ich ganz einfache Textausgabe im Protected Mode hinkriegen. Meine Funktion Clearscreen funktioniert auch, jedoch schaffe ich es nicht Zeichen auszugeben. Wär nett wenn ihr euch das mal ansehen könntet, ich blick da grad nicht mehr durch  :wink:

unit video;

interface

const
MAX_SCREEN_WIDTH = 25;
MAX_SCREEN_HEIGHT = 80;
STANDARD_ATTR = $07;

type
  TScreenPixel = record
    c: char;
    attr: byte;
  end;


  PScreen = ^TScreen;
  TScreen = array[1..MAX_SCREEN_WIDTH, 1..MAX_SCREEN_HEIGHT] of TScreenPixel;

var
  screen: PScreen;

procedure initscreen(); 
procedure clearscreen();
procedure scroll(lines: Integer);
procedure putch(c: Char);

implementation

var
  x, y: Integer;

procedure initscreen(); [public, alias: 'initscreen'];
begin
screen := Pointer($B8000);
x := 1;
y := 1;
end;

procedure clearscreen(); [public, alias: 'clearscreen'];
var
w, h: Integer;
begin
for w := 1 to 25 do
begin
for h := 1 to 80 do
begin
screen^[w, h].c := #0;
screen^[w, h].attr := $07;
end;
end;
end;

procedure scroll(lines: Integer); [public, alias: 'scroll'];
var
n, I, J: Integer;
tempLine: array[1..25] of TScreenPixel;
begin
for n := 1 to lines do
begin
for I := 1 to 80 do
begin
for J := 1 to 25 do
begin
screen^[J, I-1] := screen^[J, I];
end;
end;
for J := 1 to 25 do
begin
screen^[J, 80].c := #0;
end;
end;
end;

procedure putch(c: Char); [public, alias: 'putch'];
begin
if c = #13 then y +=1;
if c = #10 then x := 1;

if x > MAX_SCREEN_WIDTH then
begin
x := 1;
y += 1;
end;

if y >= MAX_SCREEN_HEIGHT then
begin
scroll(1);
y -= 1;
end;

screen^[x,y].c := c;
screen^[x,y].attr := STANDARD_ATTR;
x += 1;
end;


end.

Die Funktion putch sollte eigentlich einen Char an der aktuellen Position ausgeben, tut sie aber nicht.

Gruß,

Pascal  :-D

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 28. November 2009, 15:41 »
Hallo und Willkommen im Forum,

Meine Pascal Zeiten liegen schon ein wenig zurück, deshalb kann ich dir nicht sagen ob dass mit den Pointern alles so stimmt.

Aber du verdrehst in deinem Code X und Y, Width und Heights, 80 und 25 ein bisschen. Der Standard Textmodus hat 25 Zeilen à 80 Zeichen.
Dein Scroll z.B. scrollt nicht von Unten nach Oben sondern von Rechts nach Links, wenn ich das richtig lese.

Wenn du das änderst musst du darauf achten, dass du auf deinen TScreen array mit screen^[y,x] zugreifen musst.

Warum dein PutCh kein Zeichen ausgibt kann ich dir leider nicht sagen(außer es geht dir ausschließlich um die Ausgabe Position). Funktioniert dein ClearScreen wirklich? Hast du schon mal andere Zeichen damit ausgegeben als #0, z.B. '#' oder 'x'.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

pascal

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 28. November 2009, 15:55 »
Hall MNemo!

Danke für deine schnelle Antwort!
Du hast recht, die Maße der Konsole hab ich irgendwie verdreht! Das habe ich jedoch (hoffentlich) überall berichtigt, und einmal ausprobiert den Bildschirm bei Clearscreen mit E's vollzuschreiben, jedoch fehlt in der letzten Zeile ein Stück. Er scheint nicht den gesamten Videospeicher zu überschreiben, was ich recht seltsam finde. Die Prozedur Putch funktioniert jedoch leider immernoch nicht.

Hier mein neuer Code:

unit video;

interface

const
MAX_SCREEN_WIDTH = 80;
MAX_SCREEN_HEIGHT = 25;
STANDARD_ATTR = $07;

type
  TScreenPixel = record
    c: char;
    attr: byte;
  end;


  PScreen = ^TScreen;
  TScreen = array[1..MAX_SCREEN_WIDTH, 1..MAX_SCREEN_HEIGHT] of TScreenPixel;

var
  screen: PScreen;

procedure initscreen(); 
procedure clearscreen();
procedure scroll(lines: Integer);
procedure putch(c: Char);

implementation

var
  x, y: Integer;

procedure initscreen(); [public, alias: 'initscreen'];
begin
screen := Pointer($B8000);
x := 1;
y := 1;
end;

procedure clearscreen(); [public, alias: 'clearscreen'];
var
w, h: Integer;
begin
for w := 1 to 80 do
begin
for h := 1 to 25 do
begin
screen^[w, h].c := 'E';
screen^[w, h].attr := STANDARD_ATTR;
end;
end;
end;

procedure scroll(lines: Integer); [public, alias: 'scroll'];
var
n, I, J: Integer;
tempLine: array[1..25] of TScreenPixel;
begin
for n := 1 to lines do
begin
for I := 1 to 25 do
begin
for J := 1 to 80 do
begin
screen^[J, I-1] := screen^[J, I];
end;
end;
for J := 1 to 80 do
begin
screen^[J, 25].c := #0;
end;
end;
end;

procedure putch(c: Char); [public, alias: 'putch'];
begin
if c = #13 then y +=1;
if c = #10 then x := 1;

if x > MAX_SCREEN_WIDTH then
begin
x := 1;
y += 1;
end;

if y >= MAX_SCREEN_HEIGHT then
begin
scroll(1);
y -= 1;
end;

screen^[x,y].c := c;
screen^[x,y].attr := STANDARD_ATTR;
x += 1;
end;


end.

Ich find den Fehler dummerweise immernoch nicht. Und ohne Textausgabe lässt sich das ja auch schwer debuggen.

Gruß
Pascal

Edit: Mir fällt grad auf: http://lowlevel.brainsware.org/wiki/index.php/Pascal
Hier wird das Array folgendermaßen definiert: type tScreen = array[1..25, 1..80] of record
    c: char;
    attr: byte;
end;

Meins wäre demnach jetzt aber wieder type tScreen = array[1..80, 1..25] of record
    c: char;
    attr: byte;
end;

Jetzt bin ich wirklich verwirrt  :? Hab ich dich falsch verstanden?
« Letzte Änderung: 28. November 2009, 16:00 von pascal »

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 28. November 2009, 16:12 »
Wenn du das änderst musst du darauf achten, dass du auf deinen TScreen array mit screen^[y,x] zugreifen musst.
Damit hatte ich gemeint das du von x,y auf y,x umstellen musst.

Also:
TScreen = array[1..MAX_SCREEN_HEIGHT, 1..MAX_SCREEN_WIDTH] of TScreenPixel;und alle screen^[a,b] durch screen^[b,a] ersetzen.

Das ist wegen der Element Anordnung im Array notwendig, die ist nämlich [1,1]…[1,80],[2,1]…[2,80]… und nicht [1,1]…[25,1],[1,2]…[25,2]…
Zu deinem PutCh:
du solltest die procedure verlassen bevor du #13 oder #10 ausgibst.
« Letzte Änderung: 28. November 2009, 16:15 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

pascal

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 28. November 2009, 19:54 »
So, ich habe das ganze angepasst. Clearscreen lässt nach wie vor etwas Platz unbeachtet. Ich hab das Gefühl das ich mal wieder was dummes übersehe. Wenn ich die Schleifen in Clearscreen vertausche, wechselt die Position des unbeschriebenen Speichers, die Größe nicht.

Putch funktioniert nach wie vor anscheinend nicht.

Hier der Code:

unit video;

interface

const
MAX_SCREEN_WIDTH = 80;
MAX_SCREEN_HEIGHT = 25;
STANDARD_ATTR = $07;

type
  TScreenPixel = record
    c: char;
    attr: byte;
  end;


  PScreen = ^TScreen;
  TScreen = array[1..MAX_SCREEN_HEIGHT, 1..MAX_SCREEN_WIDTH] of TScreenPixel;

var
  screen: PScreen;

procedure initscreen(); 
procedure clearscreen();
procedure scroll(lines: Integer);
procedure putch(c: Char);

implementation

var
  x, y: Integer;

procedure initscreen(); [public, alias: 'initscreen'];
begin
screen := Pointer($B8000);
x := 1;
y := 1;
end;

procedure clearscreen(); [public, alias: 'clearscreen'];
var
w, h: Integer;
begin
for w := 1 to 80 do
begin
for h := 1 to 25 do
begin
screen^[h, w].c := 'E';
screen^[h, w].attr := STANDARD_ATTR;
end;
end;
end;

procedure scroll(lines: Integer); [public, alias: 'scroll'];
var
n, I, J: Integer;
begin
for n := 1 to lines do
begin
for I := 1 to 25 do
begin
for J := 1 to 80 do
begin
screen^[I-1, J] := screen^[J, I];
end;
end;
for J := 1 to 80 do
begin
screen^[25, J].c := #0;
end;
end;
end;

procedure putch(c: Char); [public, alias: 'putch'];
begin
if c = #13 then
begin
y += 1;
exit;
end;
if c = #10 then
begin
x := 1;
exit;
end;

if x > MAX_SCREEN_WIDTH then
begin
x := 1;
y += 1;
end;

if y >= MAX_SCREEN_HEIGHT then
begin
scroll(1);
y -= 1;
end;

screen^[y,x].c := c;
screen^[y,x].attr := STANDARD_ATTR;
x += 1;
end;


end.

Hoffe auf Hilfe!  :-)

 

Einloggen