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.
Tuossa tilassa näyttömuisti kulkee lineaarisesti eli sen osoite on kutakuinkin 320x75+50=23050
Plus tietenkin tuon näyttömuistin alkukohta.
320x75+50 = 24050, mutta kiitoksia kumminkin. Auttoi mukavasti.
Hmm... onkohan tässä origo siis vasemmassa alakulmassa kuvaruutua?
Vasemmalla ylhäällä. Ja tuossa mainitsemassasi tilassa näyttömuistihan alkaa siis osoitteesta 0xa000.
Jos koordinaatti (50,75) tulee kaavalla 320x75+50, niin eikös sitä lähtä tällöin liikenteeseen vasemmasta alakulmasta?
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.
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 :/
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.