Kaksoispuskuri+pikseli (320x200x256)

glaze 25.06.02 16:07

Pieni .com-ohjelma, joka esittelee kaksoispuskurin käyttöä.

 Tekstiversio  Arvo: -4 (5 ääntä)  Äänestä: +  -
main segment para 'code'
org 0100h
assume ds:main
alku:
;varataan muisti puskurille
mov   bx, ss
add   bx, 64000
mov   [word ptr buffer], bx

;mode13
mov   ax, 13h
int   10h

;tyhjennetään puskuri
mov   di, offset buffer
xor   al, al ;väri=0
mov   cx, 32000
rep   stosw

;plotataan pikseli
mov   di, offset buffer ;puskurin alku
add   di, 32160  ;näytön keskikohta
mov   al, 4      ;väri
stosb            ;plot

;flipataan puskuri näytölle.
mov   ax,0a000h
mov   es, ax
mov   si, offset buffer
xor   di, di
mov   cx, 32000
rep   movsw

;odota näppäintä
xor   ax, ax
int   16h

;tekstimoodi
mov   ax, 03h
int   10h

retn    ;loppu

buffer  db 0   ;puskurin paikka on lopussa

main ends
end alku
 

viznut 23:17 26.8.02 
Tuo "muistinvaraus" kusee ainakin täydellisesti, ja ihmettelen, millä logiikalla joku edes pystyy kehittämään tuollaisen väkerryksen siihen. Jos segmenttipointterissa (ss) on sopiva arvo, niin "varattu muistialue" menee ohjelmakoodin itsensä päälle.

Jos oikeasti haluat varata msdossin com-ympäristössä esim. neitseellisen 64 kilon segmentin, niin ensimmäinen sellainen on heti cs:n alusta alkavan 64 kilon jälkeen (eli esim. ds=cs+0100h).
The Scytheman 13:15 5.2.04 
Joo, toi "allokointi" on päin helvettiä. Ei myöskään ole syytä tehdä mitään olettamuksia muistin vapaudesta missään osoitteessa. Allokoi bufferi käyttäen DOS-palveluita eli oliko se nyt keskeytys 20h tai 21h. Google auttaa.
orbi 14:15 11.7.06 
Muistaakseni on ihan oikein olettaa, että DOS varaa com-ohjelmalle kaiken sen yläpuolella olevan muistin aina VGA-segmenttiin asti.
EXE-ohjelmilla asia ei ole näin yksinkertainen.

Eli seuraavan vapaan segmentin saa kun ottaa koodisegmentin ja lisää siihen tarvittavan määrän (64000/16) tavuja ja tuon laittaa vaikkapa ES:ään tai johonkin minkä sopivaksi näkee.