Autor Wątek: Problem z kompilacją (BIT, LD)  (Przeczytany 16278 razy)

apk

  • ***
  • Wiadomości: 237
Problem z kompilacją (BIT, LD)
« dnia: 2017.02.01, 19:13:01 »
Witam wszystkich,
mam problem z instrukcją BIT. Buduję urządzenie na Z80, do którego dostałem kod programu. Niestety nie ja jestem autorem więc nie mogę go tu zamieścić w całości :(.
Podczas kompilacji wyrzucane są błędy. Z niektórymi sobie poradziłem (w życiu nie programowałem Z80 w asemblerze, tylko 8051 i AVR, ale to w sumie wszystko jest podobne). Największy problem mam na razie z takimi instrukcjami - pojawia się komunikat offset out of range.

BIT  PAUSE,(IY-W+MODE)
LD   (IY-W+KEY),B 
ADD  A,(IY-W+SCREENO)

gdzie definicje są takie:

W        EQU  0E080H
           LD   IY,W     
PAUSE    EQU  4   
KEY      DEFS 1         
SCREENO  DEFS 1     
MODE     DEFS 1

Czy powinienem ten kod skompilować w jakimś specyficznym asemblerze? Czy można tą komendę można napisać jakoś inaczej?

Z góry dziękuję za pomoc.
Pozdrawiam
P.

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Problem z kompilacją (BIT, LD)
« Odpowiedź #1 dnia: 2017.02.01, 19:16:10 »
Komunikat błędu jak najbardziej sensowny.
Offset jest liczbą 8-bitową ze znakiem, czyli zakres -128 do 127, a Ty masz zdefiniowaną stałą W 16-bitową.

Witaj na forum.
ZX/Enterprise/CPC/Robotron/C128D

apk

  • ***
  • Wiadomości: 237
Odp: Problem z kompilacją (BIT, LD)
« Odpowiedź #2 dnia: 2017.02.01, 22:58:02 »
Czyli nie jest tak, ze kompilator obliczy wartość wykonując działanie: 0E080H - 0E080H + 1=1?
P.

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Problem z kompilacją (BIT, LD)
« Odpowiedź #3 dnia: 2017.02.02, 05:35:41 »
Niestety nie.
Skoro jednak za każdym razem powtarza się IY-W, to dlaczego nie wyliczyć adresu bazowego wcześniej ?
LD  BC,-W
ADD IY,BC 
Potem już tylko właściwy offset
BIT  PAUSE,(IY+MODE)
LD   (IY+KEY),B
ADD  A,(IY+SCREENO)
ZX/Enterprise/CPC/Robotron/C128D

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Problem z kompilacją (BIT, LD)
« Odpowiedź #4 dnia: 2017.02.02, 10:27:51 »
Takie dziwolongi potrafi obsłużyć kompilator sjasmplus. Ja nie wiem jak on się w tym łapie ;)

apk

  • ***
  • Wiadomości: 237
Odp: Problem z kompilacją (BIT, LD)
« Odpowiedź #5 dnia: 2017.02.02, 10:33:08 »
Spróbuję zrobić to co proponują obaj przedmówcy :)

Do pear:

Co jest zatem efektem działania z nawiasu? Jaka wartość? Program ma 8kB bez 3 bajtów i nie wiem czy obejście się zmieści. Poza tym chciałbym jak najmniej go modyfikować bo mogę popsuć coś innego. Ale spróbuję.
P.

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Problem z kompilacją (BIT, LD)
« Odpowiedź #6 dnia: 2017.02.02, 10:42:42 »
Jeżeli po raz pierwszy piszesz coś tak dużego w asm Z80, to zapewne pozostawiasz dużo możliwości do optymalizacji.
Możemy pomóc, jeżeli zdradzisz nam/mi co to jest...
Używanie rejestrów indexowych jest wygodne, ale też pamięci i czasowo żerne.

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Problem z kompilacją (BIT, LD)
« Odpowiedź #7 dnia: 2017.02.02, 10:46:56 »
Nie rozumiem po co wartość W jest ładowana do IY, a potem znów ta sama wartość jest odejmowana.
Jeśli to jest stała wartość IY w całym programie, to po prostu od razu załaduj tam 0 (zero).
ZX/Enterprise/CPC/Robotron/C128D

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Problem z kompilacją (BIT, LD)
« Odpowiedź #8 dnia: 2017.02.02, 10:54:39 »
Co jest zatem efektem działania z nawiasu?

Nawias w assemblerze Z80 prawie zawsze (w zasadzie z wyjątkiem operacji I/O) oznacza zawartość pamięci o adresie z nawiasu. W wypadku  rejestrów indeksowych IX i IY oznacza to "zawartość pamięci o adresie z rejestru IX przesuniętym o ośmiobitowy indeks". Przeliczenia których oczekujesz od assemblera (kompilatora) nie dadzą się wykonać z bo mieszasz definicje stałych, zmiennych i rozkazy... EQU to deklaracja stałej, DEFS to deklaracja zmiennej a LD IY,W to już konkretny rozkaz. Po wykonaniu tego ostatniego w IY jest konkretna wartość - w twoim wypadku $E080, ale kolejna próba zaadresowania (IY-W+MODE) nie ma prawa zadziałać, bo do tego samego rozkazu można skoczyć z dowolnego innego miejsca z zupełnie inną zawartością w IY - ty oczekujesz, że assembler coś ci zoptymalizuje podczas gdy on oczekuje od ciebie precyzji wypowiedzi ;)

Dobrze jest zabierając się za takie rzeczy zaopatrzyć się w szczegółową listę rozkazów - np. oficjalną specyfikację procesora - w której znajdziesz informacje na temat tego jakie rozmiary mogą mieć poszczególne parametry w różnych trybach adresowania, jakie ustawiają znaczniki itp.

apk

  • ***
  • Wiadomości: 237
Odp: Problem z kompilacją (BIT, LD)
« Odpowiedź #9 dnia: 2017.02.02, 22:15:09 »
Sjasmplus dał radę i problematyczne komendy zostały skompilowane. Pojawił się teraz problem z makrem. Wygląda ono tak:

 ;MAKROINSTRUKCJA ROLL
 ;~~~~~~~~~~~~~~~~~~~~
 ; USUWA PRZENIESIENIA ADRES0W BUFORA TEKSTOWEGO
 ; ORAZ EKRANU POZA OBSZAR 2KB.  5 NAJSTARSZYCH BIT0W
 ; ADRESU W HL JEST BRANE Z KOM0RKI OKRESLONEJ
 ; PRZEZ PARAMETR MAKROINSTR. (ADRES STRONY BUFORA
 ; TEKSTOWEGO TPAGE ).
         MACRO %ROLL
         LD   A,(\0)
         XOR  H
         AND  11111000B
         XOR  H
         LD   H,A
         ENDMAC

Błąd pojawia się tu:          MACRO %ROLL

W dalszej części programu sa komendy wywołujące makro, które także generują błąd:
%ROLL TPAGE       ;KOREKCJA ADR. ZR0DLA

Pojawia się komunikat, że polecenie ma za mało parametrów.
Samo TPAGE jest tak zefiniowane: TPAGE    DEFS 1

Na razie doszedłem do tego, że Endmac trzeba zamienić na Endm.

Co należy zmienic, żeby kompilator to przyjął?

A tak informacyjnie to ja nie piszę tego programu. Dostałem od kogoś program gotowy, którego niestety nie mogę skompilować, bo albo pisany był w jakimś dziwnym asemblerze prawie 30 lat temu, albo od początku zawierał błędy. Znam się na programowaniu 8051 i avr więc asembler nie jest mi obcy, po prostu nigdy nie programowałem Z80.

Dziękuję wszystkim za zaangażowanie i pomoc.
P.

steev

  • *****
  • Wiadomości: 1366
  • Miejsce pobytu:
    inode 42
Odp: Problem z kompilacją (BIT, LD)
« Odpowiedź #10 dnia: 2017.02.02, 23:45:54 »
Strzelam że chodziło o coś takiego :

;MAKROINSTRUKCJA ROLL
;~~~~~~~~~~~~~~~~~~~~   
    macro roll page
    ld a,(page)
    xor h
    and %11111000
    xor h
    ld h,a
    endm

start:
    ld a,16
    ld (tpage),a

    ld hl,$4200
    roll tpage

    ld a,(hl)

    ret

tpage:
    defs 1

Machines should work. People should think.

apk

  • ***
  • Wiadomości: 237
Odp: Problem z kompilacją (BIT, LD)
« Odpowiedź #11 dnia: 2017.02.03, 09:13:40 »
Witam,
wprowadziłem następujące zmiany:

         MACRO ROLL TPAGE
         LD   A,(TPAGE)
         XOR  H
         AND  11111000B
         XOR  H
         LD   H,A
         ENDM

Efekt jest taki, że makro jest kompilowane prawidłowo, natomiast przy wywołaniu: ROLL TPAGE  pojawia się następujący błąd: line 616: Over 20 defines nested.
Chyba coś jest nie tak z parametrem przekazywanym do makro. Zrobiłem eksperyment i LD w makro zmieniłem na:

      LD   A,0

czyli nie wykorzystuję parametru. Teraz ROLL TPAGE kompiluje się prawidłowo, a listing wygląda tak:

0616   02D4             P_PRT2   ROLL TPAGE       ;KOREKCJA ADR. ZR0DLA
0616   02D4 3E 00       >         LD   A,0;(TPAGE)
0616   02D6 AC          >         XOR  H
0616   02D7 E6 F8       >         AND  11111000B
0616   02D9 AC          >         XOR  H
0616   02DA 67          >         LD   H,A
0617   02DB ED A0                LDI               ;PRZESLANIE ZNAKU

Czyli chyba prawidłowo, bo w miejsce wywołania makra podstawia jego kod.
Czy można jakoś inaczej napisać   LD   A,(TPAGE) z makra, aby wszystko działało? Jedyne informacje o definiowaniu TPAGE w programie znajdujące się w jego różnych miejscach są następujące:

         DEFB 0F0H      ;TPAGE
TPAGE    DEFS 1


P.

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Problem z kompilacją (BIT, LD)
« Odpowiedź #12 dnia: 2017.02.03, 09:47:16 »
Nie do końca rozumiem, co chcesz uzyskać, ale jeśli używasz TPAGE jako etykiety do zmiennej a potem tego samego TPAGE jako parametru dla makro to mam wrażenie, że kompilator może się gubić. Skoro wywołujesz ROLL z parametrem TPAGE to sugeruje, że chcesz do makra przekazać TPAGE jako adres zmiennej, którą deklarujesz w ostatnim kawałku kodu. Jeśli ta zmienna zawsze jest w tym samym miejscu wyrzuć po prostu parametr z definicji makro i wołaj ROLL bez parametru. Jeśli może się zmieniać, to zmień nazwę w makro z TPAGE na coś innego i wtedy wołaj ROLL TPAGE (albo z innym parametrem, którego potrzebujesz).

steev

  • *****
  • Wiadomości: 1366
  • Miejsce pobytu:
    inode 42
Odp: Problem z kompilacją (BIT, LD)
« Odpowiedź #13 dnia: 2017.02.03, 10:27:28 »
Witam,
wprowadziłem następujące zmiany:

         MACRO ROLL TPAGE
         LD   A,(TPAGE)
         XOR  H
         AND  11111000B
         XOR  H
         LD   H,A
         ENDM
Efekt jest taki, że makro jest kompilowane prawidłowo, natomiast przy wywołaniu: ROLL TPAGE  pojawia się następujący błąd: line 616: Over 20 defines nested.

Może jednak powinieneś wrócić do 'numbered parameters'...
Wpisz to makro jako :
         MACRO ROLL 1
         LD   A,(@1)
         XOR  H
         AND  11111000B
         XOR  H
         LD   H,A
         ENDM
Machines should work. People should think.

apk

  • ***
  • Wiadomości: 237
Odp: Problem z kompilacją (BIT, LD)
« Odpowiedź #14 dnia: 2017.02.03, 12:07:31 »
Poniższy kod nie zadziałał:

         MACRO ROLL 1
         LD   A,(@1)
         XOR  H
         AND  11111000B
         XOR  H
         LD   H,A
         ENDM


Pomogło jednak, jak proponował matofesi, usunięcie parametru:

         MACRO ROLL
         LD   A,(TPAGE)
         XOR  H
         AND  11111000B
         XOR  H
         LD   H,A
         ENDM

wywołanie:  ROLL

Z 69 błędów ilość spadła do 7 :)


Kolejny fragment sprawiający kłopoty:

         LD   (HL),.LOW.K_2
         INC  HL
         LD   (HL),.HIGH.K_2

Listing:

a.asm line 495: Label not found: K_11.LOW.K_2
0495   023F 36 00                LD   (HL),.LOW.K_2
0496   0241 23                   INC  HL
a.asm line 497: Label not found: K_11.HIGH.K_2
0497   0242 36 00                LD   (HL),.HIGH.K_2

K_2 to oznaczenie miejsca w kodzie:

K_2      LD   A,XX
Nie rozumiem, co te komendy mają robić (czy ładują do HL adres?). Składnia jest także błędna i nie wiem jak to obejść.


***********************
Kolejne błędy dotyczą definicji kodów ascii.

Kod:

         DEFB   0,   '''','"', XX,  XX   ;40 - ' "
Listing:

a.asm line 3624: Syntax error: ''','"', XX,  XX   
3624   1581 00                   DEFB   0,   '''','"', XX,  XX   ;40 - ' "

***********************
Kolejny

Kod:

         DEFB   0,   '\', '|', FS,  XX   ;43 - \ |
Listing:

a.asm line 3627: Unexpected: |', FS,  XX   ;43 - \ |
3627   158C 00 27 2C 20          DEFB   0,   '\', '|', FS,  XX   ;43 - \ |

***********************
I chyba ostatni

Kod:

         DEFB ESC,'P','\',ESC,'O'
Listing:

a.asm line 3766: Unexpected: O'
3766   1730                      DEFB ESC,'P','\\',ESC,'O'
3766   1730 1B505C272C4553432C


P.