[Pascal] własny OS.

shoock12

Użytkownik
Dołączył
Styczeń 24, 2009
Posty
123
Witam, piszę właśnie OS w pascalu. Napisałem już prostego shell-a i nawet działa. Ale chciałbym zrobić tak, żeby można było zobaczyć jakie pliki są na dyskietce(system na dyskietkę).
Chodzi coś o jak polecenie "dir", wystarczy żeby działało na dyskietkę i tylko na główny katalog i nie musi pokazywać katalogów wystarczy, żeby pokazało pliki.
 

thc_flow

Zbanowany
Dołączył
Listopad 13, 2008
Posty
649
Musisz zaimplementować najpierw sterownik dyskietki oraz systemu plików jakiego będziesz używał (FAT12? - chyba najłatwiej), bez tego ani rusz...
 

shoock12

Użytkownik
Dołączył
Styczeń 24, 2009
Posty
123
<div class='quotetop'>CYTAT(THC Flow @ 30.04.2009, 13:50) <{POST_SNAPBACK}></div>
Musisz zaimplementować najpierw sterownik dyskietki oraz systemu plików jakiego będziesz używał (FAT12? - chyba najłatwiej), bez tego ani rusz...[/b]
Tylko czy jest jakiś gotowy sterownik do obsługi FAT12? Musi być być w pascalu.
 

thc_flow

Zbanowany
Dołączył
Listopad 13, 2008
Posty
649
Dyskietki działają podstawowo na FAT12, co prawda da się wymusić 32 albo 16 ale to tylko strata miejsca i więcej kodu
<

Wikipedia
 

shoock12

Użytkownik
Dołączył
Styczeń 24, 2009
Posty
123
Dziękuję za pomoc, jeśli ktoś by coś jeszcze miał do obsługi FAT12 to proszę dawać. Ale mam jeszcze jedno pytanie jak zrobić takie coś, że jak użytkownik wpisze
np "echo aaaaaa". To jak zrobić tak w instrukcji if, żeby działało. I potem pobrało to co jest po if. Dotychczasz porównóję tak:
Kod:
if (Command[0]='h') and (Command[1]='e') and (Command[2]='l') and (Command[3]='p') and (Command[4]=#0) then
        begin // help
                PrintStr(#13);
                PrintStr('reboot - resetuje komputer');
                PrintStr(#13);
                PrintStr('help - wyswietla pomoc');
        PrintStr(#13);
        PrintStr('ver - wyswietla nazwe i wersje systemu');
        PrintStr(#13);
        PrintStr('cls - czysci ekran');
        PrintStr(#13);
        PrintStr('pause - oczekuje na wcisniecie klawisza enter');

        end else i tutaj kolejne if
 

shoock12

Użytkownik
Dołączył
Styczeń 24, 2009
Posty
123
zrobiłem tak:
Kod:
if (Pos('e', Command)) > 0 then
        begin
            delete(PChar(Command), 1, 2);
            PrintStr(PChar(Command));
        end else
Ale kompilator wywala taki błąd:
Kod:
Free Pascal Compiler version 2.2.0 [2008/04/01] for i386
Copyright (c) 1993-2007 by Florian Klaempfl
Target OS: Linux for i386
Compiling kernel.pas
kernel.pas(326,25) Error: Call by var for arg no. 1 has to match exactly: Got "PChar" expected "WideString"
kernel.pas(386) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted
Error: /usr/bin/ppc386 returned an error exitcode (normal if you did not specify a source file to be compiled)
Linia 326 wygląda tak:
Kod:
delete(PChar(Command), 1, 2);
Próbowałem równierz tak:
Kod:
delete(Command, 1, 2);
I nadal się nie kompiluje.
 

djmentos

Użytkownik
Dołączył
Maj 1, 2007
Posty
1868
Taki error ze shoock(12) ^^

No więc, myślalem, że używasz do kompilcji Delphi, ale trudno. jak wolisz free pascal to tylko sobie utrudnisz
<


Wobec tego, musisz sam napisać te funkcje xD
To tylko kwestia 1 - 2 pętli.
 

shoock12

Użytkownik
Dołączył
Styczeń 24, 2009
Posty
123
<div class='quotetop'>CYTAT(djmentos @ 5.05.2009, 8:29) <{POST_SNAPBACK}></div>
Taki error ze shoock(12) ^^

No więc, myślalem, że używasz do kompilcji Delphi, ale trudno. jak wolisz free pascal to tylko sobie utrudnisz
<


Wobec tego, musisz sam napisać te funkcje xD
To tylko kwestia 1 - 2 pętli.[/b]
Nie mogłem użyć delphi, bo pod tym nie uda si ę się skopilować mojego OS. Próbowałem delphi, ściągnołem nagłówek pliku exe2bin i nie działało, próbowałem TurboPascal, to samo. Dopiero Free Pascal pod Linux-a działał jak powinien. Narazie zrobiłem to tak:
Kod:
 if (Command[0]='e') and (Command[1]='c') and (Command[2]='h') and (Command[3]='o') then begin
        PrintStr(#13);
        PrintStr(Command);
    end else
I to działa. Tylko nadal nie mogę dojść jak pobrać to po echo.
 

djmentos

Użytkownik
Dołączył
Maj 1, 2007
Posty
1868
zrób sobie
Kod:
a: string;
b: string;
c: string;

Kod:
a:= 'echo hello';
b:= '';
c:= '';
i wtedy
Kod:
for i:=1 to Length(a) do
begin
  b:= b + a[i];
  if a[i] = ' ' then
  begin
    //mamy spacje
    break;
  end;
end;
i wtedy po tym masz ze
b = echo. możesz to zrobić sobie w funkcji jakies i mniej piszesz wtedy, a potem podobnie:

Kod:
for i:= Length(b + 1) do Length(a) do
c = c + a[i];
To kopiuje od spacji do końca wszystko z A do C;
i wtedy C = hello
 

thc_flow

Zbanowany
Dołączył
Listopad 13, 2008
Posty
649
Tak szczerze mówiąc to wątpię, żebyś dobrnął w pojednyknę choćby do multitaskingu ;P
No ale to już inna bajka, w każdym razie gratuluję, ja wymiękłem przy zabawie w robienie "kernela" w ASMie
<
 

Gondoller

Użytkownik
Dołączył
Luty 21, 2008
Posty
259
khym, a tak w ogóle - startuje ci ten OS? działa to w jakikolwiek sposób?
 

shoock12

Użytkownik
Dołączył
Styczeń 24, 2009
Posty
123
<div class='quotetop'>CYTAT(Gondoller @ 6.05.2009, 14:18) <{POST_SNAPBACK}></div>
khym, a tak w ogóle - startuje ci ten OS? działa to w jakikolwiek sposób?[/b]
Korzystam z GRUB-a. W kernel-u mam tylko kilka wstawek assemblerowych. Wydałem już wersję 0.00.01-alpha na razie ją testuję.
 

p3o

Użytkownik
Dołączył
Maj 1, 2007
Posty
62
Jakie funkcje na chwilę obecną masz zaimplementowane?
 

shoock12

Użytkownik
Dołączył
Styczeń 24, 2009
Posty
123
<div class='quotetop'>CYTAT(p3o @ 6.05.2009, 14:59) <{POST_SNAPBACK}></div>
Jakie funkcje na chwilę obecną masz zaimplementowane?[/b]
restartowanie komputera, wyswietlenie pomocy, wyswietlenie nazwy i wersji systemu, czyszczenie ekranu. Pracuję nad obsługą przerwań.
 
Do góry Bottom