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
Start av Basic
Operationsmoder
Programrader
Teckenuppsättning
Konstanter
Variabler
Operatorer
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 |
Syntaxen är:
MBASIC <filnamn></F:filantal></M:
högsta minnesadress></S:max poststorlek>
Möjligheterna är således många. Några exempel:
- MBASIC (laddar MBASIC)
- 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)
- MBASIC filnamn (laddar först MBASIC och laddar och
kör sedan namngiven fil med filtyp .BAS)
- 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.
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).
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.
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. |
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:
- Sju eller färre siffror.
- Exponentform med användning av E.
- Talet avslutas med ett utropstecken (!).
Dubbel precision:
- 8 eller fler siffror.
- Exponentform med användning av D.
- 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).
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
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.
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$
- 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:
- programmet är för långt
- för många FOR-slingor eller GOSUB-anrop
- för många variabler
- något för komplicerat uttryck
-
- 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:
- stoppat p g a fel
- ändrats sedan exekveringen
- ej finns
-
- 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.
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.
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.
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 ***")
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:
- 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).
- 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
- 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.
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