forum speccy.pl
ZX Spectrum => PROGRAMOWANIE => Wątek zaczęty przez: LaPi w 2019.06.05, 10:47:09
-
Witam. Pozwoliłem sobie założyć powyższy temat z nadzieją, że Ci z was, którzy mają doświadczenie, być może znajdą chwilę i podzielą się swoją wiedzą z osobami chcącymi zacząć swoją przygodę i powrócić wspomnieniami do lat 80.
Pod hasłem od zera mam na myśli proste przykłady, które potem samodzielnie można rozwinąć w coś bardziej złożonego.
Nie jestem specem ani też nie mam zupełnie doświadczenia, ale wyobrażam sobie to jako proste przykłady np. jak zapalić piksel na ekranie, jak narysować odcinek, jak wyświetlić tekst w określonym miejscu, itp, itd.
-
Akurat przykłady które podałeś nie należą do najprostszych (najkrótszych)... chyba że wykorzysta się procedury z ROM :)
Ok, przysiądę i naskrobię te trzy procedurki (z opisem) ASAP!
-
Coś się już na podobny temat zaczęło rodzić jakiś czas temu:
https://www.speccy.pl/forum/index.php?topic=5038.0
-
Zacząłbym od poznania rejestrów procesora i rozkładu pamięci w ZX.
bo bez tego
LD A, %10101010
LD HL, 16384
LD (HL), A
nic nie powie :)
Czy w kolejnym numerze Zin80 nie miał się pojawić kurs dla początkujących?
-
LD A, %10101010
LD HL, 16384
LD (HL), A
nic nie powie :)
Jak nic nie powie? ;)
LD A, %10101010 - załaduj liczbę 170 do rejestru A
LD HL, 16384 - załaduj 16384 do pary rejestrów HL (64 do H i 0 do L)
LD (HL), A - zapisz wartość rejestru A do pamięci pod adresem zapisanym w HL (czyli 170 w pamięci pod adresem 16384)
Proste! :D
A tak na serio, to przeredaguję w końcu swoją prezentację z 2019.1 by się nadawała do czytania bez słownego opisu :)
-
Dalthon: Super ! Czekamy
-
jak zapalić piksel na ekranie, jak narysować odcinek, jak wyświetlić tekst w określonym miejscu, itp, itd.
To akurat jest pięknie i krótko opisane w "Tajnikach ZX Spectrum" (leży na ftp-ie).
-
LD A, %10101010 - załaduj liczbę 170 do rejestru A
LD HL, 16384 - załaduj 16384 do pary rejestrów HL (64 do H i 0 do L)
LD (HL), A - zapisz wartość rejestru A do pamięci pod adresem zapisanym w HL (czyli 170 w pamięci pod adresem 16384)
Proste! :D
No dla mnie bardzo dobre wytlumaczenie i na moj prosty rozumek jest to przydlugawy zapis komendy:
POKE 16384, 170
;)
-
No dla mnie bardzo dobre wytlumaczenie i na moj prosty rozumek jest to przydlugawy zapis komendy:
POKE 16384, 170
;)
Ha! Miałem tak napisać na końcu wywodu ale gdzieś mi to uciekło :D
Tylko jak się spojrzy jakie procedury w ROM 'robią' to POKE, to te 3 rozkazy nie są przydługawe ;)
-
Postanowiłem coś ruszyć z asemblerem i napisałem korzystając ze strony http://clrhome.org/asm/ (http://clrhome.org/asm/) taki oto programik
.org 23762
ld hl,22528
ld (hl),0
inc hl
ld (hl),127
inc hl
ld (hl),0
ret
Wszystko działa bez problemu, nawet wiem co i jak. Ale zainstalowałem ZdeVStudio - Z80 i jest problem.
org 23762
ld hl,22528
ld (hl),0
inc hl
ld (hl),127
inc hl
ld (hl),0
ret
Kompiluje to do tap lub do tzx i dostaje komunikat na ekranie "M RAMTOP no good, 10:1.
Są jakieś inne programy do pisania w asemblerze? Z jakich korzystacie najczęściej?
-
Za niski adres ORG!
Pewnie program tworzy w linii 10 CLEAR (org-1), w tym przypadku CLEAR 23761, co jest niewykonalne, i stąd komunikat o złej wartości RAMTOP.
Bezpiecznym i tradycyjnym adresem początku programu jest np. 32768 (o ile nie piszesz pod ZEUSem ;) ).
Zmień na ORG 32768, to pójdzie.
-
Wi
Za niski adres ORG!
[...]
Zmień na ORG 32768, to pójdzie.
Ale dlaczego?
-
Bo obsługa basicowej komendy
LOAD "" wymaga miejsca na stosie?
Oczywiście CLEAR, jak napisał wcześniej Phonex.
Po włączeniu komputera wolny obszar dla Basica zaczyna się od adresu 23755 (o ile nie ma podłączonego Interface 1 lub niektórych interfejsów dyskowych). Wykonanie "ulotnej" (bez numeru linii) komendy LOAD "" zajmuje parę bajtów, ale wczytany blok zawiera linię:
Pewnie program tworzy w linii 10 CLEAR (org-1)
która się w pamięci "zainstaluje" od adresu 23755 do adresu 23755+4+1+5+1+5+1=23772, więc wykonanie komendy CLEAR 23761 byłoby autodestrukcją kodu tej linii.
W rzeczywistości procedura w OM, wykonująca komendę CLEAR nnnnn, sprawdza, czy na kod Basica pozostaje przynajmniej 50 bajtów. To nam daje minimalną wartość dla CLEAR równą 23806. Sprawdzę przy okazji na realnym sprzęcie, czy to się zgadza :)
EDIT: Sprawdziłem, system dolicza jeszcze kilkanaście bajtów na potrzeby kalkulatora. Tak naprawdę musi być 50 bajtów powyżej jego adresu, czyli zmiennej STKEND (23653-23654).
-
Program odpala, komunikatu już nie ma. Ale brak efektu, jest tylko nazwa programu a kwadratów brak.
-
23755+4+1+5+1+5+1=23722,
Jak to policzyłeś ? Mi wychodzi: 23772
Podsumowując. Mając do dyspozycji 48KB RAM, z czego dolne 16KB RAM zawiera pamięć ekranu i atrybutów, zmienne systemowe oraz kilka innych drobiazgów (pomijam, że ta pamięć jest też dzielona pomiędzy ULA'e i CPU), dla początkujących dobrze jest umieścić kod maszynowy w górnej pamięci 32KB (od adresu 32768).
-
Literówka :P Już poprawiłem.
-
Program odpala, komunikatu już nie ma. Ale brak efektu, jest tylko nazwa programu a kwadratów brak.
To może pomoże ktoś, kto używa TAP-ów cz TZX-ów - jest jakieś narzędzie pozwalające sensownie podejrzeć zawartość?
-
Program odpala, komunikatu już nie ma. Ale brak efektu, jest tylko nazwa programu a kwadratów brak.
A jak po załadowaniu wydasz polecenie RANDOMIZE USR 32768 ?
-
No dla mnie bardzo dobre wytlumaczenie i na moj prosty rozumek jest to przydlugawy zapis komendy:
POKE 16384, 170
;)
Niby tak, ale to już BASIC właściwie ;)
@LaPi - pokaż TAPa.
-
Problem rozwiązany:)
org 32768
ld hl, 22528
ld(hl),0
inc hl
ld(hl), 127
inc hl
ld (hl),0
ret
end 32768
Ten kompiluje się i działa poprawnie. Czas na naukę pętli.
-
Program odpala, komunikatu już nie ma. Ale brak efektu, jest tylko nazwa programu a kwadratów brak.
To może pomoże ktoś, kto używa TAP-ów cz TZX-ów - jest jakieś narzędzie pozwalające sensownie podejrzeć zawartość?
jest cały zestaw programów od autora ZX Paintbrusha. Bodajże ZX Blockeditor to pozwala.