Autor Wątek: Amstrad Basic  (Przeczytany 20466 razy)

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Amstrad Basic
« Odpowiedź #30 dnia: 2015.11.19, 13:29:31 »
No więc z tego co widzę w kodzie to wywoływana procedura (CE91, str. 451) parsuje wyrażenia, ale zwraca zawsze tylko szesnastobitowego integera. Wewnętrznie procedura woła najpierw (CEFB, str. 452) parsowanie wyrażenia do jakiejś wewnętrznej struktury  (FAC) a następnie konwersję tej wartości do HL (FEC2, str. 596) - ta procedura jest opisana jako "Basic-funktion UNT" i robi konwersję - najpierw sprawdza, czy liczba jest integerem i jeśli tak to ją zwraca, jeśli jest floatem to wywołuje procedury konwersji do integera i zwraca tegoż.

Mimo szczerych chęci nie widzę tu miejsca na parsowanie czegokolwiek innego a z tego mi wynika, że chyba jednak CALL bierze wyłącznie parametry numeryczne konwertowane zawsze do 16 bitów. Być może inne typy parametrów potrafi przyjąć obsługa RSXów a być może po prostu nie umiem w tym niemieckim tekście znaleźć konwersji/parsowania innych typów parametrów dla CALL.

Co do mieszania kod maszynowy/BASIC to zasadniczo się z tobą zgadzam, ale oczywiście są sytuacje, gdy osoba pisząca w BASICu po prostu nie zna assemblera a potrzebuje jakiejś procedurki (gotowej przygotowanej przez kogoś innego) do zrobienia czegoś szybciej (albo zrobienia w ogóle). Sam wiesz, że nie wszystko co da się zrobić w assemblerze da się zrobić - sensownie - w BASICu ;)

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Amstrad Basic
« Odpowiedź #31 dnia: 2015.11.19, 14:05:43 »
No i jeszcze doszukałem jak to jest z tymi floatami i stringami - jeśli dobrze rozumiem to, co znalazłem to nie ma możliwości przekazania bezpośrednio parametru innego niż integer a przekazywanie innych typów uzyskuje się używając operatora/funkcji @ czyli np CALL 32768,@a$ co przekazuje do wywoływanej procedury wskaźnik do wyniku wyrażenia albo zmiennej. Nie jestem pewien czy można zrobić np. @(a$+"xx") albo @"napis" - prawdopodobnie nie. Mechanizm ten można za to wykorzystać do przekazywania danych z powrotem do BASICa - adres przekazywany jako @zmienna to chyba adres fizycznego miejsca gdzie w pamięci znajduje się ta zmienna i zapisanie tam danych z kodu maszynowego przenosi  się "w górę" do BASICa.

Nadal nie wiem jak to dokładnie wygląda w wypadku RSXów - tam można podawać teksty jako parametry. Procedura parsowania musi być chyba inna niż dla CALL.


matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Amstrad Basic
« Odpowiedź #32 dnia: 2015.11.19, 15:09:26 »
Ok. Zrobiłem ostatni etap researchu - odpaliłem emulator i popatrzyłem co się dzieje jak się przekaże stringa do CALL. Dzieje się dokładnie to, co jest opisane na CPC Wiki - parametr, który otrzymujemy kieruje nas do opisu stringa, który to opis w pierwszym bajcie ma długość stringa a w kolejnych dwóch adres w pamięci przydzielony przez system.

Wiem już wszystko co chciałem wiedzieć i dalej nie drążę i nie zawracam wam głowy ;) Zwłaszcza, że CPC to dla mnie ten ze starych komputerów do którego mnie całkiem nie ciągnie ;)

ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Amstrad Basic
« Odpowiedź #33 dnia: 2015.11.19, 18:30:37 »
Rafał - User Guide dodawany do każdego CPC ma bardzo przystępne i szczegółowe omówienie każdej komendy + przykłady. W latach 80ych ukazał się niewielki nakład polskiego tłumaczenia tejże ale z tego co słyszałem to większość trafiła do szkół oficerskich. Ze 3 lata temu pojawiły się 2ie sztuki tej książki na Allegro. Dziś w necie łatwo znaleźć angielskie PDF ze skanami. Krążą w różnych wersjach, polecam tą 15.8MB bo ma działające hiperlinki ze spisu treści. A skoro nie ma wyszukiwania tekstem to dobre i to. Za kilka € można też kupić papierową w paru językach ale bez PL.

https://www.google.co.uk/search?client=opera&q=AmstradCPC6128-hypertext-en-Sinewalker+pdf&sourceid=opera&ie=UTF-8&oe=UTF-8

Niezła też jest stronka której link już tu padł kilka postów wcześniej, można wyszukiwać tekstem, ale tu opisy są dość zdawkowe.
http://www.cpcwiki.eu/index.php/Locomotive_BASIC

Przypominam też te dialekt Basica w 464 jest nieco inny, brak w nim kilku komend i jest nieco inna składnia w kilku kolejnych, oraz sposób podawania parametrów do tzw RSX-ów. W 6128 działa składnia z 464, ale listingi do niego często nie stosują się do tych ograniczeń bo tak jest wygodniej, więc trzeba je troszkę przerabiać by działały także na 464.

- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Amstrad Basic
« Odpowiedź #34 dnia: 2015.11.19, 18:51:26 »
Matofesi - jak ktoś tu wcześniej cytował nie ma różnicy w podawaniu parametrów do CALL i do RSXów, obie metody służą do uruchamiania procedur binarnych, tyle że w RSX podajemy jej nazwę zamiast adresu startowego.

Ale jest różnica między tym jak można podawać parametry w 464 a w 6128. W tym pierwszym musimy to robić pośrednio tzn wpierw podstawić ją pod zmienną np.:  a=2345:a$="tekst":|RSX,@a,@a$
A w 6128 można tak samo, ale także bez tych @ czyli  |RSX,a,a$   lub bez pośrednictwa zmiennej podawać parametry od razu przy komendzie:  |RSX,2345,"tekst" 
Ta małpka oznacza że chodzi nam nie o samą zmienną, ale o jej adres pod jakim się ona znajduje. Tyle że ten adres to ilość bajtów poniżej względem ruchomego adresu HIMEM, a nie adres jak przy np. POKE.
- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Amstrad Basic
« Odpowiedź #35 dnia: 2015.11.19, 22:54:04 »
Ech... Skończyłem już z tym tematem, ale jakbym nie skończył to bym ci powiedział, że poza tym, że nie chce mi się porównywać ROMów 464 i 6128 (zwłaszcza po niemiecku) żeby obejrzeć i opisać jak to dokładnie działa i czym się różni. Powiedziałbym też, że już wiem, że parsowanie parametrów dla CALL i RSXów system robi tak samo. A poza tym powiedziałbym ci, że rozumiem co robi operator/funkcja @ i, że jakbym chciał to wiedzieć dokładnie jak to robi to pewnie bym sobie sprawdził ;)

Ale jak już napisałem - dla mnie temat jest zamknięty i nie chce mi się go dalej drążyć. :)

Dr Piotr

  • ***
  • Wiadomości: 196
Odp: Amstrad Basic
« Odpowiedź #36 dnia: 2015.11.19, 23:06:04 »
Cytuj
Jest to wywolanie procedury pod &4000 z parametrem &5000, wskazywanym przez rejestr IX. Rejestr A zawiera liczbe parametrow.

A co to znaczy 5000 wskazywane przez IX? Że wartość z dwóch komórek (IX+0)+ 256*(IX+1)=5000?

Czyli czy dobrze rozumiem że takie polecenie CALL z Basica gdzieś tam do pamięci wstawia sobie te parametry a potem tak ustawia IX by wskazywał na początek tej tablicy parametrów?

Dokladnie tak. Tylko ze IX wskazuje na koniec tej tablicy (ostatni parameter w linii wywolania)


Dr Piotr

  • ***
  • Wiadomości: 196
Odp: Amstrad Basic
« Odpowiedź #37 dnia: 2015.11.19, 23:10:26 »
You don't have to google that for me. Bez powodu bym nie pytał, CPC Wiki podaje jedynie taki przykład użycia CALL
CALL 0 :REM resets the computer completelyInteresuje mnie, jak ten konkretny przypadek CALL adres,parametr wywołać z assemblera.

ld IX, data
ld a,1
call &4000

...
data:
dw &5000