Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Assembly: Koordinaatit assemblyssä

Sivun loppuun

Tössykkä [13.03.2006 12:13:22]

#

Sellaista kysyisin, että miten memory mapped video display oikein toimii assemblyssä?
Auttakaahan nyt tyhmää mäessä ja kertokaa, mikä esimerkiksi 320x200x256 kuvaruudulla on koordinaatin (50, 75) osoite.

rndprogy [13.03.2006 14:08:21]

#

Tuossa tilassa näyttömuisti kulkee lineaarisesti eli sen osoite on kutakuinkin 320x75+50=23050

Blaze [13.03.2006 15:33:19]

#

Plus tietenkin tuon näyttömuistin alkukohta.

Tössykkä [13.03.2006 16:58:42]

#

320x75+50 = 24050, mutta kiitoksia kumminkin. Auttoi mukavasti.

Tössykkä [13.03.2006 18:20:21]

#

Hmm... onkohan tässä origo siis vasemmassa alakulmassa kuvaruutua?

sooda [13.03.2006 18:43:37]

#

Vasemmalla ylhäällä. Ja tuossa mainitsemassasi tilassa näyttömuistihan alkaa siis osoitteesta 0xa000.

Tössykkä [13.03.2006 18:47:30]

#

Jos koordinaatti (50,75) tulee kaavalla 320x75+50, niin eikös sitä lähtä tällöin liikenteeseen vasemmasta alakulmasta?

sooda [13.03.2006 18:53:05]

#

Ei, ku pikselit on siellä muistissa "jonossa", 320 pikseliä (0..319) on ensin, ja sitten seuraavan rivin 320 pikseliä (320..639) jne. Esim. toisen rivin pikseli on siis 320*1+0 (alkaa nollasta, 1 on toinen rivi), eli 320.

Tössykkä [14.03.2006 14:28:41]

#

Assuming that the start of the video memory (video segment) is contained in ES and the address of the coordinate (70,13) is in DI and that the video mode has been set up to mode 13h, how do you change the colour of the pixel in 70,13 to white?

Yks rivi koodia vaaditaan :/

tejeez [14.03.2006 15:07:50]

#

sooda kirjoitti:

Vasemmalla ylhäällä. Ja tuossa mainitsemassasi tilassa näyttömuistihan alkaa siis osoitteesta 0xa000.

Itseasiassa osoitteesta 0xA0000, SEGMENTISTÄ 0xA000. Osoite on 0x10 * segmentti + offset.

Kysymykseen varmaankin vastaus olisi mov [ES:DI],15 olettaen, että väri 15 on valkoinen.

Tössykkä [14.03.2006 16:45:22]

#

Complete the following subroutine called Drawpaddle so that it does the following:

* Writes the contents of the register BL (one byte) to the the memory locations listed below. BL is therefor a parameter to the subroutine. BallCoord, on the other hand, is a variable.
o Locations:
o [es:BallCoord]
o [es:BallCoord+320]
o [es:BallCoord+640]
o [es:BallCoord+960]
o [es:BallCoord+1280]
* The value of registers CX and DI must be the same at the end of the subroutine as they were in the beginning of the subroutine. Namely, the subroutine must not interfere with possible important values of the main program found in these registers. Additionally, those two are the only registers you're allowed to use.

030 Drawpaddle:
031 ?
032 ?
033 MOV WORD DI, [BallCoord]
034 ?
035 .loopthis:
036 ?
037 ?
038 LOOP .loopthis
039 ?
03A ?
03B RET


Kokeilin seuraavaa:

031 push cx
032 push di
034 mov cx, 4
036 mov byte [di: BallCoord], bl
037 add [di:BallCoord], 320
039 pop di
03A pop cx

ei toimi. Jos jaksatte vastata, niin aloittelija ottaa mielellään neuvoja vastaan.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta