Neautentificat.
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)
Offline
MOV AX , 0A0000H
O mica nelamurire, AX e registru tip WORD, maxim FFFF, cum bagi tu A0000 in el ? [A0000 > FFFF]

Offline
Am scris din greseala un 0 in plus .... corect este 0A000H
Offline
- 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

Offline
Eu vreau ca programele sa ruleze doar pe DOS (fara sa am Windows in memorie), si nu pe Windows....
Offline
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.
Offline
Daca era numai asta, atunci pixelii nu-i punea in doua zone ale monitorului.
Offline
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.
Offline
sau ar trebui sa folosesc registrii precum EAX,EBX,etc?
In DOS nu exista registrii extinsi [EAX, EBX], doar AX, BX, ...
Cod:
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?:-?

Offline
Pai in DosBox ii merge si ii face dungile alea pe ecran.
Offline
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
Offline