********* Welcome to International Project 64! The goal of International Project 64 is to preserve non-English Commodore 64 related documents in electronic text format that might otherwise cease to exist with the rapid advancement of computer technology and declining interest in 8-bit computers on the part of the general population. If you would like to help by converting C64 related hardcopy documents to electronic texts please contact the manager of International Project 64, Peter Karlsson, at pk@abc.se. Extensive efforts were made to preserve the contents of the original document. However, certain portions, such as diagrams, program listings, and indexes may have been either altered or sacrificed due to the limitations of plain vanilla text. Diagrams may have been eliminated where ASCII-art was not feasible. Program listings may be missing display codes where substitutions were not possible. Tables of contents and indexes may have been changed from page number references to section number references. Please accept our apologies for these limitations, alterations, and possible omissions. Document names are limited to the 8.3 file convention of DOS. The first characters of the file name are an abbreviation of the original document name and the language of the etext. The version number of the etext follows next. After that a letter may appear to indicate the particular source of the document. Finally, the document is given a .TXT extension. The author(s) of the original document and members of International Project 64 make no representations about the accuracy or suitability of this material for any purpose. This etext is provided "as-is". Please refer to the warranty of the original document, if any, that may included in this etext. No other warranties, express or implied, are made to you as to the etext or any medium it may be on. Neither the author(s) nor the members of International Project 64 will assume liability for damages either from the direct or indirect use of this etext or from the distribution of or modification to this etext. Therefore if you read this document or use the information herein you do so at your own risk. ********* The International Project 64 etext of the Swedish edition of the Commodore 64 user's guide, converted to text by Peter Karlsson C64_SV1.TXT, February 1998, etext #26. Note from the etexter (in Swedish): Förlagan för denna text trycktes 1987. Errata: 5.4 skriver "skriv PEEK (53280) AND 15". Det ska naturligtvis stå PRINT framför 8.4 skriver om "DIMENSION ERROR". Det ska naturligtvis vara "BAD SUBSCRIPT ERROR". 8.5 skriver "Matrisen S, för sida", men programmet använder matrisen F. Detta kommer från den engelska manualen, som har "The array F, for FACE". BILAGA B skriver filen "DATA FILE", men läser "DATAFIL". Eftersom namnen är olika kommer det inte fungera. BILAGA E säger att POKE 53272,29 byter till stora bokstäver, och POKE 53272,31 till små/stora. Det ska vara POKE 53272,21 resp. POKE 53272,23 BILAGA L säger att felmeddelandelistan är komplett, men den saknar ändå "BREAK", "ILLEGAL DEVICE NUMBER", "MISSING FILE NAME", "OUT OF MEMORY" samt "RETURN WITHOUT GOSUB". BILAGA M, under IF...THEN, säger "falskt (>0)", vilket är fel. Rätt uppgift förekommer några rader nedanför. Under POKE påstår den att adressen är mellan 0 och 65000. Den övre gränsen ska vara 65535. BILAGA P listar 54275/54274 för pulslängd för stämma 3. Det ska vara 54289/54288. ********* Commodore 64 Användarmanual © Copyright COMMODORE AB, 1985 INNEHÅLLSFÖRTECKNING [0.] FÖRORD [1.] INSTALLATION [1.1] Uppackning och inkoppling av Commodore 64 [1.2] Installation [1.3] Anslutning av kringutrustning [1.4] Handhavande [1.5] Färgjustering [2.] ATT KOMMA IGÅNG [2.1] Tangentbordet [2.2] Åter till normalläge [2.3] Hämta och spara program [2.4] PRINT och beräkningar [2.5] Prioritetsordning vid beräkningar [2.6] Kombinerad utskrift och beräkning [3.] BÖRJA PROGRAMMERA I BASIC [3.1] Nästa steg [3.2] Redigeringstips [3.3] Variabler [3.4] IF...THEN [3.5] FOR...TO...NEXT [4.] AVANCERAD BASIC [4.1] Inledning [4.2] Enkel animering [4.3] INPUT [4.4] GET [4.5] Slumptal och andra funktioner [4.6] Gissningsspel [4.7] Ditt kast [4.8] Slumptalsgrafik [4.9] CHR$- och ASC-funktioner [5.] AVANCERADE FÄRG- OCH GRAFIKKOMANDON [5.1] Färg och grafik [5.2] PRINTa färger [5.3] Färg CHR$-koder [5.4] PEEK och POKE [5.5] Skärmgrafik [5.6] Skärmminneskarta [5.7] Färgminneskarta [5.8] Mer studsande bollar [6.] SPRITEGRAFIK [6.1] Introduktion av SPRITES [6.2] Skapa SPRITES [6.3] Mera information om SPRITES [6.4] Binär aritmetik [7.] SKAPA LJUD [7.1] Programmera utan att vara programmerare [7.2] Uppbyggnad av ljudprogram [7.3] Ljuddemoprogram [7.4] Gör musik med Commodore 64 [7.5] Viktiga ljudkontroller [7.6] ADSR och vågforminställningar [7.7] ATTACK- och DECAY-inställningar [7.8] SUSTAIN/RELEASE-inställningar [7.9] Spela ett stycke på Commodore 64 [7.10] Skapa ljudeffekter [7.11] Enkla ljudeffekter du kan prova [8.] AVANCERAD DATABEHANDLING [8.1] READ och DATA [8.2] Medelvärde [8.3] Indexerade variabler [8.4] Dimensionering [8.5] Simulerat tärningskast [8.6] Tvådimensionella fält BILAGOR [A.] Commodore 64 Tillbehör och mjukvaror [B.] Avancerad kassetthantering [C.] Commodore 64 BASIC [D.] Förkortningar av BASIC-ord [E.] Skärmkoder [F.] ASCII- och CHR$-koder [G.] SKÄRM- och FÄRGMINNESKARTOR [H.] Härledda matematiska funktioner [I.] Kontaktdon för I/O [J.] Program du kan pröva [K.] Konvertering av standard-BASIC-program till Commodore 64 BASIC [L.] Felmeddelanden [O.] SPRITE-registerkarta [P.] Commodore 64 ljudkontrollinställning [0.] FÖRORD Gratulerar till ditt val av en av världens bästa datorer, Commodore 64. Commodore är välkänt som DET VÄNLIGA DATORFÖRETAGET, och en del av därav är användarvänliga, lättlästa, lättanvända, lättbegripliga bruksanvisningar. Bruksanvisningen för Commodore 64 är gjord för att ge dig all nödvändig information för installation, bekanta dig med den och ge dig en enkel och rolig introduktion i att göra egna program. För dem som inte bryr sig om att göra egna program, har all information som behövs för att använda Commodoreprogram, andra programpaket eller spelkassetter, lagts först i denna manual. Detta betyder att du inte behöver söka genom hela boken för att komma igång. Låt oss nu se på några intressanta finesser i din Commodore 64. När det gäller grafik har du till ditt förfogande en av de mest avancerade bildkretsarna inom mikrodatorindustrin. Vi kallar det SPRITEGRAFIK och det ger dig möjlighet att forma dina egna bilder i 4 olika färger, precis som de kan se ut i spelhallarnas videospel. Men detta är inte allt, SPRITEEDITORn låter dig samtidigt animera i upp till 8 olika bildnivåer. SPRITE-editorn kommer snart att finnas tillgänlig som mjukvara. Du kan flytta dina skapelser vart du vill på skärmen, även låta en bild passera en anna antingen bakom eller framför den andra. Din Commodore 64 tillhandahåller även med automatiskt kollisionsinformation vilken instruear datorn att följa dina instruktioner när föremålen träffar varann. Din Commodore 64 har inbyggda musik- och ljudeffekter jämförbara med många välkända musiksyntetisatorer. Denna del av din dator ger dig 3 oberoende tongeneratorer, vardera med 9 oktaver. Dessutom har du tillgång till 4 olika vågformer (sågtand, triangel, variabel puls och brus), en programmerbar ADSR- (attack, decay, sustain, release)-generator, en envelopgenerator, programmerbar hög-, låg- och bandpassfilter för stämmorna och variabel resonans och volymkontroll. Om du vill lyssna med proffesionell ljudkvalite, kan utsignalen anslutas till en HIFI-anläggning. När vi nu talar om vad som kan anslutas... din dator kan byggas ut genom en mängd tillbehör efter hand som dina behov ökar. Du kan bland annat ansluta bandspelareenhet 1350 eller upp till 5 stycken 1541 flexskiveenheter. Om du redan har en 1540 kan den uppdateras för anslutning till Commodore 64. Du kan ansluta en matrisskrivare för att skriva ut dina program, brev, fakturor mm. Om du vill koppla upp dig till stordatorer och dess databaser kan detta göras med hjälp av MODEM-kassetten. Du kan även montera en svensk teckengenerator i din Commodore 64. I de programexempel som visas i boken används å, ä och ö, det är dock inte nödvändigt att montera en svensk teckengenerator för att utföra exemplen. Enda skillnaden är att de svenska tecknen saknas. Lika viktigt som tillgång till kringutrustning är det faktum att denna bruksanvisning hjälper dig att förstå hur datorer arbetar. Den talar inte om allt som finns att veta om datroer men anvisar på ett antal skrifter som behandlar vissa saker mer i detalj. Commodore önskar dig mycket glädje med din nya Commodore 64. Mycket nöje, men kom ihåg: programmering är inte något man lär sig på en dag. Ha tålamod med dig själv och gå noggrant genom bruksanvisningen. Men innan du börjar, ta de få minuter som erfordras för att fylla i och sända in garantikortet om detta inte redan är gjort. Lycka till! COMMODORE Box 8184 163 08 Spånga [1.] INSTALLATION * Uppackning och anslutning av Commodore 64 * Installation * Direkt video och audio * Uppstartning * Färgjustering [1.1] UPPACKNING OCH ANSLUTNING AV COMMODORE 64 Följande steg för steg instruktion talar om hur du ansluter Commodore 64 till din TV, Ijudsystem eller monitor och kontrollerar att allt fungerar tillfredsställande. Innan du ansluter något till din dator kontrollera innehållet i förpackningen. Den ska innehålla följande: 1. Commodore 64 2. Transformator 3. Videokabel 4. Antennomkopplarebox Om något saknas kontrollera med den butik där apparaten köpts. Låt oss först ta en titt på de olika anslutningarna på datorn och deras användning. /####\--------^--\ /#### | /#### | ____/#### | / | | ---- ---- __ /-\ | | \--/ \--/ == \_/ | \________________\___/______/____|__/ \/ / | 3 2 1 ___/###\__/##_##_##_##_##_##_##_##_##_##_##_##_##_##_##_##\__ |-------------------------------------------------------------| | | | | | | | +--------------+ /-\ /-\ +------+ +----------+ | | |==============| [=] O \_/ \_/ |======| |==========| | +-----/------------------/-----\-----\--------\---------\-----+ / / \ \ \ \ 4 5 6 7 8 9 KONTAKTER PÅ SIDAN 1. Kontakt för kabel från transformatorn. 2. STRÖMBRYTARE TILL/FRÅN (OBS transformatorn står på även om Commodore 64 inte används, drag därför ut nätkabeln till transformatorn när datorn ej används. 3. SPELKONTAKTER Vardera spelkontakten är avsedd för JOYSTICK, PADDLE eller LJUSPENNA. KONTAKTER PÅ BAKSIDAN 4. KASSETTSLITS för program eller spelkassetter. (ROM) 5. TV-ANSLUTNING. Denna kontakt levererar både bild och ljudsignal till din TV. 6. AUDIO och VIDEO uttag. Denna kontakt levererar DIREKT AUDIO vilken kan anslutas till din HlFI-anläggning och en COMPOSITE VIDEO signal till en eventuell TV-monitor. 7. SERIE I/O. Avsett för direktanslutning av skrivare eller enkelt flexskiveminne. 8. KASSETTBANDSPELARE. En bandspelare typ 1530 kan anslutas här. 9. ANVÄNDARPORT. Olika interfacekassetter såsom RS232, MODEM mm. anslutes här. [1.2] INSTALLATION Anslut datorn till TV'n så som bilden på sidan 4 [nedan] visar. 75 OHM /---#= +--+-----------------+--+ UHF-ANSLUTNING| | | /-------------\#| | +----------+ | | | |#| | /-----------#= | handic | | | | |#| | | +----------+ | | | | | | | ANTENN- | | | | | | TILL | OMKOPPLARE- | | \-------------/ | | TV-SIGNAL- # BOX +==+=================+==+ UTTAGET | /------------------------\ | |=---\ | #################### ## | | | #################### ## | | | ################## ## | | | ############## ## | | \________________________/ | | | | +---+ | | TRANSFORMATOR +---+ | 1. Anslut ena ändan av TV-kabeln till TV-signalkontakten på baksidan av din Commodore 64. Tryck den rakt in. 2. Anslut den andra ändan av kabeln till antennomkopplingsboxen. Tryck den enbart rakt in. 3. Om du har TV-antennkabel, koppla ur den från TV-apparaten. 4. Anslut din TV-antennkabel till den bipackade antennomkopplaren, i uttaget märkt ANTENN. 5. Anslut kabeln från antennomkopplaren till TV-apparatens antennuttag. 6. Ställ antennomkopplaren i läge DATOR. 7. Sätt i den runda kontakten från transformatorenheten i det runda uttaget närmast datorns nätströmbrytare. Den har ett styrspår varför den enbart passar på ett sätt. 8. Anslut transformatorns nätkontakt till vägguttaget. ___/###\__/##_##_##_##_##_##_##_##_##_##_##_##_##_##_##_##\__ |-------------------------------------------------------------| | | | | | | | +--------------+ /-\ /-\ +------+ +----------+ | | |==============| [=] O \_/ \_/ |======| |==========| | +-------------------------------------------------------------+ DATOR ^ | TILL | TV-SIGNAL- | KONTAKT | TV-BAKSIDA | +-----------------------------+ | | | /---------+-------\ TILL 75 OHM | | | | | ANTENN- | +-------------+ | | (o) INGÅNG | | TV |__/ | | /----|ANTENN DATOR| +-----------------------------+ | +-------------+ | ANTENN- | OMKOPPLARE Commodore 64 är nu korrekt ansluten. Inga ytterligare anslutningar behövs för att använda din dator tillsammans med TV. Antennomkopplaren ansluter datorn till TV'n när omkopplaren är i läge "DATOR". Med omkopplaren är i läge "TV" kan du använda TV'n som vanligt. [1.3] ANSLUTNING AV KRINGUTRUSTNING Då Commodore 64 erbjuder Ijud med Hl-FI-kvalitet kanske du önskar att återge det genom en Hl-FI-anläggning för att få bästa möjliga Ijud. Dessutom finnes ut från din dator en standard "COMPOSITE" videosignal, vilken kan anslutas till en TV-monitor. Detta ger en förbättrad bildkvalitet. Detta har gjorts möjligt genom det speciella uttaget på baksidan av Commodore 64. Den lättaste vägen att få tillgång till dessa signaler är att använda en standard 5-pin DIN audiokabel, (ingår ej i leveransen). Denna kabel kopplas direkt till datorns AUDIO/VIDEO kontakt. Två av de fyra stiften innehåller audio- och videosignalen. Om du önskar kan du tillverka din egen kabel med hjälp av tabellen i APPENDIX 1. Vanligtvis kommer audiosignalen ut genom en svart kabel. Denna kontakt kan anslutas till AUX ingången på din HlFI-anläggning eller AUDIO IN på en monitor eller annat videosystem såsom videobandspelare. Den vita eller röda kontakten levererar vanligtvis videosignalen. Denna kopplas direkt till VIDEO IN kontakten på en monitor eller video ingången på något annat videosystem (Videobandspelare). Beroende på tillverkaren av DlN-kabeln kan färgkoden på kontakterna variera. Använd tabellen i Appendix 1 för att kontrollera kabeln om inte Ijud eller bild fungerar med den föreslagna inkopplingen. __###__################################__ / \ | AUDIO/VIDEO- | | UTGÅNG | |-----------------_---_-------------------| | ========= = o | | | | ===== ========= | +-----------------------------------------+ ^ | /-\ | | | | # | | | TILL AUX- | ____________ INGÅNG | / \ / \ TILL VIDEO IN +----++------------++----+ <-#-/ \-#-> +------------+---+ | || ### ====== || | | /--------\ | O | | || === OoooO || | || || = | | ||------------|| | || || o | | || | | | || | | \________/ | | | || | | | || | +------------+---+ +----++============++----+ TV-MONITOR AUDIO-SYSTEM Om du köpt kringutrustning såsom 1541 flexskiveenhet eller 1515 skrivare kan du ansluta dem nu. Läs bruksanvisningarna för respektive enhet för korrekt inkoppling. Ett komplett system kan se ut som nedan [Bild på ett C64-system] [1.4] UPPSTARTNING 1. Slå på datorn med hjälp av strömbrytaren på sidan. Lampan på fronten tänds. 2. Justera din TV för mottagning på kanal 36. 3. Efter några sekunder visas följande på TV-skärmen. **** COMMODORE 64 BASIC V2 **** 64K RAM SYSTEM 38911 BASIC BYTES FREE READY. _ <----------- MARKÖREN VÄNTAR ATT DU SKA SKRIVA NÅGOT 4. Om din TV har manuell fininställning, justera den för bästa bild. 5. Du kanske också vill justera färgen. Då kan du utnyttja det färginställningsförfarande som beskrivs längre fram i boken. Skärmen ska vid start vara i huvudsak mörkblå med en ljusblå ram och ljusblå tecken. Om du inte får förväntat resultat, kontrollera då samtliga kablar och kontakter. Följande tabell hjälper dig att finna orsaken: FELSÖKNINGSSCHEMA ----------------------------------------------------------------------- Symtom Orsak Åtgärd ----------------------------------------------------------------------- Ingen bild (lampan Strömbrytaren i OFF Försäkra dig om att lyser ej) strömbrytaren är i läge ON Nätkabeln inte Kontrollera att ansluten nätkabeln sitter i väggkontakten Transformatorn inte Kontrollera att ansluten kontakten sitter rätt Säkringen utlöst Lämna din Commodore 64 till en auktoriserad återförsäljare för säkringsbyte Ingen bild (lampan TV'n inställd på fel Kontrollera om det lyser) fel kanal finns någon bild omkring kanal 36 Fel anslutning till Datorn ska inkopplas TV till UHF-antenn- anslutningen Sporadisk bild när Kassetten gör inte Stäng av, sätt in ROMkassett används kontakt ordentligt kassetten riktigt och starta på nytt Bild utan färg Dåligt inställd TV Justera TV'n Bild med dåliga färger Felaktigt justerade Justera färgkontroller på TV'n färgkontrollerna Bild med högt TV-volyumkontroll Justera volymkontrollen bakgrunsbrus justerad för hög Bra bild men svagt ljud TV-volym för låg Justera volymkontrollen ----------------------------------------------------------------------- TIPS: Commodore 64 är konstruerad för att användas av alla och envar. Men vi vet att datoranvändare ibland råkar ut för svårigheter. För att ge svar på dina frågor och ge dig roliga programidéer har det skrivits en hel del böcker. Det kan också vara en god idé att gå med i någon dataklubb där andra Commodore 64 ägare kan hjälpa dig att öka på din kunskap och skicklighet. MARKÖREN Den blinkande fyrkanten närmast ordet READY kallas MARKÖR eller CURSOR och indikerar den plats där det du skriver på tangentbordet kommer att skrivas på skärmen. När du skriver flyttar sig MARKÖREN ett steg till höger vartefter markörens position ersätts med det tecken du skriver. Prova att skriva på tangentbordet och se hur bokstäverna du skriver visas på TV-skärmen. [1.5] FÄRGINSTÄLLNING Det finns ett enkelt sätt att få ett färgmönster på TV-skärmen som kan användas för färgjustering. Även om du ännu inte är van vid datorn ännu, följ bara anvisningarna så får du se hur enkelt det är att använda Commodore 64. Leta först rätt på tangenten märkt . Den finns i tangentbordets vänsterkant. CTRL står för kontroll (ConTRoL), och används tillsammans med andra tangenter för att instruera datorn att utföra en speciell uppgift. [Bild på ett C64-tangentbord] När en kontrollfunktion ska användas håller man nedtryckt och trycker därefter på den andra tangenten. Prova följande: Håll -tangenten nedtryckt och tryck därefter på <9>-tangenten. Släpp därefter upp båda tangenterna. Inget påtagligt ska nu ha hänt, men om någon tangent nu trycks ned kommer skriften på skärmen att visas omvänd (reverserad). Denna skiljer sig markant från startmeddelandet eller det du skrivit tidigare. Tryck nu ned mellanslagstangenten . Vad händer? Om du gjort ovanstående korrekt ser du en ljusblått fält röra sig över skärmen och därefter flytta ned till nästa rad så länge som -tangenten är nedtryckt. **** COMMODORE 64 BASIC V2 **** 64K RAM SYSTEM 38911 BASIC BYTES FREE READY. ____________________________ __________ Håll nu nu nere under tiden du trycker ned någon annan av siffertangenterna. De har var sin färg markerad på framsidan. Allt som skrivs på skärmen från och med nu får den nya färgen. Som exempel, tryck ned och tangenten <8>. Släpp upp dessa och tryck på . Se nu på skärmen. Färgfältet ritas nu gult. På liknande sätt kan du ändra genom att hålla ned och trycka på respektive siffertangent. Ändra färgfälten några gånger och använd sedan denna bild för att justera din TV så färgerna återges riktigt. Skärmen bör se ut ungefär som på bilden: **** COMMODORE 64 BASIC V2 **** 64K RAM SYSTEM 38911 BASIC BYTES FREE READY. _________________________ <------ <3> Röd balk _______ ____________ ____ <------ <6> Grön balk __________ ______________ <------ <7> Blå balk ____________ <------ <8> Gul balk Nu är allt justerat och fungerar riktigt. De följande kapitels kommer att introducera programmeringsspråket BASIC. Du kan emellertid omgående börja använda en del av de många färdiga program som finns till Commodore 64 utan att känna till något om datorprogrammering. Dessa programpaket innehåller vanligtvis detaljerad information hur programmet ska användas. Vi föreslår emellertid att du läser vidare några kapitel i denna bok för att bli mer bekant med handhavandet av ditt nya datorsystem. [2.] ATT KOMMA IGÅNG * Tangentbordet * Åter till normalläge * LOAD- och SAVE-kommando * PRINt och beräkningar * Prioritet vid beräkningar * Kombinerad utskrift och beräkningar [2.1] TANGENTBORDET Nu när du fått allt justerat och i ordning kan du spendera lite tid på att bekanta dig med tangentbordet. Detta är ditt viktigaste hjälpmedel vid kommunikation med din Commodore 64. Du kommer att upptäcka att tangentbordet liknar det som finns på vanliga skrivmaskiner. Det finns dessutom ett antal nya tangenter som kontrollerar speciella funktioner. Det som följer är en kort beskrivning av de olika tangenterna och dess funktion. En mer detaljerad genomgång kommer längre fram i bruksanvisningen [Bild på en C64] -tangenten meddelar datorn att studera den information du skrivit på skärmen och flytta den in i datorns minne. -tangenten fungerar på samma sätt som på en vanlig skrivmaskin. Flertalet tangenter kan skriva 2 bokstäver eller symboler och två grafiska tecken. I läget "stora/små bokstäver" får du stora bokstäver när -tangenten är nedtryckt. I läget "stora bokstäver/grafik" skrivs det högra grafiska tecknet när -tangenten trycks ned. När det gäller de speciella funktionstangenterna, får man med nedtryckt den funktion som är markerad på respektive tangents framsida. REDIGERING Ingen är perfekt och Commodore 64 är noga med detaljerna. Ett antal redigeringstangenter hjälper dig rätta till skrivfel och flytta runt information på skärmen. Det finns två tangenter märkta (CuRSoR), en med pilar upp och ned, den andra med vänster/höger-pilar. Du kan använda dessa tangenter för att flytta markören upp och ned, vänster och höger. I oskiftat läge flyttar cursor-tangenterna markören nedåt och åt höger. Med nedtryckt flyttar cursor-tangenterna markören upp eller till vänster. Cursortangenterna har en speciell repeterfunktion som fortsätter markörflyttningen så länge tangenterna är nedtryckta. Om du trycker ned flyttar sig markören ett steg till vänster och skriver över (raderar) det senaste skrivna tecknet. Om markören befinner sig mitt på en linje raderas tecknet närmas till vänster om markören och tecknen till höger flyttar efter ett steg och fyller ut tomrummet. och medger att du kan lägga till tecken på en rad. Om du exempelvis upptäckt ett skrivfel i början av en raden -- kanske du glömt en del i ett namn -- kan du använda -tangenten att flytta tillbaka markören till felet och sedan använda för att skapa ett utrymme för tecknet. Skriv sedan in den saknade bokstaven. flyttar markören till skärmens övre vänstra hörn (home positionen). Om trycks ned tillsammans med raderas dessutom skärmen. återställer datorn till utgångsläget du hade innan du förändrade saker med program eller kommandon. Detta kommer att behandlas noggrannare längre fram. FUNKTIONSTANGENTERNA De fyra tangenterna till höger på tangentbordet (f1-f8), är funktionstangenter, vilka du kan programmera att utföra många olika funktioner. (ConTRoL)-tangenten används för att styra färg och andra speciella funktioner. -tangenten hålls nedtryckt tillsammans med någon annan bestämd tangent för att ge en speciell funktion. Du hade möjlighet att prova -tangenten när du ändrade teckenfärg och när du skapade en "testbild" vid färginställning av din TV. Vanligtvis avbryts ett BASIC program när tangenten trycks ned. Den signalerar till datorn att avbryta vad den håller på med. Om användes tillsammans med laddas program in från en yttre kassettstation. COMMODORE-TANGENTEN -tangenten används för olika funktioner. I första hand medger den växling mellan TEXT och GRAFIK-läge. När datorn startas är den i stora bokstäver/grafik-läge. Detta betyder att allt du skriver skrivs ut på skärmen med stora bokstäver. Som vi nämnt tidigare kommer om trycks ned samtidigt, det grafiska tecknet som syns till höger på tangent att skrivas ut. Om du nu trycker ned och -tangenten ändras skärmen till stora/små bokstäver-läget. Håller du nu ned -tangenten och trycker ned en tangent med grafisk symbol kommer den symbol som finns till vänster på tangenten att visas på skärmen. Dessutom används -tangenten för att göra en andra färgsats om 8 färger tillgänglig. Genom att hålla ned -tangenten och trycka på någon av siffertangenterna kommer all text därefter att vara i ny färg bestämd av den tangent du trycker ned. I kapitel 5 finns en lista på de färger som finns tillgängliga genom respektive tangent. [2.2] ÅTER TILL NORMALLÄGE Nu när du haft möjlighet att bekanta dig med tangentbordet låt oss gå vidare med några av Commodore 64's övriga möjligheter. Om du fortfarande har kvar färgbalkarna på skärmen, vilka vi använde vid inställningen av TV'ns färgkontroller, tryck ned och . Skärmen ska nu vara ren och markören befinna sig i övre vänstra hörnet (home position). Tryck nu samtidigt på och <7>. Detta återställer textfärgen till ljusblå. Det återstår en sak till för att komma tillbaka till normalläge. Tryck ned och <0> (noll inte bokstaven O!). Detta återställer skärmutskriften till normal. Som du minns, ändrade vi till omvänd (reverserad) skrift tidigare med och <9> för att göra färgbalkar. Dessa färgbalkar var i verkligheten reverserade blanktecken (mellanslag). Om vi hade varit i normalläge och försökt rita färgbalkarna skulle markören flyttat sig men enbart lämnat tomrum. TIPS: Nu när du har gjort återställningen till normal den svåra vägen ska vi visa ett enklare sätt. Tryck samtidigt ned: och Detta raderar skärmen och återställer datorn till utgångsläget. Om det finns ett program i datorn kommer detta att lämnas orört. Detta är bra att känna till speciellt om du sysslar mycket med programmering. Om du önskar att återställa apparaten så som om den stängts av och satts på på nytt, skriv då: SYS64759 och tryck på . Använd detta kommando med eftertanke! Det kommer att radera ut de program och variabler som vid tillfället finns i datorn. [2.3] HÄMTA OCH SPARA PROGRAM En av de viktigaste egenskaperna hos Commodore 64 är dess förmåga att hämta (LOAD) och spara (SAVE) program från och till kassettbandspelare eller diskettstation. Denna egenskap tillåter att du sparar program du skrivit för användning vid senare tillfälle. Du kan också köpa färdiga program klara att användas till din Commodore 64. Övertyga dig om att eventuell band- eller flexskiveenhet är riktigt ansluten. Se bruksanvisning som medföljer respektive enhet. LOADING (inläsning) AV FÄRDIGA PROGRAM För de av er som endast är intresserade av de färdiga program som finns tillgängliga på plugg-in kassetter, kassettband eller flexskivor. Här följer hur du ska gå tillväga: 1. PLUGG-IN KASSETTER: Till Commodore 64 finns ett stort antal program och spel lagrade i pluggfin kassetter. För att ladda in dessa program, gör följande: Starta TV'n. Kontrollera att datorn är avstängd. Den måste vara avstängd under tiden du sätter in eller tar ur en plugg-in kassett. Om inte kan kassetten förstöras! Sätt nu in plugg-in kassetten. Starta datorn. Slutligen startas programmet enligt den instruktion som medföljer programmet. 2. BANDKASSETTER: Använd 1530 kassettbandspelare och den vanliga Ijudkassetten som ingår i programpaketet. Övertyga dig om att bandet är helt återspolat till början av första sidan. Skriv därefter LOAD. Datorn svarar då: "PRESS PLAY ON TAPE" (tryck på bandspelarens PLAY-tangent). Gör nu detta. Skärmen raderas och förblir ren tills dess datorn finner början av programmet. Datorn skriver då "FOUND (PROGRAM NAMN" = funnet (programnamn). Tryck nu ned -tangenten. Detta medför att programmet läses in i datorns minne. Om du önskar avbryta inläsningen tryck på -tangenten. 3. FLEXSKIVOR/DISKETTER: När du använder flexskivor ska dessa stoppas in försiktigt, med etiketten uppåt och närmast dig. Lägg märke till ett hack i skivhöIjet, (det kan vara täckt av tape). Om du for in skivan rätt är detta hack till vänster. Stäng luckan när skivan är helt inne. Skriv nu LOAD "PROGRAM NAMN", 8 och tryck därefter på . Du hör nu diskettenheten arbeta och på skärmen står det: SEARCHING FOR PROGRAM NAME LOADING READY. _ När datorn skrivit READY och markören tänds ska du skriva RUN. Ditt program är nu klart att användas. HÄMTA PROGRAM FRÅN BAND Hämta tillbaka program från band eller skiva är lika enkelt. När det gäller band: Återspola bandet till början och skriv: LOAD "PROGRAM NAMN" Om du inte minns programnamnet skriv enbart LOAD och det första programmet datorn hittar kommer att läsas in i datorns minne. Efter du tryckt på svarar datorn med: PRESS PLAY ON TAPE När du tryckt ned PLAY-tangenten raderas skärmen och ramfärgen ändras under den tid datorn söker efter programmet. När den funnit programmet visar skärmen: FOUND PROGRAM NAMN För att verkställa inläsningen av programmet måste du trycka på -tangenten. Om du önskar avbryta inläsningen kan du trycka på När du trycker på Commodore-tangenten ändras kantfärgen under tiden programmet läses in i datorn. Efter inläsningen är avslutad återgår kantfärgen till sin vanliga färg och markören återkommer. HÄMTA PROGRAM FRÅN SKIVA Att hämta program från flexskiva görs på samma sätt. Skriv: LOAD "PROGRAM NAMN",8 Efter du tryckt på börjar flexskivan snurra och skärmen visar: SEARCHING FOR PROGRAM NAMN LOADING READY. _ OBS När du läser in ett nytt program i datorns minne raderas alla tidigare instruktioner. Övertyga dig om att det program du tidigare arbetat med är sparat innan du läser in ett nytt program. Direkt efter att programmet lästs in i datorns minne, kan det köras (RUN), listas (LIST) eller förändras för att åter sparas i ny version. SPARA PROGRAM PÅ TAPE Om du efter att ha skrivit ett program önskar spara det på band, skriv: SAVE "PROGRAM NAMN" "PROGRAM NAME" kan vara en kombination av upp till 16 tecken. Efter att du tryckt svarar nu datorn: PRESS PLAY AND RECORD ON TAPE Tryck ned både RECORD och PLAY-tangenterna på bandspelaren. Skärmen raderas och ramfärgen ändras. Efter programmet är sparat på bandet återkommer markören och indikerar att du kan börja arbeta med ett annat program eller stänga av datorn för en tid. SPARA PROGRAM PÅ FLEXSKIVA Att spara program på flexskiva är ännu enklare. Skriv: SAVE "PROGRAM NAMN",8 Siffran 8 är koden för flexskiveenheten, så du har just talat om för datorn att du önskar få programmet sparar på flexskiva. Efter att du tryckt börjar flexskivan snurra och datorn svarar med: SAVING "PROGRAM NAMN" OK READY. _ [2.4] PRINT OCH BERÄKNINGAR Nu när vi gått igenom ett antal komplicerade instruktioner som behövs för att spara de program du vill behålla, låt oss börja att göra några program du kan spara. Försök att skriva följande exakt så som det visas: PRINT "COMMODORE 64" <----- Skriv denna rad och tryck på COMMODORE 64 <------ Datorns utskrift READY. _ Om du gör ett skrivfel, använd då -tangenten för att radera tecknet närmas till vänster om markören. Du kan radera så många tecken du önskar. Låt oss nu se på vad som hände i exemplet ovan. Först instruerade (kommenderade) du datorn att skriva (PRINT) det som står innanför citationstecknen. Genom att trycka ned bad du datorn att verkställa din instruktion och Commodore 64 skrevs därefter på skärmen. När du använder PRINT-kommandot på detta sätt skrivs allt innanför citationstecknen ut exakt som du skrivit det. Om datorn svarar med: ?SYNTAX ERROR kontrollera om du gjort ett skrivfel eller glömt citationstecken. Datorn är pedantisk och förväntar sig instruktioner i exakt förutbestämd form. Men bli inte orolig, kom bara ihåg att skriva i minsta detalj så som visas i exemplen och ditt samarbete med Commodore 64 kommer att gå bra. Kom också ihåg att du kan inte skada datorn genom att skriva på den. Det bästa sättet att lära BASIC är att prova olika saker och se vad som händer. PRINT är ett av de mest användbara och kraftfulla kommandona i BASIC-språket. Med det kan du visa på skärmen nästan vad du vill inklusive grafik och svaren på beräkningar. Prova exempelvis följande. Radera först skärmen genom att trycka ned och och skriv (siffran 1 inte bokstaven I): PRINT 12 + 12 <----- Skriv denna rad och tryck 24 <------ Datorn skrev svaret READY. _ Nu har du upptäckt att datorn är en räknemaskin i dess grundläggande form. Resultatet "24" beräknades och skrevs ut automatiskt. Du kan också utföra subtraktion, multiplikation, division, exponentiering och avancerad matematiska funktioner såsom beräkning av kvadratrot mm. Du är inte begränsad till en enkel beräkning på en enda rad. Mer om detta längre fram. Lägg märke till att PRINT-instruktionen uppförde sig annorlunda nu än i det tidigare exemplet. I detta fallet visades ett värde eller resultat istället för exakt det meddelande du skrivit in beroende på att citationstecken nu var utelämnade. ADDITION Plustecknet (+) betyder addition: vi bad datorn att skriva resultatet av 12 adderat till 12. Andra matematiska beräkningar utförs liknande. Kom ihåg att alltid trycka på -tangenten efter att du skrivit PRINT och beräkningen. SUBTRAKTION Vid subtraktion används det vanliga minus (-)-tecknet. Skriv: PRINT 12 - 9 <----- Tryck 3 MULTIPLIKATION Om du önskar multiplicera 12 med 12, använder du asterisken (*) för att representera multiplikation. Du skriver då: PRINT 12 * 12 <----- Tryck 144 DIVISION Division använder den bekanta "/". Exempelvis dividera 144 med 12, skrivs: PRINT 144 / 12 <----- Tryck 12 EXPONENTIERING På ett liknande sätt kan exponentiering utföras. (Detta är detsamma som att multiplicera ett tal med sig själv ett bestämt antal gånger). Pil upp (^)-tecknet används för exponentiering. PRINT 12 ^ 5 248832 Detta är detsamma som att skriva: PRINT 12 * 12 * 12 * 12 * 12 248832 TIPS: Basic innehåller ett antal genvägar. En sådan genväg är att använda förkortade BASIC-kommandon. Ett "?" kan exempelvis användas istället för PRINT. När vi nu går vidare presenteras ett flertal kommandon. Appendix D visar förkortningarna for dessa och vad som syns på skärmen när du skriver kommandon i förkortad form. Ett sista exempel visar på en annan viktig punkt: flera beräkningar kan göras på en rad och de kan vara en blandning av olika räknesätt. Du kan beräkna detta problem: ? 3 + 5 - 7 + 2 (Detta '?' ersätter ordet PRINT) 3 Vi har visat datorns förmåga att räkna med hjälp av enkla exempel. Commodore 64 är emellertid kapabel att utföra avsevärt mer komplicerade beräkningar. Du kan exempelvis addera ett antal stora tal. Pröva följande, men använd inte komma (,) då får du ett felmeddelande. ? 122.45 + 345.78 + 7895.687 8364.917 Det ser bra ut. Pröva nu följande: ? 12123123.45 + 345.78 + 7895.687 12131364.9 Om du tog tid på dig och adderade ovanstående för hand skulle du fått ett annat resultat. Vad är det som händer? Även för en kraftfull dator finns det en begränsning i hur många siffror den kan hantera. Commodore 64 kan handskas med tal upp till 10 siffror. När talet skrivs ut visas emellertid endast 9 siffror. Därför har talet i vårt exempel rundats av. Commodore 64 rundar av uppåt när nästa siffra är 5 eller större, och rundar av nedåt då nästa siffra är 4 eller mindre. Tal mellan 0.01 och 999 999 999 skrivs ut som vanligt. Tal utanför detta område skrivs ut i exponentform. Exponentform är enbart ett sätt att skriva ut mycket stora eller mycket stora tal med en siffra och 8 decimaler följt av et E och därför ett tal som är 10-exponenten av talet. Om du skriver: ? 123000000000000000 1.23E+17 Detta är detsamma som 1.23*10^17 och används för att göra utskriften hanterbar. Det finns en begränsning för hur stora tal datorn kan hantera även vid exponentiering. Största +/- 1.70141183E+38 Minsta +/- 2.93873588E-39 [2.5] PRIORITET VID BERÄKNINGAR Om du försökt utföra en blandad beräkning annat än de vi använt i exempel, kan det ha inträffat att du fått ett oväntat resultat. Orsaken är att datorn utför beräkningar i en speciell ordningföljd. I denna uppställning: 20 + 8 / 2 kan man inte säkert veta om svaret ska vara 24 eller 14 utan att veta i vilken ordningsföljd beräkningen ska utföras. Om du lägger samman 20 och 8 delat med 2 (=4) får du svaret 14. Prova exemplet och se vad du får. Orsaken att du får 24 är att Commodore 64 utför beräkningar från vänster till höger enligt följande ordningsföljd: 1: minustecknet indikerande negativa tal 2: exponentiering, vänster till höger 3: multiplikation och division, vänster till höger 4: addition och subtraktion, vänster till höger Om man följer denna ordningsföljd för det tidigare exemplet beräknar datorn divisionen först och därefter additionen varför resultatet blir 24. Gör några olika egna problem och se om du kan följa med i beräkningarna och förutsäga resultatet med räkneföljdsreglerna ovan. Det finns också ett enkelt sätt att ändra ordningsföljden vid beräkningar. Genom att använda parenteser kan man bestämma vilken beräkning som ska utföras först. Om du exempelvis vill dela 35 med 5 plus 2 skriver du: ? 35 / 5 + 2 9 du får 35 delat med 5 med 2 adderat till svaret, vilket inte är vad du önskade. Försök följande: ? 35 / (5 + 2) 5 Vad som nu hänt är att datorn utvärderar det som finns inom parenteserna först. Om det finns parenteser inom parenteser beräknas den innersta parentesen först. Om det finns ett flertal parenteser på en rad, såsom: ? (12 + 9) * (6 + 1) 147 beräknas parenteserna från vänster till höger. Här blir 21 multiplicerat med 7 och resultatet blir 147. [2.6] KOMBINERAD UTSKRIFT OCH BERÄKNING Trots att vi har lagt ned mycket tid i områden som inte verkar särskilt viktiga, kommer många detaljer att visa sig betydelsefulla när du börjar att skriva egna program. För att ge dig en idé om var de olika sakerna passar in, föreställ dig följande: Hur kan de två olika typer av PRINT-kommando vi har studerat användas för att skriva något meningsfullt på skärmen? Vi känner ju till att det som skrivs inom citationstecken skriv ut exakt som det skrevs, och genom att använda matematiska instruktioner kan beräkningar utföras. Så varför inte kombinera dessa 2 typer av PRINT-kommando på följande sätt: ? "5 * 9 = "; 5 * 9 (Semikolon = inget mellanrum) 5 * 9 = 45 Även om detta verkar en aning överflödigt, vad vi har åstadkommit är att helt enkelt använda båda typerna av PRINT-kommando tillsammans. Den första delen skriver ut "5*9 = " exakt som det är skrivet. Den andra delen gör den verkliga beräkningen och skriver ut resultatet, med ett semikolon emellan för att avskilja meddelandedelen från beräkningsdelen. Du måste alltid separera de olika delarna i en blandad PRINT-instruktion med någon typ av mellantecken. Prova med ett komma istället för semikolon och se vad som händer. För den vetgirige, semikolon orsakar att den senare delen skrivs ut i direkt anslutning till den tidigare delen. Komma åstadkommer något annat. Även om det kan användas som separator, sprider det ut utskriften mera. Om du skriver: ? 2,3,4,5,6 <-------------------------------- Tryck 2 3 4 5 6 siffrorna skrivs ut över hela raden och ned på nästa rad. Commodore 64's skärm är uppdelad i fyra områden med 10 kolumner vardera. Kommat fabulerar varje resultat i närmast följande lediga tabulatorposition. Eftersom vi bad datorn skriva ut mer information än vad som får plats på en rad (vi försökte att få plats med 5 st 10-kolumner på en rad) flyttades den sista siffran ned till nästa rad. Denna grundläggande skillnad mellan komma och semikolon vid uppställning av PRINT-instruktioner kan med fördel användas för att skapa mera komplicerade uppställningar; det hjälper oss att skapa sofistikerade resultat mycket enkelt. [3.] BÖRJA PROGRAMMERA I BASIC * Nästa steg - GOTO * Redigeringstips * Variabler * IF ... THEN * FOR ... TO ... NEXT [3.1] NÄSTA STEG Hittills har vi utfört enklare uppgifter genom att skriva in en enda rad med instruktioner i datorn. Efter det att vi tryckt på utfördes den begärda uppgiften direkt. Detta kallas DlREKT-mod eller KALKYLATOR-mod. Men för att kunna utföra något meningsfullt måste vi få datorn att arbeta med mer än en instruktionsrad. Ett antal instruktioner kombinerade tillsammans bildar ett PROGRAM, vilket gör att du bättre kan utnyttja Commodore 64's fulla kapacitet. För att se hur enkelt det är att skriva ditt första Commodore 64 program, pröva följande: Radera skärmen genom att haffa ned och tryck på . Skriv NEW och tryck på . (Detta raderar ut eventuella tal som kan ligga kvar i datorns minne från tidigare experiment). Skriv nu följande exakt som det står. (kom ihåg att trycka efter varje rad). 10 ?"COMMODORE 64" 20 GOTO 10 _ Skriv nu RUN och tryck -- se vad som händer. Skärmen kommer nu att fyllas med "COMMODORE 64" i vänsterkanten. När du har sett färdigt tryck på för att stoppa programmet. COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 BREAK IN 10 READY Ett antal viktiga begrepp, som introducerades i detta korta program, är grundläggande för all programmering. Lägg märke till att varje instruktionsrad föregicks av ett nummer. Dessa radnummer talar om för datorn i vilken ordningsföljd de olika instruktionerna ska utföras. Dessa nummer är också en referenspunkt i den händelse programmet behöver gå tillbaka till en specifik rad. Radnummer kan vara vilket som helst heltal mellan 0 och 63999. 10 PRINT "COMMODORE 64" ^ ^ | |-- Instruktion | +------- Radnummer Det är god programmeringsteknik att numrera raderna i steg om 10 -- i den händelse du senare önskar lägga till ytterligare instruktioner. Förutom PRINT använde vårt program ytterligare ett BASIC-kommando, nämligen GOTO. Detta instruerar datorn att gå direkt till en bestämd rad och utföra vad som står där och därefter fortsätta vidare därifrån. +--> 10 PRINT "COMMODORE 64" | +--- 20 GOTO 10 I vårt exempel skriver programmet meddelandet i rad 10, går till nästa rad (20), vilket instruerar datorn att gå tillbaka till rad 10 för att skriva meddelandet en gång till. Detta upprepas hela tiden. Eftersom vi inte givit programmet någon väg ut ur denna slinga, snurrar programmet runt utan slut tills dess vi avbryter det utifrån med -tangenten. Skriv LIST direkt du har stoppat programmet. Ditt program visas då på skärmen, som du skrivit det, emedan det finns i datorns minne. Lägg också märke till att datorn omvandlade ? till PRINT åt dig. Programmet kan nu ändras, sparas eller köras igen. En annan viktig skillnad mellan att skriva in något i direktmod och att skriva program är att direkt efter datorn utfört instruktionerna och du raderat skärmen är instruktionerna förlorade om du använt direktmod. Ett program kan du emellertid alltid få tillbaka genom att skriva LIST. När det gäller förkortningar, glöm inte av att datorn kanske inte får plats med alla instruktioner om du använder för många på en rad. [3.2] REDIGERINGSTIPS Om du gör ett fel på en rad har du ett antal korrigeringsmöjligheter. 1. Du kan skriva om en hel rad, och datorn ersätter alltid den gamla raden med den nya. 2. En oönskad rad kan raderas genom att skriva radnumret följt av . 3. Du kan också enkelt redigera en rad med hjälp av CRSR-tangenterna och redigeringstangenterna. Föreställ dig att du gjort ett skrivfel på en av raderna i exemplet. För att korrigera utan att skriva om hela raden ger följande: Skriv LIST. Använd därefter och tangenterna tillsammans och flytta markören upp till den rad som behöver ändras. CRSR-höger tangenten används for att flytta markaren till det tecken du vill ändra. Skriv det nya tecknet Över det gamla. Tryck nu på så ersätter datorn det gamla tecknet med det nya. Om du behöver mer utrymme på en rad, ställ markaren där utrymmet behovs och tryck ned och . samtidigt och du får utrymme for ett ytterligare tecken. Skriv nu in den information du önskar och tryck . På liknande sätt kan du ta bort oönskade tecken genom att placera markaren omedelbart till häger om det tecken som du vill avlägsna och därefter trycka på -tangenten. För att övertyga dig om att ändringarna accepterats av datorn, skriv LIST och det korrigerade programmet visas på skärmen. Radnummer behöver inte skrivas in i nummerföljd. Datorn lägger dem själv i rätt följd. Försök nu att redigera vårt enkla program genom att ändra rad 10 genom att lägga till ett komma (,) vid slutet av raden så som visas nedan. Glöm inte att flytta ned markören under rad 20 innan du skriver RUN. 10 PRINT "COMMODORE 64", COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE 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 10 READY [3.3] VARIABLER Variabler är en av de mest använda egenskaperna hos programspråken, därför att de kan representera mängder av information som finns i datorn. Att förstå hur variabler fungerar ger datoranvändandet enklare och tillåter dig att använda finesser som annars vore omöjliga att utnyttja. Föreställ dig ett antal lådor i datorn. Dessa lådor kan användas att förvara siffervärden eller en rad med bokstäver. Varje låda ska märkas med ett namn som vi själva väljer. Det namnet kallas variabel och representerar informationen i lådan. Om vi exempelvis säger: 10 X% = 15 20 X = 23.5 30 X$ = "SUMMAN AV X% + X=" Datorn skulle kunna representera variablerna på följande sätt: X% 15 X 23.5 X$ SUMMAN AV X% + X = En variabel motsvarar lådan, eller minnesplatsen, där det aktuella värdet av variabeln lagras. Som du ser kan vi tilldela endera heltal, decimaltal eller bokstäver till variabler. Procenttecknet (%) efter ett variabelnamn betyder att variabeln ska representera ett heltal mellan 0 och +-32767. Följande är tillåtna namn på heltalsvariabler: A% X% A1% NM% Dollartecknet ($) efter ett variabelnamn betyder att variabelnamnet representerar en textrad (textsträng). Följande är exempel på strängvariabler A$ X$ Ml$ Decimaltalsvariabler följer samma system, med följande exempel: A1 X Y MI När man tilldelar en variabel ett namn måste man komma ihåg: För det första: en variabel kan ha ett eller två tecken. Det första tecknet måste vara en bokstav mellan A och Z. Det andra tecknet kan vara en bokstav eller en siffra. Ett tredje tecken kan användas för att indikera vilken sorts variabel det gäller (heltals- eller sträng-variabel) % eller $. Du kan använda variabelnamn med mer än två bokstäver men endast de två första används av datorn. Därför är variabelnamn såsom PA och PARTNO samma och refererar till samma variabel-låda. Den sista regeln för variabelnamn är enkel: De får inte innehålla några av BASIC's reserverade ord såsom GOTO, RUN etc. Se appendix D för en komplett sammanställning. För att se hur variabler kan användas kan du skriva in det program vi visade tidigare och sedan köra det. Kom ihåg att trycka efter varje rad. 10 X% = 15 20 X = 23.5 30 X$ = "SUMMAN AV X% + X =" 40 PRINT "X% = "; X%, "X = "; X 50 PRINT X$; X% + X Om du gjort allt rät har du fått upp följande på din bildskärm. RUN X% = 15 X = 23.5 SUMMAN AV X% + XD = 38.5 READY _ Vi har använt alla de trick vi hittills lärt hur man kan formatera utskriften på skärmen och skrivit ut summan av de två variablerna. På rad 10 och 20 tilldelade vi ett heltalsvärde till X% och ett flyttalsvärde till X. Rad 40 kombinerar de två typerna av PRINT-kommandon för att skriva ut ett meddelande och de aktuella variabelnamn- värdena på X% och X. Rad 50 skriver ut textsträngen med variabelnamnet X$ och summan av X% och X. Lägg märke till att trots att X används som en del i varje variabel, gör % och $-tecknen variablerna unika så de kan representera olika värden. Men variabler är ännu mer kraftfulla. Om du ändrar dess värde ersätts det gamla värdet med det nya i samma låda. Detta tillåter dig att skriva en instruktion såsom: X = X + 1 Detta kan inte accepteras i normal matematik, men är en mycket vanlig formulering vid programmering. Det betyder: Tag det aktuella värdet på X, lägg till ett och lägg tillbaka summan i lådan som representerar X. [3.4] IF...THEN Beväpnade med möjligheten att enkelt uppdatera värde på variabler, kan vi nu prova ett program som: NEW 10 CT = 0 20 ?"COMMODORE 64" 30 CT = CT + 1 40 IF CT < 5 THEN 20 50 END Vad vi nu gjort är att vi infört två nya BASIC-kommandon, och fått viss kontroll över det lilla PRINT-program vi introducerade i början av detta kapitel. IF...THEN lägger till vissa förutsättningar för programmet. Det ger att OM (= IF) ett uttryck är sant DÅ (THEN) ska något utfaras. Om inte uttrycket är sant utförs nästa programrad. Ett antal förutsättningar eller villkor kan ställas upp vid användning av IF...THEN-kommandona: < Mindre än > Större än = Lika med <> Inte lika med >= Större än eller lika med <= Mindre än eller lika med Det är enkelt att använda dessa jämförelser mellan två värden, men de är ändå överraskande användbara. 10 CT = 0 +--> 20 ? "COMMODORE 64" | 30 CT = CT + 1 +-<- 40 IF CT < 5 THEN 20 | V 50 END I detta programexempel har vi gjort en "loop" (slinga) som kräver vissa förutsättningar genom att säga: IF (om) ett värde är mindre än ett annat värde THEN (då) ska något utföras. Rad 10 sätter värdet på CT till 0. Rad 20 skriver ut meddelandet. Rad 30 ökar värdet på CT med 1. Denna rad räknar upp hur många gånger loopen genomlöpts. Rad 40 är vår kontrollrad. Om CT är mindre än 5, vilket betyder att programmet arbetat sig genom loopen mindre än 5 gånger, går programmet tillbaka till 20 och skriver en gång till. När CT blir lika med 5, det betyder att "COMMODORE 64" skrivits 5 gånger, går programmet till rad 50. Rad 50 signalerar till datorn att avsluta programmet. Prova nu programmet och se vad vi menar. Genom att ändra CT-gränsen i rad 40 kan du få önskat antal rader utskrivna. IF...THEN kan utföra en mängd andra nyttigheter vilka vi visar längre fram. [3.5] FOR...TO...NEXT Det finns en enklare och mer använd väg att utföra vad vi gjorde i det förra exemplet. Vi kan använda en FOR...TO...NEXT-loop. Studera följande: NEW 10 FOR CT = 1 TO 5 20 ? "COMMODORE 64" 30 NEXT CT RUN COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 Som du ser har programmet blivit kortare och mer rättfram. CT startar med värdet 1 på rad 10 Rad 20 utför utskriften. På rad 30 ökas CT med 1. NEXT-kommandot på rad 30 sänder automatiskt programmet tillbaka till rad 10 där FOR delen av FOR...NEXT-instruktionen finns. Detta förlopp fortsätter till dess att CT når den gräns du skrivit in efter nyckelordet TO, (här 5). Variabeln som används i en FOR...NEXT-loop kan ökas med ett värde mindre än ett, om så önskas. Prova följande: NEW 10 FOR NB = 1 TO 10 STEP .5 20 PRINT NB, 30 NEXT NB RUN 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8 8.5 9 9.5 10 Om du skriver in och kör detta program, kommer du att se tal från 1 till 10, med 0.5 steg utskrivna på skärmen. Allt vi gjort är att skriva ut de värden NB har när programmet går genom loopen. Du kan även bestämma om variabeln ska öka eller minska. Ersätt rad 10 med följande: 10 FOR NB = 10 TO 1 STEP -.5 och se motsatsen hända, då NB minskar från 10 till 1. [3.] BÖRJA PROGRAMMERA I BASIC * Nästa steg - GOTO * Redigeringstips * Variabler * IF ... THEN * FOR ... TO ... NEXT [3.1] NÄSTA STEG Hittills har vi utfört enklare uppgifter genom att skriva in en enda rad med instruktioner i datorn. Efter det att vi tryckt på utfördes den begärda uppgiften direkt. Detta kallas DlREKT-mod eller KALKYLATOR-mod. Men för att kunna utföra något meningsfullt måste vi få datorn att arbeta med mer än en instruktionsrad. Ett antal instruktioner kombinerade tillsammans bildar ett PROGRAM, vilket gör att du bättre kan utnyttja Commodore 64's fulla kapacitet. För att se hur enkelt det är att skriva ditt första Commodore 64 program, pröva följande: Radera skärmen genom att haffa ned och tryck på . Skriv NEW och tryck på . (Detta raderar ut eventuella tal som kan ligga kvar i datorns minne från tidigare experiment). Skriv nu följande exakt som det står. (kom ihåg att trycka efter varje rad). 10 ?"COMMODORE 64" 20 GOTO 10 _ Skriv nu RUN och tryck -- se vad som händer. Skärmen kommer nu att fyllas med "COMMODORE 64" i vänsterkanten. När du har sett färdigt tryck på för att stoppa programmet. COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 BREAK IN 10 READY Ett antal viktiga begrepp, som introducerades i detta korta program, är grundläggande för all programmering. Lägg märke till att varje instruktionsrad föregicks av ett nummer. Dessa radnummer talar om för datorn i vilken ordningsföljd de olika instruktionerna ska utföras. Dessa nummer är också en referenspunkt i den händelse programmet behöver gå tillbaka till en specifik rad. Radnummer kan vara vilket som helst heltal mellan 0 och 63999. 10 PRINT "COMMODORE 64" ^ ^ | |-- Instruktion | +------- Radnummer Det är god programmeringsteknik att numrera raderna i steg om 10 -- i den händelse du senare önskar lägga till ytterligare instruktioner. Förutom PRINT använde vårt program ytterligare ett BASIC-kommando, nämligen GOTO. Detta instruerar datorn att gå direkt till en bestämd rad och utföra vad som står där och därefter fortsätta vidare därifrån. +--> 10 PRINT "COMMODORE 64" | +--- 20 GOTO 10 I vårt exempel skriver programmet meddelandet i rad 10, går till nästa rad (20), vilket instruerar datorn att gå tillbaka till rad 10 för att skriva meddelandet en gång till. Detta upprepas hela tiden. Eftersom vi inte givit programmet någon väg ut ur denna slinga, snurrar programmet runt utan slut tills dess vi avbryter det utifrån med -tangenten. Skriv LIST direkt du har stoppat programmet. Ditt program visas då på skärmen, som du skrivit det, emedan det finns i datorns minne. Lägg också märke till att datorn omvandlade ? till PRINT åt dig. Programmet kan nu ändras, sparas eller köras igen. En annan viktig skillnad mellan att skriva in något i direktmod och att skriva program är att direkt efter datorn utfört instruktionerna och du raderat skärmen är instruktionerna förlorade om du använt direktmod. Ett program kan du emellertid alltid få tillbaka genom att skriva LIST. När det gäller förkortningar, glöm inte av att datorn kanske inte får plats med alla instruktioner om du använder för många på en rad. [3.2] REDIGERINGSTIPS Om du gör ett fel på en rad har du ett antal korrigeringsmöjligheter. 1. Du kan skriva om en hel rad, och datorn ersätter alltid den gamla raden med den nya. 2. En oönskad rad kan raderas genom att skriva radnumret följt av . 3. Du kan också enkelt redigera en rad med hjälp av CRSR-tangenterna och redigeringstangenterna. Föreställ dig att du gjort ett skrivfel på en av raderna i exemplet. För att korrigera utan att skriva om hela raden ger följande: Skriv LIST. Använd därefter och tangenterna tillsammans och flytta markören upp till den rad som behöver ändras. CRSR-höger tangenten används for att flytta markaren till det tecken du vill ändra. Skriv det nya tecknet Över det gamla. Tryck nu på så ersätter datorn det gamla tecknet med det nya. Om du behöver mer utrymme på en rad, ställ markaren där utrymmet behovs och tryck ned och . samtidigt och du får utrymme for ett ytterligare tecken. Skriv nu in den information du önskar och tryck . På liknande sätt kan du ta bort oönskade tecken genom att placera markaren omedelbart till häger om det tecken som du vill avlägsna och därefter trycka på -tangenten. För att övertyga dig om att ändringarna accepterats av datorn, skriv LIST och det korrigerade programmet visas på skärmen. Radnummer behöver inte skrivas in i nummerföljd. Datorn lägger dem själv i rätt följd. Försök nu att redigera vårt enkla program genom att ändra rad 10 genom att lägga till ett komma (,) vid slutet av raden så som visas nedan. Glöm inte att flytta ned markören under rad 20 innan du skriver RUN. 10 PRINT "COMMODORE 64", COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE 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 10 READY [3.3] VARIABLER Variabler är en av de mest använda egenskaperna hos programspråken, därför att de kan representera mängder av information som finns i datorn. Att förstå hur variabler fungerar ger datoranvändandet enklare och tillåter dig att använda finesser som annars vore omöjliga att utnyttja. Föreställ dig ett antal lådor i datorn. Dessa lådor kan användas att förvara siffervärden eller en rad med bokstäver. Varje låda ska märkas med ett namn som vi själva väljer. Det namnet kallas variabel och representerar informationen i lådan. Om vi exempelvis säger: 10 X% = 15 20 X = 23.5 30 X$ = "SUMMAN AV X% + X=" Datorn skulle kunna representera variablerna på följande sätt: X% 15 X 23.5 X$ SUMMAN AV X% + X = En variabel motsvarar lådan, eller minnesplatsen, där det aktuella värdet av variabeln lagras. Som du ser kan vi tilldela endera heltal, decimaltal eller bokstäver till variabler. Procenttecknet (%) efter ett variabelnamn betyder att variabeln ska representera ett heltal mellan 0 och +-32767. Följande är tillåtna namn på heltalsvariabler: A% X% A1% NM% Dollartecknet ($) efter ett variabelnamn betyder att variabelnamnet representerar en textrad (textsträng). Följande är exempel på strängvariabler A$ X$ Ml$ Decimaltalsvariabler följer samma system, med följande exempel: A1 X Y MI När man tilldelar en variabel ett namn måste man komma ihåg: För det första: en variabel kan ha ett eller två tecken. Det första tecknet måste vara en bokstav mellan A och Z. Det andra tecknet kan vara en bokstav eller en siffra. Ett tredje tecken kan användas för att indikera vilken sorts variabel det gäller (heltals- eller sträng-variabel) % eller $. Du kan använda variabelnamn med mer än två bokstäver men endast de två första används av datorn. Därför är variabelnamn såsom PA och PARTNO samma och refererar till samma variabel-låda. Den sista regeln för variabelnamn är enkel: De får inte innehålla några av BASIC's reserverade ord såsom GOTO, RUN etc. Se appendix D för en komplett sammanställning. För att se hur variabler kan användas kan du skriva in det program vi visade tidigare och sedan köra det. Kom ihåg att trycka efter varje rad. 10 X% = 15 20 X = 23.5 30 X$ = "SUMMAN AV X% + X =" 40 PRINT "X% = "; X%, "X = "; X 50 PRINT X$; X% + X Om du gjort allt rät har du fått upp följande på din bildskärm. RUN X% = 15 X = 23.5 SUMMAN AV X% + XD = 38.5 READY _ Vi har använt alla de trick vi hittills lärt hur man kan formatera utskriften på skärmen och skrivit ut summan av de två variablerna. På rad 10 och 20 tilldelade vi ett heltalsvärde till X% och ett flyttalsvärde till X. Rad 40 kombinerar de två typerna av PRINT-kommandon för att skriva ut ett meddelande och de aktuella variabelnamn- värdena på X% och X. Rad 50 skriver ut textsträngen med variabelnamnet X$ och summan av X% och X. Lägg märke till att trots att X används som en del i varje variabel, gör % och $-tecknen variablerna unika så de kan representera olika värden. Men variabler är ännu mer kraftfulla. Om du ändrar dess värde ersätts det gamla värdet med det nya i samma låda. Detta tillåter dig att skriva en instruktion såsom: X = X + 1 Detta kan inte accepteras i normal matematik, men är en mycket vanlig formulering vid programmering. Det betyder: Tag det aktuella värdet på X, lägg till ett och lägg tillbaka summan i lådan som representerar X. [3.4] IF...THEN Beväpnade med möjligheten att enkelt uppdatera värde på variabler, kan vi nu prova ett program som: NEW 10 CT = 0 20 ?"COMMODORE 64" 30 CT = CT + 1 40 IF CT < 5 THEN 20 50 END Vad vi nu gjort är att vi infört två nya BASIC-kommandon, och fått viss kontroll över det lilla PRINT-program vi introducerade i början av detta kapitel. IF...THEN lägger till vissa förutsättningar för programmet. Det ger att OM (= IF) ett uttryck är sant DÅ (THEN) ska något utfaras. Om inte uttrycket är sant utförs nästa programrad. Ett antal förutsättningar eller villkor kan ställas upp vid användning av IF...THEN-kommandona: < Mindre än > Större än = Lika med <> Inte lika med >= Större än eller lika med <= Mindre än eller lika med Det är enkelt att använda dessa jämförelser mellan två värden, men de är ändå överraskande användbara. 10 CT = 0 +--> 20 ? "COMMODORE 64" | 30 CT = CT + 1 +-<- 40 IF CT < 5 THEN 20 | V 50 END I detta programexempel har vi gjort en "loop" (slinga) som kräver vissa förutsättningar genom att säga: IF (om) ett värde är mindre än ett annat värde THEN (då) ska något utföras. Rad 10 sätter värdet på CT till 0. Rad 20 skriver ut meddelandet. Rad 30 ökar värdet på CT med 1. Denna rad räknar upp hur många gånger loopen genomlöpts. Rad 40 är vår kontrollrad. Om CT är mindre än 5, vilket betyder att programmet arbetat sig genom loopen mindre än 5 gånger, går programmet tillbaka till 20 och skriver en gång till. När CT blir lika med 5, det betyder att "COMMODORE 64" skrivits 5 gånger, går programmet till rad 50. Rad 50 signalerar till datorn att avsluta programmet. Prova nu programmet och se vad vi menar. Genom att ändra CT-gränsen i rad 40 kan du få önskat antal rader utskrivna. IF...THEN kan utföra en mängd andra nyttigheter vilka vi visar längre fram. [3.5] FOR...TO...NEXT Det finns en enklare och mer använd väg att utföra vad vi gjorde i det förra exemplet. Vi kan använda en FOR...TO...NEXT-loop. Studera följande: NEW 10 FOR CT = 1 TO 5 20 ? "COMMODORE 64" 30 NEXT CT RUN COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 Som du ser har programmet blivit kortare och mer rättfram. CT startar med värdet 1 på rad 10 Rad 20 utför utskriften. På rad 30 ökas CT med 1. NEXT-kommandot på rad 30 sänder automatiskt programmet tillbaka till rad 10 där FOR delen av FOR...NEXT-instruktionen finns. Detta förlopp fortsätter till dess att CT når den gräns du skrivit in efter nyckelordet TO, (här 5). Variabeln som används i en FOR...NEXT-loop kan ökas med ett värde mindre än ett, om så önskas. Prova följande: NEW 10 FOR NB = 1 TO 10 STEP .5 20 PRINT NB, 30 NEXT NB RUN 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8 8.5 9 9.5 10 Om du skriver in och kör detta program, kommer du att se tal från 1 till 10, med 0.5 steg utskrivna på skärmen. Allt vi gjort är att skriva ut de värden NB har när programmet går genom loopen. Du kan även bestämma om variabeln ska öka eller minska. Ersätt rad 10 med följande: 10 FOR NB = 10 TO 1 STEP -.5 och se motsatsen hända, då NB minskar från 10 till 1. [4.] AVANCERAD BASIC * Introduktion * Enkel animering * Trådade loopar * INPUT * GET * Slumptal och andra funktioner * Gissningsspel * Ditt kast * Slumptals-grafik * CHR$- och ASC-funktioner [4.1] INLEDNING De närmast följande kapitlen har skrivits för dig som är relativt van vid programspråket BASIC och dess begrepp, vilket är nödvändigt för att första dessa mer avancerade program. För de av er som just börjat lära programmering, kommer viss information att vara något för teknisk att förstås fullständigt. Bli nu inte orolig... det finns nämligen två roliga kapitel: SPRITE-grafik och SKAPA LJUD där vi gjort enkla exempel som är skrivna för nybörjare. Exemplen kommer att ge dig en god uppfattning om hur man använder Commodore 64's rika möjligheter att skapa sofistikerade ljud och bildprogram. Om du beslutar att lära dig mer om hur man skriver program i BASIC, finns det lämplig litteratur i ämnet. [4.2] ENKEL ANIMERING Låt oss öva på några av Commodore 64's grafiska egenskaper genom att utnyttja det vi visat tidigare tillsammans med några nya begrepp. Om du är intresserad kan du skriva in följande program och se vad som händer. Du kommer att upptäcka att inom PRINT-instruktioner kan vi också använda markörstyrnings- och skärmkommandon. När du ser något liknande (CRSR vänster) i en programlista, tryck ned -tangenten och tryck på CRSR-tangenten. Bildskärmen visar då det grafiska tecknet för markörförflyttning ett steg vänster (två reverserade vertikala balkar). På samma sätt visas, om man trycker och , ett reverserat hjärta. NEW start tok64 SID43.prg 10 REM studsande boll 20 PRINT"{clear}":REM shift+clear/home 25 FOR x = 1 TO 10 : PRINT"{down}" :NEXT 26 REM "{down}"=crsr-ned 30 FOR bl=1 TO 40 40 PRINT" Q{left}"; :REM "Q"=shift+q 41 REM "{left}"=crsr-vanster 50 FOR tm = 1 TO 5 60 NEXT tm 70 NEXT bl 75 REM flytta bollen hoger-vanster 80 FOR bl = 40 TO 1 STEP -1 90 PRINT " {left*2}Q{left}";:REM crsr-vanster,crsr-vanster,shift+q,crsr-vanster 100 FOR tm = 1 TO 5 110 NEXT tm 120 NEXT bl 130 GOTO 20 stop tok64 ANM: ':' på rad 25 indikerar ny instruktion. Mellanrummen på rad 40 och 90 är avsiktliga. TIPS: Alla ord i denna text skrivs ut i en följd. Så länge som du inte trycker på kommer Commodore 64 automatiskt att vid radslut byta till nästa rad även mitt i ett ord. Detta program visar en studsande boll som rör sig fram och tillbaka Över skärmen. Om vi studerar programmet noga, (se nedan) kan du se hur detta utfördes.. 10 REM studsande boll +----> 20 PRINT"{clear}":REM shift+clear/home | 25 FOR x = 1 TO 10 : PRINT"{down}" :NEXT | 26 REM "{down}"=crsr-ned | +--> 30 FOR bl=1 TO 40 | | 40 PRINT" Q{left}"; :REM "Q"=shift+q | | 41 REM "{left}"=crsr-vanster | | +> 50 FOR tm = 1 TO 5 | | +- 60 NEXT tm | +--- 70 NEXT bl | 75 REM flytta bollen hoger-vanster | +--> 80 FOR bl = 40 TO 1 STEP -1 | | 90 PRINT " {left*2}Q{left}";:REM crsr-vanster,crsr-vanster, | | shift+q,crsr-vanster | | +> 100 FOR tm = 1 TO 5 | | +- 110 NEXT tm | +--- 120 NEXT bl +----- 130 GOTO 20 Rad 10 är en REMark (kommentar) som enbart berättar vad programmet gör. Den har ingen inverkan på det egentliga programmet. Rad 20 raderar skärmen på all information. Rad 25 skriver 10 st markör-nedåt kommando. Detta styr bollen till mitten av skärmen. Om rad 25 utelämnas skulle bollen röra sig över översta raden på skärmen. Rad 30 startar en loop (slinga) för att flytta bollen 40 kolumner från vänster till höger. Rad 40 utför en hel del. Först skrivs ett mellanslag för att radera den tidigare bollpositionen, därefter skrivs bollen ut och slutligen utförs markör vänster-förflyttning för att förbereda nästa radering av bollpositionen. Slingan, som startas i rad 50 och 60, minskar bollens hastighet genom att fördröja programmet. Utan fördröjning skulle bollen röra sig för fort för att synas. Rad 70 avslutar slingan, som ritar bollen på skärmen, vilken startade på rad 30. Varje gång som slingan genomlöps flyttas bollen ytterligare ett steg till höger. Som du ser av illustrationen har vi åstadkommit en slinga inom en annan. Detta kallas en kapslad slinga (nested loop). Detta accepteras av datorn. Den enda gång du får problem är när slingorna korsar varann. Vi rekommenderar att du kontrollerar program med flertal slingor på detta sätt. För att se vad som händer om du korsar två slingor, byt instruktionerna på rad 60 och 70. Du kommer att få felindikering (error) då datorn blir förvirrad och inte kan för stå vad som händer. Rad 80 till 120 gör samma sak som i första delen av programmet men med omvänd funktion. Bollen flyttas nu från höger till vänster. Rad 90 är lätt förändrad jämfört med rad 40 eftersom bollen ska röras i motsatt riktning (vi måste radera bollen till höger och flytta åt vänster). När allt detta är utfart ger programmet tillbaka till rad 20 och startar om på nytt. Ganska händigt! En variant på programmet kan erhållas om du ändrar rad 40 enligt följande: 40 PRINT "O" <-- För att åstadkomma O håll ned SHIT och tryck på bokstaven Q. kör programmet och se vad som händer. Eftersom vi utelämnade markörkontrollerna kommer alla bollarna att bli kvar på skärmen tills dess de raderas av bollen när den rör sig från höger till vänster i andra delen av programmet. [4.3] INPUT Allt inom ett program har hittills varit bestämt innan det körts. När programmet väl var startat kunde inget ändras. INPUT tillåter dig att förmedla information under tiden programmet körs. Programmet kan alltså bearbeta eller reagera på den nya informationen under körning. För att du ska få en idé om hur INPUT arbetar, skriv NEW och skriv in detta korta program: 10 INPUT A$ 20 PRINT "DU SKREV: ";A$ 30 PRINT 40 GOTO10 RUN ? COMMODORE 64 <--------------- Du skrev DU SKREV: COMMODORE 64 <----- Datorn svarade Vad som händer när du kör detta korta program är enkelt. Ett frågetecken visar sig. Detta indikerar att datorn väntar att du ska skriva in något. Skriv vilket som helst tecken eller grupp av tecken och tryck . Datorn kommer att svara med "DU SKREV:" följt av det du skrev in. Detta kan verka mycket elementärt men föreställ dig vad du kan få datorn att göra med information du skriver in. Du kan använda INPUT för numeriska värden eller textsträngar och även få INPUT-kommandot att skriva ut ett meddelande till användaren. INPUT skrivs i följande form: INPUT "MEDDELANDE"; VARIABEL ^ +---- Meddelande måste vara mindre än 40 tecken! Eller enbart: INPUT VARIABEL OBS. För att avbryta detta program tryck på och samtidigt. Följande är inte endast användbart, utan demonstrerar dessutom en hel del av vad som presenterats tidigare, inklusive det nya INPUT-kommandot. NEW start tok64 SID46.prg 1 REM temperatur-omvandlings-program 5 PRINT "{clear}" : REM shift+clr home 10 PRINT "omvandla fran farenheit eller celsius":INPUT "(f/c)";a$ 20 IF a$ = "" THEN 5 30 IF a$ = "f" THEN 100 40 IF a$ <> "c" THEN 10 50 INPUT "antal grader celsius: "; c 60 f = (c*9)/5+32 70 PRINT c ; "grad. celsius ="; f;"grad. farenheit" 80 PRINT 90 GOTO 10 100 INPUT "antal grader fahrenheit: "; f 110 c = (f-32)*5/9 120 PRINT f ; "grad. farenheit ="; c; "grad. celsius" 130 PRINT 140 GOTO 10 stop tok64 ANM: Inget mellanslag mellan citationstecknen på rad 20. Glöm inte trycka RETURN efter raderna. Om du skriver in och kör detta program får du se INPUT-kommandot i aktion. Rad 10 använder INPUT-kommandot inte enbart för att hämta information utan också för att skriva ut ett uppmanande meddelande. Lägg också märke till att vi kan fråga efter antingen ett siffervärde eller en textsträng (genom att använda numerisk eller sträng-variabel). Raderna 20, 30 och 40 gör vissa kontroller av vad som skrivits in. På rad 20, om inget skrivits in men RETURN tryckts, återgår programmet till rad 10 och begär ny inskrift. På rad 30, om F är inskrivet, vet vi att användaren önskar få en temperatur i Fahrenheit omvandlad till Celsius, varför programmet grenas av till den del som utför denna omvandling. Rad 40 gör ytterligare en kontroll. Vi vet att det finns enbart två giltiga val som användaren kan skriva in. For att komma till rad 40 måste användaren skrivit ett tecken annat än F. Nu görs en koll om tecknet är C, om inte begär programmet en ny INPUT. Detta verkar vara en massa detaljer, men är god programmeringspraxis. En användare som inte är van vid programmet kan bli mycket irriterad om programmet gör något oväntat beroende på inmatningsfel. Så fort vi bestämt vilken typ av omvandling vi Önskar, utförs beräkningen av programmet och datorn skriver ut den inskriva temperaturen tillsammans med den omvandlade temperaturen. Beräkningen är enbart vanlig matematik, med användning av den kända formeln för temperaturomvandling. Efter att beräkningen och utskriften är klar hoppar programmet tillbaka och startar på nytt. Efter att programmet körts kan skärmen se ut så här: OMVANDLA FRÅN FAHRENHEIT ELLER CELSIUS (F/C) ?F ANTAL GRADER FAHRENHEIT: 32 32 GRAD. FAHRENHEIT= 0 GRAD. CELSIUS OMVANDLA FRÅN FAHRENHEIT ELLER CELSIUS (F/C) ? Efter att du kört programmet kan du spara det på flexskiva eller band. Detta program såväl som andra som visas i denna bruksanvisning kan bilda grunden för ditt eget programbibliotek [4.4] GET GET möjliggör hämtning av ett tecken i taget från tangentbordet utan att man behöver trycka på . Detta ökar i många fall hastigheten vid inmatning av data. Den tangent du trycker ned, tilldelas den variabel du angett efter GET. Följande rutin visar hur GET fungerar: NEW start tok64 SID47.prg 1 PRINT "{clear}" 10 GET a$: IF a$= "" THEN 10 20 PRINT a$; 30 GOTO 10 stop tok64 ANM: Inget mellanslag mellan citationstecknen på rad 10 Om du kör programmet, rensas skärmen och varje gång du trycker på en tangent, skriver rad 20 ut tecknet på skärmen. Därefter väntar programmet på rad 10 till dess du trycker ned nästa tangent. Det är viktigt att lägga märke till att de inmatade tecknen inte visas på skärmen såvida du inte uttryckligen begär det genom PRINT-kommandot, så som vi gjort har. Den andra instruktionen på rad 10 är också betydelsefull. GET-instruktionen utförs kontinuerligt, även om ingen tangent trycks ned, (till skillnad från INPUT som väntar på ett svar). Den andra instruktionen kontrollerar alltså tangentbordet till dess en tangent trycks ned. Undersök vad som händer om den andra instruktionen på rad 10 tas bort. Detta program kan stoppas med och nedtryckta samtidigt. Den första delen av temperaturomvandlingsprogrammet kan lätt skrivas om till GET-kommando. Hämta (LOAD) temperaturprogrammet och ändra raderna 10, 20 och 40 enligt nedan: 10 PRINT "OMVANDLA FRÅN FAHRENHEIT ELLER CELSIUS (F/C)" 20 GET A$:IF A$ = "" THEN 20 40 IF A$ <> "C" THEN20 Denna förändring ger att programmet fungerar smidigare, eftersom inget händer såvida användaren inte skriver in önskat svar, F eller C. När denna förändring gjorts är det lämpligt att spara den nya versionen av programmet. [4.5] SLUMPTAL OCH ANDRA FUNKTIONER Commodore 64 innehåller ett antal funktioner som används för att utföra speciella uppgifter. Funktioner kan liknas vid ett speciellt program inbyggt i BASIC. Istället för att skriva in ett antal instruktioner varje gång du vill utföra en speciell beräkning, räcker det med att du skriver kommandoordet för den önskade funktionen varefter datorn sköter resten. Många gånger när du ger ett spel eller utbildningsprogram, behöver du skapa ett slumptal, exempelvis för att simulera ett tärningskast. Du kan givetvis skriva ett program som skapar dessa slumptal, men ett enklare sätt är att anropa RaNDom number (slumptal) funktionen. För att utröna vad RND verkligen gör. Prova följande korta program: NEW 10 FOR X = 1 TO 10 20 PRINT RND(1), <--- Om du utelämnar komma skrivs siffrorna ut i en rad 30 NEXT Efter du kört programmet kommer skärmen att se ut ungefär så här: .789280697 .664673958 .256373663 .0123442287 .682952381 3.90587279E-04 .402343724 .879300926 .158209063 .245596701 Dina siffror passar inte? Om dom passat vore det väl underligt då de är helt slumpmässigt utvalda! Prova med att köra programmet några gånger för att övertyga dig om att resultatet är annorlunda varje gång. Även om talen inte följer ett bestämt mönster, kommer du att märka att vissa saker blir samma varje gång programmet körs. För det första blir resultatet alltid mellan 0 och 1 men aldrig 0 eller 1. Detta passar oss inte om vi vill simulera ett slumpmässigt tärningskast. Vi letar efter siffror mellan 1 och 6. Den andra viktiga egenskapen vi ser är att vi handskas med decimaltal (med decimalkomma). Även detta kan vara ett problem då det ofta behövs enbart heltal. Det finns ett antal enkla sätt att erhålla siffror i det område vi önskar från RND-funktionen. Ersätt rad 20 med följande och kör programmet på nytt. 20 PRINT 6*RND(1), RUN 3.60563664 4.53660853 5.47238963 8.40850227 3.19265054 4.39547668 3.16331095 5.50620749 9.32527884 4.17090293 Detta löste problemet med att få resultat större än 1, men vi har fortfarande decimalerna att handskas med. Nu måste vi använda oss av en annan funktion. INTeger (heltal)-funktionen omvandlar decimaltal till heltal. Byt på nytt ut rad 20 med följande och kör programmet så ser du vad som förändrats. 20 PRINT INT(6*RND(1)), RUN 2 3 1 0 2 4 5 5 0 1 Detta löste en hel del. Vi kom närmare vårt mål att skapa slumptal mellan 1 och 6. Om du tittar efter noga så ser du att resultatet är inom området 0 till 5. Som ett sista steg, addera 1 till instruktionen enligt följande: 20 PRINT INT(6*RND(1))+1, Nu har vi erhållit det önskade resultatet.. Rent allmänt kan du placera ett tal, en variabel, eller något BASIC-uttryck inom parenteserna till INT-funktionen. Beroende på önskat område multiplicerar du den övre gränsen med RND-funktionen. Om du exempelvis vill generera ett slumptal mellan 1 och 25, kan du skriva: 20 PRINT INT(25*RND(1))+1 Den allmänna formeln för att generera ett slumptal inom ett bestämt område är: SLUMPTALET = INT (Undre gräns + (övre-undre + 1) * RND(x)) [4.6] GISSNINGSSPEL Då vi nu kommit en bit på vägen att förstå slumptal, utnyttjar vi detta. Följande spel visar på ett användningsområde för slumptal och bjuder oss dessutom på ytterligare programmeringsteori. start tok64 SID51.prg 1 REM nummergissnings-spel 2 PRINT"{clear}":REM clr+shift 5 INPUT"ovre grans for talet";li 10 nm=INT(li*RND(1))+1 15 cn=0 20 PRINT"jag har ett tal." 30 INPUT"vad gissar du";gu 35 cn=cn+1 40 IF gu > nm THENPRINT"mitt tal ar lagre":PRINT:GOTO30 50 IF gu < nm THENPRINT"mitt tal ar storre":PRINT:GOTO30 60 IF gu = nm THENPRINT"bra!du fick mitt nummer" 65 PRINT"efter ";cn;"gissningar.":PRINT 70 PRINT"vill du gissa mer ? (j/n)"; 80 GET an$:IF an$=""THEN 80 90 IF an$="j"THEN 2 100 IF an$<> "n" THEN 80 110 END stop tok64 När du kör detta program skapas ett slumptal, NM. Du kan bestämma hur stort talet får bli i början av programmet. Sedan är det din uppgift att gissa vilket talet är. En provkörning följer tillsammans med en förklaring: ÖVRE GRÄNS FÖR TALET? 15 JAG HAR ETT TAL. VAD GISSAR DU? 10 MITT TAL ÄR LÄGRE VAD GISSAR DU? 5 MITT TAL ÄR LÄGRE VAD GISSAR DU? 3 BRA!DU FICK MITT NUMMER EFTER 3 GISSNINGAR. IF/THEN-instruktionen jämför det tal du gissat med det framtagna slumptalet. Beroende på vad du gissat skriver datorn om det är större eller mindre än slumptalet. Prova om du med hjälp av formeln för slumptal kan lägga till några rader i programmet så att du också kan bestämma den undre gränsen på slumptalen. Varje gång du gissar ökar DN med 1 för att hålla reda på hur många gånger du gissat. När du använder programmet försök genom att fråga logiskt komma fram till rätt svar på minsta möjliga antal försök. När du gett rätt svar skriver datorn ut "BRA! DU FICK MITT NUMMER", tillsammans med uppgift om det antal gissningar som behövdes. Du kan därefter starta på nytt. Programmet tar fram ett nytt slumpmässigt utvalt tal varje gång. PROGRAMTIPS: På raderna 40 och 50 används ett kolon för att Åtskilja flera instruktioner på samma rad. Detta sparar inte enbart skrivarbete, utan i långa program sparar det även minnesutrymme. Lägg också märke till IF/THEN instruktionen på samma rader. Där vi instruerar datorn att skriva (PRINTa) något istället för att direkt grena ut till någon annan punkt i programmet. Den sista punkten visar på orsaken till att skriva radnummer i steg om 10: Efter programmet var skrivet beslöts att lägga till räknedelen. Genom att helt enkelt lägga till dessa nya rader i slutet av programmet, med radnummer som passar in mellan befintliga rader, var det enkelt att modifiera programmet. [4.7] DITT KAST Följande program simulerar kast med 2 tärningar. Du kan använda det som det är eller som del i ett större program. 5 PRINT "VILL DU PRÖVA LYCKAN?" 10 PRINT "RÖD TÄRNING =";INT(6*RND(1))+1 20 PRINT "VIT TÄRNING =";INT(6*RND(1))+1 30 PRINT "TRYCK MELLANSLAGSTANGENTEN FÖR NYTT KAST" : PRINT 40 GET A$ : IF A$ = "" THEN 40 50 IF A$ = CHR$(32) THEN 10 Är du beredd att pröva lyckan? Med hjälp av vad du lärt om slumptal och BASIC, se om du kan förstå vad som händer. [4.8] SLUMPMÄSSIG GRAFIK Som en avslutning på slumptal, och som en introduktion till hur man konstruerar grafik, ta och skriv in och kör följande korta program. start tok64 SID53.prg 10 PRINT"{clear}" 20 PRINT CHR$(205.5 + RND(1)); 30 GOTO 20 stop tok64 Som du kanske väntat dig är rad 20 nyckelraden. Ytterligare en ny funktion, CHR$ (teckensträng), getr dig ett tecken, baserat på ett standardiserat kodnummer från 0 till 255. Alla tecken Commodore 64 kan skriva är kodade på detta sätt. Se bilaga F. För att få reda på koden för något tecken, skriv: PRINT ASC("X") där X är det tecken du frågar på. Detta kan vara alla skrivbara tecken, inklusive grafik. Svaret är koden för det tecken du skrev. SOm du antagligen redan räknat ut är "ASC" ännu en funktion, vilken ger tillbaka den standardiserade "ASCII"-koden för det tecken du skrev. Du kan nu skriva ut tecknet genom att skriva: PRINT CHR$(X) Om du skriver: PRINT CHR$(205); CHR$(206) kommer du se de två grafiska tecknen som finns till höger på M- och N-tangenterna. Detta är de två tecken som programmet använder till labyrinten. Genom att använda formeln 205.5+RND(1) använder datorn slumptal mellan 205.5 till 206.5. Detta ger 50% chans att talet är över eller under 206. CHR$ ignorerar decimaldelen av talen så att halva tiden skrivs tecknet med koden 205 ut och den återstående tiden skrivs tecknet med koden 206. Om du vill experimentera med detta program, kan du prova med att ändra 20.5 genom att addera eller subtrahera några tiondelar. Detta kommer att ge endera tecknet en större chans att bli utvalt. [5.] AVANCERADE FÄRG- OCH GRAFIKKOMMANDON * Färg och grafik * PRINTa färger * Färg-CHR$-koder * PEEK och POKE * Skärmgrafik * Fler studsande bollar [5.1] FÄRG OCH GRAFIK Vi har nu utforskat en liten del av den datakraft som Commodore 64 erbjuder. En av datorns mest fascinerande egenskaper är de fina möjligheterna att skapa grafik och färg. Du har redan sett ett enkelt exempel på grafik i programmen "studsande boll" och "labyrint". Dessa program enbart snuddade vid de möjligheter du erbjuds. Ett antal nya begrepp kommer att introduceras i detta kapitel. Dessa kommer att visa grafik och färgprogrammering och hur du kan skapa dina egna spel och animationer. Eftersom vi tidigare koncentrerat oss på datorns beräkningsmöjligheter, har alla bilder vi använt varit i en enda färg (Ijusblå text på mörkblå bakgrund och med ljusblå ram). I detta kapitel ska vi lära oss hur vi sätter färg på våra program och hur vi kontrollerar alla de ovanliga grafiska symbolerna på tangentbordet. [5.2] PRINTa FÄRGER Som du redan upptäckt, om du provade färginställningsförfarandet som beskrevs i kapitel 1, kan du förändra textfärgen genom att trycka ned -tangenten och en av färgtangenterna samtidigt. Detta fungerar bra i direktmode men vad händer om du vill använda detta i ett program? När vi visade "studsande boll"-programmet såg du hur tangentbordets kommandon såsom markörflyttningar kunde användas i PRINT-instruktioner. På liknande sätt kan du också lägga textfärgändringar till ditt program. Du har hela 16 olika färger att arbeta med. Genom att använda -tangenten och en siffertangent blir följande färger möjliga: 1 2 3 4 5 6 7 8 Svart Vit Röd Cyan Purpur Grön Blå Gul Om du trycker ned samtidigt med en siffertangent blir följande färger tillgängliga: 1 2 3 4 5 6 7 8 Orange Brun Lj. röd Grå 1 Grå 2 Lj. grön Lj. blå Grå 3 Skriv NEW och experimentera med följande: Håll ned -tangenten och tryck samtidigt på <1>-tangenten. Tryck därefter på -tangenten utan att hålla ned -tangenten. Håll nu ned och tryck på <2>-tangenten. Släpp upp och tryck på -tangenten. Arbeta dig genom siffrorna omväxlande med bokstäverna och skriv ordet RAINBOW enligt följande: 10 PRINT " R A I N B O W" ^ ^ ^ ^ ^ ^ ^ <1 2 3 4 5 6 7> RUN RAINBOW Precis som markörkontroll visas som ett grafiskt tecken, visas också ett tecken för varje färgändring. När du i det tidigare exemplet höll ned och tryckte på <3> skrevs ett "L" ut. och <7> skrev ut en vänsterpil "<-". Varje färgkontroll kommer att visa sin egen unika grafiska kod när den används på detta sätt. Tabellen visar den grafiska representationen för samtliga färgkontroller som kan påverkas genom PRINT-instruktion. Tangentbord Färg Grafisk kod Tangentbord Färg Grafisk kod <1> Svart <1> Orange <2> Vit [E] <2> Brun <3> Röd [£] <3> Ljusröd <4> Cyan <4> Grå 1 <5> Purpur <5> Grå 2 <6> Grön [^] <6> Ljusgrön <7> Blå [<-] <7> Ljusblå <8> Gul [¶] <8> Grå 3 Även om PRINT-instruktionen ser lite konstig ut på skärmen så visas endast texten när du kör programmet. Och bokstäverna växlar färg i enlighet med de färgkontroll tecken du placerade i PRINT-instruktionen. Prova några egna exempel, blanda vilka färger du vill inom en enda PRINT-instruktion. Kom också ihåg att du kan använda den andra satsen färger genom att trycka ner -tangenten och en siffertangent. TIPS: Du kommer att märka att sedan du kört ett program med färg eller mode (t.ex. revers) för ändring, kommer markören och all följande text du skriver att ha den senast inställda färgen. För att återkomma till normal bild, tryck ned och [5.3] FÄRG CHR$-KODER Tag en snabb titt på bilaga F, och läs sedan vidare här. Du har antagligen lagt märke till när du läste genom listan i bilaga F, att varje färg, (såväl som de flesta andra tangentbordskontroller såsom markörstyrningar mm.), har en unik kod. Dessa koder kan skrivas direkt för att erhålla samma resultat som att skriva CTRL och en lämplig tangent i en PRINT-sats. Prova exempelvis följande: start tok64 SID58A.prg 10 PRINT CHR$(147):REM clr/home 20 PRINT CHR$(30);"chr$(30) andrar mig till ?" stop tok64 Texten ska nu ha blivit grön. I ett flertal fall är det mycket enklare att använda CHR$-funktionen, speciellt om du vill experimentera med att ändra färger. På följande sida beskrivs ett annat sätt att skapa ett spektrum av färger. Då det är ett antal rader som är nästan lika (40-110) kan du använda redigeringstangenterna för att minska skrivarbetet. Se anmärkning efter programlistningen, vilken friskar upp ditt minne med avseende på redigeringsproceduren. NEW start tok64 SID58B.prg 1 REM automatiska fargbalkar 5 PRINTCHR$(147):REM chr$(147)=clr/home 10 PRINT CHR$(18);"{space*6}";:REM revers balkar 20 cl=INT(8*RND(1))+1 30 ON cl GOTO 40,50,60,70,80,90,100,110 40 PRINT CHR$(5);:GOTO 10 50 PRINT CHR$(28);:GOTO 10 60 PRINT CHR$(30);:GOTO 10 70 PRINT CHR$(31);:GOTO 10 80 PRINT CHR$(144);:GOTO 10 90 PRINT CHR$(156);:GOTO 10 100 PRINT CHR$(158);:GOTO 10 110 PRINT CHR$(159);:GOTO 10 stop tok64 Skriv raderna 5 till 40 som vanligt. Skärmen bör se ut så här: 1 REM AUTOMATISKA FÄRGBALKAR 5 PRINTCHR$(147):REM CHR$(147)=CLR/HOME 10 PRINT CHR$(18);" ";:REM REVERS BALKAR 20 CL=INT(8*RND(1))+1 30 ON CL GOTO 40,50,60,70,80,90,100,110 40 PRINT CHR$(5);:GOTO 10 REDIGERlNGSANMÄRKNINGAR Använd markör-upp-tangenten för att styra markören till rad 40. Skriv sedan 5 över 4'an i 40. Använd därefter markör-höger tangenten att flytta över markören till 5 i CHR$-parentesen. Tryck på för att skapa ett utrymme och skriv "28". Nu kan du trycka på med markören var som helst på linjen. Skärmen ska nu se ut så här: 1 REM AUTOMATISKA FÄRGBALKAR 5 PRINTCHR$(147):REM CHR$(147)=CLR/HOME 10 PRINT CHR$(18);" ";:REM REVERS BALKAR 20 CL=INT(8*RND(1))+1 30 ON CL GOTO 40,50,60,70,80,90,100,110 50 PRINT CHR$(28);:GOTO 10 Oroa dig inte! Rad 40 finns fortfarande kvar. LlSTa programmet och se efter. Använd samma procedur och modifiera nedre raden med ett nytt radnummer och CHR$-kod till dess alla återstående rader skrivits in. Du ser nu att redigeringstangenterna visar sig mycket användbara. Som en slutlig kontroll, LlSTa nu programmet och övertyga dig om att samtliga rader skrivits in rätt innan du kör programmet. Nu följer en kort beskrivning av vad som sker. Du har troligen förstått det mesta av färgbalksprogrammet nu, med undantag för det nya och ovana begreppet på rad 30. Men låt oss först se vad programmet verkligen utför. Rad 5 skriver CHR$-koden för CLR/HOME. Rad 10 ändrar till omvänd skrift och skriver 5 mellanrum, vilket visar sig som en balk, eftersom mellanrummen är omvända (har textfärg). Första gången programmet genomlöps blir balken blå, den normala textfärgen. På rad 20 används vår arbetshäst, RND-funktionen, för att slumpmässigt välja en färg mellan 1 och 8. Rad 30 innehåller en variation på IF...THEN kommandot vilket kallas ON...GOTO.ON...GOTO möjliggör för programmet att välja från en tabell av radnummer vart det ska gå. Om variabeln (här CL) har ett värde av 1, väljs det första radnumret (40 i vårt exempel). Om värdet är 2 väljs det andra radnumret i tabellen och så vidare. Raderna 40 till 110 omvandlar våra slumptal för färgval till motsvarande CHR$-kod och återför programmet till rad 10 för utskrift (PRINT) av balk i vald färg. Därefter fortsätter programmet samma förlopp igen. Se om du kan räkna ut hur det kan gå till att skapa 16 olika, slumpmässigt valda färger. Utöka ON...GOTO för att ta hand om dem och lägg till de återstående CHR$-koderna för att visa de återstående 8 färgerna. [5.4] PEEK och POKE Med kommandona PEEK är det möjligt att se efter i datorns minne vad som finns på en bestämd adress och med POKE att lägga in data där. Precis som variabler kunde liknas vid ett antal lådor i datorn där du placerade din information, kan du också tänka dig vissa speciella lådor i datorn vilka representerar en bestämd minnesposition. Commodore 64 undersöker dessa minnespositioner för att se vilka skärmens bakgrund och ramfärger ska vara, vilka tecken som ska skrivas på skärmen och var de ska skrivas samt en mängd andra uppgifter. Genom att placera, POKEa, ett nytt värde i en speciell minnesposition, kan vi ändra färger, definiera och flytta föremål, och även skapa musik. Dessa minnespositioner kan representeras på detta sätt: +-----------+ +-----------+ +-----------+ +-----------+ | 53280 | | 53281 | | 53282 | | 53283 | | X | | Y | | | | | +-----------+ +-----------+ +-----------+ +-----------+ RAMFÄRG BAKGRUNDSFÄRG Ovan visade vi 4 minnespositioner, av vilka 2 kontrollerar skärm- och bakgrundsfärgerna. Pröva skriva in följande: POKE 53281,7 Skärmens bakgrundsfärs har nu ändrats till gul eftersom vi placerade värdet "7" -för gul- i minnespositionen som kontrollerar skärmens bakgrundsfärs. Prova att med hjälp av POKE-kommandot lägga in olika värden i minnespositionen som kontrollerar skärmens bakgrundsfärs. Du kan lägga in vilket som helst värde mellan 0 och 255, men enbart 0 till 15 fungerar. De rätta värdena för respektive färg är: +-----------------------------------------------------------------------+ | 0 Svart 8 Orange | | 1 Vit 9 Brown | | 2 Röd 10 Ljusröd | | 3 Cyan 11 Grå 1 | | 4 Purple 12 Grå 2 | | 5 Grön 13 Ljusgrön | | 6 Blå 14 Ljusblå | | 7 Gul 15 Grå 3 | +-----------------------------------------------------------------------+ Kan du komma på ett sätt att visa de olika bakgrunds- och ramfärgkombinationerna? Följande kan vara till hjälp: NEW start tok64 SID61.prg 10 FOR ba = 0 TO 15 20 FOR bo = 0 TO 15 30 POKE 53280, ba 40 POKE 53281, bo 50 FOR x = 1 TO 2000: NEXT x 60 NEXT bo: NEXT ba stop tok64 Två enkla slingor används för att med hjälp av POKE variera bakgrund och ramfärger. Fördröjningsslingor på rad 50 sänker endast hastigheten. Ta nu och skriv: PEEK (53280) AND 15 Du ska få värdet 15. Detta är det senaste varde ramfärgen fått och det är rätt eftersom både bakgrund och ramfärgen är grå (värde 15) efter det att programmet har körts. Genom att skriva AND 15 elimineras alla andra värden förutom 1-15. Detta beror på det sätt som färgkoderna lagras i datorn. Vanligtvis kan du förvänta dig att finna samma värde som senast "POKEades" in i minnespositionen. PEEK låter oss undersöka en bestämd minnesposition och se vilket värde som för tillfället finns lagrat där. Kan du komma på en extra rad till programmet som visar innehållet i bakgrund och ramfärgsminnena samtidigt som programmet körs? Prova följande: 45 PRINT CHR$(147);"RAM =" ;PEEK(53280) AND 15, "BAKGRUND=";PEEK(53281) AND 15 [5.5] SKÄRMGRAFIK Vid utskrift av information vi hittills arbetat med har datorn behandlat informationen i sekventiell form. Tecken har skrivits efter varandra med början från föregående markörposition. Detta med undantag för då du begärt ny rad eller genom att skriva "," vid PRINT-formattering. För att skriva data på en speciell plats på skärmen kan du starta från en känd punkt och styra markören med hjälp av markörkontrolltecken för att formattera skärmen. Detta kräver emellertid en mängd programsteg och är tidskrävande. På samma sätt som det finns en speciell adress i Commodore 64's minne för färgkontroll, finns det också minnespositioner som du kan använda för att direkt kontrollera varje punkt på skärmen. [5.6] SKÄRMENS MINNESKARTA Då datorns skärm har plats för 1000 tecken (40 kolumner gånger 25 rader) finns det 1000 minnespositioner reserverade för att ta hand om det som skrivs på skärmen. Skärmen är arrangerad som ett rutmönster där varje fyrkant representerar en minnesposition. Då varje minnesposition kan lagra ett tal från 0 till 255, finns det 256 möjliga värden för varje minnesposition. Dessa värden representerar de olika tecken Commodore 64 kan visa. (Se bilaga E). Genom att använda POKE-kommandot kan värdet för ett tecken läggas in i en minnesposition så att tecknet visas på motsvarande plats på skärmen. kolumn 1063 0 10 20 30 39 / +------------------------------------------------------------/ 1024 | | 0 1064 | | 1104 | | 1144 | | 1184 | | 1224 | | 1264 | | 1304 | | 1344 | | 1384 | | 1424 | | 10 1464 | | 1504 | | rad 1544 | | 1584 | | 1624 | | 1664 | | 1704 | | 1744 | | 1784 | | 1824 | | 20 1864 | | 1904 | | 1944 | | 1984 | | 24 +------------------------------------------------------------\ \ 2023 Skärmminnet hos Commodore 64 börjar normalt med minnesposition (adress) 1024 och slutar med adress 2023. Position 1024 är skärmens övre vänstra hörn. Adress 1025 är positionen närmast till höger och så fortsätter det raden ut. Adress 1063 är positionen längst till höger på första raden. Positionen efter sista positionen på en rad är första positionen på raden under. Föreställ dig att du vill kontrollera en studsande boll på skärmen. Bollen är i mitten av skärmen, kolumn 20, rad 12. Formeln för beräkning av minnespositionen är: PUNKT = 1024 + X + 40 * Y ^ ^ kolumn rad Där X är kolumnen och Y är raden. Därför blir minnespositionen för bollen: 1024 + 20 + 480 eller tillsammans 1524 ^ ^ kolumn rad(40*12) Rensa skärmen med och och skriv: POKE 55796, 1 POKE 1524, 81 ^ ^ Position Teckenkod [5.7] FÄRGMINNESKARTA En boll visar sig i mitten av skärmen. Du har placerat ett tecken direkt i skärmminnet utan att använda PRINT-kommandot. Bollen som visade sig var vit. Det finns emellertid ett sätt att ändra färg på ett objekt på skärmen genom att ändra i ett annat minnesområde. Skriv: POKE 55796, 2 ^ ^ Position Färg Bollens färg ändrades till röd. För varje punkt på Commodore 64's skärm finns det två minnespositioner, en för teckenkoden och en för färgkoden. Färgminneskartan börjar vid minnesposition 55296 (övre vänstra hörnet), och fortsätter vidare 1000 positioner till 56295. kolumn 55335 0 10 20 30 39 / +------------------------------------------------------------/ 55296| | 0 55336| | 55376| | 55416| | 55456| | 55496| | 55536| | 55576| | 55616| | 55656| | 55696| | 10 55736| | 55776| | rad 55816| | 55856| | 55896| | 55936| | 55976| | 56016| | 56056| | 56096| | 20 56136| | 56176| | 56216| | 56256| | 24 +------------------------------------------------------------\ 56295 Samma färgkoder från 0 till 15, som vi använde för att ändra ram och bakgrundsfärger, kan användas här för att direkt ändra teckenfärger. Formeln vi använde för att beräkna skärmminnespositioner kan modifieras för att ge färgminnespositioner att användas tillsammans med POKE-kommandot. Den nya formeln lyder: TECKENFÄRG = 55296 + X + 40*Y [5.8] FLER STUDSANDE BOLLAR Här är ett omgjort studsande boll-program som skriver direkt på skärmen med hjälp av POKE-kommandot, till skillnad mot tidigare program som använde markörstyrning genom PRINT-kommandon. Som du kommer att se när du kört programmet, är det mycket mer rörligt, och ger mer levande bilder. start tok64 SID65.prg 10 PRINT"{clear}" 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 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 stop tok64 Rad 10 rensar skärmen och rad 20 ändrar bakgrunden till ljusgrön med gul ram. X och Y variablerna på rad 30 håller rätt på bollens aktuella rad och kolumnposition. Variablerna DX och DY på rad 40 är bollens horisontella och vertikala rörelseriktningar. När + 1 adderas till X värdet, flyttar bollen sig till höger. Om - 1 adderas rör sig bollen åt vänster. Om + 1 adderas till Y flyttas bollen nedåt en rad, - 1 flyttar bollen uppåt en rad. Rad 50 skriver bollen på skärmen i aktuell position. Rad 60 är den gamla bekanta fördröjningsslingan, vilken åstadkommer att bollen stannar på skärmen lagom länge för att synas. Rad 70 raderar bollen genom att ersätta den med ett mellanslag (blanktecken, kod 32) på den plats där bollen var på skärmen. Rad 80 adderar riktningsfaktor till X. Rad 90 testar för att se om bollen nått någon av sidoväggarna och byter riktning om det är en studs. Raderna 100 och 110 gör samma för övre och undre väggarna. Rad 120 styr tillbaka programmet till skärmen för att rita ut bollen igen. Genom att ändra koden på rad 50 från 81 till en annan teckenkod kan du ändra bollen till ett annat tecken. Om du ändrat DX eller DY till 0 studsar bollen rakt istället för diagonalt. Vi kan också göra programmet smartare. Hittills har datorn endast kontrollerat att X och Y värdena inte gått utanför väggarna. Lägg till följande rader till programmet: 21 FOR L = 1 TO 10 25 POKE 1024 + INT(RND(1)*1000), 166 <------------------ CHR$-kod 27 NEXT L 115 IF PEEK(1024 + X + 40 * Y) = 166 THEN DX = -DX : GOTO 80 Raderna 21 till 27 lägger ut 10 fyrkanter i slumpmässigt valda positioner på skärmen. Rad 115 undersöker (PEEKar av) för att se om bollen är på väg att studsa in i en fyrkant, och ändrar i så fall riktning. [6.] SPRITEGRAFIK * Introduktion av sprites * Skapa sprites * Mera information om sprites * Binär aritmetik [6.1] INTRODUKTION AV SPRITES När vi i tidigare kapitel utnyttjade grafik såg vi att grafiska symboler kunde användas i PRINT-kommandon för att animera och göra bildliknande figurer på skärmen. Ett sätt var också att använda POKE-kommandot för att placera ett tecken i en bestämd minnesposition. Att skapa bilder på dessa sätt krävde en stor arbetsinsats eftersom föremålen måste skapas från existerande grafiska symboler. Förflyttning av figurer till en ny position krävde en mängd programsteg. Dessutom, beroende på begränsningen att använda existerande grafiska symboler, blev formen och detaljrikedomen hos figur rama inte alltid så bra som önskat. Användning av sprites i bildavsnitt eliminerar en stor del av dessa problem. En sprits är ett i högupplösning programmerat objekt Figur) som kan göras i önskad form--genom BASIC kommandon. Figuren kan lätt flyttas runt på skärmen genom att enkelt tala om för datorn den position dit den ska flyttas. Datorn tar hand om resten. Sprites kan mycket mer. Deras färger kan ändras; du kan få information om de kolliderar med varandra; de kan programmeras att gå framför och bakom varandra; och de kan lätt fås att ändra storlek. Detta till att börja med! Nackdelarna med allt detta är minimala. Emellertid kräver användande av sprites viss kännedom om hur Commodore 64 arbetar och hur tal behandlas inuti datorn. Det är emellertid inte så komplicerat som det låter. Följ bara exemplen och du kommer ganska snart att få dina egna sprites att Göra fantastiska saker åt dia. [6.2] SKAPA SPRITES Sprites kontrolleras av en speciell bildgenerator i Commodore 64. Denna bildgenerator sköter om vad som visas på skärmen. Den tar hand om allt arbete som fordras för att skapa och hålla ordning på tecken och grafik, skapar färger och flyttar runt figurerna. Denna bildgeneratorkrets har 46 olika TILL/FRÅN positioner vilka fungerar på liknande sätt som invändiga minnespositioner. Vardera av dessa positioner består av 8 celler. Varje cell kan vara TILL eller FRÅN. Vi kommer att behandla detta mer noggrant senare. Genom att med POKE-kommandot lägga in ett lämpligt decimalvärde i en minnesplats kan du kontrollera formen och rörelsen för din sprite-figur. Utöver att vi använder många av bildgeneratorns minnespositioner kommer vi att använda en del av Commodore 64's huvudminne för att lagra information (data) som definierar sprites. Dessutom finns det 8 minnespositioner direkt efter skärmminnet som talar om för datorn var den ska hämta data för respektive sprits. Eftersom vi går igenom några exempel, blir programmeringen ganska okomplicerad och du kommer att förstå hur det går till. Låt oss nu börja med att skapa lite sprite-grafik. En spritefigur är 24 punkter bred och 21 punkter hög. Upp till 8 sprites kan hanteras samtidigt. Sprites visas på skärmen i ett speciellt högupplösningsläge vilken ändrar skärmen till ett 320 punkter brett och 200 punkter högt område. Tänk dig att du vill skapa en ballong och få den att sväva runt på skärmen. Ballongen kan konstrueras i ett rutnät bestående av 24 gånger 21 celler (se nedan). SERIE | SERIE | SERIE 1 | 2 | 3 | | 1 1 1 2631 2631 2631 842684218426842184268421 +------------------------+ 1 |.........#######........| 2 |.......###########......| 3 |......#############.....| 4 |......#####...#####.....| 5 |.....#####.###..####....| 6 |.....#####.###.#####....| 7 |.....#####.###..####....| 8 |......#####...#####.....| 9 |......#############.....| R 10 |......#############.....| A 11 |......#.#########.#.....| D 12 |.......#.#######.#......| 13 |.......#..#####..#......| 14 |........#..###..#.......| 15 |........#..###..#.......| 16 |.........#..#..#........| 17 |.........#..#..#........| 18 |..........#####.........| 19 |..........#####.........| 20 |..........#####.........| 21 |...........###..........| +------------------------+ 1 1 2 2 1 5 0 5 0 4 KOLUMN Nästa steg är att omvandla bilden till data som Commodore 64 kan använda. Tag ett anteckningsblock eller ett rutat papper och rita upp ett rutnät som är 21 rutor högt och 24 rutor brett. I överkanten skriver du 128,64,32,16,8,4,2,1, tre gånger (som bilden visar), över samtliga 24 rutor. Numrera vänstersidan med siffrorna 1--21 för varje rad. Skriv ordet DATA över slutet på raderna. Nu kan du fylla i rutmönstret med någon figur eller använd ballongen som vi har. Det är lättast att rita formen först och sedan gå tillbaka och fylla i rutorna. Om du nu tänker på de rutor du fyller i som "TILL" så ersätt varje fylld ruta med en etta. För de som inte är fyllda, de är "FRÅN", skriv en nolla. Med början på första raden måste du omvandla punkterna i tre separata sektioner av data som datorn kan förstå. Varje sektion om 8 rutor motsvarar en mängd data som kallas en BYTE. Med början från vänster på övre raden är de första 8 rutorna blanka eller nollor, så värdet för den serien av tal är noll. Den mellersta serien ser så här ut (fortfarande motsvarar 1 en fylld ruta, 0 en tom ruta). 128 64 32 16 8 4 2 1 <--värde +-----+-----+-----+-----+-----+-----+-----+-----+ | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <--"ställning" +-----+-----+-----+-----+-----+-----+-----+-----+ ^ ^ ^ ^ ^ ^ ^ ^ +--beräkning | | | | | | | | v 0 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 127 Den tredje serien på första raden innehåller endast blanka rutor så det motsvarar noll. Därför blir data för första raden: DATA 0,127,0 Serien för andra raden beräknas på följande sätt: +-----+-----+-----+-----+-----+-----+-----+-----+ Serie 1: | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +-----+-----+-----+-----+-----+-----+-----+-----+ 1 = 1 +-----+-----+-----+-----+-----+-----+-----+-----+ Serie 2: | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +-----+-----+-----+-----+-----+-----+-----+-----+ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 +-----+-----+-----+-----+-----+-----+-----+-----+ Serie 3: | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | +-----+-----+-----+-----+-----+-----+-----+-----+ ^ ^ | | 128 + 64 = 192 För rad 2 blir data följande: DATA 1,255,192 På samma sätt förfares med de tre serierna av data på vardera av de återstående raderna. De omvandlas till dess decimalvärde. Tag dig tid att göra de återstående raderna i vårt exempel. Nu när du har data för ditt objekt, hur kan du få ut något av det? Skriv följande program och se vad som händer. start tok64 SID71.prg 1 REM ballong-flygning 5 PRINT"{clear}" 10 v=53248:REM start display chip 11 POKEv+21,4:REM start sprite 2 12 POKE 2042,13: REM sprite data fran block 13 20 FOR n = 0 TO 62:READ q:POKE 832+n,q:NEXT 30 FOR x = 0 TO 200 40 POKE v+4,x:REM uppdaterar x koordinaten 50 POKE v+5,x:REM uppdaterar y koordinaten 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,255,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 stop tok64 * för mer info om READ och DATA se kapitel 8 Om du skrivit allt korrekt, flyger din ballong sakta över skärmen:. [Bild på en flygande ballong borttagen] För att du ska förstå vad som hände, behöver du först veta vilka minnespositioner som behövs för bildgeneratorn. Dessa positioner, kallade register, beskrivs nedan: Register Beskrivning 0 X-koordinat för sprite 0 1 Y-koordinat för sprite 0 2-15 Par som 0 och 1 för sprites 1-7 16 Mest signifikanta biten -- X-koordinat 21 Sprite synlig: 1=synlig, 0=osynlig 29 Expandera sprite i "X"-riktningen 23 Expandera sprite i "Y"-riktningen 39-46 Sprite 0 till 7 färgval Utöver denna information behöver du veta från vilken 64 bytes minnessektion varje serie av 8 minnesceller innehållande data för sprites ska hämtas (serie 1 används inte). Dessa data tas om hand av 8 positioner direkt efter skärmminnet: +------+------+------+------+------+------+------+------+ | 2040 | 2041 | 2042 | 2043 | 2044 | 2045 | 2046 | 2047 | +------+------+------+------+------+------+------+------+ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | SPRITE 0 1 2 3 4 5 6 7 Låt oss nu beskriva den exakta proceduren för att komma igång och slutligen skriva ett program. Det krävs endast ett fåtal steg för att skapa och flytta runt ett objekt (en sprite). 1. Genom använda POKE-kommandot i register 21 kan du få önskad(e) spriters) att bli synliga. 2. Sätt sprite-pekaren (position 2040-2047) att peka ut varifrån data för aktuell sprite ska hämtas. 3. POKEa in aktuella sprite-data i minnet. 4. Med hjälp av en slinga uppdateras X- och Y-koordinaterna så att objektet rör sig. 5. Du kan, efter önskemål, expandera objektet, byta färg eller utföra olika specialfunktioner. Register 29 används för att expandera i X-led och register 23 i Y-led. Nu återstår endast några få punkter i programmet som du inte bekantat dig med i den genomgång vi hittills gjort. På rad 10; V = 53248 sätter V till starten på videokretsens minnesadresser. På detta sätt ökar vi enbart V med registernumret så får vi den verkliga minnesadressen. Registernumren är de som gavs i registertabellen ovan. På rad 11; POKE V + 21,4 gör sprite 2 synlig genom att placera värdet 4 i vad som kallas enable-register (21). Se det på följande sätt: SPRITES Decimalvärde för varje spritenummer 128 64 32 16 8 4 2 1 Spritenummer 7 6 5 4 3 2 1 0 +-------+-------+-------+-------+-------+-------+-------+-------+ 21 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | = 4 +-------+-------+-------+-------+-------+-------+-------+-------+ ^ | Sätt en etta för den sprite(s) du önskar Varje sprite representeras i register 21 av spriteminnet och 4 motsvarar där sprite nummer 2. Om du skulle använda sprite nummer 3 borde du sätta en 1 i minnescellen för sprite 3 vilket görs med värdet 8. Om du samtidigt vill använda sprites 2 och 3 måste du sätta en etta i cellen för respektive sprites. Värdet som ska läggas in i registret blir då 4 + 8 = 12. Du lägger alltså samman decimalvärdena på samma satt som du gjorde med DATA på det rutade papperet tidigare. Starta sprites 2 och 3 kan alltså skrivas V+21,12. På rad 12; POKE 2042,13 instruerar datorn att hämta data till sprite 2 (position 2042) från minnesområde 13. Som du minns från det du gjorde dina sprites, behövs det 63 bytes (minnessektioner) för att lagra dess data. Du kanske inte lade märke till det men de siffror du skrev över rutmonstret motsvarar 3 byte (ord) för datorn. Med andra ord; vardera samling av följande tal, 128,64,32,16,8,4,2,1 motsvarar 1 byte av datorns minne. Med 21 rader med 3 bytes vardera behöver varje sprite 63 bytes. 20 FOR N = 0 TO 62 : READ Q : POKE 832+N, Q : NEXT ^ ^ | | +---------------+------- 1 byte Denna rad tar hand om data på din sprite. De 63 bytes med data som representerade den sprite du skapade läses nu in i det trettonde minnesblocket. Detta startar på adress 832. 30 FOR X = 0 TO 200 40 POKE V+4, X <---- Sprite 2'S X-koordinat 50 POKE V+5, X <---- Sprite 2's Y-koordinat Som du kommer ihåg från skolan så representerar X-koordinaten ett objekts horisontella rörelse över skärmen och Y-koordinaten representerar spritens vertikala rörelse på skärmen. Då värdet på X förändras på rad 30 från 0 till 300 (en siffra i taget) flyttar sig spriten nedåt mot häger ett steg för varje siffra. Siffrorna läses av datorn tillräckligt snabbt för att uppfattas som en kontinuerlig rörelse, istället för ett steg i taget. Om du behöver fler detaljer kan du se efter på registerkartan i bilaga O. När det handlar om att samtidigt flytta ett flertal objekt, skulle det vara omöjligt för en minnessektion att uppdatera positionerna för alla 8 objekten. Därför har varje sprite sin egen uppsättning av 2 bytes för att styra objekten över skärmen. Rad 70 startar om programmet efter objektet passerat skärmen en gång. Det återstående av programmet är data för ballongen. Det ser verkligen annorlunda ut på skärmen eller hur? Prova nu att lägga till följande rad: 25 POKE V + 23,4: POKE V + 29,4: REM EXPANDERA och kör programmet igen. Ballongen har expanderat till dubbel storlek! Vad vi gjorde var enkelt. Genom att POKEa 4 (för att indikera sprite 2) i registren 23 och 29 expanderades sprite 2 i X och Y-led. Det är viktigt att lägga märke till att objektet startar i övre vänstra hörnet. När ett objekt expanderas i endera riktningen förblir startpunkten densamma. För ytterligare prov lägg till följande rader: 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 andra sprite (nummer tre) har nu startats genom att vi POKEat 12 i den minnesposition som ger objekt synliga (V+21).12 startar sprites 3 och 2 (00001100 = 12). De nya raderna 45 och 55 flyttar kring sprite 3 genom att POKEa värden i sprite 3's register för X- och Y-koordinater (V + 6 och V + 7). Vill du fylla himlen med ännu mer? Lägg då till följande: 11 POKE V+21, 28 <-- 28 är i verkligheten 4(sprite 2) + 8(sprite 3) + 16 (sprite 4) 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 på rad 11 görs denna gång ytterligare en sprite (4) synlig genom att vi POKEar 28 in i enable registret. Nu är sprites 2,3 och 4 till (00011100 = 28). Rad 12 indikerar att sprite 4 ska hämta sina data från samma minnesområde (den 13de 63 bytessektionen) som de andra objekten. Detta sker genom POKE 2044,13 På rad 25 expanderas sprite 2 och 3 genom att POKEa 12 (sprite 2 och 3) i X och Y minnena för expansionsriktningen (V + 23 och V + 29). Rad 48 flyttar sprite 3 längs X-axeln. Rad 58 placerar sprite 3 halvvägs ned på skärmen, till plats 100. Eftersom detta värde inte ändras, som det gjorde tidigare med X = 1 TO 200 flyttar sig sprite 3 enbart horisontellt. [6.3] MERA INFORMATION OM SPRITES Nu när du experimenterat med sprites kan ytterligare information lämnas. Du kan ändra objektens färg till vilken som helst av de tillgängliga 16 standardfärgerna. Detta sker med hjälp av de färgkoder (0 till 1 5) som vi använde för att ändra teckenfärg tidigare. Dessa kan du hitta i kapitel 5 eller bilaga G. Om du exempelvis vill ändra sprite 1 till ljusgrön, skriv: POKE V + 40, 13 (kom ihåg att sätta V = 53248). Du kanske lade märke till när du körde programexemplet för sprites att objekten aldrig flyttades till den högra kanten på skärmen. Detta berodde på att skärmen är 320 punkter bred och X-riktningsregistret kan endast lagra värden upp till 255. Hur kan man då få objekt att röra sig över hela skammen? Det finns en plats i minneskartan som inte omnämnts ännu. Register 16 (i minneskartan) kontrollerar något som kallas den mest signifikanta biten (MSB) för sprites X-koordinat. Detta ger dig möjlighet att flytta till en horisontell punkt mellan 256 och 320. Den mest signifikanta biten (MSB) i X registret fungerar enligt följande: det att objektet har flyttats till X positionen 255, placeras ett värde i register 16 som representerar den sprite du vill flytta. Om du exempelvis vill flytta sprite 2 till en X-position mellan 255 och 1 320. POKEa värdet för sprite 2, vilket är 4, in i register 16. POKE V + 16,4 Nu kan du börja förflyttningen i det vanliga registret för X-riktningen för sprite 2 (vilket är register 4) med början på 1 igen. Eftersom du endast ska flytta ytterligare 64 steg, kommer X-värdet endast att variera mellan 0 och 63 denna gång. Hela denna idé beskrivs bäst med en version av originalprogrammet: 10 V = 53248 : POKE V+21, 4 : POKE 2042, 13 20 FOR N = 0 TO 62 : READ Q : POKE 832+N, Q : NEXT 25 POKE V+5, 100 30 FOR X = 0 TO 255 40 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 Rad 60 sätter MSB för sprite 2. Rad 70 börjar på nytt ändra i det vanliga X-riktningsregistret, vilket gör att objektet flyttas den återstående vägen över skärmen. Rad 100 är viktig eftersom den stänger av den mest signifikanta biten så att objektet kan starta från skärmens vänsterkant på nytt. For att definiera flera sprites, kan du behöva ytterligare block för sprite data. Du kan använda en del av BASIC RAM genom att flytta BASIC. Innan du skriver eller läser in ditt program skriv: POKE 44,16:POKE16*256,0:NEW Nu kan du använda block 32 till 41 (adress 2048 till 4095) för lagring av spritedata. [6.4] BINÄR ARITMETIK Det är utanför avsikten med denna bruksanvisning att i detalj beskriva hur datorn behandlar tal. Vi kommer emellertid att ge dig en tillräcklig introduktion för att förstå hur det går till och för att ge dig möjlighet att gå vidare med kvalificerad animering. Men innan dess måste vi definiera några termer: BIT--Detta är den minsta mängd information en dator kan lagra. Jämför en BIT med en omkopplare som är antingen "TILL" eller "FRÅN". När en BIT är "TILL" har den värdet 1; när den är "FRÅN" har den värdet 0. Efter BIT är nästa storhet BYTE. BYTE--Detta definieras som en följd av BITar. Då en BYTE är uppbyggd av 8 BITar, kan du i verkligheten ha totalt 256 olika kombinationer av BITar. Med andra ord, du kan ha alla BlTar "från" och då ser din BYTE ut så här: 128 64 32 16 8 4 2 1 +-------+-------+-------+-------+-------+-------+-------+-------+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +-------+-------+-------+-------+-------+-------+-------+-------+ och dess värde är 0. Alla BIT's "till" är: 128 64 32 16 8 4 2 1 +-------+-------+-------+-------+-------+-------+-------+-------+ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +-------+-------+-------+-------+-------+-------+-------+-------+ vilket är 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255. Nästa storhet kallas REGISTER. REGISTER--Definieras som en samling av sammanhängande BYTES. Men i detta fall är varje REGISTER endast 1 BYTE långt. En serie av REGISTER bildar en REGISTERKARTA. REGISTERKARTOR är kartor av den typ du använde när du gjorde din ballong. Varje REGISTER kontrollerar olika funktioner. Det som används att göra sprit