Autor Wątek: Problem ze zmienną ZXSpin-Asembler  (Przeczytany 9747 razy)

gregoryi

  • ****
  • Wiadomości: 288
  • Miejsce pobytu:
    Opole
Problem ze zmienną ZXSpin-Asembler
« dnia: 2016.11.16, 09:28:43 »
Witam.

Nie mogę załapać dlaczego nie działa.
Prośba o wyprostowanie mnie.
Swego czasu napisałem sobie program rysujący flagi (bardzo prosty).
Potem przerobiłem go na asemblera, a teraz chciałem zoptymalizować.
W starym skrypcie wszystkie pola flag były pisane ciurkiem, znaczy każde pole miało swój kod.
Chciałbym wykorzystać zmienne np. kolor1, kolor2, il_kolumn, il_wierszy, ... itp. skróci program.
To co na chwilę obecną testuję
org 30000
call procedura1
ret

org 60000
procedura1:
ld      hl,$5801
ld      e,31
looppolbi11:
push      hl
ld      b,11
looppolbi12:
ld      (hl),kolor1     ;linia występowania błędu
ld      d,b
ld      b,32
loophlpolbi11:
inc      hl
djnz loophlpolbi11
ld      b,d
djnz looppolbi12
pop      hl
inc      hl
ld      b,e
dec      b
ld      e,b
djnz looppolbi11
ret

kolor1: db 120

Używam ZXSpin (w nim asemblera)
Występuje błąd: Byte value out of range

Natomiast jak zrobię tak:
org      30000
ld          a,(kolor1)
call      procedura1
ret

org 60000
procedura1:
ld      hl,$5801
ld      e,31
looppolbi11:
push      hl
ld      b,11
looppolbi12:
ld      (hl),a     ;błędu już nie ma
ld      d,b
ld      b,32
loophlpolbi11:
inc      hl
djnz loophlpolbi11
ld      b,d
djnz looppolbi12
pop      hl
inc      hl
ld      b,e
dec      b
ld      e,b
djnz looppolbi11
ret

Gdzie popełniam błąd. Chcę przekazywać do procedury więcej parametrów, czy to w ogóle możliwe?

ZX Spectrum 16, ZX Spectrum 48, ZX Spectrum 128 +2 Grey, ZX Spectrum 128 +3, Amstrad 6128, Commodore 64C, Amiga 600, Klony - Harlequin 48 Rev G, Harlequin 128 Rev 2D, Just Speecy 128, ZX Nuvo 128

steev

  • *****
  • Wiadomości: 1362
  • Miejsce pobytu:
    inode 42
Odp: Problem ze zmienną ZXSpin-Asembler
« Odpowiedź #1 dnia: 2016.11.16, 09:34:28 »
kolor1 to szesnastobitowy adres a nie ośmiobitowa wartość.
wartości to przez equ...
Machines should work. People should think.

ZX Freeq

  • *****
  • Wiadomości: 1833
  • Miejsce pobytu:
    Warszawa
Odp: Problem ze zmienną ZXSpin-Asembler
« Odpowiedź #2 dnia: 2016.11.16, 09:36:01 »
Dokadnie, jak pisze steev.

ld        (hl),kolor1

a pewnie chciales

ld        (hl),(kolor1 )

tyle ze tak sie nie da. Mozna za to

ld a, (kolor)
ld (hl), a

pisze z glowy. I przepraszam za brak polskich ogonkow. cos mi windows strajkuje.
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

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4537
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Problem ze zmienną ZXSpin-Asembler
« Odpowiedź #3 dnia: 2016.11.16, 09:39:34 »
Cześć.

A więc tak, masz definicję komórki pamięci:

Cytuj
kolor1: db 120

a następnie chcesz zawartość tej komórki pamięci zapisać do innej komórki pamięci:

Cytuj
ld        (hl),kolor1     ;linia występowania błędu

i to jest złe, ponieważ kolor1 to jakiś adres w pamięci, który jest 16 bitowy, zatem kompilator próbuje skompilować coś takiego:
Cytuj
ld (hl),$xxxx (wartość 16 bitowa a nie 8bit).

Tobie zależy na danej, która znajduje się pod tym adresem, zatem powinieneś zrobić tak:
Cytuj
ld a,(kolor1)
ld (hl),a

steev

  • *****
  • Wiadomości: 1362
  • Miejsce pobytu:
    inode 42
Odp: Problem ze zmienną ZXSpin-Asembler
« Odpowiedź #4 dnia: 2016.11.16, 09:44:56 »
Lub (jeśli kolor1 jest stałą) to na początku programu
kolor1  equ  120(składnia może się zmieniać w zależności od stosowanego asemblera, trzeba sprawdzić w dokumentacji)
i wtedy można stosować taką etykietkę zamiast liczby (np. ld a,kolor1)
Machines should work. People should think.

gregoryi

  • ****
  • Wiadomości: 288
  • Miejsce pobytu:
    Opole
Odp: Problem ze zmienną ZXSpin-Asembler
« Odpowiedź #5 dnia: 2016.11.16, 10:10:48 »
Próbowałem również zrobić tak:
ld          (hl), (kolor1)     ; wystąpił błąd invalid combination of opcode and operands

Zrobiłem tak:
org 30000; flaga polski

kolor  equ 120
il_k    equ 31
il_w  equ 11
licznik equ 32
pocz equ $5801
call procedura
kolor equ 80
il_k  equ 31
il_w  equ 11
licznik equ 32
pocz equ $5961
call procedura
ret

org 60000
procedura:
ld hl,pocz ;adres poczatkowy atrbutow
ld e,il_k ;ilosc kolumn
looppolbi11:
push hl ;zachowanie adresu atrybutow
ld b,il_w ;ilosc wierszy
looppolbi12:
ld (hl),kolor ;wyswietlenie koloru white-bright w adres atrybutu
ld d,b ;zachowanie pozycji ilosci wierszy
ld b,licznik ;licznik petli do djnz
loophlpolbi11:
inc hl ;zwiekszanie adresu atrybutu o 1
djnz loophlpolbi11
ld b,d ;wystawienie licznika petli do djnz
djnz looppolbi12
pop hl ;wstawienie adresu atrybutow
inc hl
ld b,e
dec b
ld e,b
djnz looppolbi11
ret

I otrzymuję podwójną definicję zmiennych.
Jak w asemblerze do wcześniej zdefiniowanych zmiennych podstawić wartość?
ZX Spectrum 16, ZX Spectrum 48, ZX Spectrum 128 +2 Grey, ZX Spectrum 128 +3, Amstrad 6128, Commodore 64C, Amiga 600, Klony - Harlequin 48 Rev G, Harlequin 128 Rev 2D, Just Speecy 128, ZX Nuvo 128

ZX Freeq

  • *****
  • Wiadomości: 1833
  • Miejsce pobytu:
    Warszawa
Odp: Problem ze zmienną ZXSpin-Asembler
« Odpowiedź #6 dnia: 2016.11.16, 10:15:38 »

Jak w asemblerze do wcześniej zdefiniowanych zmiennych podstawić wartość?

Tak naprawdę tu nie ma zmiennych. W trakcie definiowania na przykład:
moja_zmienna defb 128w pewnym miejscu pamięci przypisujesz wartość 128, a to miejsce otrzymuje label (nie wiem jak to jest po polsku).

Do tego miejsca w pamięci można się odwołać na przykład:

ld a, 64
ld (moja_zmienna), a

przypisując w to samo miejsce w pamięciu wartość 64. Natomiast

ld hl, moja_zmienna
powoduje przypisanie do rejestru HL adresu tej "zmiennej". I dalej można na przykład:

ld (hl), 64
co również spowoduje przypisanie wartości 64 w odpowiednie miejsce w pamięci.


« Ostatnia zmiana: 2016.11.16, 10:30:51 wysłana przez ZX Freeq »
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

pear

  • *****
  • Wiadomości: 5509
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Problem ze zmienną ZXSpin-Asembler
« Odpowiedź #7 dnia: 2016.11.16, 10:18:38 »
Po polsku Label to Etykieta.
ZX/Enterprise/CPC/Robotron/C128D

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4537
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Problem ze zmienną ZXSpin-Asembler
« Odpowiedź #8 dnia: 2016.11.16, 10:20:20 »
Ja tylko chciałem zwrócić uwagę że nie ma w Z80 nie takiego adresowania jak poniżej:

Cytuj
         ld (moja_zmienna), 64

trzeba to zrobić za pomocą rejestrów, to znaczy albo tak:
Cytuj
  ld a,64
  ld (moja_zmienna),a

albo tak:
Cytuj
  ld hl,moja_zmienna
  ld (hl),64

ZX Freeq

  • *****
  • Wiadomości: 1833
  • Miejsce pobytu:
    Warszawa
Odp: Problem ze zmienną ZXSpin-Asembler
« Odpowiedź #9 dnia: 2016.11.16, 10:30:31 »
Oczywiście masz rację, już poprawiłem.  :-[
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

gregoryi

  • ****
  • Wiadomości: 288
  • Miejsce pobytu:
    Opole
Odp: Problem ze zmienną ZXSpin-Asembler
« Odpowiedź #10 dnia: 2016.11.16, 11:26:58 »
org 30000
ld a,120
ld (kolor),a
ld a,31
ld (il_k),a
ld a,11
ld (il_w),a
ld a,32
ld (licznik),a
ld de,$5801
ld (pocz),de
call procedura
ld a,80
ld (kolor),a
ld a,31
ld (il_k),a
ld a,11
ld (il_w),a
ld a,32
ld (licznik),a
ld de,$5961
ld (pocz),de
call procedura
ret

org 30070
ld a,80
ld (kolor),a
ld a,31
ld (il_k),a
ld a,11
ld (il_w),a
ld a,32
ld (licznik),a
ld de,$5801
ld (pocz),de
call procedura
ld a,120
ld (kolor),a
ld a,31
ld (il_k),a
ld a,11
ld (il_w),a
ld a,32
ld (licznik),a
ld de,$5961
ld (pocz),de
call procedura
ret

org 60000
procedura:
ld hl,(pocz) ;adres poczatkowy atrbutow
ld a,(il_k)
ld e,a ;ilosc kolumn
looppolbi11:
push hl ;zachowanie adresu atrybutow
ld a,(il_w)
ld b,a ;ilosc wierszy
looppolbi12:
ld a,(kolor)
ld (hl),a ;wyswietlenie koloru white-bright w adres atrybutu
ld d,b
ld a,(licznik) ;zachowanie pozycji ilosci wierszy
ld b,a ;licznik petli do djnz
loophlpolbi11:
inc hl ;zwiekszanie adresu atrybutu o 1
djnz loophlpolbi11
ld b,d ;wystawienie licznika petli do djnz
djnz looppolbi12
pop hl ;wstawienie adresu atrybutow
inc hl
ld b,e
dec b
ld e,b
djnz looppolbi11
ret

kolor db 0
il_k db 0
il_w db 0
licznik db 0
pocz db 0

To działa ale myślałem, że można prościej
Bo nie działa mi:
ld (zmienne),wartość
i
ld e,(il_k)
Na przemian flaga polski flaga monako w ramach testów czy nie rozjedzie się.
Jak będę w domu to podeślę stary program.
« Ostatnia zmiana: 2016.11.16, 11:34:38 wysłana przez gregoryi »
ZX Spectrum 16, ZX Spectrum 48, ZX Spectrum 128 +2 Grey, ZX Spectrum 128 +3, Amstrad 6128, Commodore 64C, Amiga 600, Klony - Harlequin 48 Rev G, Harlequin 128 Rev 2D, Just Speecy 128, ZX Nuvo 128

ZX Freeq

  • *****
  • Wiadomości: 1833
  • Miejsce pobytu:
    Warszawa
Odp: Problem ze zmienną ZXSpin-Asembler
« Odpowiedź #11 dnia: 2016.11.16, 11:47:58 »
Tutaj jest bardzo wygodna tabelka, która pokazuje gdzie można zrobić LoaD.

http://z80-heaven.wikidot.com/instructions-set:ld
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

pear

  • *****
  • Wiadomości: 5509
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Problem ze zmienną ZXSpin-Asembler
« Odpowiedź #12 dnia: 2016.11.16, 12:05:53 »
ZX/Enterprise/CPC/Robotron/C128D

gregoryi

  • ****
  • Wiadomości: 288
  • Miejsce pobytu:
    Opole
Odp: Problem ze zmienną ZXSpin-Asembler
« Odpowiedź #13 dnia: 2016.11.16, 12:35:51 »
Ja to wszystko rozumiem.
Tylko nie mogę pojąć dlaczego
mogę zrobić tak
ld a,(zmienna)
a nie mogę zrobić
ld e,(zmienna)

Trochę jest to zaskakujące.

Natomiast definiowanie zmiennych (etykiet):
zmienna db wartość
nie określa typu czy jest to 8-bit czy 16-bit, dlatego występuje błąd "value out of range".
Przykładem może być zmienna kolor (8-bit) a zmienna pocz (16-bit).
Prawdopodobnie akumulator obcina wartość do 8-bit.
Z moich obserwacji.
ZX Spectrum 16, ZX Spectrum 48, ZX Spectrum 128 +2 Grey, ZX Spectrum 128 +3, Amstrad 6128, Commodore 64C, Amiga 600, Klony - Harlequin 48 Rev G, Harlequin 128 Rev 2D, Just Speecy 128, ZX Nuvo 128

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4537
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Problem ze zmienną ZXSpin-Asembler
« Odpowiedź #14 dnia: 2016.11.16, 12:42:12 »
Nie możesz tak zrobić bo rejestr E nie jest rejestrem uniwersalnym, tak jak A. Dla rejestrów innych niż A,I,R,F dozwolone są przypisania następujące przypisania wartości (na przykładzie rejestru E):

LD E,liczba 8bitowa
LD E,inny_rejestr_8bit
LD E,(HL)
LD E,(IX+n)
LD E,(IY+n)