Jak wyświetlić znak na ekranie. Czyli dostęp do pamięci ekranu

musio

Tutaj znajduje się procedurka do wyświetlania znaków którą zaraz omówię:

procedure znak (x,y:word;znak:char;kolznak:byte;koltla:byte;miganie:byte); {1}
var atrybut:byte;
begin
asm  {2}
mov [atrybut],0

shr [miganie],1
adc [atrybut],0
shl [atrybut],1

shl [koltla],1
shl [koltla],1
shl [koltla],1
shl [koltla],1
shl [koltla],1
shl [koltla],1
adc [atrybut],0
shl [atrybut],1

shl [koltla],1
adc [atrybut],0
shl [atrybut],1

shl [koltla],1
adc [atrybut],0
shl [atrybut],1

shl [kolznak],1
shl [kolznak],1
shl [kolznak],1
shl [kolznak],1
shl [kolznak],1
adc [atrybut],0
shl [atrybut],1

shl [kolznak],1
adc [atrybut],0
shl [atrybut],1

shl [kolznak],1
adc [atrybut],0
shl [atrybut],1

shl [kolznak],1
adc [atrybut],0
end;
mem[$B800:120*y+x*2]:=ord (znak); {3}
mem[$B800:120*y+x*2+1]:=atrybut; {4}
end;

Ad1
Jest to procedura do wyświetlania znaków.
x,y to pozycja na ekranie
znak to znak do wyświetlenia
kolznak to kolor o jakim ma być znak (0-15)
koltla to kolor tla jaki ma mieć znak (0-7)
miganie (albo 0 albo 1) oznacza czy znak ma sobie migać czy nie (na niektórych kartach niedziała a wtedy mamy 16 kolorów tła)

Ad2
Jest to procedurka która łączy: kolor znaku, tła oraz miganie w jeden atrybut o rozmiarze jednego bajtu. (Pamięć ekranu to nie tylko znaki ale też atrybuty tych znaków. Kolor znaku w tym bajcie zajmuje bity od 0 do 3, kolor tła od 4 do 6 i miganie ostatni bit.
Działą ona tak, że po instrukcji shl [miganie],1 wartość zmiennej miganie przechodzi do CF (carry flag) a po instrukcji adc [atrybut],0 do zmiennej [atrybut], zostaje dodana wartość CF plus 0.
Tak samo z innymi zmiennymi.

Ad3
mem[$B800:120y+x2]:=ord(znak)
Pamięć akranu zaczyna się w 0B800h i zajmuje 4000 bajtów w trybie 25X80. 2000 bajtów przeznaczone jest na znaki a pozostałe 2000 na ich atrybuty.
Jest tak:
b800:0000 - znak 1 (w lewym górnym rogu)
b800:0001 - atrybut znaku 1
A więc aby obliczyć pozycję na ekranie trzeb awykonać to działanie:
120y+x2

Ad4
mem[$B800:120y+x2+1]:=atrybut;
A tutaj obliczamy pozycję w pamięci dla atrybutu

No i tyle. Tutaj można zobaczyć kolory i ich numery:
WARTOŚĆ KOLOR
0 czarny
1 niebieski
2 zielony
3 truskawkowy
4 czerwony
5 karmazynowy
6 brązowy
7 jasnoszary
8 ciemnoszary
9 jasnoniebieski
10 jasnozielony
11 jasnotruskawkowy
12 jasnoczerwony
13 jasnokarmazynowy
14 żółty
15 biały

PS. Jeśli coś z tego co napisałem ty zrozumiałeś to chyba jesteś dobry. Bo ja nigdy nie umiałem pisać artykułów lub czego w tym stylu.

FAQ

1 komentarz

A więc mam zastrzeżenia do:

miganie:byte

Można to zrobić 'booleanem' (nie trzeba, ale moja upierdliwość nie zna granic ;) Jak komu wygodnie).
Sprawa druga:

3 truskawkowy
[...]
11 jasnotruskawkowy
Powiedz mi, czy zielono-niebieski (TURKUSOWY) kolor jest podobny do koloru truskawek? Taki śmieszny, mały błędzik :D.

PS. Jeśli coś z tego co napisałem ty zrozumiałeś to chyba jesteś dobry. Bo ja nigdy nie umiałem pisać artykułów lub czego w tym stylu.
Spokojnie, spokojnie. Artykuł wg mnie w skali od 0 do 10 dostał by z 8+. Co prawda jest parę blędów (głównie ort.), ale wszystko wytłumaczone jest bardzo starannie i zwięźle, a to też jest ważne. Większości osób nie chce się czytać artykułów o wielkości najnowszej książki o Harrym Potterze :)