Commodore 64 a

Page 1

Brugervejledning

Page 2

Page 3

INDHOLDSFORTEGNELSE

FORORD

1. OPSTILLING
- Commodore 64 pakkes ud og tilsluttes
- Installering
- Øvrige tilslutninger
- Tænd computeren
- Farve justering/indstilling
7
8
9
10
12
2. OPSTART
- Tastaturet
- Tilbage til udgangssituationen
- Hente og gemme programmer
- PRINT og beregninger
- Fortsættelse
- Kombinationer
17
19
20
23
26
28
3.
  • BASIC PROGRAMMERING FOR BEGYNDERE
  • Det næste skridt
    GOTO
  • Redigerings tips
  • Variabler
  • IFTHEN
  • FORNEXT løkker
32
32
33
36
37
4.
  • BASIC FOR VIDEREKOMNE
  • Forord
  • Simple bevægelser
  • INPUT
  • GET
  • Tilfældige tal og andre funktioner
  • Gættelege
  • Så er det din tur
  • Tilfældig grafik
    CHR$ og ASC funktioner
41
43
45
45
47
49
49
5. AVANCEREDE FARVE OG GRAFIK KOMMANDOER
- Farver og grafik
- Udskrift med farver
- CHR$ farvekoder
- Redigeringshjælp
- PEEK og POKE
- Skærmgrafik
- Kort over skærmhukommelsen
- Kort over farvehukommelsen
- Flere bevægelige bolde
53
53
54
55
58
58
60
61
6. SPRITE GRAFIK
- Forord
- Det binære talsystem
- sprite figurer
- Yderligere bemærkninger om sprite
65
66
68
74
Page 4
7. LYD
- Lvd for menigmand 79
- Strukturen i et lydprogram 79
- Hvordan laver man musik 80
- Vigtige lydindstillinger 81
- Vi spiller en melodi 86
- Lydeffekter 86
- Prøver på lydeffekter 87
8. OMGANG MED DATA FOR VIDEREKOMNE
- READ og DATA 91
- Gennemsnit 93
- Indekserede variabler 94
- Dimensioner 96
- Simulering af terningkast 96
- Todimensionale tabeller 98
TI LLÆG
Forord 103
A. Tilbehør og software til Commodore 64 104
B. Kassettebåndoptager, for viderekomne 106
C. Commodore 64 BASIC 108
D. Forkortelser for BASIC-nøgleord 126
E. Skærmkoder 128
F. ASCII- og CHR$-koder 131
G. Tegn- og farve-hukommelsesskema 133
H. Udledning af matematiske funktioner 135
I. Stikforbindelser 136
J. Prøveprogrammer 139
K. Programkonvertering - Standard-BASIC til 64-BASIC 144
L. Fejludskrifter 145
M. Nodeværdier 149
N. Lydindstilling på Commodore 64 151
O. SPRITE-skema 154
P. Commodore 64 memory map 157

  • O. SPRITE-skema P. Commodore 64 memory map

INDEKSREGISTER

Page 5

FORORD

Denne brugervejledning giver oplysninger om tilslutning af COMMODORE 64. Den giver også en første indføring i at programmere computeren i sproget BASIC.

I KAPITEL 2 findes en vejledning i anvendelse af færdige programmer for brugere, som ikke ønsker at programmere selv. Bruger man kun færdige programmer, kan man nøjes med at læse KAPITEL 1 og 2.

Lad os se på nogle af de spændende muligheder, som computeren indeholder. Commodore 64 indeholder mulighed for at lave bevægelige figurer, som man selv kan designe. Der er mulighed for hele 8 forskellige figurer på skærmen samtidig. Vi kalder fænomenet for SPRITE grafik.

Hver af de 8 SPRITE-figurer kan bevæges overalt på skærmen, og kan bevæge sig bagom hinanden. Ja, hvis der er hul i den forreste SPRITE, kan man enddog se den, der bevæger sig bagved igennem den forreste.

Commodore 64 har en indbygget musik-/lydkreds, som har 3 stemmer med hver 8 oktaver. Hvis man er bekendt med elorgler, vil man nok nikke genkendende til de udtryk, som bruges. Er udtrykkene ukendte, må man eksperimentere sig frem til de ønskede lydeffekter. Der er 4 mulige pulsformer for hver stemme. De 3 første har navn efter deres form: Savtak, trekant, firkant. Den 4. pulsform er støj.

Attack/decay og sustain/release, indhyldningsfunktion og programmerbare high- og lowfiltre findes for hver stemme. Hvis alle disse muligheder skaber behov for at anvende en HiFiforstærker, har Commodore 64 mulighed for tilkobling af en sådan.

Der kan tilsluttes en Datasette,(hvorimod en almindelig kassettebåndoptager ikke kan bruges) en diskettestation, en printer og gennem specille moduler, meget andet udstyr. Der kan også sluttes en Z-80 mikroprocessor til, så computeren kan udnytte de muligheder, som CP/M giver. Endelig kan Commodore 64, ved tilslutning af et andet modul programmeres i COMAL-80.

Page 6
LIDT OM TERMINOLOGI OG "FÆLDER"

Pas på at et ettal ikke forveksles med bogstavet l (som i "lille") og tallet nul ikke forveksles med bogstaverne o og O (som i "ord" og "Ole"). Der er taster for både et og nul. Pas på : En BASIC-linie kan strække sig over 2 skærmlinier, ja, enddog over flere, hvis der anvendes forkortelser. I denne brugervejledning er der ikke taget hensyn til 40 tegn/linie i alle programeksempler. Det kan også være nødvendigt at anvende forkortelser, hvis enkelte linier skulle være mere end 80 tegn lange.

Tegnene <> bliver brugt for at vise, at der er tale om en taste med den pågældende inskription f.eks. betyder <RETURN> den taste hvorpå der står RETURN. <C=> betyder den taste hvorpå COMMODORES logo er skrevet. Den sidder i tastaturets nederste venstre hjørne.

Der vil blive brugt ordet højfrekvens om den mest betydende byte i toneregistret, selvom begrebet ikke har noget at gøre med højfrekvenssignaler. På samme måde bruges ordet lavfrekvens om den mindst betydende byte i toneregistret.

BEMÆRK :

Det skal til slut bemærkes, at denne brugervejledning ikke forsøger at være dækkende for computerens mange muligheder. Specielt er lyd- og spritemulighederne kun ret overfladisk gennemgået. Du kan få specialskrifter om disse to omfattende emner hos en Commodore forhandler.

TEGNFORKLARING TIL PROGRAMLISTER

FARVER
TASTATU IR I FARVE GENGI /ELSE TASTATUR FARVE GENGIVELSE
SHET 1 SÆT 2 SÆT 1 SÆT 2
<1> SORT <1> ORANGE a 11
<2> HVID 3 3 <2> BRUN
<3> RØD 11 14 <3> LYSERØD • Ø M
<4> CYAN <4> GRA 1 3) 1
<5> VIOLET 1 3 <5> GRA 2 8 S
<6> GRØN 10 11 <6> LYSEGRØ 에 🛢 🖬
<7> BLA 3 3 <7> LYSEBLA 0 5
<8> GUL * <8> GRA 3
HVIS DE ER E R MONTER RET DAP ISK KARF NKTERSÆT BL IVER 😭 TI L. 31
MARKORF FUNK TIONER
FUNKTIC DN - DANSK TEGNSHET Ī ENGELSK TEGNSÆT
SÆT 1 SHET 2 SÆT 1 S SÆT 2
MARKØR TIL VENSTRE E N AL
MARKØR TIL. HØJRE 1 11 b1
MARKØR OP Э 3
MARKØR NED 8 21 3 21
CLR Э 3 2 5
HOME S 5 3 E:
REVERS ON 3 3 2 2
REVERS OFF 2 2
FUNKTIO NST ASTER TEGN
SHET 1 SÆT 2
3
5 15 Se også sid le 54
oq 139.
5
3
5 3
CF72 21
Page 7

KAPITEL 1

OPSTILLING

  • Commodore 64 pakkes ud og tilsluttes
  • Installering
  • Øvrige tilslutninger
  • Tænd computeren
  • Farve justering/indstilling
Page 8

Page 9

COMMODORE 64 pakkes ud og tilsluttes

De følgende instruktioner viser dig, hvordan du skridt for skridt tilslutter Commodore 64 til dit TV-apparat, din forstærker eller din monitor sådan, at du er sikker på, at alt virker korrekt. Før du slutter noget til computeren, checkes indholdet af kassen den ankom i. Udover denne brugervejledning skal følgende være til stede:

  • 1. Commodore 64
  • 2. Strømforsyning (grå kasse med et Net-stik og et kabel)
  • 3. Videokabel

Hvis noget mangler, giv da straks din forhandler meddelelse herom, så han kan erstatte det. Lad os nu se på de forskellige tilslutninger, der er på computeren og, hvordan de virker.

STRØMFORSYNING

Den medfølgende strømforsyning er udstyret med en netafbryder der er monteret i bunden af strømforsyningskabinettet. Når afbryderen står i stillingen hvor den hvide afmærkning er synlig er strømforsyningen slukket. Når Afbryderen står i den modsatte stilling, hvor den røde afmærkning er synlig, er strømforsyningen tændt.

TILSLUTNINGER I SIDEPANELET

  • El-tilslutning. Kablet fra strømforsyningen tilsluttes her.
  • 2. Afbryder. Tænder og slukker Commodore 64.
  • Spilstik. Til hver spilletilslutning kan anvendes styrepind, eller lyspen.

SPIL AFBRY- STRØM-STIK DER TILSLUTNING

Page 10
TILSLUTNINGER PÅ BAGSIDEN

  • 4. Programmodul. I den rektangulære åbning til venstre kan indsættes program- eller spillemoduler.
  • 5. TV-tilslutning. Via denne tilslutning kommer både billede og lyd til TV-apparatet.
  • Billed og lydudgang. Hertil kan tilsluttes en kvalitetsforstærker og/eller en TV-monitor.
  • Øvrige tilslutninger. Du kan tilslutte en printer eller diskettestation direkte til Commodore 64 via denne indgang.
  • 8. Kassette stik. En Datasette kan her tilsluttes computeren, så den kan gemme information på kassettebånd. NB: En "almindelig" kassettebåndoptager kan ikke bruges.
  • Brugerstik. Forskelligt ekstraudstyr kan tilsluttes her. F.eks. MODEM eller RS232 interface, der bruges til kommunikation med andre datasystemer, eller andre printere.

Installering

TILSLUTNING AF TV-APPARATET

Slut computeren til TV-apparatet som vist i det følgende :

  • Tilslut den ene ende af TV-kablet, der følger med, til TV'stikket bag på computeren. Stikket passer kun på een måde.
  • 2. Slut den anden ende af kablet til dit TVs UHF-antenneindgang.
  • 3. Indstil nu TV-et på kanal 36 (ca.).
  • 4. Slut strømforsyningen til 220 V.
  • Slut kablet fra strømforsyningen til indgangen på siden af Commodore 64. Stikket passer kun på een måde. Strømforsyningen omformer 220 V til en lavere jævn-spænding, som computeren kan arbejde med.
Page 11

Commodore 64 er nu tilsluttet. Der kræves ingen yderligere tilslutninger for at bruge computeren sammen med TV-appara-tet.

Øvrige tilslutninger

Eftersom Commodore 64 er forsynet med en kanal for High Fidelity lyd, kan man sende lyden gennem en kvalitetsforstærker, hvilket giver den bedst mulige lyd. Denne facilitet er mulig på grund af audio/video udgangen på bagsiden af Commodore 64. Den letteste måde at få tilgang til Commodore 64 på er ved at bruge et standard 5-bens DIN audio-kabel (medfølger ikke). Dette kabel tilsluttes audio/video forbindelsen direkte til computeren. 2 af de 4 ben indeholder audio og video signaler. Du kan selv lave sit kabel ved at bruge de stikforbindelser, der er vist i TILLÆG I.

Stikket kan nu forbindes til "AUXILIARY"-indgangen, eller "TAPE"-indgangen, på en forstærker.

Videosignalet sendes til "VIDEO IN" indgangen på TV-monitoren eller til videoindgangen på videosystemer – ligesom når man forbinder en videobåndoptager.

Hvis du ikke får lyd eller billede frem, når du har foretaget tilslutningerne skal du prøve at justere TV-ets kanalindstilling, lykkes det ikke, kan du i TILLÆG I se, hvordan de korrekte tilslutninger skal foretages.

Forstærker

Page 12

Hvis du har anskaffet ekstra udstyr, så som en VIC 1541 diskettestation eller en VIC 1525 printer, vil du måske gerne tilslutte det nu. Vi henviser her til de respektive brugervejledninger for at sikre dig de rigtige tilslutninger.

Tænd computeren

SÅDAN BRUGES COMMODORE 64.

  • 1. Tænd for computeren ved kontakten på højre side.
  • Det er nok nødvendigt at finindstille TV-et nu, hvorefter følgende ses på skærmen :

  • Hvis dit TV har manuel kontrastindstilling, justerer du det så du får et klart billede.
  • 4. Du vil måske også justere farver og. lysstyrke på TV'et for at få den bedste gengivelse. Du kan i så fald anvende den fremgangsmåde vi beskriver senere. Når du nu får et billede frem på skærmen, skal baggrunden være mørkeblå med lyseblå bogstaver og kanter.
Page 13

Opstilling

Hvis du ikke kommer frem til det forventede resultat kontrollerer du kablerne og tilslutningerne. Nedenstående oversigt kan hjælpe dig med at løse problemerne.

FEJLFINDING

SYMPTOM GRUND AFHJÆLPES VED:
Den røde lampe der
viser at compute-
ren er tændt lyser
ikke
Computeren er ikke
tændt
Kontroller at kon-
takten er i "onstil-
ling"
Kabel fra strømfor-
syningen er ikke
tilsluttet
Kontroller strømind-
gangen m.h.t. løst
eller forkert forbun-
det strømkabel
Strømforsyningen
er ikke tilsluttet
Kontroller forbindel-
sen til stikkontakten
En sikring i syste-
met er sprunget
Henvend dig til din
Commodoreforhandler
og få sikringen skif-
tet
Den røde lampe ly-
ser, men der er in-
tet billede
TV er ikke justeret Kontroller finind-
stillingen på TV.
Forkert tilslutning Tilsluttes UHF på TV.
Videokabel ikke
tilsluttet
Kontroller kablet
til TV'et
Mærkelige mønstre
på TV-skærmen med
programkassetten
på plads
Programkassetten
er ikke korrekt
indsat
Afbryd strømmen og
indsæt kassetten
igen
Billede uden farver TV dårligt indstil-
let
Indstil TV'et
Billede med dår-
lige farver
Dårlig farvejuste-
ring på TV'et
Juster farverne/
lysstyrken på TV'et
Billede med susen-
de baggrundsstøj
For kraftig lyd på
TV'et
Skru ned!
Billede OK, men TV lyd sat for lav Skru op !
тиден туа Forstærkerforbin-
delse ikke i orden
Efterse ledningen til
forstærker indgang
Page 14

Commodore 64 er lavet så alle kan bruge den. Vi må dog se i øjnene, at computerbrugere ind imellem løber ind i problemer. For at hjælpe dig hermed og for at give dig nogle sjove programmeringsideer udgiver Commodore forskellige skrifter. Du vil måske også finde at det er en god ide at søge sammen med andre Commodorebrugere for, på denne måde, at få kendskab og erfaring til programmering og brug af din Commodore 64.

MARKØREN

Den blinkende firkant på skærmen kaldes markøren (eller curseren) og viser dig, hvor det du skriver på tastaturet vil blive skrevet på skærmen. Efterhånden som du skriver, flytter markøren sig, og den oprindelige markørposition erstattes af det skrevne tegn. Prøv at skrive på tastaturet og se de tegn, du har skrevet, blive gengivet på TV-skærmen.

Farve justering/indstilling

Der er en meget nem måde at få et farvemønster frem på skærmen på, så du allerede nu let kan indstille anlægget. Selv om du endnu ikke er fortrolig med computerens betjening, skal du bare gøre som beskrevet her, og du vil se, hvor let det er at betiene Commodore 64.

Først finder du <CTRL> tasten på venstre side af tastaturet. Denne tast bruges sammen med andre taster for at instruere computeren om at gøre noget bestemt (ConTRoL = kontrol). For at udføre en sådan funktion holdes <CTRL> tasten nede samtidig med en anden taste.

Prøv for eksempel at holde <CTRL> tasten nede samtidig med at du trykker på <9> tasten. Slip så begge taster. Nu er der tilsvneladende ikke sket noget, men hvis du nu skriver på tastaturet, vil tegnene blive gengivet i negativ på skærmen. Tryk nu på mellemrums-tasten og hold den nede. Hvis du har gjort det første korrekt, vil du se en lyseblå stribe vandre hen over skærmen og fortsætte til næste linie - lige så længe som du holder mellemrumstasten nede.

**** COMMODORE 64 BASIC V2 **** HAK RAM SYSTEM BOSIL DA LADIO VZ AAAA HAK RAM SYSTEM BOSIL BASI/ RVTES EREE

Nu kan du prøve at holde <CTRL> tasten nede sammen med en anden taltaste. Taltasterne har en farve skrevet på forsiden.

Page 15

Opstilling

Alt hvad der gengives på skærmen fra dette sted vil have denne farve. Prøv for eksempel at holde <CTRL> tasten nede samtidig med at du trykker på <8> tasten - slip dem begge og hold derefter mellemrumstasten nede. Se nu på skærmen. Striben er nu gul.

Stribens farve kan ændres ved at trykke på en anden taltaste, mens du holder <CTRL> tasten nede.

Skift nu farver på striben nogle gange og indstil derefter dit TV, så det gengivne passer sammen med de farver, du har valgt.

S kærmen skulle e gengive noget i denne retning:
****
64K RAM
COMMODORE 64 BASIC V2 ****
SYSTEM 38911 BASIC BYTES FREE
REAUY.

Nu vi er nået hertil skulle alt være rigtigt indstillet og fungere tilfredsstillende. De følgende kapitler vil præsentere dig for BASIC-sproget. Du kan imidlertid allerede nu starte med at bruge nogle af de mange færdigskrevne programmer og spil, som man kan få til Commodore 64 uden at vide noget som helst om programmering.

Hver af disse programpakker indeholder detaljerede oplysninger om, hvordan man skal bruge programmet. Vi vil imidlertid foreslå, at du læser de første kapitler i denne brugervejledning igennem for at blive fortrolig med BASIC-operationerne i dit nye system.

Page 16

BLANK SIDE

Page 17

KAPITEL 2

OPSTART

  • Tastaturet
  • Tilbage til udgangssituationen
  • Hente og gemme programmer
  • PRINT og beregninger
  • Fortsættelse
  • Kombinationer
Page 18

Page 19
KAPITEL 2
Opstart

Tastaturet

Nu da du har fået det hele sat op og justeret bør du sætte dig ind i hvordan tastaturet er opbygget. Tastaturet er dit vigtigste kommunikationsmiddel til Commodore 64. Du vil opdage at tastaturet er magen til et almindeligt skri-

vemaskinetastatur på de fleste områder. Der er imidlertid et antal nye taster, som har specielle funktioner. Der vil her følge en kort beskrivelse af de forskellige taster og deres funktioner. Disse tasters funktion vil blive detaljeret beskrevet i senere afsnit.

<RETURN>

<RETURN> tasten får computeren til at læse den information, du har skrevet, og lægge denne ind i hukommelsen.

<SHIFT>

<SHIFT> tasten virker på samme måde som på en almindelig skrivemaskine. Mange taster er i stand til at skrive 2 bogstaver og 2 grafiske tegn. Når <SHIFT> tasten er trykket ned, får du de bogstaver/tegn, der står øverst på tasterne. Når <SHIFT> tasten bruges med grafik- funktionen fremkommer de grafiske tegn på højre side af tasten.

I tilfælde hvor tasterne har specialfunktioner (markørbevægelser f.eks.), og hvor der er tale om taltsterne (med specialtegn) vil brug af <SHIFT> tasten resultere i den funktion, som er angivet på den øverste del af tasten.

REDIGERING

Ingen er fuldendt, hvilket Commodore 64 tager højde for. Et antal redigeringstaster giver dig således mulighed for at rette slåfejl og flytte informationer rundt på skærmen.

<CRSR>

Der er to taster mærket <CRSR> (CuRSoR = markør, den blinkende firkant, som fortæller, hvor næste tegn skal skrives), een med pile op og ned < ↑CRSR♥ > og en med venstre og højregående pile < <==CRSR==> >. Med disse taster kan du flytte markøren op og ned eller til højre og venstre på skærmen. Bruger du ikke <SHIFT> tasten, vil du med <CRSR> tasterne kunne

Page 20
Opstart

lytte markøren ned og til højre. Bruger du <SHIFT> tasten vil du med <CRSR> tasterne kunne flytte markøren enten op eller til venstre. <CRSR> tasten er udstyret med en repetitions-funktion, så markøren flytter sig indtil du slipper tasten.

<INST/DEL>

Hvis man anvender <INST/DEL> tasten, vil markøren flytte sig et tegn tilbage, samtidig med, at den sletter (DELete = slette) det foregående tegn. Hvis man er midt i en linie, vil tegnet til venstre for markøren blive slettet og tegnene til højre vil automatisk blive rykket op mod markøren så huller i teksten undgås.

Anvendes den øverste funktion (v.h.a. <SHIFT> tasten), kan man indsætte (INSerT = indsæt) nye tegn i en skreven linie. Opdager man for eksempel, at man har glemt et ord eller et bogstav i en linie, kan < <==CRSR==> > tasten bruges til at flytte markøren tilbage til fejlen. Herefter kan man med <INST/DEL> tasten indskyde et mellemrum af fejlens længde og skrive det manglende ord eller bogstav.

<CLR/HOME>

<CLR/HOME> tasten flytter markøren til startpositionen i øverste venstre hjørne af skærmen (HOME = hjem). <CLR/HOME> tastens øverste funktion (brugt sammen med <SHIFT> tasten) flytter også markøren op i øverste venstre hjørne, men sletter samtidig skærmbilledet.

<RESTORE>

<RESTORE> sammen med <RUN/STOP> nulstiller hukommelsen uden at slette et program, der måtte befinde sig der.

FUNKTIONSTASTER

Funktionstasterne på den højre side af tastaturet kan programmeres til at udføre forskellige funktioner. De kan defineres alt efter de forskellige opgaver.

Page 21
<CTRL>

<CTRL> tasten <COnTROL = kontrol) sætter dig i stand til at ændre farver og udføre andre specialiserede funktioner. <CTRL> tasten holdes nede, mens der anvendes en anden af de angivne taster.

<RUN/STOP>

Bruges <RUN/STOP> tasten medens et program kører, vil dette stoppe udførelsen af det. <RUN STOP>-tastens øverste funktion vil hente et program ind fra et Datasetten og starte det.

<C=> COMMODORE TASTEN

Commodore tasten <C=> udfører en række funktioner. Den giver mulighed for at skifte mellem to tilstande, nemlig tekstfunktionen og den grafiske funktion.

Når der tændes for computeren, er man automatisk i den grafiske funktion, hvilket betyder, at der kan skrives store bogstaver (lower case) og forskellige grafiske tegn (upper case). Ved at bruge <SHIFT> tasten, får man de grafiske tegn, der er på den højre side af tasterne.

Holdes både <C=> og <SHIFT> tastene nede, skiftes til tekstfunktionen, som indebærer at, der skrives på skærmen med små (lower case) og store bogstaver (upper case), som på en skrivemaskine. Hvis man nu i stedet for at bruge <SHIFT> tasten bruger <C=> tasten sammen med en af de grafiske taster, vil man få det tegn, der er på den venstre side af tasten.

For at komme tilbage til udgangspositionen – store bogstaver og grafik, holdes både <C=> og <SHIFT> tasterne nede igen.

<<pre><<pre><<pre><<pre><<pre><<pre><<pre><<p><C=> tastens anden funktion giver mulighed for at bruge 8 tekstfarver, som er forskellige fra dem, der fås ved brug af <CTRL>. Ved samtidig at holde <C=> tasten og en "tal-taste" nede, vil den efterfølgende tekst blive skrevet i den farve, der hænger sammen med det tal, som blev trykket ned. Kapitel 5 viser dig hvilke tekstfarver, der hører til hvilke taster.

Tilbage til udgangssituationen

Nu da du har fået en chance for at gøre dig fortrolig med tastaturet, vil vi se på nogle af Commodore64's mange muligheder.

Hvis der stadigvæk er farvestriber på skærmen fra justeringen af TV-apparatet så tryk samtidig på <SHIFT> og <CLR/HOME> tasterne. Dette vil slette, hvad der er på skærmen og flytte markøren op til udgangspunktet i venstre hjørne.

Prøv nu at holde <C=> og <7> tasterne nede. Dette vil bringe tekstfarven tilbage til blå. Der mangler stadigvæk en ting for at komme tilbage til udgangspositionen. Hold <CTRL> og <0> tasterne nede (nul ikke O som Ole). Dette vil bringe skærmen tilbage til udgangssituationen. Hvis du husker det,

Page 22
Opstart

fik vi v.h.a. <CTRL> og <9> lavet alle farvestregerne (farverne er negative blanke). Hvis vi var i den almindelige indtastnings-funktion samtidig med, at vi lavede farvetesten, ville markøren have bevæget sig hen over skærmen, men den ville blot have lavet "blanke" - der ville altså ikke være sket noget på skærmen.

TIP: Vi har nu prøvet at lave det på den besværlige måde. Der er imidlertid en simpel måde, hvorpå man kan bringe computeren tilbage til udgangssituationen.

Tryk samtidig på: <RUN/STOP> og <RESTORE>

Dette vil slette, hvad der står på skærmen og bringe alt tilbage til udgangssituationen. Hvis der er et program i computeren, vil der ikke ske noget med dette.

Hvis man vil have maskinen bragt tilbage til den tilstand, den var i, da der blev tændt for computeren – uden programmer eller andet – skrives: SYS 64738 og trykkes <RETURN>. Men vær forsigtig med at bruge denne kommando, da den, som sagt, sletter alt lige fra programmer til almindelig information, som er i computeren.

Hente og gemme programmer

En af de vigtigste faciliteter på Commodore 64 er muligheden for at gemme og hente programmer fra kassettebånd eller disketter.

Dette giver dig mulighed for at gemme de programmer, du skriver, for at bruge dem igen senere. Den giver dig også mulighed for at benytte standard (færdige) programmer til din Commodore 64.

Inden vi gennemgår denne facilitet, bør du sikre dig, at diskette-stationen eller datasetten er rigtigt tilsluttet.

HENTE STANDARDPROGRAMMER

Hvis du kun er interesseret i at benytte programmoduler eller standardprogrammer på disketter eller kassetter, skal du gøre som følger:

PROGRAMMODULER: Til Commodore 64 er fremstillet en række programmer og spil som programmoduler. Programmerne tilbyder et bredt udsnit af muligheder til brug for såvel forretningsfolk som private brugere. Spillene virker stort set som andre TV-spil. For at hente disse spil frem fra programmodulerne, må man først tænde for TV'et. Derefter slukkes computeren. Så sættes programmodulet på plads, og der tændes for Commodore 64. Endelig nedtrykkes den taste,

Page 23
Opstart

som er angivet som starttaste. (f.eks. fl funktionstasten)

HUSK ! Afbryd Computeren før der indsættes et andet programmodul.

  • 2. KASSETTEBÅND: Her skal bruges en datasette og det kassettebånd, der kom som en del af programpakken. Kontroller at kassetten er spolet helt tilbage til begyndelsen af den første side. Kassetten placeres i datasetten. Herefter skrives LOAD (LOAD = hente/indlæse). Du kan i stedet trykke <SHIFT> sammen med <RUN/STOP>. Computeren vil svare med PRESS PLAY ON TAPE, hvilket er signal til at starte datasetten ved at trykke på PLAY-tasten. TV-skærmen vil nu blive lyseblå indtil programmet er fundet. Når programmet er fundet, vil computeren skrive FOUND PROGRAMNAVN på skærmen. Nu trykkes <C=> (se forordet) tasten ned. Herefter vil computeren indlæse programmet medens skærmen igen er lyseblå. Ønsker du at standse indlæsningen trykker du på <RUN/STOP> tasten.
  • 3. DISKETTER: Når diskettestationen bruges, skal man sikre sig, at diskette indsættes rigtigt. Mærkaten skal vende opad og det lille hak på siden af disketten (det er måske dækket af et stykke tape) skal vende til venstre. Når disketten er indsat, lukkes porten ved at trykke den lille klap i portåbningen ned. Nu skrives LOAD "PROGRAMNAVN", 8 (husk anførselstegnene) og der trykkes på <RETURN> tasten. Diskettestationen vil støje lidt og skærmen vil svare:

SEARCHING FOR PROGRAM NAME LOADING READY.

Når READY kommer frem på skærmen skrives RUN og standardprogrammet er klar til brug.

HENTE EGNE PROGRAMMER FRA KASSETTEBÅND

At hente/indlæse et program fra kassettebånd eller diskette er ikke svært. Kassettebåndet spoles helt tilbage til begyndelsen og der skrives:

LOAD "PROGRAMNAVN"

Hvis man har glemt programnavnet, skrives blot LOAD, så læses det første program på båndet ind i computerens hukommelse. Efter tryk på <RETURN> tasten vil computeren svare:

Page 24
PRESS PLAY ON TAPE

Efter at have startet båndoptageren ved at trykke på PLAYknappen, bliver skærmen lyseblå, mens computeren indlæser programmet fra båndet. Når programmet er fundet vil der på skærmen fremkomme:

FOUND PROGRAMNAVN

For at få programmet læst ind i hukommelsen trykkes på <C=> tasten. Ønskes indlæsningen afbrudt, trykkes der på <RUN/ STOP>. Når indlæsningen er afsluttet, kommer READY komme frem igen.

HENTE EGNE PROGRAMMER FRA DISKETTE

At hente et program frem fra en diskette foregår efter samme princip. Skriv først:

LOAD "PROGRAMNAVN".8

Efter tryk <RETURN>, vil disketten begynde at køre rundt og skærmen vil vise:

Winkutting For Indokendriki Europhia

. .

NB:

Når der hentes nye programmer ind i computerens hukommelse, vil alle de instruktioner, som før var i computeren blive slettet. Man skal derfor være sikker på, at det program, der arbejdes med er gemt, før et nyt indlæses. Har man først indlæst et program, kan man køre det (RUN), få det udskrevet på skærmen (LIST) eller rette i det og gemme den nye version.

GEMME EGNE PROGRAMMER PÅ BÅND

Efter at have indtastet et program som man ønsker at gemme, skrives:

计开关程序 计行行 医电子间静脉的复数形式

Programnavnet kan bestå af op til 16 tegn. Efter at man har trykket <RETURN>, svarer computeren med:

Page 25

Datasetten skal altså sættes til at optage ved at trykke på både RECORD-knappen og PLAY-knappen. Skærmen bliver lyseblå. Når programmet er gemt på båndet, vil "READY" komme frem på skærmen og vise, at du kan starte med at arbejde på et andet program eller slukke for maskinen.

GEMME EGNE PROGRAMMER PÅ DISK.

Det er endnu simplere at gemme programmer, på en diskette. Skriv:

- 81 ^ 네가머머머니 카이() 이너지 ^ - 김꼬리()

"8" er en kode for 'diskettestation' for at fortælle computeren, at du vil gemme programmet på en diskette. Efter at du har trykket <RETURN> vil disketten begynde at køre rundt, og computeren vil udskrive følgende på skærmen:

SHVINU "Екоьенныйун"
MERID'C.

PRINT og beregninger

Vi skal nu prøve at lave nogle programmer, som du kan gemme. Prøv at skrive følgende:

PRINT "COMMODURE 64" Skriv denne linie
og tryk .
REALTY. Computeren skrev

READY

Hvis du laver en skrivefejl, kan du enten skrive oven i eller bruge <INST/DEL> til at slette tegnet umiddelbart til venstre for markøren. Du kan slette så mange tegn som nødvendigt. Lad os nu se, hvad det var, der skete i det foregående eksempel. For det første instruerede du computeren om at skrive (PRINT = skriv) det, der stod imellem anførselstegnene. Ved at trykke <RETURN> fik du computeren til at udføre ordren, og "COMMODORE 64" blev udskrevet på skærmen.

Page 26

Når du bruger PRINT-funktionen på denne måde, vil alt hvad der er skrevet imellem anførselstegnene blive udskrevet nøjagtigt, som du skrev det. Hvis computeren i stedet skrev:

?SYNTAX ERROR

har du enten lavet en skrivefejl eller glemt anførselstegnene.

Computeren er præcis og instruktioner skal derfor gives på en bestemt måde. Du må derfor indtaste teksterne nøjagtigt, som vist her i teksten.

Du skal imidlertid huske, at computeren ikke tager skade af, at du skriver på den. Den bedste måde at lære BASIC på er ved at skrive tingene på skærmen og så se, hvad der sker.

PRINT er en vigtig instruktion i BASIC. Med PRINT kan man få udskrevet omtrent alt, hvad man vil på skærmen, herunder grafiske diagrammer og resultater af computerens udregninger. Prøv for eksempel følgende: Slet skærmbilledet ved at holde <SHIFT> nede samtidig med at <CLR/HOME> trykkes ned, skriv herefter, (husk at bruge tal og ikke bogstaver):

Vi så her, at commodore 64 også kan virke som en regnemaskine. Resultatet "24" blev udregnet og udskrevet på skærmen. Man kan også trække fra, gange, dividere, opløfte tal til en potens, udregne kvadratrødder o.s.v. og du er ikke bundet til kun at lave een udregning pr. linie, men herom senere. Bemærk her, at funktionen PRINT virkede på en anden måde end i det første eksempel. I dette eksempel er resultatet af det udregnede udskrevet i stedet for en tekst fordi anførselstegnene er udeladt.

ADDITION

Plus tegnet <+> viser computeren, at vi vil lægge sammen (addere): Vi instruerede computeren om at udskrive resultatet af 12 + 12. Andre regningsarter bliver udført på samme måde. De afsluttes alle med at trykke <RETURN>.

SUBTRAKTION

For at trække fra (subtrahere) bruges et minus-tegn <->. Skriv:

Page 27
MULTIPLIKATION

Hvis man vil gange (multiplisere) 12 med 12, bruges stjerne (asterisk) (*). Man skriver således:

(6610) 12*12 140

DIVISION

Division bruger tegnet </>. Vil man dividere 144 med 12 skrives altså:

2000) 2010 (20444) 1810

POTENS REGNING

Et tal opløftes til potens med tasten <+> (det er det samme som at gange tallet med sig selv et antal gange).

EKEEGE SLAVE. Letter

Dette er det samme som at skrive:

2월 1488 - 1943, • 1 19 • 119 1977 - 19

TIP:

I BASIC kan en del ting gøres på en kortere måde. Et eksempel på dette er forkortede BA-SIC-kommandoer og nøgleord. Et ? kan således bruges i stedet for kommandoen PRINT. Du vil, efterhånden som vi kommer frem igennem bogen, blive præsenteret for de forskellige kommandoer. Tillæg D viser forkortelser, samt hvad der vil blive gengivet på skærmen, når kommandoerne skrives i den forkortede form.

Det sidste eksempel viser en vigtig ting: Mange udregninger kan fortages på samme linie og de kan være af forskellig art. Du kunne for eksempel udregne:

Page 28
Opstart

Indtil nu har vi brugt små tal og simple eksempler. Commodore 64 kan imidlertid også klare mere komplicerede udregninger. Du kan f.eks. prøve at lægge nogle store tal sammen, men husk at bruge punktum i stedet for decimalkomma – ellers vil du få en fejludskrift.

? 123.45+345.78+7895.687 8364.917

Det ser jo rigtigt ud, men prøv nu dette her:

? 12123123.45+345.78+7895.687 12131364.9

Hvis man tog sig tid til at udregne det samme pr. håndkraft, ville man komme frem til et andet resultat. Det der her sker er, at selv om computeren har en stor kapasitet, er der en begrænsning i det antal cifre, den kan behandle. Commodore 64 kan behandle op til 10 cifre. Når tal bliver skrevet på skærmen, vil der imidlertid kun vises 9 cifre.

I vort eksempel var resultatet altså afrundet for at passe ind i disse rammer. Commodore 64 runder op når det efterfølgende tal er 5 eller derover og ned når det er 4 eller derunder.

Tal mellem 0.01 og 999.999.999 udskrives på normal vis. Tal herunder eller over bliver udskrevet på en speciel måde. Denne måde giver et stort eller et lille tal udtrykt som et tal gange med en potens af 10.

(Eksponentialnotation).Hvis du for eksempel skriver:

?123000000000000000 1.23E+17

Dette er det samme som 1,23 ¥ 10¶17. Der er dog også grænser for hvor store tal computeren her kan klare. Disse grænser er:

Største tal: +/- 1.70141183E+38 Mindste tal: +/- 2.93873588E-39

Fortsættelse

Hvis du har prøvet at udføre nogle sammensatte udregninger, der var forskellige fra de eksempler, som vi gennemgik tidligere, er du måske kommet frem til nogle uventede resultater. Det er fordi computeren udfører beregningerne i en bestemt rækkefølge.

Page 29

Tag for eksempel denne beregning:

20+8/2

Før computerens beregningsrækkefølge kendes, kan man ikke sige om resultatet skal være 24 eller 14. Hvis man lægger 20 til 8 divideret med 2 (altså 4) er resultatet 24, men hvis man først lægger 20 til 8 og derefter dividerer med 2 bliver resultatet 14. Prøv eksemplet på computeren og se resultatet. Grunden til, at du får resultatet 24 udskrevet er, at Commodore 64 regner fra venstre mod højre under hensyntagen til følgende prioritets rækkefølge (samme rækkefølge, som man anvender i matematikken):

  • 1. Potensopløftning, tallet til venstre for pilen opløftes til den potens, som tallet til højre for pilen angiver.
  • 2. * / Multiplikation og division, gående fra venstre mod højre.
  • 3. + Addition og subtraktion, gående fra venstre mod højre.

Hvis eksemplet regnes efter de angivne regler, kommer man frem til at divisionen udføres før additionen, hvilket giver resultatet 24. Man kan imidlertid ændre på denne fastlagte rækkefølge ved at anvende parenteser omkring de operationer, man vil have udført først. Hvis man f.eks. vil dividere 35 med 5 + 2 (altså 7) og man skriver:

? 3575+2 9

vil man først få 35 divideret med 5 og derefter lagt 2 til, hvilket ikke lige var det, der var meningen. Prøv i stedet at skrive:

? 35/(5+2) 5

Det der her skete var, at computeren først undersøgte, hvad der var inde i parentesen. Hvis der er en parentes inde i en anden parentes, undersøges den inderste parentes først. Hvor der er flere parenteser på en linie, som for eksempel her:

? (12+9)*(6+1)
| 147

undersøger computeren dem fra venstre mod højre. Her vil 21 blive ganget med 7 og give 147.

Page 30

Kombinationer

Selv om vi nu har brugt en del tid på ting, som måske ikke synes særlig vigtige, vil de viste detaljer vise sig at være uvurderlige, når du først er begyndt at programmere.

For at få en fornemmelse af hvordan tingene hænger sammen, kan du prøve at overveje, hvordan man kombinerer de to gennemgående PRINT-funktioner for at få noget mere meningsfyldt ud på skærmen.

Vi ved, at hvis vi sætter noget i anførselstegn, vil vi få nøjagtig det samme gengivet på skærmen, som det vi skrev. Vi ved også, at vi ved hjælp af regnefunktionen kan få udført nogle beregninger. Så hvorfor ikke kombinere disse to PRINTfunktioner således:

2"5+9= 45 5*9= 45

Det vi her har gjort er at bruge de to PRINT-funktioner sammen. Den første del skriver "5 * 9 = ", nøjagtig ligesom vi skrev det. Den anden del udfører selve udregningen og skriver resultatet. Semikolon'et adskiller den første del af meddelelsen og den faktiske udregning.

Du skal altid adskille delene i en sådan "sammenblandet" linie med en form for tegn. Prøv at bruge et komma i stedet for semikolon'et, og se hvad der sker.

Semikolon bevirker, at den anden del af linien bliver udskrevet umiddelbart efter den første del. Komma bevirker, at der kommer større mellemrum i udskriften mellem de to dele. Hvis du skriver:

vil tallene blive skrevet hele vejen hen over skærmen og ned i næste linie.

Commodore 64's skærmbillede er opbygget i 4 områder a 10 kolonner hver. Ved brug af komma anbringes hver del i det førstfølgende område. Kommaet virker altså som tabulator. Eftersom vi ville have flere informationer udskrevet, end der kunne være på een linie (vi prøvede at indsætte 5 resultater på een linie), blev den sidste del rykket ned i næste linie. Denne forskel mellem komma og semikolon kan vi senere få fordel af, når vi skal lave mere komplicerede skærmbilleder.

Page 31

KAPITEL 3

BASIC PROGRAMMERING FOR BEGYNDERE

  • Det næste skridt.... GOTO
  • Redigerings tips
  • Variabler
  • IF .... THEN
  • FOR .... NEXT løkker
Page 32

Page 33
Det næste skridt .... GOTO

Indtil nu har vi udført nogle simple operationer, ved at lade maskinen behandle, en enkelt linje med instruktioner. Når vi havde trykket på <RETURN> blev operationen straks udført. Vi siger, at vi giver computeren en KOMMANDO.

For at kunne udføre noget af betydning, må vi være i stand til at få computeren til at arbejde med mere end en enkelt kommando. Hvis vi sætter flere kommandoer sammen med linienummer foran (laver flere linier) får vi et program ud af det, hvilket gør os i stand til at udnytte computerens kapacitet fuldt ud. Står kommandoen i en linie med linienummer foran, kalder vi det en INSTRUKTION. For at se hvor let det er at lave et program, kan du prøve

Slet det du har stående på skærmen ved at holde <SHIFT> tasten nede samtidig med at du trykker på <CLR/HOME>. Skriv NEW og tryk <RETURN>. (Dette sletter alt det du har fået lagt ind i computeren indtil nu). Skriv nu følgende nøjagtig, som det er vist på billedet husk at trykke <RETURN> efter hver linie.

Derefter indtastes RUN og der trykkes <RETURN>. Skærmen blev nu helt fyldt med COMMODORE 64. For at stoppe programmet igen trykkes på <RUN/STOP>.

Dette lille program introducerer nogle vigtige begreber, som er basis for al programmering.

Læg mærke til, at der foran hver programlinie er et tal. Dette linienummer fortæller computeren i hvilken rækkefølge, den skal behandle instruktionerne. Numrene er også et forbindelsespunkt i tilfælde, hvor programmet skal gå til en bestemt linie. Som linienummer kan man bruge ethvert helt tal mellem 0 00 63999

10 PRINT "COMMODORE 64" 10 PRINT "COMMODO instruktion linienummer

Page 34

Det er en god ide at nummerere linierne med spring på 10 - så kan der senere lægges linier ind midt i programmet. Foruden PRINT brugte det lille program også en anden BASIC kommando - GOTO. Denne instruerer computeren om at gå direkte til en bestemt linie. udføre det, der står i denne og derefter fortsætte fra den efterfølgende linie.

-10 PRINT "COMMODORE 64" L20 GOTO 10

I dette eksempel, skriver programmet meddelelsen i linie 10, går til den næste linie (20), som instruerer det om at gå tilbage til linje 10 og skrive meddelsen igen hvilket gentages. Da vi ikke gav computeren en vei ud af denne løkke, vil programmet gentage sig i det uendelige, indtil vi stopper det ved at trykke på <STOP> tasten (<RUN/STOP>). Når du har fået programmet stoppet, prøver du at skrive LIST. Dit program gengives intakt fordi det stadigvæk er i computerens hukommelse. Læg mærke til, at computeren har lavet ? om til PRINT. Du kan nu rette i programmet, gemme det eller køre det igen. En anden vigtig forskel på at skrive noget som en kommando og at skrive et program er, at hvis du udfører 'en kommando og sletter skærmen er kommandoen væk. Et program kan hentes frem ved at man skriver LIST.

Redigeringstips

Hvis man laver feil på en linie, er der flere måder hvorpå rettelser kan foretages.

  • 1. Man kan til enhver tid skrive en ny linie, som computeren automatisk vil lægge oven i den gamle linie.
  • 2. Man kan også rette i en eksisterende linie, ved at bruge markør tasterne og redigerings tasterne.

Page 35

Side 33

Hvis du for eksempel havde lavet en skrivefejl i en linie i det lille program, vi lavede før, kunne du rette den uden at skrive hele linien om ved at gøre sådan: Skriv LIST, og tryk <RETURN>. Brug nu <SHIFT> og < A CRSR # > tasterne sammen, indtil markøren er ud for den linie, der var feil i. Derefter bruges < <==CRSR==> > til at flytte markøren til højre hen til det tegn, der skal ændres. Efter at rettelsen er foretaget trykkes <RETURN>, hvilket skifter den gamle linie ud med den nye linie. Hvis du mangler plads på en linie (til enten bogstaver eller blanke), placeres markøren, der hvor pladsen mangler, hvorefter der trykkes 'samtidig på <SHIFT> og <INST/DEL>. Dette vil få teksten til at "åbne" sig. Du kan nu tilføje det du ville og trykke <RETURN>. På samme måde kan man slette uønskede tegn ved at placere markøren til højre for det tegn, der skal slettes og trykke <INST/DEL>. For at se, at programmet er ændret, kan du skrive LIST, og trykke <RETURN> igen. Det rettede program vil så blive gengivet. Programmets linier kan indtastes i vilkårlig rækkefølge. Computeren vil selv ordne linierne i stigende nummerorden. Prøv at rette i det lille program, ved at tilføje et semikolon i slutningen af linie 10, som vist på nedenstående billede - husk <RETURN>. Prøv derefter at køre programmet (RUN). 10 PRINT "COMMODORE ";

COMMODORE COMMODORE COMMODURE COMMODORE
COMMODIORE COMMODORE COMMODORE COMMODORE
COMMODORE COMMODORE COMMODORE COMMODORE
COMMODORE COMMODORE COMMODORE COMMODORE
COMMODORE COMMODORE COMMODORE COMMODORE
COMMODIORE COMMODORE COMMODORE COMMODORE
COMMODORE COMMODORE COMMODORE COMMODORE
COMMODORE COMMODORE COMMODORE COMMODORE
COMMODORE COMMODORE COMMODORE COMMODORE
COMMODORE COMMODORE COMMODORE COMMODORE
COMMODORE COMMODORE COMMODORE COMMODORE
BREAK IN 1 10
READY.

Variabler

Variabler bruges i ethvert programmeringssprog, idet de kan repræsentere meget af vores information i computeren. Hvis man forstår hvordan variabler fungerer, er det meget lettere at programmere. Desuden kan man udføre ting, som ikke ville være mulige uden brug af variabler.

Page 36
Forestil dig nogle "kasser" inden i computeren, der kan have
et tal eller en streng (række af tekst-tegn). Hver af disse
"kasser" må mærkes med et navn. Dette navn kaldes en variabel
og repræsenterer den information som er i den respektive
"kasse".
Hvis vi for eksempel siger:
  10 X% = 15
  20 X = 23.5
  30 XS - "SUMMEN AF XX+X- "
kunne computeren repræsentere variablerne sådan:
  xs
      SUMMEN AF X%+X=
Et variabelnavn repræsenterer den kasse eller det sted i hu-
kommelsen, hvor den løbende værdi af variablen er gemt. Som
du kan se kan vi fastsætte en variabel til at være enten et
heltal, et decimaltal eller en række tegn (en streng).
Et variabelnavn fulgt af et %-tegn, viser at variablen repræ-
senterer et helt tal, (ingen decimaler). Det følgende er gyl-
dige heltals-variabelnavne :
4%
X%
NM%
Følger et $-tegn efter variablen, repræsenterer variablen en
tekst-streng. Det følgende er eksempler på strengvariabler :
Reelle variabler. (decimaltal), følger samme format, med
følgende tegn:
Når man skal navngive en variabel, er der nogle få ting, som
man skal huske på. For det første er et variabelnavn 1 eller
2 tegn. Det første tegn skal være et alfabetisk tegn (bog-
stav) fra A til Z. Det andet tegn skal være enten alfabetisk

eller numerisk (gående fra 0 til 9). Man kan bruge et tredie tegn for at vise hvilken type variabel, det drejer sig om (hele tal eller tekst-strenge) % eller $.

Page 37

Man kan godt bruge variabelnavne på mere end 2 tegn, men computeren genkender kun de første 2 tegn. (Man kan altså ikke have 2 forskellige variabler med de samme 2 begyndelsesbogstaver). På og PARTI er altså ens navne og refererer til den samme kasse.

Den sidste regel for navngivning af variabler er simpel: Et variabelnavn kan ikke indeholde et BASIC-nøgleord (reserverede ord) så som GOTO, RUN o.s.v. TILLÆG D viser en komplet liste over BASIC's reserverede ord.

For at se hvordan variabler kan bruges, kan du skrive hele det program, som vi introducerede før - og køre det. Husk at trykke <RETURN> efter hver linie i programmet.

X#="SUMMEN AF XX OG X FR "

Hvis du gjorde som vist, skulle du få følgende resultat skrevet ud på skærmen.

SUMMEN AF XX OG X ER 38.5

I linie 10 og 20 har vi givet X% heltalsværdien 15 og X den reelle værdi 23.5. Dette lægger de tal, der hører sammen med variablerne ned på disses pladser. I linie 30 knyttede vi en streng til XS. Linie 40 kombinerer de to PRINT-funktioner for at skrive en tekst og den nuværende værdi af X% og X. Linie 50 skriver strengen der hører sammen med XS og summen af X% og X.

Læg mærke til, at selvom X er brugt, som en del af alle variabelnavne, gør identifikationerne % og $, at X%, X og X$ er forskellige og dermed kan repræsentere 3 forskellige varia-Men variabler kan bruges til meget mere. Man ændrer deres

værdi ved at lægge en ny værdi oven i den gamle. Det kan f. eks døres sådan .

X = X + 1

Dette ville aldrig blive accepteret indenfor den almindelige matematik. Men det er et af de mest brugte begreber indenfor programmering. Det betyder: Tag den nuværende X-værdi (X på høire side af lighedstegnet). læg l til og placer den nye værdi i "kassen" med navnet X udenpå.

Page 38
IF.....THEN

Efter at vi nu har lært at opdatere variabler, kan vi nu prøve dette program:

NEW
10 CT=0
20 2"COMMODORE 54"
30 CT=CT+1
40 IF CTC5 THEN 20
50 END
RUN
COMMODORE 54

Vi har her introduceret 2 nye BASIC instruktioner og udstyret vores lille program fra før med nogle kontroller. IF....THEN tilføjer logik til programmet. Det siger, at hvis (IF) et udsagn er rigtigt, (THEN) gør et eller andet. Hvis udsagnet ikke længere er rigtigt, så fortsæt til næste linie i programmet (efter IF-linien). Vi kan bruge forskellige betingelser i et IF.....THEN udsagn.

SYMBOL BETYDNING
< Mindre end
> Større end
= Lig med
<> Ikke lig med (forskellig fra)
>= Større end eller lig med
<= Mindre end eller lig med

Alle disse betingelser er nemme at bruge, og meget benyttede.

10 CT=0

20 ?"COMMODORE 64"

30 CT=CT+1

40 IF CT<5 THEN 20

50 END

I programmet har vi nu lavet en løkke med nogle betingelser tilknyttet ved at sige: Hvis en værdi er mindre end et eller andet tal, gør dette eller hint. Linie 10 sætter CT (CounT = tælle) lig med 0. Linie 20 udskriver vores meddelse. Linie 30 lægger 1 til variablen CT. Denne linie tæller, hvor mange gange vi kører løkken igennem. Hver gang løkken er løbet igennem, bliver CT talt op med 1. Linie 40 er en kontrollinie. Hvis CT er mindre end 5, går programmet tilbage til linie 20 og skriver igen. Når CT bli-

Page 39

ver lig med 5 - hvilket viser, at der er skrevet COMMODORE 64 5 gange – går programmet videre i linie 50, som afslutter programmet. Prøv programmet og se, hvad det er, vi mener. Ved at ændre på CT-grænsen i linie 40, kan du lade programmet løbe igennem et vilkårligt antal gange. IF.....THEN kan bruges på mange andre måder, hvilket vi vil få at se i nogle eksempler senere hen.

FOR.....NEXT løkker

Der er en mere simpel og mere brugt måde, hvorpå vi kan opnå det samme som i eksemplet ovenfor, nemlig ved at bruge FOR... NEXT løkker. Se det følgende eksempel:

ΝЕМ

10 FOR CT=1 TO 5
20 ?"COMMODORE 64"
30 NEXT CT
RUN
COMMODORE 64

Som det ses, er programmet blevet mindre og mere overskueligt.

CT sættes til l i linie 10. Så laver linie 20 en udskrift. I linie 30 bliver CT forøget med l. NEXT-instruktionen i linie 30 sender automatisk programmet tilbage til linie 10, hvor udtrykket FOR fra FOR.....NEXT-instruktionen lokaliseres. Dette vil fortsætte indtil CT når den grænse, som er angivet. Variablen der er brugt i FOR.....NEXT løkken, kan forøges med mindre end l, hvis det er nødvendigt.

Page 40

Udelades kommaet, vil tallene blive udskrevet i een række neden under hinanden. Hvis du taster dette program ind og kører det, vil du se tallene fra l til 10 med spring på 0.5 udskrevet hen over skærmen, som på omstående billede. Alt hvad vi her gjorde, var at udskrive de værdier, som NB antog, alt imens programmet kørte rundt i løkken. Du kan endda specifere, om variablen skal forøges eller formindskes. Prøv at skifte linie 10 i det foregående program ud med denne linie:

10 FOR NB=10 TO 1 STEP -.5

og se at udskriften nu sker omvendt, hvor værdien for NB går fra 10 til 1.

Page 41

KAPITEL 4

BASIC FOR VIDEREKOMNE

  • Forord
  • Simple bevægelser
  • INPUT
  • GET
  • Tilfældige tal og andre funktioner
  • Gættelege
  • Så er det din tur
  • Tilfældig grafik
  • CHR$ og ASC funktioner
Page 42

Page 43

FORORD

De næste par kapitler er skrevet for dem, der er blevet mere fortrolige med programmeringssproget BASIC og den fremgangsmåde, der er nødvendig for at kunne skrive mere avancerede programmer.

For dem der kun lige er begyndt at lære, hvordan man programmerer, er noget af det, der her skrives, måske for kompliceret til at kunne forståes fuldstændigt. Men tag det roligt specielt for begyndere, har vi skrevet to morsomme kapitler, SPRITE GRAFIK og LYD med nogle mere simple eksempler. Eksemplerne vil give en fornemmelse af, hvordan man kan bruge de avancerede lyd og grafik muligheder, der er til rådighed på Commodore 64. Mere detaljeret information kan findes i "COMMODORE 64 PRO-

Mere detaljeret information kan findes i "COMMODORE 64 PRO-GRAMMER'S REFERENCE MANUAL, som du kan få gennem din Commodore forhandler.

Simple bevægelser

Lad os prøve nogle af Commodore 64's grafiske muligheder ved at sætte det, vi har set indtil nu, sammen med nogle få nye begreber. Prøv at skrive det følgende program og se, hvad der sker. Det vil bemærkes, at vi inde i PRINT-linierne også kan have markørkontrol og skærmkommandoer. Når du ser < -----------------------------------

10 REM 20 PRINT"<SHIFT><CLR/HOME>" 25 FORX=1T010:PRINT"< CRSR ♥ >";:NEXT 30 FORBL=1T040 40 PRINT" ♥♥ <=CRSR >"; 50 FORTM=1T05 50 NEXTTM 70 NEXTBL 90 PRINT" ♥ <=CRSR >< <=CRSR >●< <=CRSR >"; 100 FORTM=1T05 110 NEXTTM 120 NEXTBL

TIPS: Alle disse programlinier kan stå på een BASIC-linie, selvom det evt. fylder op til to linier på skærmen. Hvis du imidlertid ikke trykker på <RETURN> når linien er indtastet, vil Commodore 64 ikke kunne se linien, og den vil dermed ignorere den.

Page 44

Dette program vil vise en springende bold, der bevæger sig fra venstre mod højre og tilbage igen ned over skærmen. Hvis vi ser nærmere på programmet, som er vist nedenfor, kan du se, hvordan dette er muligt.

10 REM HOPPENDE BOLD 20 PRINT"<SHIFT><CLR/HOME>" 25 FORX=1T010:PRINT"< CRSR " >";:NEXT 30 FORBL=1T040 40 PRINT" •< <=CRSR >"; 50 FORTM=1T05 60 NEXTTM 70 NEXTBL 75 REM 80 FORBL=40 TO 1 STEP-1 90 PRINT" < <=CRSR >< <=CRSR >•< <=CRSR >"; 100 FORTM=1T05 110 NEXTTM 120 NEXTBL 120 GOTO 20

Linie 10 er en REMark linie (remark = bemærkning), som bare fortæller os, hvad programmet gør. Dette har ikke nogen virkning på selve programmet. Linie 20 sletter, hvad der står på skærmen. Linie 25 PRINT'er 10 markør-ned kommandoer. Dette sætter bolden midt på skærmen. Hvis linie 25 var udeladt, ville bolden flytte sig tværs over den øverste linie på skærmen. Linie 30 starter en løkke, der skal flytte bolden 40 kolonner fra venstre mod højre. Linie 40 laver flere ting. Først udskriver den en blank for at fjerne den sidste bold-position, dernæst udskriver den en nv bold og tilsidst flytter den markøren til venstre, for at være klar til at slette bolden igen. Den løkke, der er lavet i linie 50 og 60, sætter boldens fart en smule ned eller sinker programmet. Uden den ville bolden flytte sig for hurtigt til, at den kunne ses. Linie 70 fuldender den løkke, der begynder i linie 30. Hver gang denne løkke køres igennem, flyttes bolden endnu en position til højre. Som du kan se på billedet, har vi lavet een løkke inden i en anden. Dette er tilladt. Derimod er det ikke tilladt at løkkerne krydser/overlapper hinanden. For at vise, hvad der vil ske, hvis to løkker krydser hinanden, prøver vi at bytte linie 60 og 70 om. Vi får nu en fejl. fordi computeren ikke kan finde ud af, hvad det er vi laver. Linie 80 til 120 laver den første del af programmet omvendt og flytter bolden fra højre mod venstre. Linie 90 er lidt forskellig fra linie 40, fordi bolden flytter sig i den modsatte retning (vi skal slette bolden til højre og flytte den til venstre). Når dette er gjort, går programmet tilbage til linie 20, for at starte forfra igen. For at variere programmet kan du prøve at redigere linie 40. så der kommer til at stå følgende:

Page 45

40 PRINT "•";

Kør programmet og se, hvad der nu sker. Fordi vi har udeladt markørkontrollen, forbliver alle boldene på skærmen, indtil de bliver slettet af den bold, der flytter sig fra højre til venstre på skærmen i den anden del af programmet.

INPUT

Indtil nu har alt i programmerne været fastlagt, inden vi kørte dem. Når programmet først var startet, kunne man ikke ændre noget. INPUT gør os i stand til at lægge ny information ind i programmet, mens det kører og medtage disse nye informationer i beregningerne.

For at få en fornemmelse af hvordan INPUT fungerer. Skriver vi NEW, trykker <RETURN> og indtaster dette lille program.

10 INPUT A≢ 20 PRINT "DU INDTASTEDE: ";A≢ 30 PRINT 40 GOTO 10 RUN 2 COMMODORE 64 DU INDTASTEDE: COMMODORE 64

Det der sker, når vi kører programmet, er simpelt. Der vil blive udskrevet et spørgsmålstegn, hvilket viser, at computeren venter på, at du skriver noget. Skriv et eller flere tegn og tryk <RETURN>. Computeren vil så svare med "DU INDTASTEDE" efterfulgt af det. du skrev.

Dette kan synes meget elementært, men forestil dig, hvad du kan få computeren til at gøre, med den information du giver den.

Man kan INPUT'te (input = indsætte) enten tal eller tegn, man kan endog lade INPUT-linie give en meddelse til brugeren. Formatet for INPUT er:

INPUT "SKRIV BESKED"; VARIABLER MINDRE END 38 TEGN

eller bare:

INPUT VARIABLER

VARIABLER ADSKILLES AF KOMMA

BEMÆRK: For at komme ud af dette program holdes <RUN/STOP> og <RESTORE> tasterne nede.

Det næste program demonstrerer meget af det, vi har vist indtil nu incl. den nye INPUT-linie.

Page 46
BASIC for viderekomne

1 REM TEMPERATUR KONVERTERING 5 PRINT"D" 10 PRINT"OMREGN FRA FAHRENHEIT ELLER CELCIUS(F/C)";INPUTA$ 20 JE6$-""THEN10 30 1F8$="F"THEN100 40 IFA#="C"THEN50 50 INPUT"INDTAST GRADER CELSIUS: ";C 60 F=(C * 9)/5+32 70 PRINTC:"GRAD. CELSIUS = ":E:" GRAD. FAHRENHEIT" 100 INPUT"INDIASI GRADER FAHRENHEIT: ":F 110 C=(F-32)*5/9 120 PRINTF;"GRAD. FAHRENHEIT = ":C:" GRAD. CELSIUS" 130 PRINT 140 601010 Hvis du indtaster dette program og kører det, vil du se INPUT i funktion. Linie 10 bruger INPUT til både at indhente information og udskrive vores meddelelse. Læg også mærke til at vi kan spørge efter enten et tal eller en tekst (ved at bruge numeriske eller streng variabler). Linie 20,30 og 40 laver nogle check på det, der er skrevet ind. Hvis ikke der er skrevet noget (bare trykket <RETURN>), får linie 20 programmet til at gå tilbage til linie 10. der stiller spørgsmålet igen. Hvis der er skrevet F, ved vi, at brugeren ønsker at omregne en temperatur fra fahrenheit til celciusgrader. Linie 30 får derfor programmet til at hoppe til den del af programmet, der laver denne omregning. Linie 40 laver endnu et check. Vi ved, at der kun er to gyl-

dige svar, som brugeren kan skrive. For at komme ned til linie 40, må brugeren have skrevet noget andet end F. Nu laves et check for at se om dette tegn er et C. Derefter går programmet til INPUT igen.

Dette synes måske for detaljeret, men det er god programmeringsskik. En bruger som ikke er fortrolig med programmet, kan blive meget forvirret, hvis programmet laver et eller andet mærkeligt, fordi der ved en fejltagelse blev skrevet en forkert information.

Når vi har skrevet, hvilken type omregning vi vil have foretaget, laver programmet beregningerne og udskriver den temperatur, vi gav det sammen med den omregnede temperatur. Efter at beregningerne er færdige og svaret udskrevet, starter programmet forfra.

Efter en kørsel kunne skærmen se ud som det

OMREGN FRA FAHRENHEIT ELLER CELCIUS(F.40) 9 F INDTAST GRADER FAHRENHEIT: 32 32 GRAD. FAHRENHEIT = 0 GRAD. CELCIUS OMREGN FRA FAHRENHEIT ELLER CELCIUS(F.40) 7

Tilføj nu : 45 END : REM STOPPER HVIS DER IKKE ER TASTET <F> ELLER <C>

Page 47

Efter at have kørt programmet, bør du gemme det på diskette eller bånd. Dette program kan, sammen med andre programmer der er præsenteret i denne brugervejledning, danne grundlag for dit programbibliotek.

GET

Nu, da du kender INPUT-instruktionen, vil vi fortsætte med en anden måde at hente oplysninger ind fra tastaturet på. GETinstruktionen henter tegn fra tastaturet et for et. Den der kører programmet, skal ikke trykke på <RETURN>. Tegnet, som indtastes, lægges i den variabel, som vi definerede sammen med GET. Den følgende rutine er et eksempel på, hvordan GET arbejder:

1 PRINT"<SHIFT><CLR/HOME>" 10 GETA$:IFA$=""THEN10 INGEN BLANK! 20 PRINTA$; 30 GOTO10

Hvis man kører programmet, vil skærmen blive blank og hver gang man trykker på en taste, vil linie 20 vise det tilsvarende tegn, hvorefter programmet vil GET'te (get = få/hente) endnu et tegn. Det er vigtigt at lægge mærke til, at det tegn der skrives ikke bliver vist, med mindre man (v.h.a. PRINTinstruktionen) beder om at få det udskrevet.

Den anden instruktion på linie 10 er også vigtigt. GET virker hele tiden, selv om der ikke er trykket på en taste (ikke lige som INPUT, der venter på et svar), derfor checker den anden del af linien hele tiden tastaturet indtil en taste trykkes ned.

Se hvad der sker, hvis den anden del af linie 10 udelades. For at stoppe dette program trykkes på <RUN/STOP>.

Den første del af temperatur-omregnings-programmet kunne let omskrives til at bruge GET. Hent programmet (LOAD) og omform linie 10,20 og 40 som vist:

10 PRINT"OMREGN FRA FAHRENHEIT ELLER CELCIUS(F/C)" 20 GETA$:IFA$=""THEN20 40 IFA$(>"C"THEN20

Tilfældige tal og andre funktioner

Commodore 64 indeholder funktioner, som bruges til udførelse af specielle operationer. I stedet for at skrive en række programlinier, hver gang man skal have udført en speciel beregning, kan man skrive en kommando for den ønskede funktion - computeren vil så gøre resten.

Page 48

KAPITEL 4

Side 46

Når man laver spil eller undervisningsprogrammer, er man ofte nødt til at finde på nogle tilfældige tal. for eksempel for at simulere terning-kast. Man kan også lave et program, som kan lave disse tal men det er nemmere at bruge RaNDom number (tilfældige tal) funktionen.

For at se, hvordan RND virker - prøv dette lille program:

20 PRINT RND(1), 20 NFXT X Hvis kommaet udelades, bliver tallene

Efter at have kørt programmet, vil du se noget, der ligner dette:

.789280697 .664673958
.256373663 .0123442287
.682952381 3.90587279E-04
.402343724 .879300926
.158209063 .245596701

Du har ikke de samme tal? Det er godt. Hvis de var ens, ville de vel ikke være særlig tilfældige!

Prøv at køre programmet et par gange mere, indtil du er sikker på at resultatet altid er forskelligt. Selv om tallene ikke følger noget mønster, burde du lægge mærke til, at der

For det første ligger resultaterne altid imellem 0 og 1. men aldrig lig med 0 eller 1. Dette kan jo aldrig gå an, hvis vi ønsker at simulere tilfældige kast med en terning, hvor vi skal bruge bele tal imellem 1 og 6.

En anden vigtig ting at lægge mærke til er, at vi behandler reelle tal. Dette kunne også blive et problem, da man ofte skal bruge bele tal.

Der er flere simple måder, hvorpå man kan lave tal med RND funktionen indenfor et ønsket område.

Prøv at udskifte linie 20 med følgende linie og kør programmet igen: 20 PRINT 6*RND(1),

8.18381035 9.82527884 Dette løste vores problem med ikke at have tal større end l. Men vi har stadig nogle decimaler at slås med! Det er der en

INTeger (helt tal) funktionen laver decimaltal om til hele tal.

Page 49

Prøv at bytte linie 20 ud med følgende sætning og kør programmet igen for at se, hvad der sker:

20 PRINT INT(6*RND(1)), RUN 2 3 1 0 2 4 5 5 0 1

Det skete der en masse ved. Vi kom nu nærmere på vores tilfældige tal mellem l og 6. Hvis du ser rigtigt på det vi fik udskrevet i vores sidste forsøg, vil du se at tallene kun går fra 0 til 5. Det sidste vi gør er at lægge l til resultatet - som i den følgende linie:

20 PRINT INT(6*RND(1))+1.

Nu har vi opnået det ønskede resultat. Generelt kan man i parentesen med INT funktionen, placere et tal, en variabel eller ethvert BASIC-udtryk. Afhængig af indenfor hvilket område man vil have sine tal. Man skal gange RND funktionen med den øverste grænse. For eksempel kan man for at frembringe tal imellem 1 og 25 skrive:

20 PRINT INT(25*RND(1))+1

Den generelle formel for at lave et sæt tilfældige tal er:

TAL=INT(ØVERSTE GRÆNSE*RND(1))+NEDERSTE GRÆNSE

Gættelege

Eftersom vi nu er kommet et godt stykke vej i forståelsen af tilfældige tal, hvorfor så ikke bruge denne viden? Det følgende program viser ikke bare en god måde at bruge tilfældige tal på, det viser os også lidt ny programmerings-teori. Ved kørsel af dette program, laves et tilfældigt tal NM.

Page 50

KAPTTEL 4

Side 48

1 REM TAL GET 2 REINTROCHIETSCOLRZHOMES" 5 INPUT"INDTAST ØVRE GRÆNSE FOR GÆT ":LI 10 NM=INT(LI*RND(1))+1 20 PRINT TEG HAR FORSTAFT DET. " 30 PRINT:INPUT"HVAD GÆTTER DU PA":GU 35 CN=CN+1 40 IF GU>NM THEN PRINT"MIT TAL ER LAVERE" : PRINT : GOTO 30 SO IF GUINM THEN PRINT MIT THE ER HAJERE" : PRINT : GOTO 30 60 IF GUENM THEN PRINT : PRINT"GODT!" 65 PRINT"DU GETTEDE MIT TAL PA KUN ":CN:"FORSØG":PRINT 70 PRINT"VIL DU PRØVE IGEN (J/N)" 80 GET AN$ : IF AN$="" THEN 80 90 IE 8N$∞"J" THEN 2 100 IF AN≇<>"N" THEN 80

Du kan specificere, hvor stort tallet må blive i begyndelsen af programmet. Så er det op til dig at gætte, hvilket tal det er. Vi laver en prøvekørsel sammen med en forklaring.

INDTAST ØVRE GRÆNSE FOR GÆT? 25 JEG HAR FORSTAET DET. HVAD GETTER DU RA 2 15

MIT THE FR HATERE.

HVAD GETTER DU PA ? 20 MIT TAL ER LAVERE.

HVAD GETTER DU PA 2 19 DU GÆTTEDE MIT TAL PÅ KUN 3 FORSØG.

VIL DU prøve igen (j/n) ?

TE/THEN_instruktionerne sammenligner dit gæt med det tilfældige tal som computeren har frembragt. Alt afhængigt af dit gæt fortæller programmet dig, om dit gæt var højere eller lavere end computerens tal.

Ud fra den formel, der er givet til bestemmelse af tilfældige tals øvre og nedre grænser, kan du nu prøve at skrive nogle flere linier til programmet, så du også kan vælge en nedre grænse for hvilke tal, der kan vælges.

For hver gang du gætter på et tal, forøges CN med en, for at holde styr på antallet af gæt.

Page 51

Når du har det rigtige svar, udskriver programmet f.eks.: "DU GÆTTEDE MIT TAL PÅ KUN 3 FORSØG". Du kan herefter prøve igen og se, om du kan gøre det bedre. Husk at programmet vælger et nyt tal hver gang.

I linierne 40 og 50 anvendes et kolon til at adskille flere instruktioner på sammme linie. Dette sparer ikke kun indtastningstid, men det sparer også plads i hukommelsen/lageret. Programmet bliver også hurtigere. Til gengæld går det ud over overskueligheden. Det bemærkes også, at vi i IF/THEN-instruktionerne på de samme linier instruerede computeren om at PRINT'e noget, i stedet for med det samme at gå videre til et andet punkt i programmet. Det sidste punkt illustrerer hvorfor, det er klogt at lade linienumrene springe med 10. Efter at programmet var skrevet, ønskede vi at tilføje tællerdelen. Det gjorde vi ved bare at skrive linierne i slutningen af programmet, nummereret således, at de kom ind på den rigtige plads i programmet.

Så er det din tur

Det følgende program simulerer kast med to terninger. Du kan bruge det som det er, eller som en del af et større program.

5 PRINT"VIL DU PRØVE LYKKEN?" 10 PRINT"RØD TERNING = ";INT(6*RND(1))+1 20 PRINT"HVID TERNING = ";INT(6*RND(1))+1 30 PRINT"TRYK MELLEMRUMSTAST FOR NYT KAST" : PRINT 40 GETA$ : IF A$="" THEN 40 50 IF A$=CHR$(32) THEN 10

Har du lyst til at prøve lykken? Ud fra det du har lært om tilfældige tal og BASIC, kan du se om du kan følge med.

Tilfældig grafik ... CHRS og ASC funktioner

Som en sidste bemærkning til tilfældige tal og, som en introduktion til at lave grafik, kan du indtaste og køre dette lille program:

Page 52

Som du måske har opdaget, er linie 20 det centrale i dette program. En anden funktion CHR$, giver dig et tegn, baseret på et standard kodenummer fra 0 til 255. Ethvert tegn, som Commodore 64 kan skrive, er indkodet på denne måde. For at få koden for et tegn. skal du bare skrive:

PRINT ASC("X")

hvor X er det tegn, du ønsker at checke (ethvert tegn kan skrives, herunder også grafiske tegn). Resultatet vil være koden for det tegn, du skrev. Som du måske har fundet ud af, er ASC en anden funktion, som giver dig ASCII-værdien (forkortelse for American Standard Code for Information Interchange og udtales "asgi") for det tegn du skrev. Du kan nu skrive dette tegn ved at taste følgende:

PRINT CHR$(X)

Hvor X er et heltal i intervallet 0-255 incl. Hvis du skriver:

PRINT CHR$(205); CHR$(206)

vil du se de to grafiske tegn fra højre side af <N>- og <M>tasterne.

Ved at bruge formlen 205.5 + RND(1), vil computeren udtage et tilfældigt tal mellem 205.5 og 206.5. Der er lige stor chance for at computeren tager et tal over 206 som under 206. CHR$ ignorer alle decimaler, så halvdelen af gangene vil det tegn med kode 205 blive udskrevet og den anden halvdel af gangene vil tegnet med kode 206 udskrives.

Hvis du har lyst til at eksperimentere med programmet, kan du prøve at lægge et par tiendedele til eller trække et par tiendedele fra 205.5. Dette vil give et af tegnene en større chance for at blive valgt.

Page 53

KAPITEL 5

AVANCEREDE FARVE OG GRAFIK KOMMANDOER

  • Farver og grafik
  • Udskrift med farver
  • CHR$ farvekoder
  • Redigeringshjælp
  • PEEK og POKE
  • Skærmgrafik
  • Kort over skærmhukommelsen
  • Kort over farvehukommelsen
  • Flere bevægelige bolde
Page 54

Page 55
Farver og grafik

Vi har indtil nu opdaget flere avancerede programmeringsmuligheder ved Commodore 64, men en af de mest avancerede faciliteter er muligheden for at lave farver og grafik.

Vi har set et eksempel på grafik i programmerne "Den hoppende bold". Men det var kun en lille del af det, man kan lave med computeren. Vi vil i dette kapitel introducere flere nye begreber til forklaring af grafik- og farveprogrammering og vise, hvordan man kan lave programmer med spil og bevægelser.

På grund af, at vi koncentrerede os mest om computerens programmeringsmuligheder, har alt det vi har gengivet på skærmen indtil nu kun været i een farve (lyseblå tekst på en mørkeblå baggrund med en lyseblå kant).

I dette kapitel vil vi lære at føje farver til programmerne og kontrollere alle de grafiske symboler på tastaturet.

Udskrift med farver

Som du opdagede, da du prøvede opstillingen af farver i kapitel 1, kan man ændre tekstfarverne ved at holde <CTRL> tasten og en af farvetasterne nede. Dette virker udmærket som kommando, men hvordan skal man gøre, hvis man ønsker at indføje farveskift i programmerne ?

Da vi viste programmet med den hoppende bold, så du hvordan tastaturkommandoer som flytning af markøren blev indføjet i en PRINT-instruktion. På lignende måde kan tekstfarver indføjes i programmet.

Der er 16 forskellige farver at arbejde med. Ved brug af <CTRL> og taltasterne, er følgende farver tilgængelige:

1 2 3 4 5 6 7 8
Sort Hvid Rød Cyan Violet Grøn Blå Gul
1 (turkis)

Hvis du holder <C=> tasten nede sammen med en af tal tasterne er yderligere disse otte farver tilgængelige:

1 2 3 4 5 6 7 8 Orange Brun Lyserød Grål Grå2 Lysegrøn Lyseblå Grå3

Skriv NEW og prøv at eksperimentere med det følgende. Hold <CTRL> tasten nede samtidig med, at der trykkes på <l> tasten. Tryk derefter på <R> tasten uden at holde <CTRL> tasten nede. Mens du igen holde <CTRL> tasten nede trykker du på <2> tasten. Slip <CTRL> tasten og skriv <E>. Fortsæt med at ændre farverne for hvert bogstav og skriv ordet REGNBUER på følgende måde:

Page 56

Lige som markørkontrollen vises som et grafisk tegn inden for anførselstegnene i en PRINT-instruktion gengives også farvekontrollerne som grafiske tegn.

I det foregående eksempel, blev der gengivet et pundtegn da du holdt <CTRL> nede samtidig med at du trykkede <3>. <CTRL> <7> blev gengivet som pil til venstre. Alle farvekontrollerne vil gengive deres tilhørende grafiske kode, når de bliver brugt på denne måde. Nedenstående tabel viser, den grafiske gengivelse af de farvekontroller man kan lave.

TASTATU R FARVE GENGIVELSE TASTATUR FARVE GENGIVELSE
<1> SORT <1> ORANGE []
<2> HVID E <2> BRUN
<3> RØD <3> LYSERØD ×
<4> CYAN <4> GRÅ l
<5> VIOLET 1 <5> GRÅ 2 53
<6> GRØN 0 <6> LYSEGRØN
<7> BLÅ <7> LYSEBLÅ
<8> GUL п <8> GRÅ 3

Selv om PRINT-instruktionerne ser lidt mærkelige ud på skærmen vil kun teksten blive gengivet når man kører programmet - og det vil automatisk ændre farver afhængig af de farvekontroller, der er indlagt i PRINT-instruktionerne.

Prøv selv at lave nogle eksempler. Bland nogle farvekoder med en tekst i en PRINT-instruktion. Husk at du også kan bruge det andet sæt tekstfarver ved at bruge Commodore tasten <C=>.

Efter at have kørt et program med farveskift eller skift til negative tegn, vil det "READY", der kommer frem efter at et sådant program er kørt, og alt det der herefter skrives. blive skrevet i den farve eller nå den måde der sidst er blevet brugt af programmet. For at komme tilbage til normal gengivelse trykkes på <RUN/STOP> og <RESTORE>.

CHR$ farvekoder

Se lidt på tillæg F og kom derefter tilbage hertil.

Ved at se hen over listen af CHR$ koder i Tillæg F, har du måske lagt mærke til, at hver farve (lige som de fleste andre tastaturkontroller, f.eks. flytning af markøren) har hver sin kode. Disse koder kan skrives direkte, hvilket giver det samme resultat som at bruge <CTRL> og de pågældende taster i en PRINT-instruktion. Prøv f.eks. dette:

Page 57

NEW 10 PRINT CHR#(147): REM (CLR/HOME) 20 PRINT CHR#(30);" (HP#+20+ ÆNDFEP 003A MIG RUN CHR#(30) ÆNDRER 063A MIG

Teksten skulle nu være grøn. I de fleste tilfælde vil det være meget lettere at bruge CHR$ funktionen, specielt hvis man ønsker at eksperimentere med farveskift. Det følgende er en anden måde at få en regnbue frem på. Eftersom der er en række linier, der ligner hinanden meget (se linierne 60-130 i det færdige program), vil det spare en mængde skrivning at benytte redigerings tasterne. Skriv linie 10 til og med 60 normalt. Det skulle se således ud :

10 FEN 1600(100 of FHEVESTELEES 20 FFINT CHRISTERS : FEN ECLETHOME 30 FFINT CHRISTERS : FEN NCCATIV 40 LEETHT SAFAULTIONS : NOTION : FEN NCCATIV 50 DM (L. 607060: DELSO, MOTION : 10, 120, 120 50 FMINT CHRISTERS : FORDA : 10

Redigeringshjælp

Brug markørop tasten til at få markøren op i linie 60. Skriv så 7 oven i 6-tallet i 60. Brug derefter markør-højre for at komme hen til 5-tallet i CHR$ parentesen. Tryk på <SHIFT> og <INST/DEL> for at lave et mellemrum, skriv nu "28" og tryk på <RETURN>, det er lige meget hvor på linien markøren befinder sig. Skærmen skulle nu vise :

10 PEM TECHING HE FARMESTRIEER 20 PEINT CHRID(47): REM =CLR.HOME 30 PEINT CHRID(18): "; : REM NEGA(IV 40 CL=INT(8+PHD(1))+1 50 ON CL GOTOGO.70.80.90.100.110.120.130 70 PEINT CHRID(23): : GOTO 30

Linie 60 er der stadig. LIST programmet og se. Lav de resterende linier ved – fortsat – at lave linienumrene og CHR$ koden om, indtil de sidst linier er indtastede. Som et sidste check LISTes det færdige program, så du kan se om alle linierne er tastet rigtigt ind, før du kører det. Se program på næste side.

Page 58

10 REM TEGNING AF FARVESTRIBER 20 PRINT CHR$(147) : REM =<CLR/HOME> 30 PRINT CHR$(18);" "; : REM NEGATIV 40 CL=INT(8*RND(1))+1 50 ON CL GOTO 60,70,80,90,100,110,120,130 60 PRINT CHR$(5); : GOTO30 70 PRINT CHR$(28); : GOTO30 80 PRINT CHR$(28); : GOTO30 90 PRINT CHR$(31); : GOTO30 100 PRINT CHR$(31); : GOTO30 100 PRINT CHR$(156); : GOTO30 120 PRINT CHR$(158); : GOTO30 130 PRINT CHR$(159); : GOTO30

Her kommer en kort forklaring på, hvad det egentligt er, der Du har måske forstået hele farvelinieprogrammet undtagen instruktionen i linie 30. Men lad os se hvad programmet i virkeligheden laver. Linie 20 skriver CHRS koden for <CLR/HOME>. Linie 30 slår over i den negative skrift og skriver 4 blanke som viser sig at være en bred streg, eftersom tegnene er negative. I begyndelsen af programmet vil linien blive lyseblå som den normale tekstfarve. Linie 40 bruger tilfældighedsfunktionen for at vælge en tilfældig farve mellem 1 og 8. Linie 50 indeholde en variation af IF.....THEN-instruktionen, som kaldes ON.....GOTO. ON.....GOTO får programmet til at vælge et linjenummer fra en liste og gå til den pågældende linie. Hvis variablen (i dette tilfælde CL) har værdien 1. vælges det første linienummer (her 60). Hvis værdien er 2. vælges det andet linjenummer fra listen os v. Linie 60 - 130 laver det tilfældige farvevalg om til CHRS koden for farven og returnerer programmet til linie 30. der udskriver en streg i denne farve, hvorefter det hele starter Se om du kan finde ud af at frembringe 16 tilfældige tal. udvid ON.....GOTO til at kunne behandle dem alle, og tilføj de resterende CHRS koder for at gengive de resterende 8 farver

PEEK og POKE

Disse kommandoer sætter os i stand til at "se os omkring" i maskinen og "lægge noget direkte ned" i den.

Ligesom man kan tænke sig at variabler er kasser inde i maskinen, hvori man kan lægge information, kan man også forestille sig nogle specielle kasser inde i computeren, som repræsenterer specielle hukommelsesfunktioner.

Commodore 64 ser i disse hukommelseskasser (fremover kaldet adresser) hvilke farver skærmens baggrund og kant skal have, hvilke tegn, der skal skrives på skærmen, og hvor disse skal skrives og en hel masse andre ting.

Page 59

Ved at give POKE forskellige værdier i de forskellige adresser, kan vi ændre farver tegne og flytte figurer og endda lave musik. Man kan i øvrigt lægge værdier (0-255) ned i enhver RAM adresse. Her er nogle eksempler :

C FARVE

Vi har ovenfor set fire sådanne adresser. Heraf bestemmer de to farven på skriften og baggrunden. Prøv at skrive dette:

POKE 53281.7 <RETURN>

Baggrundsfarven vil nu ændre sig til gul, fordi vi placerede værdien 7 (for gul) på den position, som bestemmer skærmens baggrundsfarve. Prøv at lægge forskellige værdier (POKE) ind på denne adresse og se resultatet. Man kan lægge værdier mellem 0 og 255 ind, men kun værdier mellem 0 og 15 vil give resultat. De forskellige farver ved POKE har følgende værdier:

0 Sort 8 Orange
1 Hvid 9 Brun
2 Rød 10 Lyse rød
3 Cyan (turkis) 11 Grå l
4 Violet 12 Grå 2
5 Grøn 13 Lyse grøn
6 Blå 14 Lyse blå
7 Gul 15 Grå 3

Prøv at finde en måde, hvorpå de forskellige baggrunds- og kantfarver kan kombineres. Det følgende program kan være til hjælp.

10 FOR BH=0 TO 15 20 FOR B0=0 TO 15 20 FOR 53230.EA 40 FOIE 53230.EA 40 FOIE 63231 FO 50 FOR 341 TO 2000 : (E)37 60 NENT B0 : 26 (7 EM

To simple løkker er her lagt inden i hinanden så POKE funktionen kan bruges til at ændre baggrund- og kantfarve. Forsinkelsesløkken i linie 50 er kun med for, at vi kan nå at følge med.

Page 60

Hvis du har lyst til mere, kan du prøve at skrive:

? PEEK (53280) AND 15

Vi skulle her få værdien 15. Dette er den sidste værdi kantfarven har haft, fordi både baggrunds- og kantfarven er grå (værdien 15), når programmet er slut. Med AND elimineres alle værdier med undtagelse af tallene fra 1-15. Man vil normalt forvente at finde den værdi, som sidst var lagt ind ved hjælp af POKE. Generelt lader PEEK funktionen dig undersøge den angivne adresse (BYTE) og se hvilken værdi denne adresse indeholder. Kan du komme i tanke om en linie, som tilføjet dette program vil udskrive værdien af baggrunds og kant farve efterhånden, som programmet kører Hvad med denne her:

25 PRINT CHR$(147), "KANTFARVE=", PEEK(53280) AND 15, "BAGGRUNDSFARVE=". 26 PRINT PEEK(53281) AND 15

Skærmarafik

Indtil nu har computeren udskrevet informationer i normal rækkefølge, det ene tegn efter det andet, startende det sted hvor markøren stod (undtagen når du bad om en ny linie eller brugte "," i forbindelse med PRINT).

Hvis du vil udskrive data på et bestemt sted på skærmen, kan du starte fra et kendt sted på skærmen og så PRINTe det rigtige antal makørkontroller så udskriften får det ønskede for-

Dette fylder meget i programmet og tager lang tid at lave. Men ligesom der er specielle områder i Commodore 64's hukommelse, som bestemmer farver, er der også områder som kontrollerer hver position på skærmen.

Kort over skærmhukommelsen

I og med at computerens skærm kan indeholde 1000 tegn (25 linier med hver 40 tegn), er der også 1000 adresser ved siden af hinanden, der bestemmer, hvad der kommer op på skærmen og hvor. Man kan tænke sig skærmbilledet udformet som en rist. hvor hver firkant styres af en adresse.

Eftersom hver adresse (BYTE) kan indeholde en værdi fra 0 til 255 er der 256 mulige værdier for hver firkants indhold. Disse værdier repræsenterer de forskellige tegn, som Commodore 64 kan gengive (se tillæg E). Ved at lægge en tegnværdi i de adresser, der kontrollerer skærmen (POKE), gengives tegnene de tilsvarende steder på skærmen.

Page 61

Skærm hukommelsen i Commodore 64 begynder normalt i adresse 1024 og slutter i 2023. Adresse 1024 er det øverste venstre hjørne på skærmen. 1025 er det næste tegn på første linie o.s.v. hele vejen ned. 1063 er positionen yderst til højre i første linie. Den næste adresse, 1064. er positionen vderst til venstre i anden linie.

Lad os nu sige, at du kontrollerer en bold, der hopper hen over skærmen. Bolden er midt på skærmen. linie 12 (den 13. 1inie), kolonne 20. Placeringen på skærmen kan udtrykkes ved formlen:

POINT=1024+X+40*Y

hvor X (startende ved 0 gående til 39) er kolonnen og Y (startende ved 0 gående til 24) er linien. I dette tilfælde er boldens placering:

1024+20+480 eller i adresse 1524.

Slet nu skærmbilledet ved samtidig at trykke på <SHIFT> og <CLR/HOME> tasterne og skriv herefter:

POKE 1524,81 tean kode for Q position

Page 62

Kort over farvehukommelsen

En bold er kommet til syne midt på skærmen. Vi har indsat et tegn direkte på skærmens midte uden at bruge PRINT funktionen. Bolden der kom til syne er hvid. Det er imidlertid muligt at ændre farven på en figur på skærmen ved at bruge et andet område i hukommelsen. Skriv:

POKE 55796 , 2
`
farve kode
positi ion

Boldens farve ændres nu til rød. For hver position på Commodore 64's skærm er der to adresser, der skal ændres, een til tegn kode og een til farve kode. Farvehukommelsesskemaet begynder i adresse 55296 (øverste venstre hjørne) og fortsætter de næste 1000 positioner. De samme farvekoder fra 0 til 15, som vi brugte til at ændre kant og baggrundsfarver med, kan her bruges til direkte at ændre tegnfarverne.

Page 63

Formlen, vi brugte til at udregne skærmpositionen, kan ændres til at udregne positionsnummeret til farvekoderne. Den nye formel er følgende:

FARVE POSITION = 55296+X+40*Y

Flere bevægelige bolde

Her er et revideret "hoppende bold" program, som skriver direkte på skærmen med POKE, i stedet for at bruge markørkontroller i PRINT-instruktionen. Som du vil kunne se, når du har kørt programmet, er dette meget mere flexibelt end det tidligere program.

5 REM FLERE HOPPENDE BOLDE
10 PRINT"3"
20 POKE 53280,7 : POKE 53281,13
30 X=1 : Y=1
40 DX=1 : DY=1
50 POKE 1024+X+40*Y,81
60 FOR T=1 TO 10 : NEXT T
70 POKE 1024+X+40*Y,32
80 X=X+DX
90 IF X=0 OR X=39 THEN DX=-DX
100 Y=Y+DY
110 IF Y=0 OR Y=24 THEN DY=-DY
120 GOTO 50

Linie 10 sletter skærmen og linie 20 laver baggrunden lyse-Variablerne X og Y i linie 30 holder sig ajour med boldens aktuelle linie og kolonne position. Variablerne DX og DY i linie 40 er boldens retning lodret og vandret. Lægges 1 til X værdien vil bolden bevæge sig til høire. Lægges -1 til (der trækkes 1 fra) vil bolden bevæge sig til venstre. Lægges 1 til Y vil bolden bevæge sig ned i næste linie og lægges -1 til. vil bolden bevæge sig op ad. Linie 50 gengiver bolden på skærmen i den aktuelle boldposition. Linie 60 er den kendte forsinkelsesløkke der lader bolden stå så længe på skærmen, at vi kan nå at se den. Linie 70 sletter bolden ved at indsætte en blank (kode 32) på skærmen, der hvor bolden var. Linie 80 lægger retnings-variablen DX til X. Linie 90 undersøger om bolden har nået en af skærmens kanter. Hvis dette er tilfældet ændres boldens retning. Linie 100 og 110 gør det samme for toppen og bunden af skærmen. Linie 120 går tilbage i programmet for at få bolden gengivet og flyttet igen. Hvis koden i linie 50 ændres fra 81 til en anden tegnkode,

Page 64

kan man lave bolden om til ethvert andet tegn. Hvis enten DX eller DY ændres til at være 0, vil bolden hoppe lige ud i stedet for diagonalt. Vi kan også gøre programmet mere avanceret. Indtil nu har vi kun testet på X og Y for at se om bolden hopper udenfor skærmen. Tilføj de følgende linjer

21 FOR L=1 TO 10 25 POKE 1024+INT(RND(1)*1000),166 - CHR$ KODE 27 NEXT L 115 IF PEEK(1024+X+40*Y)=166 THEN DX=-DX : GOTO 80

Linie 21 til 27 fastlægger 10 felter tilfældigt. Her indsættes et negativt &-tegn. Linie 115 undersøger (PEEKs) om bolden er ved at hoppe ind i en af disse felter og ændrer i givet fald boldens retning.

Page 65

KAPITEL 6

SPRITE GRAFIK

  • Forord
  • Binære talsystem
  • SPRITE-figurer
  • Yderligere bemærkninger om SPRITE
Page 66

Page 67

Forord

I de tidligere kapitler har al grafik og bevægelse været lavet ved hjælp af PRINT- eller POKE-instruktioner. At lave bevægelser på denne måde er ret arbejdskrævende, idet

den ønskede figur skulle opbygges af eksisterende grafiske tegn. Der kræves en del instruktioner for at holde styr på figuren, samt at få den til at flytte sig rigtigt.

Hvis man i stedet for anvender SPRITE, også kaldet MOB (movable object block), til at frembringe figurer og bevægelse med, kan en mængde af disse problemer afhjælpes. En SPRITE er en programmerbar højopløsningsfigur, som kan laves helt efter ønske ved hjælp af BASIC-instruktioner. Figuren kan nemt flyttes rundt på skærmen, blot ved at fortælle computeren til hvilken position SPRITEN ønskes flyttet. Computeren klarer resten.

Spritene er mere virkningsfuld end som så. Farverne kan ændres. Hvis to SPRITEs møder hinanden, kan den ene få besked om at forsvinde ind bag den anden. En SPRITE kan også udvides blot ved at lave en POKE-instruktion.

Arbejdet ved at lave alle disse ting er minimalt. Dog er det nødvendigt at vide noget om hvordan COMMODORE 64 arbejder og behandler tal internt. Det er ikke så kompliceret, som det måske kan lyde. Hvis du følger eksemplerne, kan du lave SPRI-TEs, der kan gøre forbløffende ting, på kort tid.

SPRITEs kontrolleres af en seperat TV-kreds i Commodore 64. Denne TV-kreds styrer videogengivelsen. Den frembringer og holder styr på tegn og grafik, frembringer farver og flytter rundt på figurer.

TV-kredsen har 47 forskellige registre (BYTEs med specielle opgaver), som fungerer som hukommelsesadresser. Hver af disse adresser (BYTES) består af 8 BITS, som hver kan have værdien l eller 0 (on eller off). Vi vil senere komme mere detaljeret ind på dette. Når vi angiver en værdi, ved hjælp af POKE instruktionen, i de rigtige hukommelsesområder, kan vi bestemme dannelsen og bevægelser af sprite figurer.

Ud over de mange områder, vi bruger til billedfrembringelse, anvender vi også en del af Commodore 64's hovedlager til at gemme de informationer (data), som definerer SPRITE-grafikken. Endelig vil 8 adresser, som ligger i den sidste del af skærmhukommelsen (fra 2040 til 2047) blive brugt til at fortælle computeren, fra hvilke lagerområde den enkelte SPRITE får sine data. Skærmhukommelsen er afsat til at fylde 1 Kbyte (altså 1024 bytes fra adresse 1024 til 2047), selvom selve skærmen kun fylder de 1000 bytes (25 linier a 40 tegn). Før vi begynder på den egentlige SPRITE-programmering, vil vi gennemgå noget om binære tal.

Page 68
Side 66
Det binære talsvstem

Det er udover rammerne af denne brugervejledning at gå i detalier om hvordan computeren behandler tal. Vi vil dog give dig et grundlag for forståelse af processen og sætte dig i gang med mere avancerede bevægelser. Men inden vi begynder på dette, er vi nød til at definere nogle få termer :

BIT Dette er den mindste informationsmængde, som computeren kan gemme. Tænk på en bit som en kontakt, der enten kan være "on" (tændt) eller "off" (slukket). Når en bit er on, har den værdien 1. og når den er off har den værdien 0.

BYTE

Dette defineres som en serie på 8 BITS. Eftersom en BYTE består af 8 BITs. er det største tal der kan stå i en BYTE 255. Med andre ord, man kan have alle BITs off og BYTEn vil se således ud:

128 64 32 16 8 4 2 1 Hvis BIT er on adde-
0 0 0 0 0 0 0 0 Alle BITs off = 0

og dens værdi er 0. Hvis alle BITS er on ser det således ud:

128 64 32 16 8 4 2 1 Hvis BIT er on adde-
1 1 1 1 1 1 1 1 Alle BITs on = 255
7 6 5 4 3 2 1 0 BIT nr.

Alle bits on giver en værdi på 128+64+32+16+8+4+2+1=255. Så er der selvfølgelig alle mulighederne ind imellem, hvor nogle BITs er on og andre off.

REGISTER

Defineres som en blok af bytes, der hænger sammen. I i dette tilfælde er hvert register dog kun een byte lang. En serie af registre udgør et registerkort (register map). Registre kontrollerer forskellige funktioner. Register 21 - Fremkomstregisteret får en SPRITE til at komme frem på skærmen. Udvid X registeret gør SPRITEN længere og udvid Y registeret gør SPRITEn højere. Et register er en byte der udfører et specielt fast defineret job.

Page 69
128 64 32 16 8 4 2 1 Decimalværdi
ved BIT on.
0 0 0 0 0 0 0 1 210 = 1
0 0 0 0 0 0 1 0 211 = 2
0 0 0 0 0 1 0 0 212 = 4
0 0 0 0 1 0 0 0 213 = 8
0 0 0 1 0 0 0 0 214 = 16
0 0 1 0 0 0 0 0 215 = 32
0 1 0 0 0 0 0 0 216 = 64
1 0 0 0 0 0 0 0 217 =128

OMREGNING FRA BINÆRE TIL DECIMALE TAL

Ved at bruge kombinationer af alle 8 bits, kan man opnå enhver decimal værdi mellem 0 og 255. Begynder du nu at forstå, hvorfor de tegn eller farveværdier, vi lægger ind i hukommelsen ved hjælp af POKE funktionen, skal være mellem 0 og 255 ? Hver adresse kun er 1 byte lang.

Hvis alle felter (bits) indeholder et 1-tal er bytens værdi lig med 255, hvis alle bytens bits er lig 0 er værdien også 0. "00000011" er lig 3 o.s.v. Dette danner grundlag for at lave data, som gengiver, ændrer og flytter på SPRITE-figurer på skærmen. Hvis f.eks. nedenstående byte repræsenterer en del af en figur (0 er en blank og 1 er et farvet område):

2↑7 216 215 2 * 4 213 2+2 2 1 210
1 1 1 1 1 1 1 1
128 + 64 + 32 + 16 + 8 + 4 + 2 · + 1 = 255

skal du skrive værdien 255 ind i den pågældende adresse ved hjælp af en POKE.

TIP:

For at spare dig for problemer med at omregne binære tal til decimale tal, har vi udarbejdet følgende program, som vil gøre arbejdet for dig. Det er en god ide, hvis du indtaster programmet og gemmer det til senere brug.

5 REM BINÆR TIL DECIMAL KONVERTER 10 PRINT:INPUT"INDTAST 8-BIT BINÆRT TAL: ";A$ 12 IFLEN(A$)<>8THENPRINT:PRINT"KUN 8 BIT !":GOTOIO 15 TL=0:C=0 20 FORX=8T01STEP-1:C=C+1 30 TL=TL+VAL(MID$(A$,C,1))*2↑(X-1) 40 NEXTX 50 PRINT:PRINTA$;" BINÆRT = ";TL;" DECIMALT" 60 GOTO10

Programmet tager dit binære tal, som er indtastet som en streng, og ser på hvert tegn i rækken, fra venstre til højre (MID$ funktionen). Variablen C angiver hvilket tegn programmet er kommet til, når det går i-

Page 70

gennem løkken.

VAL-funktionen i linie 30 returnerer decimalværdien af tallet. Eftersom vi arbejder med nummeriske tegn, er værdien den samme som tegnet. Hvis det første tegn på A$ er tallet 1, er værdien også 1. Den sidste del af linie 30 ganger værdien af det pågældende tegn med den rigtige potens af 2. Da den første værdi er på 2↑7 plads, i eksemplet ville TL først blive lig med 1 gange 128 eller 128. Hvis bitten var 0, ville værdien for denne "plads" også være lig med 0. Denne proces gentages for alle 8 tegn, samtidig med at TL opsummerer den løbende decimalværdi på det binære tal.

Sprite figurer

Lad os nu komme i gang med at lave noget SPRITE-grafik. En SPRITE-figur er 24 felter bred og 21 felter høj. Op til 8 forskellige SPRITE-figurer kan kontrolleres på een gang. SPRITE-figurer gengives på en speciel højopløselig måde, som ændrer skærmen til en bredde af 320 felter og en højde af 200 felter. Sprites kan endog bevæges over et endnu større område på ialt 512 x 256 positioner. Heraf er dog kun de først nævnte (320 x 200) synlige, hvilket giver mulighed for, at bevæge SPRITEs pænt ind på, og ud fra skærmen.

Ønsker du for eksempel at lave en ballon og have den til at svæve rundt på skærmen, kan ballonen laves indenfor et skærmområde, der er 24 felter bredt og 21 felter højt (se næste side).

Næste skridt er at omforme grafikdesignet til data, som computeren kan bruge. Du skal her bruge et stykke kvadreret papir. Papiret inddeles, så der er 24 felter i bredden og 21 felter i højden. Hen over øverste linie skrives:

128,64,32,16,8,4,2,1 tre gange (som vist på figuren) eet tal over hver af de 24 felter. Herefter nummereres linierne ned langs venstre side fra 1 - 21.

Udfyld nu skemaet med en eller anden figur eller brug den ballon, vi har lavet. Det er lettest først at tegne omridset og så senere udfylde figuren. Forestil dig nu, at alle felterne, som du har udfyldt, er "on" felter og skriv et l-tal i hvert udfyldt felt. I de felter, der ikke er udfyldte, "off" felter, skrives et 0.

Hvis vi starter i den øverste række, skal de 3 gange 8 felter omformes til 3 tal i en datalinie. For hver 8 felter (BITs) skal der udregnes een værdi, som lægges i en DATA-linie.

Page 71

Hvis vi begynder fra venstre i øverste række, er de første 8 felter blanke, altså 0, så værdien af disse felter er 0. Den midterste serie af felter ser sådan ud (igen er 1 lig med et udfyldt felt og 0 lig med et tomt felt):

128 64 32 16 8 4 2 1 decimale værdi.
0 1 1 1 1 1 1 1 bit on/off.
t î 1 1 1 ٢ 1 1
0 + 64 + 32 + 16 + 8 + 4 + 2 - + 1 = 127

Man adderer altså værdierne af de felter, hvori der står et l-tal, og lader resultatet indgå i DATA-linien. Den tredie del af den første linie er også blank, så den er lig 0. Derfor ser den første datalinie sådan ud:

DATA 0,127,0

De tre dele, som udgør anden linie udregnes således:

Serie 1: 0 1 = 1

Page 72

SPRITE-grafik

KAPITEL 6

Serie 2: 1

128
1
1
+ 64
+ 1

32
+ 1
f
16
+ 1
1
8
+ 1

4
+ 1

2
+ 1

1
= 255
Serie 3: 1
1
128
1
1
+ 64
0 0 0 0 0 0 = 192

DATA for linie 2 vil altså se sådan ud:

DATA 1,255,192

På samme måde laves der tre tal for hver af de resterende linier. Prøv nu at udregne de resterende linier på samme måde. Nu har du dataene til din figur, hvordan kan de så bruges ? Prøv at skrive følgende program og se hvad der sker:

1 REM FLYVENDE BALLON
5 PRINT"""
10 V=53248
11 POKE V+21,4
12 POKE 2042,13 : POKE 2043,13
20 FOR N=0 TO 62 : READ Q : POKE 832+N,Q : NEXT N
30 FOR X=1 TO 200
40 POKE V+4,X
50 POKE V+5,X
60 NEXT X
70 GOTO 30
200 DATA 0,127,0,1,255,192,3,255,224,3,231,224
210 DATA 7,217,240,7,223,240,7,217,240,3,231,224
220 DATA 3,255,224,3,255,224,2,55,160,1,127,64
230 DATA 1,62,64,0,156,128,0,156,128,0,73,0,0,73,0
240 DATA 0,62,0,0,62,0,0,62,0,0,28,0

(Hvis du vil vide mere om REM og DATA, så se kapitel 8).

Hvis du har indtastet det rigtigt, flyver ballonen nu roligt hen over skærmen.

For at forstå hvad der skete, må du først vide hvilke adresser (registre), der kontrollerer de funktioner, du bruger. Register 0's adresse er 53248 (første byte i TV-kredsen, uddybes senere), register 1's adresse er 53248+1=53249 o.s.v.

Her følger lidt om hvordan man udpeger de områder i hukommelsen, hvor man har lagt sine SPRITE-data.

Page 73
adresse 704 76,6 ξ 832 896 960 1022
SPRITE 2 1 ξ ζ SPI RITE 0 SPRIT TE 3 SPRITE 1 1
bruges : ikke> 1 byt e 1 byte l by te l byte
8 ^ _ ^
L
indhold 13 15 11 14
adresse 2040 2041 2042 2043 2044 2045 2046 2047

-Her ligger oplysninger om SPRITE 0's beliggenhed. Tallet skal ganges med 64 for at komme frem til den decimale adresse. 13 i adresse 2040 betyder således den 13. blok i hukommelsen, hvor en bloks størrelse er 64 bytes. Adresserne 2040-2047 kaldes for SPRITE-pointere. Da hver SPRITE optager 63 bytes, bliver der een byte i overskud.

Blokkene 13,14,15 er kassettebufferen, som kan anvendes, når kassettebåndoptageren ikke er i brug i programmet. Adresserne 704-766 (blok 11) bruges ikke til andre formål, og kan altid anvendes til SPRITES.

I illustrationen overfor ligger SPRITE 0's data i blok 13 (adresse 13#64), SPRITE 1's i 15, SPRITE 2's i 11, og SPRITE 3's i 14.

Da det højeste tal man kan POKE ind i en adresse er 255, kan man lægge spritedata i blokkene til og med blok 255 (=adresserne 16320-16383). Man skal imidlertid vide hvad man gør, når man lægger sprite-data i BASIC-området, idet programmer og data kan ligge i disse adresser. Man må i givet fald lave beskyttende foranstaltninger.

Registrenes funktioner er følgende :

Register Beskrivelse

0 SPRITE 0's X koordinat
1 SPRITE 0's Y koordinat
2 til 15 Som 0 og 1 for SPRITE 1-7
16 Mest signifikante bit (MSB) - X koordinat
21 SPRITE fremkomst: 1=on, 0=off
23 Udvidelse af SPRITE i "Y" retningen
29 Udvidelse af SPRITE i "X" retningen
39-46 SPRITE-farve 0-7

Vi resumerer :

En spritefigur ( = en spriteblok på 63 bytes (3 x 21 bytes = 63 bytes)) kan i princippet ligge på en hvilken som helst plads i hukommelsen. Der er dog nogle ting, man skal tage hensyn til :

  • En spriteblok skal starte på en 64 bytes grænse. hvilket vil sige, at 64 skal gå op i spriteblokkens begyndelsesadresse.
  • Adressen må ikke overstige 16320, idet det største tal, der kan angives i een byte, er 255 (heksadecimalt FF), hvilket giver en adresse på 255*64.
  • SPRITens beliggenhed i hukommelsen specificeres i en af adresserne 2040-2047, afhængigt af hvilken SPRITE (0-7) det drejer sig om.
Page 74

Side 72

Spritepointerne, som viser hvor spriteblokkene ligger, er på 8 BYTEs, der ligger efter skærmhukommelsen (se forord).

2040 41 42 43 44 45 46 2047
4 ٨ 1 1 Ŷ 1 ۲
SPRITE 0 1 2 3 4 5 6 7

Lad os nu lave en oversigt over, hvordan man får ting til at bevæge sig, og endelig hvordan man skriver et program. Der er kun nogle få ting, som man skal kunne for at tegne en figur og få den til at bevæge sig.

  • POKE de aktuelle SPRITE-data ind i hukommelsen (READ fra DATA sætninger og POKE 63 gange)
  • Sætte SPRITE-pointeren (ADRESSE 2040-2047, som vist ovenfor) til at pege på det sted hvor SPRITE-dataene ligger.
  • Få de rigtige SPRITEs til at komme frem på skærmen, ved at POKE ind i register 21, som "tænder" for SPRITEne.
  • Opdatere X og Y koordinaterne, ved hjælp af en løkke, så SPRITE bevæges.
  • 5. Hvis du har lyst, kan du desuden udvide figuren, ændre farver, eller udføre en række specialfunktioner. Brug område 29 (register) til at udvide din figur i X- og 23 i Y-retningen.
  • Vi skal lige gentage et par ting :

Linie 10: V=53248

V sættes til første adresse i computerens videochip (TVkreds). På denne måde øger vi blot V med det ønskede registernummer. Vi behøver således ikke at huske på de store tal, som angiver adressen i computerens videochip. Registernumrene så vi i registeroversigten ovenfor.

Linie 20 POKE V+21,4

Ved at placere et 4-tal i register 21 (registeret for sprite forekomster) kommer SPRITE 2 til syne. Se følgende figur:

SPRITES

Decin nalvæi dien f or S SPRITE :
128 64 32 16 8 4 2 1 I
7 6 5 4 3 2 1 0 SPRITE nummer
REG. 21 0 0 0 0 0 1 0 0 = 4
indsæt et l-tal for de SF RITES du øns sker.

Hvert SPRITEniveau er repræsenteret i register 21 i SPRITEhukommelsen og 4 er lig med SPRITE 2. Hvis du skulle bruge SPRITE 3, skulle du skrive 1 i SPRITE 3, hvilket giver vær-

Page 75

dien 8. Hvis både SPRITE 2 og 3 skulle bruges, måtte du skrive 1 i dem begge (4 og 8). For at gøre dette lægges de to tal sammen: 4 + 8, ligesom du gjorde med dataene til din tegning. For at "tænde" for både SPRITE 2 og 3, skal man altså skrive V+21,12.

Linie 12:
POKE 2042,13

instruerer computeren om at hente data til SPRITE 2 (adresse 2042) fra den 13'de hukommelsesblok. Du ved fra da du lavede din SPRITE, at den optager 63 bytes i hukommelsen. Hver serie på numrene 128,64,32,16,8,4,2,1, du skrev oven over ternene, da du konstruerede din SPRITE, er lig med 1 byte i computerens hukommelse. Derfor optager de 21 linier, med hver 3 bytes, 63 bytes i hukommelsen.

20 FOR N=0 to 62 : READ Q:POKE 832+N.Q:NEXT N

Denne linie lægger SPRITE-dataene på plads. De 63 databytes, som repræsenterer den SPRITE (tegning) du lavede, indlæses (READ) af løkken og POKEs ind i den 13. datablok, der begynder i adresse 832 (13*64).

30 FOR X = 0 TO 200
40 POKE V+4,X Sprite 2's X koordi nat
50 POKE V+5,X Sprite 2's Y koordi nat

X-koordinaten repræsenterer en figurs vandrette flytning tværs over skærmen og y koordinaten en flytning i lodret retning over skærmen. Da X-værdien i linie 30 øges med l fra 0 til 200, vil figuren flytte sig over skærmen (nedad og til højre). Værdierne ændres hurtigt nok af computeren til at bevægelsen synes jævn og ikke rykvis, som man måske skulle tro. Hvis du vil vide mere, så se på registerskemaet i TILLÆG O.

Hver SPRITE-figur har sine egne X- og Y- registre, som opdateres hver for sig, alt efter i hvilken retning den enkelte SPRITE skal bevæge sig.

Linie 70 starter forfra, efter at figuren er passeret hen over skærmen. Det resterende i programmet er dataene for ballonen.

Prøv nu at tilføje den følgende linie:

25 POKE V+23,4 : POKE V+29,4: REM UDVID

Kør nu programmet igen. Ballonen er blevet dobbelt så stor som før. Ved at POKE 4 (igen for at indikere SPRITE 2) ind i register 23 og 29, blev SPRITE 2 (4-tallet giver SPRITE 2, som da vi brugte register 21) udvidet i X og Y retningen. Det er vigtigt at bide mærke i, at SPRITE's begyndelsespunkt er i det øverste venstre hjørne af figuren. Når man udvider figuren i en eller anden retning, vil begyndelsespunket forblive, hvor det er.

Page 76

For at gøre det lidt mere spændende, kan du lave følgende ændringer i programmet:

11 POKE V+21,12 12 POKE 2042,13 : POKE 2043,13 30 FOR X = 1 to 190 45 POKE V+6,X 55 POKE V+7,190-X

En anden figur (nummer 3) er kommet til syne, ved at POKE 12 ind i det hukommelsesområde. der styrer fremkomsten af SPRITE (V+21). De 12 starter SPRITE 3 og 2 (sætter BITtene 2 og 3 on 00001100 = 12). Linie 45 og 55 flytter rundt med SPRITE 3 ved, at der POKEs værdier ind i SPRITE 3's X og Y koordinat-adresser (V+6 og V+7). Hvis du vil have, at der skal ske endnu mere på skærmen, kan du prøve at tilføje følgende:

11 POKE V+21,28 12 POKE 2042,13 : POKE 2043,13 : POKE 2044,13 25 POKE V+23,12 : POKE V+29,12 48 POKE V+8,X 58 POKE V+9,100

Linie 11 fik denne gang en tredje figur (nr.4) til at dukke op, ved at POKE 28 ind i register 21, som styrer fremkomsten af SPRITES. Nu er SPRITE nr.2-4 tændte (BITtene 2-4 er on 00011100 = 28).

Linie 12 viser, at SPRITE 4 får data fra det samme spriteblok (altså laver samme figur) som de andre SPRITEs ved at POKE 2044.13 (13 spriteblok = adresse 13x64 = 832).

I linie 25 udvides SPRITE 2 og 3 ved,at der POKEs 12 (sprite 2 og 3) ind i de registre, der udvider i X- og Y-retningen (V+29 og V+23).

Linie 48 flytter SPRITE 3 langs med x-aksen og linie 58 flytter den halvvejs ned over skærmen. SPRITE 3 flytter sig altså vandret, fordi Y-værdien er konstant, og X går fra 0 til 200.

Yderligere bemærkninger om sprite

Nu da du har eksperimenteret med SPRITE, har vi nogle få ord til afslutning. For det første kan man ændre SPRITEnes farver til enhver af de 16 standardfarvekoder (0-15) som vi brugte til at ændre skriftfarver med. Disse kan findes i kapitel 5 og i tillæg G.

Hvis man for eksempel vil ændre sprite l's farve til lysegrøn, skrives: POKE V+40,13 (du skal være sikker på at V er lig med 53248).

Når du har kørt SPRITE-programmerne, må du have lagt mærke til, at figuren aldrig flyttede sig helt ud til den højre side af skærmen. Det er fordi skærmen er 320 felter bred og X retningens register kun kan indeholde værdier op til 255. Hvordan kan man så få en figur til at flytte sig hele vejen

Page 77

hen over skærmen ?

Der er et register, som vi endnu ikke har nævnt. Register 16 kontrollerer det, man kalder den mest betydende bit (most significant bit) i X-registeret. Dette sætter dig i stand til at flytte SPRITE vandret til et felt imellem 256 og 320. MSB virker på denne måde: Efter at SPRITEn er flyttet i X retningen til felt nr.255, lægges en værdi ind i register 16 på det sted, som repræsenterer den SPRITE, du ønsker at flytte. Register 16 kan opfattes som en niende BIT for X-kooridnaten i de 8 SPRITEs. I register 16 er der plads til en "9." bit for hver af de 8 SPRI-TES' X-koordinater. Hvis man for eksempel vil flytte SPRITE 2 til vandrette felter imellem 256 og 320, POKEs værdien for SPRITE 2, ~(som er 4) ind i register 16:

POKE V+16,4

Begynd nu at flytte via det normale register for X retningen for sprite 2. Eftersom vi kun flytter yderliger 64 felter, skal værdien i det "normale" X-register nu ligge imellem 0 og 63. Hele denne fremgangsmåde kan bedst illustreres ved en ny version af det oprindelige SPRITE 1 program:

5 PRINT""" 10 V=53248 11 POKE V+21,4 12 POKE 2042,13 20 FOR N=0 TO 62 : READ 0 : POKE 832+N,0 : NEXT 25 POKE V+5,100 30 FOR X=1 TO 255 40 POKE V+4,X 50 NEXT 60 POKE V+4,X 50 NEXT 60 POKE V+16,4 70 FOR X=0 TO 63 80 POKE V+4,X 90 NEXT 100 POKE V+16,0 110 GOTO 30 200 DATA 0,127,0,1,255,192,3,255,224,3,231,224 210 DATA 7,217,240,7,223,240,7,217,240,3,231,224 220 DATA 3,255,224,3,255,224,2,255,160,1,127,64 230 DATA 1,62,64,0,156,128,0,73,0,0,73,0 240 DATA 0,62,0,0,62,0,0,028,0

Linie 60 sætter den mest betydelige bit for sprite 2 og linie 70 sørger for opdatering af X, idet den, sammen med linie 80 og 90) flytter SPRITE 2 det sidste stykke hen over skærmen. Linie 100 er vigtig, fordi den "slukker" for den mest betydende bit, således at figuren kan begynde at bevæge sig fra den venstre side af skærmen igen.

Page 78

Page 79

KAPITEL 7

LYD

  • Lyd for menigmand
  • Strukturen i et lydprogram
  • Hvordan laver man musik
  • Vigtige lydindstillinger
  • Vi spiller en melodi
  • Lydeffekter
  • Prøver på lydeffekter
Page 80

Page 81
Lyd for menigmand

De fleste programmører bruger computerlyd til to ting: At lave musik og frembringe lydeffekter. Før vi begynder at programmere lyd, tager vi et hurtigt kik på, hvordan et typisk lydprogram er strukturereret eller opbygget og giver dig et kort lydprogram, som du kan eksperimentere med.

Strukturen i et lydprogram

Først er der fem indstillinger, som du skal vide besked med for at kunne lave lyd på din Commodore 64: Styrken, pulsform, attack/decay (hvor hurtigt tonen skal stige til og falde fra maksimumstyrke) sustain/release (vedligeholdelse og tonens udklingning) og højfrekvens/lavfrekvens (mest betydende og mindst betydende byte i frekvensregistret, som altså er 2 bytes langt). De første fire indstillinger sættes ofte kun i begyndelsen af programmet. Både høj- og lavfrekvensen må indstilles/sættes for hver node/tone, som man vil spille. Attack/decay og sustain/release kaldes fremover, når de omtales under et, for ADSR. En tone kan illustreres således :

Et lyd/musikprogram kan opbygges således :

ET LILLE LYDEKSEMPEL.

Før du starter, må du vælge en stemme. Der er tre stemmer, som skal have hver sine indstillingsdata for pulsform o.s.v. Man kan spille 1,2 eller 3 stemmer sammen, men vores lille program bruger kun stemme nr. 1. Tast dette program ind linie for linie .... vær sikker på at trykke <RETURN> efter hver linie.

1. Fuld styrke :

10 POKE 54296,15

Indstil attack og decay, som bestemmer, hvor hurtigt en tone skal forstærkes til og dæmpes fra sit maksimale styrkeniveau (0 til 255):

20 POKE 54277,190

Indstil sustain og release for at holde tonen ved en bestemt lydstyrke og derefter afbryde den : 30 POKE 54278,248

Page 82

Find den node/tone, som du ønsker at spille, i tabellen over nodeværdier i tillæg M (der kræves to frekvensværdier for hver tone).

40 POKE 54273.17: POKE 54272.37

5. Indstil pulsformen på een af de fire muligheder (17, 33, 65 eller 129):

50 POKE 54276.17

6. Indlæg en forsinkelsesløkke til bestemmelse af tonens længde. (En fjerdedelsnode er ca. 250, men det kan variere, eftersom programmets længde kan have indvirkning på timingen).

60 FOR T = 1 TO 250; NEXT

7. Afbryd tonen :

70 POKE 54276,16

For at høre den tone, som du lige har fremstillet, skal du taste RUN og trykke på <RETURN>. For at se eller ændre i programmet, skal du taste LIST og trykke på <RETURN>.

Hvordan laver man musik

Man behøver ikke at være musiker for at kunne spille på Commodore 64! Alt hvad man behøver er at kunne nogle få tal, som fortæller computeren, hvor høj lyden skal være (lydstyrken), hvilke noder der skal spilles, hvor længe de skal spilles o.s.v. Men først er der et lille program, der giver en demonstration af computerens utallige musikale muligheder, selvom kun en af de tre stemmer, der er til rådighed, bruges i programmet. Skriv ordet NEW og tryk <RETURN> så det foregående program slettes, indtast derefter dette program og kør det ved at taste RUN og trykke <RETURN>.

5 REM MUSIKSKALA programnavn
7 FOR L=54272 TO 54296 : nulstiller lydregistre
: POKE L,O : NEXT
10 POKE 54296,15 fuld styrke
20 POKE 54277,7 : POKE 54278,133 attack/decay, sust./rele.
50 READ A læser tal i 110
60 READ B læser tal i 110
70 IF B=-1 THEN END programslut når B=-l
Page 83

80 POKE 54273 A : POKE 54272 B POKEr første DATA værdi (indlæst i 110) ind som højfrekvens og anden DAind som lavfrekvens. T næste programgennemløb indlæses næste DATA-værdier o.s.v. 54273=højfrekvens og 54272=lavfrekvens for stemme 1. 85 POKE 54276.17 sæt pulsform og tonestart 90 FOR T=1 TO 250 : NEXT T : tonens varighed POKE 54276,32 tonen afbrydes 95 FOR T=1 TO 50 : NEXT T 100 GOTO 20 start næste gennemløb 100 DATA 17,37,19,63,21,154,22,227 Nodeværdier (TILLÆG M) 120 DATA 25,177,28,214,32,94,34,175 hvert talpar giver en nodeværdi. f.eks. giver 17 og 37 et "C" i 4. oktav 900 DATA -1,-1 Data -l afslutter program

Skal tonerne komme fra et "cembalo", ændres linierne 85 og 90 til følgende:

85 POKE 54276,33 90 FOR T=1 TO 250 : NEXT T : POKE 54276,32

Kør programmet igen. (For at ændre linien trykkes på <RUN/ STOP> for at standse programmet, så tastes LIST og trykkes <RETURN>, hvorefter den programlinie, der ønskes ændret, tastes igen og der trykkes <RETURN>. Den nye linie vil automatisk erstatte den gamle). Vi ændrede pulsformen fra en trekantet puls til en savtakpuls. Ved at ændre pulsformen kan man lave forskellige lydeffekter. Valg af forskellige pulsformer er kun een af de muligheder, man har for at lave forskellige musiklyde og lydeffekter. Man kan også ændre attack/ decay for hver enkelt tone. F.eks. kan cembalo-lyden ændres til en banjo-lyd ved at rette linierne 20 og 30 :

20 POKE 54277,3 30 POKE 54278.0 intet sustain

Som du lige har set, kan man få Commodore 64 til at lyde som forskellige musikinstrumenter. Vi vil nu se nærmere på, hvordan de forskellige lydindstillinger virker.

Vigtige lydindstillinger

1. STYRKEN For overhovedet at få en lyd frem, og for at indstille styrken på højeste niveau, tastes: POKE 54296,15. Styrkeindstillingerne går fra 0 til 15, men du vil formentligt bruge 15 det meste af tiden. (Husk at skrue op for lyden på TV'et). For at afbryde lyden, tastes: POKE 54296 0

Page 84

Man skal kun indstille styrken een gang. Dette vil indstille alle tre stemmer. (Hvis man ændrer styrken under afviklingen af en melodi eller lydeffekt, kan det give interessante resultater).

2. ADSR OG PULSINDSTILLING

Vi har allerede set, hvordan vi ved at ændre pulsformen, kan ændre lyden fra xylofon til cembalo. Hver stemme har sin egen pulsformsindstillig, som gør, at man kan definere en af fire forskellige pulsforme for hver stemme: Trekantet, savtak, firkant og støj. Kontrollen aktiverer også ADSR-funktionen, det vil vi vende tilbage til om et øjeblik. En pulsindstilling kunne for eksempel se således ud:

POKE 54276,17

hvor det første tal (54276) repræsenterer kontrolindstillingen for stemme 1, og det andet tal (17) repræsenterer en trekantet pulsform. Indstillingerne for de forskellige stemmer og pulsformer er vist i nedenstående tabel.

ODDI OIGIDIGO THUTHONK
KONTROL- TREKANT SAVTAK FIRKANT STØJ
INDSTILLING
STEMME 1 54276 17 33 65 129
STEMME 2 54283 17 33 65 129
STEMME 3 54290 17 33 65 129

ADSR OG PULSFORMSINDSTILLINGER

٠

Selv om kontrolindstillingerne er forskellige for hver stemme, er pulsformsindstillingen den samme for hver instrumentlyd. For at se hvordan dette virker, kan vi se på linie 20 i musikskalaprogrammet.

I dette program laver vi kontrolindstillingen for stemme nr. 1, lige efter at vi har indstillet styrken i linie 10. Ved at POKE 54276,17 vælges en trekantpuls i linie 85. Senere ændrede vi pulsformindstillingen fra 17 til 33 for at få en savtakpuls, hvilket gav skalaen en cembalo lyd. Pulsindstillingen foregår på samme måde som indstillingen af styrken, bortset fra, at hver stemme har sin egen indstilling og, at der i stedet for styrkeniveau defineres pulsform. Vi vil nu se på et andet aspekt ved lydfrembringelsen - ADSR faciliteten.

3. ATTACK/DECAY (stigetid/faldtid)

Som vi nævnte i det foregående definerer ADSR-kontrolindstillingen ikke kun pulsformen, den aktiverer også Commodore 64's ADSR-funktion. Vi vil begynde med at se på indstillingen af attack/decay. Det følgende skema viser de forskellige attacog decay-niveauer for hver stemme. Hvis ikke du er bekendt med begreberne attack og decay, kan du tænke på attack, som den tid indenfor hvilken en node/tone stiger til sin maksimale styrke. Decay er den tid, med hvilken tonen falder fra sit højeste styrkeniveau ned til holde-niveauet.

Den følgende tabel viser attack/decay-indstillingen for hver stemme. Læg mærke til, at man kan kombinere indstillingerne for attack og decay ved at lægge talværdierne sammen og angi-

Page 85

ATTACK/DECAY INDSTILLING

POKE < atta ack - > > < decay
adresse høj middel lav lavest høj middel lav lavest
stemme T 54277 128 64 32 16 8 4 2 1
stemme 2 54284 128 64 32 16 8 4 2 1
stemme 3 54291 128 64 32 16 8 4 2 1

Hvis et attackniveau er sat uden decay, vil decay automatisk være nul og vice versa. Hvis man f.eks. taster POKE 54277,64, sætter man et middel attackniveau uden decay for stemme 1. Hvis man taster POKE 54277,66, sættes et middel attack og et lavt decayniveau (fordi 66=64+2, hvilket sætter begge indstillinger). Man kan også lægge flere attack- eller decayværdier sammen. Man kan for eksempel lægge en lav attack (32) sammen med en middel attack for at få en kombineret attack på 96, derefter kan man lægge en middel decay på 4 til, hvilket giver POKE 54277,100.

Følgende program vil bedre kunne illustrere denne effekt. Tast ordet NEW og tryk på <RETURN>, indtast derefter dette program og kør det:

5 FOR L=54272 TO 54296 : Nulstiller lydkredsen
POKE L,0 : NEXT
10 PRINT "TRYK PÅ EN TASTE" Meddelelse på skærmen
20 POKE 54296,15 Fuld styrke
30 POKE 54277,64 Attack/decay
40 POKE 54273,17 : POKE 54272,37 Lægger en node i stemme l
60 GET K$ : IF K$="" THEN 60 Checker tastaturet
70 POKE 54276,17 : Start tone/pulsform-
FOR T=1 TO 200 : NEXT T varighed
80 POKE 54276,16 : Tonestop. Start release
FOR T=1 TO 50 : NEXT T -
90 GOTO 20 Begynde forfra

Her bruger vi stemme nr.l til at lave een tone ad gangen, med en middel attack og en decay på 0. Dette sker i linie 40. Ved at POKE værdien 64 ind i indstillingen attack/decay aktiveres en middel attack. Resultatet lyder som om en eller anden kaster en bold i en olietønde. Nu skal vi have lidt mere sjov - tryk på <RUN/STOP> tasten og tast LIST <RETURN>. Indtast nu følgende linie og tryk <RETURN> (den nye linie vil automatisk erstatte den forhenværende linie 30):

30 POKE 54277,190

Tast RUN og tryk <RETURN> så du kan høre, hvordan det lyder. Det vi her gjorde, er at kombinere flere forskellige attack/

Page 86

decayværdier. Indstillingerne er : høj attack (128) + lav attack (32) + laveste attack (16) + høj decay (8) + lav decay (4) + laveste decay (2) = 190. Dette resulterer i en lyd som fra en obo eller lignende. Hvis du kan lide at eksperimentere, kan du prøve at ændre pulsformen og tallene for attack og decay i det skalaeksemplet for at høre hvordan en obo lyder. Altså kan man, ved at ændre attack/decay lave forskellige lydeffekter.

4. SUSTAIN/RELEASE (den styrke hvorved tonen holdes/den tid hvormed tonen udklinger)

Lige som attack/decay, bliver indstillingen af sustain/release af en tone opnået v.h.a. ADSR/PULSFORM KONTROL. Sustain/ release gør, at man kan forlænge (vedligeholde) en del af en bestemt lyd, lige som med pedalen på et klaver. Enhver tone eller lyd kan holdes ved en bestemt styrke (kan altså regulere styrkerne på de tre stemmer individuelt). Styrken kan antage 16 værdier idet de 4 sustainværdier kan kombineres på 16 måder (4 bits). Man kan også få en tone til at vedblive i det uendelige, ved at indsætte 240 som sustain uden release. Sustain/release-funktionen kan bruges sammen med en FOR ... NEXT løkke hvorved man kan bestemme, hvor lang tid en tone skal holdes, før den atter afbrydes. Det følgende skema viser de tal, som skal POKEs for at opnå de forskellige sustain/release niveauer.

SUSTAIN/RELEASE INDSTILLING
POKE < sus tain > <> release>
adresse høj middel lav lavest høj middel lav lavest
stemme 1 54278 128 64 32 16 8 4 2 1
stemme 2 54285 128 64 32 16 8 4 2 1
stemme 3 54292 128 64 32 16 8 4 2 1

Hvis man f.eks. bruger stemme 1, kan man sætte et højt sustainniveau ved at taste: POKE 54278,128 eller man kan kombinere et højt sustainniveau med et lavt decayniveau ved at addere 128 + 2 og så POKE 54278, 30. Her er det samme lille prøveprogram, som vi brugte i eksemplet med attack/decay i det foregående afsnit her er dog også sustain/release-funktionen taget med. Bemærk forandringen i lyden.

5 FOR L=54272 TO 54296 : Nulstiller lydkreds
POKE L,0 : NEXT
L 0 POKE 54296,15 Fuld styrke
20 POKE 54277,64 Attack/decay
30 POKE 54278,128 Sustain/release indstilling
40 POKE 54273,17 : POKE 54272,37 Lægger en node i stemme l
50 PRINT "TRYK PÅ EN TASTE" Meddelelse på skærmen
50 GET K$ : IF K$="" THEN 60 Checker om en taste er rørt
70 POKE 54276,17 : Pulsform/start tone
FOR T=1 TO 200 : NEXT T
30 POKE 54276,16 : Starter release/afbryder
FOR T=1 TO 50 : NEXT T tone
90 GOTO 20 Begynde forfra
Page 87

I linie 30 giver vi computeren besked om at holde tonen (128 fra skemaet øverst på siden), hvorefter tonen afsluttes. Tonestyrken (sustain-delen) kan varieres ved at ændre tallet 128 i linie 30. Hele sustaintiden kan varieres ved at ændre tallet 200 i linie 70.

5. STEMME- OG TONEVALG

Hver eneste node kræver to POKE kommandoer en for høj-frekvens og en for lav-frekvens. Med høj- og lavfrekvens menes i denne vejledning h.h.v. mest (høj) og mindst (lav) betydende byte i toneregistrene. Nodetabellen i TILLÆG M viser, hvilke POKEværdier der skal til for at spille enhver ønskelig node fra Commodore 64's otte oktaver. Høj- og lavfrekvens POKEkommandoer er forskellige for hver af de stemmer man bruger. Dette gør at man kan programmere alle tre stemmer. Man kan lave musik med tre stemmer eller eksotiske lydeffekter. I skemaet nedenfor er vist høj- og lavfrekvens (HøJ og LAV i skemaet) POKE-kommandoer for hver stemme, det indeholder også nodeværdier for den midterste (femte) oktav.

S FEMME POKE NODI ER - FEM' re oi KTAV
FREKVENS С C# D D# E F F# G G# A A# В С C#
T HØJ 54273 34 36 38 40 43 45 48 51 54 57 61 64 68 72
1 LAV 54272 75 85 126 200 52 198 127 97 111 172 126 188 149 169
2 HØJ 54280 34 36 38 40 43 45 48 51 54 57 61 64 68 72
2 LAV 54279 75 85 126 200 52 198 127 97 111 172 126 188 149 169
3 HØJ 54287 34 36 38 40 43 45 48 51 54 57 61 64 68 72
3 LAV 54286 75 85 126 200 52 198 127 97 111 172 126 188 149 169

Som man kan se, er der to forskellige indstillinger for hver stemme, en højfrekvens indstilling og en lavfrekvens indstilling. For at spille en node, må man POKE een værdi ind i højfrekvensregisteret og POKE en værdi ind i lavfrekvensregisteret. Her er den indstilling der spiller ét C fra den femte oktav (stemme 1).

POKE 54273.34: POKE 54272.75 Den samme node i stemme 2 er: POKE 54280,34: POKE 54279,75 Det ser sådan ud, når det bruges i et program: 5 FOR L=54272 TO 54296 : Nulstiller lydkredsen POKE L,0 : NEXT 10 V=54296 : W=54276 : A=54277 : Pokeadresser gemmes i vari-S=54278 : H=54273 : L=54272 abler 20 POKE V,15 : POKE A,190 : Volumen, attack/decay POKE S 89 sustain/release 30 POKE H. 34 : POKE L. 75 Høj-, lav-frekvens POKE L.75 : NEXT T 40 POKE W,33 : FOR T=1 TO 200 : NEXT 50 POKE W.32 Afbrvd tone og puls

Page 88
Vi spiller en melodi

Følgende program spiller, en melodi (ved brug af stemme 1). Der er to vigtige ting i programmet: Først skal det bemærkes, hvordan vi forkorter alle de lange pokeadresser i linierne 5 og 6. Derefter kan vi bruge bogstavet W for pulsform i stedet for nummeret 54276.

For det andet, måden hvorpå vi bruger data. Dette program er lavet sådan at man taster 3 tal for hver node nemlig højfrekvensværdien. lavfrekvensværdien og den varighed hvormed en node vil blive spillet.

I denne melodi bruger vi en varighedsværdi på 125 for en ottendedels node, 250 for en fjerdedels node, 375 for en punkteret fjerdedelsnode, 500 for en halvnode og 1000 for en helnode. Disse værdier kan forhøjes eller nedsættes alt afhængig af tempoet i melodien eller din egen musiksmag.

For at se hvordan en melodi indtastes, kan du se på linie 100. Vi indskrev 34 og 75 som vores høj- og lavfrekvensværdi ved noden C (se de foregående tabel) og derefter nummer 250 for en kvartnode. Så den første node i vores melodi er kvartnoden C. Den næste er også en kvartnode men denne gang er noden et E. Sådan fortsætter vi indtil melodien er færdig. Man kan indtaste næsten enhver melodi på denne måde, altså ved at tilføje så mange datalinie, som man har brug for. Man kan fortsætte med noderne og varighederne fra en linie til den næste, bare man husker at begynde med ordet DATA. Bemærk at en programlinie højst kan være 80 tegn,altså lig med to hele skærmlinier. DATA-1.-1.-1 skal være den sidste linie i dit program. Denne linie afslutter melodien.

Tast ordet NEW for at slette dit foregående program, og indtast følgende program, hvorefter du taster RUN for at høre melodien "MICHAEL ROW THE BOAT ASHORE" :

  • 2 FORL=54272T054296:POKEL,0:NEXT 5 V=54296:W=54276:R=54277:HF=54273:LF=54272
  • 6 S=54278:PH=54275:PL=54274
  • 10 POKEV,15:POKEA,190:POKEPH,15:POKEPL,15:POKES.89
  • 20 READ H:IFH=-1THENEND
  • 30 READ L
  • 40 READD
  • 60 POKEHE.H:POKELE.L:POKEW.65
  • 85 FORT=1T050:NEXT
  • 100 DATA 34.75,250,42,52,250,51,97,375,43,52,125,51,97
  • 100 DATA 250.57.172.250
  • 110 DATA51.97.500.0.0.125.43.52.250.51.97.250.57.172
  • 115 DATA1000 51 97 500
  • 120 DATA-1.-1.-1
Lvdeffekter

I modsætning til musik er lydeffekter ofte bundet til et specielt programforløb, som for eksempel en eksplosion fra et rumskib, når det rammer en barriere i et rumspil. eller en advarende summer i et erhvervsprogram, som fortæller brugeren at han/hun er ved at slette sin diskette ved en fejltagelse.

Page 89

Man har mange muligheder hvis man ønsker at frembringe forskellige lydeffekter. Her er ll programmeringsideer, som måske kan hjælpe dig til at eksperimentere med lydeffekter:

Andring af styrken, mens en tone lyder (r.eks. ekkoerrekt) Hurtige skift mellem 2 noder frembringer "skælvende" lyde.

3. Pulsform. Prøv forskellige indstillinger til hver stemme.

  • Kndring af attack/decay : tiden det tager en tone at nå sin maksimale styrke, og den tid det tager tonen igen at falde fra denne maksimale styrke.
  • 5. Sustain/release : forlænger eller afkorter lydeffekter.
  • 6. Flerstemmige effekter : at spille flere stemmer samtidig. Hvor hver stemme kontrolleres individuelt, hvor een stemme skal spille kortere eller længere end en anden eller tjene som et ekko eller svar på en anden node.
  • 7. Ændres noderne på skalaen, eller ændres oktaver bruges værdierne i tabellen i TILLÆG M.
  • 8. Brug firkantpulsen og de andre pulsformer for at skabe forskellige effekter.
  • 9. Brug "støj" effekten til at lave baggrundslyde eller til at frembringe eksplosioner, pistolskud eller fodtrin. De samme noder som frembringer musik, kan også via støjeffekten frembringe forskellige typer baggrundsstøj.
  • 10 Kombiner mange høj- og lavfrekvenser over forskellige oktaver.
  • 11 Asymmetriske pulser : prøv de ekstra POKE indstillinger i tillæg P (pulsbredde).

Prøver på lydeffekter

De følgende programmer kan tilføjes næsten ethvert BASIC-program. De er medtaget for at give dig nogle programmeringsideer og for at demostrere Commodore 64's lydeffektsniveau. Bemærk den programforkortelse vi bruger i linie 10. Vi kan indlægge disse lange besværlige værdier i numeriske variabler (mnemoniske forkortelser = forkortelser der er lette at huske). Linie 10 betyder, at sådanne variabler kan bruges i stedet for de lange tal. Her er V = styrke (volumen), P = pulsform, A = attack/decay, H = højfrekvens (stemme nr 1) og L = lavfrekvens (stemme nr 1). Når vi bruger disse bogstaver i stedet for tal i vores program, bliver det kortere og indtastningen hurtigere samtidig med, at vi gør lydindstillingerne lettere at huske og bruge.

DUKKEGRÅD 10 V=54296 : W=54276 : A=54277 : H=54273 : L=54272 20 POKE V,15 : POKE W,65 : POKE A,15 30 FOR X=200 TO 5 STEP -2 : POKE H,40 : POKE L,X : NEXT X 40 FOR X=150 TO 5 STEP -2 : POKE H,40 : POKE L,X : NEXT X 50 POKE W,0

SKUD. STEMME 1, STØJ, NEDDÆMPNING AF LYDSTYRKEN 10 V=54296 : W=54276 : A=54277 : H=54273 : L=54272 20 FOR X=15 TO 0 STEP-1 : POKE V,X : POKE P,129 : POKE A,15 : POKE H,40 : POKE L,200 : NEXT X 30 POKE W,0 : POKE A,0

Page 90

Page 91

KAPITEL 8

OMGANG MED DATA, FOR VIDEREKOMNE

  • READ og DATA
  • Gennemsnit
  • Indekserede variabler
  • Dimensionering
  • Simulering af terningkast
  • Todimensionale tabeller
Page 92

Page 93
READ og DATA

KAPITEL 8

Vi har set, hvordan man direkte i et program kan tildele en variabel en værdi (A-2) og hvordan man tildeler værdier under en programkørsel gennem INPUT-instruktionen. Det forekommer imidiertid ofte, at hverken den ene eller den anden af disse metoder vil passe rigtigt til den opgave, man prøver at løse. specielt når det er en opgave, der kræver megen information. Prøv dette korte program:


   

I linie 10 læser (READ) computeren en værdi fra DATA-instruktionen og tildeler X denne værdi. Hver gang programmet kommer igennem løkken læses den næste værdi i DATA-instruktionen, tildeles X og udskrives på skærmen. En pointer inde i computeren holder styr på hvilken værdi, der skal bruges næste dang:

40 DATA 1, 34, 10.5,16, 324.56 Pointer (pegepind)

Når alle værdierne er brugt og computeren udfører løkken igen, hvor den skal bruge en ny DATA-værdi, fremkommer fejlen OUT OF DATA ERROR på skærmen, fordi der ikke er flere værdier at læse. Det er vigtigt at følge formatet for DATA-instruktionen præ-40 DATA 1. 34. 10.5. 16. 234.56

komma adskiller dette er ikke et komma men decimalpunkt

DATA-instruktionen kan indeholde hele tal (15679), decimaltal (234.56) eller tal udtrykt i eksponential notation (7.98E+4 = 7.98#1044 = 79800) men man kan ikke have aritmetiske udtryk

Page 94

i en DATA-linie. Følgende er ikke tilladt :

40 DATA A, 23/56, 2*5

Man kan imidlertid bruge en strengvariabel i en READ-instruktion og så placere strenginformationen i DATA linien. Det følgende er korrekt :

NEU

10 FOR X=1 TO 3 20 READ A≸ 30 PRINT "A≸ ER NU : ";A≸ 40 NEXT X 50 DATA DETTE,ER,SJOVT RUN

A≢ ER NU : DETTE A≢ ER NU : ER A≢ ER NU : SJOVT READY

Læg mærke til at READ-instruktionen denne gang er placeret inden i en FOR ... NEXT løkke. Denne løkke bliver udført et bestemt antal gange, og værdierne læses dermed ind fra DATAlinien. I mange tilfælde er antallet af værdier i en DATA-linie for-

skelligt fra gang til gang. For at undgå at skulle tælle værdierne kan man lave et "flag" som sidste værdi i DATA-instruktionen. Dette skal være en værdi, som aldrig kan blive aktuel i dit program, f.eks. et negativt tal eller et meget stort eller meget lille tal. Når denne værdi læses, vil programmet hoppe til den næste del af programmet.

Man kan genbruge sin DATA senere i programmet ved at RESTORE (restore = nulstille) datapointeren til begyndelses af datalisten. Tilføj følgende linie til det foregående program:

50 GOTO 10

Du vil igen få OUT OF DATA fejlen, idet pointeren, når programmet hopper tilbage til linie 10 for at læse dataene igen, vil vise, at alle data er brugt. Tilføj nu yderligere:

45 RESTORE

og kør programmet igen. Data-pointeren peger nu på det sted, som den pegede på, da vi startede, og dataene kan indlæses igen.

Page 95
Gennemsnit

Det følgende program viser, hvordan man kan bruge READ og DA-TA, til at læse et talsæt og udregne dets gennemsnitsværdi.

НЕЫ
10 T=0 : CT=0

20 READ X

30 IF X=-1 THEN 70 : REM UNDERSØG FLAG

40 CT=CT+1

50 T=T+X : REM OPDATER TOTAL

50 GOTO 10

70 PRINT "DER VAR "; CT;"TAL"

50 PRINT "OENNEMSNIT =";T

50 PRINT "GENNEMSNIT =";T./CT

100 DATA 75,80,62,91,87,93,78,-1

RUN

DER VAR 7 TAL

TOTAL = 566

GENNEMSNIT = 80.8571429

Linie 10 sætter CT, tælleren og T, totalen lig med 0. Linie 20 læser en værdi og knytter denne til X. Linie 30 ser om værdien er lig med vores flag (her et -1). Hvis den læste værdi er gyldig, bliver CT talt op med 1 og X lagt til totalen.

Når flaget er læst, hopper programmet til linie 70, som udskriver de værdier, der er læst. Linie 80 udskriver totalen og linie 90 dividerer totalen med antallet af værdier for at få gennemsnittet.

Ved at bruge et flag i slutningen af dataene, kan man placere et vilkårligt antal værdier i DATA-instruktion (som kan strække sig over flere linier), uden at bekymre sig om at tælle det antal af værdier, som man har skrevet.

En anden variation af DATA-instruktionen er tildeling af information fra den samme DATA-linie til forskellige variabler. Denne information kan endog være en blanding af strengvariabler og numeriske værdier. Vi kan gøre alt dette i det følgende program, som læser et navn, nogle points, udskriver navnet, pointene og det gennemsnitlige pointtal:

Page 96

Side 94 Databehandling for viderekomne

KAPITEL 8

Når vi kører programmet, er DATA-instruktionen opstillet i den orden, som READ-instruktionen forventer informationen: et navn (strengvariabel) og så tre værdier. Med andre ord N$ får i første gennemløb værdien "HANS". A'et i READ-udsagnet hænger sammen med 190 i DATA-instruktionen, B'et med 185 og C'et med 165. Derefter kommer TINA og hendes pointtal, JOHN og hans pointtal og POUL og hans pointtal.

Indekserede variabler

I det foregående har vi kun brugt simple BASIC-variable som A. A$ og NU til at repræsentere værdier. Dette var et bogstav fulgt af et bogstav (eller et tal) igen efterfulgt af et tegn (% eller $). Det giver mange kombinationsmuligheder og det er tvivlsomt, om du i de programmer, du indtaster, vil få brug for flere variabelnavne, end der er mulighed for at lave. Vi vil nu introducere begrebet en indekseret variabel.

A(1)

1 indeks

t variabelnavn

Dette udtales: A indekseret med 1. En indekseret variabel består af et bogstav fulgt af en betegnelse i en parentes. Læg mærke til, at der er forskel på A, Al og A(1). Kun A(1) er en indekseret variabel.

Indekserede variabler er ligesom almindelige variabler navne på områder i computerens hukommelsen. Tænk på indekserede variabler som en kommode med skuffer til at gemme information i, ligesom almindelige variabler :

A(0) A(1) A(2)

A(3)

A(4)

Hvis vi skrev:

10 A(0) = 25: A(3) = 55: A(4) = -45.3

ville hukommelsen komme til at se således ud:

SKUFFENR. SKUFFENS INDHOLD

A(0) 25
A(1) 0
A(2) 0
A(3) 55
A(4) -45.3

Denne gruppe af indekserede variabler kaldes også en tabel, en vektor eller en matriks (array). I dette tilfælde en endimentional tabel. Senere vil vi introducere flerdimensionale tabeller.

Page 97

Betegnelser i parentesen kan også være mere kompleks og indeholde variabler eller udregninger. De følgende er gyldige indekserede variabler ·

A(X) A(X+1) A(2+1) A(1#3)

Udtrukkene i parenteserne vurderes efter de regler, vi opstillede for aritmetiske operationer i kapitel 2. Nu da grundreglerne er på plads, hvordan kan vi så bruge indekserede variabler? En måde er at gemme en liste, der er indtastet med INPUT- eller læst via READ-instruktionen Vi vil nu beregne gennemsnittet fra før på en anden måde :

10 PRINT CHR≸(147) 20 INPUT "HVOR MANGE TAL :";X 90 NEXT A HVUR MHRUE THE :/ 5 INDTAST THE NR. 1 ? 125 INDTAST THE NR. 1 ? 167 INDTAST THE NR. 1 ? 187 INDTAST THE NR. 1 ? 187

Der er måske en lettere måde, hvorpå vi kunne opnå det samme, men programmet viser, hvordan indekserede variabler fungerer. Linie 20 spørger, hvor mange tal vi vil taste. Variablen X fungerer som tæller for den løkke i hvilken værdier bliver indtastet og tilknyttet variablen B.

Hver gang vi kommer igennem INPUT-løkken, bliver A talt or med 1. På den måde bliver den næste værdi tilknyttet det næste element i tabellen B. Den første gang vi kommer igennem. løkken, er A lig med 1, derfor bliver den først indtastede værdi tilknyttet B(1). Den næste gang vi kommer igennem er A lig med 2 og værdien bliver tilknyttet B(2). Sådan fortsætter det indtil alle værdierne er tastet ind.

Nu kommer imidlertid den store forskel. Når først alle værdierne er indtastet, er de gemt i tabellen, klar til brug. I det foregående eksempel havde vi en løbende total, hver gang vi kom igennem INPUT- eller READ-løkken og kunne aldrig få de

Page 98

enkelte data igen uden at læse informationen endnu en gang. I linie 70 til 90 har vi lavet en anden løkke for at lægge de forskellige elementer i tabellen sammen. Bagefter udskrives gennemsnittet. Denne del af programmet viser, at alle værdierne er gemt og er til at få fat i om nødvendigt. For at vise at de individuelle værdier er gemt hver for sig, kan du taste det følgende lige efter, at har kørt programmet:

FOR A = 1 TO 5 : ?B(A) .: NEXT A

125 167 189 167 158

Du vil få udskrevet indholdet af tabellen, altså vist dine nuværende værdier.

Dimensioner

Hvis du prøvede at taste flere end 10 tal i det foregående eksempel fik du en DIMENSION ERROR. Tabeller på op til 11 elementer (betegnelsen 0 til 10 for en en-dimensionel tabel), kan bruges uden dimensionering, ligesom almindelige variabler kan bruges overalt i et program. Tabeller med mere end 11 elementer skal "erklæres" i en DIMensionerings-instruktionen. Tilføj dette til dit program:

5 DIM B(100)

Dette fortæller computeren, at du maksimalt vil have 100 elementer i tabellen. DIM-instruktionen kan også bruges med en variabel, så den følgende linie kunne erstatte linie 5 (glem ikke at slette linie 5):

15 DIM B(X)

Dette ville dimensionere tabellen til det antal værdier, der ønskes indtastet. Pas alligevel på. En tabel der een gang er dimensioneret kan ikke omdimensioneres senere i programmet. Du kan have flere tabeller i samme program og så dimensionere dem alle i en linie således :

10 DIM C(20), D(50), E(40)

Simulering af terningkast

Efterhånden som programmer bliver mere komplekse, vil brug af indekserede variable nedbringe antallet af nødvendige programlinier og herved gøre programmet lettere at indtaste. En enkeltindekseret variabel kan bruges til at holde styr på det antal gange, man slår et bestemt slag med en terning.

Page 99
Side 97
1 REM TERNINGEKAST

10 INPUT"HVORMANGE KAST ";X

20 FORL=1TOX

30 R=INT(6*RND(1))+1

40 F(R)=F(R)+1

50 NEXTL

60 PRINT"ØJNE ","ANTAL GANGE"

70 FORC=1TO6:PRINTC.F(C):NEXT

- ···· ·

Tabellen F, kan bruges til at holde styr på hvor mange gange en bestemt side vender opad. Bliver resultatet af et kast 2, forøges F(2) med een. Ved at bruge en tabel til at holde styr på hvilke slag, der slås, har vi nu ikke behov for 5 variabler (een for hvert antal øjne) og adskillige programlinier til test af, hvilket antal øjne, der kastedes, kan spares. Ovennævnte program sparer også tid, hvilket er vigtigt, hvis der skal laves mange kast.

Linie 10 spørger, hvor mange kast du ønsker at simulere. Linie 20 etablerer den løkke, der skal til for at frembringe de tilfældige tal og opdatere den tilsvarende indekserede variabel med een efter hvert kast.

Efter at kastene er udført, udskriver linie 60 overskriften og linie 70 skriver det antal gange, hvert tal er fremkommet. En kørsel kunne tænkes at se således ud:

HVOR MANGE TERNINGEKAST : 1000
ØJNE ANTAL GANGE
1 148
2 176
3 178
4 166
5 163
6 169

Til sammenligning er den følgende programudskrift uden brug af indekserede variabler. Lad være med at taste det ind, men noter dig blot, hvor mange programlinier, der er nødvendige. På 5000 kast sparer tabeleksemplet ca. 30 sekunder.

10 INPUT"HVORMANGE KAST ";X 20 FORL=1TOX 30 R=INT(6*FND(1))+1 40 IF R=1 THENF1=F1+1:NEXT 41 IF R=2 THENF2=F2+1:NEXT 42 IF R=3 THENF3=F3+1:NEXT 43 IF R=4 THENF4=F4+1:NEXT 44 IF R=5 THENF5=F5+1:NEXT 45 IF R=6 THENF6=F6+1:NEXT 45 OF RENT"#AIME "."#NT#0 GENGE"

Page 100

70 PRINT1,F1 71 PRINT2,F2 72 PRINT3,F3 73 PRINT4,F4 74 PRINT5,F5 75 PRINT6,F6

Linieantallet er fordoblet. I større programmer er pladsbesparelsen ved brug af indekserede variabler endnu større.

Et vigtigt aspekt ved tabeller (både en- og todimensionale) er, at de sparer plads i hukommelsen, samt at der kan laves megen databehandling med en beskeden programmeringsindsats. Medens de 10 variabler : A0,A1,A2,A3,A4,A5,....A9 fylder 10 gange 7 bytes så fylder tabellen A(0),A(1),....A(8) kun 7+5 #10 bytes. Der er altså sparet 70-57 bytes. En tabel med reelle tal fylder altså 7 plus 5 gange antallet af elementer. Ved tabeller med heltal er forskellen endnu mere markant, idet de almindelige heltalsvariabler A0%,A1%,....A9% fylder 70 bytes, hvorimod A%(0),A%(1),....A%(9) fylder 7+2#10 = 27 bytes, altså 2 bytes for hvert element i tabeller plus 7.

Todimensionale tabeller

Tidligere i dette kapitel eksperimenterede vi med endimensionale tabeller. Vi forestillede os denne type af tabeller, som en gruppe af sammenhængende skuffer i en kommode inden i hukommelsen. Hvordan vil du forvente, at en todimensionel tabel ser ud ?

For det første skal todimensionale tabeller skrives sådan :

A(4,6) f f indeks f tabellens navn

Man kan forestille sig en sådan tabel, som et todimensionelt skema inde i hukommelsen (en gammeldags købmandsdisk med mange rækker små skuffer) :

0 1 2 3 4 5 6
0
1
2
3
4

Indekset kunne tænkes at repræsentere en række og en kolonne i skemaet, hvor en bestemt del af tabellen er lagret.

Loading...