Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - pascal

Seiten: [1]
1
Lowlevel-Coding / Re: Pascal Textausgabe
« 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!  :-)
2
Lowlevel-Coding / Re: Pascal Textausgabe
« 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?
3
Lowlevel-Coding / Pascal Textausgabe
« 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
Seiten: [1]

Einloggen