Komputery z Z80 > AMSTRAD

Tricki na Amstradzie

<< < (2/28) > >>

ZbyniuR:
W Amstradzie można wyświetlić dowolny obszar pamięci. Zmienia się go modyfikując w CRTC rejestr 12 (starszy bajt adresu nowej pamięci ekranu) a w rej.13 młodszy bajt, który zwykle zostawiamy na zero. Wtedy wyświetla 16 KB pamięci poczynając od podanego adresu. Domyślna pamięć ekranu zaczyna się od szesnastkowo &C000, a np polecenia OUT &BC00,12:OUT &BD00,&10 przełączy obszar pamięci wysyłanej na ekran na &4000. Natomiast OUT &BC00,12:OUT &BD00,&30 przywróci stan normalny. A 2gi parametr się nie pokrywa z adresem pamięci z punktu widzenia procesora bo CRTC widzi bloki pamięci w jakiejś innej kolejności, nie wiem czemu.  Jeśli przygotujesz sobie odpowiednio dwa obrazki i umieścisz pod tymi adresami i dopiszesz procedurkę w kodzie maszynowym (ot raptem kilkanaście bajtów) która nimi "miga" to powstaną kolorowsze obrazki tzn 10 kolorowy w trybie 4 kolorowym lub 136kol w trybie 16kol. Skoro "zmieszanie" np koloru 4 z 7 da taki sam kolor pośredni co zmieszanie kol 7 z 4 to więcej kombinacji się nie da. ;) Basic raczej nie będzie migał dość szybko, no chyba że na emulatorze przestawionym na kilkaset % prędkości. Zresztą trudniej przygotować takie obrazki niż sprawić by tak mrugały. hehe :D

A skoro już mowa o dwóch ekranach wpisując w 6128 - POKE &B7C6,&40  komputer zaczyna wszystkie polecenia do rysowania linii i wyświetlania tekstów wykonywać na pamięci ekranu od &4000, wpisując tam &C0 przywraca standardowy obszar pamięci. (W modelu 464 adresem tego POKE jest &B1CB) Ten POKE w kombinacji z tymi OUT-ami powyżej, daje możliwość przełączania dwóch ekranów tak by w chwili gdy wyświetla jeden z nich rysował sobie klatkę animki na drugim z nich, po czym wyświetla nowo narysowaną a na poprzednim ekranie w czasie gdy tworzy już kolejną klatkę na ekranie w danej chwili schowanej. Był o tym artykuł ANIMACJA w Bajtku 5/6-1986 niestety z błędami. Może pewnego pięknego dnia zechce mi się go poprawić i tu wstawić .dsk
A gdyby do tego jeszcze dodać bloki ramdysku - oczopląs. :D

PS.: Chyba jednak można to jakoś modyfikować w Spectrumie bo czytałem coś o programowych trybach graficznych które mrugają ekranami by tworzyć wrażenie dodatkowych kolorów.

RafalM:
Dzięki :)


--- Cytuj ---PS.: Chyba jednak można to jakoś modyfikować w Spectrumie bo czytałem coś o programowych trybach graficznych które mrugają ekranami by tworzyć wrażenie dodatkowych kolorów.
--- Koniec cytatu ---

To trochę inaczej działa. Istotnie w opisanym efekcie co drugą klatkę wysyłamy np raz czerwony atrybut, a raz żółty w efekcie dostając kolor pomarańczowy, mniej lub bardziej migający.

Ale piksele i kolory te są czytane przez ULĘ zawsze spod tych samych adresów pamięci. Czyli nie możemy sobie wskazać na inny obszar pamięci tylko musimy podmienić wartości w sztywno ustalonym obszarze.

Na Spectrum 48 nie ma bata, trzeba przekopiować bajty jeden po drugim, na co między odświeżeniami ekranu jest niestety mało czasu i zrobić cały ekran jest praktycznie niemożliwe

Na modelach ze 128 kB jest myk w postaci stronicowania (paging). Ponieważ procesor Z80 jest w stanie obsłużyć tylko 64 kB adresów to aby móc korzystać z większej pamięci wprowadzono strony. Pisze się instrukcję OUT i całe 16 kB czyli jedna strona zostaje zamieniona przez inną stronę. W ten sposób  możemy łatwo i natychmiast przełączać dwa ekrany ale formalnie w chwili wyświetlania każdy z nich jest pod adresem 16384 :)

ZbyniuR:
Ahaaa :) Ciekawe jest to że 16KB bloki ramdysku w CPC 6128 a także w Atari 130XE. Przełączają się pod ten sam adres co w Spectrum. Może mają podobny scalaczek do zarządzania pamięcią? Nie wiem jak to jest w C128. Tylko że niestety w CPC tak przełączone bloki ramdysku widzi tylko procek a CRTC nie. :(  Możesz sobie tam przełączać co chcesz i Z80 widzi tam ten blok który przełączysz ale CRTC potrafi wyświetlać obraz tylko z podstawowych 64KB.

Ale nie płaczmy, tylko się bawmy. :) Komenda która przełącza blok pamięci 16KB zaczynający się od &4000 (lub 16384 jak ktoś woli), to OUT &7F00,192  <- ten ostatni numerek to standardowy blok. A ramdysk w 6128 to 4 bloki o numerach od 204 do 207. Ot i tyle. :)

Aha po podłączeniu standardowego rozszerzenia o 64KB (często kupowanego przez posiadaczy CPC464) dodatkowe bloki są pod numerami od 196 do 199, czyli innymi niż ramdysk w 6128, jednak 6128 też je będzie widział pod tymi samymi nr co w 464. Niestety na tak rozszerzonym 464 nie pójdzie większość programów które wymagają 128KB ramu właśnie z powodu tych innych nr bloków.

Są też rozszerzenia o 256KB które oba kompy (tzn 464 i 6128) widzą tak samo, bo w tym drugim wewnętrzny ramdysk jest wtedy niewidoczny. Można podłączyć takie dwa, co w sumie da 572KB RAMu. W takiej pamięci część dalszych bloków ma takie same nr jak te wewnętrzne w 6128 więc w 464 wraz ze stacją dysków, większość softu z 6128 powinna chodzić z wyjątkiem Basiców które używają którąś z nowych komend ze 6128. Większe rozszerzenia np o 4MB wymagają innego scalaczka do zarządzania RAMem. Może trudno je kupić ale w emulatorze się je ustawia suwaczkiem ot tak. ;)

Wszystkie powyższe uwagi o 464 prócz wersji Basica dotyczą tak samo modelu 664 oraz 464+, a te o 6128 dotyczą też 6128+. Standardowy blok przywraca OUT &7F00,192  A nr banku (w rozszerzeniu o 512KB) liczone od 0 do 31 oblicza wzór: OUT &7F00,196+(nrbanku AND 3)+(nrbanku AND 28)*2: Z czego standardowe wewnętrzne w 6128 to banki od 4 do 7.

PS.: Najszybszą znaną mi metodą przenoszenia bloku pamięci jest rozkaz ldir w asemblerze Z80. Jeśli nie kojarzysz to mogę wyjaśnić. :)

matofesi:
LDIR nie jest w żadnym wypadku najszybszą metodą przenoszenia danych. Jest metodą najprostszą, ale ma na tyle duże narzuty, że choćby dobrze skonstruowana pętla z ciągiem kilkudziesięciu LDI będzie sporo szybsza.

Zresztą jak poprosisz to RafalM ci poopwiada więcej na ten temat ;)

Tygrys:
Jakbym bazował na LDI to Dziurak by nie powstał ;) Ale o tym, tzn o przenoszeniu blokow pamięci, będzie artykuł, tzn jest w moim TODO.

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

[*] Poprzednia strona

Idź do wersji pełnej