Autor Wątek: Pierwsze kroki w Pasmo  (Przeczytany 107008 razy)

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #45 dnia: 2015.04.18, 15:16:03 »
Rozumiem.
Pętla zadziałała gdy ustawiłem akumulator

ld a,0
dec c
cp c
jp nz,start
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

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #46 dnia: 2015.04.18, 15:21:14 »
Spróbuj tak:
        ld c,10
loop:   dec c
        jp nz,loop
Akumulator i CP C są zbędne w tym przypadku.
ZX/Enterprise/CPC/Robotron/C128D

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #47 dnia: 2015.04.18, 15:44:38 »
Faktycznie, też działa.
A nie angażuje akumulatora.
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

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #48 dnia: 2015.04.18, 15:50:37 »
Nie przejmuj się. Znam kilku zawodowych programistów z młodszego pokolenia, którzy też nie rozumieją dlaczego :)
Mało kto próbuje dzisiaj zrozumieć zasady działania procesora.

W przypadku krótkiego skoku w zakresie -128 do +127 bajtów możesz użyć instrukcji JR zamiast JP.
Różnią się ilością bajtów i czasem wykonania. Czasami potrzeba zaoszczędzić miejsca (wtedy JR, jeśli krótki skok), a czasami czasu (JP wykona się szybciej, bo cel skoku jest podany wprost i nie trzeba go wyliczać).
ZX/Enterprise/CPC/Robotron/C128D

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #49 dnia: 2015.04.20, 09:40:45 »
Różnią się ilością bajtów i czasem wykonania. Czasami potrzeba zaoszczędzić miejsca (wtedy JR, jeśli krótki skok), a czasami czasu (JP wykona się szybciej, bo cel skoku jest podany wprost i nie trzeba go wyliczać).

Istotne jest też to, że każde JP (za wyjątkiem (HL)) wykonuje się zawsze tak samo długo - 10 taktów, a JR zależnie od warunku  12 (jeśli spełniony) albo 7 (jeśli niespełniony) - jak potrzebujesz stabilnych czasowo algorytmów to czasem warto stracić jeden bajt na rozkazie ;)

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #50 dnia: 2015.04.20, 10:30:45 »
Należy zauważyć, że JR i JP nie są w pełni redundantne. Różnice, oprócz czasów trwania, występują w warunkach wykonania skoku.

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #51 dnia: 2015.04.20, 11:39:46 »
Akumulator przechowuje liczby do 65535
wykonałem operacje

add a,c      ;czyli 16384+15

i teraz jak to do pamięci zapisać, bo

ld (a), b     ;takiej operacji nie ma

a chciałbym pod wyliczony adres wpisać zawartość rejestru b
 
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

trojacek

  • *****
  • Wiadomości: 6846
  • Miejsce pobytu:
    Warszawa
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #52 dnia: 2015.04.20, 11:41:09 »
Od kiedy akumulator jest 16-bitowy? :D

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #53 dnia: 2015.04.20, 11:45:22 »
no to dałem plamę  :-[
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

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #54 dnia: 2015.04.20, 11:50:08 »
Za 16-bitowy "akumulator" pracuje w Z80 para rejestrów HL.
ZX/Enterprise/CPC/Robotron/C128D

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #55 dnia: 2015.04.20, 11:54:22 »
zrobilem teraz tak

ld hl,16384

ld c,15
ld b,0

add hl,bc

ld b,128
ld (hl),b

i chyba działa
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: Pierwsze kroki w Pasmo
« Odpowiedź #56 dnia: 2015.04.20, 11:59:20 »
Znalazłem świetną książkę   ABC asemblera Rolanda Wacławka

Leżała w kącie przez lata bo na okładce jest zdjęcie C64
przez przypadek zajrzałem, a tam mnóstwo przykładów z Z80 (wyłącznie)
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

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #57 dnia: 2015.04.20, 12:01:07 »
Wersja skrócona jest taka:

ld hl,16384
ld bc,15
add hl,bc
ld (hl),128

trojacek

  • *****
  • Wiadomości: 6846
  • Miejsce pobytu:
    Warszawa
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #58 dnia: 2015.04.20, 13:01:02 »
ld c,15
ld b,0

Krócej będzie:
ld bc,15

ssr86

  • *
  • Wiadomości: 37
  • Miejsce pobytu:
    Bydgoszcz
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #59 dnia: 2015.04.20, 17:24:01 »
jeśli wartość, którą chcesz dodać jest 8-bitowa i nie chciałbyś niszczyć zawartości bc (bo np. używasz jej jeszcze do czegoś innego), to zamiast:
ld bc,nnnn
add hl,bc

możesz użyć:

ld a,l
add a,nn     ; teraz a = l + twoja_wartość
ld l,a            ; zapisujesz zmiany w l
adc a,h        ; jeśli suma przekroczyła 255, to zapalona została flaga carry - dodajesz wartość flagi do h (1 lub 0) [a=l+h+carry]
sub l            ; aby a=nowe_h, musimy odjąć l (bo obecnie jest a=l+nowe_h)
ld h,a

zabiera 1 bajt więcej i jest ciut wolniejsze, ale jeśli potrzebujesz bc lub de do czegoś innego to bardzo się ten kod przydaje...
Inną możliwością jest zachowanie bc na stosie i przywrócenie poprzedniej wartości po dodawaniu, ale to jest bardziej kosztowne...

Poniżej odejmowanie 8-bitowej wartości od 16-bitowej wartości w hl:

ld a,l
sub nn
ld l,a
sbc a,l
add a,h
ld h,a
« Ostatnia zmiana: 2015.04.20, 17:57:42 wysłana przez ssr86 »
"Kto zawsze tylko żył w pustyni..."