        K U M A   B A S I C

     interpreter & kompilator





    
 Interpreter KUMA BASIC je asi třikrát
rychlejší než standardní SHARP Basic.
KUMA compiler je asi dvacetkrát ry-
chlejší.

 KUMA je Basic celých čísel z intervalu
+/- 32767, má omezená stringová možnos-
ti, a některé příkazy standard Basicu
nezná.

 KUMA má rozdílnou strukturu od Sharp
Basicu a programy nahrané na kazetě ne-
můžeme zaměňovat.




 PŘÍKAZY SHODNÉ S SHARP BASIC

  
 IF..THEN FOR..NEXT STEP  ON     GOTO
 GOSUB    RETURN    REM   INPUT  STOP
 END      BYE       POKE  TO     MUSIC
 TEMPO    ABS       SGN   PEEK   NEW
 RUN      LOAD      LIMIT SAVE   VERIFY
 INP      OUT       CLR   CURSOR(H/V)




 ODLIŠNÉ KUMA PŘÍKAZY

  ADRS
 A=ADRS(B); přiřadí A adresu, na které
je uložena hodnota proměnné B.

  APPEND
 Nahraje program z kazety a program
v paměti nezniěí. Druhý program musí
být číslován výse než první.

  BELL
 Zvukový generátor, stejné jako USR(62)
v Sharp Basicu.

  CURSOR H,V
 Pozice kurzoru v souřadnicích.


CALL
 Volání rutiny v strojovém kódu,např.
CALL $62.

  CURH X, CURV X
 Pozice kurzoru; horizontálně (0-39),
vertikálně (0-24).

  CP$(
 W=CP$($XXXX,$YYYY,"A") porovná stringy
začínající na adresách $XXXX a $YYYY.
Jestliže se shodují před znakem A prv-
ního stringu, pak W=1, jinak W=0.

  CPI(
 W=CPI($XXXX,"AB.."); W=1, jestliže
řetězec od adresy $XXXX začíná "AB..",
jinak W=0.

  DELETE X,Y
 Maže řádky od X-té do Y-té.

  DEC(
 A=DEC(A); provede A=A-1, ale rychleji.

  GET
 A=GET; čeká na stisknutí tlačítka a
přiřadí A jeho ASCII kód. Možno použít
pro A i A$.

  GET@ H1,V1,H2,V2 $ZZZZ
 Uchová od adresy $ZZZZ display kódy,
ktere jsou zobrazeny v obdelníku o sou-
řadnicích H1,V1,H2,V2.

  INPUT
 Numerický vstup.

  INKEY
 A=INKEY; jako GET bez čekání na stisk.

  IF
 Možno užívat pouze konstrukce IF..GOTO
a IF..THEN PRINT.

  INC
 A=INC(A); A=A+1 rychle.

  LINPUT
 LINPUT A; vstup řetězce znaků, které
se ukládají od adresy A jako string
o délce 41 nebo 81 ASCII znaků. Kratší
stringy jsou ukončeny $0D (CR).

  LINE H1,V1,H2,V2,Z
 Kreslí přímku (Z=1), nekreslí přímku
(Z=0). H ? 0..79, V ? 0..49.

  LIST X,Y
 Výpis od X do Y; X,Y nepovinné.

  MON
 Skok do KUMA monitoru.

  MOD(X,Y)
 Funkce X mod Y.

  NEXT
 Nepoužívat NEXT X,Y, ale NEXT X:NEXT Y

  OR XOR AND
 Logické operace, operandy v zavorkách.
Možno použít +-*.

  POP X
 Vybírá proměnnou ze zásobníku.

  PR MODE X
 Nastavuje v/v mód.
    X=0  tisk na obrazovku
      1       na tiskárnu
      2       oboji

  PLOT H,V,Z
 Pro Z=0 odpovídá RESET H,V, pro Z=1
SET H<V. Rozsahy jako u příkazu LINE.


  PUT@ H1,V1,H2,V2,$ZZZZ
 Opačně než u příkazu GET@.

  PRINT
 Tisk bez užití CR. Užij "/" pro oddě-
lení řádku.

  PRINT%X
 Povoluje tabelaci.
Př.: A=5,B=500
    PRINT%0,A,/B      PRINT%3,A/B
    5                   5
    500               500

  PRINT X
 Převádí na hexa číslo, X je počet
míst (2 nebo 4).Např.: PRINT " 60 dá
3C.

  PRINT $
 Převádí z hexa do decimal.

  PRINT &
 Ekvivalent CHR$. PRINT &65 dá "A".

  PRINT TAB(X);"A"
 Tabelace.

  PRINT retezců
 Užitím PUSH $XXXX:CALL $1256. Vytiskne
se string od adresy $XXXX končící  $0D.

  PUSH X
 Uloží prom. X na vrchol zásobníku.

  RND(X)
 Generuje náhodná čísla 0..X.

  REPEAT..UNTIL
 Známý Pascalovský cykl.

  STA$($XXXX,"A..")
 Ukládá string "A.." od adresy $XXXX.
Chceme-li tisk stringu pomocí CALL$1256
musíme za string uložit $0D.

  SOUND X
 Produkuje spojitý tón, X je 256 (nej-
vyšší)..32767 (nejnižší). 0 vypíná tón.

  SHIFT&BREAK
 Dojde-li k resetu, teplý start $1203.

  SPEEK (H,V)
 Obrazový PEEK.

  SPOKE H,V,Z
 Obrazový POKE; Z je display kód.

  SYSTEM
 Zobrazí začátek a konec zdrojového
programu a vrchol paměti.

  $
 Indikuje hexa číslo.

  STEP
 Nesmí být záporný.

  TEXT XXXX
 Mění začátek zdrojového textu z nor-
málního ($4000) na $XXXX.

  TIME
 TIME=0 a PRINT TIME místo TI$="000000"
a PRINT TI$.

  VLIST
 Vytiskne všechny proměnné a jejich
hodnoty.

  UŽITÍ BAREV
 Barevný kód je hexa číslo $XY, X a Y
jsou barvy 0..7. Po zavedení barev pří-
kazy PUSH $XY:CALL $1266 a CALL $1274
bude celá obrazovka zabarvena požadova-
nou barvou. Pri scrollu se do nových
řádek vrací monitorová barva.


   STRUKTURA KUMA BASIC

       VRAM                 VRAM
    ----------   $D000   ----------
    ----------   $BB00
     COMPILER
    ----------   $9800
     MACHINE
      CODE
    ..........   $8000

       BASIC
     PROGRAM
    ----------   $4000
      WORK
      AREA
    ----------   $3400
                         ..........
      BASIC               MACHINE
    INTERPR.               CODE
    ----------   $1E00   ----------
    RUN-TIMES            RUN-TIMES
    ----------   $1200   ----------
     MONITOR              MONITOR
    ----------   $0000   ----------


 Kompilátor překládá do strojového kódu
částečně pomocí identifikace a volání
run-times rutin, ktere jsou umístěny
na začátku Basicu ($1200-$1E00), a čás-
tečně přímou konstrukcí kódu. Nový kód
je nejprve umístěn do dočasné paměti
pro testování. Jestliže se v kompilaci
objeví chyby, lze je opravit. Bezchyb-
ný soubor je rekompilován a umístěn
hned za run-times rutiny (od $1E00)
na místo dřívějšího Basic interpreteru.
 Při kompilaci jsou zobrazeny adresy
uložení relativního kódu, uloženi pro-
měnných, počáteční a poslední adresa
vygenerovaného kódu (kromě run-times
rutin). V případě vzniku chyby, kompi-
lace se zastaví na defektní řádce. Od-
povědí na prompt KUMA monitoru "M:",
která je B, se vrátíme do Basicu.
 KUMA kompiler je na $9800-$BB00.

 KUMA kompiler voláme příkazem
CALL $9800.

 Kompilace do dočasné paměti a spuětě-
ní testu:
 SOURCE PROGRAM ADRS:   $4800
 OBJECT PROGRAM ADRS:   $8000
 WORKING AREA   ADRS:   $3400
 M:                     J8000

 Konečná kompilace:
 M:                     J9800
 SOURCE PROGRAM ADRS:   $4000
 OBJECT PROGRAM ADRS:   $1E00
 WORKING AREA   ADRS:   $3400

 Adresa konce strojového kodu ZZZZ se
zjistí ze zprávy "OBJECT SIZE: XXX (
$YYYY-$ZZZZ)". Nahrání zkompilovaného
programu na kazetu:
 M:             S
 FILENAME:      Jméno programu
 START:         1200
 END:           ZZZZ
 AUTO:          1200
 RECORD.PLAY












   KUMA MONITOR

 Může být vyvolán příkazem MON. Ohlásí
se promptem "M:".

 Příkazy

  BASIC
 Formát B; vrací řízení do Basicu.

  DISPLAY
 Formát D XXXX; Vypíše na obrazovku
obsah od hexa adresy XXXX (8 byte na
řádek). SPACE = přerušení, SHIFT&BREAK
zpusobí zastavení.

  EDIT
 Formát E; po příkazu D a pomocí kurzo-
rových kláves editace stroj. kódu.
Stisknutí CR = přechod na další řádku,
; = konec editace.

  JUMP
 Formát JXXXX; skok na adresu XXXX.

  SAVE
 Format S; save programu. Syntaxe pří-
kazu viz výše.




    PROGRAMOVÉ POKYNY PRO UŽIVATELE

  1.Uchovávání řetězců
 Pro uchovávání řetězců slouží pomoc-
né pole nad kompilátorem (BB00-CFFF).
A string není odkaz na řetězec A$, ale
na proměnnou A, která udává adresu, na
které je řetězec uložen.
 Př.: Obě procedury čtou vstupní řetěz-
ce, uchovávají na $BB00 a potom tisk-
nou.
 10 N=$BB00:LINPUT N:PUSH N:CALL $1256:
    PRINT /
 10 LINPUT $BB00:PUSH $BB00:CALL $1256:
    PRINT /

  2.Deklarace jednorozm. pole
 Velikost pole není limitována, nesmí
se použít DIM; uživatel definuje poč.
adresu pole.
 Př.:Použití pole A(0..5) od $BC00.
  10 A=$BC00:FOR X=0 TO 5:A(X)=X*3:NEXT

  3.Číselné pole sloužící pro stringové
    pole
 Proměnné typu čís. pole jsou ukazatele
na adresy uložení stringů.
Př.:Procedura čte 5 řetězců. Všechny
řetězce (mají 41 bytů) jsou uloženy od
adresy $C500.Pole ukazatelů od $C000.
 Př.:Procedura čte 5 řetězců. Všechny
  10 K=$C000:FOR X=0 TO 4:K(X)=$C500+X
     *41:NEXT
  20 FOR X=0 TO 4:PRINT"VLOZ",X,/:
     LINPUT K(X):NEXT

  4.Interpreter neumí zpracovat čísla
    větší než 32767.
 Nevztahuje se na POKE a PEEK. Špatné
řešení(řádek 10), správné řešení (r.20).
  10 FOR X=53248 TO 53258:POKE X,65:
     NEXT
  20 FOR X=248 TO 258:POKE 53000+X,65:
     NEXT

  5.Print mode příkaz
 Správná syntaxe "PRMODE".

  6.Prikazy GET@ a PUT@
 Adresy zón mohou být dekadické i hexa
čísla ($).

  7.READ a DATA
 Tyto příkazy KUMA nezná, ale jde to i
bez nich. Záleží na použití. Jedním
z problémů je přímý přístup do seznamu
řetězců, např. pro test slovíček. Prv-
ní příklad ukazuje klasickou strukturu
Basic, druhý ukazuje řešení v KUMA.
Pozn.:U KUMA na řádce 40 je za každý
string vkládán koncový znak CR (0D).

 10 W=5:REM W=Počet slov+1
 20 DATA DUM,HOUSE,PES,DOG,DVERE,DOOR
 30 DATA ZED,WALL
 40 RESTORE:FORX=1 TO INT(RND(1)*W)
 50 READ Q$,A$:NEXT
 60 PRINT "PRELOZ ";Q$:INPUT G$
 70 IF G$=A$ THEN PRINT "ANO":GOTO 40
 80 PRINT "NE, SPRAVNE JE";A$:GOTO 40

 10 W=4:REM W=Počet slov
 15 L=8:REM Max Délka slov+2
 20 Q=$C000:A=$C500
 25 STA$(Q,"DUM   PES   DVERE ZED   ")
 30 STA$(A,"HOUSE DOG   DOOR  WALL  ")
 40 FOR X=1 TO W:POKE Q-1+X*L,13
 45 POKE A-1+X*L,13:NEXT
 50 V=(RND(W)-1)*L:PRINT "PRELOZ "
 55 PUSH Q+V:CALL $1256:PRINT/
 60 LINPUT $CA00:C=CP$(A+V,$CA00,"")
 65 IF C THEN "ANO":GOTO 50
 70 PRINT "NE, SPRAVNE JE ":PUSH A+V
 75 CALL $1256,/:GOTO 50

 +---------------------------------+
