writeln() in pascal.

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
DeleteMe
Posts: 8
Joined: Tue Oct 21, 2008 12:22 pm
Location: denmark
Contact:

writeln() in pascal.

Post by DeleteMe »

how in the *beep* do i do this!

how do i run the simple code:

Code: Select all

begin
  writeln('something ',12);
end;
i just can't firgure it out, because, when you look at the deasmbly of a normal executable, there are no "writeln", how i *beep* do i implement it. i also had looked at the rtl for linux but there is no "writeln". but i found out its some kind of file i write it to(stdin/stdout, so on...). can someone pleas tell me.
User avatar
Dex
Member
Member
Posts: 1444
Joined: Fri Jan 27, 2006 12:00 am
Contact:

Re: writeln() in pascal.

Post by Dex »

You do not say realmode or pmode, in realmode you can use a bootloader like bootprog and by add CRT it mean it use bios instead of int 21h

Code: Select all

program Hello;
 
uses
   crt;
 
begin
   ClrScr;
   Write('Hello world');
   Readln;
end.

For pmode i have a pmode pascal OS you can see.
leledumbo
Member
Member
Posts: 103
Joined: Wed Apr 23, 2008 8:46 pm

Re: writeln() in pascal.

Post by leledumbo »

i just can't firgure it out, because, when you look at the deasmbly of a normal executable, there are no "writeln", how i *beep* do i implement it. i also had looked at the rtl for linux but there is no "writeln". but i found out its some kind of file i write it to(stdin/stdout, so on...). can someone pleas tell me.
Write(Ln) is not actually a routine, but a special command that will be mapped by the compiler to the correct procedure based on the type. For instance, if you have:

Code: Select all

WriteLn('i is,i);
where i is an integer (default = smallint), you might end up with:

Code: Select all

...
fpc_write_text_pchar_as_array
...
fpc_write_text_smallint
...
You have to implement Do_* in sysfile.inc for your own OS (take one from other OSes and empty the procedure / function body).

*) The mechanism is actually compiler dependent, but since FPC is (likely) the only one capable for OSDeving, I explain how FPC implements it.
DeleteMe
Posts: 8
Joined: Tue Oct 21, 2008 12:22 pm
Location: denmark
Contact:

Re: writeln() in pascal.

Post by DeleteMe »

thanks! thats what i've needed :D
Laksen
Member
Member
Posts: 140
Joined: Fri Nov 09, 2007 3:30 am
Location: Aalborg, Denmark

Re: writeln() in pascal.

Post by Laksen »

Here's a really simple implementation that implements all the basic functions for x86, without needing all the runtime checks that are in the fpc rtl code

Code: Select all

interface
...
type
 PText = ^Text;

Function fpc_get_input:PText;compilerproc;
Function fpc_get_output:PText;compilerproc;
Procedure fpc_Write_End(var f:Text); compilerproc;
Procedure fpc_Writeln_End(var f:Text); compilerproc;
Procedure fpc_Write_Text_ShortStr(Len : Longint;var f : Text;const s : String); compilerproc;
Procedure fpc_Write_Text_Pchar_as_Array(Len : Longint;var f : Text;const s : array of char; zerobased: boolean = true); compilerproc;
Procedure fpc_Write_Text_PChar_As_Pointer(Len : Longint;var f : Text;p : PChar); compilerproc;
Procedure fpc_Write_Text_AnsiStr (Len : Longint; Var f : Text; const S : AnsiString); compilerproc;

Procedure fpc_Write_Text_Char(Len : Longint;var t : Text;c : Char); compilerproc;

Procedure fpc_Write_Text_SInt(Len : Longint;var t : Text;l : PtrInt); compilerproc;
Procedure fpc_Write_Text_UInt(Len : Longint;var t : Text;l : PtrUInt); compilerproc;

procedure fpc_write_text_qword(len : longint;var t : text;q : qword); compilerproc;
procedure fpc_write_text_int64(len : longint;var t : text;i : int64); compilerproc;

Procedure fpc_Write_Text_Boolean(Len : Longint;var t : Text;b : Boolean); compilerproc;
...
implementation
...
var x: longint = 0;
	 y: longint = 0;

procedure putchar(c: char);
begin
	if c = #13 then
		x := 0
	else if c = #0 then
		exit
	else if c = #10 then
		inc(y)
	else if c = #9 then
		inc(x, 8-(x mod 8))
	else
	begin
		pchar($b8000+2*(x+y*80))^ := c;
		inc(x);
	end;
	
	if x >= 80 then
	begin
		x := 0;
		inc(y);
	end;

	while y >= 25 do
	begin
		move(pchar($b8000+160)^, pchar($b8000)^, 80*24*2);
		fillword(pchar($b8000+24*160)^, 80, $720);
		dec(y);
	end;
end;

Function fpc_get_input:PText;compilerproc;
begin
	result := nil;
end;

Function fpc_get_output:PText;compilerproc;
begin
	result := nil;
end;

Procedure fpc_Write_End(var f:Text); compilerproc;
begin
end;

Procedure fpc_Writeln_End(var f:Text); compilerproc;
begin
	putchar(#13);
	putchar(#10);
end;

Procedure fpc_Write_Text_ShortStr(Len : Longint;var f : Text;const s : String); compilerproc;
var i: longint;
begin
	for i := 1 to length(s) do
		putchar(s[i]);
end;

Procedure fpc_Write_Text_Pchar_as_Array(Len : Longint;var f : Text;const s : array of char; zerobased: boolean = true); compilerproc;
var i: longint;
begin
	if zerobased then
	begin
		for i := 0 to high(s) do
			putchar(s[i]);
	end
	else
	begin
		for i := 1 to length(s) do
			putchar(s[i]);
	end;
end;

Procedure fpc_Write_Text_PChar_As_Pointer(Len : Longint;var f : Text;p : PChar); compilerproc;
begin
	if p = nil then
		exit;
	
	while p^ <> #0 do
	begin
		putchar(p^);
		inc(p);
	end;
end;

Procedure fpc_Write_Text_AnsiStr (Len : Longint; Var f : Text; const S : AnsiString); compilerproc;
var i: longint;
begin
	for i := 1 to length(s) do
		putchar(s[i]);
end;

Procedure fpc_Write_Text_Char(Len : Longint;var t : Text;c : Char); compilerproc;
begin
	putchar(c);
end;

Procedure fpc_Write_Text_SInt(Len : Longint;var t : Text;l : PtrInt); compilerproc;
begin
	if l < 0 then
	begin
		write('-');
		l := -l;
	end;
	
	fpc_Write_Text_UInt(len, t, l);
end;

Procedure fpc_Write_Text_UInt(Len : Longint;var t : Text;l : PtrUInt); compilerproc;
var buf: array[0..11] of char;
	 p: longint;
begin
	if l = 0 then
		putchar('0')
	else
	begin
		p := high(buf);
		buf[p] := #0;
		while l > 0 do
		begin
			dec(p);
			buf[p] := char((l mod 10)+byte('0'));
			l := l div 10;
		end;
		
		write(pchar(@buf[p]));
	end;
end;

procedure fpc_write_text_qword(len : longint;var t : text;q : qword); compilerproc;
var buf: array[0..19] of char;
	 p: longint;
begin
	if q = 0 then
		putchar('0')
	else
	begin
		p := high(buf);
		buf[p] := #0;
		while q > 0 do
		begin
			dec(p);
			buf[p] := char((q mod 10)+byte('0'));
			q := q div 10;
		end;
		
		write(pchar(@buf[p]));
	end;
end;

procedure fpc_write_text_int64(len : longint;var t : text;i : int64); compilerproc;
begin
	if i < 0 then
	begin
		write('-');
		i := -i;
	end;
	
	write(qword(i));
end;

Procedure fpc_Write_Text_Boolean(Len : Longint;var t : Text;b : Boolean); compilerproc;
begin
	if b then
		write('true')
	else
		write('false');
end;
http://j-software.dk | JPasKernel - My Object Pascal kernel
Post Reply