PCPROG.6

25 Sep 1995 - 24 Dec 1999

Topics

  1. algoritmi (449)
  2. baze.podataka (309)
  3. ms.dos (17)
  4. windows (294)
  5. asembler (553)
  6. basic (458)
  7. jezici (42)
  8. pascal (1297)
  9. cccc (522)
  10. cpp (299)
  11. clipper (601)
  12. fox (70)
  13. cavo (14)
  14. delphi (1130)
  15. java (100)
  16. razno (776)
  17. unknown (127)

Messages - asembler

asembler.413 mdimitrijevic, -> #412, jjerry
>>> Pojasni sta da pojasnim :) Interesuje te kako se radi >>> filovanje 3D poligona ili uopste kako se rade kompletne rutine ? > > Ma samo filovanje 3D poligona...izgleda mnogo interesantno,posto > nikad nisam pravio 3D animaciju svojim rendererom :) Ovoga sam se plašio :) Filovanje 3D poligona je poprilično kompleksna oblast ako pričamo o matematički pravilnom filovanju tj. pravom osvetljenju i teksturisanju. Ne samo što je takvo izračunavanje kompleksno već je i zahtevno što se vremena tiče. Ali to već znaš s obzirom da radiš sa programima za animaciju. No da se prebacim na fazon DEMO-a i INTRO-a. Prednost takvih programa je što unapred znaju sadržaj scene koju će obrađivati tj. scena je pripremljena na način na koji će se rutina za 3D najbolje iskazati. Tako recimo vrši se prekalkulisanje normala, pripremanje kompletne putanje objekata unapred itd. Sve se to uradi pre početka filovanja i onda se samo u svakom prolazu koriste prekalkulisane vrednosti. Postoji kao što znaš obično FLAT filovanje koje se ujedno i najlakše radi. Njega prosto vršiš sa REP STOSB (STOSW, STOSD zavisi) po horizontalnim linijama jer je to najbrži način. Pokupe se vrednosti za početnu i krajnju X kordinatu (to jest povuče se horizontalna linija između dve stranice trougla) i jednostavno je filuješ sa REP STOSB. No ovo se može vršiti sa prikupljanjem početnih i krajnjih X kordinata posebno za sve tri linije ili u jednoj petlji preći za sve slučajeve odjednom no to zavisi od toga kakva je rutina za filovanje. E da, koristi se trougao kao osnova za sve kompleksnije poligone jer je to najmanji oblik koji definiše jednu ravan, tako da sa tri tačke imamo sve što je potrebno za posmatranje poligona u 3D. Da ne pominjem što je filovanje trouglova mnogo brže nego mnogouglova. Onda ima GOURAUD senčenje koje može dosta lepo da izgleda ako se pripremi dobra paleta (ranije je u DEMO-ima GOURAUD senčenje poturano kao PHONG) GOURAUD senčenje se može uraditi na više načina i to zavisi od toga koliko vremena želimo da uštedimo. Ja ću reći samo da se kod ovog senčenja izračuna ugao pod kojim pada svetlost na svaku od tri normale na tačke trougla u prostoru. Onda se filuje kao i FLAT samo se interpolacijom dolazi do boje za svaku tačku poligona tj. uradi se prelaz od početne do krajnje boje u horizontalnoj liniji trougla. Naravno paleta mora biti pripremljena da sadrži boje od najtamnije do najsvetlije ili obrnuto. Naravno sve ovo primenjeno na texture mapping se vrši preko indeksa u paleti da bi se dobilo senčenje tekstura, no da batalimo to. PHONG senčenje je već nešto zanimljivo. Ono predstavlja izračunavanje ugla pod kojim pada svetlost na SVAKU tačku poligona. Samim tim se dobija potpuna realnost senčenja. Da bi se postigla brzina, to se ne radi :) već se primenjuju preračunavanja koja omogućavaju da se delimičnim gubljenjem na preciznosti (svođenjem na manji broj decimala) dođe do brzine. Sve ovo postaje mnogo komplikovanije kada se razmisli o tome da se različiti materijali ponašaju potpuno različito tj. različito odbijaju svetlost, poseduju refleksiju i imaju različite teksture. METAL senčenje je otprilike običan PHONG samo sa malo promenjenom formulicom za izračunavanje odbljeska. METAL se često koristi sa nekom mapom refleksije. No, pravi programi za 3D modeliranje i senčenje trude se da sve navedene osobine materijala i svetla izračunaju što preciznije. Naravno, jasno je da oni to ne rade baš uvek dobro, jer i ti programi moraju da štede na vremenu koliko je moguće. Dobru primenu optimizacije možemo da vidimo kod 3D Studio MAX-a koji ima mogućnost prikaza scene u prozoru kao GOURAUD senčenje sa više izvora svetla. No siguran sam da bi sve to moglo još brže da se napiše ;) Ma, ubio bih se kada bih morao da sve ovo objašnjavam. Najlepša stvar kod svih ovih rutina je da se pronađe način da se senčenje izvede što brže, a da se eventualni propusti sakriju. Potrebno je mnogo mozganja da se izmisli način da nešto uradiš brže u asembleru. U to spadaju brojanje clock-ova po rutinama, align podataka na parne adrese (što i nije toliko značano kod Pentiuma, jer njegov cache radi malo unapred tj. vrši procesiranje više instrukcija odjednom, što onda za sobom povlači takvo preuređivanje redosleda naredbi koje bi dovelo do toga da se jedna za drugom postave instrukcije koje mogu zajedno da uđu u procesiranje), pisanje rutina (petlji) tako da upadnu u cache. Recimo dok sam jedno vreme razvijao svoju rutinu za 3D, sva merenja sam radio na nivou milisekundi. Tako da sam kod većih scena, kod manjih izmena, imao ogromna ubrzanja. Itd, itd ... > Razumelo se :) Btw. zashto se parnim adresama brzhe pristupa ? Verovao ili ne, ne mogu da se setim zašto se brže pristupa parnim adresama odnosno deljivim sa 2/4/8. Očigledno više ne mogu sve da popamtim :( Ali, setiću se već. P.S. Sve što sam napisao je VRLO nedorečeno, ali toliko opširna tema ne može tek tako lako da se napiše.
asembler.414 jjerry, -> #413, mdimitrijevic
10x Quote bi mnogo mesta zauzeo.. Btw. poznate su mi sve tehnike senchenja..samo mi nije bilo jasno kako se prikazuje uopshte to shto filujesh.. Poz. §JţÔÔśř
asembler.415 jolicm,
Zdravo narode . trebaju mi saveti za rad programa u zaštićenom modu rada procesora. Naime napravio sam davno ASM rutine za indeksiranje za Clipper programski jezik, ali kada hoću rad u zaštićenom modu, glavni program u Clipperu pukne na mojoj ASM rutini. :( Upomoć ljudi !
asembler.416 mdimitrijevic, -> #414, jjerry
> Btw. poznate su mi sve tehnike senchenja..samo mi nije bilo jasno > kako se prikazuje uopshte to shto filujesh.. Filovanje uopšte nije problem. Zamisli da imaš dva niza: startx[200] i endx[200] (u startu su ti sva polja niza startx popunjena sa 320 ili većim brojem (sve zavisi od rezolucije u kojoj ti radi rutina, tako da i umesto 200 treba veći broj da bi primio sve moguće Y kordinate), dok endx popuniš sa -1. Iskoristi bilo koju rutinu za crtanje linija samo umesto da iscrtaš tačku, upiši (recimo da su kordinate tačke X i Y) ovako: startx[Y]=X ili endx[Y]=X u koju ćeš upisati zavisi od toga da li je Y kordinata druge tačke linije veća ili manja od Y kordinate prve tačke linije. Ako je manja druga Y kordinata onda upisuješ u startx. Zašto je to tako. Svi poligoni su kreirani tako što su linije (tačke) koje ih definišu u smeru kazaljke sata. Inače ako su u suprotnom smeru onda to znači da se one ne vide tj. da svetlost ne pada direktno na poligon. Ovo je malo uprošćeno objašnjenje ali pomoći će za početak. E da, važno je da porediš prethodnu vrednost u startx i endx tako što pre nego što upišeš novu vrednost X, proveriš da li je X manje od startx[Y], ako jeste upiši novo X ako nije ništa. Isto tako za endx proveravaš da li je X veće od one upisane za taj Y red. Naravno ovo se sve odnosi na povlačenje linija kod već projektovanih 3D tačaka u 2D. Uglavnom posle svega ovoga imaš dva niza kod kojih lepo povučeš horizontalne linije između startx i endx za svaku Y kordinatu. Ovo je najprostiji vid i osnova filovanja. Postoje mnogo komplikovanije rutine koje sve ovo rade u jednoj petlji (nema potrebe za dva niza i ostalim peripetijama). Kada se poseduje ovakva rutina za popunjavanje poligona moraju se imati rutine za projekciju 3D->2D, kontrola i projekcija iz kamere, izvori svetla, rotacija objekata, kamere, svetla itd. Da ne pominjem texture-mapping. Sa takvim, osnovnim rutinama koje se mogu naći bilo gde, može se napisati program koji će da renderuje bilo koju scenu. Problem je "samo" u tome što bi to bilo očajno sporo (naravno kada bi se sve to uradilo bez pravog znanja i fenomenalne optimizacije). Kod ozbiljnije rutine uz primenu sasvim poznatih formula mogao bi se uraditi Raytracing bez problema.
asembler.417 stameni,
Malo sam zbunjen sledećim, pa ako neko zna neka viče. Elem, zna se da je funkcija 4ch interrupta 21h jedan (možda i jedini) preporučljiv način da se završi program -- sama brine o otvorenim datotekama, ne zavisi od segmentnih registara, i preko registra al prosleđuje DOS-u vrednost koja se može dalje obraditi u batch fileovima itd. Probao sam da sledeći kratak mašinski program mov ax, 4c00 int 21 u gornjem obliku ukucam u DOS-ov Debug i u Turbo Debuggere 2.01 i 3.1. Pre pokretanja programa sam očekivao da mi kao rezultat bude vraćena poruka tipa "Program terminated normally" (uz exit code 0, razume se), al' jok -- večito bivam puknut u DOS (?) bez ikakvog objašnjenja. Da stvar bude misterioznija, probao sam da sa Borlandovim Turbo Pascalom 6.0 (instrukcija halt) i C++ 3.1 (naredba return), posle kompajliranja, naravno, ispitam kako se oni ponašaju kod gornje funkcije, i pokazalo se da je i Borland koristi, ali uspešnije od mene, jer se program završi baš "kako treba". DOS je 6.2 sa 4DOS-om 5.5, a isprobano je i sa (skoro) čistim DOS-om, pod gorenavedenim debuggerima. Šta se to dešava?
asembler.419 mdimitrijevic, -> #418, kajko
> Treba mi neko ko zna da skine zastitu HardLock. Ovo će ići malo teže. A i "protivzakonito" je :) > Ukoliko je to ne predstavlja problem, moze li neko da mi > objasni na Mail kako se to radi. Da bi se skinula HardLock zaštita potrebno je malo više znanja od onog koje se može dobiti preko Mail-a. Previše je to kompleksan i zahtevan posao da bi ga se neko prihvatio. Naravno, uvek se može desiti da je zaštita vrlo prosta, ali je to malo teži slučaj. Mogao bi da se raspitaš da li je neko već skinuo zaštitu sa tog programa pa da iskoristiš već urađen CRACK fajl.
asembler.420 zdravkod,
Kako da procitam vrednost iz BS:BX? Zdravko
asembler.421 zdravkod, -> #420, zdravkod
DS:BX Greska, izvinjavam se.
asembler.422 stameni, -> #421, zdravkod
>> DS:BX Greska, izvinjavam se. Zavisi od toga šta se nalazi u DS:BX. Ako je u pitanju samo neka vrednost u registru, jednostavno kažeš MOV AX, BX. Ako bi hteo da pročitaš 16-bitnu vrednost koja je na adresi DS:BX, kažeš MOV AX, [BX] (bez potrebe za inicijalizacijom registra DX, koji bi prema tome što kažeš već bio postavljen). Itd. Da ne bih sada nabrajao sve adresne modove, ako do sada nije jasno, navedi malo preciznije šta bi hteo da uradiš, pa da vidimo...
asembler.423 zdravkod, -> #422, stameni
Koliko ja razumem u DS:BX se nalazi dword, valjda doubleword, odnosno 32bit vrednost. Zdravko
asembler.424 stameni, -> #423, zdravkod
>> Koliko ja razumem u DS:BX se nalazi dword, valjda doubleword, >> odnosno 32bit vrednost. Posle ovoga: MOV AX, DS SHL EAX, 16D ADD AX, BX u EAX biće upisana vrednost DS:BX.
asembler.425 stameni, -> #424, stameni
Ovo ' D' je oznaka da je u pitanju dekadni, a ne heksadekadni sistem!
asembler.426 zdravkod, -> #424, stameni
Kad otkucam to i pokusam da kompajliram (inace pisem u pascalu u asm odeljku) kaze mi "Unknown identifier za EAX. Zdravko
asembler.427 stameni, -> #426, zdravkod
>> Kad otkucam to i pokusam da kompajliram (inace pisem u pascalu u >> asm odeljku) kaze mi "Unknown identifier za EAX. Greška nastaje jer kompajler nema pojma o tom registru (koji, inače, postoji na 386+). Možda upali stavljanje sviča $G na "on" ($G+, mada sumnjam), ali ako radiš u Pascalu, imaš ovo rešenje: uses dos; function obradi(var r: registers): longint; begin obradi := r.ds * 65536 + r.bx end; Može se naterati komapajler da sažvaće i EAX registar pomoću inline mašinskog koda, mada mislim da za tim nema potrebe. U C-u bi trebalo da se mogu koristiti i promenljive _AX, _BX i slične.
asembler.428 zdravkod, -> #427, stameni
Bojim se da ni ov ne pomaze... Ceo problem se sastoji u tome da hocu da iscitam serijski broj hard diska. Kad pozovem funkciju 69 interapta 21 u HELPPC-u kaze da serijski broj vraca u DS:DX. Pokusao sam mali milion nacina, ali svaki put mi ispise neke nebuloze. Evo saljem i program ako ce to da pomogne... Zdravko ds_dx.pas
asembler.429 stameni, -> #428, zdravkod
>> Bojim se da ni ov ne pomaze... Ceo problem se sastoji u tome da >> hocu da iscitam serijski broj hard diska. Kad pozovem funkciju 69 >> interapta 21 u HELPPC-u kaze da serijski broj vraca u DS:DX. Mislim da si mi ovom porukom razjasnio mnoge stvari. Elem, u pitanju je registarski par koji sadrži pokazivač na strukturu. Dakle, treba čitati memoriju adresiranu registrima, a ne samu vrednost registara. Ta struktura, piše u HELPPC-u i u Interrupt Lists, od ofseta 2 sadrži jednu četvorobajtnu promenljivu (dword) koja posle poziva prekida biva napunjena sa osam binarno kodiranih cifara, a to je ono što nam treba. Binarno kodiranje se sastoji u tome što se u viši polubajt (nibble) upiše jedna cifra, a u niži polubajt druga cifra. Dakle, potrebna nam je i jedna konverziona rutina iz dekadnog u heksadekadni sistem. Heksadekadni broj će biti niska (string) dužine 2. Kako obezbediti memoriju za DS:DX registarski par? Ima više načina. Jedan je da se napravi promenljiva tipa string dužine 24 bajta (jer je tolika ukupna dužina potrebne memorijske strukture), i onda proslediti njen segment i ofset registrima DS i DX. Nakon pozivanja prekida taj string će biti promenjen, nakon toga čitamo bajtove na ofsetima 5, 4, 3 i 2 i jedan po jedan konvertujemo ih u nisku, koju na kraju prikažemo. I to je to. Evo programa: ----<cut>---- program DiskSerialNumber; {$R+} uses dos; function Dec2Hex(x: byte): string; var ret: string[2]; begin case x div 16 of 0..9: ret := chr((x div 16) + 48); 10..15: ret := chr((x div 16) + 55) end; case x mod 16 of 0..9: ret := ret + chr((x mod 16) + 48); 10..15: ret := ret + chr((x mod 16) + 55) end; Dec2Hex := ret end; function GetDiskSerialNumber(drive: byte): string; var r, s: string[24]; regs: registers; begin s := ''; regs.ah := $69; regs.al := $00; regs.bl := drive; regs.ds := seg(s); regs.dx := ofs(s); MsDos(regs); if regs.flags and FCarry = 0 then r := Dec2Hex(ord(s[5])) + Dec2Hex(ord(s[4])) + ':' + Dec2Hex(ord(s[3])) + Dec2Hex(ord(s[2])); GetDiskSerialNumber := r end; begin writeln(GetDiskSerialNumber(0)) end. ----<cut>---- Argument koji se prosleđuje funckiji za nalaženje serijskog broja je 0 za tekući drajv, 1, za A:, 2 za B: itd. Probaj ovo, pa ako ima nejasnoća ti viči.
asembler.430 ksanyi,
Hi! Dali neko ima funkciju za računanje tangensa hiperboličkog? Unapred hvala!
asembler.431 zdravkod,
Kako da skocim na neku odredenu adresu u memoriji. Konkretno treba da skocim na FFFF:0000. Zdravko
asembler.432 jjerry, -> #431, zdravkod
Shta to hocesh da uradish ? Resetujesh kompjuter ? Sorry jerbo se ne secam :( ali sam siguran da je vec bilo ovde negde,mozda cak ni ne tako davno.
asembler.433 zdravkod,
Jel moze neko da mi objasni kako da iz nekog asembler programa pozovem negi drugi .COM program (na foru ucitam ga u memoruju i onda skocim na pocetak tog programa u memoriji). Ovo sam probao i kompjuter se zablokira. U najboljem slucaju program se izvrsi pa onda ispise neke brljotine po ekranu pa onda zablokira. Ako moze detaljnije objasnjenje... Zdravko
asembler.434 mdimitrijevic, -> #433, zdravkod
> Jel moze neko da mi objasni kako da iz nekog asembler programa > pozovem negi drugi .COM program (na foru ucitam ga u memoruju i > onda skocim na pocetak tog programa u memoriji). Ovo sam probao i > kompjuter se zablokira. U najboljem slucaju program se izvrsi pa > onda ispise neke brljotine po ekranu pa onda zablokira. Ako moze > detaljnije objasnjenje... Taj COM program moraš da učitaš na adresu CS:0100h gde ti je CS segment u koji si učitao COM fajl. Takođe DS, ES, SS, CS moraju pokazivati na isti segment tj. onaj koji si rezervisao za COM fajl. SP može da bude FFFE. Takođe postoji dosta programa koji proveravaju svoj PSP (na primer u potrazi za podacima iz komandne linije) tako da bi valjalo da ga kreiraš. E da, pošto treba da pozivaš neki drugi program onda moraš da sačuvaš SVE (najbolje je) registre pre JMP-a na početak COM programa, i da ih vratiš na kraju. Isto tako potrebno je da preuzmeš npr. INT 21h funkciju 4Ch da bi sačekao završetak programa i vratio sve kako je i bilo. E sad, ima nekih programa koji izlaze sa RET, a ima (verovatno negde na svetu :) i programa koji izlaze preko INT 21h funkcija 0 ili preko Int 20h, no ovo je zastareli metod. Čuvanje registara je važno ako treba da se iz pozvanog programa 'vratiš' u svoj. E sad, nešto sam sigurno zaboravio, ali mnogo je to različitih informacija da bih se svega setio. S obzirom da je ovo gore navedeno komplikovaniji način, a pretpostavljam da nisi baš profesionalac, mogao bi da se pozabaviš DOS funkcijom, naravno, INT 21h 4Bh kojoj prosleđuješ način na koji hoćeš da se učita program (da se učita, da se učita i izvrši pa onda vrati u tvoj program, da se učita i kreira PSP itd. tako neke kombinacije), pointer na ime programa i pointer na nekakve parametre. Valjalo bi da imaš neki pregled interapta. Ukoliko nemaš predlozio bih ti da skineš sa Sezama. HELPPC, TECH HELP, DOS REFERENCE itd. su dobri. Sve navedeno pišem napamet, tako da ne zameri na eventualnoj grešci. Ako malo pobliže objasniš šta konkretno hoćeš (da li želiš da se, posle startovanja COM programa 'vratiš' u svoj ili da taj program prezume komandu itd.
asembler.435 zdravkod, -> #434, mdimitrijevic
Pa potrebno mi je samo startovanje tog programa, dakle onaj program koji se startuje treba da preuzme potpunu kontrolu... Takode je vazno da se ne koriste DOS interapti. Bio bih zahvalan ako bi mogao da napises primer, jer nisam bas vest sa assemblerom i ne verujem da bi mogao da izvedem sve ono sto si naveo u prethodnoj poruci... Zdravko
asembler.436 mdimitrijevic, -> #435, zdravkod
> Pa potrebno mi je samo startovanje tog programa, dakle onaj program > koji se startuje treba da preuzme potpunu kontrolu... Takode je > .... > da napises primer, jer nisam bas vest sa assemblerom i ne verujem > da bi mogao da izvedem sve ono sto si naveo u prethodnoj poruci... A da ti objasniš za šta ti konkretno treba da pozivaš iz svog asemblerskog neki COM program. Možda postoji lakši način da se reši tvoj problem.
asembler.437 zdravkod, -> #436, mdimitrijevic
Pa, ovako... Zeleo bih da taj .COM program upisem u boot sector. U boot sector moze da se upise samo program duzine do 512 bajtova. Moja namera je da taj program u boot sectoru ucita u memoruju neki drugi program vece duzine i da ga izvrsi, tj preda mu potpunu kontrolu... Zdravko
asembler.438 mdimitrijevic, -> #437, zdravkod
> Pa, ovako... Zeleo bih da taj .COM program upisem u boot sector. U > boot sector moze da se upise samo program duzine do 512 bajtova. > Moja namera je da taj program u boot sectoru ucita u memoruju neki > drugi program vece duzine i da ga izvrsi, tj preda mu potpunu > kontrolu... Aha, samo da se nisi malo zaleteo ? Ako si već početnik onda je nemoguće da bi nešto slično mogao da uradiš. Opisaću ti neke stvari koje su važne oko takve jedne rutine, ali naglašavam da pišem napamet, tako da ako ima grešaka ne zamerite. To što ti želiš rade virusi. Odmah da napomenem da viruse nije teško napisati, teško je napisati dobre viruse :) E sad, u trenutku startovanja boot sectora DOS nije startovan, samim tim ne postoji način da se lako pročita neki fajl sa diska i učita u memoriju. Morao bi da znaš gde se tačno (fizički) na disku nalazi početak fajla da bi ga pročitao preko na primer Int 13h (BIOS poziva). Moguće je naći poziciju fajla tako što preko direktnog čitanja diska (uz poznavanje struktura svih DOS tabela na disku) nađeš traženi fajl. Ovo bi teško strpao u 512 bajtova (u to bi trebalo da stane i učitavanje itd.). Virusi to rešavaju na taj način što kod virusa strpaju negde na disk (na poziciju koja je nepromenjiva) pa onda po čitanju boot sectora pročitaju taj kod i izvrše ga. Pa preuzimaju Int 13h da bi poturali pravi boot sectoru programima koji ga čitaju itd. itd. ... E sad, da ne razvlačim priču, pošto bi nekako uspeo da startuješ taj COM program, on bi morao da nastavi sa podizanjem sistema, jer, logično, ako sistem nije podignut onda nema ništa od rada na kompjuteru. Podizanje sistema opet ima neke svoje cake. Sve u svemu, ne isplati se da se baviš ovim, osim ako te baš ne interesuje pravljenje virusa :) Ako ti za neku stvar baš treba ovakav program, reci o čemu se radi, možda neko ima program koji bi mogao da ti pomogne. Pravo da ti kažem, da imam dovoljno vremena, bilo bi mi pravo zadovoljstvo da se ponovo pozabavim asemblerom i uradim ti ovaj program.
asembler.439 zdravkod, -> #438, mdimitrijevic
Da, svestan sam svih komplikacija itd... Stvar je u tome da ja ne zelim da pravim virus!!! Cak ne zelim da ucitavam DOS... Jednostavno, poenta je u tome da hocu da na ovaj nacin, pri bootovanju, startujem jedan programcic koji je malo veci od 512 bajtova... P.S: I nisam bas toliki novajlija...
asembler.440 mdimitrijevic, -> #439, zdravkod
> zelim da pravim virus!!! Cak ne zelim da ucitavam DOS... > Jednostavno, poenta je u tome da hocu da na ovaj nacin, pri > bootovanju, startujem jedan programcic koji je malo veci od 512 > bajtova... Napisao sam koje su komplikacije da se tako nešto uradi. Ako bi recimo radio preko diskete (mada može i preko hard diska) koja bi bila specijalno pripremljena da uradi samo ovu stvar, bilo bi malo lakše. Mogu da pokušam da nađem neki primer boot sectora koji radi raznorazne stvari. Mislim da ga, negde na disketama, imam, ali ... Ako radiš sa konkretnim vrednostima, napišeš boot sector koji čita, sa neke "fizičke" adrese, sa diska seriju bajtova COM programa na početak nekog segmenta i to na ofset 0100h, zbog skokova, petlji itd. Primeniš ona pravila koja sam napisao u nekoj od prethodnih poruka. Onda na kraju boot sectora skočiš (sa JMP seg:0100h) na tu adresu i to je to. Znaš i sam da u takvom COM programu nema DOS funkcija i ostalih lepota. Taj COM program bi morao pažljivije da se napiše. E sad, pošto se posle boot sectora neće startovati, DOS, Windows, Unix ili bilo koji drugi, operativni sistem onda je sasvim proizvoljna segment adresa na koju ćeš učitati željeni program. Takodje ne moras da brines o ostalim zajebancijama oko podizanja operativnog sistema. Kada snimaš na disketu ili hard rutinu koja će se startovati, moraš da paziš da se Int 13h i DOS sektori itd. ne poklapaju. Takođe možeš da snimiš fajl pod običnim DOS-om, pročitaš gde se "fizički" na disku nalazi serija bajtova (COM program) i ugradiš ih pravo u rutinu u boot sectoru. > P.S: I nisam bas toliki novajlija... OK, olako sam ocenio ko je novajlija, a ko nije.
asembler.441 mdimitrijevic, -> #440, mdimitrijevic
> Mogu da pokušam da nađem neki primer boot sectora koji radi raznorazne > stvari. Mislim da ga, negde na disketama, imam, ali ... Naš'o nešto slično. Primer je u C-u pa nemam pojma koliko će ti pomoći :( Ovo je primer, iz PCINTERN kolekcije rutina, koji formatira disketu i upisuje svoj boot sector sa porukom o autoru itd. Primer bi mogao da iskoristiš kao osnovu za upis tvog boot sectora. Samo obriši poziv funkcije koja formatira i ostavi deo za upis boot sectora. Primer ne radi sa hard diskom. dfc.zip
asembler.442 stameni, -> #441, mdimitrijevic
>> Ovo je primer, iz PCINTERN kolekcije rutina, koji formatira disketu i >> upisuje svoj boot sector sa porukom o autoru itd. Može li se saznati nešto više o ovim rutinama? Koliko to zauzima kad bi se slalo na Sezam -- ne videh po direktorijumima nešto što se slično vika, a izgleda da je fina stvar... U posedu sam Interrupt Lists 5.3, skinuto čini mi se sa CD-ova koje prodaje SezamPro, a ovde je valjda poslednja verzija 5.1; da li je potrebno da šaljem novu verziju? Mislim da razlike nisu baš bitne...
asembler.443 mdimitrijevic, -> #442, stameni
> Može li se saznati nešto više o ovim rutinama? Koliko to > zauzima kad bi se slalo na Sezam -- ne videh po direktorijumima > nešto što se slično vika, a izgleda da je fina stvar... Može da se sazna, a može i da se dobije :)) Ima nekoliko zanimljivih primera za početnike i za napredne programere. Sorsovi su u C-u i ASM-u. pcintern.zip
asembler.444 stameni, -> #443, mdimitrijevic
>> Može da se sazna, a može i da se dobije :)) Hvala :) Deda Mraz ima iste inicijale kao ti :)
asembler.445 mdimitrijevic, -> #444, stameni
>>> Može da se sazna, a može i da se dobije :)) > > Hvala :) Deda Mraz ima iste inicijale kao ti :) Prepoznao si me :))) Moraću da menjam username :) Volim da pomognem ako mogu. Vidim da se datoteke koje sam slao u ovu konfu uveliko skidaju (i one ranije i ove nove). Drago mi je da je tako.
asembler.446 zdravkod,
Kako da iscitam Boot sector hard diska-a?! Probao sam sa interaptima 13 i 25 i oni dobro rade kada je u pitanju diskata, medutim kad hocu da na isti nacin da iscitam sa harda vracaju mi neke gluposti... Zdravko
asembler.447 jujo, -> #446, zdravkod
# Kako da iscitam Boot sector hard diska-a?! Probao sam sa # interaptima 13 i 25 i oni dobro rade kada je u pitanju diskata, # medutim kad hocu da na isti nacin da iscitam sa harda vracaju mi # neke gluposti... # Zdravko Pa stavi kao broj diska 0x80 (za PRVI HD U SISTEMU) a ne 2 ili tri kako pretpostavljam
asembler.448 zdravkod, -> #447, jujo
Nisam pravio tu gresku... Kod Int 25 je za hard disk 2, dok je ovde 80h... Sigurno je sve dobro, ali on mi uporno vraca Invalid Media Type.. Zdravko
asembler.449 jujo, -> #448, zdravkod
# Nisam pravio tu gresku... Kod Int 25 je za hard disk 2, dok je ovde # 80h... Sigurno je sve dobro, ali on mi uporno vraca Invalid Media # Type.. # Zdravko Evo ti prog koja sam ja pisao pa vidi gde si se izradio. Ovo je C verzija jer neznam gde sam stavio ASM verziju... ali su kljucni delovi u ASM-u Ovo je pisano za BC 3.1 ============================================================================= #include <dos.h> #include <bios.h> #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> #define PART1 0x01be #define PART2 0x01ce #define PART3 0x01de #define PART4 0x01ee #define BYTE unsigned char #define WORD unsigned short #define DWORD unsigned long typedef struct { BYTE BootIndicator; BYTE bgSector; BYTE bgSectorH; BYTE bgCylinder; BYTE SystemIndicator; BYTE edSector; BYTE edSectorH; BYTE edCylinder; DWORD numSecP; DWORD numSec; } BIOS_PARTITION; typedef struct { int shead; int scyl; int ssec; int ehead; int ecyl; int esec; } PARTITION; typedef struct { BYTE boots[512]; BIOS_PARTITION *p[4]; PARTITION pp[4]; int nhead, ncyl, nsec; int drivenum; } DRIVE; typedef struct { char name[15]; int id; } SYSTEMS; SYSTEMS sys[]= { {"UNKNOWN ", 0 }, {"DOS12 ", 1 }, {"XENIX ", 2 }, {"XENIX ", 3 }, {"DOS16 ", 4 }, {"EXTEND ", 5 }, {"BIGDOS ", 6 }, {"HPFS ", 7 }, {"SPLIT ", 8 }, {"BootMgr ",0x0a }, {"DM ",0x50 }, {"NOVELL ",0x51 }, {"GB ",0x56 }, {"SPEED ",0x61 }, {"NET286 ",0x64 }, {"NET386 ",0x65 }, {"PCIX ",0x75 }, {"Linux ",0x83 }, {"CP/M ",0xdb }, {"BBT ",0xff }, {"NULL ", -1 } }; DRIVE drv[4]; SYSTEMS *getSystem(int s) { int i; for (i=0;;i++) { if (strcmp(sys[i].name, "NULL ")==0) return sys; if (sys[i].id==s) return sys+i; } } int makeSector(int p1, int p2) { return p1 | (p2 & 63); } int makeCyl(int p1, int p2) { return p2 | ((p1 & 192)<<2); } void calculateDrive(DRIVE *d, int maxhead) { int i; int boot, ssec, scyl, esec, ecyl; long rsec, tsec; for (i=0; i<4; i++) { ssec=makeSector(d->p[i]->bgSector, d->p[i]->bgSectorH); scyl=makeCyl(d->p[i]->bgSectorH, d->p[i]->bgCylinder); esec=makeSector(d->p[i]->edSector, d->p[i]->edSectorH); ecyl=makeCyl(d->p[i]->edSectorH, d->p[i]->edCylinder); d->pp[i].shead= i==0 ? 1:0; d->pp[i].ehead= maxhead-1; d->pp[i].ssec= ssec; d->pp[i].esec= esec; d->pp[i].scyl= scyl; d->pp[i].ecyl= ecyl; } } void getDriveParams(int drive) { int sec, cyl, head=0; asm { push ax; push bx; push cx; push dx; push di; push es; clc; xor ax, ax; mov ah, 0x08; mov dx, drive; add dx, 0x80; int 0x13; mov ax, cx; and ax, 0x3f; mov sec, ax; mov byte ptr head, dh inc head mov ax, cx; /* ax=cx */ xor ah, ah; /* ah=0 */ shl ax, 2 /* */ mov al, ch /* */ add ax, 1 mov cyl, ax; /* */ pop es; pop di; pop dx; pop cx; pop bx; pop ax; } drv[drive].nsec=sec; drv[drive].ncyl=cyl; drv[drive].nhead=head; } void readPart(int drive) { int res; res=biosdisk (_DISK_READ, 0x80+drive, 0,0,1,1,drv[drive].boots); drv[drive].p[0]=(BIOS_PARTITION *)(drv[drive].boots+PART1); drv[drive].p[1]=(BIOS_PARTITION *)(drv[drive].boots+PART2); drv[drive].p[2]=(BIOS_PARTITION *)(drv[drive].boots+PART3); drv[drive].p[3]=(BIOS_PARTITION *)(drv[drive].boots+PART4); drv[drive].drivenum=drive; getDriveParams(drive); calculateDrive(&drv[drive], drv[drive].nhead); } void showPartition(char *m, int boot, char *system, int ssec, int scyl, int esec, int ecyl, long rsec, long tsec) { printf("\n%s%s", m, boot==0x80 ? "* ": " "); printf(" %s", system); printf("| %5d", ssec); printf(" %5d |", scyl); printf(" %5d", esec); printf(" %5d |", ecyl); printf(" %8lu ", rsec); printf(" %8lu |", tsec); printf(" %-8.2fMb", tsec/2.0/1024.0); } void showPartTable(DRIVE *d, char *mm); void showLogicalPartition(int drive, int part) { DRIVE d; int head, sec, cyl; int res; res=biosdisk (_DISK_READ, 0x80+drive, drv[drive].pp[part].shead, drv[drive].pp[part].scyl, drv[drive].pp[part].ssec, 1, d.boots); d.p[0]=(BIOS_PARTITION *)(d.boots+PART1); d.p[1]=(BIOS_PARTITION *)(d.boots+PART2); d.p[2]=(BIOS_PARTITION *)(d.boots+PART3); d.p[3]=(BIOS_PARTITION *)(d.boots+PART4); calculateDrive(&d, drv[drive].nhead); showPartTable(&d, ">"); } void showPartTable(DRIVE *d, char *mm) { SYSTEMS *s; int i; int boot, ssec, scyl, esec, ecyl; long rsec, tsec; for (i=0; i<4; i++) { s=getSystem(d->p[i]->SystemIndicator); boot=d->p[i]->BootIndicator; ssec=d->pp[i].ssec; scyl=d->pp[i].scyl; esec=d->pp[i].esec; ecyl=d->pp[i].ecyl; rsec=d->p[i]->numSecP; tsec=d->p[i]->numSec; if (s->id!=0) showPartition(mm, boot, s->name, ssec, scyl, esec, ecyl, rsec, tsec); if (mm[0]!='>') if (s->id==5) showLogicalPartition(d->drivenum, i); } } void showTable(DRIVE *d, char *mm) { int i; printf("\n\nHEAD:%-5d CYL:%-5d SEC:%-5d", d->nhead, d->ncyl, d->nsec ); printf("\nBT System |SSector SCyl |ESector ECyl |RelSector TotSectors| Size"); showPartTable(d, mm); } void main (void) { clrscr(); //prvi disk readPart(0); showTable(&(drv[0]), ""); // drugi disk readPart(1); showTable(&(drv[1]), ""); } =============================================================================
asembler.450 pvlada,
Da li neko može da mi napiše algoritam za generisanje slucajnog (random) broja ? Pozdrav Vlada
asembler.451 obren, -> #450, pvlada
> Da li neko može da mi napiše algoritam za generisanje slucajnog > (random) broja ? Evo ti sors funkcije rand() iz BC-a 3.1 (najprostiji mogući, kongruentni), pa je prepevaj na ASM pošto je trivijalno. #include <stdlib.h> #define MULTIPLIER 0x015a4e35L #define INCREMENT 1 static long Seed = 1; /*---------------------------------------------------------------------* Name srand - initializes random number generator Usage void srand(unsigned seed); Description see rand below Return value Nothing *---------------------------------------------------------------------*/ void srand(unsigned seed) { Seed = seed; } /*---------------------------------------------------------------------* Name rand - random number generator Usage int rand(void); Description rand uses a multiplicative congruential random number generator with period 2^32 to return successive pseudo- random numbers in the range from 0 to 2^15 - 1. The generator is reinitialized by calling srand with an argument value of 1. It can be set to a new starting point by calling srand with a given seed number. *---------------------------------------------------------------------*/ int rand(void) { Seed = MULTIPLIER * Seed + INCREMENT; return((int)(Seed >> 16) & 0x7fff); }
asembler.452 speedy, -> #450, pvlada
> Da li neko moze da mi napise algoritam za generisanje slucajnog (random) > broja ? > > Pozdrav Vlada Mozda bi ti bilo "dovoljno slucajno" da iz PIT-a (tajmer cip koji otkucava 18.2x u sekundi, refresuje memoriju, upravlja zvucnikom...) pokupis (counter latch) vrednost iz timera 1... Ako ti treba neki primer mailuj me da prekopam po sorsevima. Za help pogledaj u HelpPC, pcGPE ili nesto slicno ili me mailuj da ti to posaljem.
asembler.454 sqweaky,
Uz poruku je FAQ o asembleru (tasm, masm... ). asmfaq.zip
asembler.455 dule.n,
Ima li neka dobra duša koja zna kako se programiraju video kartice? Interesuju me rezolucije od 640x480 pa naviše, sa 16 ili 256 boja. Sa interaptom 10h je sve jasno ali je, naravno, mnogo sporo. Znači, treba se okrenuti direktnom upisu u video memoriju. Jasno mi je, principijelno, kako je organizovan pristup video memoriji. Da je na adresama od A0000 pa sledećih 64k prozor u celu video memoriju a da se onda upis u željeni deo memorije vrši pomeranjem tog prozora i upisivanjem "kroz" njega. E, interesuje me kako se sve to odrađuje, tj. pre svega kako se pomera taj prozor. Relativno mi je hitno, a bio bih do neba zahvalan onome ko mi razreši ove nedoumice. :(
asembler.456 kojai, -> #455, dule.n
>> Ima li neka dobra dusa koja zna kako se programiraju video kartice? >> Interesuju me rezolucije od 640x480 pa navise, sa 16 ili 256 boja. >> Sa interaptom 10h je sve jasno ali je, naravno, mnogo sporo. Znaci, >> treba se okrenuti direktnom upisu u video memoriju. Jedini nacin da pokrenes rezoluciju ti je preko interapta 10h... Ima jos jedan nacin, kojim se moze generisati rezolucija ekrana, ali to ne znam coveka koji je uradio! :) Princip je sledeci... Posto nemas pod int 10h SVGA rezolucije, moras da u al segment upises broj koji zavisi od kartice koje imas... Ako se dobro secam to je broj 40F..h(ne secam se :)), ali imas ga u vesa.doc, koji mozes da skines i sa sezama... Kada pokrenes rezoluciju koju zelis moras da odredis page na koji upisujes nesto... Znaci ako je page 0 upisujes u A000h i on ce ti ga ispisivati u prvih 64k ekrana, onda promenis page i ponovo upisujes u narednih 64k... Tako dok ne iscrtas bitmap! Ono ako lepo odradis ne radi sporo... Ja sam uspeo da bitmap(1024x768, 256c) iz video memorije lepim na ekran pri brzini 8 frame/sec... Pozdrav!
asembler.457 dule.n, -> #456, kojai
│ Jedini nacin da pokrenes rezoluciju ti je preko interapta 10h... │ Ima jos jedan nacin, kojim se moze generisati rezolucija ekrana, ali to │ ne znam coveka koji je uradio! :) └─────────────────── Ma nije problem u postavljanju rezolucije tj. video moda. Tu se uradi jedno int 10 i gotovo, nece jedan interapt da koči rad, problem je kad imaš interapt za svaku tačku koju iscrtavaš. │ Princip je sledeci... Posto nemas pod int 10h SVGA rezolucije, moras da │ u al segment upises broj koji zavisi od kartice koje imas... Ako se │ dobro secam to je broj 40F..h(ne secam se :)), ali imas ga u vesa.doc, │ koji mozes da skines i sa sezama... └─────────────────── Mislim da je 4fh, probao sam i to ali izgleda da moja video kartica nije VESA kompatibilna (TSENG ET4000, ISA kartica). U međuvremenu sam iskopao rešenje za 640x480x16 što mi je zadovoljavajuće za potrebe koje imam. U svakom slučaju, hvala ti.
asembler.458 kojai,
Imam problem oko inicijalizacije DMA... Naime nikako ne uspevam kako valja da napisem sve, tako da wave koji pustam nije wave nego neka brljotina! Trebaju mi rutine za pustanje vise wavova, ekvilajzere, povecanje i smanjenj: amplitude, distorzije, cutoff(sa skidanjem visokih)... Postojao je nekada fajl u kome se nalazilo sve ovo, ja ga nemam :((, a ako ga neko ima molim ga da posalje, ili ako neko zna kako ovo da resim neka napise nesto! Pozdrav!
asembler.459 jujo, -> #458, kojai
# Imam problem oko inicijalizacije DMA... # Naime nikako ne uspevam kako valja da napisem sve, tako da wave koji # pustam nije wave nego neka brljotina! # Trebaju mi rutine za pustanje vise wavova, ekvilajzere, povecanje i # smanjenj: amplitude, distorzije, cutoff(sa skidanjem visokih)... # # Postojao je nekada fajl u kome se nalazilo sve ovo, ja ga nemam :((, a # ako ga neko ima molim ga da posalje, ili ako neko zna kako ovo da resim # neka napise nesto! # # # Pozdrav! Hmmm...pa imas to vec gotovo i lepo zapakovano u npr. MiKMOD-u ili MIDAS-u. U stvari za koju te platformu interesuje rutina.... yooyo:
asembler.460 kojai, -> #459, jujo
Nema problema saznao sam kako da resim moje muke... Resio sam to u Direct Soundu pod NT-om! Mogu da pustam vise wavova itd...
asembler.461 jjerry,
Da li neko ima (ili mozhda zna Web na kome postoji) opis VESA funkcija ? (prelazhenje u 640x480+ modove,crtanje piksela,palete itd.) 10x
asembler.462 dalek,
Da li neko ima masm ili tasm. Ako ima nek mi posalje hvala
asembler.463 jujo, -> #461, jjerry
# Da li neko ima (ili mozhda zna Web na kome postoji) opis VESA # funkcija ? (prelazhenje u 640x480+ modove,crtanje piksela,palete # itd.) # # 10x Imam sors ali u C (Watcom...). Javi ako ti mozda moze koristiti... yooyo:
asembler.464 jujo, -> #461, jjerry
# Da li neko ima (ili mozhda zna Web na kome postoji) opis VESA # funkcija ? (prelazhenje u 640x480+ modove,crtanje piksela,palete # itd.) # # 10x Imam sors ali u C (Watcom...). Javi ako ti mozda moze koristiti... yooyo:
asembler.465 jjerry, -> #464, jujo
Kako ne..poshalji samo :)
asembler.466 jjerry,
Kako da u asembleru ,odnosno bolje u asemblerskom bloku u okviru paskala operishem sa fixed-point promenljivama,npr. tipa single ?
asembler.467 jjerry,
Opet trazhim info o VESA modovima. Najpozheljnije bi bilo u asembleru ali u principu mozhe bilo shta sem bejzika.:)
asembler.468 jujo, -> #467, jjerry
# Opet trazhim info o VESA modovima. Najpozheljnije bi bilo u # asembleru ali u principu mozhe bilo shta sem bejzika.:) Pa u nekom konfu sam poslao vgadoc4b.zip. Potrazi ga.. yooyo:
asembler.469 jujo, -> #466, jjerry
# Kako da u asembleru ,odnosno bolje u asemblerskom bloku u okviru # paskala operishem sa fixed-point promenljivama,npr. tipa single ? # Evo ti u C-u. Naravno Watcom, 32bit.. Sabiranje, oduzimanje i poredjenje je isto kao i sa int-ovima (32bit). #define FIXP long FIXP FIXPmul(FIXP a, FIXP b); #pragma aux FIXPmul="imul edx ",\ "shrd eax,edx,16 ",\ parm caller [eax] [edx] value [eax]; FIXP FIXPdiv(FIXP a, FIXP b); #pragma aux FIXPdiv="xor eax, eax" \ "shrd eax, edx, 16" \ "sar edx, 16" \ "idiv ebx" \ parm caller [edx] [ebx] \ value [eax] \ modify [eax ebx edx]; #define DBL2FIXP(__a) ((__a)*65536) #define FIXP2DBL(__a) ((__a)/65536.0) #define INT2FIXP(__a) ((__a)<<16) #define FIXP2INT(__a) ((__a)>>16) yooyo:
asembler.470 jjerry,
Da li mozhe neko od iskusnijih programera da me uputi malo u oblasti vezane za protected mode ,odnosno zashticeni rezhim. Odnosno,konkretnije,kako procesor dolazi u stanje zashticenog rezhima ili to nije neophodno posebno raditi? Dalje,shta sve omogucava zashticeni rezhim u odnosu na obichan,tj. real mode ? Da li je,i zashto potrebno vrshiti real-mode interaptove i,uopshte,kakva je razlika izmedju real-mode i protected mode interaptova ? Kako se pristupa vishem wordu extended registara (mislim na E+ax,bx itd.) ? Ok,to bi bilo to :) pa ako nekog suvishe ne mrzi,10x svakome ko se potrudi da odgovori na i jedno od ovih pitanja :) Pozdrav..
asembler.471 kojai, -> #470, jjerry
>> Da li mozhe neko od iskusnijih programera da me uputi malo u >> oblasti vezane za protected mode ,odnosno zashticeni rezhim. Prelazi se sa dva reda programa... Inicijalizuje ga 20 redova(sto je platforma)! A ostalo je zajebano... Izuzetno! :(
asembler.472 jjerry,
Kako da funkcijom 9 dosovog interapta ispishem neki string nepoznate duzhine,koji se npr. zavrshavam nulom ,odnosno,kako da mu "stavim" '$' na kraj ? :)
asembler.473 jujo, -> #470, jjerry
# Da li mozhe neko od iskusnijih programera da me uputi malo u # oblasti vezane za protected mode ,odnosno zashticeni rezhim. # Odnosno,konkretnije,kako procesor dolazi u stanje zashticenog # rezhima ili to nije neophodno posebno raditi? Evo ti jedan pmode extender. U stvari to je source koji se koristi sa tvojom rutinom, a ima zadatak da prebaci masinu u protected mode, a zatim poziva tvoj kod. Tvorci su Dardevil i Tran, koji su jos poznati po 9kb pmode extenderu koji menja DOS4GW u Watcom programima. U arhivi imas i par primera koji ilustruju kako se koristi ovo cudo. A i sam sors koji prebacuje masinu u p-mode je DOBRO komentarisan. ----- # Dalje,shta sve omogucava zashticeni rezhim u odnosu na obichan,tj. # real mode ? Pa najglavije je to da nemas vise ogranicenja od 64Kb po segmentu, mapiranje memorije, virtuelna memorija.... # Da li je,i zashto potrebno vrshiti real-mode # interaptove i,uopshte,kakva je razlika izmedju real-mode i # protected mode interaptova ? Real mode interapti koji npr. primaju neki registarski par (ES:BX) kao pointer na neki bafer misle da se taj bafer nalazi u prvom megabajto RAM-a. E kad pises programe u PMODE-u u 99% slucajeva ti baferi se nalaze na adresama koje su preko 1Mb. Kad se zeznes pa posaljes pointer na tu adresu u realmode int, masina se obesi. Da bi se ovo izbeglo, koristi se DMPI poziv da se simulira REALMODE interapt i onda je sve OK. Prilikom simulacije RM interapta, masina se ZAISTA vraca u RM, ali samo na kratko. Primeri ovih interapta su 10h, 13h, 21h... Pmode interapti nemaju ovih problema. # Kako se pristupa vishem wordu extended registara # (mislim na E+ax,bx itd.) ? Hmmm, nikako diraktno. Mozda sa siftovanjem ili sa nekom instrukcijom koja swapuje sadrzaj 2Worda u jednom EXtended registru. # Ok,to bi bilo to :) pa ako nekog suvishe ne mrzi,10x svakome ko se # potrudi da odgovori na i jedno od ovih pitanja :) Nije me mrzelo... yooyo: pmode251.zip
asembler.474 jjerry, -> #473, jujo
Shto se onih real interptova tiche,video sam jedan primer gde se koristi funkcija 300h interapta 31h,navodno DPMI interapta,koja se poziva sa brojem real int-a u ax-u. Mozhe tako ? :) I btw. 10x za ovo :)
asembler.475 jjerry, -> #472, jjerry
Ok je ono..reshen problem..ispisujem znak po znak sve dok na ofsetu [dx+n] ne nadjem nulu..
asembler.476 stameni, -> #475, jjerry
>> Ok je ono..reshen problem..ispisujem znak po znak sve dok na ofsetu >> [dx+n] ne nadjem nulu.. Nije mi jasno zašto ti je string terminisan nulom? Možda program u ASM-u povezuješ sa C-om? Ako si u prilici da koristiš funkciju 9 interrupta 21h, zašto to izbegavaš? Umesto 0 tamo je '$', kao što znaš... Izvini na ovim pitanjima, trudim se da pomognem koliko mogu.
asembler.477 jjerry, -> #476, stameni
Pa zato shto recimo kada pozovesh funkciju 4F00h interapta 10h odnosno vracanje podataka o VESA rezhimu,u baferu koji se napuni na ES:DI,na nekom ofsetu postoji i doubleword koji predstavlja far pointer na OEM string (npr. "Matrox Mystique VBE/MGa" itd.) a taj string kao i svi stringovi u tom baferu su terminisani nulom. Inache,kao shto rekoh,uspeo sam to.. P.S Nisam bre valjda toliko blesav pa da se muchim kad vec mogu lako :) Pozdrav :)
asembler.478 stameni, -> #477, jjerry
>> Pa zato shto recimo kada pozovesh funkciju 4F00h interapta 10h >> odnosno vracanje podataka o VESA rezhimu,u baferu koji se napuni na >> ES:DI,na nekom ofsetu postoji i doubleword koji predstavlja far >> pointer na OEM string (npr. "Matrox Mystique VBE/MGa" itd.) a taj >> string kao i svi stringovi u tom baferu su terminisani nulom. Mada si problem rešio petljom (ako se ne varam), evo sekvence koja to radi (mada je opet petlja u pitanju, zbog prefiksa rep): ; mov ax, sgm ; mov es, ax ; mov di, ofs mov cx, max_len xor al, al cld repne scasb jne not_found dec di mov al, '$' mov [es:di], al Ovo je spremno za štampanje preko 21h.
asembler.480 pesnik,
Ima li neko dokumentaciju za CD-ROM kao device. Int, regs, itd. Hvala. pozdrav
asembler.481 jujo, -> #480, pesnik
# Ima li neko dokumentaciju za CD-ROM kao device. Int, regs, itd. # Hvala. # # pozdrav Imam dokumentaciju o mscdex-u, pa ako moze da koristi.... Ako negde naletis na dokumentaaciju u kojo je CD-u direktno pristupa bio bih ti zahvalan... yooyo: mscdex.zip
asembler.482 pesnik, -> #481, jujo
>> Ako negde naletis na dokumentaaciju u kojo je CD-u direktno >> pristupa bio bih ti zahvalan... Svrljao sam po sinternetu, medjutim verovatno nisam dobro trazio. Ako nesto nadjem, saljem. pozdrav
asembler.483 jjerry,
Potrebna mi je pomoc u vezi jedne funkcije koja obavlja isto shto i shl/shr n (odnosno mnozi/deli sa 2^n) ali sa fixed point tipom. Funkciju pokushavam da uradim uz pomoc FPU instrukcija. Inache,kad hocu u okviru paskala da ispishem vrednost koju funkcija vraca,stalno se ispisuje 'NAN'.Shta ovo NAN znachi ?
asembler.484 jjerry, -> #483, jjerry
Gluposti...Evo su funkcije koje za realan broj a i integer B vracaju a*2^b ili a/2^b : asm fild b fld a fscale fstp a end; ,s tim shto bi funkcija za shiftovanje desno imala josh jedno 'fchs' izmedju 'fild b' i 'fld a'.
asembler.485 obren, -> #483, jjerry
> Inache,kad hocu u okviru paskala da ispishem vrednost koju funkcija > vraca,stalno se ispisuje 'NAN'.Shta ovo NAN znachi ? Vidim da si problem rešio, a NAN znači "Not A Number". Jednostavno, kombinacija bitova ne predstavlja ni jedan smislen broj u pokretnom zarezu.
asembler.486 jjerry, -> #485, obren
Aha...Da,to ima smisla. Btw. da li znash shta uophte rade instrukcije fincstp/fdecstp. Po dokumentaciji,one uvecavaju/smanjuju stack pointer za 1. Ali zashto su onda one potrebne,jer chim se neshto baci na FPU stack,npr. ST(0),sledeca vrednost ce ici automatski u ST(1),pa u ST(2) itd. ? Pozdrav..
asembler.487 stameni,
Sourcerom sam dobio program koji ne prolazi asembliranje. Greška je u redu koji glasi: PSP_cmd_tail+1 equ 82h kao i u redovima koji zavise od ove promenljive. Kako prevazići problem?
asembler.488 jujo, -> #487, stameni
# Sourcerom sam dobio program koji ne prolazi asembliranje. # Greska je u redu koji glasi: # PSP_cmd_tail+1 equ 82h # kao i u redovima koji zavise od ove promenljive. # Kako prevazici problem? PSP_cmd_tail+1 equ 82h | Pa nemoze + ovde.... yooyo:
asembler.489 sabre,
(send assembler..... Ne postoji tema assembler.) Imam sledeci problem... Nemam nikakve dokumentacije o grafickim karticama pa ne znam kako da resim sledeci problem! Otvorio sam dva virtuelna ekrana u memoriji i sada pokusavam da skrolujem... E sada kada u taj drugi ekran koji se ne vidi pisem(crtam deo slike koji treba da se vidi) i kada hocu da ga prikazem, tj da prikazem nastavak te slike, znaci drugi ekran, mnogo sporo mi radi posto radi pomocu 10h interapta... Bukvalno mi za 320x200 secka... Sta da radim, odnosno kako to da sredim da ne ide preko interapta... Inace ako neko ima uputstva o bilo kakvim kartama neka salje, ali mi ne treba ono primer: INT 10h AH=204h nego celokupna dokumentacija o kartici! Btw. Svaka cast DirectX-u! :)
asembler.490 stameni, -> #488, jujo
>> # Sourcerom sam dobio program koji ne prolazi asembliranje. >> PSP_cmd_tail+1 equ 82h >> | >> Pa nemoze + ovde.... Znam. Ipak mi je Sourcer (ne onaj kačen ovde) to napravio, pa me to malo čudi :(
asembler.491 stameni, -> #489, sabre
>> E sada kada u taj drugi ekran >> koji se ne vidi pisem(crtam deo slike koji treba da se vidi) i kada hocu >> da ga prikazem, tj da prikazem nastavak te slike, znaci drugi ekran, >> mnogo sporo mi radi posto radi pomocu 10h interapta... Bukvalno mi za >> 320x200 secka... Sta da radim, odnosno kako to da sredim da ne ide preko >> interapta... Prvo moraš da napišeš brzu rutinu za crtanje tačke, gađanjem video memorije (bez BIOS-a, jer je tako, kao što si i sam video, sporo). Za mod 13h i rezoluciju 320x200x256 video memorija počinje na A000h. Svakom pikselu odgovara jedan bajt. Prvi bajt (na ofsetu 0000h) je (mislim) u levom gornjem uglu ekrana, drugi bajt ispod njega, treći ispod i tako sve do 200. Zatim moraš da smisliš brz način za prebacivanje slike u video RAM (tj. na ofset A000h). Mislim da je to najbrže preko DMA (nisam najsigurniji; ovde će se već naći neko ko zna). Ako ti se ne programira DMA, pogledaj naredbe MOVSB/MOVSW/MOVSD i REP prefiks. Probaj da premestiš samo one delove slike koji su promenjeni, mislim da stvar može da se ubrza. Dokumentacija su VGADOC (ima ovde) i spisak instrukcija procesora, kao i razni helpovi.
asembler.492 sabre, -> #491, stameni
>> Prvo moras da napises brzu rutinu za crtanje tacke, gadanjem >> video memorije (bez BIOS-a, jer je tako, kao sto si i sam video, >> sporo). Za mod 13h i rezoluciju 320x200x256 video memorija pocinje >> na A000h. Svakom pikselu odgovara jedan bajt. Prvi bajt (na >> ofsetu 0000h) je (mislim) u levom gornjem uglu ekrana, drugi bajt >> ispod njega, treci ispod i tako sve do 200. Da da znam ja to vrlo dobro i to ne radim preko 10h interapta... Ja ne upisujem na poziciju A000h(posto ne radim u 320x200) vec upisem u neki deo memorije i onda ga ispageujem i iscrtam... To nije problem. Mogu da prikazujem 800x600x256 brzinom 20+ ekrana, to nije problem... Ali zanima me kako kartici da kazem da hocu da mi drugi virtualni ekran lepi preko postojeceg! Necu da radim stalno iscrtavanje zato sto dolazi do blinkanja, a "prelepljivanje" radi izuzetno tecno... To sam video pod DirectX-om kolika je razlika kad se icrtava(mada je tamo 1024x768 oko 70 frejmova :)) i uspori i kada se skroluje...
asembler.493 jujo, -> #492, sabre
# Da da znam ja to vrlo dobro i to ne radim preko 10h interapta... Ja ne # upisujem na poziciju A000h(posto ne radim u 320x200) vec upisem u neki # deo memorije i onda ga ispageujem i iscrtam... To nije problem. Mogu da # prikazujem 800x600x256 brzinom 20+ ekrana, to nije problem... Ali zanima # me kako kartici da kazem da hocu da mi drugi virtualni ekran lepi preko # postojeceg! Necu da radim stalno iscrtavanje zato sto dolazi do # blinkanja, a "prelepljivanje" radi izuzetno tecno... To sam video pod # DirectX-om kolika je razlika kad se icrtava(mada je tamo 1024x768 oko 70 # frejmova :)) i uspori i kada se skroluje... U standardnom VGA modu nemoze nikako. Mod 10h "vidi" samo prvih 64kb memorije video kartice. Mode X vec moze. Sto se VESE tice, postoje lepo dokumentovane pozive BIOS-a kako da swichujesh ekrane. Za to ti treba kao prvo VESA2 BIOS, a ekrane swichujesh pomeranjem adrese pocetka video memorije. To zaista brzo radi ali ima jedan problem. Ta memorija se nalazi na kartici i procesor nije u stanju da je keshira, tako da je direktno crtanje po video memoriji sporije od crtanja po ostatku memorije. yooyo:
asembler.494 stameni, -> #492, sabre
Tek sad videh da si tražio DirectX - o tome znam jako malo jer nisam u prilici da se time detaljnije pozabavim :( Izvinjotina na pokušaju.
asembler.495 sabre, -> #493, jujo
>> Sto se VESE tice, postoje lepo dokumentovane pozive BIOS-a kako da >> swichujesh ekrane. Za to ti treba kao prvo VESA2 BIOS, a ekrane >> swichujesh pomeranjem adrese pocetka video memorije. To zaista >> brzo radi ali ima jedan problem. Ta memorija se nalazi na kartici >> i procesor nije u stanju da je keshira, tako da je direktno crtanje >> po video memoriji sporije od crtanja po ostatku memorije. Ha... Sta da ti kazem daj mi dokumentaciju! :)
asembler.496 jujo, -> #495, sabre
# Ha... Sta da ti kazem daj mi dokumentaciju! :) Ha... pa nadji negde VGADOC4b.zip. Ostavio sam ga u nekoj konfi... yooyo:
asembler.497 stameni,
Koje dokumente o programiranju u zaštićenom modu preporučujete? Ima li toga na Sezamu? Možda ima na nekoj ftp adresi? Heeeelp!
asembler.498 sqweaky,
Da li 386+ procesori mogu da pristupe 32-bitnim registrima (npr. EAX) kada su u realnom režimu ili moraju da pređe u protected mod? Takođe, da li mogu da koristim instrukcije koje operišu sa 32-bitnim podacima (lodsd, stods) u realnom modu? Miloš
asembler.499 jjerry, -> #498, sqweaky
>>Da li 386+ procesori mogu da pristupe 32-bitnim registrima (npr. >>EAX) kada su u realnom rezimu ili moraju da prede u protected mod? >>Takode, da li mogu da koristim instrukcije koje operisu sa >>32-bitnim podacima (lodsd, stods) u realnom modu? Naravno da mogu,sve shto ti treba je .386/P386N stavka ili (neobavezno) USE32 posle deklaracije segmenta i IDEAL modu. Pa ti mozhesh da napravish prog. u obichnom TASM-u,bez extendera , dakle u RM,chisto testa radi,koji koristi E(AX,BX...).
asembler.500 jjerry,
Potrebna mi je brza SQRT funkcija radjena u asembleru,ne narochito hitno.Samo da ima shto manje mul/div operacija,a preciznost od 4 decimale je sasvim dovoljna...Inache,kao parametre prima fixed point brojeve (32 bita,gornjih 16 integer,donjih 16 fraction). Pozdrav..
asembler.501 stameni, -> #500, jjerry
>> Potrebna mi je brza SQRT funkcija radjena u asembleru, Izbistri koprocesorsku funkciju FSQRT.
asembler.502 jjerry, -> #501, stameni
Znam ja koprocesorske funkcije od ranije ,i ova ima i pristojan broj ciklusa,za sqrt rutinu,od 70 do neshto preko 100,koliko se secam; ali sam mislio da l' mozhe neshto da se uradi bez koprocesora...Inache,u shkoli sam uchio kao jednu od mogucnosti tzv. Njutnovu iterativnu metodu,ali ona u svakom ciklusu ima bar jedan realni DIV... P.S Ustvari i nema preterane potrebe za brzinom,poshto sam hteo to da ubacim u rutinu za normalizaciju normal-vektora,vishe me je zaintrigiralo ovako...
asembler.503 ventura,
Jel ima neko programce (ili moze da napravi) koje bi promenilo seriski broj hard diska u MBR-u? -Na kojoj se adresi nalazi seriski broj hard diska?
asembler.504 jjerry,
Kako se u asembleru adresiraju matrice,tj. 2D nizovi ? Mozhda bi neko mogao da mi poshalje primer korishcenja matrica u asembleru..
asembler.505 stameni, -> #502, jjerry
Našao sam nekoliko rutina za računanje kvadratnog korena među onim snippetsima za asembler. Ako ti je još to potrebno, reci da ti šaljem na mail, jer mislim da nije baš u redu slati deo arhive u conf.
asembler.506 jjerry, -> #505, stameni
>> Nasao sam nekoliko rutina za racunanje kvadratnog korena >>medu onim snippetsima za asembler. Ako ti je jos to potrebno, Naravno,sve dok operishu sa fixed-point brojevim (16 bit integer,16 bit fraction)... 10X a bundle.. J.J
asembler.507 dzakic, -> #504, jjerry
> Kako se u asembleru adresiraju matrice,tj. 2D nizovi ? Mozhda bi neko > mogao da mi poshalje primer korishcenja matrica u asembleru.. Struktura 'matrica' ne postoji u asembleru. Ukoliko znaš da radiš sa običnim 1D-nizovima, onda napravi niz dužine 0..MAXX*MAXY-1, i pristupaj elementu sa Element[i,j]:=Niz[i*MAXX+j], gde je i iz intervala [0..MAXY-1], a j [0..MAXX-1]. Za ovo je potrebno malo snalaženja sa registrima da se izračuna offset elementa unutar niza (ADD i MUL), ali je izvodljivo.
asembler.508 stameni, -> #507, dzakic
>> Struktura 'matrica' ne postoji u asembleru. Ukoliko znaš da radiš sa >> običnim 1D-nizovima, onda napravi niz dužine 0..MAXX*MAXY-1, i >> pristupaj elementu sa Element[i,j]:=Niz[i*MAXX+j], gde je i iz intervala >> [0..MAXY-1], a j [0..MAXX-1]. U stvari, formula je Element[i, j] := Niz[i, j * MAXX]. Petljavina sa registrima ide otprilike ovako: ----<cut>---- max_x equ 4 ; matrica je [0..max_x-1, 0..max_y-1] x equ 2 ; element je na [x, y] y equ 3 mov al, y ; al := y mov bh, max_x ; u bh ide maksimalna vrednost za x mul bh ; ax := al * bh add ax, x ; ax := ax + x mov bx, offset matrica add bx, ax ; ovde bx pokazuje na bajt u matrici ; na koordinatama (x, y) mov ah, [bx] ; i to se ovde čita matrica: db ... ----<cut>----
asembler.509 dzakic, -> #508, stameni
> U stvari, formula je Element[i, j] := Niz[i, j * MAXX]. Tebi se očigledno više sviđa Fortran-stil skladištenja matrice. Naravno, potpuno je svejedno kako matricu čuvamo u memoriji dokle god program sa njom ispravno radi.
asembler.510 stameni, -> #509, dzakic
>> > U stvari, formula je Element[i, j] := Niz[i, j * MAXX]. >> ^ >> Tebi se očigledno više sviđa Fortran-stil skladištenja matrice. Zapravo, pogrešio sam u kucanju. Naime, na označenom mestu umesto ',' treba da stoji '+'. Međutim, kad bolje razmislim, vidim da sam te pogrešno kritikovao; ti tvrdiš Niz[i * MAXX + j], a ja, uz ovu ispravku, Niz[i + j * MAXX]. Svejedno je, s tim što je moja ideja imala sintaksnu grešku ;) Ipak, onaj kod koji sam poslao -- radi.
asembler.511 stameni,
Kako detektovati da li je računar u turbo režimu ili ne? Kako uključiti, a kako isključiti turbo?
asembler.512 jjerry, -> #511, stameni
Necu ti bash odgovoriti na pitanje ,al' 'ajde.. Lm,noviji kompjuteri su automatski u tzv. turbo rezhimu,tako da,tehnichki,ne postoji turbo i obichan rezhim. Ako taj princip nije do sada kod svih proizvodjacha napushten,sigurno ce se napustiti vrlo brzo,pa se postavlja pitanje ima li svrhe raditi bilo shta sa tim. Pozdrav..
asembler.513 milosavljevic,
Hi! Treba mi Turbo Assembler. Goran.
asembler.514 pesnik,
Ljudi, jel ima neko MS MASM compiler arhivu? Bio bi zahvalan ako bi to neko odnekud iscupao. pozdrav, pesnik
asembler.516 vule.,
Kako da postavim text mod od 50 linija ili malo nizi ?