Autor Wątek: Kurs programowania w asm (dla ZX na początek)...  (Przeczytany 48433 razy)

Dalthon

  • ****
  • Wiadomości: 428
  • Miejsce pobytu:
    TriCity
Odp: Kurs programowania w asm (dla ZX na początek)...
« Odpowiedź #75 dnia: 2019.06.08, 14:45:18 »
Nie byłem pewien czy można zrobić inc A, a nie zajrzałem do książki.
Muszę ASAP przeredagować/uzupełnić prezentacje z 2019.1 - tam właśnie są wszystkie (?) niezbędne informacje o podstawach.
Poza tym zawsze można użyć komendy i przy kompilacji się dowiedzieć czy jest ona prawidłowa czy też nie ;)

Jak widać taki trywialny problem można rozwiązać na wiele sposobów, wszystko zależy od konkretnych potrzeb i wiedzy programisty.
Praktycznie każdą rzecz (dłuższą niż 10 rozkazów) można napisać na wiele sposobów. Początkującym proponowałbym pisać jak najprościej - na optymalizację kodu przyjdzie czas (czyt. jak się opanuje wszystko inne). I przychodzi to samo z czasem (czyt. dupogodziny z asm ;) )

Inna sprawa że warto korzystać ze sprawdzonych wzorów - procedurki które znajdziesz w tym dziale (nie mówię o tym wątku) są z reguły szybkie, krótkie i na bank działają. Nie ma sensu wyważać otwartych już przez kogoś innego drzwi - lepiej się skupić na innych drzwiach: na swoich pomysłach :)

Kolejna uwaga: XOR a - zeruje akumulator, bo funkcja XOR zeruje te bity, które są jednakowe, a "a XOR a"... chyba logiczne? :)
Sam jak piszę tutaj LD a,0 to wydaje mi się to dziwne - od "zawsze" używałem XOR A (zajmuje to 1 bajt zamiast 2;) ) ale tutaj mamy początkujących, nie mieszajmy im w głowach :D :D :D
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

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Kurs programowania w asm (dla ZX na początek)...
« Odpowiedź #76 dnia: 2019.06.08, 15:54:49 »
Cytuj

    Jak widać taki trywialny problem można rozwiązać na wiele sposobów, wszystko zależy od konkretnych potrzeb i wiedzy programisty.

Cytuj
Praktycznie każdą rzecz (dłuższą niż 10 rozkazów) można napisać na wiele sposobów. Początkującym proponowałbym pisać jak najprościej - na optymalizację kodu przyjdzie czas (czyt. jak się opanuje wszystko inne). I przychodzi to samo z czasem (czyt. dupogodziny z asm ;) )



Piszący musi przede wszystkim rozumieć co pisze,
taki kod zwykle nie jest optymalny.
Wręcz przeciwnie bywa pokrętny i rozbudowany.
Do prostoty zwykle mu daleko.

Konieczne są też komentarze, bo na drugi dzień możemy już nie wiedzieć co mieliśmy na myśli.

ZX81/ZX 48k/Zx48k+/ZX +2/ZX +2A/+3/TC2048/FDD3000/FDD5000/3"/3,5'/5,25'/Beta 48k Apina/D+/GP50s/DIVIDE CF/Masterface/Polbasic SamCoupe QL CPC6128/N100 MSX-SVI738  MSX2-VG8235

Phonex

  • *****
  • Wiadomości: 1261
  • Miejsce pobytu:
    Warszawa
Odp: Kurs programowania w asm (dla ZX na początek)...
« Odpowiedź #77 dnia: 2019.06.08, 16:08:14 »
Kolejna uwaga: XOR a - zeruje akumulator, bo funkcja XOR zeruje te bity, które są jednakowe, a "a XOR a"... chyba logiczne? :)
Sam jak piszę tutaj LD a,0 to wydaje mi się to dziwne - od "zawsze" używałem XOR A (zajmuje to 1 bajt zamiast 2;) ) ale tutaj mamy początkujących, nie mieszajmy im w głowach :D :D :D
Haha, XOR A podpowiedział mi kiedyś Bill Gilbert. Przedtem też pisałem LD A,0 jak ustawa przewiduje ;D
A potem kupiłem na giełdzie xero "The Complete Spectrum ROM Disassembly" i tam pełno jest takich skrótów...

Sir David

  • ****
  • Wiadomości: 391
  • Miejsce pobytu:
    Białystok
Odp: Kurs programowania w asm (dla ZX na początek)...
« Odpowiedź #78 dnia: 2019.06.08, 16:14:47 »
Jeszcze tylko mała uwaga do tego:

Przy zbyt małym opóźnieniu czerwony pas się nie pojawia w ogóle

W rzeczywistości czerwony pas (raczej już pasek) się pojawia, ale poza obszarem widocznym na ekranie monitora. Cała generowana przez komputer ramka jest nieco większa niż to, co widać. Oczywiście tak samo na dole i na bokach.

Dalthon

  • ****
  • Wiadomości: 428
  • Miejsce pobytu:
    TriCity
Odp: Kurs programowania w asm (dla ZX na początek)...
« Odpowiedź #79 dnia: 2019.06.08, 17:33:53 »
Piszący musi przede wszystkim rozumieć co pisze, taki kod zwykle nie jest optymalny.
Wręcz przeciwnie bywa pokrętny i rozbudowany.
Jedno nie wyklucza drugiego - tutaj skupiam(y) się na nauce podstaw, kod nie musi być optymalny - ma działać i piszący musi (sic!) wiedzieć dlaczego. Jak nie wie, to jest właśnie miejsce by się o to zapytać.
Skracać kod to można jak on działa lub/i się jest bardziej zaawansowanym w programowaniu z80. Kod z80 niewiele pamięci zajmuje, więc jego rozbudowanie nie jest problemem (na początku). Lepiej skupić się na zamierzonym działaniu a potem udoskonalać kod. Poza tym każdy kod można (no dobra - prawie każdy) poprawić - sam patrze na swoje źródła z przed roku i zastanawiam się po co pisałem to "na około" jak można prościej :P

Do prostoty zwykle mu daleko.
On ma być prosty dla osoby piszącej - jak działa, nikogo nie obchodzi "jak to jest zrobione" :) Często, gęsto nie ma sensu poprawiać kodu - no chyba że pisze się 256b intro lub też brakuje pamięci. Ale jak już wspominałem - tutaj się uczymy. Pisanie 256b jest zajebistym zajęciem i wyzwaniem, ale poza pomysłem (który w sumie jak zawsze jest najważniejszy), potrzebne jest 'obycie' w kodzie....

Konieczne są też komentarze, bo na drugi dzień możemy już nie wiedzieć co mieliśmy na myśli.
Nigdy nie zaszkodzą - ba! nawet pomogą. Tylko że im bardziej skomplikowany kod tym bardziej opis powinien być szczegółowy a nikt tego nie robi :) Sam jak wracam do swojego kodu "z przed miesiąca", dłuższy czas zajmuje mi ogarnięcie "co i jak". I to jest normalne (dla starych ludzi? ;) ) i nie ma sensu z tym walczyć.

Przy zbyt małym opóźnieniu czerwony pas się nie pojawia w ogóle
I jak już SirD napisał - należy się cieszyć bo jest na tyle mały (czyli procedura szybka) że go nie widać. Sprawdzanie jaka jest szybkość działania ma praktycznie sens tylko wtedy gdy efekt nie wygląda na płynny albo zdarzają się 'przycięcia'. Jak jest ok, lepiej nie wiedzieć że nie mieści się w ramce :D

A propo's nie mieszczenia się w ramce:

Przy zbyt dużym, następuje desynchronizacja i border miga.
To nie jest desynchronizacja, to jak już też SirD wspominał: efekt nie mieści się w ramce i stąd to miganie.
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: Kurs programowania w asm (dla ZX na początek)...
« Odpowiedź #80 dnia: 2019.06.10, 13:18:15 »
Super, program z wyświetlaniem punktów bardzo cenny dla mnie początkującego. A w jaki sposób wyświetlić wynik np. dodawania dwóch liczb, stan liczbowy rejestru, itp?

trojacek

  • *****
  • Wiadomości: 6846
  • Miejsce pobytu:
    Warszawa
Odp: Kurs programowania w asm (dla ZX na początek)...
« Odpowiedź #81 dnia: 2019.06.10, 13:42:13 »
Wydruk liczby (0-9999):

LD BC, 1234
CALL 6683

Liczby 0..255 można drukować tak samo, ładujemy liczbę do C, a do B zero.
Większe liczby oraz ułamki najwygodniej jest drukować przez stos kalkulatora. Ale to raczej nie jest temat dla początkujących.
Można też liczbę dzielić przez 10 i część całkowitą wyrzucać na ekran przez RST 16, a resztę dalej dzielić itp. Ale to też nie jest zbyt proste :)

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Kurs programowania w asm (dla ZX na początek)...
« Odpowiedź #82 dnia: 2019.06.11, 15:19:29 »
Przez weekend wyprodukowałem kawałek kodu i stanąłem w jednym miejscu.
Może ktoś wpadnie co z tym zrobić.
Kodu jest sporo ale myślę że jest w miarę czytelny.

Tu jest podprogram który nie spełnia swojego zadania
Cytuj
kasuj
;kasowanie poprzedniej pozycji
ld hl,16384
ld bc,(50010)
add hl,bc
ld a,(hl)
ld hl,16384
add hl,bc
ld (hl),a
ret
calosc w zalaczniku

sterowanie klawiszami O, P
ZX81/ZX 48k/Zx48k+/ZX +2/ZX +2A/+3/TC2048/FDD3000/FDD5000/3"/3,5'/5,25'/Beta 48k Apina/D+/GP50s/DIVIDE CF/Masterface/Polbasic SamCoupe QL CPC6128/N100 MSX-SVI738  MSX2-VG8235

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Kurs programowania w asm (dla ZX na początek)...
« Odpowiedź #83 dnia: 2019.06.11, 15:31:39 »
A co ten kod ma właściwie robić? Bo robi tak... ładuje do HL początek ekranu, do BC jak rozumiem jakieś przesunięcie, potem dodaje jedno do drugiego i pobiera stamtąd bajt. Następnie jeszcze raz dodaje to samo przesunięcie do tego samego początku ekranu i odkłada w to samo miejsce wcześniej pobrany bajt.

Dalthon

  • ****
  • Wiadomości: 428
  • Miejsce pobytu:
    TriCity
Odp: Kurs programowania w asm (dla ZX na początek)...
« Odpowiedź #84 dnia: 2019.06.11, 15:50:05 »
Ok, doszedłem jak to działa i dlaczego nie ;)

kasuj
ld hl,16384
ld a,(50011)
ld b,0
ld c,a
add hl,bc
ld (hl),0
ld hl,16384
ld a,(50001)
ld c,a
add hl,bc
ld a,(50000)
ld (hl),a
ret
« Ostatnia zmiana: 2019.06.11, 17:31:59 wysłana przez Dalthon »
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

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Kurs programowania w asm (dla ZX na początek)...
« Odpowiedź #85 dnia: 2019.06.11, 15:52:58 »
To trzeba zobaczyć w całości, tak bedzie trudno wytłumaczyc.

Ten podprogram pobiera bajt z 50001 w zapisuje do pamieci ekranu.
Robi to, ale co 8 kroków jest błąd.
Pod 50000 jest bieząca pozycja, pod 50001 pozycja jeden krok wstecz.
ZX81/ZX 48k/Zx48k+/ZX +2/ZX +2A/+3/TC2048/FDD3000/FDD5000/3"/3,5'/5,25'/Beta 48k Apina/D+/GP50s/DIVIDE CF/Masterface/Polbasic SamCoupe QL CPC6128/N100 MSX-SVI738  MSX2-VG8235

rubikus

  • ****
  • Wiadomości: 282
Odp: Kurs programowania w asm (dla ZX na początek)...
« Odpowiedź #86 dnia: 2019.06.11, 15:57:45 »
Przyglądam się kursowi i fajnie, że coś się dzieje. Ja swoją przygodę z assemblerem zacząłem od CA80 będąc w wojsku (jakieś 30 lat wstecz). Były to czasy takie, że pisałem program na kartce, obok
assemblowałem na kod dla proca ręcznie i wpisywałem do ram-u cyferki i literki w HEX i programowałem eprom w dorobionym do CA80 programatorze. Największą skarbnicą wiedzy były książki Pana Gardynika twórcy CA80. Tytuły to: "MIK01-06". Początkującym serdecznie polecam. Pierwsze co zrobiłem to podłączyłem wyświetlacz VFD do CA80 od jakiegoś magnetowidu i wyświetlał zegar (czas, data i cyfra jaka mi została do cywila ;).  Późnij się przesiadłem na systemy 8032 (rodzina `51) i to już była inna bajka.

Dalthon

  • ****
  • Wiadomości: 428
  • Miejsce pobytu:
    TriCity
Odp: Kurs programowania w asm (dla ZX na początek)...
« Odpowiedź #87 dnia: 2019.06.11, 16:51:37 »
To trzeba zobaczyć w całości, tak bedzie trudno wytłumaczyc.
No powyżej podałem poprawną wersję podprogramu.

Ale że to wątek poświęcony nauce, na przykładzie Twojego kodu opowiem o kilku ważnych rzeczach:

1) Tabulatory, tabulatory i jeszcze raz tabulatory! Pisanie wszystkiego od lewego brzegu jest nieczytelne. Nie widać co jest etykietą (i gdzie ona jest) a gdzie są rozkazy.

2) Podprogramy. Duży plus za używanie podprogramów, dzięki temu jest to czytelne dla innych (i dla piszącego po 24 godzinach :P).  Tyle tylko że warto przy każdym CALL dać komentarz co to robi, szczególnie jak nazwa podprogramu jest lakoniczna ;) Komentarzy nigdy nie za dużo - szczególnie na początku drogi z asm.

3) Odstępy. Bardzo fajnie że poszczególne fragmenty kodu oddzielasz wolną linią - to ułatwia nawigację w kodzie. Także oddzielania poszczególnych części ;======================================== jest bardzo dobrym nawykiem.

4) Bezpośrednie adresowanie w pamięci o ile nie jest to ekran nie jest wskazane. Szczególnie jak trzymasz tam tylko dane. Lepiej zmienne umieszczać na końcu kodu:
bajt_old db 0
bajt_new db 0
kolumna_old db 0
kolumna_new db 0
a w samym kodzie zamiast:
ld a,(50000) ;przepisuje zawartosc
ld (50010),a
ld a,(50001) ;Ksb zapamietanie
ld (50011),a
używasz etykiet:
ld a,(bajt_old) ;przepisuje zawartosc
ld (bajt_new),a
ld a,(kolumna_old) ;Ksb zapamietanie
ld (kolumna_new),a
Jest to o wiele czytelniejsze - no i nie grozi pomyłka jak gdzieś wpiszesz zły adres ;) Weź znajdź w 1000 linijek kodu miejsce gdzie zamiast (50001) wpisałeś (50011) :D :D :D

5) Porządek. Pisząc w asm trzeba być dokładnym - jej brak szybko się zemści. Tak więc jak definiujesz początkowe dane, niech one nie będą przypadkowe.
Wartości startowe ustawiłeś na:
ld a,1 ;zawartosc bajtu (1 - kropka)
ld (50000),a ;K młodszy bajt
ld a,1 ;starszy bajt (0-31)
ld (50001),a ;K nr kolumny
co powoduje że punkt na starcie ustawia się 15 pixeli od lewego brzegu ekranu. Nie lepiej zacząć od lewego brzegu?
ld a,128 ;zawartosc bajtu (1 - kropka)
ld (bajt_old),a ;K młodszy bajt
ld a,0 ;starszy bajt (0-31)
ld (50001),a ;K nr kolumny

6)  Szanujmy rejestry. Z80 nie ma ich za dużo więc nie ma sensu używać ich tam gdzie nie trzeba ;)
ld a,(50000)
ld b,a
ld (hl),b ;zapis na ekran
Użycie rejestru B nie ma tu zupełnie sensu, wydłuża czas działania i dodatkowo zaciera obraz całości:
ld a,(50000)
ld (hl),a ;zapis na ekran

7) Ładowanie danych do rejestru/rejestrów. Trzeba zwracać uwagę że czym innym jest LD a,(50000) a ld bc,(50000). I tak:
ld hl,16384
ld bc,(50010)
add hl,bc
powoduje że do rejestru B trafia zawartość pamięci o adresie 50010 a do C - 50011. A nie to chciałeś uzyskać. Prawidłowy kod wygląda następująco:
ld hl,16384
ld a,(50010)
ld b,0
ld c,a
add hl,bc

Ale najważniejsze że program działa! Nie ma znaczenia że robi to trochę "na około" (dlatego do tego się nie przyczepiłem) - najważniejsze że sobie coś wymyśliłeś i to Ci się udało! Nie poddawaj się i pisz dalej - już widać że złapałeś wiatr w żagle i szkoda tego nie pociągnąć dalej! Do Speccy Party 2020.1 jeszcze 10 miesięcy, więc jest szansa że do tego czasu stworzysz swoją produkcję :)
« Ostatnia zmiana: 2019.06.11, 17:38:16 wysłana przez Dalthon »
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

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Kurs programowania w asm (dla ZX na początek)...
« Odpowiedź #88 dnia: 2019.06.11, 17:35:24 »
Wielkie dzięki za poprawienie kodu i cenne uwagi.

Teraz pora na ruch góra, dół.

a potem zobaczymy :)
ZX81/ZX 48k/Zx48k+/ZX +2/ZX +2A/+3/TC2048/FDD3000/FDD5000/3"/3,5'/5,25'/Beta 48k Apina/D+/GP50s/DIVIDE CF/Masterface/Polbasic SamCoupe QL CPC6128/N100 MSX-SVI738  MSX2-VG8235

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Kurs programowania w asm (dla ZX na początek)...
« Odpowiedź #89 dnia: 2019.06.11, 17:43:42 »
Czegoś jednak niedopatrzyłeś
Cytuj
kasuj ;kasowanie poprzedniej pozycji
ld hl,16384
ld bc,(50011)
add hl,bc
ld (hl),0
ld hl,16384
;ld bc,(50001)
;add hl,bc
;ld a,(50000)
;ld (hl),a
ret

wyremowałem te linie i dalej działa.

zrobiłeś chyba zapis a ma być tylko kasowanie
ZX81/ZX 48k/Zx48k+/ZX +2/ZX +2A/+3/TC2048/FDD3000/FDD5000/3"/3,5'/5,25'/Beta 48k Apina/D+/GP50s/DIVIDE CF/Masterface/Polbasic SamCoupe QL CPC6128/N100 MSX-SVI738  MSX2-VG8235