Miten toteutetaan kaksoispuskurointi mode 13h:ssa assemblyllä(dos)?
Pitääkö varata iso taulukko(64000 tavua) ja sijoittaa värit ensin taulukkoon, josta sitten koko homma kopioidaan näyttömuistiin.
Mitenhän saa hidastettua ohjelmaa helposti, kun tuntuu nuo asseblyllä tehdyt ohjelmat pyörivän niin nopeasti nykyisillä koneilla. Toimii ne kyllä nopeasti vanhemmillakin :)
No per... Miksihän en saa varattua 64000 tavun taulukkoa?
puskuri db 64000 dup(0)
Hiemankin suuremmille buffereilla kannattaa muisti varata hieman eri tavalla.. eli käyttämällä DOS muistinvaraus funktiota: http://members.tripod.com/~oldboard/assembly/
Eli jotain tämän tyylistä:
mov ah, 48h mov bx, 1000h int 21h mov es, ax ; tehdään jotain.. ; sitten flipataan, voi hoitaa rep movsb/w/d:llä tai simppelillä loopilla.. kirjotain esimerkin tästä myöhemmin nyt on kiire.. mov ah, 49h int 21h
Pitääkin yrittää. Onko muuten Assemblyssä(dos) muita ehtolauseita, kuten basiceissa IF, ELSE, THEN? No pärjää noilla CMP:in jälkeen käytettävillä JA,JB,JE jne silti hyvin.
Täytyy sanoa, että noilla saa kyllä ohjelman näyttämään ihan sillisalaatilta.
Tuollaisia "hienouksia" ei perinteisestä assemblystä taida löytyä, mutta joissakin uudemmissa assemblereissä, kuten MASMissa, niiden tapaisten rakenteiden käyttö on mahdollista.
MASMista löytyy muutama makro jotka mahdollistavat (näennäisesti) korkean tason koodin kirjoittamisen. Näitä ovat muun muassa .IF/.ELSEIF/.ELSE/.ENDIF. Esim:
.if ax==1 ; tee jotain .else ; tee jotain muuta .endif
Assemblerin tehtävä on sitten konvertoida nuo CMP:ksi, TEST:ksi, AND:ksi, OR:iks, hypyiksi jne. Kannattaa tapauskohtaisesti miettiä milloin näitä kannattaa käyttää ja milloin ei (tuotetun binäärin kokoonhan nämä eivät vaikuta, jos niitä osaa käyttää). Koodia niillä kyllä saa kivasti selvennettyä.
Jos sinulla on MASM32 niin \masm32\HELP\MASM32.HLP tiedostosta löytyy nuo makrot selitettyinä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.