Microsoft Basic för Microbee

Martin Fahlgren -84


Förord

Denna kortfattade sammanfattning av Microsoft Basic (MBASIC) bygger på Microsoft Basic User's Guide och Reference Manual. Samtliga kommandon, instruktioner, funktioner och felmeddelanden behandlas. Genomgången är summarisk och exemplen få och kortfattade. Skriften lämpar sig därför inte som en "nybörjarbok", utan mer som en "handbok" för de som redan kan Basic, men behöver en sammanställning av de kommandon, instruktioner osv som finns tillgängliga i MBASIC. Den som önskar fylligare information kan rådfråga ovannämnda manual eller några av de böcker som nämns i litteraturlistan i slutet av häftet.

Vi vill också nämna de programmeringshjälpmedel som finns att köpa från Bergsala Data. "Grafikeditor MS-Basic", "Tips och finesser med Microsoft Basic" m fl. Bl a så kan du åstadkomma grafik av den typ som visas i menyerna i "SHELL"-systemet, men även för annan grafik är detta utmärkta hjälpmedel. Dessa disketter finns tillgängliga f o m november 1984.

Förutom genomgången av själva "språket" har ett avsnitt med tips om hur MBASIC kan användas på MicroBee tillagts. Där finner du hur man kan åstadkomma "omvänd" utskrift, markörpositionering, grafik m m.

Den här skriften är skriven på Microbee 128 med WordStar ordbehandling, utskriften har skett med TEC 1500.

Microsoft and MS are trademarks of Microsoft Corporation.
CP/M is a trademark of Digital Research.
Z 80 is a trademark of Zilog Corporation.

© Bergsala Data AB


Innehållsförteckning

1. Allmänt

Start av Basic
Operationsmoder
Programrader
Teckenuppsättning
Konstanter
Variabler
Operatorer

2. Kommandon, instruktioner och funktioner

3. Felmeddelanden

4. MBASIC på MicroBee

Enklare "rutiner"
Användardefinierade funktioner
Grafik

Litteraturtips

Förkortningar

I texten används ett antal förkortningar enligt nedan:

bokst bokstav
hit heltal
konst konstant(er)
radnr radnummer
rel-op relationsoperator
re reell(t)
str sträng
tkn ASCII-tecken
uttr uttryck
var variabel
< > icke obligatorisk, dvs valfri parameter
<Return> vagnretur (tryck på Return-tangenten)
Ctrl-C samtidig nedtryckning av tangenterna Ctrl och C

1. Allmänt

1.1 Start av Basic

Syntaxen är:

MBASIC <filnamn></F:filantal></M: högsta minnesadress></S:max poststorlek>

Möjligheterna är således många. Några exempel:

  1. MBASIC (laddar MBASIC)
  2. MBASIC /F:hlt-uttr (reserverar även minne för det antal filer som anges av hlt-uttr - standardvärdet om /F: ej anges är 3)
  3. MBASIC filnamn (laddar först MBASIC och laddar och kör sedan namngiven fil med filtyp .BAS)
  4. MBASIC filnamn.typ (samma som föregående men filen har angivet filtypstillägg)

OBS att vad gäller filnamn gör MBASIC (i motsats till CP/M) åtskillnad mellan stora och små bokstäver, dvs "program1" och "PROGRAM1" anger två olika filer. Skulle du någon gång inte kunna ladda ett program som finns i filbiblioteket bör du kontrollera om det är skrivet med stora eller små bokstäver. Sådana problem kan minimeras om du gör till vana att alltid använda stora bokstäver när du ska spara program från MBASIC.

För att återvända till operativsystemet (CP/M eller "SHELL") från MBASIC används kommandot SYSTEM.

1.2 Operationsmoder

Direktmod. Satser som ej föregås av radnummer utförs omedelbart efter inmatning och tryck på <Return>.

Indirekt mod. Satser som föregås av radnummer lagras för senare exekvering med användning av kommandot RUN.

Editmod. Satser som inskrivits i indirekt mod kan ändras med den inbyggda radorienterade editorn (se EDIT nedan).

1.3 Programrader

Programrader i ett MBASIC-program har formatet:

nnnnn Satser <:satser ... > <Return>

Flera satser kan placeras på en programrad, men måste då åtskiljas med kolon. En programrad får högst innehålla 255 tecken och radnumren måste ligga i intervallet 0-65529.

1.4 Teckenuppsättning

MBASIC godkänner alla skrivbara tecken samt följande styrtecken (kontrolltecken):

<Back Space> Raderar sist inskrivna tecken.
<Esc> Se EDIT.
<Tab> Flyttar till nästa tabuleringsstopp (8 kolumner).
<Line Feed> Flyttar till nästa fysiska rad.
<Return> Avslutar inmatning av rad.
Ctrl-A Medför EDIT-mod på den rad som inmatas eller inskrevs sist.
Ctrl-C Avbryter programkörning och återför till MBASIC-nivån
Ctrl-G Ger pip i terminalens högtalare (Bell).
Ctrl-H = <Back Space>
Ctrl-I = <Tab>
Ctrl-O Avbryter program-utmatning medan programkörningen fortsätter. Ett nytt Ctrl-O återupptar utmatningen.
Ctrl-R Skriver om den rad som håller på att inmatas.
Ctrl-S Stoppar upp programkörning.
Ctrl-Q Återupptar programkörning efter ett Ctrl-S.
Ctrl-U Raderar den rad som håller på att inskrivas.

1.5 Konstanter

Strängkonstanter. Upp till 255 alfanumeriska tecken inneslutna i citationstecken, t ex "Telefonnumret är 12 34 56".

Heltalskonstanter. Heltal mellan -32768 och +32767.

"Fixed point"-konstanter. Positiva el. negativa reella tal (t ex -.8).

Flyttalskonstanter. Positiva el. negativa reella tal i exponentiell form. Det tillåtna talområdet är 10-38 till 10+38 och kan antingen representeras med 'enkel' eller 'dubbel' precision:

Enkel precision (lagras med 7 siffror och skrivs ut med 6 siffrors noggrannhet):
123.456 E-4 (=0.0123456)
Dubbel precision (16 siffror):
1.234567890123456D3 (=1234.567890123456)
OBS att i detta fall används 'D' i stället för 'E'.

Enkel precision erhålls om ett av följande gäller:

  1. Sju eller färre siffror.
  2. Exponentform med användning av E.
  3. Talet avslutas med ett utropstecken (!).

Dubbel precision:

  1. 8 eller fler siffror.
  2. Exponentform med användning av D.
  3. Talet avslutas med tecknet #.

Hexadecimala konstanter. Betecknas med prefixet &H (t ex &H1F).

Oktala konstanter. Betecknas med prefixet &0 eller & (t ex &012 resp &17).

1.6 Variabler

Variabelnamn kan vara godtyckligt långa. 40 tecken är signifikanta. Bokstäverna A-Z, siffror och punkt (.) kan användas, men det första tecknet måste vara en bokstav (OBS att de svenska bokstäverna A, Ä och Ö ej kan användas). MBASIC gör ingen åtskillnad mellan stora och små bokstäver i variabelnamn.

Ett variabelnamn får ej vara ett reserverat ord (nyckelord), men "inbäddade" sådana är tillåtna.

Strängvariabelnamn skrivs med ett $ som avslutande tecken. Numeriska namn kan typdeklareras enligt följande:

% heltal (t ex ANTAL%)
! flyttal enkel precision (t ex PI!)
# flyttal dubbel precision (t ex PI#)

Numeriska variabler antas vara flyttal i enkel precision om de ej definierats annorlunda.

En annan metod att deklarera variabeltyper är med instruktionerna DEFINT, DEFSTR, DEFDBL och DEFSNG - se nedan.

För arrayvariabler (indicerade variabler) gäller samma namngivningsregler som ovan. Maximala antalet dimensioner är 255 och maximala antalet element per dimension är 32 767. Arrayer med mer än 11 element måste dimensioneras.

Om en numerisk variabel av en typ tilldelas en numerisk konstant av annan typ kommer talet att lagras som den typ som deklareras av variabelnamnet. T ex:

10 A%=15.4
20 PRINT A%
RUN
 15

När ett flyttalsvärde omvandlas till ett heltal avrundas decimaldelen:

10 B%=65.67
20 PRINT B%
RUN
 66

1.7 Operatorer

I det följande listas operatorerna i prioritetsordning, dvs i den ordning de utförs. (De som har lika prioritet utförs från vänster till höger.)

Operator Betydelse Exempel
^ exponentiering A^B
- teckenbyte -A
*,/ multiplikation, division (flyttal) A*B, A/B
Ö heltalsdivision 10Ö4=2
MOD resten vid heltalsdivision 10 MOD 4=2 (10/4=2, rest 2)
+,- addition, subtraktion A+B
= lika med A=B
<> ej lika med A<>B
< mindre än A<B
> större än A>B
<= mindre än eller lika med A<=B
>= större än eller lika med A>=B
NOT Icke (negation) IF NOT OK THEN FEL
AND Och (konjunktion) IF OR AND OK THEN PRINT "!"
OR Eller (disjunktion) IF FEL OR A<B THEN PRINT "?"
XOR Exklusivt eller IF A=B XOR A=C THEN PRINT "."
IMP Implicerar IF A IMP B THEN PRINT "VSB"
EQV Ekvivalens IF A=B EQV C=D THEN GOSUB 100

Relationsoperatorerna (= t o m >=) ger värdet -1 om uttrycket är sant och 0 om det är falskt.

Strängar kan jämföras med hjälp av relationsoperatorerna. Strängjämförelsen går till på så sätt att ett tecken i taget tas från vardera strängen varefter tecknens ASCII-kod jämförs. Om alla ASCII-koder är lika är strängarna lika. Om slutet på en av strängarna nås innan någon skillnad upptäckts bedöms den kortare strängen som mindre.

Tecknet + kan användas för att sammanfoga flera strängar till en sträng.

Parenteser kan användas för att ändra den ordning i vilken operationer utförs.


[Innehåll]


2. Kommandon, instruktioner och funktioner

I det följande visas syntaxen längst till vänster. Vidare beskrivs vad nyckelordet gör och visas exempel på hur det används.

ABS(X)
Ger absolutbeloppet av X.
PRINT (7*(-5))
 35
ASC(X$)
Ger ASCII-koden för X$.
PRINT ASC("T")
 84
ATN(X)
Ger arcustangens av X uttryckt i radianer. Beräkningen sker i enkel precision.
PRINT ATN(3)
 1.24905
AUTO <radnr<,ökning>>
Ger automatisk radnumrering vid inmatning av program. Parametrarna är valfria. radnr anger första radnumret. Standardvärdena för båda parametrarna är 10, som alltså erhålls om de ej anges.
 
AUTO startar med radnr 10, ökning 10.
AUTO 1000 startar med radnr 1000, ökning 10.
AUTO 100,50 startar med radnr 100,ökning 50.
 
CALL <(var-lista)>
Överför kontrollen till maskinspråksrutin som börjar på adressen som anges av var och överför argumenten i var-lista till den yttre rutinen (denna får enbart innehålla variabler).
100 SUBRUT=&HF00
110 CALL SUBRUT(I,J,K) 
CDBL(X)
Konverterar X till ett tal med dubbel precision.
10 A=1: B=3: PRINT A/B, CDBL(A)/CDBL(B)
RUN
 .333333      .3333333333333333
CHAIN <MERGE> "filnamn" <,<radnr><,ALL><,DELETE <radnrl-radnr2>>
Används för att ladda nytt program och till detta överföra variabler (med ALL eller COMMON) från det program som befinner sig i datorns minne. Om radnr (kan ges som ett uttryck) anges startar det anropade programmet på detta radnummer, i annat fall börjar exekveringen med första programraden. MERGE tillåter att en subrutin läggs till programmet i minnet som en "overlay" (subrutinen måste då vara lagrad i ASCII-format - se SAVE). Några exempel ges nedan.

CHAIN "PROG2" Laddar och exekverar PROG2. Värden som angetts med COMMON (se detta) i det anropande programmet (vilket raderas) överförs.

CHAIN "PROG2",1000,ALL Som ovan, men startar exekveringen av PROG2 på programrad 1000 samt överför alla variabelvärden.

CHAIN "PROG2",1010,DELETE 1000-2000 Som ovan men raderar raderna 1000-2000 i det anropande programmet.
 
CHR$(I)
Ger en sträng vars enda tecken har ASCII-koden I.
PRINT CHR$(26) 'Rensar bildskärmen
PRINT CHR$(65)
A
CINT(X)
Avrundar X till heltal. X måste ligga inom heltalsområdet (i annat fall erhålls "Overflow"-fel).
PRINT CINT(45.78)
 46
CLEAR<,<uttr1,uttr2>>
Sätter alla numeriska variabler till 0, alla strängar till nollsträngar och stänger alla filer, samt - valfritt - högsta minnesadress tillgänglig för MBASIC (uttr1) och stackutrymme (uttr2) (standard 512 bytes).
CLEAR
CLEAR,32768
CLEAR,,2000
CLEAR,32768,2000 
CLOSE <<#>filnr<,<#> filnr...>>
Stänger diskfiler. CLOSE utan argument stänger alla öppna filer.
100 CLOSE #1 : REM stänger fil nr 1 
COMMON var-lista
Fastställer vilka variabelvärden som ska överföras till ett CHAIN-at program. Indicerade variabler specificeras med att lägga till "()" till variabelnamnet.
100 COMMON A,B,C,D(),G$
110 CHAIN "PROG2",10
CONT
Återstartar körning av program som stoppats med STOP, END eller Ctrl-C.
COS(X)
Ger cosinus av X (X i radianer). Beräknas i enkel precision.
PRINT(2*COS(.4))
 1.84212
CSNG(X)
Konverterar X till ett tal med enkel precision.
10 PI#=3.141592653589794:PRINT PI#;CSNG(PI#)
RUN
 3.141592653589794 3.14159
CVI(2-bytes str) CVD(4-bytes str) CVS(8-bytes str)
Omvandlar strängvärden till numeriska värden (används  i samband med direktfiler). Numeriska värden som läses  in från en direktfil måste omvandlas från strängar tillbaka till tal. CVI konverterar en 2-bytes sträng till ett heltal, CVS en 4-bytes sträng till ett tal med enkel precision och CVD en 8-bytes sträng till ett tal med dubbel precision.
1020 GET #1
1010 FIELD #1,2 AS A$, 4 AS B$, 8 AS C$
1030 A%=CVI(A$):BI=CVS(B$):C#=CVD(C%)
DATA lista med konst
Följs av data (hlt-, re- eller str-konstanter) som läses av READ-sats.
10 DATA 1,2.5,HEJ,"Kalle Anka"
DEF FNnamn<(parametrar)>=funktionsdef
Tillåter användaren att definiera egna funktioner. Definitionen måste rymmas på en programrad, men det går att konstruera "funktioner av i funktioner" och på detta sätt delvis komma runt denna begränsning. Det är vidare möjligt att definiera funktioner, av både numerisk och strängtyp.
10 DEF FNPLURAL$(X$)=X$+"ar"
20 DEF FNAVST(X,Y)=SQR(X^2+Y^2)
DEFDBL bokst1<-bokst2>
Deklarerar variabler som börjar med bokst1 eller någon av bokstäverna i bokstavsintervallet bokstl-bokst2 som flyttal med dubbel precision (om inte variabeln omdefinieras med typdeklarationstecken (se variabler ovan). Man kan också göra uppräkning av bokstäver och/ eller intervall (åtskiljs då med kommatecken).
20 DEFDBL X-Z,S
DEFINT bokst1<-bokst2>
Som ovan, men heltalsvariabler.
10 DEFINT B
DEFSNG bokst1<-bokst2>
Som ovan, men flyttal med enkel precision.
30 DEFSNG I-N
DEFSTR bokst1<-bokst2>
Som ovan, men strängar.
40 DEFSTR A,C-H
DEF USR<n>=hlt-uttr
Specificerar startadressen för en maskinspråkssubrutin. n kan vara ett heltal 0-9. Om n ej anges tolkas detta som DEF USR0. Värdet av hlt-uttr är startadressen för USR-rutinen.
100 DEF USR1=20000
200 DEF USR2=&HC00
DELETE <radnrl><-radnr2>
Raderar angivna programrader.
DELETE 40  Raderar rad 40
DELETE -40 Raderar alla rader t o m rad 40
DELETE 1-9 Raderar raderna 1-9
 
DIM var(hlt-uttr)<, ... >
Reserverar minnesutrymme för indicerade variabler.
10 DIM A(20),NAMN$(200)
 
EDIT <radnr>
Används för att redigera programrad. Om radnr anges inträder MBASIC i EDIT-mod för angiven programrad. Om en punkt (.) skrivs i st f radnr erhålls EDIT-mod för den programrad som sist inskrevs. I EDIT-moden finns ett antal underkommandon som används vid redigeringen och som beskrivs nedan. EDIT-mod för den programrad som håller på att inmatas erhålls med Ctrl-A.

Underkommandon i EDIT-mod:

<hlt> <Mellanslag>
Om hlt anges flyttas markören hlt positioner åt höger. Annars flyttas markören 1 position.
<hlt> <Back Space >
Som ovan, fast åt vänster.
I
Ger infogningsläge, dvs tecken infogas där markören befinner sig. Infogningen avslutas med en tryckning på <Esc>. En tryckning på <Return> har samma effekt som en tryckning på <Esc> följt av <Return> (se nedan). <Back Space> och <Del> kan användas för att radera tecken till vänster om markören.
X
Flyttar markören till programradens slut och inför infogningsläge.
<hlt>D
Raderar hlt tecken till höger om markören. De tecken som raderas skrivs ut på bildskärmen mellan Ö:n.
H
Raderar alla tecken till höger om markören och inför infogningsläge.
<hlt>Stkn
Söker efter hlt:e förekomsten av tkn och placerar markören innan detta. Om hlt ej anges söks efter 1:a förekomsten. Om tkn ej hittas stannar markören vid radens slut.
<hlt>Ktkn
Liknar föregående, men alla tecken som passeras blir raderade.
Ctkn
Förändrar tecknet under markören till tkn.
<Return>
Skriver ut resten av programraden, sparar alla ändringar och lämnar EDIT-moden.
E
Samma som <Return>, men resten av raden skrivs ej ut.
Q
"Ångerkommandot". Avbryter EDIT utan att några av ändringarna som gjorts på programraden sparas.
L
Skriver ut resten av programraden och placerar markören i början av programraden, fortfarande i EDIT-mod. Används vanligen för att lista raden innan själva redigeringen på börjas.
A
Den ursprungliga programraden återställs (dvs utan ändringar) och markören placeras i början av raden, fortfarande i EDIT-mod.

När ett syntaxfel upptäcks under exekvering av ett program inträder MBASIC automatiskt i EDIT-mod för programraden i fråga. Om ett felaktigt kommando eller otillåtet tecken skrivs i EDIT-mod ger datorn ifrån sig en ljudsignal och kommandot/tecknet ignoreras.

END
Avslutar programkörning och stänger alla filer.
10000 END 'Ej nödvändigt i slutet av ett program
 
EOF(filnr)
Ger -1 (sant) om slutet på en sekventiell fil
100 IF EOF(1) THEN 200
 
ERASE array-var-lista
Eliminerar indicerade variabler från ett program, var vid de kan omdimensioneras eller det frigjorda minnesutrymmet användas för annat.
500 ERASE A,B
510 DIM A(100)
 
ERL
Ger radnumret för den programrad där fel inträffat.
500 IF ERL=radnummer THEN ...
 
ERR
Ger felkoden för inträffat fel.
510 IF ERR=felkod THEN
...
 
ERROR hlt-uttr
Används för att avsiktligt simulera BASIC-fel eller att tillåta användaren att själv definiera felkoder. För själva felhanteringen kan ERL och ERR användas (se ovan).
100 ON ERROR GOTO 500
110 INPUT "Hur mycket satsar du? ",A
120 IF 0100 THEN ERROR 210
500 IF ERR=210 THEN PRINT "Insats högst 100 kr!"
510 IF ERL=120 THEN RESUME 110
 
EXP(X)
Beräknar e (naturliga logaritmens bas) upphöjt till X.
X måste vara <=87.3365.
PRINT EXP(4)
 54.5982
 
FIELD <#>filnr,fältbredd AS str-var<,->
Avsätter utrymme för variabler i direktfil-buffert.
10 FIELD 1,2 AS H$,4 AS F$,8 AS D$,20 AS NAMN$
20 GET 1
30 A%=CVI(H$), BI=CVS(F$), C#=CVD(D$)
40 PRINT A$,B!,C#,NAMN$
 
FILES <d:><"filnamn">
Skriver ut filbibliotek på inloggad eller angiven (d:) skivenhet. Om filnamn ej anges utskrivs alla filer på skivenheten. Filnamnsprofiler (? för enskilt tecken,* för ett helt ord) kan användas.
 
FILES "B:*.BAS" listar alla .BAS-filer på enhet B.
 
FIX(X)
Ger heltalsdelen av X (dvs decimalerna stryks). Den viktigaste skillnaden mellan FIX och INT är att FIX ej ger närmaste mindre tal för negativa X.
PRINT FIX(-58.75),INT(-58.75)
-58      -59
 
FOR var=x TO y <STEP z> ... NEXT <var><,var ... >
Utför programavsnittet det antal gånger som bestäms av styrvariabelns start- och slutvärde samt stegvärdet. Om STEP utelämnas blir stegvärdet +1. FOR...NEXT-slingor kan nästlas. I NEXT-satsen kan var utelämnas.
100 FOR I=50 TO 100 STEP 5 : PRINT I, : NEXT
RUN
 50     55    60 .... l00
 
FRE(0) FRE(" ")
Argument till FRE är skenargument. FRE ger ledigt minnesutrymme uttryckt i antalet bytes. FRE(" ") genomför skräpuppsamling innan antalet lediga bytes ges.
PRINT FRE(0)
 10360
 
GET <#>filnr<,postnr>
Läser en post från direktfil. filnr är det nummer under vilket filen öppnades. Om postnr utelämnas läses nästa post (efter sista GET).
50 GET #1,KOD%
 
GOSUB radnr ... RETURN
Medför hopp till subrutin på angiven programrad.
100 GOSUB 1000
 
GOTO radnr
Medför ovillkorligt hopp till angiven programrad.
100 GOTO 1000
 
HEX$(X)
Omvandlar decimaltalet X till ett hexadecimalt tal i strängform (X avrundas till heltal innan beräkningen utförs).
10 H$=HEX$(15) : PRINT H$
RUN ger "F"
 
IF uttr THEN satser/ radnr <ELSE satser/ radnr> alternativt: IF uttr GOTO radnr ...
Om uttr är sant utförs det som står efter THEN/GOTO. I annat fall utförs det som står efter ELSE el (om ELSE-sats saknas) så fortsätter programkörningen med nästa programrad. IF... THEN ... ELSE-satser kan nästlas. Om då antalet ELSE och THEN ej överensstämmer, matchas varje ELSE med närmaste icke-matchade THEN.
 
10 IF I<5 THEN 500 ELSE PRINT "Talet är för stort"
20 IF A=B THEN IF B=C THEN 50 ELSE PRINT IIB<>C11
OBS att i en FOR-loop får ej NEXT stå på samma rad som IF. Däremot är följande korrekt:
100 FOR I=1 TO 10: IF X>Y THEN 1000
  110 NEXT I
Följande skrivsätt är dock att rekommendera:
100 FOR I=1 TO 10
110 IF X>Y THEN 1000
120 NEXT I
 
INKEY$
Avläser tangentbordet och ger antingen en en-teckens sträng eller en nollsträng ("NULL") om ingen tangent nedtryckts.
10 T$=INKEY$:IF LEN(T$)=0 THEN 100
 
INP(I)
Hämtar en byte från port I.
100 B=INP(255)
 
INPUT <;><"ledtext";> var-lista
Möjliggör inmatning från tangentbordet under programkörning. Ledtext kan ges. Prompter är ett frågetecken. Om semikolonet efter ledtexten utbyts mot ett komma tecken (,) skrivs inte frågetecknet ut. Om INPUT följs direkt av ett semikolon förhindras det radbyte som annars sker efter fullföljd inmatning. Vid inmatning under programkörning åtskiljs data av kommatecken.
10 INPUT "Ange namn och inkomst: ",NAMN$,INKOMST
RUN
Ange namn och inkomst: Joakim,1000000
 
INPUT#filnr,var-lista
Läser data från en sekventiell diskfil och tilldelar dessa till programvariablerna i var-listan. Inledande blanktecken, vagnreturer och "Line feed" ignoreras. Både strängar, som ej innesluts i citationstecken, och tal betraktas som avslutade när samma tecken eller komma påträffas. Om det är fråga om strängar, och det första tecken som ej tillhör de tre nämnda är ett citationstecken, kommer strängen att bestå av alla tecken mellan det första citationstecknet och nästa som påträffas. En sträng kan således ej innehålla citationstecken.
100 INPUT#l,NAMN$,ADRESS$,TELNR!
 
INPUT$(X<,<#>Y>)
Ger en sträng bestående av X tecken, inläst från antingen tangentbordet eller från fil med nummer Y. Alla tecken utom Ctrl-C accepteras (Ctrl-C avbryter funktionen). Tecknen skrivs ej ut på bildskärmen.
100 SVAR$=INPUT$(1) 'Hämtar ett tkn från tangbordet
200 DATA$=INPUT$(2,#1)
 
INSTR(<P>,A$,B$)
Söker efter första förekomsten av B$ i A$. Om P anges börjar sökningen i positionen P. Om söksträngen A$ återfinns returnerar INSTR positionen. Om A$ är tom (NULL) eller inte finns i B$ fås värdet 0. Om B$ är NULL ger INSTR P eller 1.
50 P=INSTR(X$J$);K=INSTR(5,X$J$)
 
INT(X)
Ger största heltalet mindre eller lika med X. Jfr FIX och CINT.
PRINT INT(-12.4)
-13
 
KILL "<d:>filnamn"
Raderar namngiven fil av godtycklig typ från disk.
KILL "SPEL.BAS"
 
LEFT$(A$,I)
Ger de I första tecknen i strängen A$.
10 NAMN$="Kalle Anka" B$=LEFT$(NAMN$,5)
20 PRINT B$
RUN
Kalle
 
LEN(A$)
Ger antalet tecken i strängen A$.
PRINT LEN("MICROBEE")
 8
 
<LET> var=uttr
Tilldelar var värdet av uttr. Kan utelämnas.
LET SUM=A+B+17
 
LINE INPUT<;><"ledtext";> str-var
Tillåter inmatning av en hel rad (upp till 254 tecken) till strängvariabeln str-var. Alla tecken fram till en vagnretur accepteras. Fungerar f ö som INPUT.
10 LINE INPUT "Ge fullständigt namn och adress: ";A$
 
LINE INPUT# filnr,str-var
Läser hel rad från sekventiell datafil till strängvariabeln str-var. Samtliga tecken överförs.
20 LINE INPUT #1,B$
 
LIST <radnr1><-<radnr2>>
Ger utskrift på bildskärmen av hela eller delar av det program som finns i datorns minne. Exempel:
 
LIST listar hela programmet.
LIST 200 listar rad 200.
LIST 200- listar från rad 200 till slutet.
LIST 100-200 listar raderna 100-200.
LIST -200 listar från första raden t o m rad 200.
 
LLIST <radnr1><-<radnr2>>
Ger utskrift på skrivare av hela eller delar av det programmet i datorns minne. Fungerar f ö som LIST (se ovan).
 
LOAD "<d:>filnamn"<,R>
Överför en fil från disk till datorn. Om filtyp inte anges, förutsätts filtypstillägget .BAS. Om R-alternativet används, förblir alla datafiler öppna och programmet körs automatiskt efter det laddats.
 
LOAD "PROG1"
LOAD "B:PROG2"
LOAD "PROG3",R
 
LOC(filnr)
När det gäller direktfiler ger LOC numret på den post som just lästs eller skrivits från en GET- eller PUT-sats. När det gäller sekventiella filer ger LOC antalet sektorer (128-byte-block) som lästs från eller skrivits till filen sedan den öppnades.
200 IF LOC(1) 100 THEN STOP
 
LOF(filnr)
Ger det antal 128-bytes poster som finns i den sista "extent" (16K block) som skrivits eller lästs. Om filen ej överstiger en "extent" erhålls filens sanna längd.
100 IF LOF(1)>0 THEN PRINT "Gammal fil" ELSE PRINT "Ny fil"
 
LOG(X)
Ger naturliga logaritmen av X.
PRINT LOG(45/7)
 1.86075
 
LPOS(X)
Ger aktuella läget för skrivhuvudet i skrivarens buffert. Detta behöver ej vara detsamma som skrivhuvudets verkliga läge.
100 IF LPOS(X)>70 THEN LPRINT CHR$(13)
 
LPRINT uttr-lista
Ger utskrift på skrivare. Fungerar f ö som PRINT.
 
LPRINT USING str-uttr; uttr-lista
Som PRINT USING (se nedan), men utskriften till skrivare.
 
LSET str-var=str-uttr
Flyttar data från minnet till en direktfilsbuffert som förberedelse för PUT-sats. Om strängvariabeln kräver färre bytes än som avsatts med FIELD kommer LSET att vänsterjustera strängen i fältet. Kan även användas för att vänsterjustera vanliga strängvariabler.
100 LSET A$=MKS$(AMT) : REM Förberedelse för PUT
200 A$=SPACE$(20) REM Vänsterjustering av "vanligt" tkn
210 LSET A$=NAMN$ ' sträng i fält om 20
 
MERGE "<d:>filnamn"
Sammanfogar ett program som sparats i textfilsformat på disk med det program som redan finns i datorns minne (dvs det befintliga programmet raderas ej).
MERGE "DEL2"
 
MID$(str-uttr1,I<,J>)= str-uttr2
Ersätter J tecken fr o m teckenposition I i strängen str-uttr1 med tecknen i str-uttr2. Om J utelämnas används hela str-uttr2.
50 MID$(A$,5,7)="nytt"
 
MID$(A$,I<,J>)
Ger en sträng med J tecken från strängen A$, med början från teckenposition I. Om J utelämnas, eller om det finns färre än J tecken till höger om tecken nr I, då erhålls alla tecken fr o m tecknet i position I.
50 A$=MID$(B$,9,5)
 
MKD$, MKI$, MKS$
Omvandlar numeriska värden till strängvärden (inversen till CVI osv, se ovan. Används som förberedelse för att placera numeriska värden i en direktfilsbuffert.
100 LSET D$=MKS$(AMT)
 
NAME "gammaltnamn" AS "nyttnamn"
Byter namn på en fil. Filtypstillägget måste anges om sådant finns.
NAME "KALLE.DOC" AS "ADA.DOC"
 
NEW
Raderar det program och de variabler som finns i minnet.
 
NULL hlt-uttr
Fastställer det antal "nulls" som ska skrivas vid varje radslut. Standardvärde är 0.
NULL 2
 
OCT$(X)
Omvandlar decimaltalet X till ett oktalt tal i strängformat.. X avrundas till ett heltal innan beräkningen ut förs.
PRINT OCT$(24)
30
 
ON ERROR GOTO radnr
Medför hopp till radnr om fel uppkommer under program körning. ON ERROR GOTO 0 upphäver verkan av tidigare ON ERROR GOTO.
10 ON ERROR GOTO 1000
 
ON uttr GOSUB radnr-lista
Medför hopp till ett av de radnummer (subrutiner) som uppräknas i listan beroende på värdet av uttr. Om uttr = 0 eller uttr > antalet radnummer i listan, fortsätter programmet med programraden efter ON-GOSUB. Om uttr < 0 eller > 255 erhålls felmeddelande.
100 ON N GOSUB 500,600,700,800,900
 
ON uttr GOTO radnr-lista
Medför hopp till en av de angivna programraderna beroende på värdet av uttr. Se ON-GOSUB.
100 ON I GOTO 1000,2000,3000
 
OPEN "mod",<#>filnr, "namn"<,hlt-uttr>
Används för att öppna filer på disk. OPEN anvisar en buffert för in-/utmatning till filen och bestämmer vilken mod som ska användas. "mod" är ett stränguttryck vars första är en av följande:

0  för utmatning till sekventiell fil
I  för inmatning från sekventiell fil
R  in-/utmatning vid direktfil

filnr är ett heltalsuttryck vars värde är 1-15; namn är filens namn och hlt-uttr (om detta anges) fastställer postlängden för direktfiler.
10 OPEN "i",2,"DATABAS"
 
OPTION BASE n
Bestämmer lägsta index för indicerade variabler (n ska vara 0 eller 1).
10 OPTION BASE 1
 
OUT I, J
Överför data (J) till maskinport I (I och J måste båda vara heltal 0-255).
100 OUT 52,110
 
PEEK(I)
Ger innehållet i minnesadressen I uttryck i decimal form.
50 PRINT PEEK(20000)
 
POKE I,J
Skriver data (J, ett heltal 0-255) till minnesadressen I. Data och minnesadress anges decimalt.
50 POKE 20000,55
 
POS(I)
Ger markörens horisontella position på en rad. Längst till vänster fås värdet 1.
100 IF POSM>60 THEN PRINT CHR$(13)
 
PRINT <uttr-lista>
Används för att utmata data på bildskärmen.
 
Placeringen av utskriften på en rad kan beror på den interpunktion som används för att åtskilja uttrycken i listan. Ett kommatecken (,) gör att nästa värde skrivs ut i nästa utskriftszon (MBASIC indelar en rad i utskriftszoner, som vardera består av 14 tkn-positioner. Ett semikolon (;) medför att nästa värde skrivs ut omedelbart efter föregående värde. Ett eller flera mellanslag mellan uttryck har samma effekt som ett semikolon.
 
Om uttr-listan avslutas med ett semikolon eller ett komma börjar nästa PRINT-sats utskriften på samma rad. I annat fall införs en vagnretur i slutet av raden.
Tal följs alltid av ett blanktecken vid utskrift. Positiva tal föregås dessutom av ett blanktecken. Negativa tal föregås i stället av ett minustecken.
OBS att ett frågetecken (?) kan användas i en PRINT-sats i stället för ordet PRINT.
PRINT "Hejsan"
Hejsan

? "Hejsan"
Hejsan
 
PRINT USING str-uttr; uttr-lista
Används för att skriva ut strängar eller tal i specificerat format. Formatet bestäms av formateringssträngen str-uttr enligt följande:
 
"!" Skriver enbart ut första tecknet i strängen.
"Ö Ö" Skriver ut 3 tkn från strängen. Allmänt gäller att 2 tkn + lika många tkn som antalet mellanslag mellan Ö-na skrivs ut.
"&" Specificerar ett strängfält med variabel längd.
# Representerar en sifferposition.
. Representerar decimalpunkt.
+ Skriver ut talets tecken (plus eller minus) i plustecknets position (före eller efter talet).
- Ett minus-tkn efter format-fältet medför att negativa tal skrivs ut med minus-tkn sist.
** Dubbel asterisk i början av formatsträngen fyller eventuella inledande blanka teckenpositioner med asterisker.
$$ Medför att ett dollartecken skrivs ut till vänster om de formaterade talet.
**$ Kombinerar de två föregående tecknen.
^^^^ Placerade efter sifferpositionstkn kommer talen att skrivas ut i exponentialformat.
_ Understrykningstkn i formatsträngen medför att nästa tkn skrivs "som det är".
 
PRINT USING "###.##";987.6
987.60
10 A$="TITTA":B$="UT"
20 PRINT USING "!";A$;B$
30 PRINT USING "Ö Ö";A$;B$
RUN
TU
TITTUT
PRINT# filnr,uttr-lista
Används för att skriva data till sekventiell diskfil.
200 PRINT#1,A$;B$
 
PRINT# filnr,USING str-uttr;uttr-lista
Skriver data till en sekventiell diskfil med det format som specificeras av formateringssträngen (se PRINT USING).
 
200 PRINT#2,USING"$$###.###,";J;K;L
 
PUT <#>filnr<,postnr>
Överför nästa tillgängliga post frän buffert till angiven direktfil.
100 PUT #1,KOD%
 
RANDOMIZE uttr
Ger slumptalsgeneratorn ett startvärde (slumptalsfrö). Om uttr utelämnas stannar programmet upp och begär ett slumptalsfrö innan RANDOMIZE utförs.
10 RANDOMIZE -555
READ varlista
Läser värden från DATA-satser och tilldelar dessa till variabler.
50 READ A%,B,C$
 
REM kommentarer
Används för att skriva kommentarer i program. REM- satser utförs ej vid programkörning. Ordet REM kan ersättas med en apostrof ('). Om kommentaren skrivs i slutet av en programrad kan apostrofen ersätta både kolon och REM (:REM).
100 REM Inmatningsrutin
200 I=1 'Initialisera loopvariabel
 
RENUM <<nytt nr><,<gammalt nr><,ökning>
Används för omnumrering av programrader. Om inga parametrar anges omnumreras hela programmet med första radnumret 10 och ökningen per rad blir 10. RENUM 300,,50 omnumrerar hela programmet, varvid första programraden blir 300 och radnumret ökas med 50 för varje rad.
 
RESET
Ger disksystem-reset.
Efter disketter bytts ut i en skivenhet måste RESET utföras innan man skriver på eller läser från den nya disketten. RESET stänger även alla öppna filer.
 
RESTORE <radnr>
Medför att nästa READ-sats läser fr o m radnr. Om radnr ej anges läses data fr o m programmets första DATA-sats.
500 RESTORE 100
 
RESUME
Används för att fortsätta programkörning efter en felhanteringsrutin. Instruktionen kan användas på flera olika sätt: RESUME eller RESUME 0 medför att återhoppet sker till den sats som orsakade felet; RESUME NEXT medför att återhoppet sker till satsen efter den där felet inträffade och RESUME radnr medför återhopp till angiven programrad.
1000 IF (ERR=230) AND (ERL=90) THEN RESUME 80
 
RETURN
Avslutar subrutin och medför återhopp till satsen efter motsvarande subrutin.
1500 RETURN
 
RIGHT$(A$,I)
Ger de I sista tecknen i strängen A$
200 A$="DISK-BASIC":PRINT RIGHT$(A$,5)
RUN
BASIC
 
RND<(X)>
Ger ett slumptal mellan 0 och 1. Samma slumptalsföljd ges varje gäng programmet körs om inte slumptalsfröet ändras med RANDOMIZE. X>0 ger samma resultat som om X utelämnas. X=0 upprepar det sist alstrade talet. X<0 återstartar alltid samma uppsättning slumptal för varje givet X.
100 PRINT INT(RND*6+1) 'Ger heltal 1-6
 
RSET str-var=str-uttr
Flyttar data från minnet till en direktfilsbuffert som förberedelse för PUT-sats. Om strängvariabeln kräver färre bytes än som avsatts med FIELD kommer RSET att högerjustera strängen i fältet. Kan även användas för att högerjustera vanliga strängvariabler.
 
För exempel se LSET.
 
RUN
Kommandot förekommer i olika varianter.
 
RUN <radnr>
Exekverar programmet i datorns minne. Om radnr anges börjar programkörningen med denna rad.
 
RUN "d:namn#<,R>
Laddar programmet "namn" frän disk och kör detta. Om den valfria parametern R tilläggs förblir alla datafiler öppna (i annat fall stängs de).
RUN "NYPROG",R
 
SAVE
Används för att spara program på disk. Kommandot förekommer i olika varianter:
 
SAVE "<d:>namn"
Sparar programmet på skivenhet d.
 
SAVE "<d:>namn",A
Sparar programmet i ASCII-format.
 
SAVE "d:namn",P
Sparar programmet i kodat binärt format, varvid det blir listskyddat.
SAVE"PROG2","P
 
SGN(X)
Ger -1 om X < 0, 0 om X är 0 och 1 om X>0 .
100 ON SGN(M)+2 GOSUB 500,600,700
 
SIN(X)
Ger sinus av X (X i radianer). Beräknas i enkel precision.
PRINT SIN(1.5)
.997495
 
SPACE$(X)
Ger en sträng med X st blanktecken. Uttrycket X avrundas till ett heltal och måste vara i intervallet 0 - 255.
10 A$=SPACE$(253)
 
SPC(I)
Skriver I st blanktecken (mellanslag). Får bara användas i PRINT- eller LPRINT-satser.
PRINT"över"SPC(15)"hit"
över               hit
 
SQR(X)
Ger kvadratroten ur X. X måste vara >=0.
100 PRINT 25,SQR(25)
 25                 5
 
STOP
Avbryter programkörning och återvänder till kommandonivån.
100 IF SVAR$="N" THEN STOP
 
STR$(X)
Ger en strängrepresentation av X:s värde.
100 A$=STR$(12.5)
 
STRING$(I,J) el. STRING$(I,J$)
Ger en sträng av I tecken som alla har ASCII-koden J eller första tecknet i J$.
100 B$=STRING$(10,45)
 
SWAP varl,var2
Byter värde mellan två variabler. Instruktionen mycket användbar vid sorteringar.
100 IF A>B THEN SWAP(A,B)
 
SYSTEM
Stänger alla filer och laddar CP/M utan att existerande program och data raderas (dvs MBASIC lämnas).
 
TAB(I)
Flyttar markören/skrivhuvudet till radpositionen I. Om position I redan passerats sker förflyttningen till samma position på nästa rad. Positionen längst till vänster är 1, och den längst till höger är radlängden minus 1. TAB kan enbart användas i PRINT- och LPRINT-satser.
10 PRINT TAB(10)"TAB(10)"
 
TAN(X)
Ger tangens av X (där X är i radianer). Beräknas med enkel precision.
10 PRINT TAN(X)/2
 
TRON/TROFF
TRON medför att radnumret för varje utförd programrad skrivs ut under körning. TROFF stänger av TRON.
 
USR<n>(X)
Anropar USR-rutin (maskinspråksrutin) med argumentet X. n är ett tal mellan 0 och 9 och specificerar vilken USR-rutin som anropas. Om n ej anges antas USR0 (se DEF USR).
10 A=USR(B/2)
 
VAL(A$)
Ger strängens numeriska värde.
i
10 PRINT VAL(" -3")
-3
 
VARPTR(var)
Ger minnesadressen till den första databyte som identifieras med var. var måste tilldelas ett värde innan användningen av VARPTR. Alla slag av variabeltyper kan användas.
100 A=VARPTR(X)
 
VARPTR(#filnr)
För sekventiella filer erhålls startadressen för den I/0-diskbuffert som filnr tilldelats. För direktfiler erhålls adressen för den FIELD-buffert som filnr fått sig tilldelad.
 
WAIT portnr,I<,J>
Stoppar upp programkörningen tills värdet från portnr uppfyller det villkor som uppställts med J. Mönstret genomgår XOR med J och AND med I. I är heltalsuttryck, om J ej anges antas det vara 0.
100 WAIT 32,3
 
WHILE uttr ... WEND
Programavsnittet mellan WHILE och WEND utförs så länge som uttr är sant.
100 WHILE X00
110 INPUT X:SUM=SUM+X
120 WEND
 
WIDTH <LPRINT> hlt-uttr
Fastställer radlängd i antal tkn (15-255) på terminal resp skrivare. Standardvärdet är 72 tkn. Om hlt-uttr sätts till 255 blir radlängden "oändlig% dvs MBASIC sätter inte in några vagnreturer, men POS eller LPOS returnerar värdet 0 efter position 255.
WIDTH 18
 
WRITE <uttr-lista>
Utmatar data till terminalen (bildskärmen). Om uttr lista saknas, erhålls blankrad. Uttrycken i listan måste åtskiljas med kommatecken. Vid utskriften separeras varje data frän föregående med ett kommatecken och strängar avgränsas med citationstecken.
10 WRITE A,B,C$
 
WRITE#filnr,uttr-lista
Skriver data till sekventiell fil. filnr är det nummer under vilket filen öppnades i "O"-mod (se OPEN). uttr i listan kan vara strängar eller numeriska uttryck och måste åtskiljas med kommatecken. Skillnaden mellan WRITE# och PRINT# är att WRITE# insätter komma mellan datavärdena och innesluter strängar i citationstecken.
100 WRITE#1,A$,B$


[Innehåll]


3. Felmeddelanden

1) NEXT without FOR
Variabeln i en NEXT-sats svarar ej mot någon aktuell FOR-sats.
 
2) Syntax error
En rad med felaktig syntax har påträffats (felstavade nyckelord, felaktig interpunktion osv). MBASIC inträder automatiskt i EDIT-mod för den programrad som orsakade felet.
 
3) Return without GOSUB
En Return-sats påträffades utan att någon motsvarande GOSUB utförts.
 
4) Out of data
En READ-sats skulle utföras när det inte fanns några data kvar att läsa.
 
5) Illegal function call
En parameter som användes i en funktion (matematisk eller sträng-) låg utanför tillåtet område.
 
6) Overflow
Resultatet av en beräkning var för stort för att det skulle kunna representeras med MBASIC:s talformat.
 
7) Out of memory
Kan orsakas av följande:
 
8) Undefined line
En programrad som ej existerar refereras i en GOTO-, GOSUB-, IF...THEN...ELSE- eller DELETE-sats.
 
9) Subscript out of range
En indicerad variabel refereras antingen med ett index som ligger utanför definierat område, eller med felaktigt antal index.
 
10) Redimensioned array
Två DIM-satser för samma indicerade variabler, eller så har en indicerad variabel dimensionerats efter det att den automatiskt fått standarddimensionen 10(sker om en indicerad variabel tilldelas värden innan den dimensioneras).
 
11) Division by zero
Division med noll.
 
12) Illegal direct
En instruktion eller funktion som är otillåten i direktmod har använts som ett direktkommando.
 
13) Type mismatch
En strängvariabel har tilldelats ett numeriskt värde eller tvärtom; en funktion som kräver ett numeriskt argument fick ett strängargument eller tvärtom.
 
14) Out of string space
Strängvariabler har fått MBASIC att överskrida det tillgängliga lediga minnet. MBASIC avdelar strängutrymme dynamiskt till dess minnet är fyllt.
 
15) String too long
Ett försök att skapa en sträng längre än 255 tecken har gjorts.
 
16) String formula too complex
Ett stränguttryck är för långt eller för komplicerat (bör brytas ned i mindre uttryck).
 
17) Can't continue
Försök att fortsätta programkörningen har gjorts när programmet:
 
18) Undefined user function
En USR-funktion har anropats innan den definierats (med DEF USR).
 
19) No RESUME
En felhanteringsrutin saknar RESUME-sats.
 
20) RESUME without error
En RESUME-sats har påträffats utan att någon felhanteringsrutin anropats.
 
21) Unprintable error
Något felmeddelande som är tillämpligt för det rådande feltillståndet finns ej.
 
22) Missing operand
Ett uttryck innehåller en operator som saknar operand.
 
23) Line buffer overflow
Ett försök att inmata en rad med för många tecken har gjorts.
 
26) FOR without NEXT
En FOR-sats utan matchande NEXT har påträffats.
 
29) WHILE without WEND
En WHILE-sats utan matchande WEND har påträffats.
 
30) WEND without WHILE
En WEND-sats utan matchande WHILE har påträffats.
 
50) Field overflow
En FIELD-sats försöker tilldela fler bytes än som specificerades för postlängden (i en direktfil).
 
51) Internal error
Ett fel har uppträtt i MBASIC. Om detta felmeddelande uppträder bör omständigheterna kring detta meddelas till Microsoft.
 
52) Bad file number
En sats eller ett kommando refererar till en fil med ett filnummer som ej är öppnad eller ligger utanför det område för filnummer som specificerats.
 
53) File not found
En LOAD-, KILL- eller OPEN-sats refererar till en fil som ej finns på disken.
 
54) Bad file mode
Ett försök har gjorts att använda PUT, GET eller LOF tillsammans med en sekventiell fil, eller ladda (LOAD) en direktfil, eller utföra en OPEN-sats med andra filmoder än I, 0 eller R.
 
55) File already open
Ett försök har gjorts att i O-mod öppna (OPEN) en sekventiell fil som redan är öppnad, eller så har en KILL-instruktion givits för en fil som är öppen.
 
57) Disk 1/0 error
Ett I/0-fel uppträdde under en diskoperation. Detta fel är fatalt, dvs kan ej åtgärdas.
 
58) File already exists
Det filnamn som specificerades i en NAME-sats existerar redan på disken.
 
61) Disk full
Allt diskutrymme är redan utnyttjat.
 
62) Input past end
En input-sats utförs efter det att all data i filen redan inlästs, eller så är filen tom. Detta fel kan åtgärdas med användning av EOF-funktionen.
 
63) Bad record number
Postnumret är antingen större än max (32767) eller lika med noll i en PUT- eller GET-sats.
 
64) Bad file name
Ett otillåtet filnamn (t ex med för mänga tecken) har givits i en LOAD-, SAVE-, KILL- eller OPEN-sats.
 
66) Direct statement in file
En sats i direktmod har påträffats under inläsningen av fil i ASCII-format. Laddningen avbryts.
 
67) Too many files
Ett försök har gjorts att skapa en ny fil (med SAVE eller OPEN) när filbiblioteket är fullt.


[Innehåll]


4. MBASIC på MicroBee

Den som är van med att arbeta med MicroWorld Basic upptäcker snart att det i MBASIC saknas motsvarigheter till t ex CLS, CURS, INVERSE och sist men inte minst: grafikinstruktioner. Men förtvivla inte: Med hjälp av MBASIC:s långa variabelnamn och användardefinierade funktioner kan man ersätta det mesta av det som finns i MicroWorld Basic (och tillägga en hel del annat). Grafiken är lite problematiskt, men även detta är möjligt att åstadkomma, även om det inte går att fä samma flexibilitet som i MicroWorld Basic (däremot finns det inget sätt att åstadkomma "Musik" utan att tillgripa maskinspråksrutiner).

I det följande ska vi ge exempel på en del användbara rutiner. Dessa placeras lämpligen i början av ett program.

Enklare "rutiner":

CLS$=CHR$(26) : REM För att radera bildskärmen
INV$=CHR$(27)+")" REM För omvänd video (INVERSE)
NORM$=CHR$(27)+"(" REM För återställa till normal video
DELLINE$=CHR$(27)+"R" REM För radera markörraden
DELEOP$=CHR$(27)+"Y' REM För radera resten av "sidan"

När väl rutinerna är definierade kan de användas i PRINT-satser på exempelvis följande sätt:

100 PRINT CLS$
110 PRINT "Tryck på ";INV$;"<Return>";NORM$;" för fortsättning"

Rad 110 ovan kommer att skriva ut 'Tryck på <Return> för fortsättning" med <Return> i omvänd video.

Användardefinierade funktioner:

Med användardefinierade funktioner går det att åstadkomma en hel del trevliga saker. Det är nämligen möjligt att använda funktioner "inne i funktioner" dvs använda tidigare definierade funktioner i definitioner av nya. Men låt oss börja med något enklare, nämligen en funktion som tillåter oss att placera markören var som helst på bildskärmen:

DEF FNCUR$(X,Y)=CHR$(27)+"="+CHR$(Y+31)+CHR$(X+31)

"Tryck på ..." kan exempelvis skrivas ut längst ned på bildskärmen med:

100 PRINT FNCUR$(22,24);"Tryck på ";INV$;"<Return>";NORM$;" för fortsättning";

Vill vi centrera utskriften av en sträng på bildskärmen kan vi definiera:

DEF FNCENTER$(X$)=SPACE$((80-LEN(X$))Ö2)+X$

En rubrik kan sedan centreras längst upp på bildskärmen med:

200 PRINT CLS$;FNCENTER$("R U B R I K")

Vill vi kunna centrera en sträng var som helst på bildskärmen kan vi använda oss av FNCUR$(X,Y) och FNCENTER$(X$) för att definiera en ny strängfunktion:

DEF FNPOSSTR$(R,X$)=FNCUR$(1,R)+FNCENTER$(X$)

Då kan vi t ex avsluta vårt program med att skriva "*** S L U T ***" mitt på bildskärmen:

500 PRINT CLS$;FNPOSSTR$(12,"*** S L U T ***")

Grafik

Det är inte så lätt att använda sig av "vanlig" grafik tillsammans med MBASIC, eftersom kommandon och instruktioner som svarar mot HIRES, SET, PLOT osv i MicroWorld Basic saknas. Däremot är det inte så svårt att använda sig av "PCGgrafik". I själva verket kan man göra på nästan exakt samma sätt som i MicroWorld Basic. Det är bara 3 saker som man måste komma ihåg:

  1. I MBASIC kan enbart ASCII-tecknen 128-255 användas, men POKE-adresserna är desamma (från -2048 = 63488 och uppåt). För att skriva ett PCG-tecken användes alltså PRINT CHR$(I), där I är ASCII-koden (eller så används INV$ tillsammans med motsvarande "vanliga" tecken - se nedan).
  2. I 80*24-mod utnyttjar varje tecken bara 11 rader (mot 16 i 64*16). De 5 sista raderna kan därför antingen lämnas orörda, eller så placeras där helt enkelt 0. För att t ex göra om tecknet med ASCII-kod 128 till ett lodrät streck (på höger sida av tecknet) skriver vi:
    10 DEFINT I-J
    20 DEF FNCUR$(X,Y)=CHR$(27)+"="+CHR$(Y+31)+CHR$(X+31)
    30 FOR I=-2048 TO -2033: READ J : POKE I,J :NEXT I
    40 DATA 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0

    Vill vi sedan rita ett lodrät streck på högra delen av bildskärmen kan vi använda FNCUR$:

    300 FOR I=4 TO 20: PRINT FNCUR$(78,I);CHR$(128);:NEXT I
  3. Ett tecken i omvänd video erhålls om 128 adderas till dess ASCII-värde. CHR$(193) (ASCII-värdet för "A"=65 och 65+128=193) ger t ex "A" i omvänd video. Om därför tecknet med detta ASCII-värde använts för att bygga upp ett annat "PCG-tecken", så erhålls PCG-tecknet om programmet innehåller satsen PRINT INV$;"A" och inte ett "A" i omvänd video. Detta kan både vara användbart och ställa till trassel (om man vill skriva ett "vanligt" tecken i omvänd video och har "förbrukat" detta till ett egendefinierat PCG-tecken).

En nackdel med att bygga upp grafik på detta sätt är att större figurer byggs upp relativt långsamt (titta på hur den lodräta linjen ritas upp i exemplet ovan). Om man enbart vill definiera enskilda tecken (t ex matematiska tecken, grekiska bokstäver el dyl) för användning tillsammans med text fungerar tekniken alldeles utmärkt. Den duger också för att rita upp "titelsidor" och enstaka "stillbilder", men om man t ex vill simulera rörelse av lite större figurer är tekniken i stort sett värdelös. Detta problem kan lösas på två olika sätt. Det ena är att kompilera programmen (vilket kräver en MBASIC-kompilator). Det andra (och allra effektivast) är att skriva grafikrutinerna i assembler. Dessa kan sedan anropas från MBASIC. Båda dessa metoder (som också kan kombineras) ligger dock utanför ramarna för vårt ämne.

För den som vill komma vidare i grafikhanteringen i MBASIC rekommenderas Bergsalas "Grafikeditor MS-Basic" som på ett mycket enkelt sätt levererar färdiga Basic-grafikrutiner. Du editerar fram den grafik du vill ha på skärmen och programmet skriver själv en Basic-rutin för hopkoppling i ditt program.


[Innehåll]


Litteraturtips

MBASIC är den Basic-dialekt som är mest spridd av alla. Litteraturen är därför också ganska omfattande. Tyvärr finns dock ännu ingen bok på svenska som beskriver den moderna variant som finns på MicroBee (även om flera andra hem- och persondatorer är försedda med Basic-dialekter som är besläktade med MBASIC). BASIC-handboken av David A. Lien kan dock vara till stor hjälp eftersom de flesta nyckelorden i MBASIC beskrivs där och samtidigt kan den användas för att underlätta "översättningen" av program skrivna i andra Basic-dialekter.

Dataspel i Basic av David H. Ahl kan vara till glädje för de som vill använda sin MicroBee för att göra enklare spel. Programmen i denna bok är skrivna i en äldre MBASIC-dialekt som bl a saknar långa variabelnamn, WHILE-WEND osv, men du kan köra dem direkt eller med marginella ändringar (om du så vill kan du också använda dig av den äldre MBASIC-varianten som finns med på en av dina disketter under namnet OBASIC.COM).

På engelska finns det betydligt mer att välja på. Behöver du en grundligare genomgång av språket än den du fått här, kan du skaffa MicroSofts egen handbok (User's Guide och Reference Manual), vilken kan beställas från Bergsala Data AB.

De som vill lära sig mer avancerad programmering med MBASIC rekommenderas The MBASIC Handbook av Walter A. Ettlin och Gregory Solberg (Osborne/McGraw-Hill 1983), samt Microsoft Basic and its Files av Jacques Boisgontier och Suzanne Ropiequet (Dilithium Press 1983). Dessa två böcker innehåller massor med "godbitar".

Lycka till med programmeringen!

Bergsala Data AB

Kungsbacka i Oktober 1984


Copyright © 1999 Martin Fahlgren

martin@1-1-7-46a.ghn.gbg.bostream.se

[Till början av dokumentet] [Till artikelförteckningen]