forum speccy.pl

ZX Spectrum => PROGRAMOWANIE => Wątek zaczęty przez: LaPi w 2019.06.05, 10:47:09

Tytuł: Asembler Z80 od zera do kodera
Wiadomość wysłana 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. 
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: Dalthon w 2019.06.05, 12:27:28
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!
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: Skinner w 2019.06.05, 12:34:59
Coś się już na podobny temat zaczęło rodzić jakiś czas temu:

https://www.speccy.pl/forum/index.php?topic=5038.0
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: ZX Freeq w 2019.06.05, 13:02:30
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?

Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: Dalthon w 2019.06.05, 13:31:41
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 :)
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: Ilyad w 2019.06.05, 13:41:35
Dalthon: Super ! Czekamy
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: trojacek w 2019.06.05, 14:11:55
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).
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: Klaud w 2019.06.05, 17:44:07

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 ;)
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: Dalthon w 2019.06.05, 18:47:54
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 ;)
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: LaPi w 2019.06.05, 20:06:43
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?
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: Phonex w 2019.06.05, 20:34:29
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.
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: Klaud w 2019.06.05, 20:49:49
Wi
Za niski adres ORG!

[...]

Zmień na ORG 32768, to pójdzie.

Ale dlaczego?
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: trojacek w 2019.06.05, 20:54:38
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).
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: LaPi w 2019.06.05, 21:11:46
Program odpala, komunikatu już nie ma. Ale brak efektu, jest tylko nazwa programu a kwadratów brak.
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: Klaud w 2019.06.05, 21:28:05
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).
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: trojacek w 2019.06.05, 21:30:17
Literówka :P Już poprawiłem.
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: trojacek w 2019.06.05, 21:33:37
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ść?
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: steev w 2019.06.05, 22:30:16
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 ?
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: ZX Freeq w 2019.06.05, 23:28:21

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.
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: LaPi w 2019.06.06, 16:18:50
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.
Tytuł: Odp: Asembler Z80 od zera do kodera
Wiadomość wysłana przez: tooloud w 2020.06.24, 14:34:42
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.