asembler.413mdimitrijevic,
-> #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.414jjerry,
-> #413, mdimitrijevic10x
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.415jolicm,
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.416mdimitrijevic,
-> #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.417stameni,
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.419mdimitrijevic,
-> #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.420zdravkod,
Kako da procitam vrednost iz BS:BX?
Zdravko
asembler.421zdravkod,
-> #420, zdravkodDS:BX Greska, izvinjavam se.
asembler.422stameni,
-> #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.423zdravkod,
-> #422, stameniKoliko ja razumem u DS:BX se nalazi dword, valjda doubleword,
odnosno 32bit vrednost.
Zdravko
asembler.424stameni,
-> #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.425stameni,
-> #424, stameni Ovo ' D' je oznaka da je u pitanju dekadni, a ne heksadekadni
sistem!
asembler.426zdravkod,
-> #424, stameniKad otkucam to i pokusam da kompajliram (inace pisem u pascalu u
asm odeljku) kaze mi "Unknown identifier za EAX.
Zdravko
asembler.427stameni,
-> #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.428zdravkod,
-> #427, stameniBojim 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.pasasembler.429stameni,
-> #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.430ksanyi,
Hi!
Dali neko ima funkciju za računanje tangensa hiperboličkog?
Unapred hvala!
asembler.431zdravkod,
Kako da skocim na neku odredenu adresu u memoriji. Konkretno treba
da skocim na FFFF:0000.
Zdravko
asembler.432jjerry,
-> #431, zdravkodShta 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.433zdravkod,
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.434mdimitrijevic,
-> #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.435zdravkod,
-> #434, mdimitrijevicPa 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.436mdimitrijevic,
-> #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.437zdravkod,
-> #436, mdimitrijevicPa, 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.438mdimitrijevic,
-> #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.439zdravkod,
-> #438, mdimitrijevicDa, 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.440mdimitrijevic,
-> #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.441mdimitrijevic,
-> #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.zipasembler.442stameni,
-> #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.443mdimitrijevic,
-> #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.zipasembler.444stameni,
-> #443, mdimitrijevic>> Može da se sazna, a može i da se dobije :))
Hvala :) Deda Mraz ima iste inicijale kao ti :)
asembler.445mdimitrijevic,
-> #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.446zdravkod,
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.447jujo,
-> #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.448zdravkod,
-> #447, jujoNisam 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.449jujo,
-> #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.450pvlada,
Da li neko može da mi napiše algoritam za generisanje slucajnog (random)
broja ?
Pozdrav Vlada
asembler.451obren,
-> #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.452speedy,
-> #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.454sqweaky,
Uz poruku je FAQ o asembleru (tasm, masm... ).
asmfaq.zipasembler.455dule.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.456kojai,
-> #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.457dule.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.458kojai,
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.459jujo,
-> #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.460kojai,
-> #459, jujoNema problema saznao sam kako da resim moje muke...
Resio sam to u Direct Soundu pod NT-om!
Mogu da pustam vise wavova itd...
asembler.461jjerry,
Da li neko ima (ili mozhda zna Web na kome postoji) opis VESA
funkcija ? (prelazhenje u 640x480+ modove,crtanje piksela,palete
itd.)
10x
asembler.462dalek,
Da li neko ima masm ili tasm. Ako ima nek mi posalje
hvala
asembler.463jujo,
-> #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.464jujo,
-> #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.465jjerry,
-> #464, jujo Kako ne..poshalji samo :)
asembler.466jjerry,
Kako da u asembleru ,odnosno bolje u asemblerskom bloku u okviru
paskala operishem sa fixed-point promenljivama,npr. tipa single ?
asembler.467jjerry,
Opet trazhim info o VESA modovima. Najpozheljnije bi bilo u
asembleru ali u principu mozhe bilo shta sem bejzika.:)
asembler.468jujo,
-> #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.469jujo,
-> #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.470jjerry,
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.471kojai,
-> #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.472jjerry,
Kako da funkcijom 9 dosovog interapta ispishem neki string
nepoznate duzhine,koji se npr. zavrshavam nulom ,odnosno,kako da mu
"stavim" '$' na kraj ? :)
asembler.473jujo,
-> #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.zipasembler.474jjerry,
-> #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.475jjerry,
-> #472, jjerryOk je ono..reshen problem..ispisujem znak po znak sve dok na ofsetu
[dx+n] ne nadjem nulu..
asembler.476stameni,
-> #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.477jjerry,
-> #476, stameniPa 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.478stameni,
-> #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.480pesnik,
Ima li neko dokumentaciju za CD-ROM kao device. Int, regs, itd.
Hvala.
pozdrav
asembler.481jujo,
-> #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.zipasembler.482pesnik,
-> #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.483jjerry,
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.484jjerry,
-> #483, jjerryGluposti...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.485obren,
-> #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.486jjerry,
-> #485, obrenAha...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.487stameni,
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.488jujo,
-> #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.489sabre,
(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.490stameni,
-> #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.491stameni,
-> #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.492sabre,
-> #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.493jujo,
-> #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.494stameni,
-> #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.495sabre,
-> #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.496jujo,
-> #495, sabre# Ha... Sta da ti kazem daj mi dokumentaciju! :)
Ha... pa nadji negde VGADOC4b.zip. Ostavio sam ga u nekoj konfi...
yooyo:
asembler.497stameni,
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.498sqweaky,
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.499jjerry,
-> #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.500jjerry,
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.501stameni,
-> #500, jjerry>> Potrebna mi je brza SQRT funkcija radjena u asembleru,
Izbistri koprocesorsku funkciju FSQRT.
asembler.502jjerry,
-> #501, stameniZnam 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.503ventura,
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.504jjerry,
Kako se u asembleru adresiraju matrice,tj. 2D nizovi ? Mozhda bi
neko mogao da mi poshalje primer korishcenja matrica u asembleru..
asembler.505stameni,
-> #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.506jjerry,
-> #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.507dzakic,
-> #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.508stameni,
-> #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.509dzakic,
-> #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.510stameni,
-> #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.511stameni,
Kako detektovati da li je računar u turbo režimu ili ne?
Kako uključiti, a kako isključiti turbo?
asembler.512jjerry,
-> #511, stameniNecu 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.513milosavljevic,
Hi!
Treba mi Turbo Assembler.
Goran.
asembler.514pesnik,
Ljudi,
jel ima neko MS MASM compiler arhivu?
Bio bi zahvalan ako bi to neko odnekud iscupao.
pozdrav,
pesnik
asembler.516vule.,
Kako da postavim text mod od 50 linija ili malo nizi ?