Xladhenian
 DeconectatMesaje: 47
|
|
Cum sa folosesc SVGA prin BIOS, Iun 17, 2007, 19:32
|
|
As vrea sa fac un program si apoi o librarie (pe care sa o folosesc si la alte programe) in care sa intru in modul grafic si sa manipulez memoria video (in DOS, fara sa am Windows in memorie). Am folosit ca sa intru in modul SVGA 1024x768x16M ASM MOV AX , 04F02H MOV BX , 00118H INT 10H End; Apoi am incercat apoi sa modific memoria si astfel sa imi apara pe ecran ceea ce doresc sa deseneze... ASM MOV AX , 0A000H MOV ES , AX XOR DI , DI XOR AX , AX End; For a := 0 To 6553500 Do {a:LongInt} Begin Asm MOV ES:[DI] , AX INC DI MOV ES:[DI] , AX INC DI MOV ES:[DI] , AX INC DI INC AX End; End; dar nu deseneaza decat in partea de sus a ecranului si la mijlocul acestuia...  Cum as putea sa fac sa pot sa desenez pe tot ecranul (sau unde ar trebui sa modific memoria si cum; sau ar trebui sa folosesc registrii precum EAX,EBX,etc)? P.S. : - am scris in TP6 programul - imaginea am luat-o ruland programul in DOS-BOX 0.7 - daca rulez in Windows iese din program(poate e de la a := 0 To 6553600) - daca rulez in DOS-BOX 0.7 merge incontinuu (nu da erori si nu apar alte probleme) - daca rulez in MS-DOS 7.1 (folosind Virtual PC 2007) se blocheaza si nu vad decat partea de sus (cred ca e de la faptul ca memoria video din DOS e intre 0A000H si 0BFFFH)
|
|
|
|
|
Memorat
|
|
|
|
|
Shocker
|
|
Cum sa folosesc SVGA prin BIOS, Iun 17, 2007, 22:42
|
|
MOV AX , 0A0000H
O mica nelamurire, AX e registru tip WORD, maxim FFFF, cum bagi tu A0000 in el ? [A0000 > FFFF]
|
|
|
|
|
Memorat
|
|
|
|
Xladhenian
 DeconectatMesaje: 47
|
|
Cum sa folosesc SVGA prin BIOS, Iun 18, 2007, 08:50
|
|
Am scris din greseala un 0 in plus .... corect este 0A000H
|
|
|
|
|
Memorat
|
|
|
|
|
Shocker
|
|
Cum sa folosesc SVGA prin BIOS, Iun 18, 2007, 11:07
|
|
- daca rulez in Windows iese din program(poate e de la a := 0 To 6553600) Cred ca doar la asta stiu sa iti raspund. Spre deosebire de DOS, in Windows aplicatiile pot rula in 2 "moduri": user-mode si supervisor mode [kernel mode]. Aplicatia ta ruleaza in "user mode" si nu are acces direct la resursele fizice, ceea ce incerci tu sa faci direct in ASM. Asta se poate face doar din kernel mode, mai exact din aplicatiile care ruleaza in kernel mode. Probabil o varianta ar fi sa efectuezi un "system call", sa transferi codul tau in spatiul kernel, unde se poate face orice. Nu mai am timp acum sa analizez tot codul, dar cred ca asta e cauza pentru care in windows nu merge
|
|
|
|
|
Memorat
|
|
|
|
Xladhenian
 DeconectatMesaje: 47
|
|
Cum sa folosesc SVGA prin BIOS, Iun 18, 2007, 11:27
|
|
Eu vreau ca programele sa ruleze doar pe DOS (fara sa am Windows in memorie), si nu pe Windows....
|
|
|
|
|
Memorat
|
|
|
|
|
Agkelos
|
|
Cum sa folosesc SVGA prin BIOS, Iun 18, 2007, 14:29
|
|
Nici pascal nici ASM nu sunt domeniile mele in care ma pricep dar problema cred ca e la bucla. Bucla trebuie sa aiba 1024x768x16777216 iteratii (16777216 = 16 * 1024 * 1024), nu 6553500. Cred ca asta e motivul pentru care nu iti coloreaza toti pixelii de pe monitor.
|
|
|
|
|
Memorat
|
 Problemele se rezolva pe forum. Nu trimiteti PM ca nu va ajut. Pentru urgente, skullbox at skullbox . info.
|
|
|
|
DarkByte
|
|
Cum sa folosesc SVGA prin BIOS, Iun 18, 2007, 14:34
|
|
Daca era numai asta, atunci pixelii nu-i punea in doua zone ale monitorului.
|
|
|
|
|
Memorat
|
|
|
|
Xladhenian
 DeconectatMesaje: 47
|
|
Cum sa folosesc SVGA prin BIOS, Iun 18, 2007, 15:01
|
|
Pentru 16 culori si 256 culori, un pixel ocupa 1 byte. Pentru 32768 si 65536 culori, un pixel ocupa 2 bytes. Pentru 16777216 culori fara Alpha, un pixel ocupa 3 bytes. Pentru 16777216 culori cu Alpha, un pixel ocupa 4 bytes.
Este nevoie de X * Y * D bytes pentru toata memoria video.
X = Lungimea in pixels a ecranului Y = Latimea in pixels a ecranului D = adancimea culorii (1/2/3/4 bytes)
Pentru 1024x768x16M este nevoie de 1024 x 768 x 3 bytes = 2.359.296 bytes = 2.25MB. Pentru 1600x1200x16M+A este nevoie de 1600 x 1200 x 4 bytes = 7.680.000 bytes = 7.32MB.
La o singura iteratie eu scriu 3 bytes de memorie, iar facand 6553600 iteratii, scriu 3 * 6553600 bytes = 19660800 bytes = 18.75MB.
18.75 MB > 2.25MB
Astfel eu pot sa scriu mult mai mult decat este necesar si pentru 1600x1200x16M+A.
|
|
|
|
|
Memorat
|
|
|
|
|
Shocker
|
|
Cum sa folosesc SVGA prin BIOS, Iun 18, 2007, 17:13
|
|
sau ar trebui sa folosesc registrii precum EAX,EBX,etc? In DOS nu exista registrii extinsi [EAX, EBX], doar AX, BX, ... For a := 0 To 6553500 Do {a:LongInt} Begin Asm MOV ES:[DI] , AX INC DI MOV ES:[DI] , AX INC DI MOV ES:[DI] , AX INC DI INC AX End; End;
Aici stii ca AX tot incepe de la 0 de vreo 100 de ori nu? In fine, din moment ce ai zis ca pe DOS-BOX e totul ok, ce te mai framanta? 
|
|
|
|
|
Memorat
|
|
|
|
|
DarkByte
|
|
Cum sa folosesc SVGA prin BIOS, Iun 18, 2007, 17:33
|
|
Pai in DosBox ii merge si ii face dungile alea pe ecran.
|
|
|
|
|
Memorat
|
|
|
|
Xladhenian
 DeconectatMesaje: 47
|
|
Cum sa folosesc SVGA prin BIOS, Iun 18, 2007, 17:41
|
|
1. nu imi deseneaza pe tot ecranul, asta nu merge 2. am zis ca merge incontinuu si ca nu apar erori sau probleme (sa se opreasca, sa se blocheze,etc), dar nu deseneaza corect (imaginea e luata din DOS-BOX) 3. stiu ca AX porneste de la 0 de multe ori pentru ca in AX pastrez intensitatea culorii
|
|
|
|
|
Memorat
|
|
|
|
|
|
|