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

matofesi

  • *****
  • Wiadomości: 1747
  • 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: 1747
  • 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: 1747
  • 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: 2783
  • 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.

In STARS, TREK is better than WARS.. ;)

ZbyniuR

  • *****
  • Wiadomości: 2783
  • 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.
In STARS, TREK is better than WARS.. ;)

matofesi

  • *****
  • Wiadomości: 1747
  • 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: 188
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: 188
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