Turbo C 16 bites .com generálása

Turbo C 16 bites .com generálása
2016-10-06T15:38:38+02:00
2016-10-11T13:26:02+02:00
2022-08-10T08:50:31+02:00
Markhazy
Sziasztok,

Turbo C++ 3.5 ban fordítom a kódot .exe re. Aztán exe2com Utilityvel -.com ot csinálok belőle. Egészen addig működik a dolog amíg a C forrásban lebegőpontos műveletek nem kerülnek bele.

például

...
float a, b;
a=b;
...

exe2com nem csinál belőle .com ot

de így

...
float a, b;
//a=b;
...

működik.

Próbáltam TASM al megoldani a cserét...

A megoldás az lenne ha a Turbo C++ már alapból a .com kiterjesztést dobná ki és nem exe-t. Egy hete bújom az Interentet,  már mindent kipróbáltam de egyszerűen nem lehet .com ot csinálni mert a tlink hibaüzenetet dob. "can't generate COM" és valami entry point nem megfelelő. Tudom 100h .com nál! Pedig van rá benne opció " /t "

Hogy kell Turbo C vel .com ot fordítani linkelni generálni?


Hálásan köszönöm a segítséget
P.
Mutasd a teljes hozzászólást!
Nos, rászántam az időt és próbálkoztam.
Úgy tűnik, nem megoldható a dolog ugyanis lebegőpontos számításhoz betölti az FP87.LIB vagy EMU.LIB könyvtárakat, amik viszont nem alkalmasak a tiny modellhez. Hogy miért, az rejtély számomra, de tény, hogy ha kézzel próbáltam linkelni és egyesével tölteni a modulokat, akkor kiderült, hogy kell a C0T.OBJ valamint a CS.LIB (eddig rendben), lebegőpontoshoz a MATHS.LIB (ez is ok), valamint a fenti két csomagból valamelyik. És bármelyiket belinkelem, jön a hibaüzenet.

Kicsit durva megoldás, de vagy próbáld kihagyni a lebegőpontos részt, vagy írj be inline asm utasításokat...
Mutasd a teljes hozzászólást!

  • Turbo C++ 3.5 ban fordítom a kódot

    Múzeumban jártál?

    exe-ből com-ot... ez 30 éve is hülyeség volt. Inkább azt írd le, hogy mit szeretnél megtanulni.
    Mutasd a teljes hozzászólást!
  • 16 bites valós módú C kódot kellene fordítani. Raw .bin formában. Ha floppyról felmásolom a memóriába és ráugrok akkor fusson. Lehessen benne legalább lebegőpontos hivatkozásokat csinálni.
    Ez kellene.

    Pl flott a,b;
    a = b;

    Ha pontosan megmondod hogy kell és mivel leveszem a kalapom, mert eddig nem tudta senki pedig már keresem a megoldást lassan második éve. De addig jutottam el hogy exe2com...
    Mutasd a teljes hozzászólást!
  • Lépésről-lépésre választ kapsz itt: Babystep1 - OSDev Wiki
    Mutasd a teljes hozzászólást!
  • Te is tudod hogy ez nem kielégítő válasz. Ezt hidd el minden tisztelettel mondom!
    Mutasd a teljes hozzászólást!
  • Ennél nagyobb baj, hogy semmilyen DOS-hívás nem lehet benne. Vagyis pl. printf, fopen, getchar és hasonlók sem.
    Mutasd a teljes hozzászólást!
  • Nagyon rég volt számomra a DOS-os világ, de ha jól értem, és lebegőpontos dolgok nélkül megy a .COM-ra fordítás, akkor a lebegőpontos rutincsomaggal van gond, azt meg kellene próbálni vagy kihagyni, vagy megnézni, milyen opciók vannak rá (pl. hibakezelés kikapcsolása, mert ahhoz belenyúl a megszakítási vektorokba, amit DOS-nál lehetett, de manapság ugye...; vagy az is lehet, hogy a rutincsomagban olyasmi van, ami 32biteshez íródott, stb.)
    Mutasd a teljes hozzászólást!
  • Olvasgatom, hogy a TLINK-nek /tDc opció kell, de a TCC-nek is kell a /tDc
    Ez eddig rendben?
    Mutasd a teljes hozzászólást!
  • Úgyis próbáltam már, valahol én is olvastam ilyet de már nem most volt. Azért megpróbáltam most mégegyszer.

    FATAL : Cannot Generate COM file : Invaild Initial entry point address
    Mutasd a teljes hozzászólást!
  • Hopp, ugye TINY modellben dolgozol???
    Mutasd a teljes hozzászólást!
  • igen, -mt opció a fordításnál

    tcc -mt  test.c

    vagy

    tcc -mt  -o test.c
    Mutasd a teljes hozzászólást!
  • Azt a -o opciót itt nem értem, az az .OBJ fájlt írja elő.

    És ugye fontos a -tDc is!!!
    Mutasd a teljes hozzászólást!
  • Nos, rászántam az időt és próbálkoztam.
    Úgy tűnik, nem megoldható a dolog ugyanis lebegőpontos számításhoz betölti az FP87.LIB vagy EMU.LIB könyvtárakat, amik viszont nem alkalmasak a tiny modellhez. Hogy miért, az rejtély számomra, de tény, hogy ha kézzel próbáltam linkelni és egyesével tölteni a modulokat, akkor kiderült, hogy kell a C0T.OBJ valamint a CS.LIB (eddig rendben), lebegőpontoshoz a MATHS.LIB (ez is ok), valamint a fenti két csomagból valamelyik. És bármelyiket belinkelem, jön a hibaüzenet.

    Kicsit durva megoldás, de vagy próbáld kihagyni a lebegőpontos részt, vagy írj be inline asm utasításokat...
    Mutasd a teljes hozzászólást!
  • Köszönöm hogy fáradoztál vele és hogy rászántad az időd. Ezért ott a pont...

    A program úgy van megírva ahogy te is javasoltad. Tehát a lebegőpontos részek assemblyben vannak, jobban mondva egy másik assemblerrel le van fordítva és az opkódok vannak db változókkal deklarálva az assembly blokkokban mert csak így lehet lefordítani is és .com ot csinálni belőle az exe2 com al.

    A probléma nem is az hogy a lebegőpontos feladatokat megoldjam mert műveleteket tudok végezni a bemókolt assembly kódokkal, adatokat is tudok mozgatni szintén ezekkel, sőt még pointereket is tudok csinálni a C nek... De amint a C kódban akarok egy értékátadást csinálni például A = B; és mind a kettő float akkor meghal az egész. Ha A és B ráadásul még tömb akkor meg az egész Turbo C úgy ahogy lefekszik mert nem tudja értelmezni az egyébként szabványos Intel Assembly dolgokat.

    Ragozhatnám tovább de nagyon jól tudom hogy ez a környezet amit használok nem arra való amire nekem kell. De egyszerűen sehol, az egész Interneten nem találok x86 os C fordítót ami egy sima egyszerű 16 bites bináris kódot tud csinálni egy olyan c forrásból amiben kizárólag C programstruktúrák vannak ciklus, if then, stb és floatos értékátadások és olyan assembly kódok amik már egyszer lefordultak egy másik fordítón és működnek tökéletesen ráadásul ez utóbbiak be vannak szerkesztve és még csak értelmezni sem kellene őket.
    Mutasd a teljes hozzászólást!
  • Az érdekesség kedvéért elárulnád, hogy mi az eredeti probléma, amit ezzel a programmal szeretnél megoldani?
    Mutasd a teljes hozzászólást!
  • az egész Interneten nem találok x86 os C fordítót ami egy sima egyszerű 16 bites bináris kódot tud csinálni....

    OpenWatcom c/c++ vagy olyasmi hogy gnu c mond valamit?
    Mutasd a teljes hozzászólást!
  • Azért a gcc-re nem tennék nagyobb összeget, hogy tud 16-bitest... inkább visszamennék az ABC-ben: bcc(1): Bruce's C compiler - Linux man page
    Mutasd a teljes hozzászólást!
  • Nem nagyon emlékszem már a mohácsi vész előtti időkre, de úgy rémlik, hogy tudott. Ha mégsem, akkor elnézést. A Watcom biztosan tudott, a delorie djgpp -je is és még volt egy rakás más fordító is.

    Bár az érdekesség kedvéért Markházy válaszolhatna a kérdésedre.
    Mutasd a teljes hozzászólást!
  • (No igen, de ha az lesz benne, hogy 'még az is kellene, hogy működjön az open/close/read/write', akkor morcos leszek.)
    Mutasd a teljes hozzászólást!
  • Azért a TCC-vel remekül megy a printf is DOS ablakban (tegnap kipróbáltam), tényleg csak a lebegőpontostól megy el a kedve.
    Amit egyébként nem értek, sehol senki nem panaszkodott a régi barlangrajzokon, hogy nem tud .COM fájlt készíteni; pedig anno az .EXE helyett .COM gyártása olyan magától értetődő volt, mint az, hogy a parancsokat be kell gépelni.
    Mutasd a teljes hozzászólást!
  • Hajajj, még ha csak DOS-ablak lenne (bár ott a Model=Large is használható, sőt voltak mindenféle proteced-mode extenderek is), ezt a részt olvasd el:

    > 16 bites valós módú C kódot kellene fordítani. Raw .bin formában.
    > Ha floppyról felmásolom a memóriába és ráugrok akkor fusson.

    Én ezt úgy értem, hogy floppy-ról akarja bootolni a programját, DOS nélkül... Vagy ki tudja...
    Az is lehet, hogy egy olyan házi COMMAND.COM-ot használ, amiben a programok indítása nem rendszerhívással, hanem kézileg van megoldva, és emiatt csak COM-ok futtathatók...
    Mutasd a teljes hozzászólást!
  • Az is lehet, bár a .COM fájl lényegében egy raw .bin néhány olyan konvencióval, hogy org=100h és CS=DS=ES=SS - de ha nincs alatta DOS se, akkor biztos nem akar kiíratni se. Lehet, hogy ez egy új op.rendszer bootstrap-je lesz? De oda minek lebegőpont... Majd megmondja, ha úgy gondolja.

    Biztos assembly-ben írnám meg, már csak a brahi kedvéért is
    Mutasd a teljes hozzászólást!
  • Én ezt úgy értem, hogy floppy-ról akarja bootolni a programját, DOS nélkül...

    Én is így értettem. Ezért is adtam az OSDev linket.
    Mutasd a teljes hozzászólást!
  • Biztos assembly-ben írnám meg, már csak a brahi kedvéért is

    Láttam én már asmben írt  full OS-t, de nincs annyi szatmári szilva és zala gyöngye, hogy nekiálljak nulláról egy OS-t írni. Főleg nem fasm-ban.
    Mutasd a teljes hozzászólást!
  • Amit egyébként nem értek, sehol senki nem panaszkodott a régi barlangrajzokon, hogy nem tud .COM fájlt készíteni; pedig anno az .EXE helyett .COM gyártása olyan magától értetődő volt, mint az, hogy a parancsokat be kell gépelni.

    Szerintem ennek az a megfejtése, hogy aki com fájlokkal bitvadászkodott, az kerülte a koprocesszort. Aki meg koprocesszorkodott (aminek ugye nem ritkán emuláció lett a vége, csiga teljesítménnyel), azt meg pont nem érdekelte a bitvadászkodás, hogy most com vagy exe-e az eredmény.

    Persze hogy ellentmondjak magamnak, azért egy pillanat alatt találtam ilyet: Google Csoportok - ez eléggé az a kérdés, ami itt is elhangzott.
    Amúgy más is jár múzeumba, ilyet is találtam: How to build DOS COM files with GCC « null program - ő a semmi-library utat járja, de az összeszedett kapcsolók, stb. ettől még hasznos lehet.
    Mutasd a teljes hozzászólást!
  • Borland C-ben van "-f87" opció, aminek hatására inline kódot generál a lebegőpontos műveletek mögé a könyvtárba hívás helyett. Így ugyan koprocesszor nélkül nem indul majd el a program, cserébe viszont elvileg nem kell neki az emu.lib. A másik az "-lt" opció, ami a linkernek (is) megmondja, hogy szintén tiny modelt használjon.

    Ezek egyike sem segít? Vagy ezek nincsenek is Turbo C-ben? Egyáltalán hányas? A C0T.OBJ elsőként szerepel az .obj-ok felsorolásában a linker parancssorában?
    Mutasd a teljes hozzászólást!
  • Bár nem én vagyok a kérdésfeltevő, de ezt mind kipróbáltam.
    A -f87 opciótól valóban nem emulál, viszont az FP87.LIB fájlt linkeli be, ami ugyanazt a hibát adja, mint az EMU.LIB. Valamelyik rutincsomag mindenképp jön sajnos. Ezen nem segít a -lt sem, de direkt külön próbáltam (fordítás -c és külön linker, kézzel hozzátéve a csomagokat, hogy lássam, hol akad el). A verzió nálam 3.0 a kérdezőnél 3.5 úgy tűnik, mindegy.

    A konklúzió - ld. tevemadár linkjét! - hogy más fordítóprogramot kell keresni, a TCC a jelek szerint nem alkalmas. Érdeklődöm a GCC-t ajánlgatóktól, hogy ehhez a nagyapámtól rám maradt példány kell, vagy mai modern, lézeres verzióval is lehet relokáció-mentes 16bites kódot fordítani?

    Ma amúgy divat a paleo, épp tavaly írt Olivier "Baudsurfer" Poudade egy BootChess programot, mely a létező legrövidebb (kevesebb, mint 500 bájt!) - nagyon király kód, de persze full ASM.
    Mutasd a teljes hozzászólást!
  • Ma amúgy divat a paleo, épp tavaly írt Olivier "Baudsurfer" Poudade egy BootChessprogramot, mely a létező legrövidebb (kevesebb, mint 500 bájt!) - nagyon király kód, de persze full ASM.

    Erről rögtön a ZX-81-es sakkprogram jutott az eszembe, és a kódban van is rá egy hivatkozás 
    Mutasd a teljes hozzászólást!
  • Igen, az a hivatkozás, hogy ez rövidebb
    Mutasd a teljes hozzászólást!
  • A konkrét hivatkozás mondjuk annyit ír, hogy "note original 1K ZX Chess q=k trick".
    Amúgy igazad van, láttam az elején az "any platform"-os részt, illetve most kíváncsiságból meg is néztem: a Wikipedia cikk (1K ZX Chess - Wikipedia, the free encyclopedia ) külön ír a rekorddöntésről. Nem is gondoltam volna, de ezek szerint a ZX Chess 32 évig volt a legrövidebb sakkprogram, ez azért elég figyelemreméltó.
    Mutasd a teljes hozzászólást!
abcd