Sziasztok!
DOS-ra fejlesztett programhoz szeretnék egy fájl tallózót készíteni. A program C++-ban készül, assembly kód részletekkel
megtoldva és OpenWatcom fordítót használok. A fent említett fájl tallózó készítésénél akadtak problémáim, mivel nem igazán tudom hogyan lehet lekérdezni DOS alatt a meghajtókat, illetve mappa tartalmát listázni.... Eddig dos.h-ban, illetve neten az int 21h környékén keresgéltem, nem sok sikerrel.
Tudom hogy nem Un*x és még csak nem is Windows... Egy hobbi projekt ami egy régi számítógépre készül :)
Ha valaki tudna segíteni e témában, megköszönném :)
- 3737 megtekintés
Hozzászólások
Pedig jó helyen kerested:
http://spike.scu.edu.au/~barry/interrupts.html
http://stackoverflow.com/questions/13787616/listing-directory-content-i…
Még valami: az OpenWatcom nem védett mód alá generál kódot? Ott mintha az ilyen hívásokkal lenne baj.
- A hozzászóláshoz be kell jelentkezni
Igen, ezt az oldalt én is megtaláltam, csak hogy melyikkel tudnám először a meghajtókat lekérdezni már nem jöttem rá.
- A hozzászóláshoz be kell jelentkezni
Megpróbáltam ezek alapján elindulni:
Function (AH) | Input | Output | Description
___________________________________________________________________________________________
0Eh | dl- drive number | al- number of logical drives | Set Default Drive: sets the DOS default drive to the specified value (0=A, 1=B, 2=C, etc.). Returns the number of logical drives in the system, although they may not be contiguous from 0-al.
___________________________________________________________________________________________
19H | | al- default drive number | Get Default Drive: Returns the current system default drive number (0=A, 1=B, 2=C, etc.).
Amivel próbálkoztam:
#include stdio.h
unsigned char GetDefaultDrive()
{
static unsigned char ret;
__asm
{
xor ax, ax
mov ah, 19h
int 21h
}
return ret;
}
static unsigned char ldrives;
void SetDefaultDrive(unsigned char drive)
{
__asm
{
xor ax, ax
xor dx, dx
mov ah, 1Eh
mov dl, drive
int 21h
mov ldrives, al
}
}
int main(int argc, char * argv[])
{
ldrives = 0;
SetDefaultDrive(1);
printf ("Default drive is: %d\r\n", GetDefaultDrive());
printf ("Number of drives: %d", ldrives);
getchar();
return 0;
}
Lehet valamit félreértelmeztem, de sajnos ez a kimenet WinXP, illetve
DOSBox alól futtatva is:
Default drive is: 0
ldrives: 0
- A hozzászóláshoz be kell jelentkezni
Közbe feltűnt, hogy a SetDefaultDrive-ban elírtam "mov ah, 1Eh" helyett "mov ah, 0Eh" és így már vált meghajtót, illetve az ldrives WinXP és DOSBox alól is 26-ot kapott értékként.
- A hozzászóláshoz be kell jelentkezni
és GetDefaultDrive()-ból pedig "mov ret, al" maradt le :D de sajnos egyenlőre innen még nem sikerült tovább jutnom.
Még egy kis segítséget tehát elfogadnék.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
ez a bios tablazatbol szedi ki, hogy van-e floppy a rendszerben, vagy nincs, sima dos hivasokon alapulo mindenhol mukodo hibauzenetmentes megoldas ugytunik nemigazan akad.
- A hozzászóláshoz be kell jelentkezni
Nem használok extendert, tisztán valós mód :D
- A hozzászóláshoz be kell jelentkezni
A fájl listázót nagyon szépen köszönöm, mindjárt ki is próbálom!
- A hozzászóláshoz be kell jelentkezni
Régi szép int21-es idők... Bár nekem csak TurboC++, meg tasm vagy épp masm jutott anno :-P
- A hozzászóláshoz be kell jelentkezni
+1
Meg Ralph Brown-féle interrupt list. Nálam Turbo Pascal volt, először ASM betétekkel, majd tasm, végül BAPC (elvileg arpi_esp alkotta). Az x86 vírusok érdekeltek anno nagyon. Volt rá példa, hogy nem volt nálam rendszerlemez, ezért debug.exe -vel hatástalanítottam egy TSR vírus int 21h funkcióit (NOP-oltam), így újraindítás nélkül lehetett írtani. Régi szép idők! :)
- A hozzászóláshoz be kell jelentkezni
Nekem még vannak teljes leírásaim (szép, tartalmas könyvek, borítóján kék KFKI felirattal). Norton PG to PC, 80186 reference, BIOS dumpok, ilyenek. Nem adom senkinek :-)
- A hozzászóláshoz be kell jelentkezni
TurboC++ meg Turbo Pascal 6.0 dobozos, IBM DOS 4.01, MS-DOS 5.0, DR-DOS 5, MS-DOS 6.22, Windows 3.1... Eredetiben ott figyelnek a polcomon - anno sikerült jól alkudni mindre :-P
- A hozzászóláshoz be kell jelentkezni
a régi tech help online itt: http://www.techhelpmanual.com/
szerk. link cserélve
- A hozzászóláshoz be kell jelentkezni
Thx a linkert!
A gepen megvan az eredeti THELP.EXE es a hozza tartozo TECH40.H!, de ez igy tokeletes!
- A hozzászóláshoz be kell jelentkezni
thx!
ezt most bookmarkolom, a norton guide valahol megvan, de a tech elveszett valahol a floppy armageddonban.
- A hozzászóláshoz be kell jelentkezni
Mai friss fejjel átnézve a tegnapi kódomat, kijavítva most már tökéletes a meghajtó listázás. Már csak a fájlok listázását kell megoldani, amihez köszönöm szépen a linkeket!
Végleges meghajtó listázó kód:
#include <stdio.h>
unsigned char GetDefaultDrive()
{
static unsigned char r;
__asm
{
xor ax, ax
mov ah, 19h
int 21h
mov r, al
}
return r;
}
void SetDefaultDrive(unsigned char drive)
{
__asm
{
xor ax, ax
xor dx, dx
mov ah, 0Eh
mov dl, drive
int 21h
}
}
int main(int argc, char * argv[])
{
unsigned int i;
unsigned char defDrive = GetDefaultDrive();
for (i=0;i<26;i++)
{
SetDefaultDrive(i);
if (GetDefaultDrive() == i) printf ("%c:\r\n", 65+i);
}
SetDefaultDrive(defDrive);
return 0;
}
- A hozzászóláshoz be kell jelentkezni
Tudom hogy lehetne szebben is, mert megpörgeti a floppy meghajtót mikor vált, de nem jöttem rá hogyan lehetne másképp. A Norton Commander valószínűleg más taktikát használ erre.
Még egy kérdésem, hogy most pedig a fájl listázásnál akadtam el, azt merre fele keressem?
Itt kezdtem keresgélni:
http://www.techhelpmanual.com/8-directory_and_file_functions.html
Szerk: erre már kaptam választ az első hozzászólásban
- A hozzászóláshoz be kell jelentkezni
elokerestem a programolo megazmsdos cimu Petho konyvet, ez alapjan ha jolvizualom, a dos_dsksel (0eh) segedelmevel beallitod a default driveot, aztan a dos_getdsk (19h) lekerdezed sikeres volt-e ?
szvsz a dos_gtcdir azaz a 47h fuggvennyel egyszeubb lehet, diszk sorszamot ott is lehet megadni, hibakod jon vissza, ha nemletezik a diszk.
----
47h Get Current Directory, DOS_GTCDIR
A kurrens directory lekérdezése - belépéskor DL-ben adjuk meg a kívánt lemezegység kódját, (0 - kurrens lemez, 1 - A: , 2 - B: stb. ), DS:SI-ben pedig egy 64 byte-nyi memóriablokk címét. A teljes "path" fogja ide beirni a redszer a lemezegység megadása valamint a bevezető és záró "\" karakterek nélkül.
Hibakódok AX-ben Carry=1 esetén:
0F - érvénytelen lemezkód
----
- A hozzászóláshoz be kell jelentkezni
Köszönöm! Majd ellenőrzöm DOS-alá fordítva, mert most Win98-on Turbo C++ 4.5-el Win16 programba tudtam kipróbálni, de ott az alábbi hiba miatt nem játszik:
http://185.112.156.62/IMG_20160102_205903.jpg
Próbálta itt is olvasni a lemezt, de majd hátha DOS-on... :D
- A hozzászóláshoz be kell jelentkezni
Amúgy a játékon kívül van szerepe az assemblynek?
- A hozzászóláshoz be kell jelentkezni
Mármint hogy miért assemblyben van írva, vagy általánosságban?
- A hozzászóláshoz be kell jelentkezni
Előbbi, rosszul fogalmaztam, bocs :-).
Mert tudtommal dos.h van OpenWatcom-hoz is.
- A hozzászóláshoz be kell jelentkezni
De igen van, mondjuk az jó pár dologban eltér a Turbo C++-s dos.h-tól és lehet én kerestem rosszul, de nem nagyon találtam az OpenWatcom ezen részéről dokumentációt. Pedig jogos, lehet nem ártana átböngészni a dos.h-t.... :)
Gyorsabbnak tűnt ez a megvalósítás :D
- A hozzászóláshoz be kell jelentkezni
findfirst, findnext imho van benne.
- A hozzászóláshoz be kell jelentkezni
és tényleg volt, sikerült is
Már csak annyi, hogyan tudom a mappákat is listázni?
#include <iostream>
#include <dos.h>
using namespace std;
int main(int argc, char * argv[])
{
find_t f;
cout << "DOS Mappa listazas" << endl << __TIME__ << endl;
if (_dos_findfirst("C:\\*.*", 0, &f))
{
cerr << "A mappa ures" << endl;
return 1;
}
while (!_dos_findnext(&f))
{
cout << f.name << endl;
}
return 0;
}
- A hozzászóláshoz be kell jelentkezni
hogy a konyvtarakat hozza, a _dos_findfirst paramaterezesenel a '0' helyett ha jolemlexem 0x10 -et kell megadni.
* megneztem, valamiert mindenhol anyfile -t hasznaltam anno, ami 0x3F
- A hozzászóláshoz be kell jelentkezni
xp alatt borland pascal 7.0
-------
Program teszt ;
uses crt;
var currdir : array[1..128] of byte;
hiba : byte ;
procedure getdir(drivenum: byte);
begin
hiba := 0;
asm
mov dl,drivenum
mov si, offset currdir
mov ah,47h
int 21h
jnc @kilep
mov [hiba],al
@kilep:
end ;
end ;
begin
clrscr;
getdir(1);
if hiba <> 0 then writeln('1. drive error kod :', hiba);
getdir(2);
if hiba <> 0 then writeln('2, drive error kod :', hiba);
getdir(3);
if hiba <> 0 then writeln('3. drive error kod :', hiba);
getdir(4);
if hiba <> 0 then writeln('4. drive error kod :', hiba);
end .
----------------
ez igy az 1 es 2 ertekre ( A: B: ) hozza a 0Fh 'nemletezo drive' hibakodot, critical ablak nem jelenik meg, a 3/4 ertekre nem problemazik.
a fejmozgatasrol floppy hianyaban nem tudok nyilatkozni.
- A hozzászóláshoz be kell jelentkezni
Kipróbáltam ezt a megoldást is és a lemezt itt is megpörgeti, meg nekem el is akadt futáskor:
http://185.112.156.62/eredmeny.PNG
Az A: meghajtóban volt lemez.
Viszont a könyvtár lekérdezés az bejött.
Nagyon szépen köszönöm mindenki segítségét!
- A hozzászóláshoz be kell jelentkezni
kiprobaltam dos alatt, valoban dobja a hibat.
az almoskonyv szerint ha ilyen 'nincs lemez az egysegben' hiba van, a 24h interruptot hivja a dos.
az lehet a megfejtes, hogy a drivelekerdezes idejere a 24h interruptot sajat kezelore iranyitod, es visszakezbol adsz neki egy ignore (AL=0) vagy fail (AL=3) erteket.
- A hozzászóláshoz be kell jelentkezni
Az alábbi módon megpróbáltam amit mondtál:
http://185.112.156.62/eredmeny1.png
így már nem dobja a hibát, viszont elakadt a B: meghajtó kiírása után. Mit rontottam el?
Egyébként itt is megpörgeti a meghajtót mint az előző módszernél.
- A hozzászóláshoz be kell jelentkezni
az asm blokkon beluli iret nembiztos, hogy jo huzas, meg kellene nezni, az adott fordito milyen pre ( push bp, mov bp,sp , sub sp,x ; modernebbek enter x,y ) kodot tesz egy fuggvany belepeshez, es ehhez igazitani a kodot, kulonben rossz helyre ter vissza.
anno pascalban meg kellett adni, hogy az adott fuggveny egy interrupt hivassal van aktvizalva, akkor ugy kezelte.
>>> procedure valami ; interrupt ; <<<
- A hozzászóláshoz be kell jelentkezni
Off: az enter/leave párost használják a fordítók? gcc-fordított objban mintha nem láttam volna, hanem mov-val épített veremkeretet.
- A hozzászóláshoz be kell jelentkezni
ha jolemlexem valamelyik regi ( nem open ! ) watcom mar hasznalta ( 1999 korul ), viszont a freepascalban teljesen biztos vagyok :)
- A hozzászóláshoz be kell jelentkezni
ha-ha ms-dos. atirt 24h interrupt vektorral kiprobaltam, most arra ker, hogy csereljek lemezt a b meghajtoban :)
ugye egymeghajtoval is van copy a: b: lemezcserelgeteses modszerrel...
ha lesz idom elokaparok egy nc -t, az a gyanum, hogy a trukk annyi, hogy c: -tol kezdve kerdezi le a diszkeket, az 'a' es a 'b' meghajtot adottnak veszi.
- A hozzászóláshoz be kell jelentkezni
Ez nekem is eszembe jutott, de emlékeim szerint olyankor nem jelzett b-t, amikor nem volt.
Szerk: megspékelve egy int13h-val lehet, hogy meg lehetne szebben (?) is oldani.
https://en.wikipedia.org/wiki/INT_13H
Köszönöm a kihívást :)
- A hozzászóláshoz be kell jelentkezni
Program teszt ;
uses crt,dos;
var currdir : array[1..128] of byte;
hiba : byte ;
procedure getdir(drivenum: byte);
begin
hiba := 0;
asm
mov dl,drivenum
mov si, offset currdir
mov ah,47h
int 21h
jnc @kilep
mov [hiba],al
@kilep:
end ;
end ;
var i : byte;
bioshwreport : word;
begin
clrscr;
asm
int 11h
mov [bioshwreport],ax
end ;
if ( bioshwreport and $0001 ) <> 0 then { van floppy ? }
begin
{ oke, 'a' egyseg tutti }
getdir(1);
write('a:');
if ( hiba = 0 ) then writeln('ok') else writeln('hiba');
{ a 6-7 bit adja meg a floppyk szamat. -1 }
{ de engem most kiserletileg csak a 'b:' erdekel }
if ( ( bioshwreport and $C0 ) <> 0 ) then
begin
getdir(2);
write('b:');
if ( hiba = 0 ) then writeln('ok') else writeln('hiba');
end ;
end ;
for i:= 3 to 26 do
begin
getdir(i);
write( char(64+i),':' );
if hiba = 0
then writeln('ok')
else writeln('hiba');
end ;
end .
- A hozzászóláshoz be kell jelentkezni
Lehet egy olyan buta kérdésem, hogy ez miért nem fordul le? :D
http://185.112.156.62/fpc.png
a fájl neve TEST.PAS és még soha életemben eddig nem dolgoztam Pascal-al.
- A hozzászóláshoz be kell jelentkezni
Most próbáltam egy Hello world programot, annál is ugyanez a hiba.
HELLO.PAS
program HELLO;
begin
writeln ('Hello, world.')
end.
Lehet a FreePascal-al van valami gond, illetve néznem kéne egy régi Borland féle Turbo Pascal-t :D
- A hozzászóláshoz be kell jelentkezni
ott az also ablakban az uzenet :
can't find unit - ilyet en sosem kaptam freepascallal sem, de ugytunik vagy nincsenek meg az unitok, vagy rossz helyre mutat a library path.
az options -> directories -> units alatt nezd meg mi van beallitva.
ugyanakkor javaslom a borland fordito beszerzeset, en azzal irtam, pascalkent teljesen kompatibilis az fp, viszont az asm betetet meg sosem probaltam.
- A hozzászóláshoz be kell jelentkezni
a DosBox-ban "mount C: D:\fpc" van felcsatolva és így próbáltam állítani:
http://185.112.156.62/fpc2.png
Viszont így is ugyanaz :(
De C++-re sikeresen át tudtam ültetni :)
- A hozzászóláshoz be kell jelentkezni
c:\pp\units\$FPCOS
FPCOS: is replaced by the compiler's target OS.
gondolom a target az a go32/dos extender, az ennek megfelelo konyvtar es tartalma megvan ?
- A hozzászóláshoz be kell jelentkezni
A dos extender-t külön töltöttem be, az a gyökérben van C:\cwsdpmi.exe
Az FP többi része meg C:\PP\BIN\GO32V2
A PP mappa további mappái:
BIN
DOCS
EXAMPLES
FPMKINST
UNITS
- A hozzászóláshoz be kell jelentkezni
ha ezt c:\pp\units\$FPCOS kibontod, saccper c:\pp\units\go32v2 -re hasonlitonak kellene meglennie.
- A hozzászóláshoz be kell jelentkezni
Na Borland Pascal-al lefordítva már tökéletes :D
http://185.112.156.62/floppy.jpg
Úgyhogy szerintem minden megvan amit kértem! (Mondjuk már azon jár a fejem, hogy ezt azzal bővíteni hogy felismerje a meghajtó típusát, kötetcímke..., de ezt majd megoldom) Majd a végeredmény kódból teszek ki ide, hátha nem csak én leszek az egyetlen aki ilyen hobbi program írásába fog.
Mindenkinek nagyon szépen köszönöm a segítségét!
- A hozzászóláshoz be kell jelentkezni
Nem a problémádra, de imho erre is rá fogsz szaladni:
http://www.freepascal.org/docs-html/prog/progsu3.html
Neked szerintem az intel kell.
- A hozzászóláshoz be kell jelentkezni
Off: ez a topic csúnya dolog volt, elrontott, mert előszedte a régi emlékeket, és újra kedvet kaptam az ilyenekhez :-D
- A hozzászóláshoz be kell jelentkezni
Hehe, engem is beszippantott a topic, pedig közöm csak annyi van hozzá, hogy gyakorlatilag DOS-on és win 3.11-en kezdtem el dolgozni anno, nem programozás, hanem nyomdaipar. Hobby-ban csak egy Julia-halmazig jutottam el Turbo Pascal-ban ;-)
- A hozzászóláshoz be kell jelentkezni
Win 3.11 programozással elég sokat lehetett szívni, meg tanulni is (autodidakta módon csináltam). És volt a Turbo Debugger for Windows, ami a világért nem akart együttműködni a számítógép videokártyájával (konzolos módot használt, de Windows alkalmazás volt, elég furcsa kombináció). Ekkor kezdtem alternatív hibakeresési módszereket tanulni.
Meg a toolhelp.dll-lel lehetett vicces dolgokat csinálni, pl. alkalmazás kilövését elkapni, meg ilyenek.
- A hozzászóláshoz be kell jelentkezni
Assembly helyett: "Borland C" és "Turbo C" szavak a keresés kifejezésében a Google felé és remélhetőleg nem POSIX megoldásokat hoz fel.
Egy tipp a directory listázásra:
http://www.softwareandfinance.com/forums/index.php?topic=504.0
Továbbá:
https://books.google.hu/books?id=1S6jBQAAQBAJ&pg=PA354#v=onepage&q&f=fa…
354. oldaltól. setdisk - ahogy elnézem, végig kell próbálni [A-Z] között.
... de régen volt (20 éve), amikor még DOS-t programoztam.
- A hozzászóláshoz be kell jelentkezni
kukkants bele a szerintem legjobb dos -os fájlkezelő forrásába, open source:
dos navigator: http://www.dnosp.com
- A hozzászóláshoz be kell jelentkezni