Saako 'turbo'pascalin vakiokirjastoilla mietenkään tietoa ruudulta? Käytössä on tekstitila, grafiikkatilassa se onnistuisikin helpommin. Siis joku juttu,jolla saisi tietoa esimerkiksi siitä, minkä värinen ruutu on jossain kohdassa, tai mikä merkki tietyssä kohdassa on.
Turbo Pascal on DOS-kääntäjä, joten kaikki on mahdollista. Muisti (1 megatavu kai) löytyy taulukosta nimeltä Mem (array of Byte), ja tietty kohta löytyy heksalukujen avulla näin:
var Ala, Yla: Word; begin Ala := $ff (* $ff = 255 *) Yla := $1000 (* $1000 = 4096 *) Mem[Yla : Ala] := 1; { $1000 : $ff = $10 * $1000 + $ff eli = $100ff Näyttömuisti alkaa kai kohdasta $A000 : $0000, en ole varma. Kokeilemalla selviää, mitä sieltä löytyy. Kirjoittamalla sinne jotakin voi saada ruudulle kaikkea mielenkiintoista. } end.
Oliskohan seuraavista proseduureista mitään apua?
Käsittääkseni näyttömuisti alkaa kohdasta $B800 - merkkitilassa.
const nm=$b800; procedure xwrite(x,y:byte); var n :byte; begin n:=mem[nm:(x+80*(y-1))*2-1]; {väri kohdassa x,y} mem[nm:(x+80*(y-1))*2-1]:=(n and 15) * 16+(n div 16); end; function nayttoluku(x,y:byte):byte; begin nayttoluku:=(mem[nm:(x+80*(y-1))*2-2]) and 255 end;
10 vuotta sitten tehty koodi, mutta toiminneen VGA-tilassa.
(Pascalille olisi oma kooditagikin... Sen voisi lisätä ohjeisiin.) Merkkitilojakin on useampia erilaisia, joten ei tuokaan ihan yleispätevä ole. Ja tuo alkamiskohtahan on konkreettisesti $B8000, koska ensimmäistä lukua siirretään heksakymmenellä eli kuudellatoista. Ei millään pahalla, mutta on aika sekavasti kirjoitettu koodinpätkä :) Mutta toimii tosiaan ainakin tavallisimmalla tekstitilalla, ja tuota on helppo soveltaa.
No käytännössä aloitussegmentti on juuri $B800. Se on tekstitiloissa 0, 1, 2 ja 3. Poikkeus on tila 7, jossa aloitussegmentti on $B000.
Kiitoksia, pitää kokeilla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.