﻿              _==================================
              #            TOBOS-DYD            #
              # PAKIET ZAWIERAJĄCY KOMPILATOR   #
              #________ TOBOS FP  V2.0 _________#

  -- INSTRUKCJA SKRÓCONA -------------------------------------

  1.Załadować pakiet TOBOS-DYD
  2.Załadować własny program w Basicu
  3.Kompilacja   : RANDOMIZE USR 53100
  4.Uruchomienie : RANDOMIZE USR (RAMTOP+1) (standardowo 40000)

  Dostępne są polecenia narzędziowe : AUTO, DELETE, RENUMBER,
    FILL, PRINT CSIZE.
   W obszarze UDG zdefiniowane są polskie litery dostępne w
  trybie GRAPHICS :  A B C D E F G H     K L M N O P   R S T U
                     ą Ą ć Ć ę Ę ź Ź     Ł ł Ń ń ó Ó   Ś ś ż Ż
  ____________________________________________________________
  __ INFORMACJE OGÓLNE _______________________________________

    TOBOS FP kompiluje prawie wszystkie instrukcje Basica,
  operuje własnymi procedurami arytmetycznymi co znacznie
  przyspiesza wykonywanie programów.
   Kompilatora można używać na etapie uruchamiania i testowa-
  nia programów, co znacznie przyspiesza proces tworzenia
  programu.

   Udoskonalenia w stosunku do poprzednich wersji -----------

  1.Akceptuje LOAD/SAVE/VERIFY z opcją CODE i SCREEN$
    Istnieje możliwość wczytywania i nagrywania tablic.
  2.Nowa biblioteka arytmetyczna, zoptymalizowany dostęp do
    tablic numerycznych.
  3.Możliwość wejścia do programu bez niszczenia zmiennych
    (ciepły start), oraz w pewnych wypadkach możliwość konty-
    nuacji przerwanego programu.
  4.CIRCLE wykonuje się cztery razy szybciej.
  ____________________________________________________________
  __ INSTRUKCJA OBSŁUGI ______________________________________

  1.Wczytywanie i uruchomienie -------------------------------

     Po wczytaniu pakietu kompilator zajmuje obszar od 50740
  do 65535, w obszar UDG zostają wczytane polskie znaki,
  RAMTOP jest obniżony do 39999.
     W procesie kompilacji (USR 53100) kod wynikowy jest
  umieszczany od adresu RAMTOP+1 w górę. O ile kompilacja
  przejdzie bezbłędnie (nie pojawi się komunikat o błędzie)
  kompilator wypisuje adres startowy ADR oraz długość kodu
  wynikowego DLUG, a u dołu pojawi się komunikat
    0 OK, a,b  (a,b - nr.ostatnio kompilowanej linii i instr.)
  Skompilowany program uruchamiamy RANDOMIZE USR ADR, lub
  nagrywamy na taśmę SAVE "nazwa"CODE ADR,DLUG

  2.Ograniczenia i udoskonalenia kompilatora -----------------

     Kompilator nie akceptuje instrukcji:
   a)związanych z obsługą microdrive i dysku ( OPEN#,CLOSE#,
  MOVE,ERASE,FORMAT);
   b)LOAD/SAVE/VERIFY  z opcją różną od CODE (wczytywanie i
  nagrywanie tablic jest realizowane inaczej niż normalnie);
   c)CONTINUE (kontynuacja jest realizowana inaczej);
   d)CLEAR nn (CLEAR ze zmianą RAMTOP, CLEAR bez parametru
  jest akceptowany)

    Udoskonalono realizację funkcji definiowalnych np.:
          10 DEF FN a(x,y)=x+y
          20 PRINT FN a(FN a(2,3),FN a(4,5))
   podaje poprawną wartość 14 (Spectrum Basic podaje 13).

     Wszystkie pozostałe instrukcje są prawidłowo realizowane
  przez kompilator z uwzględnieniem wszystkich możliwych
  formatów.
     Kompilator zapisuje liczby w czterobajtowym formacie
  zmiennopozycyjnym, stąd wszystkie wyniki liczbowe są druko-
  wane z dokładnością 7 cyfr.

  3.Błędy kompilacji -----------------------------------------

     Podawany jest nr. linii i instr. w której błąd wystąpił

   - NONSENSE IN BASIC - została użyta niedozwolona instrukcja
   - OUT OF MEMORY - w czasie tworzenia kodu wynikowego zabra-
  kło miejsca w pamięci. W pkt. 6 i 7 podano co wtedy robić.
   - VARIABLE NOT FOUND - w programie brak jest deklaracji
  danej zmiennej (czyli instrukcji DIM dla tablic, lub instru-
  kcji FOR, LET, INPUT, READ dla zmiennych prostych)
   - RAMTOP NO GOOD - rzadko występuje na etapie kompilacji.
   - POZOSTAŁE BŁEDY - mają ten sam sens jak normalnie.

  4.Błędy w czasie wykonywania programu ----------------------

     Podawany jest nr. linii i instr. w której błąd wystąpił

   - RAMTOP NO GOOD - należy zwiększyć RAMTOP instrukcją
  CLEAR nn. Przykładowo, jeśli RAMTOP miał wartość 34099, to
  należy wykonać CLEAR 34199 (z reguły dodanie 100 bajtów
  umożliwia dalszą bezbłędną pracę).
   - VARIABLE NOT FOUND - dana zmienna nie jest zadeklarowana.
  Nie dotyczy to zmiennych prostych numerycznych, których
  wartości są inicjowane na zero.
   - POZOSTAŁE BŁĘDY - pokrywają się z interpreterem.

  5.BREAK, CONTINUE, GO TO 0 ---------------------------------

     Program można przerwać w dowolnym momencie.
  O ile program został przerwany podczs LOAD/SAVE/VERIFY to
     RANDOMIZE USR 52575
  spowoduje kontynuację wykonywania programu, w innych przypa-
  dkach program może działać nieprawidłowo.
    Można kontynuować działanie programu który zatrzymał się na
  instrukcji STOP.
     Zawsze można zastosować ciepły start tzn. uruchomić
  program od pierwszej instrukcji bez niszczenia zmiennych
     RANDOMIZE USR 52585    (odpowiada to instrukcji GO TO 0)
  UWAGA: NIE MOŻE TO BYĆ PIERWSZE URUCHOMIENIE PROGRAMU!

     Jeżeli w skompilowanym programie znajdzie się instrukcja
  GO TO 10000 to nastąpi powrót do programu nadrzędnego
  (z którego skompilowany program został wywołany).
  Można wielokrotnie wywoływać skompilowany program z progra-
  mu nadrzędnego przez USR 52585, a w programie nadrzędnym
  umieścić te operacje, których nie można wykonać w skompilo-
  wanym programie (np. współpracę z dyskami, microdrive, itp.)

  6.OUT OF MEMORY --------------------------------------------

     Komunikat ten może pojawić się podczas:
   - ładowania programu z taśmy
   - kompilacji
   - wykonywania skompilowanego programu (najczęściej przy
  próbie wykonania instrukcji DIM)
     W takich przypadkach należy stwierdzić co jest przyczyną
  błędu i jak najlepiej go uniknąć.
  ---Najprostszą metodą jest przesunięcie RAMTOPu (CLEAR nn)
  w górę lub w dół w zależności od tego w którym obszarze
  następuje przepełnienie.
  ---Można skorzystać z opcji powodującej tworzenie krótszego
  kodu podczs kompilacji. Wykonując
     POKE 53252,0
  uzyskujemy tzw. kompilację bez numerów linii.Kod wynikowy
  jest krótszy o ok.15 % i wykonuje się nieco szybciej, ale
  ewentualne komunikaty o błędach nie dają poprawnych numerów
  linii.
     Kompilację z numerami przywraca się przez POKE 53252,55
  ---Można również skorzystać z programów skracających kod
  źródłowy (np. MASTER TOOLKIT, SUPERCODE, COMPACT)
  ---Jeśli OUT OF MEMORY wystąpi w wykonującym się programie,
  to można przesunąć skompilowany program w inne miejsce,
  gdyż tworzony przez kompilator kod wynikowy jest przesuwalny
  W pewnych wypadkach jednak (instrukcje INPUT, VAL, VAL$ i
  innych) może się zdarzyć koniecznosć przesunięcia programu
  w górę. Częściej jednak musimy przesuwać program w dół dając
  w ten sposób więcej miejsca podczas wykonywania instrukcji
  DIM, czasem LET, VAL i innych.
     W szczgólności można nagrać kod wynikowy na taśmę, usunąć
  program w Basicu za pomocą NEW, wykonać CLEAR 24099
  a następnie za pomocą LOAD""CODE 24100 wczytać kod od adresu
  uprzednio nagrany kod wynikowy. Program uruchamiamy za
  pomocą RANDOMIZE USR 24100.
     Taki zabieg daje dodatkowe 15 KB pamięci dla programów,
  które wykorzystują duże tablice, lub długie łańcuchy.

  7.Duże programy --------------------------------------------

     Standardowo podczs kompilacji nie jest niszczony program
  żródłowy. Jednakże, jeżeli mamy do czynienia z programem
  zajmującym więcej niż 12 KB, to jest mało prawdopodobne, aby
  kod wynikowy zmieścił się w wolnej pamięci.
     Programy długie, nawet do 25 KB, można kompilować
  wykorzystując opcję niszczenia programu żródłowego podczas
  kompilacji (kod wynikowy jest ładowany na miejsce kompilowa-
  nego programu żródłowego) oraz częściowo wykorzystuje
  pamięć ekranu w pierwszej fazie kompilacji.
     Opcję uruchamiamy wykonując : POKE 53240,0
     a wyłączmy przez            : POKE 53240,55
     Wartość RAMTOPu nie ma tu znaczenia o ile program żródło-
  wy mieści się w pamięci, i RAMTOP jest mniejszy od 50739,
  gdyż kompilator sam ustala optymalne położenie RAMTOPu po
  uruchomieniu kompilacji.
     Po zakończeniu kompilacji RAMTOP jest ustawiany
  instrukcją CLEAR 24099, a kod wynikowy zajmujący pamięć
  od adresu 24100 uruchamiamy pisząc RANDOMIZE USR 24100.
     Wskazane jest równoczesne użycie opcji kompilacji bez
  numerów linii (patrz pkt 6).

  8.Uwagi ----------------------------------------------------

     a)Skompilowany program można wywołać z dowolnego innego
  programu.
     b)Istnieje możliwość ustalenia adresu, od którego będzie
  tworzony kod wynikowy w przypadku kompilacji bez niszczenia
  programu. Do tego celu służą komórki 58112 i 58113. Jeżeli
  obie zawierają 0, to kod wynikowy jest tworzony od RAMTOP+1.
  W pozostałych wypadkach ich zawartość będzie traktowana jako
  adres początku tworzonego kodu wynikowego tzn.
   ADRES=PEEK 58112+256*PEEK 58113.
  Ważne jest, aby adres ten był większy od RAMTOPu i nie
  przekraczał adresu 50740. Obszar od RAMTOPu do tego adresu
  można wykorzystać do celów specjalnych np. do przechowywa-
  nia danych lub programów w kodzie maszynowym.
     c)można dopisać do programu
         1 IF 1/888.5 THEN RANDOMIZE USR 53100: RANDOMIZE USR
      ADR: STOP
         2 ...(tekst programu)
   wówczas instrukcja RUN od razu wywołuje kompilcję i
  przechodzi do wykonywania skompilowanego programu.
     d)Skompilowany program korzysta z procedur zawartych w
  obszarze kompilatora. Dlatego, w trakcie wykonywania
  skompilawanego programu, całość kompilatora musi znajdować
  się w pamięci komputera.
     e)Komórki 55631 i 55632 zawierają informację o adresie,
  od którego jest tworzony kod wynikowy przy kompilacji ze
  zniszczeniem programu żródłowego (patrz pkt 7),
  czyli standardowo PEEK 55631+256*PEEK 55632=24100

  9.Nagrywanie i wczytywanie tablic --------------------------

    Komórka o adresie 52502 służy do przechowywania jednolite-
  rowej nazwy tablicy, na której chcemy dokonać operacji.
    Komórka o adresie 52503 przechowywany jest typ tablicy:
         132 - tablica numer.  130 - tablica łańcuchowa
  Dwa programy w kodzie maszynowym zwracają parametry tablicy:
        USR 52504 - adres początkowy tablicy
        USR 52525 - długość tablicy
  Przykładowo jeżeli chcemy przechować tablicę tablicę numery-
  czną o nazwie a, to wykonujemy:
     10 POKE 52502,CODE "a"
     20 POKE 52503,132
     30 SAVE "nazwa" CODE USR 52504, USR 52525
  Podobne operacje należy wykonać przy wczytywaniu i weryfika-
  cji tablic.

  UWAGA:Przy wczytywaniu tablicy w pamięci musi być zadeklaro-
  wana dokładnie taka sama tablica jak wczytywana (typ, liczba
  wymiarów, poszczególne wymiary). Położenie tablicy w pamięci
  może się zmieniać, dlatego przy wczytywaniu tablicy wskazane
  jest podanie jawnie obydwu parametrów tablicy tzn.
     LOAD ""CODE USR 52504,USR 52525 a nie tylko LOAD ""CODE.

     Istnieje również możliwość wczytywania i nagrywania
  tablic z wykorzystaniem pamięci dyskowej. W tym celu należy
  przerwać wykonywanie skompilowanego programu (patrz pkt 5),
  a następnie wykonać operację na tablicy z poziomu Basica np.
     10 POKE 52502,CODE "a"
     20 POKE 52503,132
     30 SAVE *"nazwa" CODE USR 52504, USR 52525
  UWAGA:Ważne jest, aby przerwać wykonywanie programu w taki
  sposób, by móc następnie kontynuować wykonanie przerwanego
  programu (patrz pkt 5).

  ____________________________________________________________
  ___ POLECENIA NARZĘDZIOWE I INNE ___________________________

     Polecenia narzędziowe są aktywne po wczytaniu pakietu,
  tak długo, dopóki nie zostanie wykonana instrukcja NEW.
  W takim wypadku możemy ponownie uaktywnić te polecenia za
  pomocą RANDOMIZE USR 50740.

  1.Polecenie STEP a,b (Auto)
    powoduje automatyczną numerację linii przy edycji
    wyłączenie przez skasowanie linii będącej w edycji.
  2.Polecenie LINE a,b (Renumber)
    przenumerowanie całego programu. Etykiety instrukcji
  GO TO, GO SUB, RESTORE, RUN, LIST, LLIST
  są również odpowiednio zmieniane, o ile etykietą jest
  pojedyńcza liczba (nie wyrażenie arytmetyczne). Pisząc :
      LINE 100,10  (LINE początek,krok)
  uzyskamy przenumerowanie programu tak, że pierwsza linią
  będzie linia o numerze 100 a odstęp pomiędzy dwoma kolejnymi
  liniami będzie wynosił 10.
  3.Polecenie NOT a,b (Delete)
    kasowanie linii programu od a do b.
    Obszar zmiennych nie jest kasowany.

  UWAGA:Wszystkie polecenia wymagają podania 2 parametrów.

  A.ZAMALOWYWANIE FIGUR ZAMKNIĘTYCH
     Algorytm jest wzorowany na programie ZAMALUJ (Roland
  Wacławek Komputer 1/86). W celu zamalowania figury podajemy
  najpierw współrzędne punktu startowego:
     10 POKE 23728,(współrzędna x)
     20 POEK 23729,(współrzędna y)
     30 RANDOMIZE USR 51847 (wypełnianie plamą)
                      51850 (wypełnianie siatką)
                      51856 (usuwanie obszaru)

  B.DUŻE NAPISY
    Algorytm jest wzorowany na programie z kasety HORIZONS.
  W celu wydrukowania napisu ze zmiennej d$ należy:
    9800 LET A=23306: POKE A,X: POKE A+1,Y: POKE A+2,XS
         POKE A+3,YS: POKE A+4,W: LET A=A+4: FOR I=1 TO LEN D$
         : POKE A+I,CODE D$(I): NEXT I: POKE A+I,255: RANDOMIZ
         E USR 51972
   X,Y   - współrzędne pixelowe pierwszego znaku
   XS,YS - x-owy i y-owy rozmiar znaków
   W     - odstęp między znakami (najepiej w=8)
  ____________________________________________________________
  ___ WAŻNE ADRESY W PAKIECIE TOBOS-DYD ______________________

  50740 - pocz., uaktywnianie poleceń narzędziowych
  51847 - wypełnianie plamą
  51850 - wypełnianie siatką
  51856 - usuwanie obszru
  51972 - drukowanie dużych napisów
  52502 - nazwa tablicy
  52503 - typ tablicy (132 - numeryczna, 130 - łańcuchowa)
  52504 - prpcedura podająca adres początkowy tablicy
  52525 - procedura podająca długość tablicy w bajtach
  52575 - CONTINUE
  52585 - GO TO 0  (ciepły start)
  53100 - Uruchomienie kompilacji
  53240 - 0-niszczenie programu żródł,  55-bez niszczenia
  53252 - 0-bez numerów linii           55-z numerami linii
  55631/55632 - adres kodu wyn. przy niszczeniu programu
  58112/58113 - adres kodu wyn. bez niszczenia programu
