pascal.618vvelisavljev,
-> #613, markom> Ako je iz TPW6, onda me ne čudi, jerbo je to PUNO bagova,
> ali direktno gađanje video memorije je osnova 60% mojih
> programa pisanih u TP 6 !! Ako to ne radi u sedmici,
> ostadoh ja na 6 :))
To ne radi jedino ako u BP kompajliraš u protected modu. Ako radiš sa
turbo ili ako u BP staviš Real sve će raditi isto kao i u TP 6.0.
pascal.619peca.st,
-> #615, ilazarevic!->> Daklem, procita ga Ok, ali kad mu kazem writeln(linija.str2)
!->
!-> Ovo ne može da radi zato što je fajl sastavljen od rekorda. Dakle,
!-> ti možeš da upišeš samo jedan ceo rekord, čijim elementima
!-> dodeljuješ vrednosti. Da je tekst fajl, moglo bi.
Il, nisi dobro video šta je napisao čovek. :)
Piše: writeln(linija.str2), dakle, nije u fajl, nego na ekran.
Peđa.
pascal.620markom,
-> #618, vvelisavljev■■■ To ne radi jedino ako u BP kompajliraš u protected modu. Ako
■■■ radiš sa turbo ili ako u BP staviš Real sve će raditi isto
■■■ kao i u TP 6.0.
Pa mene baš zanima da li mogu direktno da pucam u VM u protected modu, ako ne
može, je*em ti taj program koji prozore crta sa WriteLn ;)
Marko
pascal.621kriss,
-> #617, paki˙˙ Da nije zbog toga što CRT ima i inicijalizaciju?
Misliš jedno Begin End. kao 'startujući deo'?
pascal.622peca.st,
-> #621, kriss!-> Misliš jedno Begin End. kao 'startujući deo'?
I nešto između tog Begin End. :)
To sam ti rekao u klubu, i mislim da je to u pitanju.
A šta tu radi - pojma nemam, verovatno nešto bitno, čim je tu. :)
Peđa.
pascal.623jovca.car,
-> #602, markom/* Reci mi iskreno, da li si IKADA vide savrsen program?
Windows 3.1? ;))))))))
pascal.624markom,
-> #623, jovca.car■■■ Windows 3.1? ;))))))))
HAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHA, reče on ;>
Marko
pascal.625mzdravkovic,
Pisem jedno programce u Pascalu, ali zbog nedovoljnog znanja, potrebna
mi je pomoc. Kako da program bude rezidentan u memoriji i da se stalno
izvrsava ?
HVALA !
pascal.626andrejt,
-> #625, mzdravkovic===> Pisem jedno programce u Pascalu, ali zbog nedovoljnog znanja, potrebna
===>mi je pomoc. Kako da program bude rezidentan u memoriji i da se stalno
===>izvrsava ?
U memoriju ga ostavljas sa Keep.Rezidentni programi se izvrsavaju
tako sto se promeni vektorska tabela prekida,koja sadrzi adrese
procedura koje se izvrsavaju posle odredjenog prekida.
Recimo imas neku proceduru u tom tsru koja se zove
proc_1 i hoces da se ona izvrsava na int9(tastatura)
onda uradis :
Getintvec(9,@StaraProcedura); {Gde je StaraProcedura : Procedure}
Setintvec(9,@proc_1);{procedura koja se izvrsava na int9}
Keep(0);
Takodje je pametno posle izvrsenja proc_1 pustiti i StaraProcedura.
pascal.627markom,
-> #625, mzdravkovic■■■ Pisem jedno programce u Pascalu, ali zbog nedovoljnog znanja,
■■■ potrebna mi je pomoc. Kako da program bude rezidentan u
■■■ memoriji i da se stalno izvrsava ?
Koliko ja znam, sa KEEP ga napraviš rezidentnim, a to da se stalno izvršava mo-
žeš da postigneš tako što ćeš da napraviš jednu interapt proceduru koja će da
se izvršava recimo na svakom petom otkucaju sistemskog sata. Kako ovo uraditi
i ne znam baš najbolje ...
Marko
pascal.628dr.grba,
-> #623, jovca.car>> /* Reci mi iskreno, da li si IKADA vide savrsen program?
>>
>> Windows 3.1? ;))))))))
...
Trgom se prolomi uzvik.
"Tako je", povikaše seljaci, "ja i narod ćemo vikati!"
...
(;║■
pascal.629isekulovic,
Da li postoje neki neželjeni efekti ukoliko se umesto:
st:=copy(st,1,x);
uradi:
st[0]:=x;
ivan
ps
var st : string;
pascal.630andrejt,
-> #627, markomEvo tebe da dopunim to se radi (valjda) sa INT 8.
(Mada postoje i neke funkcije za sat koje prate
ta otkucavanja ali ovako je najlakse)
pascal.631andrejt,
-> #629, isekulovic===>Da li postoje neki nezeljeni efekti ukoliko se umesto:
===>st:=copy(st,1,x);
===>uradi:
===>st[0]:=x;
Za copy bas i ne znam ali st[0]:=x; sigurno nista nece da
uradi zato sto(valjda) charovi u stringu idu od 1 do 255.
P.S.
Ali cini mi se da ti i ono st:=copy(st,1,x); nece raditi
(valjda nije ta sintaksa) pa posto verovatno oba ne rade
nista korisno nezeljenih efekata nece biti (u odnosu na
st := copy(st,1,x);
pascal.633predragd,
-> #590, niklaus> Preporučujem ti da koristiš QEMM zajedno sa DPMI dodatkom
> za DPMI.
Kako ti je uspelo da nateraš QEMM-ov QDPMI da radi da BP-om.
Meni BP uvek pukne po startovanju i javi cd QDPMI sa nekom
porukom o grešci.
Peđa.
pascal.634predragd,
-> #603, markom> žekaj, stani malo... Kaži mi da ako sa BP 7.x program
> prevedeš u protected modu, i iz njega probaš direktno da
> gađaš video memoriju, ovaj će da pukne ?!?
>
> Ako je to istina onde ću morati da pišem 99% programa iz
> početka :(((
Mislim da nećeš imati toliko posla oko prepravljanja programa.
Već sam to negde napomenuo, potrebno je samo konvertovati segment
adresu u descriptor.
INT 31 P - DPMI 0.9+ - SEGMENT TO DESCRIPTOR
AX = 0002h
BX = real mode segment
Return: CF clear if successful
AX = selector corresponding to real mode segment (64K limit)
CF set on error
AX = error code (DPMI 1.0+) (8011h) (see AX=0000h)
Notes: multiple calls for the same real mode segment return the same selector
the returned descriptor can never be modified or freed
not supported by MS Windows 3.0 in Standard mode
Peđa.
pascal.632predragd,
-> #592, vvelisavljev> DPMI ?? Da li ima negde na Sezamu nešto detaljnije o ovome?
INTER37*.*
> žega bi trebalo da se pridržavam u svom programu?
Da ne pristupaš direktno memoriji (ako baš moraš poželjno bi
bilo da pre toga konvertuješ segment adresu u descriptor, int
31h), da real mode interrupt-e pozivaš funkcijom koju sam nedavno
ostavio u ovoj temi.
Programi pisani u asembleru za real mode će morati pretrpeti
neke izmene. Moguće je da ima još nekih pravila kojih se treba
pridržavati, ali ja bar za sada nisam uspeo da ih pronađem.
> Izgleda da nisam dobro objasnio šta me muči. Nešto mi
> olako BP javlja poruke da nema dovoljno memorije i sl.
> Imam 2 MB RAMa, a moj exe kompajliran u Real modu ima oko
> 130 kB a u protected oko 150 kB. Najbolje mi radi bez
> ikakvih menadžera, čak i bez HIMEMa.
Da bi se uopšte pokrenuo BP zahteva minimum 2 Mb RAM-a, tako
da nije ni malo čudno što se BP buni. U ovakvoj sutuaciji
najbolje je raditi bez ikakvih menadžera i drajvera (ukoliko je
to moguće).
> Kako treba da izgleda $M direktiva za protected mod? U
> real modu mi izgleda ovako : š$M 32768,0,131072ć.
U protected modu se definiše samo veličina steka (max 64Kb).
Ostale dve stavke se ne uzimaju u obzir.
Peđa.
pascal.635markom,
-> #632, predragd■■■ U protected modu se definiše samo veličina steka (max 64Kb).
U TP-u 6.0 ne može svih 64K, već _samo_ 65520 b :)
Marko
pascal.636markom,
-> #634, predragd■■■ Mislim da nećeš imati toliko posla oko prepravljanja
■■■ programa. Već sam to negde napomenuo, potrebno je samo
■■■ konvertovati segment adresu u descriptor.
Na žalost nisam te baš najbolje razumeo, ali ajde :(
Pazi ovo: Definišem promenljivu VM, tipa ARRAY[1..4000] OF BYTE na adresi
$B000:$8000, znači na adresi video memorije. Ako probam da pišem u taj niz, da
li će prijavljivati grešku ?
Marko
pascal.637markom,
-> #629, isekulovic■■■ st[0]:=x;
Ako ti je x integer, byte, ili slično, a to je iz datog primera očigldeno ;),
onda postoje :))
Moraš da napišeš st[0] := Chr(x), jer st[0] je char, a ne broj :)
Marko
pascal.638peca.st,
-> #629, isekulovic!-> Da li postoje neki neželjeni efekti ukoliko se umesto:
Ne bi trebalo, pod uslovom da je x <= Length (st)
Ako je veće, onda se ćeš u ostatku stringa dobiti razno đubre.
Inače, promena dužine stringa preko stŠ0Ć je, po meni, sasvim
legalan put.
Peđa.
pascal.639dzakic,
-> #629, isekulovic> Da li postoje neki neželjeni efekti ukoliko se umesto:
> st:=copy(st,1,x);
> uradi:
> st[0]:=x;
Apsolutno ne! Drugi metod je daleko brži, kraći, meni i pregledniji.
Nedavno sam gledao neke sorseve junita koje je sâm Borland pablikovao
(ne mogu sad da se setim o čemu se radi) i vidim da i oni obilato
koriste trikove tipa:
inc(s[0]);
s[length(s)]:=' '; umesto s:=s+' ';
Drugi način je za početnike, kompajler tu poziva procedure za
konkatenaciju ;) stringova, u code segmentu čuva konstantni string
' ' i brdo nepotrebnih stvari oko sitnice kao što je ova. Prvi način
je daleko kraći, bukvalno se uradi jedan inc na bajt koji čuva
dužinu stringa i na kraj se upiše potreban znak. Ne treba se plašiti
'funkcije' length koja izgleda rogobatno kad se kuca, njom se samo
čita nulti bajt stringa, nije potprogram kao što mora da bude u C-u.
Jedina razlika između ove dve stvari je što ne postoji kontrola
dužine dobijenog stringa. U drugom slučaju se sigurno ne bi desilo
ništa ružno: dodavanje na već pun string ne bi ga izmenilo, dok ako
se ti onim s[0]:=chr(x) zaletiš pa upišeš dužinu veću od dozvoljene
(deklarisane), može da bude svašta. Ukoliko si siguran šta radiš i
naknadno proveravaš dužinu novodovijenog stringa, nema nikakvih
problema.
pascal.640dzakic,
-> #639, dzakic>> st:=copy(st,1,x);
>> st[0]:=x;
Sad nešto gledam. Ovo će da radi samo ako string st treba
skratiti. Ukoliko je x veće od prethodne dužine st, nije
svejedno. Pretpostavljam da ti je jasno zašto.
pascal.641dejanr,
-> #629, isekulovic>> Da li postoje neki neželjeni efekti ukoliko se umesto:
>> st:=copy(st,1,x);
>> uradi:
>> st[0]:=x;
Treba chr(x), inače će da prijavi grešku. Ako se to ne računa,
metod ne da ne pravi štetu, nego izaziva ubrzanje. Koristi ga
i Borland u raznim Toolkit-ima.
Jedino moraš biti oprezan da tako ne "produžiš" string, pošto
će "rep" imati slučajan sadržaj. Za razliku od toga, copy naredba
kontroliše sve što treba.
pascal.642markom,
-> #638, peca.st■■■ Inače, promena dužine stringa preko stŠ0Ć je, po meni, sasvim
■■■ legalan put.
Štaviše, ponekad i neophodan ;)
Marko
pascal.643markom,
-> #639, dzakic■■■ dužinu stringa i na kraj se upiše potreban znak. Ne treba se
■■■ plašiti 'funkcije' length koja izgleda rogobatno kad se kuca,
■■■ njom se samo
Da, ali se Length(s) lepo zameni sa jednim Ord(s[0]), a to je još lepše i kraće
ze kucanje ;)
Marko
pascal.644bulaja,
**** new file ****
R:\IBMPC\PASCAL\*.*
----------------------
tspa3370 zip 107638 Timo Salmi's TPU collection (Turbo Pascal 7.0)
Prof. Timo Salmi's TPU collection of nearly 200 useful Turbo Pascal 7.0
routines for text-mode programs.
pascal.646andrejt,
s[0] := 'A';
Ovo nista ne radi sem sto u s ubaci i neke
dodatne charove.Zasto ?(s je string)
Ja sam mislio da je to zbog toga sto su charovi
od 1-255 ali onda stvarno nista ne bi trebalo da uradi
ili bi izbacio gresku.
pascal.647markom,
-> #646, andrejt■■■ s[0] := 'A';
Ovo postavlja dužinu stringa s na 65 znakova. (ASCII kod 'A' = 65)
Marko
pascal.648pedjak,
-> #629, isekulovic> Da li postoje neki neželjeni efekti ukoliko se umesto:
> st:=copy(st,1,x);
> uradi:
> stŠ0Ć:=x;
Verovatno si mislio stŠ0Ć:=chr(x). Ekvivalentna stvar onom
copy(st,1,x), samo brža.
pascal.649dzakic,
-> #646, andrejt> s[0] := 'A';
> Ovo nista ne radi sem sto u s ubaci i neke
> dodatne charove.Zasto ?(s je string)
Zato što jse u nultom bajtu stringa čuva njegova dužina.
pascal.650eagle,
-> #638, peca.st> Inače, promena dužine stringa preko stŠ0Ć je, po meni, sasvim
> legalan put.
A kako se inače menja dužina stringa? ;)
pascal.651eagle,
-> #639, dzakic> inc(sŠ0Ć); sŠlength(s)Ć:=' '; umesto s:=s+' ';
> Drugi način je za početnike, kompajler tu poziva procedure za
> konkatenaciju ;) stringova, u code segmentu čuva konstantni string
Dobar kompajler bi sve izraze s:=s+... preveo na prvi način, kad već
ne postoji funkcija adds(s1,s2) koja inline nadovezuje s2 na s1.
TP slabo optimizuje, čak je i move potprogram.
pascal.652isekulovic,
-> #626, andrejt>> Getintvec(9,@StaraProcedura); {Gde je StaraProcedura : Procedure}
>> Setintvec(9,@proc_1);{procedura koja se izvrsava na int9}
>> Keep(0);
Ima tu još dosta stvari da se uradi. Kao prvo proc_1 treba da se
definiše kao interapt procedure tj.
Procedure proc_1; interrupt;
Dalje na početku procedure mora da se uradi Inline($9c); tj. pushf.
Pošto DOS koristi isti prostor za stek za sve funkcije od $00 do $0C
početak izvršavanja jedne funkcije dok se izvršava druga će izazvati
blokiranja kompa kada se memorija bude vratila drugog funkciji da
nastavi rad. Da se to ne bi dogadjalo potrebno je proveriti da li je
aktivna već neka funkcija, a to se radi tako što se proverava vrednost
tkzv. InDos flega. Ukoliko je 0 nijedna funkcija nije aktivna. Njegovu
adresu vraća funkcija $34 u registrima ES:BX.
Ipak ukoliko je InDos<>0 ipak u jednom specificnom slucaju smemo
da izvrsimo nasu funkciju, a to je ako se trenutno izvrsava funkcija $06
koja čeka da korisnik nešto otkuca. Tada DOS (a i neki programi koji
ne koriste dos-ove funkcije za ocitavanje tastature, npr. TP) stalno poziva
prekid $28 tkzv. DOS Idle ili DosOK.
Treba još preusmeriti i vektore koji su zaduženi za poruke o greškama,
npr. $24 za presretanje greske u radu sa datotekama, da command.com ne bi
ispisao ono nesretno Retry, Abort, Ignore, Fail?
>> Takodje je pametno posle izvrsenja proc_1 pustiti i StaraProcedura.
Zavisi od interpta koji preuzimamo. Npr. u slučaju $08, $09 mora se
obavezno pozvati stara procedura. Ako program startujemo preko PrintScreen
tastera ($05) onda nema potreba da zovemo staru proceduru. Kod $09 je jos
kvaka da se stara procedura mora pozvati POSLE ocitavanja tastera sa porta $60
(ako hoćemo da program radi i na XT-u).
Ivan
pascal.653andrejt,
-> #625, mzdravkovicI jos da dodam da bi bilo pametno da se na pocetak
stavi {$M} da ogranici koriscenu mem. na steku.
(ako se ne stavi nece da radi uopste)
pascal.654peca.st,
-> #640, dzakic!->>> st:=copy(st,1,x);
!->>> stŠ0Ć:=x;
!->
!-> Sad nešto gledam. Ovo će da radi samo ako string st treba
!-> skratiti. Ukoliko je x veće od prethodne dužine st, nije
!-> svejedno. Pretpostavljam da ti je jasno zašto.
Pa da, ali ni ono prvo ne bi ništa uradilo ako je x veće od prve dužine.
Peđa.
pascal.655dzakic,
-> #654, peca.st> Pa da, ali ni ono prvo ne bi ništa uradilo ako je x veće od prve dužine.
Copy('sezam',1,200) opet će biti 'sezam'. A ne 'sezamďň╠┼ž...' kao
što bi bilo kad bi u s[0] upisao chr(200).
pascal.656vitez.koja,
-> #652, isekulovic#=> Dalje na početku procedure mora da se uradi Inline($9c);
#=> tj. pushf.
Ne mora, čak ne sme. pushf treba ubaciti neposredno pred poziv rutine koja je
ranije opsluživala prekid, i to samo ako je pozivaš pointerom na funkciju koji
je implementiran u samom jeziku; ako koristoš neki drugi način potivanja, ko
zna...
pascal.657eagle,
-> #652, isekulovic> Dalje na početku procedure mora da se uradi Inline($9c); tj. pushf.
Pushf se radi neposredno pre poziva _stare_ procedure, zato što se
ista završava sa iret (ret far + popf). Pozivi preko proceduralnog
tipa su uvek far, ostaje ti još da pokriješ popf. Ako ne pozivaš
staru proceduru ne treba ti ni pushf.
> Tada DOS (a i neki programi koji ne koriste dos-ove funkcije za
> ocitavanje tastature, npr. TP) stalno poziva prekid $28.
QEdit, na primer. Na osnovu čega si zaključio da TP poziva int 28h?
pascal.658isekulovic,
-> #657, eagle>> QEdit, na primer. Na osnovu čega si zaključio da TP poziva int 28h?
Pročitao u nekoj knjizi/časopisu/fajlu ne sećam se više.
pascal.659peca.st,
-> #650, eagle!-> A kako se inače menja dužina stringa? ;)
U, pa ima dosta načina:
delete, copy, s1 := s1 + s2...
O:)
Peđa.
pascal.661bearboy,
-> #600, peca.st> Kako najbrže staviti pixel na ekran u rezoluciji 640*480*256?
> Mem Š$a000:xĆ radi samo do određene granice, zato što, naravno,
> obuhvata samo jedan segment od 64k. Dakle, koje su adrese
> ostalih segmenata video memorije?
A000:x, naravno :) Samo što treba da koristiš rutinu za menjanje stranica.
Odmah da odgovorim na sledeće pitanje :) - Skini VGADOC2 sa Sezama, tamo
imaš opis dosta video kartica & kako treba na njima menjati stranice.
pascal.662andrejt,
Ako stavim finddirst('*.*',directory,dir); i posle
par puta findnext(dir);write(dir.name); ispisace
ne samo direktorijume.Pa pitanje je zasto ne razlikuje
te ostale fajlove od direktorijuma ?(ako ih ne razlikuje)
A 2. pitanje je dal' postoji neki nacin da ispisuje samo
dirove a ne i ostale fajlove(sem da se stavi: if dir.attr = directory
then write(dir.name);)?
pascal.663isekulovic,
Ima li neko Timo Salmijeve unite, ali za TP 6.0?
pascal.664peca.st,
-> #661, bearboy!-> A000:x, naravno :) Samo što treba da koristiš rutinu za menjanje
!-> stranica. Odmah da odgovorim na sledeće pitanje :) - Skini VGADOC2
!-> sa Sezama, tamo imaš opis dosta video kartica & kako treba na
!-> njima menjati stranice.
Hvala puno, skinuću, ako nešto bude nejasno biću slobodan da priupitam. :).
Peđa.
pascal.666eagle,
-> #662, andrejt> Ako stavim finddirst('*.*',directory,dir); i posle
> par puta findnext(dir);write(dir.name); ispisace
> ne samo direktorijume.Pa pitanje je zasto ne razlikuje
Obične fajlove sa atributom $20 uvek nalazi, a parametar
attrib u findnext definiše dodatne flegove koje uzima u
obzir, pored pomenutog. Verovatno nije bag u TP-u već
tako radi odgovarajuća dosova funkcija.
pascal.667dejanr,
-> #662, andrejt>> Ako stavim finddirst('*.*',directory,dir); i posle
>> par puta findnext(dir);write(dir.name); ispisace
>> ne samo direktorijume.Pa pitanje je zasto ne razlikuje
>> te ostale fajlove od direktorijuma ?(ako ih ne razlikuje)
Tako je napravljena DOS funkcija - imaš mogućnost da maskiraš šta
da se *ne* prikazuje ali fajlovi su uvek tu. Dakle, moraće sa IF
pascal.668andrejt,
-> #667, dejanr===>Tako je napravljena DOS funkcija - imas mogucnost da maskiras sta
===>da se *ne* prikazuje ali fajlovi su uvek tu. Dakle, morace sa IF
Ipak nece morati sa IF jer (primetio sam) da ako stavim
FindFirst('',Directory,Dir);
...
FindNext(Dir);
Write(Dir);
...
ispisivce samo direktorijume.
pascal.669andrejt,
Kako da izbacim TSR iz memorije ?
pascal.671niklaus,
-> #668, andrejt(:> ispisivce samo direktorijume.
A ako ne budeš hteo da ne prikazuješ fajlove sa jednim atributom manje
(recimo ARS, kada želiš samo Hidden i Direktorijume), moraćeš sa IFom...
(:niklaus:)
pascal.670niklaus,
-> #661, bearboy(:> A000:x, naravno :) Samo što treba da koristiš rutinu za menjanje
(:> stranica. Odmah da odgovorim na sledeće pitanje :) - Skini VGADOC2 sa
(:> Sezama, tamo imaš opis dosta video kartica & kako treba na njima
(:> menjati stranice.
Neophodno je (po potrebi) menjati banke video memorije (64kb blokovi),
pa se upisuje normalno po apsolutnoj adresi $A000:0000.
Ovo za VGADOC2 stoji, valja ga pročitati...
(:niklaus:)
pascal.672predragd,
-> #636, markom> Pazi ovo: Definišem promenljivu VM, tipa ARRAYŠ1..4000Ć OF
> BYTE na adresi $B000:$8000, znači na adresi video
> memorije. Ako probam da pišem u taj niz, da li će
> prijavljivati grešku ?
Naravno da hoće. Potrebno je da uz pomoc funkcije, koju sam ti poslao
u prethodnoj poruci, konvertuješ segment adresu (u ovom slučaju $B000) u
descriptor i tvoj program bi trebalo da radi bez problema. Ako ti ovo
nije baš razumljivo, možda će ti primer koji sledi pomoći.
Uses
Dos;
var
Descriptor: Word;
function Segment_to_Descriptor (RealModeSegment: Word;
var DPMISegment: Word): Boolean;
var
Regs: Registers;
begin
FillChar (Regs, Sizeof (Regs), 0);
Segment_to_Descriptor:=TRUE;
With Regs do
begin
Ax:=$0002;
Bx:=RealModeSegment;
Intr ($31, Regs);
If (Flags and 1) = 1 then
š Error in Ax ć
Segment_to_Descriptor:=FALSE
else š No error ć
DPMISegment:=Ax;
end;
end;
begin
If Segment_to_Descriptor ($B800, Descriptor) then
Mem ŠDescriptor:$0000Ć:=Ord ('A');
end.
Peđa.
pascal.673ppekovic,
-> #669, andrejt>> Kako da izbacim TSR iz memorije ?
Ako sam tsr nema opciju uninstall, onda uz pomoć programa mark
i release. Nalaze se u arhivi TSR???.zip. Potraži sa dir /s
tsr*.*.
Paya
pascal.674andrejt,
-> #673, ppekovicVerovatno sam ja lose postavio pitanje ali to nije
ono sto sam ja hteo da znam,mene zanima kako da
izbacim svoj tsr iz memorije(uninstall) posto vratim
sve int vektore kako su bili.
pascal.675ndragan,
-> #593, vvelisavljev/ Da video sam. :( Po mom prevodu to znači: "Pristup memoriji pre nego
/ što je lokalni adresni prostor dodeljem mojoj aplikaciji." Tako
Ne, nego _izvan_ lokalnog adresnog prostora dodeljenog aplikaciji.
Profurao tarabu, zaglavio u jendek.
Bue_ Ndragan
pascal.676ndragan,
-> #611, kriss/ Glup je, al samo za crt. Inače je kompajler pametan, sad je
Ne bih bio siguran. Ko zna šta koja od procedura iz crt.tpu poziva
unutar samog crt.tpu? Uostalom, ubaci i neko farbanje ekrana i neko
skrolovanje, pa ako se pojave neke nove rutine na mapi, onda znači da ti
ipak nije onog prvog puta ubacio ceo crt.
Bue_ Ndragan
pascal.677dragisha,
-> #674, andrejt-> Verovatno sam ja lose postavio pitanje ali to nije
-> ono sto sam ja hteo da znam,mene zanima kako da
-> izbacim svoj tsr iz memorije(uninstall) posto vratim
-> sve int vektore kako su bili.
Tako što oslobodiš memoriju koju isti zauzima odgovarajućim DOS pozivima.
Prvo korak je da utvrdiš PSP koji je identifikacija tvog programa i kojim
su potpisani MCBovi koje owniraš (ha:). Onda nedokumentovanim DOS pozivom
52H uhvatiš head spiska MCB-ova i nađeš svoj (ha2:) MCB. Kad hoćeš da to
počistiš, počisti taj nađeni MCB. Mislim da i sljedeći MCB isto treba
počistiti, ali najbolje da ovim kodom ispod prođeš *sve* MCBove i da ondak
čistiš sve što je potpisano tvojim MCB.
Ovo ispod su neki fragmenti koda iz mog TSR modula, a ako to nije
dovoljno, mail me za ostatak. Sintaksa [mcb:3] je za mcb=03cH ustvari
adresa 03ch:3.
PROCEDURE NextMCB(mcb: CARDINAL): CARDINAL;
TYPE
CP=POINTER TO CARDINAL;
BEGIN
RETURN (mcb+[mcb:3 CP]^+1);
END NextMCB;
(* Get PSP
*)
R.AX:=5100H;
Lib.Intr(R, 21H);
ProgPSP:=R.BX; (* Current PSP *)
(* Get first MCB
*)
R.AH:=52H;
Lib.Intr(R, 21H);
s:=[R.ES:R.BX-2 CP]^;
(* Nađi MCB od PSP
*)
WHILE [s:0 BP]^=4DH DO
IF [s:1 CP]^=ProgPSP THEN
ProgMCB:=s;
END;
(* Next MCB
*)
INC(s, [s:3 CP]^+1);
END;
(* žišćenje.
*)
R.AH:=49H;
R.ES:=ProgMCB+1; (* MCB+1 su podaci, sam Memory Control Block je
jedan paragraf prije podataka.
*)
Lib.Intr(R, 21H);
--
[Pave the bay.]
pascal.678dragisha,
-> #677, dragisha-> počistiš, počisti taj nađeni MCB. Mislim da i sljedeći MCB isto treba
-> počistiti, ali najbolje da ovim kodom ispod prođeš *sve* MCBove i da
Prvi MCB na koji naletiš je environment, drugi je program. Ili tako
nešto:)). Zavisno od toga kako radi heap manager možeš da naletiš na još
koji MCB, ali ne vjerujem da će to da ti se desi u TSR.
-> ondak čistiš sve što je potpisano tvojim MCB.
Tvojim PSP, ali nema veze:)).
--
[There are so many upgrades, I am bankrupt.]
pascal.679luks,
-> #663, isekulovic> Ima li neko Timo Salmijeve unite, ali za TP 6.0?
Šta ima u tim unit-ima. Da ne skidam badava?
pascal.680ognjen,
-> #614, markom)-> Cekaj malo, nadam se da si tu promenljivu FI, definisao kao
)-> FILE OF type, a ne kao TEXT, jerbo ako si je tako definisao
)-> nije ni cudo sto ti ne radi ;)
Naravno!!!! I dalje ne radi! ;(
)-> P.S. Uz poruku je program koji SIGURNO radi!
Ne radi!!!! Utata... :9 :P :b :)
)-> P.P.S. Naravno, podrazumeva se da fajl nije prazan :)
Prvo, kad sam mu dao fajl od 32b otptilige ovakav:
------------------
abcd efghijkl
1234 56789000
------------------
Prijavio je da fajl ima 0 bajtova!!!! Dobro, gledam source, i
mislim "Gde li je greska???!?!", ali greske prosto, naprosto,
nema!!!!!!!! Jebote (sorry, moram :), kad mu kazem falesize(f)
on kaze 0!!!! Kako NULA kad ima TRIDEST I DVA!!!!
Dobro, kad sam se malo smirio, :) ubacio sam mu neki TEXTPAD
(umesto proba.fil) od 170 Kilobajta, i uradio je isto sranje, kao
program koji sam ja ranije napisao... Ispisivao je neke delove
fajla...
Tad sam uvideo gresku. Definisao si record od 2 stringa
nedefinisane duzine... Probao sam da stavim s1, s2: string[5],
ali je tad uradio sranje, koje ja u zivotu nisam video... Ispisao
je (pomesano) delove fajla, i neke naucnofantasticne karaktere!
Odokativno sve zajedno je iznosili 200 bajtova, ali kako 200
(!?!) kad sam mu ja rekao da ispise dva stringa po 5 bajtova....
U cemu je greska ("iksovati" tacan odgovor):
[ ] U meni
[ ] U programu
[ ] U pascalu
[ ] U wirthu
[ ] Duhovi?
[ ] Virus nove generacije?
[ ] Nesto sedmo?
pascal.681ognjen,
Ima li neko elegantnije resenje odo ovoga:
var linija: integer;
read_lin:string;
f: text;
bagin
pardon, begin ;)
assign (f, 'file.ext');
reset (f);
while not eof(f) do
begin
readln(f, read_lin);
linija:=linija+1
end;
writeln ('U fajlu ima ', linija, 'linija :) ');
end.
Da se prebroje linije u fajlu?
pascal.682dejanr,
-> #681, ognjen>> Ima li neko elegantnije resenje odo ovoga:
>> ...
>> Da se prebroje linije u fajlu?
Nema naročito elegantnijih, ali ima bržih. Najlakše je da napraviš
jedan bafer, ili sa:
var buf: array[1..10000] of byte
ili, ako nećeš da opterećuješ data segment, na heap-u (ono sa getmem)
i onda:
assign (f, 'file.ext');
settextbuf(f,buf[1], 10000);
reset(f);
Ostalo je isto.
pascal.683markom,
-> #680, ognjen■■■ [X] U meni <-- tebi
■■■ [ ] U programu
■■■ [ ] U pascalu
■■■ [ ] U wirthu
■■■
■■■ [ ] Duhovi?
■■■ [ ] Virus nove generacije?
■■■ [ ] Nesto sedmo?
Kao prvo, ne možeš sam da napraviš fajl tipa File of <tip>, zato što ni sam ne
znam kako to Pascal radi. Napravi jednu proceduru koja će u taj fajl da upiše
slog. Filesize NE VRAĆA veličinu fajla u bajtovima, već u slogovima, i to
isključivo za tipske i netipske datoteke, tj. neće da radi (prijavljuje grešku)
sa fajlovima tipa TEXT. Dakle, ako već pričaš -- utata, ne radi --, moraš i
znati neke stvari. Ako budeš imao još ovakvih problema, mailni me pa da ti na
mail okačim program ...
Marko
pascal.684ajankovic,
Hi 2 all.
Hitno potreban originalni Borlandov paket "Turbo Pascal for Windows v 1.5"
Nov ili polovan :)
Ponude na mail ..ma wr ajankovic..:)
ili na 011/101-728 Sale...
pascal.685ognjen,
Aha, dakle, malo mi se razbistrilo ono sa recordima...
Pascal sâm ubacuje bajtove koji oznacavaju koliko je dugacak
record... Npr:
------------------------------
[chr(3)]abc[chr(7)]1234567
------------------------------
itd...
Ali, sta ako imam fajl otprilike ovakvog izgleda:
Petar Petrovic Njegos
Jovan Bulajic Bulaja isl.
──────┬─────── ───┬──
│ └── Nadimak
└────────────── Ime (banalan primer)
Racunajuci i space char izmedju ova dva recorda... Mogu li ovde
da koristim recorde (u pascalu)?
Tacnije da li je moguce rad sa recordima primeniti na DBF
fajlovima?
pascal.686kriss,
-> #680, ognjen˙˙ Prijavio je da fajl ima 0 bajtova!!!! Dobro, gledam source, i
˙˙ mislim "Gde li je greska???!?!", ali greske prosto, naprosto,
˙˙ nema!!!!!!!! Jebote (sorry, moram :), kad mu kazem falesize(f)
˙˙ on kaze 0!!!! Kako NULA kad ima TRIDEST I DVA!!!!
Eh, gde li mi se samo zaturi taj kod ;)
U sred programa stoji jedno Readln(x); -> pri izvršavanju se
preskoči (!!?!?!)
Kada se stavi još jedno iza ovog prvog -> pita te 2 puta !!!!!!!!
Zona sumraka, Turbo Pascal 6.0 :)
pascal.687nikac,
-> #685, ognjenImas u nekom od dir-ova poveliki program (i to za c) za rad sa dbf bazama.
I lepo neko rece NE MOZES ti da napravis file of nesto. Moze
s da napises
program koji ce pravi konverziju ascii->file_of.
Na primer:
...
Readln(S);
i:=pos(' ',s));
slog.ime:=copy(s,1,i);
s:=copy(s,i,length(s)-i));
slog.prezime:=...
...
write(f,slog);
...
pascal.688peca.st,
-> #680, ognjen!-> U cemu je greska ("iksovati" tacan odgovor):
!->
!-> Š Ć U meni
Dafinitivno u tebi. :).
Najbolje pošalji kompletan source i fajl nad kojim si ga probao
(okači uz poruku, zipovano) pa ćemo da vidimo...
Peđa.
pascal.689peca.st,
-> #683, markom!-> Kao prvo, ne možeš sam da napraviš fajl tipa File of <tip>, zato
!-> što ni sam ne znam kako to Pascal radi.
Pascal to radi ko i svi kompajleri. (i ne samo kompajleri)
Slog je jednostavno skup bajtova, on te bajtove upiše u fajl i kraj.
To što ti vidiš u fajlu kuke i kvake, to je druga stvar. Svaki broj
zauzima 1, 2, ili 4 bajta (zavisno od tipa) pa to kad se pretvori u
neki(e) znak(ove) ne izgleda baš kao broj.
Peđa.
pascal.690peca.st,
-> #687, nikac!-> I lepo neko rece NE MOZES ti da napravis file of nesto.
Nije da ne može, ali će ići malo teže. :))).
Peđa.
pascal.691markom,
-> #689, peca.st■■■ Pascal to radi ko i svi kompajleri. (i ne samo kompajleri)
■■■ Slog je jednostavno skup bajtova, on te bajtove upiše u fajl
■■■ i kraj.
Hmm, mora da sam se pogrešno izrazio. Ovoliko sam i ja zna, ali ajde ti napravi
fajl tipa Word i u njega upiši četiri prizvoljna broja, ali ručno iz nekog edi-
tora. To sam mislio pod onim da ni meni nije jasno kako Pascal to radi :)
Marko
pascal.692markom,
-> #685, ognjen■■■ Tacnije da li je moguce rad sa recordima primeniti na
■■■ DBF fajlovima?
Teško, ali imaš u sezamovom direktorijumu, a i u nekom od FON-ovih TPU(ove) za
rad sa DBF fajlovima. Ali ako već radiš iz TP-a, bolje ti je da praviš sam svo-
je baze ...
Marko
pascal.693markom,
-> #690, peca.st■■■ Nije da ne može, ali će ići malo teže. :))).
Dobro, file of String će lako napraviti, ali ajde napravi file of word...
Marko
pascal.694markom,
-> #686, kriss■■■ ˙˙ nema!!!!!!!! Jebote (sorry, moram :), kad mu kazem
■■■ falesize(f) ˙˙ on kaze 0!!!! Kako NULA kad ima TRIDEST I
■■■ DVA!!!!
■■■
■■■ Eh, gde li mi se samo zaturi taj kod ;)
Nemoj komentarisati nešto što ne znaš. Filesize NE VRAĆA veličinu fajla u
bajtovima nego u SLOGOVIMA. FileSize može da vrati 1 i na fajlu od 50 K, ako
napraviš toliki slog..
Marko
pascal.696eagle,
-> #686, kriss> U sred programa stoji jedno Readln(x); -> pri izvršavanju se
> preskoči (!!?!?!)
Verovatno imaš negde pre toga još neko read ili readln.
pascal.695eagle,
-> #693, markom> Dobro, file of String će lako napraviti, ali ajde napravi file
> of word...
Kod stringova moraš uneti i dužinu, i napraviti razmak pre
sledećeg stringa. File of word je lako napraviti ako imaš
hex editor.
pascal.697ognjen,
Kad se vec govori o TSR programima, jasno je kako da se startuje
na pritisak (bilo kog tastera), ali kako srediti da se startuje
na pritisak odredjene kompinacije (Npr: Shft+Shft+Space), a kako
da se startuje posle tacno odredjenog vremena...
pascal.698ognjen,
-> #682, dejanr)-> Nema narocito elegantnijih, ali ima brzih. Najlakse je da
)-> napravis jedan bafer, ili sa:
)-> ...
Da, radi. :) Ali, mogu li sad da znam zasto? :) Mislim, zasto
je ovo resenje brze...?
pascal.699ognjen,
-> #683, markom)-> Kao prvo, ne mozes sam da napravis fajl tipa File of <tip>,
)-> zato sto ni sam ne znam kako to Pascal radi.
Da, shvatio sam. :(
)-> Napravi jednu proceduru koja ce u taj fajl da upise slog.
E, to mi ne treba, jer fajl ne pravi _moj_ program, on je vec
napraljen (mislim, fajl iz koga se cita), i najvise lici na DBF
fajl...
)-> Dakle, ako vec pricas -- utata, ne radi --, moras i znati
)-> neke stvari.
Ok, sorry, pretendovalo je da bude sala... :)
)-> Ako budes imao jos ovakvih problema, mailni me pa da ti na
)-> mail okacim program ...
Ok... :)
pascal.700andrejt,
-> #697, ognjenNe znam za ostale ali neke tastere imas na adresi $40:$17
(po bitovima : insert,caps-lock,num-lock,scroll-lock,alt,
ctrl,levi shift,desni shift) pa njih mozes da proveris i
kad je vise njih pritisnuto,za ostale ne znam :(.Posle
tacno odredjenog vremena mozes da ga startujes ako radi
na INT 8(ako napravis proceduru koja uvecava neku prom.
za recimo 1 i kad dostigne recimo 200 pustis tsr da radi-
ovo verovatno moze i bolje ali ne mogu da se trenutno setim
niceg pametnijeg.
pascal.701andrejt,
-> #698, ognjen...
===> Da, radi. :) Ali, mogu li sad da znam zasto? :) Mislim, zasto
===>je ovo resenje brze...?
Zato sto inace pri svakom citanju iz fajla on cita char po char,
a ovako smesti recimo 512 charova u mem. pa radi sa memorijom
sto je mnogo brze.
pascal.702dejanr,
-> #698, ognjen>> Da, radi. :) Ali, mogu li sad da znam zasto? :) Mislim, zasto
>> je ovo resenje brze...?
Zato što onako pozivaš DOS za svaki karakter (? ili nekoliko karaktera?)
a ovako odmah prenese po 10-tak kilobajta (ili više) pa posle samo čita
iz bafera. Dakle, štedi se pakovanje parametara, pozivi DOS funkcija itd.
Razlika ume da bude drastićna.
Plaćena je i određena cena... u tekst datoteci ne možeš da radiš seek!
Osim pomoću trikova ;)
pascal.703isekulovic,
-> #679, luks>> Šta ima u tim unit-ima. Da ne skidam badava?
Gomila stvari, ali veoma malo pametnih. Nažalost pobrisao sam verziju
za sedmicu tako da nemam spisak svih procedura. Ono što mene interesuje
je procedura SetEnv (kao pandan TP-ove GetEnv).
pascal.704kriss,
-> #694, markom˙˙ ■■■ Eh, gde li mi se samo zaturi taj kod ;)
˙˙
˙˙ Nemoj komentarisati nešto što ne znaš. Filesize NE VRAĆA
˙˙ veličinu fajla u bajtovima nego u SLOGOVIMA. FileSize može da
˙˙ vrati 1 i na fajlu od 50 K, ako napraviš toliki slog..
Kao prvo nisam komentarisao filesize, već Bug turbo pascala koji
se javljao na 3 (tri) različite mašine. Kao drugo - nema drugo :)
pascal.705peca.st,
-> #691, markom!-> fajl tipa Word i u njega upiši četiri prizvoljna broja, ali ručno
!-> iz nekog edi-
Word? žetiri broja?
Ovako: Dopiši na kraj tog fajla 8 (4*2) bilo kojih znakova, i, eto,
dopisao si mu 4 broja. A koje si brojeve dopisao, znaćeš tako što
uzmeš prva dva broja, pa onda druga dva... i prvi od njih pomnožiš
(Ord (ch1)) sa 256 i dodaš mu drugi (Ord (ch2)).
Peđa.
pascal.706peca.st,
-> #702, dejanr!-> Plaćena je i određena cena... u tekst datoteci ne možeš da radiš
!-> seek!
Pa... za šta bi služilo seek u tekstualnoj? Mislim, na koju poziciju bi
to trebalo da pomeri pointer? Eventualno da se kao jedna pozicija računa
jedan red, ali je to onda teško (nemoguće?) izvodljivo. (zbog promenljive
dužine reda)
Peđa.
pascal.708markom,
-> #695, eagle■■■ Kod stringova moraš uneti i dužinu, i napraviti razmak pre
■■■ sledećeg stringa. File of word je lako napraviti ako imaš
■■■ hex editor.
Arrrrgggggghhhh!!!! Zar ti nije lakše da napraviš proceduru koja će to da radi?
Ja sve vreme o tome pričam bre !!
Marko
pascal.709markom,
-> #704, kriss■■■ Kao prvo nisam komentarisao filesize, već Bug turbo pascala
■■■ koji se javljao na 3 (tri) različite mašine. Kao drugo - nema
■■■ drugo :)
Ali to nije bug, to tako radi i gotovo...
Marko
pascal.707markom,
-> #699, ognjen■■■ Ok, sorry, pretendovalo je da bude sala... :)
Opraštam ti :)
Marko
pascal.710ognjen,
-> #687, nikac)-> Imas u nekom od dir-ova poveliki program (i to za c) za rad
)-> sa dbf bazama.
Ne programiram u cu :)
pascal.711ognjen,
-> #688, peca.st)-> Najbolje posalji kompletan source i fajl nad kojim si ga
)-> probao (okaci uz poruku, zipovano) pa cemo da vidimo...
Neah. Nije ni bitno, odustao sam od recorda... :)
pascal.712isekulovic,
-> #685, ognjen>> Tacnije da li je moguce rad sa recordima primeniti na DBF
>> fajlovima?
Ako ti već treba nešto za rad sa .dbf fajlovima potraži fajl dbasendx.arj
uz poruku pc.prog.2 6.632 by pedjak.
pascal.713isekulovic,
-> #697, ognjen>> ali kako srediti da se startuje na pritisak odredjene kompinacije
Npr. shift-ctrl-alt-spc kombinacija.
Proveravaš port[$60] i registruješ svako pritiskanje/otpuštanje
crtl/shift/alt tastera u nekim Boolean promeljivima, tako da znaš
stalno šta je pritisnuto a šta nije. Kad se pritisne space proveriš
da li su pritisnuti ctrl i shift i alt i ako jesu treba da se aktivira.
>> a kako da se startuje posle tacno odredjenog vremena...
Postaviš da procedura na int $08 uvećava neki brojač svaki put kada
okine (18.2 puta u sekundi) i kada brojač dostigne neku vrednost tada
program treba da se aktivira.
pascal.714eagle,
-> #713, isekulovic> Postaviš da procedura na int $08 uvećava neki brojač svaki put
> kada okine (18.2 puta u sekundi) i kada brojač dostigne neku
> vrednost tada program treba da se aktivira.
SIgurnije je svaki put pročitati vreme sa 40h:6Ch adrese.
pascal.715eagle,
-> #705, peca.st> uzmeš prva dva broja, pa onda druga dva... i prvi od njih
> pomnožiš (Ord (ch1)) sa 256 i dodaš mu drugi (Ord (ch2)).
Obrnuto.
pascal.716markom,
-> #713, isekulovic■■■ Npr. shift-ctrl-alt-spc kombinacija.
Ajde ako te ne mrzi nabaci primer ...
Marko
pascal.717kriss,
-> #709, markom˙˙ Ali to nije bug, to tako radi i gotovo...
Nije bug? Ok, možda ti to zoveš nekim drugim imenom, ali to je
bag. Sad sam se setio da sam zbog toga i morao da pišem sopstvenu
proceduru unos, tako da je definitno taj deo koda transformisan
:( Šteta, inače bih ga poslao da se uveriš ;)
pascal.718ognjen,
Znaci, SetTextBuf() sluzi za izdvajanje dela memorije u koji
ce se citati x bajtova fajla... I, prvo se ucita u taj bafer
prvih x bajtova, pa kada se oni privedu kraju, sledecih x... do
kraja fajla... Jesam li dobro razumeo?
pascal.719ognjen,
Kako se moze odsvirati neka melodijica u pascalu, ali tako da
se ne koristi primitivno sound, nego, da li ima neka komanda,
ekvivalentna basic komandi play?
pascal.720andrejt,
-> #719, ognjenQUOTE>> Kako se moze odsvirati neka melodijica u pascalu, ali tako da
QUOTE>>se ne koristi primitivno sound, nego, da li ima neka komanda,
QUOTE>>ekvivalentna basic komandi play?
Ja mislim da nema niceg slicnog play,ali i sa sound mozes svasta
da odsviras ako se potrudis,no imas negde(valjda na FENIXu a verovatno
i na jos nekim mestima) neki tpu za odsviravanje pa cu videti da
ga skinem i da ti dostavim preko maila.