Autor Wątek: Asembler Z80 od zera do kodera  (Przeczytany 18184 razy)

LaPi

  • *
  • Wiadomości: 24
Asembler Z80 od zera do kodera
« dnia: 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. 

Dalthon

  • ****
  • Wiadomości: 428
  • Miejsce pobytu:
    TriCity
Odp: Asembler Z80 od zera do kodera
« Odpowiedź #1 dnia: 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!
ZX Spectrum +2 Grey | Just Speccy 128 | ZX Spectrum Next | ZX-Uno 2MB |  Murmulator | Amstrad 6128 | MSX2 Philips VG-8235 | Commodore 64 | Commodore +4 | Atari 520 STF | Amiga 1200

Skinner

  • ****
  • Wiadomości: 367
  • Miejsce pobytu:
    Wlkp PL
Odp: Asembler Z80 od zera do kodera
« Odpowiedź #2 dnia: 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
2x 48k+, +2, HQ48 (under construction)

ZX Freeq

  • *****
  • Wiadomości: 1833
  • Miejsce pobytu:
    Warszawa
Odp: Asembler Z80 od zera do kodera
« Odpowiedź #3 dnia: 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?

ZX80|ZX81+16kB+PandAY|ZX 48k/+/128k+/+2/+2A/+3/Vega/Next|QL+QIDE|JS128|Timex 2048+2040|UK2086|FDD3000+3.5''|AY|ZX HD|Divide2k11/2k14|DivMMC/PicoDivSD|BetaDisk 128|Opus|Masakrator FM|If 1/2/Microdrv|Multiface 1|+2A\B SDI-1|SJS 1/2|ZX Printer|TZXDuino|+3 HxC USB|ZXUno|Omni
Z88|A500/600|PC200|Ent128

Dalthon

  • ****
  • Wiadomości: 428
  • Miejsce pobytu:
    TriCity
Odp: Asembler Z80 od zera do kodera
« Odpowiedź #4 dnia: 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 :)
ZX Spectrum +2 Grey | Just Speccy 128 | ZX Spectrum Next | ZX-Uno 2MB |  Murmulator | Amstrad 6128 | MSX2 Philips VG-8235 | Commodore 64 | Commodore +4 | Atari 520 STF | Amiga 1200

Ilyad

  • *****
  • Wiadomości: 580
  • Miejsce pobytu:
    Białystok, IV Rzesza Pospolita
Odp: Asembler Z80 od zera do kodera
« Odpowiedź #5 dnia: 2019.06.05, 13:41:35 »
Dalthon: Super ! Czekamy
ZX-81, ZX-Pand AY, 48k "gumiak", 48K+, 128K + "Toster", +2 "szarak" 1024k Profi, Masakrator FM, DivIDE 2K11, ZX Evolution rev. C, ZX-Uno, C64, C16 64K, Plus4 + 1541 Ultimate II + SD2IEC

trojacek

  • *****
  • Wiadomości: 6831
  • Miejsce pobytu:
    Warszawa
Odp: Asembler Z80 od zera do kodera
« Odpowiedź #6 dnia: 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).

KWF

  • *****
  • Wiadomości: 6823
  • Miejsce pobytu:
    trzecia planeta od Słońca
  • "I co ja robię tu, u-u, co Ty tutaj robisz ..."
    • Insta do lasownia
Odp: Asembler Z80 od zera do kodera
« Odpowiedź #7 dnia: 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 ;)
KWF
-----
R Tape loading error 0:1
Moje zabawki: https://github.com/McKlaud76

Dalthon

  • ****
  • Wiadomości: 428
  • Miejsce pobytu:
    TriCity
Odp: Asembler Z80 od zera do kodera
« Odpowiedź #8 dnia: 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 ;)
ZX Spectrum +2 Grey | Just Speccy 128 | ZX Spectrum Next | ZX-Uno 2MB |  Murmulator | Amstrad 6128 | MSX2 Philips VG-8235 | Commodore 64 | Commodore +4 | Atari 520 STF | Amiga 1200

LaPi

  • *
  • Wiadomości: 24
Odp: Asembler Z80 od zera do kodera
« Odpowiedź #9 dnia: 2019.06.05, 20:06:43 »
Postanowiłem coś ruszyć z asemblerem i napisałem korzystając ze strony 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?

Phonex

  • *****
  • Wiadomości: 1260
  • Miejsce pobytu:
    Warszawa
Odp: Asembler Z80 od zera do kodera
« Odpowiedź #10 dnia: 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.

KWF

  • *****
  • Wiadomości: 6823
  • Miejsce pobytu:
    trzecia planeta od Słońca
  • "I co ja robię tu, u-u, co Ty tutaj robisz ..."
    • Insta do lasownia
Odp: Asembler Z80 od zera do kodera
« Odpowiedź #11 dnia: 2019.06.05, 20:49:49 »
Wi
Za niski adres ORG!

[...]

Zmień na ORG 32768, to pójdzie.

Ale dlaczego?
KWF
-----
R Tape loading error 0:1
Moje zabawki: https://github.com/McKlaud76

trojacek

  • *****
  • Wiadomości: 6831
  • Miejsce pobytu:
    Warszawa
Odp: Asembler Z80 od zera do kodera
« Odpowiedź #12 dnia: 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).
« Ostatnia zmiana: 2019.06.05, 21:31:00 wysłana przez trojacek »

LaPi

  • *
  • Wiadomości: 24
Odp: Asembler Z80 od zera do kodera
« Odpowiedź #13 dnia: 2019.06.05, 21:11:46 »
Program odpala, komunikatu już nie ma. Ale brak efektu, jest tylko nazwa programu a kwadratów brak.

KWF

  • *****
  • Wiadomości: 6823
  • Miejsce pobytu:
    trzecia planeta od Słońca
  • "I co ja robię tu, u-u, co Ty tutaj robisz ..."
    • Insta do lasownia
Odp: Asembler Z80 od zera do kodera
« Odpowiedź #14 dnia: 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).
KWF
-----
R Tape loading error 0:1
Moje zabawki: https://github.com/McKlaud76