Programowanie w języku Pascal » FAQ

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

  • 1 komentarz
  • 933 odsłony
  • Oceń ten tekst jako pierwszy
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:120*y+x*2]:=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:
120*y+x*2

Ad4
mem[$B800:120*y+x*2+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.

1 komentarz

AnteQ 2007-07-05 18:06

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:
<quote>3        truskawkowy
[...]
11        jasnotruskawkowy
</quote>Powiedz mi, czy zielono-niebieski (TURKUSOWY) kolor jest podobny do koloru truskawek? Taki śmieszny, mały błędzik :D.
<quote>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.
</quote>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 :)