16 Voor de 64

225

description

Programmas voor de Commodore 64

Transcript of 16 Voor de 64

Page 1: 16 Voor de 64
Page 2: 16 Voor de 64

o

HOLT,RINEHART ANDWINSTON London - New York - Sydney - Toronto

Page 3: 16 Voor de 64

Holt, Rinehart and Winston Ltd: 1 St. Anne's Road

ISBN 0-03-910666-7

Eastboume, East Sussex BN21 3 UN United Kingdom

Distributie: Roodveldt Import Sarphatistraat 25, Amsterdam en Centraal Boekhuis, Culemborg

Originele editie uitgegeven door Compute! USA onder de titel: Compute!'s Second B ook of Commodore 64 en Compute!'s Third Book of Commodore 64

Copyright 1985 Holt, Rinehart and Winston Ltd.

Niets uit deze uitgave mag worden vermenigvuldigd en of openbaar gemaakt worden door middel van druk, fotokopie, microfilm, geluidsband of op welke andere wijze dan ook zonder voorafgaande schriftelijke toestemming van de uitgever.

Page 4: 16 Voor de 64

INHOUDSOPGA VE

Speedscript Charles Brannon

Calculatieblad Michael Tinglof

Scherm 80 Gregg Peele en Kevin Martin

Schermkoppen Todd Heimarck

Stamboom Mark Haney

Supertank Boris Litninsky

Lichtkrant Robert F. Lambiase

Superbasic Martin C. Kees

Stijlvol basic Jim Butterfield

Opslag variabelen Pete Marikle

Beter Leesbare Listings Brent Dubach

Reddingsbrigade Vern Buis

Kopie bestand Gregor Larson

Programmeren zonder toetsenbord George Leotti

Disk dokter Gerald E. Sanders

Samenvoegen van programma's John A. Winnie

Bijlage A: Introductie tot het intikken van programma's

Bijlage B: Het intikken van programma's

Bijlage C: De automatische controleur Charles Brannon

Bijlage D: Machinetaal redacteur Charles Brannon

7

41

53

79

85

97

107

113

145

151

161

167

171

175

189

201

203

207

211

217

Page 5: 16 Voor de 64
Page 6: 16 Voor de 64

SPEEDSCRIPT

Charles Brannon

Speedscript' is een volledig in machinetaal geschreven tekstverwerkend programma. Het programma is snel, krachtig en zoals dat heet 'gebruikersvriendelijk'. Alle belangrijke funkties die in professionele tekstverwerkende programma's voor thuiscomputers voorkomen, zult u in speedscript terug vinden. Het verschil met commerciele programma's van over de FI. 200,- is minimaal. Het programma laat maar liefst 45 Kbyte aan geheugenruimte over voor uw teksten. Met speedscript heeft u nog meer plezier van uw computer.

Op het ogenblik kunt u in verschillende tijdschriften een advertentie lezen, die de fantastische eigenschappen van een balpen aanprijst. Het schrift van de pen kan worden uitgegumd, waardoor de pen de perfecte 'draagbare, persoonlijke tekstverwerker' is. De pen kan zelfs grafieken tekenen. Als een tekstverwerker kan de pen redigeren, veranderen en worden gevlakt. Zonder enige hapering produceert de pen teksten op papier. En, inderdaad, u kunt cirkels, vierkanten en staafdiagrammen tekenen. Maar kan de pen ook complete alinea's verplaatsen? Kan de pen een boek van 100 bladzijden op een enkele diskette plaatsen? Kan de pen een ruw manuscript in een uiteindelijke versie veranderen met slechts een paar veranderingen? En is het echt zo dat de pen verbeteringen aan kan brengen zonder sporen achter te laten en vervolgens uitgelijnde, extra geinterlieerde en van automatische bladzijdenummering voorziene tekst kan leveren? Misschien doen we de uitwisbare pen niet voldoende eer aan, maar we wilden even duidelijk stellen dat een tekstverwerker meer is dan een gecomputeriseerde schrijfmachine. Als u zo'n tekstverwerker wilt gebruiken, kunt u volstaan met de volgende regels in te tikken: 10 OPEN 1,4 20 INPUT A$ 30 PRINT #l,A$ 40 GOTO 20 Als u dit programma runt, ziet u een knipperende cursor, die op een regel tekst wacht. Zodra u op RETURN drukt, wordt de regel met tekst naar de printer gestuurd. Zolang u niet op RETURN gedrukt heeft, kunt u de cursor naar links en rechts verplaatsen en fouten verbeteren, door over de foutieve lettertekens heen te tikken, of hen te verwijderen met de DEL-toets. Maar zodra de printer de tekst op papier zet, kunt u er niets meer aan doen. Veranderingen kunnen dan niet meer aangebracht worden. Met een echte tekstverwerker tikt u eerst alles in, om vervolgens de hele tekst in een keer af te laten drukken. Voordat de tekst wordt afgedrukt, kunt u net zoveel verbeteringen aanbrengen als u wilt. Een goede tekstverwerker biedt u de mogelijkheid om elke regel te veranderen, alinea's te verplaatsen en de tekst op nog vele andere manieren te manipuleren. Afhankelijk van de mogelijkheden kosten zulke tekstverwerkers voor de 64 tussen de Fl.100,­en Fl.500,-. U kunt natuurlijk ook 'speedscript' intikken. Zelfs als u al een commercieele tekstverwerker voor uw 64 heeft, zult u aangenaam verrast zijn. Speedscript biedt alle normale funkties, plus een stel die u nog niet eerder heeft gezien.

7

Page 7: 16 Voor de 64

Intikken van Speedscript Om te beginnen, moet u Speedscript intikken. De programma's 1 en 2 zien er dan wel lang uit, maar ze zijn slechts ongeveer 4 1/2 Kb lang. Dat is korter dan de meeste BASIC-spelletjes. De grote hoeveelheid getallen vormen de machinetaal. Alleen door machinetaal kan het programma zo krachtig, snel en compact zijn. Helaas is machinetaal minder gemakkelijk in te tikken als een BASIC-programma. Om bij het intikken te helpen, hebben we MTR ,de machinetaal-redacteur, ontwikkeld. Lees eerst bijlage D, voordat u met het intikken van Speedscript begint. Tik het MTR-programma in, en sla het programma op ('save' het programma). Als u klaar zit om Speedscript in te voeren, zet u de computer uit en weer aan (hiermee wist u alle nog aanwezige gegevens uit het geheugen), en tikt u, voor het laden van MTR: POKE 44,33:POKE 8448,O:NEW Nu kunt u MTR van cassette of diskette laden en RUN invoeren. MTR vraagt om een begin­en eindadres. Het begin adres is het eerste getal in de listing; 2049. Het eindadres is het laatste getal plus vijf; 8204. Nadat u dit gedaan heeft, kunt u de instructies in bijlage 1 volgen om de listing in te tikken. U zult niet meer dan een paar uur nodig hebben. U kunt telkens stoppen, uw werk saven en later verder gaan met intikken. Ook als u niet zo heel snel tikt, kunt u ervan verzekerd zijn, dat het resultaat de moeite meer dan waard is.

Het begin Nadat u Speedscript door middel van MTR heeft ingetikt, kunt u het programma LOADen als een normaal BASIC-programma. U kunt er ook kopieen van maken door de SAVE-opdracht (SAVE" SPEED SCRIPT" of SAVE" SPEEDSCRIPT" ,8 voor diskette). N a het LOADen, kunt u de opdracht RUN geven. Het scherm wordt licht-grijs of wit met letters in zwart of donker-grijs. De bovenste regel van het scherm wordt extra benadrukt. De knipperende cursor geeft aan waar de tekst zal verschijnen als u begint met tikken. Op de bovenste regel van het scherm kunt u niets intikken. Deze regel is het zogenaamde opdrachtenvenster. Dit opdrachtenvenster wordt door Speedscript gebruikt om vragen te stellen en berichten door te geven. Een bericht zal telkens blijven staan, totdat u weer met tikken begint. Om aan de slag te kunnen, begint u gewoon met het intikken van een tekst. Als een ingetikt woord niet op de regel past, worden zowel het woord als de cursor naar de volgende regel verplaatst. Op deze wijze is uw tekst op het scherm veel gemakkelijker te lezen; woorden worden nooit afgebroken. Elke keer als u op RETURN drukt, verschijnt een naar links gerichte pijl. Deze pijl geeft het einde van een alinea aan. U hoeft niet telkens als u aan de einde van een regel bent, op RETURN te drukken. Door het doorschuiven van woorden die te lang zijn, naar de volgende regel, is het voldoende om aan het einde van de alinea op RETURN te drukken. Dit in tegenstelling tot een schrijfmachine, waar u aan het einde van elke regel op een knop moet drukken. Weinig mensen zijn onfeilbaar, dus de kans is groot dat u zo nu en dan een vergissing bij het intikken zult maken. Hierbij komt een van de grote voordelen van een tekstverwerker om de hoek kijken. U kunt uw fouten verbeteren voordat u de tekst op papier afdrukt, waardoor u geen last heeft van gerommel met witte vloeistoffen, speciale kalkpapiertjes of een speciaal schrijfmachinelint (te bedenken dat ook wij vroeger verbeteringen verwijderden met in de hand een kwastie, bah!). Als u een positie naar links wilt, drukt u op INST/DEL, terwijl de computer niet op SHIFT staat. De cursor gaat dan een plaats naar links en verwijdert de laatste getikte letter. U kunt

8

Page 8: 16 Voor de 64

deze toets net zo vaak intikken als u wilt, waarna u dit gedeelte van de tekst opnieuw kunt intikken. Deze manier van fouten verbeteren is alleen geschikt voor fouten die u snel na het maken ontdekt, en die niet al te fout zijn. U kunt de cursor ook vrijelijk over het scherm verplaatsen, zonder dat dit ten koste gaat van de ingetikte tekst. De toetsen waarmee de cursor wordt bestuurd, vindt u in de rechter benedenhoek van het toetsenbord (zie ook figuur 1: kaart van het toetsenbord). CRSR links/rechts verplaatst de cursor naar rechts. Samen met SHIFT, wordt de cursor naar links verplaatst. Voordat u een fout kunt verbeteren, moet u de cursor verplaatsen naar het foutieve woord. Stel dat de volgende zin verbeterd moet worden. Nu moeren alle mannen De cursor wordt naar de 'r' verplaatst (15 maal cursor links): Nu moeren alle mannen De letter 't' wordt getikt: Nu moeten alle mannen En de cursor wordt weer naar het einde van de regel verplaatst: Nu moeten alle mannen Ga nu gewoon verder met tikken: Nu moeten alle mannen Hun vaderland tee hulp komen. Weer een fout! We tikten 'tee' in plaats van 'te'. Geen probleem. U hoeft in het genoemde voorbeeld natuurlijk niet de hele tijd de cursor-links toets opnieuw in te drukken. Als u de toets ingedrukt houdt, zal deze zichzelf herhalen.

Nederlandse cursor besturing U kunt de cursor ook op een meer efficiente en op het Nederlands gerichte wijze verplaatsen. Als u bijvoorbeeld de SHIFT-toets indrukt en tegelijk de f1 funktietoets indrukt (waardoor u f2 krijgt), springt de cursor terug naar het begin van het vorige woord. Om de fout in het laatste voorbeeld te verbeteren, drukt u drie keer op f2. Door na het verbeteren drie keer op f1 te drukken, bent u weer aan het einde van de zin. Hier volgt een lijst van alle funkties van de funktietoetsen. f1: Cursor naar volgende woord f2: Cursor naar vorige woord f3: Cursor naar begin van volgende zin f4: Cursor naar begin van vorige zin f5: Cursor naar de volgende alinea f6: Cursor naar begin van vorige alinea. Speedscript herkent een zin door een afsluitend leesteken (. of? of !), of door een RETURN-teken (pijl naar links). Een alinea is voor de computer een willekeurige verzameling lettertekens die eindigt met een RETURN teken (zie figuur 2 voor een knip-uit funktietoets-tabel). Omdat u niet zo maar wat tekst intikt, maar met Nederlands (of een andere taal) werkt, verplaatsen de cursor-omhoog en -omlaag toetsen de cursor niet een regel naar boven of beneden, maar werken ze als f3 en f4. Cursor-omlaag verplaatst de cursor naar de volgende regel. Cursor-omhoog verplaatst de cursor naar de vorige regel. Het werkt sneller, maar sommige mensen moeten er even aan wennen. Als u voor het eerst met de cursor gaat werken, zult u merken dat u de cursor niet verder kunt verplaatsen, dan het einde van de tekst. Achter de tekst staat een onzichtbaar merkteken dat soms 'einde van bestand' (=End Of File, EOF) genoemd wordt. U kunt aan het einde van het

9

Page 9: 16 Voor de 64

bestand wel nieuwe tekst toevoegen, maar u kunt de cursor niet voorbij dit teken verplaatsen. Heel soms kan het voorkomen dat u na het eindpunt van de tekst, nog andere tekst ziet staan. U kunt daar met de cursor niet komen. U kunt deze teksten negeren. De meeste andere toetsen werken zoals u zult verwachten. De CLRJHOME-toets verplaatst zonder de SHIFT de cursor naar de linker bovenhoek van het scherm. Als u deze twee keer indrukt, komt de cursor aan het begin van uw tekst te staan (voor die gevallen waarin uw tekst langer is dan een heel scherm vol). De invoeg toets (SHIFT-INST/DEL) voegt een spatie in op de cursorpositie. U kunt deze toets net zo vaak als u wilt indrukken om ruimte te maken voor een tussen te voegen woord. U kunt ook in de invoeg modus gaan, waardoor elke door u ingetikte letter automatisch ingevoegd wordt. In de invoegmodus is het niet mogelijk om over andere tekst heen te tikken. U komt in de invoegmodus door CTRL-I in te drukken. Deze combinatie nog een keer ingedrukt, zorgt ervoor dat u de invoeg-modus weer verlaat. Normaal gesproken verschijnt elk ingetikt letterteken op het scherm. Sommige toetsen vervullen echter een bepaalde funktie. Speedscript heeft dit principe verder uitgewerkt; alle opdrachttoetsen zijn in een eenvoudig te onthouden volgorde gezet. Zo is bijvoorbeeld de invoegtnodus te bereiken en te verlaten door het indrukken van CTRL-I (om de ConTRoL-toets te gebruiken, drukt u deze toets in en houdt u deze ingedrukt, terwijl u een andere toets indrukt). Als u in de invoegmodus gaat werken, krijgt het opdrachtenvenster een andere kleur, om u te helpen herinneren aan de invoegmodus. Als u nogmaals op CTRL-I drukt, keert u weer terug naar de normale modus, waarin over lettertekens heen getikt kan worden. Het opdrachtenvenster keert weer terug naar de normale kleur. CTRL-Z verplaatst de cursor naar het einde van uw tekst (einde van het bestand). U kunt deze funktie goed gebruiken om snel het punt te bereiken waar u verder kunt gaan met het toevoegen van tekst. Als u wilt we ten hoeveel geheugenruimte u nog voor nieuwe tekst heeft, drukt u op CTRL en de gelijkheidstoets (=). Bij het begin heeft u de beschikking over ongeveer 42 Kbytes. Speedscript maakt optimaal gebruik van de RAM-ruimte van de 64. Om de beeldschermweergave aan te passen aan uw persoonlijke smaak, kunt u de kleuren van het scherm en de lettertekens in elke gewenste combinatie veranderen. CTRL-B (van Beeld) verandert de schermkleur. U kunt deze toetsen blijven indrukken tot de gewenste kleur verschijnt. CTRL-L (van Lettertekens) verandert de kleur van de lettertekens. Als u de beschikking heeft over een kleurenmonitor, kunt u tot zeer interessante combinaties komen. De RUN/STOP-toets is vergelijkbaar met de TAB-toets. Er worden vijf spaties tussengevoegd op de plaats van de cursor. U kunt deze toets gebruiken om tabellen te maken, of om alinea's te laten inspringen. Als u een kleine letter in een hoofdletter wilt zetten (onderkast zetten) of een hoofdletter in een kleine letter wilt veranderen (niet-kapitaal zetten), plaatst u de cursor op de betreffende letter, en drukt u op CTRL-A. Dit geldt in beide richtingen. De cursor verplaatst zich na het veranderen van de letter naar rechts. U kunt de toets ingedrukt houden om meer dan een letter

te veranderen in kapitaal of juist niet-kapitaal. Een andere handige opdracht is CTRL-X. Deze opdracht wisselt twee op elkaar volgende letters om. De fout die ik het meetse (meeste) bega, is het omdraaien van twee letters als ik erg snel tik. Met CTRL-X kunt u twee letter eenvoudig omdraaien, zonder de letters over te tikken (hetgeen bijvoorbeeld niet eens kan als u zich in de invoegmodus bevindt).

10

Page 10: 16 Voor de 64

Tekst verwijderen Als u met een schrijfmachine werkt en de ingetikte tekst bevalt u niet, doet u een graai, haalt u het papier uit de schrijfmachine, een snelle beweging tot een prop, en even basketballen. Met een tekstverwerker kunt u deze heerlijke daad verrichten met het indrukken van een paar toetsen. Met de DEL-toets kunt u de laatste ingetikte letter verwijderen. Als u de toets midden in een tekst gebruikt, zult u zien dat het letterteken waar de cursor zich bevindt, over het letterteken links ervan wordt geplaatst, en de tekst rechts van de cursor een plaats naar links wordt verschoven. Het klinkt ingewikkeld, maar het is eenvoudig. Bekijk het volgende zinnetie, dat altijd wordt gebruikt om alle letters van een schrijfmachine uit te testen: The quick brown fox juunmped over De cursor wordt naar de fout verplaatst: The quick brown fox juunmped over DEL wordt twee keer ingedrukt, waarbij de foute lettertekens verwijderd worden: The quick brown fox juumped over The quick brown fox jumped over Als u de tekst niet wilt verplaatsen, kunt u de pijl-terug-toets gebruiken. De cursor gaat een positie terug, het vorige letterteken wordt verwijderd en de tekst wordt niet verschoven. U kunt ook tekst rechts van de cursor verwijderen. Daarvoor gebruikt u CTRL-pijl-terug. De cursor verplaatst zich niet, maar de tekst rechts van de cursor wordt weggehaald. De curSor gedraagt zich als een soort 'zwart gat'. Als u een heel woord, zin of alinea wilt verwijderen, kunt u een drastischer methode gebruiken: CTRL-E. Als u deze combinatie intikt, verandert het opdrachtenvenster in rood (ter waarschuwing en afschrikking). U ziet in het venster de vraag: Verwijder (Z,W,P): Stop met RETURN U kunt nu uit drie toetsen kiezen. De Z verwijdert een hele zin. De W van word (woord) verwijdert een woord. De P van paragraaf (alinea) verwijdert maar liefst een hele alinea. U kunt dit net zo lang herhalen tot alle tekst die weg moest, verwijderd is. Tik nu RETURN, waardoor u de verwijder-funktie verlaat en weer terugkeert naar de gewone funkties, en ga verder met tikken. De verwijder-funktie verwijdert de tekst rechts van de cursor. Als u de tekst links van de cursor wilt verwijderen kunt u CTRL-D gebruiken. Nu krijgt u de melding: WISSEN (Z,W,P) Deze funktie keert terug naar de normale modus zodra u iets heeft verwijderd. Wat gebeurt er als u een toets te veel indrukt in de verwijdermodus? Wat moet u als u van gedachten verandert? En welke ramp heeft er plaatsgevonden als u per ongeluk de verkeerde alinea heeft gewist? Met de meeste tekstverwerkers heeft u pech: opnieuw intikken. Maar met Speedscript kunt u de 'prop' uit de prullenmand halen en weer uitvouwen en gladstrijken. Binnen bepaalde grenzen, onthoudt Speedscript welke tekst u heeft uitgewist. Als u van gedachten verandert, tikt u gewoon CTRL-R. Het werkt als volgt. Als u tekst verwijdert, wordt de tekst van het scherm naar een speciaal geheugengebied, dat als buffer dienst doet, verplaatst. Speedscript kan maximaal 12 Kbyte in deze buffer kwijt. Er is nog een funktie voor de buffer. U kunt stukken tekst verplaatsen door ze naar de buffer te brengen, en de tekst vervolgens op een andere plaats weer uit de buffer te halen. U wist de alinea, zin of woord met de verwijder-funktie. Vervolgens plaatst u de cursor op de plaats waar u de tekst wilt hebben, en drukt u op CTRL-R (van Re-animatie). De tekst wordt er flitsend snel tussen gevoegd. U kunt de tekst ook kopieren in plaats van verplaatsen. Daarvoor verwijdert u de tekst eerst. Dan haalt u met C1RL-R de tekst terug op de plaats waar deze stond. Nu plaatst u de cursor op de positie waar de kopie moet komen. Tik weer

11

Page 11: 16 Voor de 64

CTRL-R en een kopie verschijnt. U kunt de inhoud van de buffer zo vaak gebruiken als u wilt. Zo kunt u een lang woord, of een verzameling woorden, die u vaak gebruikt, een keer intikken en door de verwijder-funktie in de buffer plaatsen. Telkens als u de tekst nodig heeft, tikt u CTRL-R. De funkties CTRL-E en CTRL-D wissen de inhoud van de buffer. Telkens als u een nieuw stuk tekst wist, wordt de vorige tekst in de buffer verwijderd. Dat is nodig omdat u met CTRL-E anders 'gemengde' tekst zou krijgen, en met CTRL-D, die 'achteruit' tekst verwijdert, zou u verwisselde tekst krijgen. Als u twee of meer alinea's tegelijk wilt verplaatsen, kunt u de computer opdragen om de buffer niet te wissen als er nieuwe tekst in de buffer geplaatst wordt. CTRL-E voegt de laatste tekst toe aan het einde van de vorige tekst. U moet daarvoor SHIFT en CTRL samen indrukken als u de E indrukt. Om de buffer te wissen, kunt u CTRL-K (van Kaal) gebruiken. Als u meer tekst probeert te verwijderen of verplaatsen dan in de buffer past (12 K op de 64), krijgt u de melding 'Buffer vol'. Stop en verplaats de cursor, of gebruik CTRL-K om de buffer eerst te legen (niet gebruiken bij verplaatsingen of kopieen; probeer dan de tekst in gedeelten te verplaatsen/kopieren). Als u alle tekst wilt verwijderen is er een snelle methode, die als nadeel heeft dat u niet meer terug kunt. Druk op SHIFT-CLR/HOME. U ziet dan: ALLE TEKST WISSEN: Bent u zeker (JIN) Als u echt alle tekst wilt verwijderen, drukt u op J. Elke andere toets, waaronder de N, zorgt ervoor dat de tekst intact blijft. U moet deze opdracht alleen gebruiken als u met een nieuw bestand wilt beginnen. Na het verwijderen met deze opdracht kunt u uw tekst op geen enkele wijze nog terugkrijgen!

Opzoeken en vervangen van tekst Als u midden in een lange tekst zit en u wilt een bepaald woord of zinsnede vinden, kunt u de zoek-opdracht gebruiken. Tik Shift-CTRL-H en u ziet: Zoek naar: Voer het woord of de zinsnede die u wilt vinden in, en druk op RETURN. Speedscript zal het woord opzoeken en de cursor aan het begin van het woord plaatsen. Indien nodig, wordt de tekst doorgerold. Als de zinsnede niet gevonden wordt, ziet u een 'Niet gevonden" boodschap in het opdrachtenvenster. De eerste keer dat u de zoek-funktie gebruikt, zal de computer vanaf het begin van de tekst / waar de cursor staat, naar het woord of de zinsnede zoeken. Door opnieuw op CTRL-H te drukken, wordt gezocht naar de volgende keer dat het woord voorkomt. U kunt doorgaan met zoeken, zonder te wachten op Niet gevonden' door de SHIFT-toets ingedrukt te houden als u CTRL-H indrukt. Als u vanaf het begin wilt zoeken, dan moet u twee maal CLR/HOME INDRUKKEN. Er zijn een paar speciale en handige toepassingen: CTRL-J (vervang) is een aanvulling op CTRL-H. Nadat u met SHIFT-CTRL-H de te zoeken heeft opgegeven, kunt u deze met SHIFT-CTRL-J door een nieuwe laten vervangen. Geeft u echter als antwoord op de vraag een RETURN, dan kunt u de tekst wissen. CTRL-G knoopt CTRL-H en CTRL-J aanelkaar. Het vraagt achtereenvolgens: Zoek naar: en dan Vervang door: Hierna wordt automatisch de hele tekst doorzocht, vanaf de cursor positie. Speedscript vervangt dan de huidige tekst door de nieuwe tekst en maakt ook onderscheid

12

Page 12: 16 Voor de 64

tussen grote en kleine letters. Waarschuwing: u kunt niet stoppen tijdens de uitvoering van de opdracht

Bewaren en laden Het handigste aan een tekstverwerker is dat u de ingetikte tekst kunt opslaan en bewaren op een cassette of diskette. Stel dat u een scriptie schrijft. U tikt het in en savet het op een diskette. Uw docent kijkt de eerste versie door en geeft deze met suggesties voor verbeteringen terug. Zonder de scriptie volledig opnieuw in te tikken, laadt u de tekst vanaf de diskette in het geheugen en brengt u de verbeteringen aan, en drukt u het uiteindelijke resultaat af op een printer. Een normale diskette kan meer tekst bevatten dan een kleine tas! U kunt ook in gedeelten schrijven: sla telkens na een stuk schrijven, uw tekst op en ga er later weer mee aan de slag. Alleen al de mogelijkheid van opslag en later weer laden van complete teksten, maakt een tekstverwerker tot het beste stuk gereedschap dat voor iedereen die schrijft bestaat. Om uw werk te saven, drukt u op f8 (SHIFT-f7). U ziet nu: Save: Tik nu de naam in die u aan uw tekst mee wilt geven. Houd u daarbij aan de gebruikelijke regels voor bestandsnamen, zoals die bij de 64 gelden. Bijvoorbeeld dat de naam niet langer mag zijn dan 16 lettertekens. Druk op RETURN en druk vervolgens op T ofD van Tape of Disk, naar gelang u met cassette (tape) of diskette werkt. Nadat de computer klaar is ziet u (hopelijk) GEEN FOUTEN. Als er iets misgegaan is tijdens het opslaan van de tekst, zoals het ontbreken van de diskette, of het vol raken van de diskette, zal Speedscript kijken wat er waar fout is gegaan en een foutmelding geven. U krijgt de foutmelding 'file exists' (bestand bestaat al), als u een naam gebruikt bij het opslaan, die al op de diskette staat Als u een bestand wenst te vervangen, moet u voor de bestandsnaam de tekens '@:'plaatsen, bijvoorbeeld: '@:Dokument'. Dit zorgt voor een 'sla op met vervanging. U kunt ook CTRL-I (pijl omhoog, zie uitleg hieronder) indrukken om het bestand door te halen, voordat u met opslaan begint. Druk op f7 om een bestand te laden. U kunt SHIFT -CLT/HOME gebruiken om de huidige tekst eerst te wissen. De laad-funktie zal nieuw te laden tekst achter nog aanwezige tekst plaatsen, beginnend op de positie van de cursor. Hierdoor kunt u verschillende tekstbestanden vanaf diskette of cassette met elkaar mengen. Als de cursor zich niet aan de bovenkant van de tekst bevindt, zal het opdrachtenvenster van kleur veranderen, om u te waarschuwen dat u teksten gaat mengen. U moet tekst alleen achter een andere tekst plaatsen, omdat het EOF (einde bestand)-teken aan het einde van de te laden tekst komt te staan. Let op: u kunt Speedscript laten weigeren door een bestand te laden waarvoor niet genoeg ruimte in het geheugen aanwezig is. U kunt CTRL-= gebruiken om de hoeveelheid geheugenruimte van te voren te controleren. 1

CTRL-V (van Verify=controleren) gebruikt u om een al opgeslagen bestand te controleren. CTRL-V werkt net als het laden. In dit geval wordt echter het bestand op de band of de diskette vergeleken met het bestand in het geheugen. Vooral als u cassettes gebruikt, is het handig om na het saven te controleren of uw bestand goed op de cassette staat. Speedscript bestanden verschijnen op de inhoudsopgave als PRG = programmabestanden. De teksten zijn zeker geen bestanden, maar het bedrijfssysteem heeft een zeer handige opslag en laadt routines, die gebruikt zijn om teksten vanuit het geheugen op cassette of diskette te dumpen. Bij het gebruik van cassettes is deze methode tevens betrouwbaarder. Het is mogelijk om bestanden die aangemaakt zijn met andere tekstverwerkers zoals WordPro of PaperClip te laden, maar u zult waarschijnlijk iets aan de indeling moeten doen. Als de kleine- en

13

Page 13: 16 Voor de 64

hoofdletters omgekeerd te voorschijn komen, kunt u CTRL-A tikken om het hele bestand te veranderen.

Andere disk opdrachten Gebruik CTRL-4 (denk aan de $ boven de vier, gebruikt in LOAD "$" ,8 bij BASIC) om naar de inhoudsopgave van de diskette te kijken. De tekst in het geheugen zal niet verloren gaan. Terwijl de inhoudsopgave op het scherm wordt getoond, kunt u CTRL indrukken om de weergave trager te laten verlopen. Om de weergave van de inhoudsopgave helemaal stil te zetten, gebruikt u de spatiebalk. Deze drukt u nogmaals in om de inhoudsopgave verder te zien. U kunt elke andere diskopdracht geven door eerst CTRL-I (pijl omhoog) te tikken. Het is niet zo eenvoudig te onthouden, maar als ezelsbruggetje kunt u zich de pijl voorstellen als een pijl die naar de diskdrive wijst. het opdrachtenvenster laat nu een groter-dan teken zien (». U kunt nu een diskopdracht intikken, gevolgd door RETURN. Sla uw disk-handleiding erop na voor alle mogelijke diskopdrachten als initialiseren, wissen, kopieeren, herbenoemen, etc. Als u op RETURN drukt zonder een diskopdracht te geven, geeft Speedscript de eventueel ontdekte disk-fout weer. (Tabel 1, aan het einde van dit hoofdstuk, is een knip-uit kaart met alle opdrachten)

PRINT! Eindelijk zijn we dan aanbeland bij het uiteindelijke werk van een tekstverwerker: het afdrukken van een tekst. U kunt Speedscript eigenlijk ook wel gebruiken zonder printer. Als u en een vriend(in) allebei een versie van Speedscript hebben, kunt u brieven aan elkaar schrijven op cassette of diskette, klaar om te laden en te lezen. U kunt op een enkele cassette of diskette een heleboel tekst kwijt. Heeft u een vriend met een printer en een 64, dan kunt u uw exemplaar van Speedscript meenemen samen met uw bestanden. Voordat uw tekst kan worden afgedrukt, moet deze eerst worden geformatteerd. De tekst moet worden verdeeld in regels met marges en er moet een methode zijn om de tekst in bladzijden onder te verdelen. Diegenen die gebruik maken van papier met perforatie, moeten rekening houden met het overslaan van de perforatie. Het zou prettig zijn als de bladzijden automatisch van nummers werden voorzien. En zou het niet mogelijk zijn om de computer bepaalde regels te laten centreren of ze rechts uit te laten lijnen? Het moet mogelijk zijn de linker of rechter kantlijn op elk moment te veranderen, en de regelafstand moet regelbaar zijn. Standaardkopjes en teksten onderaan de bladzijden (headers en footers) maken de tekst helemaal fraai. Speedscript kan dit alles en nog veel meer. Maar al deze mogelijkheden zorgen er wel voor dat de gebruiker meer opdrachten moet leren om met Speedscript te kunnen werken. De hier genoemde opdrachten werken niet direct met de tekst, maar bepalen hoe de tekst op papier komt te staan. Sommige opdrachten verzorgen taken als het veranderen van de linker kantlijn, terwijl andere opdrachten u de mogelijkheid bieden om de tekst te manipuleren, zoals centreren van de tekst, of het aanbrengen van onderstrepingen. Vergeet bij al deze opdrachten niet, dat het gebruik van de opdracht niets verandert aan het uiterlijk van de tekst op het scherm. Slechts de harde kopie (afdruk op papier) wordt beinvloed. Het programma heeft bepaalde taken al standaard ingesteld. U kunt daardoor direct aan het afdrukken slaan, zonder eerst allemaal formatteeropdrachten te geven. Als u CTRL-P indrukt, gaat Speedscript van bepaalde vooronderstelingen uit, en begint met afdrukken. Enkele van deze vooronderstellingen zijn: een linkerkantlijn van 5 spaties, de rechterkantlijn op positie 75 (waardoor de regels 70 posities breed worden) en dubbele regelafstand. Als u deze instelling

14

Page 14: 16 Voor de 64

anders wilt hebben, zult u gebruik moeten maken van de formateeropdrachten.

Intikken van formatteeropdrachten De formatteeropdrachten bestaan uit enkele letters of lettertekens die op het scherm in inverse verschijnen (de kleuren zijn omgedraaid). Om een inverse letter te krijgen, drukt u op CTRL en het Engelse pond teken (') vlak naast de CLRJHOME-toets. Het opdrachtenvenster vraagt vervolgens om een opdracht door 'Key:' (=toets:) te laten zien. U kunt nu een van de formatteerletters intikken, bijvoorbeeld 'r' voor rechter kantlijn, of 'c' voor centreren. De letter zal in inverse verschijnen (een hokje waarin de kleuren van letter en achtergrond zijn omgedraaid). Speedscript accepteert alleen kleine letters en enkele symbolen als opdrachten.

Veranderen van printervariabelen Printervariabelen zijn waarden als de linker kantlijn, rechter kantlijn, interlinie, onder- en bovenmarge, enzovoorts. Ze worden variabelen genoemd omdat ze veranderd kunnen worden. Om bijvoorbeeld een bepaalde passage in uw tekst er uit te laten springen, kunt u deze laten inspringen door de linker kantlijn te vergroten, en tevens de interlinie te veranderen in enkele regelafstand. Na de passage moet de computer weer verder met een normale kantlijn en dubbele interlinie. Om een printervariabele te veranderen, hoeft u alleen de inverse letter te laten volgen door een getal. Er mag geen spatie tussen de letter en het getal staan. U kunt de formatteeropdrachten overal in de tekst plaatsen, maar ik vind het mooier om ze bij elkaar in een speciale regel te zetten. Hier ziet u een voorbeeld: 110r60s1tlOb50< Om de formatteeropdrachten in de tekst duidelijk te kunnen maken, worden ze aangegeven door vierkante haken. U verkrijgt ze door eerst C1RL met het Engelse pond in te tikken, en vervolgens de gewenste letter. [sJ Interlinie. Standaardinstelling: 2. Zonder uw eigen instelling gaat de computer uit van dubbele regelafstand. Voor enkele regelafstand tikt u een 1 direct na de [slo Voor driedubbele regelafstand, tikt u een 3 direct na_de [sJ, etc. [1] Linker kantlijn. Standaardinstelling 5. De linkerkantlijn is het aantal spaties dat elke regel inspringt. [rl Rechter kantlijn. Standaardinstelling 75. Dit getal mag niet groter zijn dan 80. Dit is het maximum aantal lettertekens dat op een regel kan. U krijgt de gewenste waarde voor de rechter kantlijn door de gewenste regellengte op te tellen bij de waarde voor de linker kantlijn. [tl Top-marge. Standaardinstelling 5. Deze waarde geeft het aantal blanko regels aan de bovenkant van de bladzijde aan. Minimum in te stellen waarde is 5. [b] Bodem-marge. Standaardinstelling 58. Deze waarde moet kleiner zijn dan 67. De waarde geeft het aantal regels vanaf de bovenkant van het papier aan, waarop afgedrukt gaat worden. Op papier van 11 inch lang, gaan 66 regels. Een waarde kleiner dan 58 is niet aan te raden. [hl Definieren van een header (=kopje). Als u een he ader opgeeft, wordt deze bovenaan elke bladzijde afgedrukt. Om een he ader te definieren begint u een regel met [hl. U voert de tekst van de header in en u drukt op RETURN. Bijvoorbeeld: [h]Boekhouding U kunt binnen de header (na de [h]) een formatteeropdracht geven. [cl om de he ader te centreren. Een [el om de header rechts uit te laten lijnen, of op een willekeurige plaats binnen de header een [#] om de plaats van het bladzijdenummer aan te geven. Voorbeelden: Een gecentreerd bladzijdenummer met een streepje aan elke kant:

[he] Bladzijde -[#]-<

15

Page 15: 16 Voor de 64

De header die gebruikt werd door de vertaler van dit hoofdstuk: [he]Brannon/"Speedscript/[I]< [f] Definieer footer (tekst onderaan elke bladzijde). Deze opdracht is gelijk aan de opdracht voor een header, maar nu verschijnt de tekst onderaan de bladzijde. Zo krijgt u gecentreerde bladzijdenummers met haakjes door: [fe] ([1])< [n] Volgende bladzijde. Deze opdracht dwingt de printer om naar de volgende bladzijde te gaan, ongeacht waar hij nu met afdrukken op de bladzijde was.

Andere opdrachten De volgende opdrachten beinvloeden geen printervariabelen. Ze zijn meestal binnen een tekstregel opgenomen. [u] Onderstrepen. Deze code plaatst u aan het begin en aan het einde van elk woord of elk tekstdeel dat u wilt onderstrepen. De printer verwerkt de opdracht door na het afdrukken van een letterteken een positie terug te springen en op dezelfde plaats een streep te plaatsen. Enkele printers, zoals de VIC 1525, zijn niet in staat om een positie terug te springen. Onderstrepen is op deze wijze dan niet mogelijk. [cl Centreren. Deze code plaatst u aan het begin van een regel die u wilt centreren. De regel moet wel afgesloten worden door een RETURN. [el Rechts (Einde regel) uitlijnen. De code moet u als [cl gebruiken. Nu wordt de regel rechts uitgelijnd. [#] Bladzijde nummer. Zodra Speedscript deze code ergens tegenkomt, wordt het bladzijdenummer afgedrukt.

Zelf-definieerbare codes De meeste printers gebruiken zogenaamde Escape-series om bepaalde speciale funkties als onderstrepen, vet afdrukken, schuin afdrukken, halve regel verspringen, extra breed, extra smal en dergelijke, van de printer te besturen. Deze codes zijn ofwel ASCII-codes kleiner dan 32 (besturingscodes) of worden samengesteld uit een ESCape-teken, CHR$(27), en een letterteken. Zo geeft bijvoorbeeld de Epson MX-80 in samenhang met Graftax, schuine letters (italies) door eerst de code ESC 4 te geven. U dient uw handleidingen er op na te slaan, om te zien welke code welk effect geeft. De meeste van deze speciale codes kunnen niet direct met het toetsenbord ingevoerd worden. Speedscript biedt u daarom de mogelijkheid om 9 opdrachten zelf te definieren. Als u [1]=65 intikt, zal elke keer dat [1] in de tekst voorkomt, de code 65 (65 is de ASCII-code voor de letter A) naar de printer worden gestuurd. Zo heeft Speedscript de pijl naar links nodig om een RETURN aan te geven. U kunt een pijl naar links dus niet zomaar op het papier zetten. U zoekt de waarde van de pijl naar links op in de ASCII-codetabel en vindt 95. Als u nu [1]=95 intikt, bij voorkeur aan het begin van uw tekst, kunt u elke keer dat u een pijl naar links wilt afdrukken een [1] in de tekst plaatsen. De eerste vier getallen zijn al voor u gedefinieerd, maar u kunt deze definities veranderen. [1]= 27 (escape) [2]= 14 (op de meeste printers extra breed) [3]= 15 (extra breed uitschakelen) [4]= (extra smal- condensed) Een fraaie toepassing van het zelf definieren van de besturingscodes is het aanschakelen van de bit-grafiek op uw printer. U kunt zo een speciaal grafisch letterteken definieren. Zo zou u op de VIC 1525 een grafisch vierkantje (als een 'gewenste hokje invullen'-teken) kunnen maken met:

16

Page 16: 16 Voor de 64

[1]=8[2]=15[3]=255[4]=193 [1] [3] [4] [4] [4] [4] [4] [3] [2] Tandpasta

De tekst komt dan dianegatief op uw scherm.

Figuur 1. HET TOETSENBORD

- Letteropdrachten met CTRL - Positie terug. Met CTRL: wis letterteken onder cursor - Wis woord (W), zin (S) of alinea (P) - Inhoudsopgave diskette - Haal buffer op -Opzoeken - Invoegmodus aan/uit

- Afdrukken (Print) - Disk-opdracht - Voer formattering in - zonder SHIFT: naar bovenkant scherm met SHIFT: wis alle tekst - zonder SHIFT: wis letterteken achter cursor met SHIFT: voeg spatie in - Voeg 5 spaties in - Neergedrukt houden om besturings (opdracht) toetsen in te voeren - Van kleine letters naar hoofdletters of vice versa - Naar einde van tekst - Verwissel lettertekens - Wis (naar links) woord (W), zin (S) of alinea (P) - Controleer - Verander achtergrondkleur - Wis buffer - Verander letterkleur - Geheugenruimte - Einde van alinea of blanco regel - zonder SHIFT: volgende zin met SHIFT: ga naar vorige zin - zonder SHIFT: cursor rechts met SHIFT: cursor links 1

Uitwisselbaarheid van printers Speedscript werkt natuurlijk het beste met een gewone Commodore printer. Maar we hebben het programma ook met verschillende andere printers als de Epson MX-80, de Okidate Microline 82A en de Leading Edge Prowriter (NEC 8023), door middel van een interface, uitgeprobeerd. We hebben de Cardco CardJPrint en de Tymac Connection interfaces gebruikt. Elke interface die via de seriele poort van de Commodore werkt, moet voldoen. Speedscript werkt waarschijnlijk niet met een RS-232 printer die is aangesloten op de modem/user poort. Speedscript zal soms werken met interfaces die een centronics poort maken door middel van software. Dit zal goed gaan, zolang de software die daarvoor wordt gebruikt, niet in conflict komt met Speedscript. Als u uw printer goed aan de gang krijgt met CTRL-P, kunt u, om verwarring te voorkomen, de volgende paar alinea's beter overslaan. Zowel de Commodore printer als de meeste interfaces gebruiken als apparaatnummer het nummer 4. (Andere bekende apparaatnummers zijn 1 voor de cassette-recorder en 8 voor de diskdrive) Als u meer dan een printer heeft aangesloten met verschillende apparaatnummers, kunt u dit nummer invoeren door SHIFT ingedrukt te houden terwijl u CTRL-P indrukt.. De computer vraagt u nu om het apparaatnummer in te voeren, samen met het adres. Op dezelfde

17

Page 17: 16 Voor de 64

wijze kunt u een idee krijgen van de plaatsen waar de computer de tekst gaat afbreken voor een nieuwe bladzijde. U tikt daarvoor apparaatnummer 3 in. De uitvoer gaat nu naar het scherm. Het adres dat u in moet voeren is een opdrachtnummer voor de printer. Bij Commodore printers of interfaces die de Commodore printer imiteren, moet het adres 7 zijn. Hiermee wordt de kleine-letters-modus aangegeven. Standaard is het apparaatnummer 4 en het adres 7 ingesteld als u CTRL-P samen met SHIFT indrukt. Als uw interface niet een beetje op een Commodore printer lijkt, heeft u een paar problemen. Het eerste probleem ligt in de getallen die de Commodore gebruikt om lettertekens te omschrijven. Dit wordt door sommige mensen PETASCII genoemd, omdat de codes niet helemaal overeenkomen met de ASCII-codetabel die de meeste niet-Commodore printers gebruiken. Het resultaat is meestal dat de hoofd- en kleine letters omgedraaid worden. U kunt dit met Speedscript opheffen door een [al aan het begin van uw tekst op te nemen. U moet [al ook gebruiken als u de wijze waarop de interface werkt wilt beinvloeden. Dit kan nodig zijn om bepaalde speciale funkties van de printer te kunnen aan sturen. De interface vangt zulke codes vaak op, en bewerkt deze. Niet alleen zult u de codes aan moeten passen, maar ook de adressen. Wij kunnen u daarbij niet veel helpen; u zult zowel de handleiding van de printer als van de interface zeer precies moeten doorlezen.

Kettingpapier versus enkele bladen Het systeem waarbij kettingpapier via een speciale tanding door de printer geleid wordt, is het goedkoopste en meest gebruikte papierdoorvoersysteem voor printers. Sommige printers hebben echter (tevens) een aandrukrol waardoor losse bladen, bijvoorbeeld briefpapier met opdruk, doorgevoerd kunnen worden. Speedscript gaat er zonder speciale opdracht van uit dat u kettingpapier gebruikt. De perforatie tussen de bladen wordt telkens overgeslagen. Als u losse bladen gebruikt, moet Speedscript na elke bladzijde stoppen met afdrukken, en u vragen om een nieuw blad in de printer te doen. Als u een [w 1 (van Wacht) aan het begin van uw tekst plaatst door middel van CTRL-Engelse pondteken, zal Speedscript hiervoor zorgen. Is het einde van de bladzijde bereikt, dan stopt u een nieuw vel in de printer en drukt u op RETURN om het afdrukken verder te laten gaan. Tabel 2 geeft u een handig overzicht van alle formatteeropdrachten. Zoals u heeft kunnen lezen, is Speedscript een zeer volledige tekstverwerker. Het programma is zeer eenvoudig in gebruik, maar door de vele mogelijkheden, kan het even duren voordat u alle variaties optimaal gebruikt. Ik hoop dat uw ontdekkingsreis door de tekstverwerking fascinerend en nuttig zal zijn.

Tabel!. Knip-uit Naslag Kaart

Redactie-opdrachten CTRL-A: Verander hoofd- in kleine letters & omgekeerd CTRL-B: Verander achtergrondkleur CTRL-D: Wis CTRL-E: Verwijder CTRL-H: Opzoeken CTRL-I: Invoegmodus CTRL-K: Wis buffer CTRL-L: Verander letterkleur

18

Page 18: 16 Voor de 64

CTRL-P: Print CTRL-R: Haal buffer op CTRL-V: Controleer CTRL-X: Verwissel lettertekens CTRL-Z: Einde van tekst CTRL-4: Inhoudsopgave diskette CTRL-I: DOS-opdracht versturen CTRL-': Voer fonnatteertoets in CTRL-=: Geheugenruimte f1: Volgende woord f2: Vorige woord f3: Vorige zin f5: Volgende alinea f6: Vorige alinea f7: Laden (load) f8: Opslaan (save) Cursor omhoog: Vorige zin Cursor omlaag: Volgende zin Cursor links/rechts: cursor links/rechts SHIFT-CLRlHOME: Bovenkant scherm/tekst Pijl naar links: positie terug CTRL-pijl naar links: wis letterteken RUN/STOP: voeg 5 spaties in 1

Formatteeropdrachten De fonnatteeropdrachten in de eerste kolom worden ingevoerd door CTRL _'.

Opdracht Beschrijving Standaardinstelling

linker kantlijn 5 r rechter kantlijn 75 t top marge 5 b bodem marge 58 h definieer header geen f definieer tekst aan voet geen w wacht op volgende vel niet wachten a echte ASCII g volgende bestand i infonnatie j selecteer m marge terug p pagina lengte x kolommen over dwars @ start pagina nummer .. ? begin afdrukken met pag ... u onderstrepen c centreren e rechts uitlijnen

19

Page 19: 16 Voor de 64

sinterlinie 2 n naar volgende bladzijde # bladzijdenummer 1-9 zelf-definieerbare toetsen

De volgende codes zijn door de gebruiker te definieeren: einde alinea plus alle tekens die niet in gebruik zijn als opmaak funkties De meest voorkomende zijn reeds voor gedefinieerd en dat zijn: code 1 = 27 ESCape code 2 = 14 breed afdrukken code 3 = 15 normaal afdrukken code 4 = 18 negatief afdrukken

listing Speedscript

2049 :011,008,010,000,158,050,238 2055 :048,054,049,000,000,000,158 2061 :032,136,009,169,203,205,255 2067 :110,035,141,110,035,240,178 2073 :003,032,055,009,032,197,097 2079 :009,076,105,010,165,038,178 2085 :141,067,008,165,039,141,086 2091 :068,008,165,158,141,070,141 2097 :008,165,159,141,071,008,089 2103 :166,181,240,032,169,000,075 2109 :141,021,032,160,000,185,088 2115 :085,186,153,076,186,200,185 2121 :204,021,032,208,244,238,252 2127 :068,008,238,071,008,224,184 2133 :000,240,007,202,208,224,198 2139 :165,180,208,222,096,165,103 2145 :181,170,005,180,208,001,074 2151 :096,024,138,101,039,141,130 2157 :139,008,165,038,141,138,226 2163 :008,024,138,101,159,141,174 2169 :142,008,165,158,141,141,108 2175 :008,232,164,180,208,004,155 2181 :240,013,160,255,185,065,027 2187 :157,153,071,157,136,192,237 2193 :255,208,245,206,139,008,182 2199 :206,142,008,202,208,234,127 2205 :096,169,040,133,195,133,155 2211 :020,169,004,133,196,169,086 2217 :216,133,021,173,017,032,249 2223 :133,251,173,018,032,133,147 2229 :252,162,001,173,020,032,053 2235 :133,012,173,029,013,141,176 2241 :032,208,160,000,173,044,042 2247 :013,145,020,177,251,153,190 2253 :029,032,200,041,127,201,067

20

Page 20: 16 Voor de 64

2259 :031,240,019,192,040,208,173 2265 :235,136,177,251,041,127,160 2271 :201,032,240,005,136,208,021 2277 :245,160,039,200,132,059,040 2283 :136,185,029,032,145,195,189 2289 :136,016,248,164,059,024,120 2295 :152,101,251,133,251,165,020 2301 :252,105,000,133,252,224,195 2307 :001,208,003,140,016,032,147 2313 :192,040,240,008,169,032,178 2319 :145,195,200,076,009,009,137 2325 :024,165,195,105,040,133,171 2331 :195,133,020,144,004,230,241 2337 :196,230,021,232,224,025,193 2343 :240,003,076,195,008,165,214 2349 :251,141,027,032,165,252,145 2355 :141,028,032,096,173,008,017 2361 :032,133,251,141,017,032,151 2367 :141,023,032,133,057,173,110 2373 :009,032,133,252,141,018,142 2379 :032,141,024,032,133,058,239 2385 :056,173,011,032,237,009,087 2391 :032,170,169,032,160,255,137 2397 :198,252,145,251,200,230,089 2403 :252,145,251,200,208,251,126 2409 :230,252,202,208,246,145,108 2415 :251,096,133,059,132,060,074 2421 :160,000,177,059,240,006,247 2427 :032,210,255,200,208,246,250 2433 :096,032,228,255,240,251,207 2439 :096,169,147,032,210,255,020 2445 :169,054,133,001,169,000,155 2451 :141,020,032,141,008,032,009 2457 :141,010,032,141,012,032,009 2463 :141,014,032,141,176,032,183 2469 :141,207,032,169,036,024,006 2475 :105,001,141,009,032,169,116 2481 :207,141,011,032,169,208,177 2487 :141,013,032,169,255,141,166 2493 :015,032,141,174,032,076,147 2499 :132,255,032,226,013,169,254 2505 :128,141,138,002,133,157,132 2511 :032,093,017,169,006,141,153 2517 :024,003,169,010,141,025,073 2523 :003,173,008,032,133,057,113 2529 :173,009,032,133,058,032,150 2535 :246,009,169,038,160,030,115 2541 :032,113,009,238,019,032,168 2547 :096,234,234,032,078,010,159 2553 :169,018,160,030,032,113,003 2559 :009,169,000,141,019,032,113 2565 :096,072,138,072,152,072,095

21

Page 21: 16 Voor de 64

2571 :169,127,141,013,221,172,086 2577 :013,221,016,003,076,114,204 2583 :254,173,113,036,240,006,077 2589 :165,002,160,000,145,057,046 2595 :169,002,133,012,032,204,075 2601 :255,032,078,010,169,244,061 2607 :160,031,032,113,009,032,168 2613 :167,016,208,009,032,069,042 2619 :020,120,169,127,076,102,161 2625 :254,032,069,020,162,250,084 2631 :154,032,197,009,076,105,132 2637 :010,162,039,169,032,157,134 2643 :000,004,202,016,250,169,212 2649 :019,076,210,255,072,041,250 2655 :128,074,133,059,104,041,122 2661 :063,005,059,096,160,000,228 2667 :140,113,036,177,057,133,251 2673 :002,160,000,177,057,073,070 2679 :128,145,057,173,113,036,003 2685 :073,001,141,113,036,032,009 2691 :158,008,032,228,255,208,252 2697 :013,165,162,041,016,240,006 2703 :245,169,000,133,162,076,160 2709 :114,010,170,160,000,165,000 2715 :002,145,057,140,113,036,136 2721 :224,095,208,012,032,112,076 2727 :012,169,032,160,000,145,173 2733 :057,076,105,010,173,019,101 2739 :032,240,007,138,072,032,188 2745 :246,009,104,170,138,201,029 2751 :013,208,002,162,095,138,041 2757 :041,127,201,032,144,078,052 2763 :224,160,208,002,162,032,223 2769 :138,072,160,000,177,057,045 2775 :201,031,240,005,173,020,117 2781 :032,240,003,032,056,016,088 2787 :104,032,093,010,160,000,114 2793 :145,057,032,158,008,056,177 2799 :165,057,237,023,032,133,118 2805 :059,165,058,237,024,032,052 2811 :005,059,144,·014,165,057,183 2817 :105,000,141,023,032,165,211 2823 :058,105,000,141,024,032,111 2829 :230,057,208,002,230,058,030 2835 :032,177,011,076,105,010,174 2841 :138,174,059,011,221,059,175 2847 :011,240,006,202,208,248,178 2853 :076,105,010,202,138,010,066 2859 :170,169,010,072,169,104,225 2865 :072,189,100,011,072,189,170 2871 :099,011,072,096,039,029,145 2877 :157,137,133,002,012,138,128

22

Page 22: 16 Voor de 64

2883 :134,020,148,004,019,009,145 2889 :147,135,139,005,136,140,007 2895 :022,145,017,159,018,024,208 2901 :026,016,028,030,006,001,192 2907 :011,008,031,003,131,010,029 2913 :141,007,102,012,111,012,226 2919 :122,012,176,012,016,013,198 2925 :029,013,044,013,146,013,111 2931 :217,014,055,016,013,015,189 2937 :080,015,157,016,190,016,083 2943 :224,016,001,017,163,017,053 2949 :202,019,181,018,025,020,086 2955 :044,013,146,013,097,020,216 2961 :123,021,033,022,244,012,088 2967 :179,022,168,019,079,027,133 2973 :244,014,049,022,225,013,212 2979 :232,027,239,029,244,015,181 2985 :236,015,139,028,028,016,119 2991 :199,027,032,015,012,056,004 2997 :165,057,237,017,032,165,086 3003 :058,237,018,032,176,032,228 3009 :056,173,017,032,237,008,204 3015 :032,133,059,173,018,032,134 3021 :237,009,032,005,059,240,019 3027 :013,165,057,141,017,032,124 3033 :165,058,141,018,032,032,151 3039 :158,008,056,173,027,032,165 3045 :229,057,133,251,173,028,076 3051 :032,229,058,133,252,005,176 3057 :251,240,002,176,024,024,190 3063 :173,017,032,109,016,032,114 3069 :141,017,032,173,018,032,154 3075 :105,000,141,018,032,032,075 3081 :158,008,076,225,011,096,071 3087 :056,173,023,032,237,010,034 3093 :032,133,059,173,024,032,218 3099 :237,011,032,005,059,144,003 3105 :012,173,010,032,141,023,168 3111 :032,173,011,032,141,024,196 3117 :032,056,165,057,237,008,088 3123 :032,133,059,165,058,237,223 3129 :009,032,005,059,176,011,093 3135 :173,008,032,133,057,173,127 3141 :009,032,133,058,096,056,197 3147 :165,057,237,023,032,133,210 3153 :059,165,058,237,024,032,144 3159 :005,059,176,001,096,173,085 3165 :023,032,133,057,173,024,023 3171 :032,133,058,096,230,057,193 3177 :208,002,230,058,076,177,088 3183 :011,165,057,208,002,198,240 3189 :058,198,057,076,177,011,182

23

Page 23: 16 Voor de 64

3195 :165,057,133,251,165,058,184 3201 :133,252,198,252,160,255,099 3207 :177,251,201,032,240,004,016 3213 :201,031,208,003,136,208,160 3219 :243,177,251,201,032,240,011 3225 :008,201,031,240,004,136,005 3231 :208,243,096,056,152,101,247 3237 :251,133,057,165,252,105,104 3243 :000,133,058,076,177,011,114 3249 :160,000,177,057,201,032,036 3255 :240,008,201,031,240,004,139 3261 :200,208,243,096,200,208,064 3267 :011,230,058,165,058,205,154 3273 :024,032,144,002,208,025,124 3279 :177,057,201,032,240,236,126 3285 :201,031,240,232,024,152,069 3291 :101,057,133,057,165,058,022 3297 :105,000,133,058,076,177,006 3303 :011,173,023,032,133,057,148 3309 :173,024,032,133,058,076,221 3315 :177,011,169,000,141,017,246 3321 :032,173,024,032,056,233,031 3327 :004,205,009,032,176,003,172 3333 :173,009,032,141,018,032,154 3339 :032,158,008,076,232,012,017 3345 :238,029,013,173,029,013,000 3351 :041,015,141,029,013,096,102 3357 :012,238,044,013,173,044,041 3363 :013,041,015,141,044,013,046 3369 :076,158,008,011,165,057,004 3375 :133,251,165,058,133,252,015 3381 :198,252,160,255,177,251,066 3387 :201,046,240,012,201,033,024 3393 :240,008,201,063,240,004,053 3399 :201,031,208,004,136,208,091 3405 :235,096,177,251,201,046,059 3411 :240,027,201,033,240,023,079 3417 :201,063,240,019,201,031,076 3423 :240,015,136,208,235,198,103 3429 :252,165,252,205,008,032,247 3435 :176,226,076,134,013,132,096 3441 :059,198,059,200,240,010,111 3447 :177,251,201,032,240,247,243 3453 :136,076,162,012,164,059,222 3459 :076,079,013,173,008,032,000 3465 :133,057,173,009,032,133,162 3471 :058,076,177,011,160,000,113 3477 :177,057,201,046,240,029,131 3483 :201,033,240,025,201,063,150 3489 :240,021,201,031,240,017,143 3495 :200,208,235,230,058,165,239 3501 :058,205,024,032,240,226,190

24

Page 24: 16 Voor de 64

3507 :144,224,076,232,012,200,043 3513 :208,014,230,058,165,058,150 3519 :205,024,032,144,005,240,073 3525 :003,076,232,012,177,057,242 3531 :201,032,240,233,201,046,132 3537 :240,229,201,033,240,225,097 3543 :201,063,240,221,201,031,148 3549 :240,217,076,217,012,173,132 3555 :012,032,141,140,032,173,245 3561 :013,032,141,141,032,032,112 3567 :078,010,169,055,160,030,229 3573 :032,113,009,169,001,141,198 3579 :019,032,096,056,165,057,164 3585 :237,008,032,133,059,165,123 3591 :058,237,009,032,005,059,151 3597 :208,003,104,104,096,165,181 3603 :057,133,038,165,058,133,091 3609 :039,096,056,165,057,133,059 3615 :158,073,255,101,038,141,029 3621 :144,032,165,058,133,159,216 3627 :073,255,101,039,141,145,029 3633 :032,165,038,141,146,032,091 3639 :165,039,141,147,032,165,232 3645 :158,141,148,032,133,038,199 3651 :165,159,141,149,032,133,078 3657 :039,056,173,145,032,109,115 3663 :141,032,205,015,032,144,136 3669 :020,032,078,010,169,067,205 3675 :160,030,032,113,009,169,092 3681 :001,141,019,032,169,000,203 3687 :133,198,096,173,140,032,107 3693 :133,158,173,141,032,133,111 3699 :159,173,144,032,133,180,168 3705 :024,109,140,032,141,140,195 3711 :032,173,145,032,133,181,055 3717 :109,141,032,141,141,032,217 3723 :169,000,141,026,208,169,084 3729 :052,133,001,032,035,008,150 3735 :169,054,133,001,169,001,166 3741 :141,026,208,173,146,032,115 3747 :133,038,173,147,032,133,051 3753 :039,173,148,032,133,158,084 3759 :173,149,032,133,159,056,109 3765 :173,023,032,229,158,133,161 3771 :180,173,024,032,229,159,216 3777 :133,181,032,035,008,056,126 3783 :173,023,032,237,144,032,072 3789 :141,023,032,173,024,032,118 3795 :237,145,032,141,024,032,054 3801 :096,032,254,013,032,112,244 3807 :012,032,027,014,056,173,025 3813 :140,032,233,001,141,140,148

25

Page 25: 16 Voor de 64

3819 :032,173,141,032,233,000,078 3825 :141,141,032,096,173,141,197 3831 :002,201,005,208,003,076,230 3837 :122,015,032,103,012,032,057 3843 :254,013,032,112,012,032,202 3849 :027,014,076,227,014,032,143 3855 :226,013,169,002,133,012,058 3861 :032,078,010,169,078,160,036 3867 :030,032,113,009,032,130,117 3873 :009,072,032,246,009,104,249 3879 :041,191,201,023,208,009,200 3885 :032,254,013,032,123,012,255 3891 :076,027,014,201,026,208,091 3897 :009,032,254,013,032,045,186 3903 :013,076,027,014,201,016,154 3909 :208,009,032,254,013,032,105 3915 :002,017,076,027,014,096,051 3921 :056,165,057,237,017,032,133 3927 :133,059,165;058,237,018,245 3933 :032,005,059,240,011,173,101 3939 :017,032,133,057,173,018,017 3945 :032,133,058,096,173,008,093 3951 :032,133,057,173,009,032,035 3957 :133,058,076,177,011,165,225 3963 :057,133,251,133,158,165,252 3969 :058,133,252,133,159,160,000 3975 :000,177,251,201,032,208,236 3981 :030,200,208,247,165,252,219 3987 :205,024,032,144,015,173,228 3993 :023,032,133,251,173,024,021 3999 :032,133,252,160,000,076,044 4005 :172,015,230,252,076,136,022 4011 :015,024,152,101,251,133,079 4017 :038,169,000,101,252,133,102 4023 :039,056,173,023,032,229,223 4029 :158,133,180,173,024,032,121 4035 :229,159,133,181,056,165,094 4041 :038,229,158,141,144,032,175 4047 :165,039,229,159,141,145,061 4053 :032,032,035,008,056,173,037 4059 :023,032,237,144,032,141,060 4065 :023,032,173,024,032,237,234 4071 :145,032,141,024,032,096,189 4077 :169,255,141,169,032,076,055 4083 :007,016,169,005,141,169,238 4089 :032,032,007,016,177,057,058 4095 :201,032,208,001,200,076,205 4101 :217,012,169,000,141,170,202 4107 :032,032,078,016,169,032,114 4113 :174,169,032,160,000,145,185 4119 :057,200,202,208,250,096,012 4125 :032,056,016,032,056,016,237

26

Page 26: 16 Voor de 64

4131 :169,031,160,000,145,057,085 4137 :200,145,057,032,158,008,129 4143 :032,103,012,032,103,012,085 4149 :076,245,015,169,001,141,188 4155 :169,032,169,000,141,170,228 4161 :032,032,078,016,169,032,168 4167 :160,000,145,057,076,177,174 4173 :011,024,173,023,032,109,193 4179 :169,032,173,024,032,109,110 4185 :170,032,205,011,032,144,171 4191 :005,104,104,076,157,016,045 4197 :024,165,057,133,038,109,115 4203 :169,032,133,158,165,058,054 4209 :133,039,109,170,032,133,217 4215 :159,056,173,023,032,229,023 4221 :038,133,180,173,024,032,193 4227 :229,039,133,181,032,096,073 4233 :008,024,173,023,032,109,250 4239 :169,032,141,023,032,173,201 4245 :024,032,109,170,032,141,145 4251 :024,032,096,173,020,032,020 4257 :073,014,141,020,032,096,025 4263 :169,093,160,030,032,113,252 4269 :009,032,159,255,032,228,120 4275 :255,240,248,201,147,240,230 4281 :244,041,127,201,074,096,200 4287 :169,002,133,012,032,078,105 4293 :010,169,115,160,030,032,201 4299 :113,009,032,167,016,240,012 4305 :003,076,246,009,162,250,187 4311 :154,032,055,009,032,200,185 4317 :009,076,105,010,160,000,069 4323 :177,057,201,031,240,017,182 4329 :200,208,247,230,058,165,061 4335 :058,205,024,032,144,238,172 4341 :240,236;076,232,012,200,217 4347 :208,002,230,058,076,217,018 4353 :012,165,057,133,251,165,016 4359 :058,133,252,198,252,160,036 4365 :255,177,251,201,031,240,144 4371 :017,136,192,255,208,245,048 4377 :198,252,165,252,205,009,082 4383 :032,176,236,076,134,013,186 4389 :056,152,101,251,133,251,213 4395 :169,000,101,252,133,252,182 4401 :056,165,251,229,057,133,172 4407 :059,165,252,229,058,005,055 4413 :059,208,018,132,059,024,049 4419 :165,251,229,059,133,251,131 4425 :165,252,233,000,133,252,084 4431 :076,020,017,165,251,133,229 4437 :057,165,252,133,058,076,058

27

Page 27: 16 Voor de 64

4443 :177,011,120,169,000,141,197 4449 :014,220,169,027,141,017,173 4455 :208,169,124,141,020,003,000 4461 :169,017,141,021,003,169,117 4467 :001,141,026,208,141,018,138 4473 :208,088,096,169,058,164,136 4479 :012,205,018,208,208,005,015 4485 :169,001,172,029,013,140,145 4491 :033,208,141,018,208,201,180 4497 :001,240,008,169,001,141,193 4503 :025,208,076,188,254,169,047 4509 :001,141,025,208,076,049,145 4515 :234,173,141,002,041,001,243 4521 :208,003,032,226,013,032,171 4527 :078,010,169,133,160,030,243 4533 :032,113,009,160,000,177,160 4539 :057,073,128,145,057,032,167 4545 :158,008,160,000,177,057,241 4551 :073,128,145,057,169,002,005 4557 :133,012,032,130,009,009,018 4563 :064,201,087,208,009,032,044 4569 :001,018,032,177,012,076,021 4575 :016,018,201,090,208,009,253 4581 :032,001,018,032,147,013,216 4587 :076,016,018,201,080,208,066 4593 :009,032,001,018,032,225,046 4599 :016,076,016,018,032,177,070 4605 :011,076,246,009,165,057,049 4611 :133,158,141,134,032,165,254 4617 :058,133,159,141,135,032,155 4623 :096,056,165,057,133,038,048 4629 :237,134,032,141,144,032,229 4635 :165,058,133,039,237,135,026 4641 :032,141,145,032,032,050,209 4647 :014,173,134,032,133,057,070 4653 :173,135,032,133,058,032,096 4659 :158,008,076,184,017,169,151 4665 :039,229,211,141,025,032,222 4671 :160,000,169,153,032,210,019 4677 :255,169,018,032,210,255,240 4683 :169,032,032,210,255,169,174 4689 :157,032,210,255,140,026,133 4695 :032,032,110,009,172,026,232 4701 :032,133,059,169,146,032,152 4707 :210,255,169,032,032,210,239 4713 :255,169,157,032,210,255,159 4719 :169,155,032,210,255,165,073 4725 :059,201,013,240,050,201,113 4731 :020,208,015,136,016,004,010 4737 :200,076,065,018,169,157,046 4743 :032,210,255,076,065,018,023 4749 :165,059,041,127,201,032,254 4755 :144,172,204,025,032,240,196

28

Page 28: 16 Voor de 64

4761 :167,165,059,153,069,032,030 4767 :032,210,255,169,000,133,190 4773 :212,133,216,200,076,065,043 4779 :018,032,210,255,169,000,087 4785 :153,069,032,152,096,032,199 4791 :078,010,169,188,160,030,050 4797 :032,113,009,032,028,019,166 4803 :176,032,173,008,032,133,237 4809 :251,173,009,032,133,252,027 4815 :174,023,032,172,024,032,152 4821 :169,251,032,216,255,176,032 4827 :009,165,144,041,191,208,209 4833 :003,076,010,020,240,039,101 4839 :173,027,019,201,008,144,035 4845 :006,032,150,027,076,005,021 4851 :019,173,027,019,201,001,171 4857 :240,249,032,078,010,169,003 4863 :194,160,030,032,113,009,025 4869 :032,093,017,169,001,141,202 4875 :019,032,096,032,078,010,022 4881 :169,205,160,030,032,113,214 4887 :009,076,005,019,008,032,172 4893 :056,018,240,022,169,236,002 4899 :160,030,032,113,009,032,155 4905 :130,009,162,008,201,068,107 4911 :240,012,162,001,201,084,235 4917 :240,006,032,246,009,104,178 4923 :104,096,142,027,019,169,104 4929 :001,160,000,032,186,255,187 4935 :160,000,224,001,240,049,233 4941 :185,069,032,201,064,234,094 4947 :234,185,070,032,201,058,095 4953 :240,035,185,071,032,201,085 4959 :058,240,028,169,048,141,011 4965 :109,032,169,058,141,110,208 4971 :032,185,069,032,153,111,177 4977 :032,200,204,026,032,144,239 4983 :244,240,242,200,076,138,235 4989 :019,185,069,032,153,109,180 4995 :032,200,204,026,032,208,065 5001 :244,140,133,032,032,078,028 5007 :010,169,069,160,032,032,103 5013 :113,009,173,133,032,162,003 5019 :109,160,032,032,189,255,164 5025 :169,013,032,210,255,076,148 5031 :069,020,032,078,010,169,033 5037 :170,160,030,032,113,009,175 5043 :032,130,009,032,093,010,229 5049 :009,128,072,173,020,032,107 5055 :240,003,032,056,016,032,058 5061 :246,009,104,076,231,010,105 5067 :056,165,057,237,008,032,246 5073 :133,059,165,058,237,009,102

29

Page 29: 16 Voor de 64

5079 :032,005,059,240,004,169,212 5085 :005,133,012,032,078,010,235 5091 :169,000,160,031,032,113,220 5097 :009,032,028,019,165,012,242 5103 :201,005,240,003,032,055,007 5109 :009,169,000,166,057,164,042 5115 :058,032,213,255,144,003,188 5121 :076,229,018,142,023,032,009 5127 :140,024,032,032,231,255,209 5133 :032,078,010,169,224,160,174 5139 :030,032,113,009,076,005,028 5145 :019,032,078,010,169,006,083 5151 :160,031,032,113,009,032,152 5157 :028,019,169,001,174,008,180 5163 :032,172,009,032,032,213,021 5169 :255,165,144,041,191,240,061 5175 :210,032,078,010,169,212,254 5181 :160,030,032,113,009,076,225 5187 :005,019,120,169,000,141,009 5193 :026,208,141,032,208,141,061 5199 :033,208,169,049,141,020,187 5205 :003,169,234,141,021,003,144 5211 :169,001,141,014,220,088,212 5217 :096,169,147,032,210,255,238 5223 :169,013,032,210,255,032,046 5229 :069,020,032,148,020,169,055 5235 :013,032,210,255,169,014,040 5241 :160,031,032,113,009,032,242 5247 :228,255,201,013,208,249,001 5253 :032,093,017,076,246,009,094 5259 :032,204,255,169,001,032,064 5265 :195,255,096,032,231,255,185 5271 :169,001,162,008,160,000,139 5277 :032,186,255,169,001,162,194 5283 :042,160,031,032,189,255,104 5289 :032,192,255,176,221,162,183 5295 :001,032,198,255,032,001,182 5301 :021,032,001,021,032,001,033 5307 :021,032,001,021,240,202,192 5313 :032,204,255,032,228,255,175 5319 :201,032,208,003,032,130,037 5325 :009,162,001,032,198,255,094 5331 :032,001,021,072,032,001,114 5337 :021,168,104,170,152,160,224 5343 :055,132,001,032,205,189,069 5349 :160,054,132,001,169,032,009 5355 :032,210,255,032,001,021,018 5361 :240,006,032,210,255,076,036 5367 :238,020,169,013,032,210,161 5373 :255,076,185,020,032,207,004 5379 :255,072,165,144,041,191,103 5385 :240,006,104,104,104,076,131 5391 :139,020,104,096,162,000,024

30

Page 30: 16 Voor de 64

5397 :142,136,032,142,137,032,130 5403 :142,138,032,142,139,032,140 5409 :056,177,251,233,048,144,174 5415 :042,201,010,176,038,014,008 5421 :136,032,046,137,032,014,186 5427 :136,032,046,137,032,014,192 5433 :136,032,046,137,032,014,198 5439 :136,032,046,137,032,013,203 5445 :136,032,141,136,032,200,234 5451 :208,212,230,252,076,033,062 5457 :021,248,173,136,032,013,192 5463 :137,032,240,028,056,173,241 5469 :136,032,233,001,141,136,004 5475 :032,173,137,032,233,000,194 5481 :141,137,032,238,138,032,055 5487 :208,003,238,139,032,076,039 5493 :083,021,173,138,032,216,012 5499 :096,056,173,140,032,237,089 5505 :012,032,141,142,032,173,149 5511 :141,032,237,013,032,141,219 5517 :143,032,013,142,032,208,199 5523 :016,032,078,010,169,052,248 5529 :160,031,032,113,009,169,155 5535 :001,141,019,032,096,024,216 5541 :165,057,133,038,109,142,041 5547 :032,133,158,165,058,133,082 5553 :039,109,143,032,133,159,024 5559 :056,173,023,032,229,038,222 5565 :133,180,173,024,032,229,192 5571 :039,133,181,024,101,159,064 5577 :205,011,032,144,016,032,129 5583 :078,010,169,043,160,031,186 5589 :032,113,009,169,001,141,166 5595 :019,032,096,032,096,008,246 5601 :024,173,142,032,133,180,141 5607 :109,023,032,141,023,032,079 5613 :173,143,032,133,181,109,240 5619 :024,032,141,024,032,165,149 5625 :057,133,158,165,058,133,185 5631 :159,173,012,032,133,038,034 5637 :173,013,032,133,039,169,052 5643 :000,141,026,208,169,052,095 5649 :133,001,032,035,008,169,139 5655 :054,133,001,169,001,141,010 5661 :026,208,076,177,011,160,175 5667 :000,177,057,170,200,177,048 5673 :057,136,145,057,200,138,006 5679 :145,057,096,160,000,177,170 5685 :057,041,063,240,010,201,153 5691 :027,176,006,177,057,073,063 5697 :064,145,057,076,103,012,010 5703 :133,059,041,063,006,059,176 5709 :036,059,016,002,009,128,071

31

Page 31: 16 Voor de 64

5715 :112,002,009,064,133,059,206 5721 :096,005,075,066,005,058,138 5727 :001,001,001,000,001,000,099 5733 :080,027,014,015,018,141,140 5739 :175,032,138,072,152,072,236 5745 :056,173,159,032,237,161,163 5751 :032,173,160,032,237,162,147 5757 :032,144,031,173,175,032,200 5763 :032,210,255,173,141,002,176 5769 :041,001,141,032,208,208,000 5775 :246,165,145,201,127,208,211 5781 :009,238,032,208,032,084,240 5787 :025,076,120,024,104,168,160 5793 :104,170,173,175,032,096,143 5799 :032,078,010,169,161,160,009 5805 :031,076,113,009,076,120,086 5811 :024,173,029,013,141,111,158 5817 :036,169,000,133,012,141,164 5823 :032,208,141,029,013,032,134 5829 :189,255,169,004,141,170,101 5835 :032,160,007,173,141,002,206 5841 :041,001,208,003,076,104,130 5847 :023,032,078,010,169,066,081 5853 :160,031,032,113,009,032,086 5859 :130,009,041,127,162,003,187 5865 :142,170,032,201,083,240,077 5871 :086,162,008,142,170,032,071 5877 :201,068,240,034,201,080,045 5883 :208,180,032,078,010,169,160 5889 :109,160,031,03~,113,009,199 5895 :032,130,009,056,233,048,003 5901 :201,004,144,160,201,080,035 5907 :176,156,141,170,032,076,002 5913 :070,023,032,078,010,169,151 5919 :145,160,031,032,113,009,009 5925 :032,056,018,240,135,172,178 5931 :026,032,169,044,153,069,024 5937 :032,200,169,087,153,069,247 5943 :032,200,140,026,032,173,146 5949 :026,032,162,069,160,032,030 5955 :032,189,255,173,170,032,150 5961 :168,201,004,144,026,201,049 5967 :008,176,022,032,078,010,149 5973 :169,124,160,031,032,113,202 5979 :009,032,130,009,056,233,048 5985 :048,168,016,003,076,177,073 5991 :022,169,001,174,170,032,159 5997 :032,186,255,032,167,022,035 6003 :169,001,032,195,255,032,031 6009 :192,255,162,001,032,201,196 6015 :255,144,003,076,120,024,237 6021 :162,000,142,151,032,142,250 6027 :150,032,142,171,032,142,040

32

Page 32: 16 Voor de 64

6033 :172,032,142,112,036,189,060 6039 :090,022,157,152,032,232,068 6045 :224,012,208,245,169,255,246 6051 :141,166,032,141,164,032,071 6057 :162,004,189,101,022,157,036 6063 :030,033,202,208,247,173,044 6069 :008,032,133,251,173,009,019 6075 :032,133,252,160,000,140,136 6081 :165,032,204,164,032,240,006 6087 :006,173,152,032,141,165,100 6093 :032,177,251,016,003,076,248 6099 :098,025,201,031,240,044,082 6105 :153,110,033,200,238,165,092 6111 :032,173,165,032,205,153,215 6117 :032,144,230,140,022,032,061 6123 :177,251,201,032,240,020,132 6129 :206,165,032,136,208,244,208 6135 :172,022,032,076,008,024,069 6141 :200,177,251,201,032,240,074 6147 :001,136,140,022,032,152,230 6153 :056,101,251,133,251,165,198 6159 :252,105,000,133,252,160,149 6165 :000,173,166,032,201,255,080 6171 :208,003,032,009,025,173,221 6177 :164,032,240,003,032,049,041 6183 :025,056,046,164,032,173,023 6189 :022,032,141,021,032,169,206 6195 :110,133,253,169,033,133,114 6201 :254,032,051,029,032,066,009 6207 :025,173,166,032,205,156,052 6213 :032,144,003,032,151,024,199 6219 :056,165,251,237,023,032,071 6225 :133,059,165,252,237,024,183 6231 :032,005,059,240,056,144,111 6237 :054,173,151,032,240,011,242 6243 :169,000,141,150,032,141,220 6249 :155,032,032,151,024,173,160 6255 :170,032,201,003,208,003,216 6261 :032,130,009,032,225,255,032 6267 :240,251,169,001,032,195,243 6273 :255,032,231,255,173,111,162 6279 :036,141,029,013,162,250,254 6285 :154,032,246,009,076,105,251 6291 :010,076,190,023,056,173,163 6297 :154,032,237,166,032,168,174 6303 :136,136,240,008,048,006,221 6309 :032,084,025,136,208,250,132 6315 :173,151,032,240,017,141,157 6321 :021,032,169,111,133,253,128 6327 :169,035,133,254,032,049,087 6333 :025,032,051,029,032,084,186 6339 :025,032,084,025,032,084,221 6345 :025,238,159,032,208,003,098

33

Page 33: 16 Voor de 64

6351 :238,160,032,173,158,032,232 6357 :208,050,173,170,032,201,023 6363 :003,240,043,201,008,240,186 6369 :039,056,173,159,032,237,153 6375 :161,032,173,160,032,237,002 6381 :162,032,144,024,032,204,067 6387 :255,032,078,010,169,177,196 6393 :160,031,032,113,009,032,114 6399 :130,009,032,167,022,162,009 6405 :001,032,201,255,173,150,049 6411 :032,240,017,141,021,032,238 6417 :169,110,133,253,169,034,117 6423 :133,254,032,049,025,032,036 6429 :051,029,172,155,032,140,096 6435 :166,032,136,240,008,048,153 6441 :006,032,084,025,136,208,020 6447 :250,096,169,032,172,152,150 6453 :032,140,165,032,240,006,156 6459 :032,106,022,136,208,250,045 6465 :096,172,157,032,024,152,186 6471 :109,166,032,141,166,032,205 6477 :032,084,025,136,208,250,044 6483 :096,169,013,032,106,022,009 6489 :173,112,036,240,003,032,173 6495 :106,022,096,141,168,032,148 6501 :041,127,032,071,022,174,056 6507 :173,025,221,173,025,240,196 6513 :009,202,208,248,206,165,127 6519 :032,076,190,026,202,138,015 6525 :010,170,140,167,032,169,045 6531 :025,072,169,144,072,189,034 6537 :193,025,072,189,192,025,065 6543 :072,096,056,173,167,032,227 6549 :101,251,133,251,165,252,022 6555 :105,000,133,252,076,190,143 6561 :023,177,251,201,031,240,060 6567 :001,136,140,167,032,096,227 6573 :018,087,065,076,082,084,073 6579 :066,083,078,072,070,064,100 6585 :080,063,088,077,073,071,125 6591 :074,032,026,050,026,059,202 6597 :026,069,026,079,026,089,000 6603 :026,099,026,109,026,124,101 6609 :026,158,026,006,026,022,217 6615 :026,246,025,236,025,227,232 6621 :025,183,026,224,026,041,234 6627 :026,200,169,000,141,164,159 6633 :032,076,162,025,200,032,248 6639 :019,021,141,163,032,076,179 6645 :162,025,200,032,019,021,192 6651 :141,161,032,173,139,032,161 6657 :141,162,032,076,162,025,087 6663 :200,032,019,021,141,159,067

34

Page 34: 16 Voor de 64

6669 :032,173,139,032,141,160,178 6675 :032,076,162,025,200,032,034 6681 :019,021,141,154,032,076,212 6687 :162,025,169,000,141,158,174 6693 :032,200,076,162,025,169,189 6699 :010,141,112,036,200,076,106 6705 :162,025,200,169,001,141,235 6711 :171,032,076,162,025,200,209 6717 :032,019,021,141,152,032,202 6723 :076,162,025,200,032,019,069 6729 :021,141,153,032,076,162,146 6735 :025,200,032,019,021,141,005 6741 :155,032,076,162,025,200,223 6747 :032,019,021,141,156,032,236 6753 :076,162,025,200,032,019,099 6759 :021,141,157,032,076,162,180 6765 :025,172,167,032,200,152,089 6771 :072,032,151,024,104,168,154 6777 :140,167,032,096,032,151,227 6783 :026,136,140,150,032,160,003 6789 :001,177,251,153,109,034,090 6795 :200,204,150,032,144,245,090 6801 :240,243,200,076,162,025,067 6807 :200,177,251,201,031,208,195 6813 :249,096,032,151,026,136,079 6819 :140,151,032,160,001,177,056 6825 :251,153,110,035,200,204,098 6831 :151,032,144,245,240,243,206 6837 :076,162,025,032,151,026,141 6843 :076,162,025,200,177,251,054 6849 :201,061,240,007,136,173,243 6855 :168,032,076,217,023,200,147 6861 :032,019,021,072,173,168,178 6867 :032,041,127,170,104,157,074 6873 :238,032,032,162,025,076,014 6879 :145,025,200,162,008,177,172 6885 :251,041,063,201,004,240,005 6891 :009,162,001,201,020,240,100 6897 :003,076,177,022,142,027,176 6903 :019,200,177,251,201,058,129 6909 :240,003,076,177,022,200,203 6915 :177,251,201,031,240,009,144 6921 :032,071,022,153,106,032,169 6927 :076,002,027,152,056,233,049 6933 :003,162,109,160,032,032,007 6939 :189,255,032,204,255,169,107 6945 :002,032,195,255,169,002,176 6951 :174,027,019,160,000,032,195 6957 :186,255,032,055,009,169,239 6963 :000,166,057,164,058,032,016 6969 :213,255,144,003,076,177,157 6975 :022,142,023,032,140,024,190

35

Page 35: 16 Voor de 64

6981 :032,104,104,162,001,032,248 6987 :201,255,076,180,023,032,074 6993 :231,255,169,000,032,189,189 6999 :255,169,015,162,008,160,088 7005 :015,032,186,255,032,192,037 7011 :255,144,011,169,015,032,213 7017 :195,255,032,231,255,076,125 7023 :246,009,032,078,010,169,143 7029 :028,160,031,032,113,009,234 7035 :032,056,018,240,022,162,141 7041 :015,032,201,255,176,223,007 7047 :169,069,160,032,032,113,198 7053 :009,169,013,032,210,255,061 7059 :032,204,255,032,231,255,132 7065 :169,000,032,189,255,169,199 7071 :015,162,008,160,015,032,039 7077 :186,255,032,192,255,176,237 7083 :186,032,078,010,162,015,142 7089 :032,198,255,032,056,018,000 7095 :032,204,255,169,015,032,122 7101 :195,255,032,231,255,169,046 7107 :001,141,019,032,096,032,004 7113 :240,027,173,176,032,240,065 7119 :022,032,147,028,032,022,234 7125 :028,173,174,032,201,255,052 7131 :240,009,032,182,028,032,230 7137 :158,008,076,211,027,076,013 7143 :246,009,173,141,002,201,235 7149 :005,208,038,032,078,010,096 7155 :169,205,160,031,032,113,185 7161 :009,032,056,018,141,176,169 7167 :032,208,003,076,246,009,061 7173 :160,000,185,069,032,153,092 7179 :177,032,200,204,026,032,170 7185 :208,244,076,246,009,165,197 7191 :057,133,251,165,058,133,052 7197 :252,169,255,141,174,032,028 7203 :160,001,162,000,173,176,195 7209 :032,240,080,189,177,032,023 7215 :032,093,010,209,251,240,114 7221 :002,162,255,200,208,011,123 7227 :230,252,165,252,205,024,163 7233 :032,240,002,176,054,232,033 7239 :236,176,032,208,224,024,203 7245 :152,101,251,133,059,165,170 7251 :252,105,000,133,060,173,038 7257 :023,032,197,059,173,024,085 7263 :032,229,060,144,024,056,128 7269 :165,059,237,176,032,133,135 7275 :057,141,173,032,165,060,223 7281 :233,000,133,058,141,174,084 7287 :032,032,177,011,096,032,243

36

Page 36: 16 Voor de 64

7293 :078,010,169,216,160,031,021 7299 :032,113,009,169,001,141,084 7305 :019,032,096,173,141,002,088 7311 :201,005,208,035,032,078,190 7317 :010,169,230,160,031,032,013 7323 :113,009,032,056,018,141,012 7329 :207,032,240,014,160,000,046 7335 :185,069,032,153,208,032,078 7341 :200,204,026,032,208,244,063 7347 :076,246,009,056,165,057,020 7353 :133,158,237,173,032,133,027 7359 :059,165,058,133,159,237,234 7365 :174,032,005,059,208,101,008 7371 :169,255,141,174,032,024,230 7377 :173,176,032,101,057,133,113 7383 :038,169,000,101,058,133,202 7389 :039,056,173,023,032,229,005 7395 :158,133,180,173,024,032,159 7401 :229,159,133,181,032,035,234 7407 :008,056,173,023,032,237,000 7413 :176,032,141,023,032,173,054 7419 :024,032,233,000,141,024,193 7425 :032,173,207,032,240,041,214 7431 :141,169,032,169,000,141,147 7437 :170,032,032,078,016,160,245 7443 :000,185,208,032,032,093,057 7449 :010,145,057,200,204,207,080 7455 :032,208,242,024,165,057,247 7461 :109,207,032,133,057,165,228 7467 :058,105,000,133,058,076,217 7473 :177,011,160,000,204,021,110 7479 :032,240,032,177,253,048,069 7485 :029,032,071,022,032,208,199 7491 :029,032,106,022,173,172,089 7497 :032,240,010,169,008,032,052 7503 :106,022,169,095,032,106,097 7509 :022,200,076,053,029,096,049 7515 :140,167,032,041,127,141,227 7521 :168,032,032,071,022,201,111 7527 :067,208,027,056,173,163,029 7533 :032,237,021,032,074,056,049 7539 :237,152,032,168,169,032,137 7545 :032,106,022,136,208,250,107 7551 :172,167,032,076,086,029,177 7557 :201,069,208,017,056,173,089 7563 :153,032,237,021,032,056,158 7569 :237,152,032,168,169,032,167 7575 :076,121,029,201,085,208,103. 7581 :008,173,172,032,073,001,104 7587 :141,172,032,201,035,208,184 7593 :026,140,167,032,174,159,099 7599 :032,173,160,032,160,055,019 7605 :132,001,032,205,189,160,132

37

Page 37: 16 Voor de 64

7611 :054,132,001,172,167,032,233 7617 :076,086,029,174,168,032,246 7623 :189,238,032,032,106,022,050 7629 :076,086,029,174,171,032,005 7635 :240,026,133,059,041,127,069 7641 :201,065,144,018,201,091,169 7647 :176,014,170,165,059,041,080 7653 :128,073,128,074,074,133,071 7659 :059,138,005,059,096,032,112 7665 :078,010,056,173,010,032,088 7671 :237,023,032,170,173,011,125 7677 :032,237,024,032,160,055,025 7683 :132,001,032,205,189,160,210 7689 :054,132,001,169,001,141,251 7695 :019,032,096,008,014,155,083 7701 :146,211,080,069,069,068,152 7707 :211,067,082,073,080,084,112 7713 :032,051,046,078,000,032,016 7719 :195,072,065,082,076,069,086 7725 :083,032,194,082,065,078,067 7731 :078,079,078,000,194,085,053 7737 :070,070,069,082,032,204,072 7743 :069,069,071,000,194,085,039 7749 :070,070,069,082,032,086,222 7755 :079,076,000,040,218,044,020 7761 :215,044,208,041,032,215,068 7767 :073,083,083,069,078,000,217 7773 :058,194,069,078,084,032,096 7779 :213,032,090,069,075,069,135 7785 :082,063,032,040,202,047,059 7791 :206,041,058,000,193,204,045 7797 :204,197,032,212,197,203,138 7803 :211,212,032,215,201,211,181 7809 :211,197,206,000,214,069,002 7815 :082,087,073,074,068,069,076 7821 :082,032,040,218,044,215,004 7827 :044,208,041,058,032,083,101 7833 :084,079,080,032,077,069,062 7839 :084,032,018,210,197,212,144 7845 :213,210,206,146,000,199,115 7851 :069,069,070,032,079,080,058 7857 :077,065,065,075,084,079,110 7863 :069,084,083,058,000,211,176 7869 :065,086,069,058,000,212,167 7875 :065,080,069,032,198,207,078 7881 :213,212,000,199,069,083,209 7887 :084,079,080,084,000,214,236 7893 :069,082,073,070,089,032,116 7899 :198,207,213,212,000,199,224 7905 :069,069,078,032,198,207,110 7911 :213,212,197,206,000,147,182 7917 :032,018,212,146,065,080,022 7923 :069,032,079,070,032,018,031

38

Page 38: 16 Voor de 64

7929 :196,146,073,083,075,063,117 7935 :000,204,079,065,068,058,217 7941 :000,214,069,082,073,070,001 7947 :089,058,000,199,069,069,239 7953 :070,032,018,210,197,212,244 7959 :213,210,206,146,000,196,226 7965 :073,083,075,067,079,077,227 7971 :077,065,078,068,079,058,204 7977 :000,036,199,069,069,078,236 7983 :032,082,085,073,077,084,224 7989 :069,000,199,069,069,078,025 7995 :032,212,069,075,083,084,102 8001 :000,147,208,082,073,078,141 8007 :084,032,078,065,065,082,221 8013 :032,058,032,032,032,018,025 8019 :211,146,067,072,069,082,218 8025 :077,044,018,196,146,073,131 8031 :083,075,044,018,208,146,157 8037 :082,073,078,084,069,082,057 8043 :063,000,208,082,073,078,099 8049 :084,069,082,078,085,077,076 8055 :077,069,082,063,000,211,109 8061 :069,067,079,078,068,065,039 8067 :073,082,032,193,068,082,149 8073 :069,083,032,078,079,046,012 8079 :063,000,208,082,073,078,135 8085 :084,032,070,073,076,069,041 8091 :078,065,065,077,058,000,242 8097 :147,193,070,068,082,085,038 8103 :075,075,069,078,046,046,044 8109 :046,013,013,000,214,079,026 8115 :069,082,032,066,076,065,057 8121 :068,032,073,078,044,032,000 8127 :071,069,069,070,032,018,008 8133 :210,197,212,213,210,206,165 8139 :146,000,218,079,069,075,022 8145 :032,078,065,065,082,058,077 8151 :000,206,073,069,084,032,167 8157 :071,069,086,079,078,068,160 8163 :069,078,000,214,069,082,227 8169 :086,065,078,071,032,068,121 8175 :079,079,082,058,000,211,236 8181 :212,207,208,208,197,206,203 8187 :032,211,080,069,069,068,012 8193 :211,067,082,073,080,084,086 8199 :000,013,013,013,013,013,072

39

Page 39: 16 Voor de 64
Page 40: 16 Voor de 64

CALCULATIEBLAD 64

Michae1 Tinglof

Heeft u ooit de opbrengst van uw investeringen, uitgesplitst naar verschillende rentevoeten, willen berekenen? Hoe vaak heeft u geprobeerd om de beste combinaties bij het invullen van uw belastingaangiftebiljet te vinden? Wilt u een organisatieplan maken voor uw bedrijf Ge)? In al deze gevallen zal een calculatieblad u grote diensten kunnen bewijzen. Omdat u het programma zelf intikt, zijn de kosten slechts een fractie van de kosten van een vergelijkbaar commercieel programma. U kunt cassettes of diskettes gebruiken. Analyse met behulp van een calculatieblad is een van de meest gebruikte en nuttige toepassingen van een microcomputer. Met dit krachtige stuk gereedschap kunt u snel en eenvoudig allerlei variaties op een thema uitproberen en bekijken wat het antwoord op de vraag 'en stel nou, .. .' is. VisiCalc is wellicht het bekendste programma dat een calculatieblad levert. Veel mensen hebben een computer gekocht, enkel om met dit programma te kunnen werken. Als uw budget de aanschaf van VisiCalc niet toelaat, maar u wilt toch financiele modellen gebruiken, dan zal dit calculatieblad aan uw wensen voldoen. Het programma is bruikbaar voor kleine calculatiefunkties zoals die worden gebruikt in een klein bedrijf of thuis.

Analyse met een calculatieblad Wat houdt analyse met een calculatieblad nou eigenlijk in? In principe is het een programma dat u in staat stelt een financieel model op te stellen, waarna u verschillende opties kunt simuleren. Meestal hoort hierbij een getallentabel met gedefinieerde relaties. Nadat deze tabel gemaakt is, kunt u gaan experimenteren met de opties in de vorm van 'stel nou eens dat...' vragen door de gegeven waarden te veranderen. Omdat het programma alle onderlinge relaties van de getallen heeft opgeslagen, zorgt een verandering van een van de waarden, gelijk voor een verandering van alle andere waarden. Kijkt u als voorbeeld eens naar dit model van vier verschillende investeringen: (Merk op dat de opbrengsten van de verschillende opties slechts benaderingen zijn. Het totaal van de opbrengstenkolom is zonder betekenis.) Calculatieblad model

Kapitaal Opbrengst Netto Winst Spaarboekje Flo 10.000 .06 Flo 10.600 Flo 600 Renterekening Flo 8.000 09 Flo 8.720 Flo 720 Obligaties Flo 11.000 .11 Flo 12.210 Flo 1.120 Aandelen Flo 5.000 .12 Flo 5.600 Flo 600

Totaal Flo 34.000 .38 Flo 37.120 Flo 3.130

Als dit model in een calculatieblad wordt toegepast, worden er vier kolommen gedefinieerd (kapitaal, opbrengst, netto en winst) en vijf rijen (spaarboekje, renterekening, obligaties, aandelen en totaal). Tevens worden verschillende wiskundige relaties gedefinieerd. De nettokolom is gedefinieerd als het produkt van opbrengst en kapitaal, opgeteld bij het kapitaal. De winstkolom is gedefinieerd als het produkt van de opbrengst en kapitaal. De rij totaal is gedefinieerd als de som van de getallen in elke kolom. Nadat de definities ingevoerd zijn, kunt u gaan experimenteren met de resultaten van veranderingen van bepaalde waarden. Het calculatieblad-programma zal dan automatisch alle andere waarden (zo nodig) aanpassen.

41

Page 41: 16 Voor de 64

Als u in het bovenstaande model bijvoorbeeld een waarde in de kolom kapitaal verandert, verandert het programma de waarden in opbrengst, netto en in de rij totaal.

Bediening van Calculatieblad 64 Het gebruik van het calculatieblad is niet moeilijk. In de meeste gevallen zal de computer u vragen om bepaalde gegevens in te tikken. Het moeilijkste onderdeel is het opzetten van het model als u begint met werken. De beste methode om het te leren is gewoon proberen. We zullen als oefening het eerder genoemde model in het calculatieblad invoeren. De eerste stap is het intikken van LOAD en het RUNnen van het calculatieprogramma. Zodra u dit gedaan heeft, ziet u een leeg scherm met onderin het beeld een lijst met opdrachten. Dit wordt de opdrachtenmodus genoemd. Als er al een model gemaakt was, zou u dat boven de opdrachten zien, zodat u kon experimenteren door de waarden te veranderen. Als u echter net

begint, of als u een nieuw model wilt maken, moet u het model eerst invoeren.

Programmeren van het model Om het model te programmeren moet u naar de programmeermodus gaan. Dit is de eerste optie van de opdrachtenlijst. Druk gewoon op de P-toets. Het scherm wordt weer leeg, een lijst getallen verschijnt aan de linkerkant van het scherm en een nieuwe lijst met opdrachten verschijnt op de onderste drie rijen. De lijst met getallen aan de linkerkant zijn regelnummers. Op deze regels zal de definitie van het model opgeslagen worden. Om dit te doen, gebruikt u de invoegmodus (de eerste optie die nu op het scherm staat) door I te tikken. De computer vraagt u bij welke regel de in te voegen tekst geplaatst moet worden. Tik een 1. Deze regel bevat nu een EINDE opdracht, die de laatste opdracht van de modeldefinitie moet worden. Nu vraagt de computer hoeveel regels er ingevoegd moeten worden. Tikt u nu, voor dit voorbeeld, het getal 12. Rij en kolom Beginnend bij regel 1 en eindigend bij regel 12, zal de computer u telkens om de invoer voor een regel vragen. Tikt u telkens de volgende regels in. We zullen ze allemaal uitleggen.

1 NAAM RA=SPAARB (De regelnummers hoeven niet ingetikt te worden. Het programma zorgt voor de

regelnummers.) Deze regel zorgt ervoor dat de eerste regel van ons voorbeeldmodel de naam SPAARB krijgt. Dit staat natuurlijk voor 'spaarboekje'. De naam zal in de werkmodus telkens links op het scherm worden getoond. De code voor de naam geeft aan dat we een rij benoemen (R) en dat het de eerste rij (A) is die we benoemen. De naam mag maximaal zes letters lang zijn. U kunt 20 rijen benoemen. Elke rij is aangegeven door een enkele letter. Voer nu ook de namen voor de volgende rijen in: 2 NAAM RB=RENTE 3 NAAM RC=OBLIG 4 NAAM RD=AAND 5 NAAM RE= TOTAAL

De benoeming van deze vier rijen ging op dezelfde wijze als de benoeming van de eerste rij. Om de kolommen te benoemen kunt u, om te beginnen, tikken:

6 NAAM Cl=KAPIT,6 Deze regel benoemt de eerste kolom (C van Column) als KAPIT. In dit geval geeft de C aan dat een kolom wordt benoemd, en de 1 geeft aan welke kolom wordt benoemd. Naast de naam, moet elke kolom ook worden voorzien van een breedte. In dit voorbeeld is de breedte 6.

42

Page 42: 16 Voor de 64

Als u geen breedte opgeeft, gaat het programma uit van een breedte van 5 lettertekens. Elk element van de kolom (waaronder de naam) mag maximaal een lengte hebben die gelijk is aan de opgegeven breedte. 7 NAAM C2=OPBR,5 8 NAAM C3=NETTO,6 9 NAAM C4=WINST,6 Deze benoemingen zijn vergelijkbaar met de benoeming van regel 6. Nu worden de overige kolommen benoemd.

Definieren met DEFINITIE De volgende regel is lastiger om te begrijpen. Het is de eerste wiskundige uitdrukking die we in het model gebruiken. De bedoeling van de uitdrukking is om de kolom NETTO gelijk te maken aan de kolom KAPIT vermenigvuldigd met de kolom OPBR en opgeteld bij de kolom KAPIT. Om de opdracht te begrijpen moet u de gebruikte aanduidingen begrijpen. Voer regel 10 als volgt in:

10 DEFINITIE @3=@1*@2+@1 Om te beginnen, moet u in gedachten houden dat elk element in de matrix van rijen en kolommen een eigen aanduiding heeft. Deze bestaat uit de rij letter, gevolgd door het kolomnummer. Zo is bijvoorbeeld C2 het element in rij C en kolom 2. De DEFINITIE (van definieren) opdracht definieert een element als een uitdrukking die andere elementen en eventueel constanten als 2 of .56 bevat. Elk van de vier basis bewerkingen (optellen, aftrekken, vermenigvuldigen en delen) kan worden gebruikt. Er is echter geen vaste hierarchie van de bewerkingen. Het kan handig zijn om in een definitie-opdracht meer dan een element tegelijk te gebruiken. U kunt het @-symbool gebruiken om aan te geven dat u meer dan een element wilt aanduiden. Het symbool kan gebruikt worden om ofwel een kolom- ofwel een rij aanduiding te vervangen. Zo geeft bijvoorbeeld @3 in het bovenstaande voorbeeld alle rijen in kolom 3 aan. Ondanks het gebruik van @, wordt elk element toch apart behandeld. De hele statement van regel 10 kan worden vertaald als: Elke rij in kolom drie is gelijk aan elke rij in kolom 1 maal elke rij in kolom twee plus elke rij in kolom 1. Zorg ervoor dat u bij het gebruik, het @-symbool voor een kolomnummer zet en achter een rij letter. Als bovenstaande opdracht wordt uitgevoerd, wordt eerst gekeken naar het element waaraan de statement is toegekend. Als een @-teken wordt gevonden, begint de computer aan een lus, zodat elke rij (of, afhankelijk van de volgorde, elke rij) op beurt wordt afgehandeld. Als bijvoorbeeld @3 wordt uitgewerkt, neemt het programma telkens een kolom, werkt de uitdrukking uit en kent het resultaat toe aan de huidige kolom. Vervolgens wordt de volgende kolom genomen, net zolang tot alle kolommen zijn geweest Anderzijds, als een @ in de uitdrukking voorkomt, wordt deze door de huidige waarde vervangen. Als @l in de uitdrukking voorkomt, wordt deze vervangen door het huidige kolomnummer. Deze toekenning lijkt op het eerste gezicht wel ingewikkeld, maar is in feite tamelijk eenvoudig, terwijl het toch mogelijk is om ingewikkelde wiskundige relaties op eenvoudige wijze te

construeren. Als u dit alles nog niet helemaal kunt volgen, hoeft u zich niet ongerust te maken. U kunt tijdelijk gebruik maken van absolute toekenningen als A2.

11 DEFINITIE @4=@1*@2 12 DEFINITIE E@=A@+B@+C@+D@

Deze definities volgen dezelfde regels als de eerste definitie. U hoeft zich geen zorgen te maken als u een vergissing maakt. Tijdens het invoeren van de regel is de Delete-toets

43

Page 43: 16 Voor de 64

normaal te gebruiken. Als u een vergissing ontdekt in een al helemaal ingevoerde regel, terwijl u al met een volgende regel bezig bent, dan kunt u de WIJZIG opdracht gebruiken om de regel te veranderen. Als u een hele regel bent vergeten, gebruikt u INVOEGEN om de regel in het programma te plaatsen. Merk op dat de volgorde waarin de elementen met DEFINITIE worden gedefinieerd van belang is, omdat een definitie-statement soms gebruik maakt van de waarden die door andere definities zijn berekend. Om met het model te gaan experimenteren, nu het klaar is, keert u eerst terug naar de normale werkmodus. Dit doet u door de E-toets (van Exit=uitgang) in te tikken. Het scherm wordt gewist, de namen van de benoemde rijen en kolommen verschijnen, en op alle plaatsen in het rooster verschijnen nullen. De volgende stap is uiteraard om de nullen te vervangen door nuttiger getallen.

Invoer van gegevens De WUZIG opdracht biedt u de mogelijkheid om elke willekeurige waarde op het scherm te veranderen. U tikt eerst een W. Het programma vraagt u dan om een rij- en kolomnummer. U kunt dezelfde aanduidingen gebruiken als in de programmeermodus, bijvoorbeeld A3, om een rij met een letter, en een kolom met een cijfer aan te geven. Heeft u een kolom en rij opgegeven, dan vraagt de computer u om de waarde die daar moet worden geplaatst. Zodra u deze waarde heeft opgegeven, wordt deze in de bedoelde rij en kolom geplaatst. De andere waarden worden echter niet herberekend. Dit calculatieblad-programma is geschreven in BASIC en daardoor niet zo heel erg snel. Daarom is gekozen voor een methode waarbij u eerst zoveel waarden als u wilt in het rooster kunt veranderen, zonder dat de computer de andere waarden gaat herberekenen. Als u klaar bent met het invoeren van waarden, en u wilt het resultaat zien, gebruikt u de RE CALCULEER opdracht door de R-toets in te drukken. Het programma berekent dan alle waarden aan de hand van de door u ingetikte gegevens en de regeldefinities. Als eerste stap kunt u de opbrengstwaarden in kolom 2 invoeren. Gebruik de WUZIG opdracht om .06 in te voeren voor rij A, kolom 2; om .09 in te voeren voor rij B, kolom 2; enzovoorts, totdat alle opbrengstwaarden uit de tabel zijn ingevoerd. U kunt nu testbedragen kapitaal (kolom 1) gaan invoeren, en de computer uw totale winst (kolom 4) laten berekenen door op R te drukken. U heeft hiermee uw eerste financiele model ontwikkeld. Experimenteer flink met dit model door de waarden met de WIJZIG opdracht te veranderen en vervolgens de computer de nieuwe resultaten uit te laten rekenen. Stel voor uzelf ook andere modellen op, die u vervolgens in dit calculatieblad inbrengt.

Opslag Er is nog een laatste taak voor u weggelegd, voordat u echt met een calculatieblad gaat werken: opslaan op cassette of diskette. Elk model kan opgeslagen worden door de Save-opdracht van het programma. Later kunt u een bepaald model weer terugkrijgen met behulp van de Laad-opdracht. Als u een calculatieblad met een model erop (een werkblad) wilt opslaan, hoeft u alleen een bestandsnaam op te geven van maximaal 10 lettertekens lang. U hoeft de diskdrive niet met een ,8 aan te geven. Alleen de bestandsnaam is voldoende. Als u een werkblad wilt laden, tikt u eerst de L, wacht u op de vraag van de computer, en tikt u de bestandsnaam. Als u werkbladen wilt opslaan en weer laden met een cassette-recorder in plaats van een diskdrive, moet u het calculatieblad-programma een klein beetje aanpassen. Verander de volgende règels:

44

Page 44: 16 Voor de 64

510 OPEN1,1,1,I$ :rem 76 610 OPEN1,1,0,I$:IFST<>OTHEN670 :rem 50 1610 OPEN1,1,1,I$:FORX=lT0100 :rem 153 1710 OPEN1,1,O,I$:IFST<>OTHEN1750 :rem 148

Naslaggids Hier volgt een lijst van alle instructies die het programma kent, met een korte omschrijving bij elke instructie. Wijzig waarde. Hiermee kunt u de waarde van elk element van het scherm veranderen. Gebruik de normale aanduiding voor rijen en kolommen om het gewenste element aan te geven. RecaIculeer Deze opdracht wist het scherm en berekent alle waarden opnieuw op grond van de DEFINITIE-statements. Save werkblad. Deze opdracht slaat het werkblad inclusief alle ingevoerde gegevens en de instructies die in de prograrnmeermodus opgegeven zijn, op een diskette of cassette op. Load werkblad.Deze opdracht laadt een werkblad, dat op bovenstaande wijze is

opgeslagen, in het geheugen. Einde. Hiermee verlaat u het programma en keert u naar BASIC terug. Program mode (=programmeermodus). Hiermee gaat u naar de programmeermodus waarin de volgende opdrachten gebruikt worden: Invoegen .. Invoegen van een of meer regels in de lijst met instructies, beginnend bij de regel die u opgeeft. List (=programmaregels laten zien). List een bepaald deel van het programma. U voert een regelnummer in, het scherm wordt gewist en de regels vanaf het gegeven regelnummer tot het regelnummer plus 20 worden op het scherm gezet. Wijzig. Accepteert een regelnumer en biedt u de mogelijkheid die regel te veranderen. Save (=sla op). Slaat de instructies maar niet de getallen van het werkblad op. Zie. Laadt een, met het hiervoor genoemde Save opgeslagen, werkblad in het geheugen van de computer. Einde. Keert terug naar de normale werkmodus.

Instructies binnen programmaregels Naam. Geeft een kolom of rij een naam, en stelt de lengte van een kolom in. Bijvoorbeeld: NAAM C3=TEST,4 Definitie .. Stelt een element gelijk aan een uitdrukking. Bijvoorbeeld: DEFINITIE A3=C3+Bl

Plus en min Dit calculatieblad-programma zal waarschijnlijk vooral zijn diensten bewijzen thuis of op een klein kantoor. Het programma is weliswaar beperkt tot een tabel met 20 rijen en, afhankelijk van de breedte der kolommen, 5 of 6 kolommen, maar het is toch een krachtig instrument. U kunt ermee experimenteren met financiele modellen, en tijdrovende en fouten veroorzakende doorhalingen en verbeteringen mee voorkomen. Door experimenten kunt u verschillend opties uitproberen en de beste selecteren.

Opmerkingen bij het programma - Deze opdracht wist het werkblad:

45

Page 45: 16 Voor de 64

DEFINITIE @@=O - Vergeet niet dat u ook constanten, zoals de nul in de vorige statement, binnen een uitdrukking kunt gebruiken. - De Load-opdracht in de programmeermodus kan gebruikt worden om een werkblad dat in de

werkmodus is opgeslagen, te laden zonder de numerieke gegevens. - Als het programma in BASIC terecht is gekomen, en u wilt weer terug naar het

calculatieblad, zonder gegevens te verliezen, dan kunt u het programma weer beginnen door middel van 'GOTO 100'.

Calculatieblad 64 Voor het invoeren van dit programma zonder fouten. kunt u de 'automatische controleur' gebruiken. Zie bijlage C.

10 rem commodore 64 rekenblad :rem 220 20 rem :rem 70 30 dimpc%(110),pc$(110),wk(20,9),rn$ (20),cn$(9),cw(9) ,cp(9) :rem 43 40 x=O:sl=O:ll=O:l=O:cc=O:cr=O :rem 10 45 r$(1)="definitie:":r$(2)="naam:": r$(3)="einde.":pc%(1)=3 :rem 228 50 s$=" [39xSPATIE]" : rem 93 60 c$=" [HOME] [24xDOWN]" : rem 249 65 poke53280,15:poke53281,1:print"[GREY 2)"

:rem 154 70 print" [CLR) "left$(c$,8)tab(10) " rekenblad analyse" :rem 152 80 rem :rem 76 90 printleft$(c$,25)tab(6) "druk een toets voor vervolg";:gosub10000:x$=""

:rem 87 100 gosub5000 : rem 214 105 gosub6000 : rem 220 110 print"[RVS ON)p[RVS OFF)rogramm eer [RVS ON]w[RVS OFF)ijzig waarde [RVSON) r[RVS OFF]ecalculeer" :rem 63 120 print"[RVS ON]s[RVS OFF)ave reke nblad [RVS ON]l[RVS OFF]aad rekenblad [RVS ON) e [RVS OFF) inde" : rem 6 130 gosub10000 :rem 5 160 ifx$="r"then100 :rem 53 170 ifx$="e"thenprint" [CLR] ": end: goto 100 :rem 17 180 ifx$="s"then500 :rem 60 190 ifx$="1"then600 :rem 55 200 ifx$="p"then1000 :rem 94 210 ifx$="w"then400 :rem 57 220 goto105 :rem 99 400 gosub6000:print"welke rij verand eren:";:gosub10000:print :rem 19 410 cr=asc(x$)-64:ifcr<lorcr>20then105

46

Page 46: 16 Voor de 64

: rem 8 415 print"welke kolom veranderen:";: gosub10000:print :rem 54 420 cc=val(x$) :ifcc=Othen105 :rem 138 430 print"voer waarde in:";:i=20:gosub 9000:wk(cr,cc)=val(i$) :rem 91 440 gosub5700:goto105 :rem 237 500 gosub6000:print"naam rekenblad w ordt";:i=10:gosub9000:ifi$=""then105 :rem 118 510 open1,8,2,i$+",s,w" :rem 197 515 forx=lto100:print#1,pc%(x)chr$(1 3)chr$(34)pc$(x)chr$(13); :rem 228 520 ifpc%(x)<>3thennext :rem 162 530 forcr=lto20:forcc=lto9:print#1,w k(cr,cc)chr$(13); :next:next :rem 220 540 print#1,chr$(13); :close1:goto100 :rem 124 600 gosub6000:print"laad rekenblad:" ;:i=10:gosub9000:ifi$=""then105 :rem 22 610 open1,8,2,i$+",s,r":ifst<>Othen6 70 :rem 167 620 forx=lto100:input#1,x$,pc$(x) :t= st:pc%(x)=val(x$) :ift<>Othen670 :rem 88 630 ifpc%(x)<>3thennext :rem 16 640 forcr=lto20:forcc=lto9:input#1,x $:t=st:wk(cr,cc)=val(x$) :ifst<>Othen67 o :rem 249 650 next:next:close1:rc=1:goto100 :rem 117 670 print"laadfout.":print"druk een toets voor vervolg";:gosub10000 :rem 229 680 close1:rc=1:goto100 :rem 134 1000 fl=l :rem 193 1010 print"[HOME]";:forx=fltofl+20:print s$:print"[UP]"x;r$(pc%(x»" "pc$(x) :next

:rem 157 1020 gosub6000 : rem 9 1030 print" [RVS ON]i[RVS OFF]nvoegen [RVS ON]z[RVS OFF]ien [RVS ON]v[RVS OFF] erwiJder [RVS ON]w[RVS OFF]ijzig [RVS ON] I[RVS OFF]ees" : rem 9 1035 print" [RVS ON]s[RVS OFF]ave [RVS ON] e [RVS OFF] inde"; : rem 177 1040 gosub10000 :rem 54 1050 ifx$="e"thenrc=1:goto100 :rem 205 1060 ifx$="i"then1200 :rem 142 1070 ifx$="z"then1300 :rem 161 1080 ifx$="v"then1400 :rem 159 1090 ifx$="w"then1500 :rem 162 1100 ifx$="s"then1600 :rem 151 1110 ifx$="I"then1700 :rem 146 1120 goto1020 : rem 192 1200 gosub6000:print"invoegen voor r egel:";:gosub8990:sl=val(i$) :rem 228 1210 ifsl=Othen1020 :rem 81

47

Page 47: 16 Voor de 64

1220 print"aantal regels:";:gosub899 O:n=val(i$) :n1=100-n:ifn=Othen1020 :rem 240 1230 forx=n1toslstep-1:pc%(x+n)=pc%( x) :pc$ (x+n)=pc$ (x) :next :rem 120 1235 n=n-1:forl=sltosl+n:gosub8000:next

: rem 1 1240 goto1010 :rem 194 1300 gosub6000:print"start vanaf reg el:"; :gosub8990 : rem 135 1320 ifval(i$)=Oorval(i$»80then1020

: rem 61 1330 fl=val(i$) :goto1010 : rem 108 1400 gosub6000:print"verwijder vanaf regel:"; :gosub8990:s1=val(i$) :ifsl=O

then1020 : rem 42 1410 print"tot regel:";:gosub8990:11 =val(i$) :ifll=Othen1020 :rem 118 1420 n=11-sl+1:forx=slto100-n:pc%(x) =pc%(x+n) :pc$(x)=pc$(x+n) :next :rem 241 1430 goto1010 : rem 195 1500 gosub6000:print"verander regeln ummer:";:gosub8990:1=val(i$) :rem 30 1510 gosub8000:goto1010 :rem 68 1600 gosub6000:print"save programma als

: rem 143 1610 open1,8,2,i$+",s,w":forx=lto100 : rem 18 1620 print#1,pc%(x)chr$(13)chr$(34)p c$(x)chr$(13) ; : rem 247 1630 ifpc%(x)<>3thennext :rem 213 1640 close1:goto1000 :rem 166 1700 gosub6000:print"laad programma:" ;:i=10:gosub9000:ifi$=""then1020 : rem 147 1710 open1,8,2,i$+",s,r":ifst<>Othen 1750 : rem 9 1720 forx=lto100:input#1,x$,pc$(x) :p c% (x) =val (x$) : rem 133 1730 ifpc%(x)<>3thennext : rem 214 1740 close1:goto1000 : rem 167 1750 print"laadfout":print"druk een toets voor vervolg";:gosub10000 : rem 231 1760 close1:goto1000 : rem 169 4999 end : rem 182 5000 ifrc=Othen5400 : rem 78 5005 forx=lto9:rn$(x)="":cn$(x)="":c w(x)=O:cp(x)=O:next ~ rem 218 5007 forx=10to20:rn$(x)="":next :rem 79 5010 rc=0:forl=lto100:ifpc%(1)=3then 5310 : rem 93 5020 ifpc%(1)<>2then5300 : rem 78 5030 x$=left$(pc$(l),l) :n$=mid$(pc$( 1),2,1) : rem 25 5040 ifx$="c"then5100 :rem 141 5050 ifx$="r"then5200 : rem 158

48

Page 48: 16 Voor de 64

5060 goto5900 5100 forx=4tolen(pc$(1)) :ifmid$(pc$( 1),x,1)<>","thennext:ln=5:goto5120 51101n=val(mid$(pc$(1),x+1)) 5120 n=val(n$) :ifn=Othen5900 5130 cn$(n)=mid$(pc$(1),4,x-4) :cw(n) =ln 5140 goto5300 5200 n=asc(n$)-64:ifn<lorn>20then590

: rem

: rem :rem : rem

: rem : rem

210

195 85

122

140 203

o 5210 rn$(n)=mid$(pc$(1),4) 5300 nextl

:rem 147 :rem 107 :rem 83

5310 cp(1)=0:forx=2to9:cp(x)=cp(x-1) +cw(x-1)+abs(cw(x»0) :next 5400 print"[CLR] [RVS ON]";:forx=lto 9:printtab(cp(x)+8)right$(s$+cn$(x),c w (x) ) ; 5410 next:print

:rem

: rem : rem

5420 forx=lto20 :print" [RVS ON] "left$ (rn$(x),6) :next : rem 5450 forl=lto100:ifpc%(1)=3then5700 :rem 5460 ifpc%(1)<>lthen5690 : rem 5470 x$=left$(pc$(1),2) :ac=val(right$ (x$,l)) :ifac<lorac>9thenac=0 : rem 5480 ar=asc(x$)-64:ifar<lorar>20then

164

104 208

130 44 97

76

ar=O :rem 168 5490 cc=ac:ifac=Othenrc=1:forcc=lto9 :rem 246 5495 cr=ar:ifar=Othenrr=1:forcr=lto2 o : rem 111 5500 ifmid$(pc$(1),3,1)<>"="then5900 :rem 176 5510 x$=mid$(pc$(1),4) :op$="+":s=l:t =0 :rem 38 5520 forx=stolen(x$) :n$=mid$(x$,x,l) :ifn$="+"orn$="-"orn$="I"orn$="*"then 5550 5540 nextx 5550 n$=mid$(x$,s,x-s) :s=x+1 5560 ifn$="O"orval(n$)<>Othenv=val(n $) :goto5610 5565 iflen(n$)<>2then5900 5570 tr$=left$(n$,l) :tc$=right$(n$,l

: rem 166 :rem 101 : rem 74

:rem 26 :rem 175

) :rem 59 5580 tr=asc(tr$)-64:iftr<lortr>20then tr=cr :rem 168 5590 tc=val(tc$) :iftc<lortc>9thentc= cc 5600 v=wk(tr,tc) 5610 ifop$="+"thent=t+v 5620 ifop$="-"thent=t-v 5630 ifop$="I"thent=t/v 5640 ifop$="*"thent=t*v 5650 ifx<len(x$)thenop$=mid$(x$,x,l) :goto5520

49

: rem 155 : rem 186 : rem 95 : rem 100 : rem 105 : rem 96

:rem 185

Page 49: 16 Voor de 64

5660 wk(cr,cc)=t 5670 ifrr=lthennextcr 5680 ifrc=lthennextcc 5690 rr=0:rc=0:next1 5700 print" [HOME] [DOWN]"; :forcr=lto2 0:ifrn$(cr)=""then5795 5710 forcc=lto9:printtab(cp(cc) +8) ; 5720 x$=mid$(str$(wk(cr,cc»,2) 5730 if1en(x$)<=cw(cc)then5790 5740 forx=lto1en(x$) :ifmid$(x$,x,l)< >"."thennext:goto5790 5750 n$=left$(x$,x-1) 5760 if1en(n$)<cw(cc)thenn$=n$+mid$( x$,x,cw(cc)-len(n$» 5780 x$=n$ 5790 printright$(s$+x$,cw(cc»;:next

:rem 156 :rem 118 :rem 89 :rem 230

:rem 34 :rem 123 :rem 220 :rem 248

:rem 227 :rem 126

:rem 230 :rem 255

cc :rem 74 5795 print:nextcr :rem 117 5800 return : rem 173 5900 gosub6000:print"syntaxis fout i n rege1"1 :rem 50 5910 print"druk een toets voor vervo 19"; :gosub10000 :rem 142 5920 return :rem 176 6000 print1eft$(c$,22)s$:prints$:print s$:print1eft$(c$,22); :rem 118 6010 return : rem 167 8000 gosub6000:print1; :rem 92 8010 i=35:gosub9000:ifi$=""then8000 :rem 232 8020 forx=lto1en(i$) :ifmid$(i$,x,l)< >" "thennext 8030 pc$(1)=mid$(i$,x+1) :pc%(l)=O em 244 8040 x$=left$(i$,x-1) :forx=lto3:ifx$ =r$(x)thenpc%(l)=x 8050 next:return 8990 i=3:gosub9000 8992 ifva1(i$)<lorva1(i$»100theni$= nn

8995 return 8999 i=3 9000 i$="":poke204,0:poke205,20 9010 getx$:ifx$=""then9010

:rem 73

:rem 235 :rem 38 :rem 22

:rem 167 :rem 191 :rem 156 :rem 160 :rem 229 :rem 152 9020 c=asc(x$) :ifc=20then9060

9025 ifc=13thenpoke204,1:print" ": return

9030 if(c>31andc<95)or(c>192andc<219 )then9040 9035 goto9010 9040 if1en(i$)=ithen9010 9050 printx$; :i$=i$+x$:goto9010 9060 ifi$=""then9010 9070 printx$; :i$=left$(i$,len(i$)-l)

50

:rem 185

: rem 74 :rem 212 : rem 120 : rem 71 :rem 69

Page 50: 16 Voor de 64

:goto9010 10000 poke204,0:poke205,20 10010 getx$:ifx$=""thenl0010 10020 poke204,1:printx$; : return

51

:rem 105 : rem 160 :rem 53 :rem 173

Page 51: 16 Voor de 64
Page 52: 16 Voor de 64

SCHERM-80

Gregg Peel en Kevin Martin Heeft u ooit een scherm met 80 kolommen willen hebben? 'SCHERM-80' verandert uw 64 in een 80-koloms-computer zonder de normale opmaakfunkties van de toetsen te beinvloeden. In dit hoofdstuk vindt u ook 'MMT-80' om uw eigen. op maat gemaakte. 80-koloms-letters te maken met een joystick.

'SCHERM-80' biedt een volledig 80-koloms-scherm en geeft u de mogelijkheid uw Commodore 64 te gebruiken om BASIC-programma's te schrijven, op te maken en zelfs te runnen. Dit alles met een 80-koloms scherm! Zelfs enkele commerciele programma's zullen met een 80-koloms scherm werken. U kunt alle cursor-besturingsfunkties blijven gebruiken. Het programma werkt naast de normale schermopmaak. U kunt snel van 40 kolommen naar 80 kolommen en vice versa omschakelen. Het mooiste is, dat Scherm-80 maar een klein beetje geheugenruimte gebruikt. Het programma bestaat uit ongeveer 3 Kbyte machinetaal die wordt opgeslagen in RAM, 'onder' het ROM. Daarnaast worden er 43 bytes geplaatst in een weinig gebruikt RAM -gebied (locaties 71 0-753). Omdat het grootste deel van Scherm-80 dezelfde geheugenlocaties gebruikt als het bedrijfssysteem, en de 43 geheugenlocaties in het RAM normaal gesproken niet worden gebruikt, werkt Scherm-80 zonder enig merkbaar verlies aan programmeerruimte.

Invoeren en instellen Scherm-80 is gelist in MTR-vorm. (MachineTaal Redacteur) Deze MTR-vorm zorgt ervoor dat het intikken van een machinetaal programma veel eenvoudiger is en dat het programma bijna altijd zonder fouten wordt ingetikt, zodat het de eerste keer gelijk goed werkt. Voordat u Scherm-80 kunt intikken, moet u eerst het MTR-programma in bijlage D intikken. Dit programma zult u verder ook vaak nodig hebben, want het wordt voor veel machinetaalprogramma's gebruikt. MTR heeft zelfs een ingebouwd numeriek toetsenbord, zodat het intikken van al die getallen een stuk sneller gaat. Als u cassettes gebruikt om programma's op te slaan, moet u het MTR programma een klein beetje aanpassen. Deze verandering betreft alleen MTR en is alleen nodig als u MTR wilt gebruiken voor het intikken van Scherm-80. Verander regel 763 van MTR in: POKE 780,1: POKE 781,DV: POKE 782,0: SYS 65466 Het enige verschil is nu dat de POKE782,1 in de originele listing veranderd is in POKE 782,0. Sla deze versie van MTR op om Scherm-80 te kunnen intikken. Als u klaar bent met het intikken, opslaan en testen van Scherm-80, kunt u de POKE 782 weer in de originele staat brengen om MTR voor het intikken van andere programma's te gebruiken. Deze aanpassingen gelden alleen voor cassette-gebruikers! Nadat u MTR geladen en gerund heeft, vraagt de computer u om een begin- en een eindadres voor Scherm-80. De adressen zijn:

Beginadres: 49152 Eindadres: 52811

U kunt het programma laden zonder de gebruikelijk, 1 die bij de meeste machinetaalprogramma's hoort. Als het programma veilig geladen is, kunt u het programma listen. U moet nu een enkele regel zien, regel 0, met een SYS-opdracht (SYS 2061). Tik nu RUN en Scherm-80 werkt. Om het programma te stoppen en terug te keren naar het normale 40-kolorns-scherm, drukt u op RUN/STOP-RESTORE. Om daarna weer naar een

53

Page 53: 16 Voor de 64

80-koloms-scherm terug te keren, tikt u SYS 710, gevolgd door RETURN. U kunt een extra 'back-up' versie van uw programma maken door het programma net als een gewoon BASIC programma te saven:

SAVE "bestandsnaam",8 (diskette) SAVE "bestandsnaam" (cassette)

Om te kunnen gaan programmeren met 80 kolommen, tikt u gewoon NEW. Scherm-80 bevindt zich nog wel in het geheugen, maar de hinderlijke regel 0, die u eerder zag, is

uitgewist.

Gebruik van 80 kolommen Het eerste dat u zal opvallen als u de 80-kolomsmodus krijgt, is het formaat van de :lettertekens. Deze zijn opvallend kleiner. Omdat het onmogelijk is het scherm groter te maken, zorgt het toevoegen van 40 kolommen aan de 40 die de 64 kent ervoor dat de lettertekens elk slechts half zo breed kunnen zijn. Sommige televietoestellen zijn niet scherp genoeg om deze kleine lettertjes te kunnen lezen. In dat geval raden we u aan een video-monitor te gebruiken en de kleurinstelling minimaal te maken. Het kan dat u een of meer van de lettertekens wilt aanpassen aan uw eigen smaak. Het programma Maat-80, dat later in dit hoofdstuk aan de orde komt, is daarvoor ontworpen. Scherm-80 geeft een andere cursor dan u gewend bent. In plaats van een knipperend blokje, wordt de printpositie aangegeven met een onderstrepingsteken. Net als de normale cursor kan deze scherm-80 cursor over het gehele scherm worden verplaatst. U kunt alle normale cursor-besturings-funkties gebruiken, net als u anders ook doet, om in te voegen, te verwijderen, de cursor naar links boven te verplaatsen, het scherm te wissen, of om BASIC-programmaregels te maken. Zowel hoofdletters/grafiek als kleine letters/hoofdletters zijn mogelijk in Scherm-80, maar u kunt niet wisselen tussen deze twee door de SHIFT -Commodore-toetsen in te drukken. In plaats hierva..'l kiest u voor de kleine/hoofdletters door tegelijk CTRL en N in te drukken, of door de opdracht PRINT CHR$(14) te geven (dit kan zowel direct als in een programma). Om terug te keren naar hoofdletters/grafiek geeft u de opdracht PRINT CHR$(142). Ook deze opdracht kunt u zowel direct als in een programma geven. Beide opdrachten beinvloeden alleen de lettertekens die na de opdracht worden weergegeven. Dat betekent dat u beide soorten lettertekens (bijvoorbeeld kleine letters samen met grafiek) tegelijk op het scherm kunt hebben. Uw programmeermogelijkheden zijn hierdoor een stuk flexibeler. De kleur van de achtergrond, tekst of rand kan worden veranderd door de juiste kleurwaarde in locatie 53281 (achtergrond), locatie 646 (tekst) of locatie 53280 (rand) te POKEn. Door de tekstkleur te veranderen, verandert de kleur van alle lettertekens op het scherm. Als u de achtergrond- of tekstkleur binnen een programma wilt veranderen, moet u een PRINT CHR$(13) opdracht geven nadat u een kleurwaarde in de juiste locatie heeft gePOKEt. Omdat het kleurgeheugen van de 64 helemaal vastligt, is het onmogelijk om echte 80-kolomskleur te hebben. Kleurcodes in een PRINT-opdracht worden door Scherm-80 dan ook niet herkend. Scherm-80 vat deze kleurcodes op als grafische tekens. De kleur van de weergave op het scherm wordt alleen bepaald door de kleurwaarde in locatie 646.

Grafische en geluidsroutines Scherm-80 kan zowel met normale tekst als met sprites, hoge resolutie en geluid worden gebruikt. Net als het normale Commodore 64 scherm. Omdat het programma in feite gebruik maakt van een scherm met hoge resolutie kunt u het scherm tevens gebruiken voor grafische

54

Page 54: 16 Voor de 64

afbeeldingen. U kunt zelfs tegelijk tekst en grafiek op het scherm hebben. Om punten op het grafische scherm met hoge resolutie te zetten (of andere grafische opdrachten uit te voeren) is het belangrijk dat u weet hoe u gebruik maakt van PEEKs en POKEs bij het aansturen van het scherm. Het hoge-resolutie scherm van Scherm-80 bevindt zich op geheugenlocatie 57344 ($EOOO). Omdat het schermgeheugen adressen met de ROM deelt, kunt u wel grafische afbeeldingen op het scherm POKEn, maar is het niet mogelijk om van het scherm te PEEKen. Dit geeft waarden van de ROM. Om van het scherm te PEEKen, moet u eerst de interrupts (onderbrekingen) uitschakelen en vervolgens locatie 1 gebruiken om de 64 te herschikken. Locatie 1 staat u toe om selectief ROM-locaties door RAM te vervangen. Daardoor is het mogelijk om met de 64 de beschikking te hebben over de volledige 64 Kbyte aan RAM. Zodra u de 64 opnieuw geschikt heeft, kunt u het scherm PEEKen. Omdat het bedrijfssysteem de ROMs moet kunnen aanroepen om goed te kunnen werken, moet u onmiddellijk hierna de 64 in zijn normale toestand terugbrengen en de interrupts weer aanschakelen. Hier heeft u een voorbeeld in BASIC:

10 POKE 56334, PEEK(56334)AND254: REM interrupts uit 20 POKE 1,53: REM herschikken 64 30 PRINT PEEK(57344) : REM PEEK RAM 40 POKE 1,55 : REM 64 weer normaal 50 POKE 56344, PEEK(56344)OR1 : REM interrupts weer aan

Om sprites te kunnen gebruiken, moeten alle gegevens voor de sprites in hetzelfde blok van 16 Kbyte als het hoge-resolutie-scherm zitten. De locaties 49512 ($COOO) tot en met 53247 ($CFFF) zijn uitermate geschikt voor het plaatsen van de spritegegevens. De spritewijzers van Scherm-80 bevinden zich op 53248+1016 (54264) tot en met 53248+1023 (54271). Om sprite 0 zijn gegevens uit 49152 ($COOO) te laten halen, moet een nul geplaatst worden in locatie 53248+1016 (54264). Omdat POKEs naar dit gebied normaal gesproken worden onderschept door de ilO-chip, moet u de interrupts en ilO uitschakelen om in deze locaties te kunnen POKEn. De volgende BASIC-prograrnmaregels plaatsen een sprite op het 80-kolomsscherm. Tik de regels in, run het en aanschouw het effect.

10 V=53248 20 POKE V,100: POKE V+1,100 30 POKE v+39,2

"40 POKE 56334, PEEK(56334)AND254 50 POKE 1, PEEK(1)AND251 60 POKE 53248+1016,0 70 POKE 1, PEEK(1)OR4 80 POKE 56334, PEEK(56334)OR1 90 POKE V+21,1

Geluiden creeren vanuit scherm-80 gaat op precies dezelfde wijze als vanuit een normaal scherm. Omdat u de benodigde informatie naar de SID-chip (in het ilO-gebied) POKEt om geluid te maken, hoeft u niet, zoals bij de grafiek in hoge resolutie of de sprites, de interrupts uit te schakelen of geheugenblokken te verplaatsen. De normale POKEs zijn voldoende.

55

Page 55: 16 Voor de 64

Andere programma's met Scherm-80 Dit programma is ontworpen om elke aanroep van de normale Kemal PRINT -routine ($FFD2) te onderscheppen. Software die deze routine niet gebruikt, of die direct naar het scherm POKEt, zal niet goed werken met Scherm-80. Een voorbeeld van zo'n programma dat de PRINT-vector passeert is het DOS 'wig' (wedge) programma (op de TEST/DEMO diskette die bij de Commodore 1541 diskdrives wordt geleverd). Gelukkig kan dit probleem worden opgelost door ervoor te zorgen dat alle PRINTs langs de normale vector lopen. Dit gebeurt als u onderstaande routine gebruikt in plaats van het normale DOS-opstartprogramma (C-64 Wedge).

10 IF A=O THEN A=l : LOAD "DOS 5.1",8,1 20 FOR 1=1 TO 7 : READ A : POKEA,210 : POKE A+1,255 : NEXT 30 DATA 52644, 52650, 52712, 52726, 52752, 52765, 53075 40 SYS 52224

Met deze veranderingen, zal het DOS-ondersteuningsprogramma goed met Scherm-80 werken. Programma's die veel gebruik maken van sprites en programma's die het schermgeheugen verplaatsen of anderzins de normale indeling van de 64 veranderen, moeten worden vermeden. Snelschrift, het populaire tekstverwerkende programma van COMPUTE!, gebruikt de PRINT-vector op $FFD2 niet. Het is daardoor niet samen met Scherm-80 te gebruiken. Sorry.

Maat-80: Uw eigen letters op maat Het tweede programma, Maat-80, biedt u de mogelijkheid uw eigen lijst met lettertekens te maken, om deze met Scherm-80 te gebruiken. Het programma is erg eenvoudig te gebruiken. D heeft een joystick, die aangesloten is op poort 2, nodig. Maat-80 'leent' de lijst met lettertekens van scherm-80, om deze te verplaatsen naar een veilige plaats in het geheugen, waar de lijst kan worden bijgewerkt. Na het veranderen, kan de lijst weer aan het scherm-80 programma worden teruggegeven, of op cassette of diskette worden opgeslagen. Net als Scherm-80 staat het programma Maat-80 in MTR-vorm. Nadat u het MTR-programma geladen en gerund heeft, moet u de volgende adressen als begin- en eind adres opgeven:

Beginadres: 49152 Eindadres: 51245

Tik nu programma 2 in. Als u klaar bent, kunt u een kopie op cassette of diskette opslaan. Zet nu uw computer uit, en vervolgens weer aan. Om Maat-80 te laden, tikt u:

LOAD "Maat-80",8,1 (diskette) LOAD "Maat-80", 1, 1 (cassette)

(Deze naam bij het laden gaat ervan uit dat u de naam 'maat-80' gebruikte bij het opslaan van het programma. Merk op dat u bij maat-80 wel de code, 1 nodig heeft, terwijl die bij Scherm-80 niet nodig was.) Nadat u Maat-80 heeft geladen, tikt u NEW om de BASIC wijzers te herstellen. Laadt vervolgens Scherm-80 in het geheugen en tik SYS 49152. Hierdoor krijgt u Maat-80 terwijl tegelijkertijd de lijst met lettertekens van Scherm-80 wordt aangeroepen. De lijst van Scherm-80 wordt op de onderste helft van het scherm weergegeven. Het letterteken dat aangepast gaat worden, wordt omgeven door een gele cursor. In de linker bovenhoek van het scherm, wordt dit letterteken extra groot weergegeven ten behoeve van het aanpassen. Korte instructies vindt u aan de rechterkant van het scherm.

56

Page 56: 16 Voor de 64

Aanpassen van lettertekens U kunt kiezen welk letterteken u wilt aanpassen door de cursor over het onderste deel van het scherm te verplaatsen door middel van de joystick, of de cursortoetsen. De cursortoetsen zijn sneller. Het blauwe, knipperende vierkant in de linker bovenhoek geeft aan welk lichtpunt u op dat moment kunt aanpassen. Om een lichtpunt in te vullen, drukt u op de vuurknop van de joystick. Als het lichtpunt leeg was, wordt het daardoor gevuld. Was het lichtpunt gevuld, dan wordt het doorzichtig. Door de vuurknop nog een keer in te drukken, kan de vulling van het lichtpunt weer worden veranderd. Druk tegelijk op SHIFT en CLR/HOME om alle lichtpunten van het aan te passen letterteken, te wissen (de lettertekens die u al aangepast heeft, worden hierdoor niet beinvloed). Om de cursor op het eerste letterteken te plaatsen, drukt u op CLRlHOME zonder de SHIFT-toets. U kunt een letterteken van de ene positie naar de andere kopieeren door de fl-toets in te drukken als de cursor op het te kopieeren letterteken staat. De gegevens van het letterteken worden nu in een buffer geplaatst. Verplaats de cursor vervolgens naar de plaats waar de kopie moet komen, en druk op de f7 -toets, waardoor de gegevens uit de buffer op die plaats worden gezet. De S-toets zorgt ervoor dat de lijst met lettertekens op cassette of diskette wordt geplaatst, als een kort programmabestand. U kunt zo'n bestand weer in het geheugen laden door de L-toets te gebruiken. Bij het opslaan of laden, vraagt het programma u altijd eerst om een bestandsnaam. Vervolgens wordt om een T van tape (cassette) of een D van diskette gevraagd. Als er tijdens een diskbewerking iets fout gaat, zal het programma een foutmelding geven. Als u de nieuwe lijst met lettertekens als een permanent onderdeel van Scherm-80 wilt hebben, drukt u op X. Hierdoor wordt de nieuw gedefinieerde lijst met lettertekens weer in Scherm-80 gezet, en springt het programma terug naar BASIC. U kunt de nieuwe versie van Scherm-80, met de nieuwe lijst lettertekens, opslaan door: SAVE"bestandsnaam",8 (diskette) SAVE"bestandsnaam",l (cassette)

bestandsnaam' is de naam van uw nieuwe versie van scherm-80. (Om verwarring te voorkomen, kunt u de oude versie van Scherm-80 verwijderen van de diskette of cassette.) De volgende keer dat u Scherm-80 gebruikt, heeft u de nieuwe lijst met lettertekens in het programma zitten. Als u verschillende lijsten met lettertekens wilt gebruiken bij Scherm-80, dan moet u de verschillende lijsten op cassette of diskette zetten met de S-optie van Maat-80. U kunt een bepaalde lijst met lettertekens in Scherm-80 laden door programma 3 te gebruiken terwijl u gebruik maakt van Scherm-80. Dit programma laadt de nieuwe lijst met lettertekens in scherm-80 nadat dit is geladen. Als het programma u vraagt om de naam van de lijst op te geven, tikt u een bestandsnaam in, een komma en tot slot het apparaatnummer. Gebruik een 8 voor een diskdrive en een 1 voor cassette. Belangrijke mededeling: het is niet mogelijk door SYS van Scherm-80 naar Maat-80 te gaan. U moet eerst RUN/STOP-RESTORE indrukken om scherm-80 te verlaten en vervolgens SYS 49152 tikken om Maat-80 te runnen.

Werking van het programma Maat-80 begint met het verplaatsen van een blok geheugen met de lijst lettertekens van Scherm-80 naar geheugenlocatie 12288 ($3000 in hex). Hierdoor is het eenvoudiger om de

57

Page 57: 16 Voor de 64

lijst onderaan het scherm weer te geven. Vervolgens zorgt een raster-onderbreking voor het splitsen van het scherm, zodat zowel de normale lijst als de nieuwe lijst met lettertekens weer kan worden gegeven. De instructies en het vergrote letterteken worden op de bovenste helft van het scherm weergegeven. Het vergrote letterteken is een 4x8 matrix van inverse SHIFT-O's. Voordat de hoofdlus wordt begonnen, worden alle variabelen geinitialiseerd. De hoofdlus heeft twee belangrijke routines. De eerste routine controleert de joystick en het toetsenbord. Als er een toets is ingedrukt, wordt de daarbij horende vlag ingesteld. Het indrukken van een X, stuurt het programma terug naar Scherm-80. De S slaat de lijst op en de L-toets laadt een lijst van lettertekens in het geheugen. De tweede routine drukt het vergrote letterteken op het scherm af. Als er vlaggen ingesteld zijn, handelt deze routine ze af. De routine let tevens op de sla-op-in-buffer-routine, de haal-van-buffer-routine, de wis-letterteken-routine en de routine die zorgt voor het knipperen van de blauwe cursor van het vergrote letterteken.

Programma 1. Scherm-80 Om de volgende twee programma's eenvoudig in te voeren, kunt u gebruik maken van de 'machinetaal-redacteur': MTR. Zie bijlage D.

49152 :011,008,000,000,158,050,227 49158 :048,054,049,000,000,000,157 49164 :160,044,185,065,008,153,115 49170 :198,002,136,192,255,208,241 49176 :245,160,000,169,160,133,123 49182 :252,132,251,169,008,133,207 49188 :254,169,109,133,253,177,107 49194 :253,145,251,200,208,249,068 49200 :165,252,201,173,240,007,062 49206 :230,254,230,252,076,042,114 49212 :008,076,198,002,169,054,055 49218 :133,001,032,000,160,169,049 49224 :055,133,001,096,072,169,086 49230 :054,133,001,104,032,028,174 49236 :162,072,169,055,133,001,164 49242 :104,096,072,169,054,133,206 49248 :001,104,032,148,161,072,102 49254 :169,055,133,001,104,096,148 49260 :169,090,141,250,255,169,158 49266 :169,141,251,255,173,002,081 49272 :221,009,003,141,002,221,205 49278 :169,252,045,000,221,141,186 49284 :000,221,169,032,013,017,072 49290 :208,141,017,208,169,072,185 49296 :141,024,208,169,000,141,059 49302 :244,173,169,011,141,134,254 49308 :002,169,000,141,243,173,116 49314 :133,212,141,236,173,169,202 49320 :015,141,033,208,169,015,237 49326 :141,032,208,032,244,160,223 49332 :032,003,164,169,210,141,131 49338 :038,003,169,002,141,039,066 49344 :003,169,226,141,036,003,002 49350 :169,002,141,037,003,032,070

58

Page 58: 16 Voor de 64

49356 :099,160,096,160,000,185,136 49362 :116,160,141,227,173,032,035 49368 :042,162,200,192,129,208,125 49374 :242,096,147,013,029,029,010 49380 :029,029,029,029,029,029,146 49386 :029,029,029,029,029,029,152 49392 :029,029,029,029,029,029,158 49398 :029,029,029,029,056,048,210 49404 :032,075,079,076,079,077,158 49410 :077,069,078,032,086,079,167 49416 :079,082,032,068,069,032,114 49422 :067,079,077,077,079,068,205 49428 :079,082,069,054,052,017,117 49434 :017,157,157,157,157,157,060 49440 :157,157,157,157,157,157,206 49446 :157,157,157,157,157,157,212 49452 :157,157,157,068,079,079,229 49458 :082,032,071,082,069,071,201 49464 :071,032,080,069,069,076,197 49470 :069,017,017,157,157,157,124 49476 :157,157,157,157,157,157,242 49482 :157,157,157,157,157,157,248 49488 :032,069,078,032,075,069,179 49494 :086,073,078,032,077,065,241 49500 :082,084,073,078,160,000,057 49506 :173,033,208,041,015,170,226 49512 :173,134,002,010,010,010,187 49518 :010,141,237,173,138,013,054 49524 :237,173,032,058,169,153,170 49530 :000,208,153,000,209,153,077 49536 :000,210,200,008,032,074,140 49542 :169,040,208,216,160,231,134 49548 :032,058,169,153,000,211,251 49554 :032,074,169,136,192,255,236 49560 :208,242,096,072,169,001,172 49566 :141,244,173,104,032,042,126 49572 :162,169,000,141,244,173,029 49578 :165,198,240,252,120,032,153 49584 :180,229,201,131,208,016,117 49590 :162,009,120,134,198,189,226 49596 :230,236,157,118,002,202,109 49602 :208,247,240,228,201,013,051 49608 :208,209,160,007,032,058,106 49614 :169,177,251,077,223,173,252 49620 :145,251,032,074,169,160,019 49626 :079,132,208,032,058,169,128 49632 :177,209,201,032,208,003,030 49638 :136,208,244,200,132,200,070 49644 :160,000,132,211,132,212,059 49650 :165,202,048,060,165,202,060 49656 :133,211,197,200,144,052,161 49662 :176,094,165,153,208,014,040 49668 :165,009,133,202,173,222,140

59

Page 59: 16 Voor de 64

49674 :173,133,201,133,214,076,172 49680 :190,161,032,074,169,076,206 49686 :102,241,160,007,032,058,110 49692 :169,177,251,077,223,173,074 49698 :145,251,032,074,169,076,013 49704 :062,161,152,072,138,072,185 49710 :165,208,240,230,032,058,211 49716 :169,164,211,177,209,133,091 49722 :215,032,074,169,041,063,140 49728 :006,215,036,215,016,002,042 49734 :009,128,144,004,166,212,221 49740 :208,004,112,002,009,064,219 49746 :032,074,169,230,211,032,062 49752 :132,230,196,200,208,026,056 49758 :169,000,133,208,169,013,018 49764 :166,153,224,003,240,006,124 49770 :166,154,224,003,240,003,128 49776 :032,042,162,169,013,032,050 49782 :074,169,133,215,104,170,215 49788 :104,168,165,215,201,222,175 49794 :208,002,169,255,024,096,116 49800 :072,165,154,201,003,208,171 49806 :004,104,076,042,162,076,094 49812 :213,241,072,141,227,173,191 49818 :152,072,138,072,169,000,245 49824 :141,235,173,032,070,162,205 49830 :032,068,168,032,146,168,012 49836 :104,170,104,168,104,096,150 49842 :173,227,173,032,132,230,121 49848 :208,006,169,001,141,235,176 49854 :173,096,173,227,173,201,209 49860 :032,144,003,076,097,162,198 49866 :076,194,162,201,096,176,083 49872 :023,201,064,176,003,076,239 49878 :174,162,201,128,240,082,177 49884 :056,173,227,173,233,064,122 49890 :141,227,173,076,174,162,155 49896 :201,127,144,009,240,044,229 49902 :201,160,144,060,076,149,004 49908 :162,056,173,227,173,233,244 49914 :032,141,227,173,076,174,049 49920 :162,201,192,176,012,056,031 49926 :173,227,173,233,064,141,249 49932 :227,173,076,174,162,024,080 49938 :173,227,173,105,128,141,197 49944 :227,173,173,243,173,240,229 49950 :004,206,243,173,096,173,157 49956 :241,173,208,005,169,000,064 49962 :141,242,173,096,173,243,086 49968 :173,005,212,240,035,173,118 49974 :227,173,201,032,176,041,136 49980 :201,013,240,110,201,020,077 49986 :240,004,165,212,208,013,140

60

Page 60: 16 Voor de 64

49992 :173,243,173,208,008,169,022 49998 :001,141,235,173,076,078,014 50004 :163,076,028,163,173,241,160 50010 :173,208,005,169,000,141,018 50016 :242,173,076,066,163,173,221 50022 :227,173,201,141,240,066,126 50028 :201,148,208,012,165,212,030 50034 :208,008,169,001,141,240,113 50040 :173,076,066,163,056,173,059 50046 :227,173,233,064,141,227,167 50052 :173,076,028,163,173,243,220 50058 :173,208,017,169,000,141,078 50064 :243,173,165,212,208,011,132 50070 :169,000,141,242,173,076,183 50076 :058,163,206,243,173,169,144 50082 :001,141,242,173,169,000,120 50088 :141,235,173,076,186,163,118 50094 :169,001,141,235,173,169,038 50100 :000,141,240,173,133,212,055 50106 :173,227,173,201,032,176,144 50112 :102,201,008,208,005,160,108 50118 :128,140,145,002,201,009,055 50124 :208,005,160,000,140,145,094 50130 :002,201,013,208,005,072,199 50136 :032,053,165,104,201,014,017 50142 :208,005,160,001,140,236,204 50148 :173,201,017,208,008,238,049 50154 :222,173,072,032,206,164,079 50160 :104,201,018,208,008,160,171 50166 :001,140,242,173,140,241,159 50172 :173,201,019,208,017,160,006 50178 :000,132,009,140,222,173,166 50184 :072,032,206,164,169,240,123 50190 :141,223,173,104,201,029,117 50196 :208,007,230,009,072,032,066 50202 :210,164,104,201,020,208,165 50208 :005,072,032,092,165,104,246 50214 :096,201,141,208,005,072,249 50220 :032,053,165,104,201,142,229 50226 :208,005,160,000,140,236,031 50232 :173,201,145,208,008,206,229 50238 :222,173,072,032,206,164,163 50244 :104,201,146,208,008,160,127 50250 :000,140,242,173,140,241,242 50256 :173,201,147,208,005,072,118 50262 :032,003,164,104,201,148,226 50268 :208,005,072,032,080,166,143 50274 :104,201,157,208,007,198,205 50280 :009,072,032,210,164,104,183 50286 :096,032,058,169,169,000,122 50292 :133,251,169,224,133,252,254 50298 :169,000,141,225,173,141,203 50304 :226,173,141,036,164,169,013

61

Page 61: 16 Voor de 64

50310 :224,141,037,164,169,000,101 50316 :170,168,138,153,255,255,255 50322 :136,208,249,238,037,164,154 50328 :173,037,164,201,255,208,166 50334 :239,160,064,169,000,153,175 50340 :000,255,136,016,250,169,222 50346 :000,133,009,141,222,173,080 50352 :169,240,141,223,173,173,015 50358 :244,173,240,006,160,007,244 50364 :169,240,145,251,162,024,155 50370 :024,189,196,169,105,212,065 50376 :141,107,164,189,170,169,116 50382 :141,106,164,169,032,160,210 50388 :079,153,255,255,136,192,002 50394 :255,208,248,202,224,255,074 50400 :208,224,032,210,164,032,070 50406 :074,169,096,169,000,141,111 50412 :226,173,165,009,074,010,125 50418 :046,226,173,010,046,226,201 50424 :173,010,046,226,173,141,249 50430 :225,173,172,222,173,185,124 50436 :118,169,133,251,024,185,116 50442 :144,169,109,226,173,133,196 50448 :252,024,173,225,173,101,196 50454 :251,133,251,169,000,101,159 50460 :252,133,252,024,165,252,082 50466 :105,224,133,252,165,009,154 50472 :041,001,240,008,169,015,002 50478 :141,223,173,076,205,164,004 50484 :169,240,141,223,173,096,070 50490 :169,255,133,202,165,009,223 50496 :133,211,048,014,201,080,239 50502 :144,021,169,000,133,009,034 50508 :238,222,173,076,241,164,166 50514 :230,009,206,222,173,048,202 50520 :024,169,079,133,009,173,163 50526 :222,173,133,214,048,013,129 50532 :201,025,144,012,206,222,142 50538 :173,032,135,167,076,008,185 50544 :165,238,222,173,169,001,056 50550 :141,234,173,173,244,173,232 50556 :240,015,160,007,032,058,124 50562 :169,177,251,077,223,173,176 50568 :145,251,032,074,169,174,213 50574 :222,173,189,170,169,133,174 50580 :209,024,189,196,169,105,016 50586 :212,133,210,032,168,168,053 50592 :096,238,222,173,169,000,034 50598 :133,009,141,243,173,141,238 50604 :242,173,141,241,173,032,150 50610 :210,164,173,033,208,041,239 50616 :015,205,246,173,240,003,042 50622 :032,244,160,173,033,208,016

62

Page 62: 16 Voor de 64

50628 :141,246,173,096,032,058,174 50634 :169,169,001,141,244,173,075 50640 :165,009,208,003,076,066,223 50646 :166,160,007,177,251,077,028 50652 :223,173,145,251,056,165,209 50658 :251,233,008,133,253,165,245 50664 :252,233,000,133,254,165,245 50670 :009,041,001,208,025,160,170 50676 :007,177,251,041,240,074,010 50682 :074,074,074,141,228,173,246 50688 :177,253,041,240,013,228,184 50694 :173,145,253,136,016,233,194 50700 :172,222,173,200,024,185,220 50706 :144,169,105,224,141,238,015 50712 :173,056,185,118,169,233,190 50718 :001,141,230,173,173,238,218 50724 :173,233,000,141,231,173,219 50730 :169,008,141,229,173,160,154 50736 :004,173,230,173,141,222,223 50742 :165,173,231,173,141,223,136 50748 :165,056,169,080,229,009,000 50754 :074,105,000,170,024,008,191 50760 :040,046,255,255,008,056,220 50766 :173,222,165,233,008,141,252 50772 :222,165,173,223,165,233,241 50778 :000,141,223,165,202,208,005 50784 :231,136,240,004,040,076,055 50790 :197,165,040,206,230,173,089 50796 :208,003,206,231,173,206,111 50802 :229,173,208,185,160,007,052 50808 :177,251,077,223,173,145,142 50814 :251,174,222,173,189,170,025 50820 :169,133,253,024,189,196,072 50826 :169,105,212,133,254,056,043 50832 :169,079,229,009,170,164,196 50838 :009,177,253,136,145,253,099 50844 :200,200,202,224,255,208,165 50850 :244,169,032,160,079,145,223 50856 :253,198,009,032,210,164,010 50862 :169,000,141,234,173,032,155 50868 :074,169,169,000,141,244,209 50874 :173,096,032,058,169,172,118 50880 :222,173,200,056,185,118,122 50886 :169,233,008,133,253,185,155 50892 :144,169,233,000,133,254,113 50898 :024,165,254,105,224,133,091 50904 :254,160,007,177,253,041,084 50910 :015,240,003,076,116,167,071 50916 :136,016,244,160,007,177,200 50922 :251,077,223,173,141,245,064 50928 :173,173,244,173,240,008,227 50934 :173,245,173,145,251,076,029 50940 :146,166,165,009,041,001,012

63

Page 63: 16 Voor de 64

50946 :240,018,024,165,251,105,037 50952 :008,141,230,173,165,252,209 50958 :105,000,141,231,173,076,228 50964 :180,166,165,251,141,230,129 50970 :173,165,252,141,231,173,137 50976 :169,008,141,229,173,160,144 50982 :004,173,230,173,141,210,201 50988 :166,173,231,173,141,211,115 50994 :166,056,169,080,229,009,247 51000 :074,170,024,008,040,110,226 51006 :255,255,008,024,173,210,219 51012 :166,105,008,141,210,166,096 51018 :173,211,166,105,000,141,102 51024 :211,166,202,208,231,136,210 51030 :240,004,040,076,187,166,031 51036 :040,238,230,173,208,003,216 51042 :238,231,173,206,229,173,068 51048 :208,187,024,165,251,105,020 51054 :008,133,253,165,252,105,002 51060 :000,133,254,165,009,041,206 51066 :001,240,031,160,007,177,226 51072 :251,041,015,010,010,010,209 51078 :010,141,228,173,177,253,092 51084 :041,015,013,228,173,145,243 51090 :253,177,251,041,240,145,229 51096 :251,136,016,227,160,007,181 51102 :177,251,077,223,173,141,176 51108 :245,173,173,244,173,240,132 51114 :005,173,245,173,145,251,138 51120 :032,210,164,032,058,169,073 51126 :174,222,173,189,170,169,255 51132 :133,253,024,189,196,169,128 51138 :105,212,133,254,056,169,099 51144 :079,229,009,170,160,078,157 51150 :177,253,200,145,253,136,090 51156 :136,202,224,255,208,244,201 51162 :169,032,164,009,145,253,222 51168 :169,000,141,234,173,032,205 51174 :074,169,173,243,173,201,239 51180 :080,240,003,238,243,173,189 51186 :096,032,058,169,169,224,222 51192 :141,158,167,024,169,224,107 51198 :105,001,141,155,167,160,215 51204 :000,185,064,255,153,000,149 51210 :255,200,208,247,238,155,033 51216 :167,238,158,167,173,155,050 51222 :167,201,255,208,234,169,232 51228 :000,160,000,153,000,254,083 51234 :200,208,250,160,192,153,173 51240 :000,255,136,192,255,208,062 51246 :248,056,165,251,233,064,039 51252 :133,251,165,252,233,001,063 51258 :133,252,162,001,189,170,197

64

Page 64: 16 Voor de 64

51264 :169,141,246,167,024,189,232 51270 :196,169,105,212,141,247,116 51276 :167,202,189,170,169,141,090 51282 :249,167,024,189,196,169,052 51288 :105,212,141,250,167,162,101 51294 :008,160,000,185,255,255,189 51300 :153,255,255,200,208,247,138 51306 :238,247,167,238,250,167,133 51312 :202,208,238,162,024,189,111 51318 :170,169,141,029,168,024,051 51324 :189,196,169,105,212,141,112 51330 :030,168,169,032,160,079,000 51336 :153,255,255,136,192,255,102 51342 :208,248,032,074,169,169,018 51348 :127,141,000,220,173,001,042 51354 :220,201,251,008,169,127,106 51360 :141,000,220,040,208,009,010 51366 :160,000,234,202,208,252,198 51372 :136,208,249,096,169,000,006 51378 :133,254,032,058,169,173,229 51384 :227,173,041,001,240,008,106 51390 :169,015,141,224,173,076,220 51396 :095,168,169,240,141,224,209 51402 :173,173,227,173,074,010,008 51408 :038,254,010,038,254,010,044 51414 :038,254,133,253,173,236,021 51420 :173,208,014,024,169,222,006 51426 :101,253,133,253,169,169,024 51432 :101,254,076,140,168,024,227 51438 :169,222,101,253,133,253,089 01444 :169,171,101,254,133,254,046 51450 :032,074,169,096,173,235,005 51456 :173,208,016,169,000,141,195 51462 :234,173,032,168,168,032,045 51468 :044,169,230,009,032,210,194 51474 :164,096,032,125,164,032,119 51480 :058,169,160,007,174,234,058 51486 :173,240,005,169,000,076,181 51492 :191,168,177,253,045,224,070 51498 :173,174,224,173,224,240,226 51504 :208,004,074,074,074,074,044 51510 :141,228,173,173,223,173,141 51516 :201,015,240,010,173,228,159 51522 :173,010,010,010,010,141,164 51528 :228,173,169,255,174,234,025 51534 :173,208,005,173,223,173,009 51540 :073,255,049,251,013,228,185 51546 :173,192,007,208,008,174,084 51552 :244,173,240,003,077,223,032 51558 :173,174,234,173,208,023,063 51564 :174,241,173,208,005,174,059 51570 :242,173,240,013,077,223,058 51576 :173,072,173,227,173,009,179

65

Page 65: 16 Voor de 64

51582 :128,141,227,173,104,145,020 51588 :251,136,016,148,173,243,075 51594 :173,005,212,240,005,169,174 51600 :000,141,242,173,032,074,038 51606 :169,096,164,009,173,227,220 51612 :173,032,058,169,145,209,174 51618 :032,074,169,096,072,120,213 51624 :173,014,220,041,254,141,243 51630 :014,220,169,052,133,001,251 51636 :104,096,072,169,054,133,040 51642 :001,173,014,220,009,001,092 51648 :141,014,220,088,104,096,087 51654 :072,152,072,138,072,169,105 51660 :169,072,169,109,072,008,035 51666 :032,074,169,120,076,071,240 51672 :254,032,058,169,104,170,235 51678 :104,168,104,064,000,064,214 51684 :128,192,000,064,128,192,164 51690 :000,064,128,192,000,064,170 51696 :128,192,000,064,128,192,176 51702 :000,064,128,192,000,064,182 51708 :000,001,002,003,005,006,013 51714 :007,008,010,011,012,013,063 51720 :015,016,017,018,020,021,115 51726 :022,023,025,026,027,028,165 51732 :030,031,000,080,160,240,049 51738 :064,144,224,048,128,208,074 51744 :032,112,192,016,096,176,144 51750 :000,080,160,240,064,144,214 51756 :224,048,128,208,000,000,140 51762 :000,000,001,001,001,002,055 51768 :002,002,003,003,003,004,073 51774 :004,004,005,005,005,005,090 51780 :006,006,006,007,007,007,107 51786 :068,170,170,174,138,138,164 51792 :106,000,196,170,168,200,152 51798 :168,170,196,000,206,168,226 51804 :168,174,168,168,206,000,208 51810 :228,138,136,234,138,138,086 51816 :132,000,174,164,164,228,198 51822 :164,164,174,000,234,042,120 51828 :042,044,042,170,074,000,232 51834 :138,142,142,138,138,138,190 51840 :234,000,206,170,170,170,054 51846 :170,170,174,000,196,170,246 51852 :170,202,138,138,132,002,154 51858 :198,168,168,196,162,162,176 51864 :172,000,234,074,074,074,012 51870 :074,074,078,000,170,170,212 51876 :170,170,174,174,074,000,158 51882 :170,170,074,068,068,164,116 51888 :164,000,230,036,068,068,230 51894 :068,132,230,000,070,162,076

66

Page 66: 16 Voor de 64

51900 :130,194,130,130,230,000,234 51906 :032,114,036,047,036,034,237 51912 :032,032,004,004,004,004,024 51918 :004,000,004,000,160,170,032 51924 :014,010,014,010,000,000,004 51930 :074,226,132,228,036,232,122 51936 :074,000,066,162,164,064,242 51942 :160,160,096,016,040,068,002 51948 :130,130,130,068,040,000,222 51954 :000,160,068,238,068,160,168 51960 :000,000,000,000,000,014,006 51966 :000,096,032,064,001,001,192 51972 :002,006,004,008,072,000,096 51978 :068,172,164,164,164,164,138 51984 :078,000,078,162,036,066,180 51990 :130,138,228,000,174,168,092 51996 :238,034,034,042,038,000,158 52002 :078,162,130,196,164,1~8,164

52008 :072,000,068,170,170,070,078 52014 :162,164,072,000,000,000,188 52020 :068,000,000,068,004,008,200 52026 :016,032,078,128,078~032,166 52032 :016,000,132,074,034,020,084 52038 :036,064,132,000,004,004,054 52044 :014,254,010,004,014,000,116 52050 :032,032,032,047,032,032,033 52056 :032,032,000,015,240,000,151 52062 :000,000,000,000,004,004,102 52068 :004,004,004,004,244,004,108 52074 :032,032,032,044,038,034,062 52080 :034,034,034,034,054,028,074 52086 :000,000,000,000,136,136,134 52092 :132,132,130,130,129,241,250 52098 :031,024,040,040,072,072,153 52104 :136,136,240,016,022,031,205 52110 :031,022,016,016,000,009,236 52116 :015,015,015,006,240,000,183 52122 :064,064,064,065,067,066,032 52128 :066,066,144,144,102,105,019 52134 :105,102,144,144,098,098,089 52140 :146,146,098,098,242,002,136 52146 :002,066,066,239,226,066,075 52152 :066,002,066,130,066,130,132 52158 :066,130,066,130,015,007,092 52164 :023,099,163,163,161,001,038 52170 :012,012,012,012,012,012,018 52176 :012,012,015,000,000,000,247 52182 :240,240,240,240,008,008,166 52188 :008,008,008,008,008,248,252 52194 :161,081,161,081,161,081,184 52200 :161,081,015,014,012,012,015 52206 :172,088,168,088,050,050,086 52212 :050,051,050,050,050,050,033

67

Page 67: 16 Voor de 64

52218 :002,002,002,003,048,048,099 52224 :048,048,000,000,000,224,064 52230 :032,032,047,047,002,002,168 52236 :002,063,032,032,032,032,205 52242 :002,002,002,254,034,034,090 52248 :034,034,140,140,140,140,140 52254 :140,140,140,140,063,063,204 52260 :048,048,048,048,048,048,068 52266 :240,240,240,000,000,015,009 52272 :015,015,016,016,016,016,142 52278 :028,028,028,252,050,050,234 52284 :050,062,000,000,000,000,172 52290 :204,204,204,204,003,003,120 52296 :003,003,064,160,172,162,124 52302 :142,138,110,000,128,128,212 52308 :198,168,168,168,198,000,216 52314 :032,032,100,170,174,168,254 52320 :102,000,032,064,068,234,084 52326 :074,070,066,004,128,132,064 52332 :192,164,164,164,164,000,188 52338 :008,040,010,042,044,042,044 52344 :170,064,192,064,074,078,250 52350 :078,074,234,000,000,000,000 52356 :196,170,170,170,164,000,234 52362 :000,000,198,170,170,198,106 52368 :130,130,000,000,206,168,010 52374 :142,130,142,000,000,064,116 52380 :234,074,074,074,078,000,178 52386 :000,000,170,170,174,174,082 52392 :074,000,000,000,170,170,070 52398 :070,162,162,012,006,004,078 52404 :228,036,068,132,230,000,106 52410 :070,162,130,194,130,130,234 52416 :230,000,032,114,036,047,139 52422 :036,034,032,032,004,004,084 52428 :004,004,004,000,004,000,220 52434 :160,170,014,010,014,010,076 52440 :000,000,074,226,132,228,108 52446 :036,232,074,000,066,162,024 52452 :164,064,160,160,096,016,120 52458 :040,068,130,130,130,068,032 52464 :040,000,000,160,068,238,234 52470 :068,160,000,000,000,000,218 52476 :000,014,000,096,032,064,202 52482 :001,001,002,006,004,008,024 52488 :072,000,068,172,164,164,136 52494 :164,164,078,000,078,162,148 52500 :036,066,130,138,228,000,106 52506 :174,168,238,034,034,042,204 52512 :038,000,078,162,130,196,124 52518 :164,168,072,000,068,170,168 52524 :170,070,162,164,072,000,170 52530 :000,000,068,000,000,068,186

68

Page 68: 16 Voor de 64

52536 :004,008,016,032,078,128,066 52542 :078,032,016,000,132,074,138 52548 :034,020,036,064,132,000,098 52554 :004,010,010,254,010,010,116 52560 :010,000,196,170,168,200,056 52566 :168,170,196,000,206,168,226 52572 :168,174,168,168,206,000,208 52578 :228,138,136,234,138,138,086 52584 :132,000,174,164,164,228,198 52590 :164,164,174,000,234,042,120 52596 :042,044,042,170,074,000,232 52602 :138,142,142,138,138,138,190 52608 :234,000,206,170,170,170,054 52614 :170,170,174,000,196,170,246 52620 :170,202,138,138,132,002,154 52626 :198,168,168,196,162,162,176 52632 :172,000,234,074,074,074,012 52638 :074,074,078,000,170,170,212 52644 :170,170,174,174,074,000,158 52650 :170,170,074,068,068,164,116 52656 :164,000,226,034,066,079,233 52662 :066,130,226,002,066,130,034 52668 :066,130,066,130,066,130,008 52674 :082,169,084,162,089,164,176 52680 :082,169,012,012,012,012,243 52686 :012,012,012,012,015,000,013 52692 :000,000,240,240,240,240,148 52698 :008,008,008,008,008,008,010 52704 :008,248,161,081,161,081,196 52710 :161,081,161,081,004,009,215 52716 :002,004,169,082,164,089,234 52722 :050,050,050,051,050,050,031 52728 :050,050,002,002,002,003,101 52734 :048,048,048,048,000,000,190 52740 :000,224,032,032,047,047,130 52746 :002,002,002,063,032,032,143 52752 :032,032,002,002,002,254,084 52758 :034,034,034,034,140,140,182 52764 :140,140,140,140,140,140,100 52770 :063,063,048,048,048,048,096 52776 :048,048,240,240,240,000,088 52782 :000,015,015,015,000,032,123 52788 :032,032,172,108,044,012,196 52794 :050,050,050,062,000,000,014 52800 :000,000,204,204,204,204,112 52806 :003,003,003,003,000,013,095

69

Page 69: 16 Voor de 64

Programma 2. Maat-80

49152 :169,000,032,144,255,169,001 49158 :132,133,178,169,003,133,242 49164 :179,169,075,133,251,169,220 49170 :018,133,252,169,000,133,211 49176 :253,169,048,133,254,160,017 49182 :000,177,251,145,253,200,032 49188 :208,249,230,252,230,254,179 49194 :165,252,201,023,208,239,106 49200 :169,011,141,033,208,169,011 49206 :000,141,134,002,141,032,248 49212 :208,169,147,032,210,255,057 49218 :169,000,141,062,003,141,070 49224 :170,195,141,160,195,141,050 49230 :172,195,141,173,195,169,099 49236 :008,032,210,255,169,005,251 49242 :141,165,195,169,013,141,146 49248 :248,007,169,007,141,039,195 49254 :208,169,001,141,021,208,082 49260 :169,000,168,153,064,003,153 49266 :200,192,064,208,248,169,171 49272 :252,141,064,003,141,091,044 49278 :003,160,003,169,132,153,234 49284 :064,003,200,200,200,192,223 49290 :026,144,246,032,073,199,090 49296 :032,159,192,032,198,194,183 49302 :032,248,194,032,049,194,131 49308 :076,144,192,162,000,160,122 49314 :000,024,032,240,255,173,118 49320 :160,195,041,001,201,001,255 49326 :240,005,169,240,076,183,063 49332 :192,169,015,141,163,195,031 49338 :173,160,195,074,010,133,163 49344 :251,169,000,133,252,006,235 49350 :251,038,252,006,251,038,010 49356 :252,169,048,024,101,252,026 49362 :133,252,173,163,195,073,175 49368 :255,141,166,195,160,000,109 49374 :169,018,032,210,255,177,059 49380 :251,045,163,195,141,162,161 49386 :195,162,000,173,163,195,098 49392 :201,015,240,012,078,162,180 49398 :195,078,162,195,078,162,092 49404 :195,078,162,195,173,162,193 49410 :195,041,008,240,005,169,148 49416 :001,076,014,193,169,000,205

70

Page 70: 16 Voor de 64

49422 :032,146,193,141,134,002,150 49428 :169,207,032,210,255,173,042 49434 :162,195,041,004,240,005,161 49440 :169,001,076,039,193,169,167 49446 :000,232,032,146,193,141,014 49452 :134,002,169,207,032,210,030 49458 :255,173,162,195,041,002,110 49464 :240,005,169,001,076,065,100 49470 :193,169,000,232,032,146,066 49476 :193,141,134,002,169,207,146 49482 :032,210,255,173,162,195,077 49488 :041,001,240,005,169,001,025 49494 :076,091,193,169,000,232,079 49500 :032,146,193,141,134,002,228 49506 :169,207,032,210,255,169,116 49512 :013,032,210,255,173,163,182 49518 :195,201,015,240,012,014,019 49524 :162,195,014,162,195,014,090 49530 :162,195,014,162,195,177,003 49536 :251,045,166,195,013,162,192 49542 :195,145,251,200,192,008,101 49548 :240,003,076,222,192,096,201 49554 :141,164,195,140,169,195,126 49560 :173,170,195,240,008,169,083 49566 :000,141,164,195,141,162,193 49572 :195,173,172,195,240,006,121 49578 :173,162,195,153,178,002,009 49584 :173,173,195,240,006,185,124 49590 :178,002,141,162,195,204,040 49596 :061,003,208,106,236,060,094 49602 :003,208,101,238,062,003,041 49608 :173,000,220,041,016,208,090 49614 :067,205,063,003,240,065,081 49620 :141,063,003,169,004,056,136 49626 :237,060,003,168,169,001,088 49632 :136,240,004,010,076,224,146 49638 :193,141,168,195,073,255,231 49644 :141,167,195,173,162,195,245 49650 :045,168,195,208,015,173,022 49656 :162,195,045,167,195,013,001 49662 :168,195,141,162,195,076,167 49668 :021,194,173,162,195,045,026 49674 :167,195,141,162,195,076,178 49680 :021,194,141,063,003,173,099 49686 :062,003,201,050,144,014,240 49692 :201,100,144,005,169,000,135 49698 :141,062,003,169,014,141,052 49704 :164,195,173,164,195,172,079

71

Page 71: 16 Voor de 64

49710 :169,195,096,206,165,195,048 49716 :208,065,173,000,220,041,247 49722 :015,141,162,195,041,001,101 49728 :208,003,206,061,003,173,206 49734 :162,195,041,002,208,003,169 49740 :238,061,003,173,162,195,140 49746 :041,004,208,003,206,060,092 49752 :003,173,162,195,041,008,158 49758 :208,003,238,060,003,173,011 49764 :162,195,201,015,240,008,153 49770 :169,051,141,062,003,032,052 49776 :120,194,169,005,141,165,138 49782 :195,096,173,060,003,201,078 49788 :255,208,008,169,003,141,140 49794 :060,003,206,160,195,173,159 49800 :060,003,201,004,208,008,108 49806 :169,000,141,060,003,238,241 49812 :160,195,173,061,003,201,173 49818 :255,208,014,169,007,141,180 49824 :061,003,173,160,195,056,040 49830 :233,064,141,160,195,173,108 49836 :061,003,201,008,208,014,155 49842 :169,000,141,061,003,173,213 49848 :160,195,024,105,064,141,105 49854 :160,195,169,016,141,063,166 49860 :003,096,173,160,195,074,129 49866 :074,074,074,074,074,141,201 49872 :053,003,173,160,195,041,065 49878 :063,141,052,003,173,053,187 49884 :003,010,010,010,024,105,126 49890 :153,141,001,208,173,052,186 49896 :003,010,010,024,105,055,183 49902 :141,000,208,169,000,042,030 49908 :141,016,208,096,169,000,106 49914 :141,170,195,141,171,195,239 49920 :141,172,195,141,173,195,249 49926 :032,228,255,208,001,096,058 49932 :201,147,208,006,169,001,232 49938 :141,170,195,096,201,019,072 49944 :208,006,169,000,141,160,196 49950 :195,096,201,157,208,008,127 49956 :169,255,141,060,003,076,228 49962 :120,194,201,029,208,008,034 49968 :169,004,141,060,003,076,245 49974 :120,194,201,145,208,008,162 49980 :169,255,141,061,003,076,253 49986 :120,194,201,017,208,008,046 49992 :169,008,141,061,003,076,018

72

Page 72: 16 Voor de 64

49998 :120,194,201,088,208,003,124 50004 :076,124,195,201,133,208,253 50010 :006,169,001,141,172,195,006 50016 :096,201,136,208,006,169,144 50022 :001,141,173,195,096,201,141 50028 :083,208,004,032,125,197,245 50034 :096,201,076,208,004,032,219 50040 :046,197,096,096,169,075,031 50046 :133,251,169,018,133,252,058 50052 :169,000,133,253,169,048,136 50058 :133,254,160,000,177,253,091 50064 :145,251,200,208,249,230,147 50070 :252,230,254,165,252,201,224 50076 :023,208,239,000,000,000,114 50082 :000,000,000,000,000,000,162 50088 :000,000,000,000,000,000,168 50094 :158,029,029,029,029,029,221 50100 :029,029,029,029,029,029,098 50106 :029,029,029,029,029,067,142 50112 :085,083,084,079,077,045,133 50118 :056,048,013,144,029,029,005 50124 :029,029,029,029,067,076,207 50130 :082,032,045,032,087,073,049 50136 :083,032,072,085,073,068,117 50142 :073,071,069,032,075,065,095 50148 :082,065,075,084,069,082,173 50154 :013,029,029,029,029,029,136 50160 :029,072,079,077,069,032,086 50166 :045,032,071,065,032,078,057 50172 :065,065,082,032,069,069,122 50178 :082,083,084,069,032,075,171 50184 :065,082,065,075,084,069,192 50190 :082,013,029,029,029,029,225 50196 :029,029,067,085,082,083,139 50202 :079,082,084,079,069,084,247 50208 :083,032,066,069,087,069,182 50214 :069,071,084,032,082,079,199 50220 :078,068,032,075,065,082,188 50226 :039,083,069,084,013,029,111 50232 :029,029,029,029,029,070,015 50238 :049,032,045,032,083,076,123 50244 :065,032,075,065,082,065,196 50250 :075,084,069,082,032,079,239 50256 :080,032,073,078,032,066,185 50262 :085,070,070,069,082,013,219 50268 :029,029,029,029,029,029,010 50274 :070,055,032,045,032,072,148 50280 :065,065,076,032,075,065,226

73

Page 73: 16 Voor de 64

50286 :082,065,075,084,069,082,055 50292 :032,085,073,084,032,066,232 50298 :085,070,070,069,082,013,255 50304 :029,029,029,029,029,029,046 50310 :088,032,045,032,083,084,242 50316 :079,080,032,071,069,087,046 50322 :073,074,090,073,071,068,083 50328 :069,032,075,065,082,065,028 50334 :075,084,069,082,083,032,071 50340 :073,078,013,029,029,029,159 50346 :029,029,029,029,020,083,133 50352 :067,072,069,082,077,045,076 50358 :056,048,013,013,029,029,114 50364 :029,029,008,074,079,089,240 50370 :083,084,073,067,075,032,096 50376 :082,069,071,069,076,084,139 50382 :032,067,085,082,083,079,122 50388 :082,086,069,082,080,076,175 50394 :065,065,084,083,073,078,154 50400 :071,013,029,029,029,029,168 50406 :020,020,032,032,082,079,239 50412 :078,068,032,071,069,069,111 50418 :088,080,065,078,068,069,178 50424 :069,082,068,032,075,065,127 50430 :082,065,075,084,069,082,199 50436 :032,069,078,013,029,029,254 50442 :029,029,020,020,032,032,172 50448 :086,085,085,082,032,075,205 50454 :078,079,080,032,083,069,187 50460 :084,032,069,078,032,082,149 50466 :069,083,069,084,032,080,195 50472 :073,088,069,076,083,000,173 50478 :032,224,197,008,173,215,127 50484 :198,208,002,040,096,040,124 50490 :176,031,169,008,170,160,004 50496 :000,032,186,255,173,215,157 50502 :198,162,199,160,198,032,251 50508 :189,255,169,000,162,000,083 50514 :160,048,032,213,255,032,054 50520 :234,198,096,032,203,199,026 50526 :169,008,162,001,160,000,082 50532 :032,186,255,173,215,198,135 50538 :162,199,160,198,032,189,022 50544 :255,169,000,170,160,048,146 50550 :032,213,255,032,236,199,061 50556 :096,032,224,197,008,173,086 50562 :215,198,208,002,040,096,121 50568 :040,176,042,032,045,199,158

74

Page 74: 16 Voor de 64

50574 :169,008,170,160,255,032,168 50580 :186,255,173,215,198,162,057 50586 :199,160,198,032,189,255,163 50592 :169,048,133,252,169,000,163 50598 :133,251,169,251,162,000,108 50604 :160,056,032,216,255,032,155 50610 :234,198,096,032,203,199,116 50616 :169,008,162,001,160,000,172 50622 :032,186,255,173,215,198,225 50628 :162,199,160,198,032,189,112 50634 :255,169,048,133,252,169,204 50640 :000,133,251,169,251,162,150 50646 :000,160,056,032,216,255,165 50652 :032,236,199,096,160,000,175 50658 :162,011,024,032,240,255,182 50664 :169,032,162,040,032,210,109 50670 :255,202,208,250,160,000,033 50676 :162,011,024,032,240,255,200 50682 :162,000,189,192,198,032,255 50688 :210,255,232,224,007,208,112 50694 :245,162,000,169,164,032,010 50700 :210,255,138,072,032,228,179 50706 :255,168,104,170,152,201,044 50712 :000,240,243,201,020,240,200 50718 :042,201,034,240,235,201,215 50724 :013,240,065,201,032,144,219 50730 :227,201,128,176,223,224,197 50736 :016,240,219,157,199,198,053 50742 :232,072,169,157,032,210,158 50748 :2?5,104,032,210,255,169,061 50754 :164,032,210,255,076,014,049 50760 :198,224,000,240,193,169,072 50766 :157,032,210,255,169,032,165 50772 :032,210,255,169,157,032,171 50778 :210,255,032,210,255,202,230 50784 :169,164,032,210,255,076,234 50790 :014,198,142,215,198,160,005 50796 :000,162,011,024,032,240,065 50802 :255,162,017,169,032,032,013 50808 :210,255,202,208,250,174,139 50814 :215,198,208,001,096,160,236 50820 :000,162,011,024,032,240,089 50826 :255,162,000,189,216,198,134 50832 :032,210,255,232,224,018,091 50838 :208,245,032,228,255,240,078 50844 :251,201,068,240,009,201,102 50850 :084,208,243,056,008,076,069 50856 :172,198,024,008,160,000,218

75

Page 75: 16 Voor de 64

501Hî2 :162,011,024,032,240,255,130 50868 :162,017,169,032,032,210,034 50874 :255,202,208,250,040,096,213 50880 :159,078,065,065,077,058,182 50886 :155,000,000,000,000,000,097 50892 :000,000,000,000,000,000,204 50898 :000,000,000,000,000,000,210 50904 :153,018,084,146,065,080,250 50910 :069,032,079,070,032,018,010 50916 :068,146,073,083,075,063,224 50922 :032,183,255,041,191,208,120 50928 :001,096,162,011,160,000,158 50934 :024,032,240,255,169,018,216 50940 :032,210,255,169,150,032,076 50946 :210,255,169,000,032,189,089 50952 :255,169,015,162,008,160,009 50958 :015,032,186,255,032,192,214 50964 :255,162,015,032,198,255,169 50970 :032,207,255,032,210,255,249 50976 :201,013,208,246,169,015,116 50982 :032,195,255,032,204,255,243 50988 :096,169,002,160,199,162,064 50994 :071,032,189,255,169,015,013 51000 :168,162,008,032,186,255,099 51006 :032,192,255,169,015,032,245 51012 :195,255,096,073,048,120,087 51018 :169,127,141,013,220,169,145 51024 :001,141,026,208,173,060,177 51030 :003,141,018,208,169,027,140 51036 :141,017,208,169,199,141,199 51042 :021,003,169,250,141,020,190 51048 :003,088,169,147,032,210,241 51054 :255,160,000,169,195,133,254 51060 :252,169,174,133,251,177,248 51066 :251,240,011,032,210,255,097 51072 :200,208,246,230,252,076,060 51078 :121,199,169,008,133,251,247 51084 :169,006,133,252,165,251,092 51090 :133,253,165,252,024,105,054 51096 :212,133,254,162,000,160,049 51102 :004,138,145,251,169,000,097 51108 :145,253,232,200,192,036,198 51114 :208,243,165,251,024,105,142 51120 :040,133,251,165,252,105,098 51126 :000,133,252,165,253,024,241 51132 :105,040,133,253,165,254,114 51138 :105,000,133,254,224,128,014 51144 :208,211,096,120,169,000,236

76

Page 76: 16 Voor de 64

51150 :141,026,208,169,255,141,122 51156 :013,220,169,049,141,020,056 51162 :003,169,234,141,021,003,021 51168 :169,000,141,021,208,088,083 51174 :169,147,032,210,255,096,115 51180 :032,073,199,169,001,141,083 51186 :021,208,169,004,141,136,153 51192 :002,096,173,018,208,201,178 51198 :146,208,021,169,000,141,171 51204 :018,208,169,028,141,024,080 51210 :208,169,001,141,025,208,250 51216 :104,168,104,170,104,064,218 51222 :169,146,141,018,208,169,105 51228 :021,141,024,208,169,001,080 51234 :141,025,208,076,049,234,255 51240 :000,255,136,192,255,208,062

Programma 3. Maat-letterteken-Iade ...

Om programma's foutloos in te voeren, kunt u de 'automatische controleur' gebruiken. Zie bijlage C.

10 input"filenaam,device";n$,d :rem 107 20 f$=n$:zk=peek(53)+256*peek(54)-len (f$) :poke782,zk/256 :rem 180 25 poke781,zk-peek(782)*256:poke780, len(f$) :sys65469 :rem 39 30 poke780,1:poke781,d:poke782,0:sys 65466 :rem 177 40 poke780,0:poke781,222:poke782,169 :sys65493 :rem 115 50 close1:print:print"[CLR]"chr$(1 42) :rem 90

77

Page 77: 16 Voor de 64
Page 78: 16 Voor de 64

SCHERM-KOPPEN

Todd Heimarck Met deze korte machinetaalroutine worden letters tot viermaal hun normale formaat 'opgeblazen'. De grote lettertekens kunnen worden gebruikt voor opschriften ofvele andere doeleinden. Het programma werkt met Commodore printers en kan zelfs gebruikt worden met 'Scherm-80', het programma voor een 80-kolomsscherm.

Opgeblazen lettertekens kunnen zeer handig zijn: op een titelscherm, in een alfabet voor kinderen, in een wiskundeprogramma of voor visueel gehandicapte computergebruikers. Het duurt erg lang om voor elk letterteken de juiste combinatie van grafische tekens te vinden; het blijft een kwestie van uitproberen. Een heel alfabet kost dan ook nog eens erg veel geheugenruimte. De eenvoudigste manier om zeer grote letters te maken, zonder experimenten en zonder geheugenverlies, is het PEEKen van de letter-generator in ROM en voor elke bit die aan staat, een blokje (inverse spatie) af te drukken. Voor elke bit die uit staat, wordt een spatie afgedrukt. Het enige nadeel van deze methode is, dat elk letterteken achtmaal zo groot wordt. Er blijft erg weinig ruimte over op het scherm. Uw 64 is plotseling veranderd in een 5-kolomscomputer. Het idee om de lettertekens in ROM te lezen is wel bruikbaar als er gebruik wordt gemaakt van enkele speciale Commodore lettertekens.

De oplossing van de kwart-vierkanten Druk de Commodore-toets in en tik IKBVDCF. Deze zeven lettertekens, plus een spatie, vormen de helft van de kwart-vierkanten grafiek. De andere helft wordt verkregen door dezelfde toetsen in te drukken nadat inverse (kleuromkering) aangezet is. Er zijn 16 verschilende lettertekens, een voor elke combinatie van aan- of uitstaande kwart-vierkanten. Kwart-vierkanten stellen u in staat om een scherm op te bouwen met zogenaamde middelfijne resolutie. Zo'n scherm is eenvoudiger te programmeren dan een scherm met hoge resolutie en heeft een beter oplossend vermogen dan het gebruikelijke scherm met lage resolutie. In plaats van het aan- of uitzetten van hele lettertekens, kunt u extra grote lichtpunten (elk het formaat van een kwart-letterteken) besturen. De Commodore heeft daardoor de mogelijkheid 80x50 lichtpunten te besturen. Deze 16 lettertekens zijn het begin van het Scherm-koppen-programma. Het idee is om het letterteken-ROM te lezen, elke bit naar een groot lichtpunt (een kwart-vierkant) te vertalen en tot slot de juiste kwart-vierkanten af te drukken. Het is mogelijk om dit in BASIC te doen met een stel PEEKs en POKEs, maar machinetaal is veel sneller en stijlvoller. Het programma is uiterst eenvoudig in gebruik. Nadat u het programma heeft ingevoerd en opgeslagen, tikt u RUN. Een kort machinetaal programma wordt nu in het geheugen gePOKEt. Om het programma te laten werken, heeft u twee POKEs en een SYS nodig:

POKE 249,0: POKE250,1: SYS 828 U zou nu een grote hoofdletter A van vier lettertekens breed en vier hoog moeten zien. Door tegelijk de Commodore- en de SHIFT-toets in te drukken, verandert u van hoofdletters naar kleine letters, of andersom. Verplaats de cursor naar de POKEs, druk op RETURN en u ziet de kleine letter a. Plaats nu het getal 129 in geheugenlocatie 250. Als resultaat krijgt u hetzelfde letterteken, maar nu in inverse. Als u een kopie van Scherm-koppen heeft gemaakt, kunt u NEW intikken om het BASIC-Iaadprogramma te wissen. (Het machinetaalprogramma zal hierdoor niet gewist worden. Dit programma is veilig opgeborgen in de cassette-buffer).

79

Page 79: 16 Voor de 64

Tik nu: 1 MK=7 5 PRINT "{CLR}"; 10 FOR X=OT0255 20 Y=(XANDMK)*4: POKE249,Y 25 IFXANDMK THEN PRINT"{4 X OMHOOG}";

30 POKE 250,X:SYS828 40 NEXT Opmerking: Cassette-gebruikers kunnen dit programma niet opslaan. Elke cassette-bewerking wist het Scherm-koppenprogramma uit de cassette-buffer.) Tik RUN en de hele Commodore

lettertekenlijst zal over het scherm lopen.

Het maken van letters De bovenkant van een grote letter wordt afgedrukt waar de cursor is als u een SYS gebruikt. De POKE naar 249 bepaalt hoeveel spaties de cursor verspringt voordat begonnen wordt met het vormen van de letter. Het getal moet tussen 0 en 35 liggen.

Vervolgens moet de schermcode van de letter in locatie 250 gePOKEt worden. U moet niet gebruik maken van de ASCII-code, maar van de schermcode die u gebruikt om lettertekens naar het scherm te POKEn. De getallen 1 tot en met 26 geven de letter A-Z, de getallen 48-57 geven de cijfers 0-9, enzovoorts. Om een letter of cijfer in inverse te krijgen, moet u 128 bij de schermcode optellen. (Een lijst met schermcodes staat in bijlage E van de handleiding bij uw computer: Commodore 64 User's Guide.) Nadat de waarden in 249 en 250 zijn gePOKEt, moet SYS 828 worden ingevoerd. De opgeblazen letter verschijnt bijna onmiddellijk.

Nu met drie extra's (en een nadeel) De oorspronkelijke versie van deze routine (voor het eerst gebruikt in twee andere programma's in COMPUTE!'s Gazette), zochten de vorm van het grote letterteken op en POKEte de juiste kwart-vierkanten naar het scherm. Het huidige programma Scherm-koppen PRINT de kwart-vierkanten (door middel van de Kemal PRINT-routine op $FFD2) in plaats van te POKEn. Om alle kwart-vierkanten te krijgen, is het nodig dat de inverse telkens wordt aan- en uitgeschakeld. Dit is nogal omslachtig, maar er zijn enkele voordelen verbonden aan het gebruik van $FFD2. Het eerste voordeel is dat u de opgeblazen lettertekens naar een Commodore printer kunt sturen. U moet daarvoor wel een enkele waarde veranderen, zodat spaties in plaats van cursors-naar-rechts worden verzonden (zie regel 951 van de programmalisting). Voer de volgende regel in om een afdruk op papier te maken:

OPEN 4,4: CMD4: POKE 249,xx: POKE 250,yy: SYS 828 Vergeet niet om xx te vervangen met de plaats waar u wilt afdrukken, en yy te vervangen door de scherrncode van het af te drukken letterteken. Als dat mogelijk is, moet u de interlinie van de printer op nul worden gezet. Zo komen de kwart-vierkanten mooi aan elkaar vast te liggen. Als u klaar bent met afdrukken, zorgt PRINT#4: CLOSE4 voor het netjes afsluiten van het kanaal naar de printer. Jammer genoeg kunt u met een printer geen cursorverplaatsingen doen. U kunt slechts een opgeblazen letterteken per regel maken. Om deze beperking te omzeilen, kunt u het papier met de hand terugdraaien, of een scherm-dumpprogramma gebruiken. Nog mooier is het, als u CMD gebruikt om uitvoer naar een cassette of diskette te sturen, om de gegevens weer in een array te lezen en ze te gebruiken voor een scherm-dump. De tekening illustreert enkele van de opgeblazen lettertekens zoals de Commodore printer die weergeeft. De eerste twee kolommen tonen hoofdletters en kleine letters, terwijl in de derde kolom de printer heeft gezorgd voor extra brede letters.

80

Page 80: 16 Voor de 64

Normale en extra brede letters

Een ander voordeel van het gebruik van PRINT in plaats van POKE is dat Scherm-koppen kan worden gebruikt met Scherm-80 (het 80-kolomsprogramma uit het vorige hoofdstuk). U kunt nu tot maximaal 19 opgeblazen letters op een regel gebruiken in combinatie met de 80-kolomstekst van uw Commodore 64. Het laatste extra voordeel is dat u de flexibiliteit van de PRINT opdracht kunt gebruiken voor het manipuleren van de opgeblazen letters. U kunt een letter op elke plaats op het scherm plaatsen, in elke gewenste kleur. U hoeft alleen de kleur van de cursor te veranderen. U kunt op een scherm grote hoofdletters, kleine letters en grafische symbolen mengen. Een klein nadeel is dat elke regel moet worden gevolgd door een wagenterugloop (carriage return). Dat wil zeggen dat het ~et mogelijk is een letterteken helemaal rechts of helemaal onderin het scherm te plaatsen.

Werking van het programma Er zijn twee lijsten met POKEs in het BASIC-Iaadprogramma. De eerste lus (688 tot en met 703) bevat de aangepaste ASCII-waarden van de kwart-vierkanten grafische tekens. Omdat er geen ASCII-waarde van een inverse teken bestaat, moet de vlag die inverse aangeeft, afwisselend aan en weer uit gezet worden. Bit 6 van elk teken geeft aan of de inverse-vlag aan of uit moet staan. Het getal wordt vervolgens geAND met $BF(191) om bit 6 uit te zetten voordat het teken wordt afgedrukt De tweede lus (828 tot en met 1006) vormt de machinetaalroutine. De routine wordt in de cassette-buffer geplaatst, maar is zo geschreven dat de routine kan worden verplaatst. Als u de cassette-buffer nodig heeft voor een ander machinetaalprogramma, of als u de cassette-recorder

gaat gebruiken, kunt u de routine naar een andere plaats in het geheugen verplaatsen. De eerste lus moet op zijn plaats blijven staan. Als u de tweede lus naar BASIC-RAM verplaatst, moet u maatregelen nemen om te zorgen dat de routine niet gewist wordt door andere taken van de BASIC RAM. Voor hen die geinteresseerd zijn in machinetaal, volgt hier een korte uitleg van de werking van het programma. De hoofdlus controleert eerst welke lijst met tekens wordt gebruikt Naar aanleiding van de uitkomst, wordt een zero-page wijzer geplaatst Het scherm-code getal wordt nu vermenigvuldigd met acht en opgeteld bij de wijzer. Nadat de wijzer is ingesteld, worden de bytes van het letterteken-ROM twee bij twee geladen. Door afwisselend de bytes naar links te schuiven (ASL) en de accumulator links te draaien (ROL), wordt een getal van 0 tot en met 15 gegenereerd. Dit getal wordt gebruikt om het juiste kwart-vierkant grafische teken op te zoeken in de tabel vanaf 688. Bit 6 wordt gecontroleerd (als deze bit aan staat, wordt de inverse ingesteld) en tot slot zorgt een JSR naar $FFD2 voor het afdrukken van het letterteken. Het programma springt nu terug naar het volgende stel bits.

Scherm-koppen Om dit programma zonder fouten in te voeren, kunt u gebruik maken van de 'automatische controleur'. Zie bijlage C.

81

Page 81: 16 Voor de 64

LISTING programma : grote letters

5 print"[CLR]even geduld a.u.b." :rem 222 10 t=0:forj=688to703:readk:t=t+k:poke j,k:next :rem 134 15 ift<>3078thenprint"fout in datare gels": stop : rem 198 20 t=0:forj=828to1006:readk:t=t+k:poke j, k : next : rem 176 30 ift<>20306thenprint"fout in datar egels":stop :rem 236 35 poke249,O :rem 146 688 data32,188,190,226,172,225,191,2 51 :rem 148 696 data187,255,161,236,162,254,252, 96 :rem 158 828 data169,208,133,004,173,024 :rem 46 834 data208,041,002,240,004,169 :rem 32 840 data216,133,004,169,OOO,162 :rem 31 846 data003,006,250,042,202,208 :rem 28 852 data250,024,101,004,133,004 :rem 19 858 data165,250,133,003,173,014 :rem 40 864 data220,041,254,141,014,220 :rem 27 870 data165,OOl,041,251,133,001 :rem 23 876 data169,OOO,133,250,169,005 :rem 46 882 data133,002,160,OOO,177,003 :rem 26 888 data133,005,230,003,177,003 :rem 36 894 data133,006,230,003,198,002 :rem 36 900 data240,028,162,004,169,000 :rem 28 906 data006,006,042,006,006,042 :rem 25 912 data006,005,042,006,005,042 :rem 20 918 data164,250,153,048,002,230 :rem 38 924 data250,202,208,232,240,210 :rem 26 930 data165,001,009,004,133,OOl :rem 20 936 data173,014,220,009,001,141 :rem 28 942 data014,220,160,000,166,249 :rem 33 948 data240,008,169 :rem 229 951 data029:rem 032 bij gebruik van een printer :rem 198 952 data032,210 :rem 14 954 data255,202,208,250,169,004 :rem 45 960 data133,006,185,048,002,170 :rem 38 966 data189,176,002,133,005,041 :rem 46 972 data064,240,005,169,018,032 :rem 43 978 data210,255,165,005,041,191 :rem 46 984 data032,210,255,169,146,032 :rem 47 990 data210,255,200,198,006,208 :rem 43 996 data221,169,013,032,210,255 :rem 43 1002 data192,016,208,196,096 :rem 153

82

Page 82: 16 Voor de 64

LISTING programma demo gr.letters

2 mk=7: 5 print" [CLR] "; 10 forx=Oto255 20 y=(xandmk)*4:poke249,y 25 ifxandmkthenprint" [4xUP]"; 30 poke250,x:sys828 40 next

83

: rem 120 : rem 212 : rem 76 : rem 247 :rem 56 : rem 136 : rem 163

Page 83: 16 Voor de 64
Page 84: 16 Voor de 64

STAMBOOM

Mark Haney

Uw computer is een perfect instrument voor het bijhouden vaneen kaartenbak. Opslaan en oproepen van informatie, weergeven van (delen van) de informatie op het scherm of op papier en het eenvoudig aanpassen van de informatie, zijn de meest efficiente funkties van uw Commodore 64. Bij genealogie komt een enorme hoeveelheid gegevens te kijken: namen, data en relaties. Met 'Stamboom' kunt u de mogelijkheden van de 64 als kaartenbak gebruiken om de wortels van uw familie op te sporen. Het programma is geschikt voor zowel cassettes als diskettes.

Heeft u ooit geprobeerd de stamboom van uw familie samen te stellen? Normaal gesproken maakt u daarvoor een soort schema, waarna u elke naam in het juiste hokje schrijft Toevoegen of veranderen van het schema of van de namen is bijna onmogelijk zonder opnieuw te beginnen. Een van de beperkingen van papier en pen. Uw Commodore 64 kan u helpen bij het opsporen van uw voorouders, zonder alle moeilijkheden van het telkens opnieuw tekenen van een schema. 'Stamboom' is een bijna professioneel programma voor gegevensverwerking. Het programma stelt u in staat om namen, geboortedata en relaties in te voeren. De informatie kan op cassette of diskette worden opgeslagen, zodatu uw genealogie op elk gewenst moment kunt oproepen. Het veranderen ofverwijderen van onderdelen vraagt slechts een of twee keer indrukken vaneen toets. Het toevoegen van nieuwe namen gaat net zo gemakkelijk. De gemaakte kaart kan zelfs op papier worden gezet, als u tenminste de beschikking heeft over een printer. Een stamboom is een persoonlijk stuk van de algemene geschiedenis. De stamboom die uw vader maakte, liet (per ongeluk) de helft van uw voorouders weg. De stamboom die uw zoon maakt, bevat vele namen die voor u slechts 'pro forma' genoteerd zijn. Zelfs relaties die gelijk zijn in verwantschap, hoeven voor u niet even interessant te zijn. Er zijn neven die u verschillende keren per jaar ziet, maar u heeft ook neven die u eigenlijk nog nooit heeft gezien. Dit wil niet zeggen dat u zomaar iedereen uit uw stamboom moet halen. Een afgedrukte genealogiekaart heeft enige beperkingen, die ertoe leiden dat het moeilijk is om enige lijn te vinden in een kaart waarop meer dan de belangrijkste namen staan. Zelfs het bijhouden van zo'n beperkte stamboom is een gigantische klus.

Opsporing Het programma Stamboom heeft twee funkties: onderhoud en weergave. Beide funkties zijn altijd tegelijk aanwezig. Opslag en oproepen van gegevens gaat met de LOAD- en SAVE-opdrachten. Het programma past zichzelf telkens aan. Tik Stamboom in en save het op een cassette of diskette. Met de 'automatische controleur' kunt u het programma snel en eenvoudig intikken. Dit programma zorgt er tevens voor dat u Stamboom zonder fouten intikt. Als u Stamboom voor de eerste keer gebruikt, zal u een scherm met instructies zien. De

85

Page 85: 16 Voor de 64

letters bovenaan het scherm geven de toetsen aan die u kunt indrukken als u een kaart aan het maken bent We komen op deze toetsen nog terug. Na een korte pauze, waarin de computer alle variabelen initialiseert, wordt u gevraagd een naam in te voeren voor de kaart die u wilt weergeven. Als u Stamboom voor het eerst gebruikt, kunt u gewoon op de RETURN-toets drukken. Druk vervolgens op een willekeurige toets en de begintekst verschijnt onderaan het scherm. Hier begint u met uw stamboom. Het is nuttig om, voordat u begint, eenidee te hebben van de aanpak van het opzetten van een stamboom. Begint u met uw eigen naam en werkt u terug naar uw voorouders, of begint u met uw over-over-over-grootmoeder en werkt u naar uzelf toe. Welke methode u ook kiest, eerst moet u de begin-items invoeren: voornaam, achternaam en geboortejaar, gescheiden door komma's. Als u van iemand het geboortejaar niet weet, kunt u dat weglaten. U moet dan wel de komma achter de achternaam opgeven. Als u de geboortedatum later nog vindt, kunt u deze alsnog invoeren. Zodra u op de RETURN-toets drukt, rolt het scherm naar boven, en een verkorte versie van de naam verschijnt midden links op het scherm. Aan weerszijden van de verkorte naam ziet u twee grote knipperende cursors. Onderaan het scherm ziet u, in inverse video, de volledige naam met het geboortejaar. (Als u een Stamboom-bestand gemaakt heeft, dit bestand opgeslagen en later weer in het geheugen opgeroepen heeft, is de naam tussen de cursors en de volledige naam onderin het scherm, het eerste dat u op het scherm te zien krijgt.)

Relatie-punten De huidige persoon wordt aangegeven door de cursor. U kunt nu relaties van de huidige persoon invoeren en weergeven door een van de volgende toetsen in te drukken:

Toets M F S P N C

Relatie Moeder Vader Echtgeno(o)t(e) Jongere broers/zussen Oudere broers/zussen Kind

Nadat het eerste item verschijnt, kunt u de relaties van die persoon invoeren door een van bovenstaande toetsen in te drukken. Druk bijvoorbeeld op de M-toets om de naam en het geboortejaar van de moeder van de huidige persoon in te voeren. Zorg ervoor dat u de komma's tussen de voornaam, achternaam en geboortejaar niet vergeet. (Als u zich plotseling bedenkt en u wilt geen item invoeren, kunt u op de RETURN-toets drukken, waarna de cursor teruggaat naar het vorige i~m.) De moeder wordt nu de huidige persoon, zoals door de cursors aangegeven wordt. Op deze wijze kunt u verder gaan met het invoeren van meer namen en geboortejaren. Terug langs dit pad, om bijvoorbeeld weer bij de eerste invoer te komen, kan op twee manieren. U kunt de cursortoetsen van het toetsenbord van de Commodore gebruiken om de knipperende cursors naar de juiste naam te verplaatsen. U kunt ook de juiste toets(en) uit het lijstje hiervoor indrukken. Stel dat u drie namen op het scherm heeft: de oorspronkelijke

86

Page 86: 16 Voor de 64

invoer en de vader en moeder van deze persoon. Om terug te gaan naar de oorspronkelijke invoer, terwijl de cursors zich bij de naam van de vader bevinden, tikt u de C van kind in. De cursors zullen nu terugspringen. U hoeft zich geen zorgen te maken dat het scherm te klein is voor alle namen. Indien nodig, 'schuift' het beeld met de invoer mee.

Bestaande stambomen Als u al een stamboom heeft gemaakt en deze opgeslagen heeft, en u wilt deze stamboom verbeteren, dan hoeft u alleen de bestandsnaam op te geven als u de eerste schermweergave ziet. De juiste cassette of diskette moet in de cassette-recorder of diskdrive zitten als u de naam van het bestand intikt. U moet de computer opgeven of u met cassette of diskette werkt, door het intikken van een T of D. Het bestand wordt in het geheugen geladen, waarna u alleen de eerste invoer op het scherm krijgt te zien. Weest u niet ongerust, de rest van de namen is wel aanwezig. U krijgt die te zien door een paar toetsen in te drukken. U heeft nu de oorspronkelijke invoer op het scherm. Hoe moet u nu verder? U hoeft alleen de juiste relatie-toetsen uit de eerder gegeven tabel in te tikken, en de namen verschijnen op het scherm. Bijvoorbeeld: u heeft eerder de oorspronkelijke invoer ingetikt, plus de vader, moeder en echtgenote van hem. Door achtereenvolgens F, M en S in te tikken worden de drie namen weergegeven (onderbroken door wat cursorverplaatsingen).

Opslaan en laden van stambomen Nadat u een stamboom gemaakt heeft die u wilt opslaan, drukt u op Q. Als u van gedachten verandert, kunt u op RETURN drukken en verschijnt het scherm zoals dat voor het opslaan was. Drukt u echter op de Y -toets, dan vraagt de computer u om een nieuwe bestandsnaam. U kunt een stamboom alleen opslaan als u minstens een verandering aangebracht heeft. Dat is logisch, want waarom zou u anders een bestand willen opslaan. Zoals hiervoor al is beschreven, hoeft u, voor het laden van een eerder gemaakte stamboom, alleen de naam op te geven als de eerste schermweergave is verschenen. Het bestand wordt geladen zodra u een T of een D heeft ingetikt.

Andere toetsen Er zijn nog meer nuttige toetsen: Toets Funktie CLR Wis scherm, alleen huidige persoon blijft DEL Wis huidige persoon van scherm f1 Wis invoer van stamboom o Voer huidige schermweergave uit naar printer Q Stop D Verander de gegevens van de huidige persoon

De cursortoetsen werken als normaal.

87

Page 87: 16 Voor de 64

Stop Als u besluit om het programma te verlaten en de Q-toets indrukt, heeft u twee mogelijkheden: de stamboom is weergegeven geweest, of er zijn veranderingen aangebracht. In het laatste geval moeten nieuwe DATA-statements gemaakt worden. Het is essentieel dat u op dit proces wacht en het programma hierna opslaat. Als u dit niet doet, zullen uw veranderingen niet worden opgeslagen. Ik heb het stamboomprogramma gebruikt om een boom met 360 namen te maken. Voor grotere families is het raadzaam om verschillende stambomen te maken die elke een aparte tak van de familie aangeven. Het geheugengebruik kunt u bij benadering uitrekenen met 8000+77*n. n staat hierbij voor het aantal gebruikte namen. De berekening is niet precies, want de hoeveelheid gebruikt geheugen is mede afhankelijk van de lengte van de namen en van het feit of in alle gevallen het geboortejaar wordt opgegeven.

Stamboom Om dit programma zonder fouten in te tikken, kunt u de 'automatische controleur' gebruiken. Zie bijlage C.

1 printchr$(147) "[2xRIGHT] [9xRIGHT] de familie stamboom":print :rem 216 2 print "m--moeder" :print "v--vader" :print "e--echtgenoot" : rem 45 3 print"p--oudere broer/zus":print"n --jongere zus/broer":print"c--kind":print

:rem 26 4 print"[clr]--wis scherm":print".[de l]--verwijder invoer van scherm"

:rem 203 5 print"[f1]--verwijder invoer uit b oom" :rem 51 6 print"o--uitvoer scherm":print"q--stop":print"d--verander data" :rem 182 7 print"cursor controle als gewoonli jk" :print : rem 236 9 print"wacht op initialisatie s.v.p . ": goto400 : rem 115 10 gosub500: ifa$=""then10 : rem 181 12 gosub550 :rem 125 15 onjgosub110,120,130,140,150,160,1 70,180,190,200,210,220,230,240,250,260

: rem 20 goto10 : rem 110 ify<mytheny=y+1:n=sc(x,y) :gosub6 50 : rem 111 return : rem 120 ify>ltheny=y-1:n=sc(x,y) :gosub65 0 :rem 121 return : rem 130 ifx<mxthenx=x+1:n=sc(x,y) :gosub6 50 : rem 131 return : rem

88

186 252

180 115

68 116

178 117

Page 88: 16 Voor de 64

140 ifx>lthenx=x-1:n=sc(x,y) :gosub65 o : rem 141 return : rem 150 m1=1:t1=1:t2=2:gosub850:return : rem 160 m1=2:t1=2:t2=1:gosub850:return : rem 170 m1=3:t1=3:t2=1:gosub800:return : rem 180 m1=6:t1=4:t2=4:gosub800:return : rem 190 m1=4:t1=5:t2=3:gosub800:return :rem 200 ifn=Othenreturn :rem 201 n=ft%(sc(x,y),6) :ifn=Othenm1=5:gosub 950:ifn=Othenn=ln:gosub650:return m 150

67 118

79 81 79 87 86

235

202 ifos%(n)<>Othenx=int(os%(n) 110) : y=os%(n)-10*x:gosub650:return 203 tn=ft% (ln, 6)

:rem 222 :r~m 128

204 ifos% (tn) <>Othenx=int (os% (tn) 110 ) :y=os%(tn)-10*x:n=tn:gosub650:return

:rem 67 205 ifft%(tn,5)<>Othentn=ft%(tn,5) :goto 204 :rem 13 206 ifx=lthenm1=4:gosub700:d=-2:gosub 600: return : rem 224 207 ifsc(x-1,y)<>Othengosub900:return

:rem 86 208 x=x-1:d=-2:gosub600:return :rem 105 210 forj=ltomy:fork=ltomx:sc(k,j)=O: next:next :rem 222 211 forj=ltomn:os%(j)=O:next :rem 243 212 printchr$(19) ;:forj=ltonr:printb l$:next :rem 39 213 x=1:y=4:d=0:gosub600:return :rem 181 220 gosub350:printd$:a$="":input"sto pij, nee/cr";a$:ifa$="j"then222 :rem 238 221 n=ln:gosub650:return :rem 41 222 iffl=Othengosub350:printd$:end :rem 171 223 gosub350:printd$:print"er zijn w ijzigingen" : rem 0 224 input"nieuwe bestandsnaam";n$:input "tape of disk";a$ :rem 239 225 ifleft$(a$,1)="t"thenopen1,1,1,n $:goto227 :rem 87 226 open1,8,2,n$+",seq,w" :rem 100 227 printf1,mn:forj=ltomn:printf1,n$ (j,O)r$n$(j,l) :rem 234 228 fork=lto6:printf1,ft%(j,k) :next: printf1,dt%(j) :next:close1:end :rem 176 230 gosub350:printd$:a$="":input"uit voer/u or cr";a$:ifa$=""thengosub350:return

:rem 162 231 open4,4:cmd4 :rem 158 232 forj=Otonr-3:fork=Otonc-2:t1=peek (sc+nc*j+k) :rem 242 233 ift1=64thenprintchr$(133);:goto2

89

Page 89: 16 Voor de 64

39 :rem 68 234 ift1=93thenprintchr$(134) ;:goto2 39 :rem 72 235 ift1=107thenprintchr$(132);:goto 239 :rem 115 236 ift1=115thenprintchr$(131);:goto 239 :rem 114 237 ift1=32thenprintchr$(32); :goto23 9 :rem 17 238 printchr$(t1+64); :rem 209 239 next:print:next:print#4:close4:return

:rem 57 240 fl=1:m1=8:gosub785:ifn1$=""thenreturn

:rem 29 241 gosub775:gosub650:return :rem 41 250 tp=sc+x*8+y*120-169:forj=Oto3:for k=Oto8:poketp+j*40+k,32:next:next

:rem 108 252os%(sc(x,y))=0:sc(x,y)=0:n=0:gosub 650:return :rem 177 260 gosub350:printd$:a$="":input"van

boom verwijderen/j, nee/cr";a$ :rem 69 261 ifa$<>"j"thenn=ln:gosub650:return

: rem 88 262 fl=1:ifft%(ft%(n,1),6)<>nandft%( ft%(n,2),6)<>nthen264 : rem 236 263 tn=ft%(n,5) :ft%(ft%(n,1),6)=tn:f t%(ft%(n,2),6)=tn : rem 198 264 ft% (ft% (n, 4) ,5) =ft% (n,S) : ft% (ft% (n,S) ,4) =ft% (n, 4) : ft% (ft% (n, 3) ,3) =0

: rem 254 265 tn=ft% (n, 6) : rem 60 266 iftn=Othenn=0:goto250 : rem 48 267 ifft% (tn, l)=nthenft%(tn,l)=O:tn= ft%(tn,5) :goto266 : rem 176 268 ft%(tn,2)=0:tn=ft%(tn,5) :goto266

:rem 90 350 printd$:printbl$:printbl$chr$(14 5) : return :rem 133 400 poke51,200:poke55,200:poke52,peek (52)-1:poke56,peek(56)-1:clr : rem 9 401 x=1:y=4:n=1:a$="":t1=0:t2=0:t3=0 :t4=0:d=0:dr=0:m1=0:j=0:k=0:tn=0 :rem 164 402 mx=5:my=8:nr=25:nc=40:1e=7:1m(1) =800:1m(2)=800:1m(3)=912:1m(4)=912 :rem 225 403 sc=256*peek(648) :ms=1000 :rem 33 404 t5=255:t6=256:u8=128:p1=0:p2=0:p 3=0:p4=0 :rem 221 405 dimft%(ms,6),os%(ms),dt%(ms),n$( ms,l) ,sc(mx+l,my+l),op$(16) :rem 24 406 forj=lto8:readtp$(j) :next :rem 70 407 datamoeder,vader,echtgenoot,volg end,kind,eerder,eerste invoer,nieuw ge

90

Page 90: 16 Voor de 64

geven : rem 23 408 forj=lto14:readop$(j) :next :rem 112 409 rem [down], [up], [right]""", [c lr]", :rem 173 410 op$(15)=chr$(20) :op$(16)=chr$(133) :data"[DOWN]","[UP]","[RIGHT]","[LEFT]" ,m,v,e,p,n,k,"[CLR]",q,u,d :rem 105 411 fr(l)=sc+lm(l) :fr(2)=sc+3*nc:fr( 3)=sc+le+1:fr(4)=sc+lm(4) :rem 190 415 tg(1)=sc+lm(1)+3*nc:tg(2)=sc:tg( 3)=sc:tg(4)=sc+lm(4)+le+1 :rem 206 420 t1=peek(55)+t6*peek(56) :forj=t1to t1+45:readt2:pokej,t2:next :rem 155 421 data160,O,177,251,145,253,24,165 ,251,101,142,133,251,165,252,101,143,1 33 :rem 183 422 data252,24,165,253,101,142,133,2 53,165,254,101,143,133,254,165,140,208

:rem 95 423 data4,198,141,48,5,198,140,24,14 4,211,96 :rem 177 425 mn=O:n$(O,O)="leeg ":n$(O,l)="it em" :rem 4 426 print:n$="":print"naam familiest arnboom (cr zonder naam) ":inputn$ :rem 232 427 ifn$=""then433 :rem 232 428 inp:ut"tape of disk";a$ :rem 252 429 ifleft$(a$,l)="t"thenopen1,l,O,n $:goto431 :rem 89 430 open1,8,2,n$+",seq,r" :rem 92 431 input#l,mn:forj=ltomn:input#l,n$ (j,O),n$(j,l) :rem 163 432 fork=lto6:input#l,ft%(j,k) :next: input#l,dt%(j) :next:close1 :rem 162 433 print:printndruk op een toets vo or vervolg [4xSPATIE]" :rem 217 434 geta$:ifa$=""then434 :rem 89 435 ifmn=Othenm1=7:gosub950 :rem 172 436 d$=chr$(19) :forj=ltonr-3:d$=d$+chr$ (17) :next :rem 31 437 bl$="":forj=ltonc-1:bl$=bl$+" n: next:r$=chr$(13) :rem 162 438 ch$(1)=chr$(125) :ch$(2)=chr$(96) :ch$(3)=chr$(171) :ch$(4)=chr$(179) :rem 148 440 forj=ltonr:printbl$:next:gosub60 0:goto10 :rem 144 500 p1=sc+(x-1)*(le+1)+(y-1)*3*nc:p2 =p1+1e-1:p3=p2+nc-le+1:p4=p3+1e-1 :rem 76 501 geta$:ifa$<>""thenreturn :rem 214 505 t1=peek(p1) :t2=peek(p2) :t3=peek( p3) :t4=peek(p4) :geta$:ifa$<>""thenreturn

:rem 178 510 pokep1,t1+u8:pokep2,t2+u8:pokep3

91

Page 91: 16 Voor de 64

,t3+u8:pokep4,t4+u8 :rem 180 515 forj=lto50:geta$:ifa$=""thennext

:rem 222 520 pokep1,t1:pokep2,t2:pokep3,t3:poke p4,t4 :rem 213

525 ifa$=""thenforj=lto50:geta$:ifa$ =""thennext : rem 131 530 return : rem 120 550 forj=lto16:ifa$<>op$(j)thennext m 183 551 return : rem 123 600 gosub650 :print1eft$ (d$, (y-1) *3+1 )tab((le+1)*(x-1»left$(n$(n,O),le) :rem 206 601 printtab((le+1)*(x-1»left$(n$(n ,l),le) : rem 134 605 sc(x,y)=n:os%(n)=10*x+y : rem 46 610 ifabs(d)<>2then620 : rem 4 615 print1eft$(d$, (y-1)*3+2)tab((le+ l)*(x+(d>O»-l)ch$(abs(d»; :rem 138 616 printchr$(145)chr$(157)ch$(abs(d ) ) : return : rem 138 620 print1eft$(d$,3*(y-(d>0»-3)tab( (le+1)*(x-1)+2)ch$(abs(d»ch$(abs(d»

:rem 186 625 return :rem 125 650 gosub350:1n=n:printd$:printchr$( 18)n$(n,O)"[2xSPATIE]"n$(n,l) " [2xSPATIE] " dt%(n) : return :rem 156 700 gosub350:poke140,lm(m1)andt5:poke 141,lm(m1)/t6 :rem 233 701 poke142,l:poke143,O:iffr(m1)<tg( m1)thenpoke142,t5:poke143,t5 :rem 78 702 poke251,fr(m1)andt5:poke252,fr(m 1)/t6 :rem 157 703 poke253,tg(m1)andt5:poke254,tg(m 1)/t6:sys(peek(55)+t6*peek(56» :rem 210 705 onm1goto710,715,720,725 :rem 224 710 forj=ltomx:fork=ltomy-1:os%(sc(j ,k»=os%(sc(j,k»+l:nextk :rem 23 711os%(sc(j,my»=0:nextj :rem 228 712 forj=myto1step-1:fork=ltomx:sc(k ,j)=sc(k,j-1) :next:next :rem 85 713 printchr$(19)b1$:printb1$:printb 1$: return : rem 162 715 forj=ltomx:fork=2tomy:os%(sc(j,k »=os%(sc(j,k»-l:nextk :rem 193 716os%(sc(j,l»=0:nextj :rem 116 717 forj=ltomy:fork=ltomx:sc(k,j)=sc (k,j+1) :next:next :rem 190 718 print1eft$(d$,3*(my-1»b1$:print b1$:printb1$:return :rem 209 720 forj=ltomy:fork=2tomx:os%(sc(k,j »=os%(sc(k,j»-10:nextk :rem 237

92

Page 92: 16 Voor de 64

721os%(sc(1,j»=0:nextj :rem 112 722 forj=ltomy:fork=ltomx:sc(k,j)=sc (k+1,j) :next:next :rem 186 723 printchr$(19) ;:forj=lto3*my-1:print tab(nc-le-1)left$(b1$,le) :next :rem 33 724 forj=sc+nc-1tosc+nc-1+nr*ncstepn c:pokej,32:next:return :rem 56 725 forj=ltomy:fork=ltornx-1:os%(sc(k ,j»=os%(sc(k,j»+10:nextk :rem 77 726os%(sc(mx,j»=0:nextj :rem 233 727 forj=ltomy:fork=mxto1step-1:sc(k ,j)=sc(k-1,j) :next:next :rem 91 728 printchr$(19) ;:forj=lto3*my-1:print left$(bl$,le+1) :next :rem 173 729 forj=sc+nc-1tosc+nc-1+nr*ncstepn c:pokej,32:next:return :rem 61 750 tn=ln:n=mn+1:mn=n:gosub775 :rem 142 751 ifft%(tn,5)<>Othentn=ft%(tn,5) :goto 751 :rem 26 755 ft%(tn,a)=n:ifft%(tn,4)<>Othentn =ft%(tn,4) :goto755 : rem 4 760 ft%(n,3)=ft%(tn,b) :ft%(n,6)=tn:if ft%(tn,b)<>Othenft%(ft%(tn,b),3)=n :rem 108 761 return :rem 126 775 n$(n,0)=n1$:n$(n,1)=n2$:dt%(n)=d t%: return : rem 35 785 gosub350:printd$:print:print"gee f v,pornaam, achternaam, geboortejaar";

:rem 19 790 printchr$(145)chr$(145) :printtp$ (mI); :n1$="":dt%=0:inputn1$,n2$,dt%:return

800 ifn=Othenreturn 802 n=ft%(sc(x,y),t1) :ifn=Othengosub 950:ifn=Othenn=ln:gosub650:return 805 ifos%(n)<>Othenx=int(os%(n)/10): y=os%(n)-x*10:gosub650:return 807 dr=1:ift1=4ort1=3andy<5thendr=-1

:rem 160 :rem 241

: rem 194

: rem 231

:rem 245 810 ifsc(x,y+dr)=Oand(y+dr»Oand(y+d r)<my+1theny=y+dr:d=t2*-dr:gosub600:return

:rem 185 815 ifsc(x,y-dr)=Oand(y-dr»Oand(y-d r)<my+1theny=y-dr:d=t2*dr:gosub600:return

:rem 153 820 ify=lthenm1=1:gosub700:d=t2:gosub 600: return : rem 7 825 ify=8thenm1=2:gosub700:d=-t2:gosub 600:return :rem 65 830 gosub900:return :rem 206 850 ifn=Othenreturn :rem 246 852 n=ft%(sc(x,y),t1) :ifn=Othengosub 950:ifn=Othenn=ln:gosub650:return

93

Page 93: 16 Voor de 64

:rem 199 855 ifos%(n)<>Othenx=int(os%(n)/10): y=os%(n)-10*x:gosub650:return :rem 236 860 tx=int(os%(ft%(sc(x,y),t2»/10): ty=os%(ft%(sc(x,y),t2»-10*tx:iftx=Othen 870 :rem 199 865 ifty=lorty=myorsc(tx,ty-1)=Oorsc (tx,ty+1)=Othenx=tx:y=ty:gosub170:return

:rem 133 870 ifx=mxthenm1=3:gosub700:d=2:gosub 600:return :rem 45 875 ifsc(x+1,y)<>Othengosub900:return

:rem 95 880 x=x+1:d=2:gosub600:return :rem 64 900 gosub350:printd$chr$(17) "onvoldo ende ruimte op scherm" :rem 82 905 print"moet wissen of verwijderen" chr$(145) : return :rem 93 950 ifmn<ms-1then952 :rem 209 951 gosub350:printd$:print"onvoldoen de geheugen":forj=lto1000:next:return

952 gosub785:ifn1$=""thenreturn 955 fl=1:onm1goto956,960,965,970,975 ,980,990 956 a=1:b=2:gosub750:return 960 a=2:b=1:gosub750:return 965 tn=ln:n=mn+1:mn=n:gosub775 966 ft%(tn,3)=n:ft%(n,3)=tn:ft%(n,6) =ft%(tn,6) :ifft%(n,6)=Othenreturn 967 tn=ft%(n,6) :a=1:ifft%(ft%(n,6),2 )=Othena=2 968 ft%(tn,a)=n:tn=ft%(tn,5) :iftn<>O then968 969 return 970 tn=ln:n=mn+1:mn=n:gosub775 971 ft%(n,l)=ft%(tn,l) :ft%(n,2)=ft%( tn,2) :ft%(n,4)=tn:ft%(tn,5)=n:return

975 tn=ln:n=mn+1:mn=n:gosub775 976 ifft% (tn, 6)<>Othena=2+(ft%(ft%(t n,6),1)=tn) :goto978 977 gosub350:printd$chr$(17)chr$(17) "geslacht ouder; moeder/1, vader/2";

978 printd$chr$(17)n$(ln,0);:inputa:

:rem 70 :rem 192

:rem 168 :rem 174 :rem 169 :rem 150

:rem 103

:rem 113

:rem 104 :rem 136 :rem 146

:rem 180 :rem 151

:rem 201

: rem 1

b=2+(a=2) :rem 109 979 ft%(n,a)=tn:ft%(n,b)=ft%(tn,3):f t%(tn,6)=n:ft%(ft%(tn,3),6)=n:return

:rem 226 980 tn=ln:n=mn+1:mn=n:gosub775 :rem 147 981 ft% (n, 1) =ft% (tn, 1) : ft% (n, 2) =ft% ( tn,2) :ft%(n,5)=tn:ft%(tn,4)=n :rem 155

94

Page 94: 16 Voor de 64

982 t3=ft%(tn,1) :ift3<>Othenft%(t3,6 )=n : rem 35 983 t3=ft%(tn,2) :ift3<>Othenft%(t3,6 )=n : rem 37 984 return : rem 133 990 mn=mn+1:n=mn:gosub775:return : rem 72

95

Page 95: 16 Voor de 64
Page 96: 16 Voor de 64

SUPERTANK

Boris Litinsky

In dit ongewone actiespel moet u voor:komen dat vijandelijke tanks over uw gebied rijden. Door nauwkeurig te mikken en zelf vijandelijk vuur te ontwijken. kunt u het brengen tot generaal. U heeft een joystick nodig.

Uw orders luiden 'de vijandelijke tanks te stoppen. Maar achterin uw hoofd speelt mee dat er meer is dan het alleen opvolgen van orders. U weet dat als u hen niet stopt, zij u stoppen. Uw doel is te overleven. Uw kapitein is zo vriendelijk geweest u de keuze te geven tussen drie tanks. De Tiger heeft een zeer sterke buitenkant, waardoor het een goede tank is om te overleven, maar hij is traag. De T-34 heeft een middelmatig schild en beweegt redelijk snel, maar heeft niet veel vuurkracht. Als u voor een Sherman kiest, heeft u een snelle tank met een goed kanon, maar bijna geen defensief schild. Als u een beginnend soldaat bent, kunt u vanwege de defensieve kwaliteiten het beste de T -34 kiezen. Bent u een getrainde soldaat, en kent u het klappen van de zweep, dan zult u de Sherman prefereren, hoewel een enkele voltreffer van de tegenstander voldoende is om u te vernietigen.

De tank besturen Gebruik de 'automatische controleur' (bijlage C) om 'Supertank' in te tikken en sla het programma vervolgens op. Laad en run het programma. Na enkele ogenblikken ziet u de mogelijkheden van de verschillende tanks aangegeven. Let op de sterke en zwakke punten van elke tank. Door op een van de drie aangegeven toetsen te drukken (1 voor Tiger, 2 voor T-34 en 3 voor Sherman), begint het spel. Uw tank verplaatst zich snel naar het front. Vijandelijke tanks bewegen van links naar rechts over het scherm. Met een joystick die is aangesloten op ingang 1, kunt u de haarlijnen van het vizier van uw kanon besturen. Zorg dat een vijandelijke tank in het vizier komt en druk op de vuurknop om een salvo te geven. Vergeet niet dat de snelheid van een kogel niet oneindig is. Het duurt even voor de kogel bij het doel is. U moet dus een klein beetje voor het doel richten. Nadat u op de vuurknop gedrukt heeft, ziet u de kogel over het scherm schieten (vanaf de linkerkant van het scherm). Als het een misser is, gebeurt er niets. Als het een treffer is, zal de vijandelijke tank exploderen. Het scherm verandert van kleur om een nieuw deel van het front en nieuwe weersomstandigheden te simuleren. U scoort 10 punten voor elke treffer. Als u mist, wordt u de schietschijf. De vijandelijke tank is gealarmeerd door uw schot, draait zich, en vuurt een kogel op u af. De vijandelijke tank mist bijna nooit. U verliest een schild-punt als u wordt geraakt. In de rechter bovenhoek ziet u aangegeven hoeveel punten u heeft gescoord, en hoeveel schild-punten u nog over heeft. Als uw schild is verdwenen, dat wil zeggen dat u geen schild-punten meer over heeft, is uw tank vernietigd. Uw vizier breekt, en de tank wordt gereduceerd tot schroot. Soms kunt u, door onafgebroken te vuren, de vijandelijke tank van het scherm jagen, zonder dat deze tijd heeft om op u te schieten. Helaas wordt zijn plaats onmiddellijk aan de linkerkant ingenomen door een nieuwe tank. U heeft dan wel een kleine tijdwinst behaald. Dit kan vooral van belang zijn als u een Tijger heeft, die zo langzaam draait.

97

Page 97: 16 Voor de 64

Extra kansen Verlies van een tank is niet het einde van de oorlog. U ontsnapt onder een regen van kogels

en keert zwaar gehavend terug op het hoofdkwartier. Voor uw betoonde moed krijgt u

promotie. Deze promotie is wel afhankelijk van uw verrichtingen als schutter. Voor minder

dan 50 punten wordt u soldaat. Voor meer dan 1000 punten wordt u generaal. Heeft u

helemaal geen punten gescoord, dan wordt u weer leerling. Wat uw nieuwe status ook is, u

mag weer terug naar het slagveld. Kies een tank, en het spel begint opnieuw; nog een kans

om generaal te worden.

Supertank

Gebruik de 'automatische controleur' om dit programma zonder fouten in te tikken. Zie

bijlage C.

LISTING programma : supertank

1 gl$=chr$ (162) +chr$ (162) : fori=lto8:

gl$=gl$+chr$(185) :next:g1$=gl$+left$(gl$

,2) :rem 117

2 g2$=chr$(184)+chr$(184) :fori=lto8:

g2$=g2$+chr$(183) :next:g2$=g2$+left$(g2$

,2) :rem 130

4 sp$=" [39xSPATIE] ":rv$=chr$(18) :ro$=

chr$(146) :rem 163

5 fori=lto39:sm$=sm$+chr$(166) :next :rem 116

10 print" [CLR] [HOME] ": restore :v=53

248:pokev+32,0:pokev+33,1:pokev+17,peek

(v+17)and247 :rem 174

15 printtab (54) "[BLUE] [RVS ON] w*e*l*

k*o*m!" :printtab (58)" [RED] [RVS ON]bij" :rem 94

17 printtab (55) " [RED] [RVS ON] superta

nk! ":print : rem 158

20 forq=lto4:printtab(14) "[GREY 2]"

chr$(170) :next :rem 114

22 printtab(14)chr$(170)rv$chr$(169)

left$ (sp$, 8) chr$ (223) :printtab (14) ; :rem 105

23 tr$=chr$ (209) : rem 89

24 printrv$chr$(169) " "tr$" "tr$"[2xSPATIE]"

tr$tr$tr$" "chr$(223)ro$gl$ :rem 253

25 printtab(13) rv$chr$ (169) "[2xSPATIE] "

tr$" "tr$" [3xSPATIE] "chr$ (205) "[3xSPATIE] "

ro$;g2$ :rem 104

26 printtab(13) rv$" [3xSPATIE] "tr$tr$t

r$" [2xSPATIE] "tr$tr$tr$" [2xSPATIE] "ro$ :rem 154

98

Page 98: 16 Voor de 64

28 print" [3xSPATIE] "rv$chr$(169)left$ (sp$,30)chr$(223)ro$ :rem 157 30 print" [2xSPATIE] "rv$chr$ (169) left$ (sp$,32)chr$(223)ro$ :rem 152 32 print"[GREEN]"left$(sm$,2) " [GREY 2]" rv$left$(sp$,34)ro$"[GREEN]"left$(sm$,3 ) :rem 162 33 tr$=chr$ (215) +rv$+chr$ (169) +chr$ ( 223)+ro$ :rem 111 34 printleft$(sm$,3)chr$(205) ;:fori= 1to10:printtr$; :next :rem 252 35 printchr$(215)chr$(206)left$(sm$, 3) :tr$=" "+rv$+" "+chr$(215)+" "+ro$

:rem 235 36 printleft$(sm$,4)chr$(205) ;:fori= 1to7:printtr$;:next:print" "chr$(206);

37 printleft$(sm$,4) :tr$=chr$(223)+r v$+chr$(32)+ro$+chr$(169)+chr$(215)

:rem 5

:rem 224 38 printleft$(sm$,5) " [GREY 2]"chr$(2 05);:fori=lto6:printtr$;:next:printleft$ (tr$,5); :rem 128 39 printchr$(206)left$(sm$,5) :rem 168 40 printleft$(sm$,6) " [GREY 2]";:fori =lto27 :printchr$ (183) ; :next :print" [GREEN] " left$(sm$,6) :rem 10 42 forq=lto2:printsm$:next :rem 229 43 gosub800 : rem 127 48 s=54272:forl=stos+24:pokel,0:next

:rem 14 50 print" [CLR] [HOME] [WHITE]" :pokev

+32, 1:pokev+33, O:printtab (120) :rem 187 52 gosub1000 :rem 168 60 print" [CLR] [HOME] [WHITE] ":print tab (90) "tank specificaties" : rem 104 62 printtab(49) "[RVS ON] [GREEN] ster k[2xSPATIE] [RVS OFF] [3xSPATIE] [RVS ON] [YELLOW]

medium [RVS OFF] [2xSPATIE] [RVS ON] [WHITE] zwak [RVS OFF] " : rem 2

64 printtab(40) "[GREEN] [RVS ON]l.tig er[RVS OFF] [2xSPATIE] pantser [3xSPATIE] [YELLOW] vuurkracht [WHITE]snelheid" :rem 126 66 printtab(40) " [YELLOW] [RVS ON]2.t-34 [RVS OFF] [4xSPATIE] [GREEN] snelheid [2xSPATIE] [YELLOW] pantser [2xSPATIE] [WHITE]vuurkrac ht" :rem 140 68 printtab(40) " [WHITE] [RVS ON]3.she rman[RVS OFF] [GREEN]vuurkracht [YELLOW] snelheid [WHITE]pantser":printtab(120)

:rem 158

99

Page 99: 16 Voor de 64

70 print: input" [HOME] [15xDOWN] [3xSPATIE] welke tank kiest u";ta :rem 95 72 ifta<lorta>3then80 :rem 56 78 print" [4xDOWN] [llxSPATIE]beman de kanonnen !":forq=lto500step.5:next:goto 85 :rem 249 80 print" [HOME] [15xDOWN] [10xSPATIE] da t mag niet! [4xSPATIE] ": gosub1300: goto70

:rem 162 85 v=53248:gosub1100 :rem 130 90 print"[CLR] [HOME] ":pokev+32, O:poke v+33,1 :rem 56 91 tr$=rv$+"[GREY 2]"+chr$(169)+chr$ (223)+ro$ :rem 101 92 printtab(7)tr$"[4xSPATIE]"tr$"[7xSPATIE]" tr$" [4xSPATIE] "tr$" [4xSPATIE] [RVS ON] [BLACK] score" :rem 173 93 print" [2xSPATIE] [RVS ON] [GREY 2] "chr$ (169) chr$ (223)ro$"[2xSPATIE] [RVS ON]"chr$ (169) "[2xSPATIE] [RVS OFF] [3xSPATIE] [RVS ON]" chr$(169) "[2xSPATIE]"; :rem 40 94 printchr$ (223) "[RVS OFF] [5xSPATIE] [RVS ON]"chr$(169) "[2xSPATIE] "chr$(223) " [RVS OFF] [2xSPATIE] [RVS ON]"chr$(169) "[2xSPATIE] " chr$(223); :rem 44 95 print" [RVS OFF] [2xSPATIE] [BLACK] "; sc :rem 50 96 print" [RVS ON] [GREY 2] "chr$ (169) "[2xSPATIE]"chr$(223)chr$(169) "[3xSPATIE] " chr$ (223)" [RVS OFF] [2xSPATIE] [RVS ON] [4xSPATIE]" chr$(223); :rem 52 97 print" [RVS OFF] [2xSPATIE] [RVS ON]" chr$ (169)" [5xSPATIE] [RVS OFF] [RVS ON] "chr$ (169) "[4xSPATIE] "chr$ (223)" [RVS OFF] [RVS ON] [BLACK]pantser"; :rem 174 98 print"[RVS ON] [GREY 2]"chr$(169)" [9xSPATIE] "chr$(223)chr$(223) "[5xSPATIE] "

:rem 115 99 printchr$(223) chr$ (169) "[6xSPATIE] " chr$(169) "[6xSPATIE] "chr$(223) "[RVS OFF] [BLACK] "; ar : rem 113 100 forq=lto17 :print" [RVS ON] [GREEN] " ;sm$:next :rem 245 101 tr$=chr$(171) :fori=lto9:tr$=tr$+ chr$(192) :next:tr$=tr$+chr$(179)

:rem 254 110 printrv$"[GREY 2] "tr$"[RIGHT]"chr$ (169)left$(sp$,13)chr$(223)"[RIGHT]"tr $ :rem 239 112 printrv$" [GREY 2] "tr$left$ (sp$, 1 7)tr$ :rem 88 114 gosub420 : rem 172

100

Page 100: 16 Voor de 64

120 cb=l:ti$="OOOOOO" :rem 34 150 pokev+21,15:poke2040,13:pokev+39 ,0:pokev,170:pokev+1,150:y=170:x=150:s h=O :rem 27 151 poke2042,193:pokev+41,11:rf=0:ut =110:pokev+42,0:poke2043,195 :rem 206 152 poke2041,14:pokev+40,0:pokev+2,x 1:pokev+3,y1 :rem 109 180 s=notpeek(56321)and15:u=sand1:d= sand2:1=sand4:r=sand8:y1=0:x1=0 :rem 165 182 pokev+23,0:pokev+29,0 :rem 189 185 ifuthenx=x-m1:ifx<110thenx=x+m1

187 ifdthenx=x+m1:ifx>180thenx=x-m1

189 ifrtheny=y+m1:ify>245theny=y-m1

191 ifltheny=y-m1:ify<90theny=y+m1

200 pokev,y:pokev+1,x 210 j=notpeek(56231)and16:ifj=16then gosub245 230 bo=bo+.5:gosub310:goto180 245 sh=sh+1:x1=x:mr=y:hh=y/2:gosub40

:rem 253

: rem 247

:rem 14

: rem 205 :rem 59

: rem 189 :rem 220

o :rem 64 247 fordd=ddtohhstep5:pokev+2,dd:poke v+3,x1:gosub330:next :rem 224 250 poke2041,15:fordd~ddtomrstep5:poke v+2,dd:pokev+3,x1:gosub330:next :rem 171 251 if(peek (v+30) and4) >Othenif(peek ( v+30)and4»Othengosub253 :rem 110 252 x1=0:dd=0:y1=0:pokev+2,x1:pokev+ 3,mr:poke2041,14:return :rem 131 253 pOke2041,192:pokev+23,2:pokev+29 ,2 :rem 184 254 pokev+3,x1-10:pokev+2,dd-12:gosub 410:gosub495 :rem 204 258 forre=lto500:next:pokev+23,0:poke v+29,0 :rem 152 260 x1=0:dd=0:y1=0:pokev+2,x1:pokev+ 3,mr:poke2041,14:return :rem 130 310 rf=rf+5:ifrf>215then350 :rem 95 315 pokev+4,rf:pokev+5,ut:return

330 rf=rf+1.8:ifrf>215thenrf=0 333 ifrf=Othen340 335 pokev+4,rf:pokev+5,ut:return

340 rf=0:ut=110:rs=int(rnd(0) *60) :ut

:rem 79 :rem 48 :rem 243

:rem 81

=ut+rs:goto330 :rem 61 350 f1=rf:f2=ut:poke2042,194:pokev+6

101

Page 101: 16 Voor de 64

, f1:pokev+7,f2:gosub400 :rem 77 355 forq=Î2~o15ûstep.4:pokev+7,q:next :pokev+29,8:pokev+23,8:pokev+6,fl-12

360 f2=150:forq=f2to230step.6:pokev+ :rem 55

7,q:next:gosub410 :rem 73 390 pokev+6,0:pokev+7,0:pokev+4,0:poke v+5,0:rf=0:pokev+23,0:pokev+29,0

:rem 235 391 poke2042,193:goto499 :rem 118 400 s=54272:forl=stos+24:pokel,0:next :pokes+5,9:pokes+6,16:pokes+24,15

405 pokes+4,129:pokes+1,34:pokes,75: :rem 70

return :rem 91 410 s=54272:forl=stos+24:pokel,0:next :pokes+5,11:pokes+6,16:pokes+24,15

415 pokes+4,129:pokes+1,54:pokes,111 :rem 112

: return :rem 133 420 s=54272:forl=stos+24:pokel,0:next :pokes+5,11:pokes+6,56:pokes+24,15

425 pokes+4,129:pokes+1,51:pokes,97: :rem 117

return :rem 96 495 sc=sc+10:cb=0:rn=int(rnd(0)*15): cb=cb+rn:goto500 :rem 95 499 ar=ar-1 : rem 103 500 v=53248 :print" [HOME]" :pokev+32, ° :pokev+33,cb :rem 248 501 tr$=rv$+" [GREY 2]"+chr$(169)+chr$ (223)+ro$ :rem 145 502 printtab (7)tr$" [4xSPATIE] "tr$" [7xSPATIE]" tr$" [4xSPATIE] "tr$" [4xSPATIE] [RVS ON] [BLACK] score" :rem 217 504 print" [2xSPATIE] [RVS ON] [GREY 2]" chr$(169) chr$ (223) ro$" [2xSPATIE] [RVS ON]" chr$ (169)" [2xSPATIE] [RVS OFF] [3xSPATIE] [RVS ON]" chr$(169) " [2xSPATIE]"; :rem 85 505 printchr$(223) "[RVS OFF] [5xSPATIE] [RVS ON]"chr$(169) " [2xSPATIE] "chr$(223) "[RVS OFF] [2xSPATIE] [RVS ON]"chr$(169)" [2xSPATIE] "chr$ (223) ; : rem 89 506 print"[RVS OFF] [2xSPATIE] [BLACK]" ;sc :rem 95 507 print" [RVS ON] [GREY 2] "chr$ (169 ) " [2xSPATIE] "chr$ (223)chr$(169) " [3xSPATIE] " chr$ (223)" [RVS OFF] [2xSPATIE] [RVS ON] [4xSPATIE]" chr$(223); :rem 97 508 print" [RVS OFF] [2xSPATIE] [RVS ON]" chr$(169) "[5xSPATIE] [RVS OFF] [RVS ON]" chr$(169) "[4xSPATIE]"chr$(223)"[RVS OFF]

102

Page 102: 16 Voor de 64

[RVS ON] [BLACK]pantser"; :rem 219 509 print" [RVS ON] [GREY 2] "chr$ (169) "[9xSPATIE] "chr$(223) chr$ (223) "[5xSPATIE] "

:rem 160 510 printchr$(223)chr$(169) "[6xSPATIE] " chr$(169) "[6xSPATIE] "chr$ (223) "[RVS OFF] [BLACK] ";ar :rem 149 515 ifar=Othen549 :rem 251 520 return :rem 119 549 11=18:bl=12:bb=15 :rem 169 550 print" [HOME] ":pokev+32,0:pokev+3 3,1 :rem 214 555 n$=chr$(206) :m$=chr$(205) : rem 9 558 forq=5to7:printtab(q) "[BLACK]"m$ spc(10)m$:next :rem 45 560 printtab (7) "[BLACK] "n$spc (11) m$spc ( 4)n$m$ :rem 37 561 printtab(6)n$spc(13)m$spc(2)n$spc( 2)m$ . :rem 186 562 printtab(5) "[BLACK] "n$spc (15) "[BLACK]" m$n$spc(4)m$ :rem 253 563 printtab(5)m$spc(21)n$spc(3)n$m$

:rem 82 564 printtab(6)m$spc(6)n$m$spc(11)n$ spc(3)n$spc(2)m$ :rem 12 565 printtab(7)m$spc(4)n$spc(2)m$spc( 10)m$spc(2)n$spc(4)m$ :rem 116 566 printtab(8)m$spc(2)n$spc(4)m$spc( 10)m$n$spc(6)m$ :rem 15 567 printtab(9)m$n$spc(6)m$spc(17)n$

:rem 98 568 printtab(18)m$spc(15)n$:forlb=lto 6:printtab(11)n$spc(14)n$:11=11-1:next

:rem 188 570 forq=lto5:printtab(bl)n$spc(bb)m $:bl=bl-1:bb=bb+2:next :rem 123 580 restore:pokev+23,0:pokev+29,0:poke v+21,0:gosub420:forq=lto500step.1:next

:rem 66 585 s=54272:forl=stos+24:pokel,0:next :gosub1200 :rem 193 588 v=53248:bo=bo/10:xx=int(bo) :sc=s c+xx:ifsc>hsthenhs=sc :rem 174 589 print" [HOME] [CLR] ":pokev+32, 0: pokev+33,1:poke53281,1 :rem 62 590 printtab(85) "[RVS ON] [BROWN]b*o* n*u*s ";xx;spc(3) "[RVS ON]x geschoten" ;sh:printtab(47) " [RVS ON]uw"; :rem 37 591 print" score";sc;spc(3) "[RVS ON] hoogste score ";hs:printtab(49) "[RVS ON] uw rang is [BLACK]" ;b$ : rem 118 592 printtab (43) "[RVS ON] [BROWN] uw t otale overlevingstijd ";ti$ : rem 151

103

Page 103: 16 Voor de 64

593 printtab(86) "[RVS ON]nog een spe l? (jin)" :rem 97 595 getc$:ifc$=""then595 :rem 109 596 sc=0:b$="":ifc$="j"then599 :rem 153 597 ifc$="n"thensys64738 :rem 164 598 c$="":goto595 :rem 164 599 sh=0:sc=0:bo=0:xx=0:pokev+32,1:poke v+33,0:goto60 :rem 172 800 s=54272:forl=stos+24:pokel,0:next :pokes+5,9:pokes+6,0:pokes+24,15

801 readhf,lf,dr:ifhf=-lthenreturn :rem 19

:rem 196 804 pokes+1,hf:pokes,lf:pokes+4,33:for t=ltodr:next:pokes+4,32:goto801 :rem 168 810 data18,209,1024,15,210,512,18,20 9,512,16,195,1024,14,24,512,11,48,512

811 data18,209,200,16,195,200,15,210 ,200,14,24,200,15,210,512,22,96,512

812 data16,195,1024,11,48,1024,15,21 0,512,14,24,200,12,143,200,11,48,200

813 data10,143,200,11,48,200,12,143, 200,11,48,512,16,195,512,14,239,512

814 data11,48,512,15,210,200,15,210, 200,14,24,200,12,143,200,11,48,200

815 data10,143,200,11,48,200,12,143, 200,11,48,512,16,195,1024,22,96,512

816 data18,209,1024,15,210,512,18,20 9,512,16,195,1024,14,24,512,11,48,512

817 data18,209,200,16,195,200,15,210 ,200,14,24,200,15,210,512,22,96,512

818 data16,195,1024,11,48,1024,15,21 0,512,14,24,200,12,143,200,11,48,200

819 data10,143,200,11,48,200,12,143, 200,11,48,512,16,195,512,14,239,512

820 data11,48,512,15,210,200,15,210, 200,14,24,200,12,143,200,11,48,200

821 data10,143,200,11,48,200,12,143,

:rem 45

:rem 178

:rem 222

:rem 185

:rem 105

:rem 186

:rem 51

:rem 184

:rem 228

:rem 191

:rem 102

200,11,48,512,11,48,1024,-1,0,0 :rem 210 900 data255,255,255,128,24,1,128,24, 1,128,24,1,128,24,1,128,24,1,128,24,1

104

:rem 35

Page 104: 16 Voor de 64

905 data128,24,1,128,36,1,128,66,1,2 55,129,255,128,66,1,128,36,1,128,24,1, 128 :rem 1 910 data24,1,128,24,1,128,24,1,128,2 4,1,128,24,1,128,24,1,255,255,255

:rem 93 915 dataO,O,O,O,O,O,O,O,O,O,O,O,O,O, 0,0,0,0,0,0,0,31,254,0,49,255,192,96,2 55 :rem 88 920 data240,196,127,252,206,127,255, 206,127,255,196,127,252,96,255,240,49, 255 :rem 35 925 data192,31,254,0,0,0,0,0,0,0,0,0 , 0, 0, 0, 0, 0, 0, ° : rem 109 926 dataO,O,O,O,O,O,O,O,O,O,O,O,O,O, 0,0,0,0,0,0,0,63,240,0,103,252,0,195,2 55 :rem 66 927 dataO,219,255,192,195,255,0,103, 252,0,63,240,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0 :rem 207 928 dataO,O,O,O,O,O,O,O :rem 113 930 dataO,0,2,34,128,4,0,64,2,146,12 8,16,0,16,10,73,32,64,0,4,17,140,96,64 , 0,4 : rem 2 935 data17,17,16,64,0,4,8,136,136,64 ,0,4,17,17,16,32,0,8,8,136,128,16,0,16 ,2,72 :rem 80 940 data128,4,0,64,0,0,0 :rem 184 945 dataO,0,0,0,0,0,0,0,0,0,0,0,0,64 ,0,0,64,0,0,64,0,0,64,0,0,126,0,0,255, 255,0 :rem 221 947 data255,0,63,255,252,127,255,254 ,255,255,255,100,68,70,37,85,84,20,68, 72 :rem 243 950 data15,255,240,0,0,0,0,0,0,0,0,0

:rem 228 955 dataO,2,0,0,2,0,0,2,0,0,2,0,0,58 ,0,0,70,0,0,186,0,0,130,0,0,254,0,1,25 5,0 :rem 128 960 data3,255,128,7,255,192,0,124,0, 15,188,224,8,186,32,15,187,224,8,130,3 2,15 :rem 53 965 data131,224,0,0,0,0,0,0,0,0,0

:rem 83 970 dataO,O,O,O,O,O,O,O,O,O,O,O,O,O, 0,0,0,0,0,60,0,0,126,0,0,255,0,0,255,0 , ° : rem 41 975 data126,0,0,60,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, °

:rem 178 1000 fora1=832to894:readq1:pokea1,q1 : next : rem 22

105

Page 105: 16 Voor de 64

1010 fora2=896to958:readq2:pokea2,q2 :next 1015 fora3=960to1022:readq3:pokea3,q

3:next 1020 fora4=12288to12350:readq4:pokea 4,q4:next 1025 fora5=12352to12414:readq5:pokea 5,q5:next 1030 fora6=12416to12478:readq6:pokea 6,q6:next 1035 fora7=12480to12542:readq7:pokea 7,q7:next 1090 return 1100 ifta=lthenar=5:ifta=lthenm1=1

1105 ifta=2thenar=3:ifta=2thenm1=2

1110 ifta=3thenar=1:ifta=3thenm1=3

1150 return 1200 ifsc=Othenb$="soldaat" 1201 ifsc>Oandsc<51thenb$="soldaat i"

1202 ifsc>52andsc<101thenb$="sergean

:rem 38

:rem 70

:rem 226

:rem 228

:rem 239

:rem 241 :rem 170

:rem 111

:rem 117

:rem 114 :rem 167 :rem 115

:rem 201

t" :rem 53 1204 ifsc>101andsc<201thenb$="luiten ant" : rem 190 1206 ifsc>201andsc<401thenb$="kapite in" :rem 100 1208 ifsc>401andsc<601thenb$="majoor"

1210 ifsc>601andsc<801thenb$="kolone 1" 1212 ifsc>801andsc<1001thenb$="* gen eraal *" 1214 ifsc>1001thenb$="** maarschalk **" 1216 return 1232 goto500 1300 fori=lto1500:next:return

106

:rem 221

:rem 38

:rem 210

:rem 130 :rem 170 :rem 150 :rem 94

Page 106: 16 Voor de 64

LICHTKRANT

Robert F. Lambiase

Berichten die over het scherm rollen kunnen worden gebruikt voor advertenties. boodschappen. geheugensteuntjes afvaar belangrijke mededelingen op school of bedrijf Met 'Lichtkrant' kunt u berichten van maximaal 3000 lettertekens maken. veranderen. opslaan. laden en weergeven.

Een bericht dat over het scherm rolt, trekt echt goed de aandacht. Alle ingredienten zijn aanwezig: beweging en de mogelijkheid om meer informatie weer te geven dan er op een beeldscherm past. U kunt natuurlijk verschillende beeldschermen na elkaar laten zien, maar de snelheid kan voor een individuele lezer te snel of te langzaam zijn. Een rollend bericht is beter aangepast aan de snelheid van de lezer en geeft continue nieuwe informatie. 'Lichtkrant' biedt u de mogelijkheid een bericht te creeren en eventueel te verbeteren. Uw Commodore laat het bericht vervolgens over het scherm lopen.

De rollende 64 De 64 kan zowel horizontaal als verticaal rollen. Voor de lichtkrant hoeft de tekst alleen horizontaal te rollen. De schermweergave van de computer is opgebouwd uit 320 lichtpunt-kolommen die zijn gegroepeerd in 40 letterteken-kolommen van elk 8 lichtpunt-kolommen breed. Het eerste letterteken begint bij de eerste lichtpunt-kolom. Dit kan worden veranderd door de drie laagstwaardige bits van adres 53270 aan te passen. Door deze bits te laten verlopen, verandert de lichtpunt-kolom (eerste tot en met achtste) waar de eerste letterteken-kolom zal beginnen. Hierdoor ontstaat het effect van een soepel over een hele letterteken-kolom glijdende letter. Door de bits telkens te verhogen, gaan de letters naar rechts, door de bits telkens te verlagen, gaan de letters naar links.

Eerst rollen, dan schuiven Laten we eens een voorbeeld bekijken. Stel dat er een enkele letter rechts op het scherm staat, en dat deze naar de rechterkant van het scherm moet worden gerold. Door de rol-bits (zie hiervoor) van zeven naar nul te laten verlopen, zal de letter verschuiven. De letter verschuift acht lichtpunt-kolommen. Om de letter nog verder te laten verschuiven, moeten de rol-bits weer op zeven ingesteld worden en moet tegelijk de letter een letterteken-positie naar links worden verschoven door het schermgeheugen aan te passen.

Machinetaal voor de snelheid Het wordt nu iets ingewikkelder. De computer kan niet tegelijkertijd de rol-bits veranderen en het schermgeheugen aanpassen. Om de maximale snelheid te verkrijgen, is het noodzakelijk om machinetaal te gebruiken. Helaas is zelfs deze moordende snelheid van de computer niet snel genoeg. Bij het verschuiven van de letters over het scherm, zou zo nu en dan geknipper van de letter ontstaan. Dit gebeurt op die momenten dat de video-chip de letter weergeeft tussen het moment dat de rol-bits worden hersteld en het moment dat de letters naar links worden geschoven. Dit probleem kan opgelost worden door het herstellen van de rol-bits en het verschuiven van de lettertekens alleen toe te staan als de video-chip niet op het scherm schrijft. Om dit te doen, wordt het raster-register gebruikt.

107

Page 107: 16 Voor de 64

Het raster-register helpt Door de waarde van het rasterregister in locatie 53266 te lezen, krijgt u informatie over de huidige rasterlijn die wordt geschreven. Het machinetaal programma dat de rol-bits herstelt en de lettertekens naar links verschuift, wordt voorafgegaan door een kleine lus die rasterlijn 50 controleert. Deze rasterlijn bevindt zich net voorbij het punt waar de lettertekens rollen. De snelheid van het machinetaalprogramma is groot genoeg om alle bewerkingen te voltooien voordat het scherm de laatste lijn heeft gedaan.

De punt op de i Er is nog een klein detail dat geregeld moet worden. Door naar links te rollen, ontstaat er een lege ruimte aan de rechterkant van het scherm. Door naar rechts te rollen, ontstaat een lege ruimte aan de linkerkant van het scherm. Dit effect kan worden opgeheven door een speciale funktie van de video-chip. Door bit 3 van locatie 53270 de waarde 0 te geven, wordt het scherm beperkt tot 38 lettertekens per regel. De spaties aan de beide kanten van het scherm zijn nu bedekt door de extra brede randen.

Aan de slag Het lichtkrant-programma biedt u de mogelijkheid om een bericht tot maximaal 3000 lettertekens te maken, het bericht te verbeteren, op te slaan, te laden en het bericht over het scherm te laten lopen. Als het laatste letterteken van het scherm afloopt, wordt het eerste letterteken opnieuw weergegeven. Het bericht wordt in opeenvolgende geheugenplaatsen vanaf locatie 50000 geplaatst. Het bericht mag opgebouwd zijn uit letters, getallen, leestekens en spaties. Het einde van het bericht wordt aangegeven door het indrukken van de spatiebalk terwijl de SHIFT-toets ingedrukt wordt gehouden. Op het scherm ziet dit er uit als een normale spatie, maar de computer ontvangt ASCII -code 160 in plaats van code 32. De schermcode (die bij POKEs gebruikt wordt) is 96 in plaats van 32.

Het programma gebruiken Gebruik de 'automatische controleur' in bijlage C om het programma foutloos in te tikken. Save het programma op cassette of diskette, laad het programma en run het. U kunt nu uw bericht invoeren. U hoeft het alleen in te tikken. Als u de letters invoert, verschijnen deze bij de pijl aan de rechterkant van het scherm. Het bericht verplaatst zich naar links. U maakt een einde aan het bericht door zowel de SHIFT-toets als de spatiebalk in te drukken. Het bericht gaat nu automatisch rollen. Als u iets in het bericht wilt veranderen, drukt u op een willekeurige toets, zodat het rollen stopt. Gebruik nu de cursortoetsen om de pijl op de gewenste plaats binnen het bericht te krijgen. De cursor-omlaag toets schuift het bericht naar links. De cursor-rechts toets verplaatst het bericht naar rechts. Hierdoor kunt u met twee vingers tegelijk werken. Een letter verandert u door het teken boven de pijl te plaatsen en een nieuwe letter in te tikken. U kunt ook over het 'einde-bericht'-teken heen tikken (een SHIFT-spatie), maar u moet dan wel een nieuwe aanduiding voor het einde van het bericht maken. U kunt lettertekens invoegen of verwijderen door ofwel de ft- ofwel de f3-toets te gebruiken. Als u klaar bent met het aanbrengen van verbeteringen, zorgt het indrukken van de f5-toets voor het opnieuw gaan rollen van het bericht.

108

Page 108: 16 Voor de 64

Opslaan en laden U kunt uw berichten zowel op cassette als op diskette bewaren en later weer inlezen. Druk op de f4-toets om een bericht op te slaan. Druk op de f6-toets om het bericht te laden. U moet een bestandsnaam opgeven, en vervolgens een T voor cassette of een D voor diskette opgeven. Het bericht wordt in het geheugen gelezen en begint over het beeld te rollen. (Als u gebruik maakt van cassettes, ziet u soms na het laden van een bericht, enkele ongewenste lettertekens tussen het einde van het bericht, en de nieuwe start van het bericht. Om deze lettertekens weg te krijgen, drukt u op een willekeurige toets om terug te gaan naar het hoofdmenu. Gebruik de cursor-omlaag toets om naar het einde van het bericht te gaan. Druk nu op de SHIFT-toets en spatiebalk. Sluit de behandeling af met het drukken op f5 om het rollen te laten beginnen. Nu zijn de ongewenste lettertekens verwijderd.) Als u een diskette gebruikt, wordt het programma als een machinetaalprogramma opgeslagen. een cassette-recorder is veel langzamer. Daarom wordt in dat laatste geval, de lijst met gegevens byte voor byte opgeslagen. Bij het inlezen van een cassette-bestand, wordt het einde bepaald doordat de computer de SHIFT-spatie tegenkomt.

Verbeteringen Dit programma kan op vele plaatsen worden aangepast en verbeterd. Het is niet zo moeilijk om twee berichten tegelijk over het scherm te laten lopen. Met enkele aanpassingen moet het mogelijk zijn om ook grote letters over hét scherm te laten lopen.

Lichtkrant Om dit programma zonder fouten in te tikken, kunt u gebruik maken van de 'automatische controleur'. Zie bijlage C.

140 dimh(8) :forj=lto7:readh(j) :next :rem 165 150 data17,29,133,135,140,139,138 :rem 137 160 g=53270:pokeg,8:poke53280,6:c$=chr$ (147) :n$=chr$ (18) :f$=chr$ (146) :gosub460

:rem 143 170 is=50000:i=is:forv=49960to49999: pokev, 32: next : rem 6 180 rem inlezen machinetaal gedeelt e. :rem 22 190 forj=49152to49193:readd:pokej,d: next :rem 240 200 data162,0,189,161,4,157,160,4,23 2,224,39,208,245,96 : rem 198 210 data162,39,189,159,4,157,160,4,2 02,208,247,96 : rem 173 220 data173,18,208,117,50,208,249,16 9,7,141,22,208,32,0,192,96 : rem 34 230 rem : rem 121 240 rem invoer boodschap : rem 224 250 geta$:ifa$=""then250 :rem 81 260 a=asc(a$) :p=a+64*((a>63)and(a<16 1) ) : rem 45

109

Page 109: 16 Voor de 64

270 ifa=140then1260 :rem 51 280 if«a<32ora>132)anda<>160)thenpoke i, 96:im=i:gosub320:goto630 :rem 123 290 pOke1223,p:pokei,p :rem 60 300 ifa=160thenim=i:gosub320:goto350

:rem 220 310 sys49152:poke1223,32:i=i+1:goto2 50 :rem 201 320 forj=i+1toi+41:pokej,32:next:return

330 rem 340 rem laat boodschap rollen 350 i=is:pokeg,7:printc$:gosub450

360 pOke1223,peek(i) :i=i+1 370 ifpeek(1184)=96theni=is 380 forj=6toOstep-1:pokeg,j:fork=Oto 7:next:next 390 sys49178 400 getb$:td=td:ifb$=""then360 410 b=asc(b$) :ifb=140then1260 420 goto650 430 rem 440 rem laat gebruiksaanwijzing zie n 450 forj=55456to55495:pokej,14:next:

:rem 251 :rem 122 :rem 252

: rem 78 :rem 224 : rem 106

:rem 119 :rem 168 : rem 249 : rem 119 :rem 106 : rem 123

:rem 34

return : rem 150 460 printc$;:gosub450 :rem 28 470 poke55535,14:poke1263,30 :rem 38 480 forj=lto8~print:next:printtab(13 ) "lichtkrant" :rem 225 490 printtab(81) "karakters worden bi j de pijl ingevoerd" :rem 166 500 printtab(40) "gebruik: ";n$;"sh-sp atie";f$;" voor einde boodschap" :rem 81 510 printtab(5)n$;"f1";f$;" voeg [SHIFT-SPATIEj een karakter tussen" :rem 236 520 printtab(5)n$;"f3";f$;" wis een karakter" :rem 47 530 printtab(5)n$;"f4";f$;" save"

:rem 64 540 printtab(5)n$;"f5";f$;" herstart"

:rem 128 550 printtab(5)n$;"f6";f$;" laden"

:rem 121 560 printtab(5)n$;"f8";f$;" stoppen"

:rem 65 570 printtab(40) "cursor ";n$;"down"; f$;" & ";n$;"right";f$;" toetsen worde n" 580 print" gebruikt voor positioneri ng tekst" 590 print" ter correctie."

110

:rem 68

:rem 134 :rem 40

Page 110: 16 Voor de 64

600 return 610 rem 620 rem boodschap correctie 630 ifa=139then870 640 ifa=136then1040 650 i=is:pokeg,8:print"[CLR]":gosub 460 660 pOke1223,peek(i) 670 geta$:ifa$=""then670 680 a=asc(a$) :p=a+64*«a>63)and(a<16 1» 690 q=0:forj=lto7:ifa=h(j)thenq=j m 65 700 next 710 onqgoto770,800,820,350,1260,870, 1040 720 if(a=134andi<im)then840 730 ifa=134then670 740 poke1223,p:pokei,p 750 ifa=160thenim=i:gosub320:goto350

760 goto780 770 ifpeek(1223)=96then670 780 i=i+1:sys49152:poke1223,peek(i): ifi>=imthenim=im+1 790 goto670 800 ifi=isthen670 810 i=i-1:sys49166:pokel184,peek(i-3 9) :goto670 820 forj=imtoistep-1:pokej+1,peek(j)

:rem 118 :rem 123 :rem 175 : rem 17 :rem 53

:rem 195 :rem 126 :rem 93

:rem 51

:rem 214

:rem 92 :rem 72 :rem 11 :rem 60

:rem 229 :rem 117 :rem 227

:rem : rem : rem

: rem

59 118

21

212

:next : rem 152 830 pokei,32:poke1223,32:im=im+1:poke im+40,32:goto670 : rem 148 840 forj=itoim-1:pokej,peek(j+1) :next

: rem 94 850 poke1223,peek(i) :pokeim,32:im=im -1:goto670 :rem 32 860 rem :rem 130 870 rem laad routine :rem 187 880 input" [CLR] file naam"; k$ : rem 238 890 input"tape (t) of disk (d)";a$ :rem 57 900 ifa$="t"then970 :rem 49 910 open15,8,15,"iO" :rem 17 920 open3,8,O,"0:"+k$+",p,r" :rem 157 930 input#15,en,em$,et,es :rem 223 940 ifen<>Othenprint;en,em$,et,es:goto 1240 :rem 152 950 poke185,O:poke1~5,40:poke196,195 :sys62631 960 close15:close3:goto650 970 open3,l,O,k$ 980 x=is-40 990 get#3, a$

111

: rem : rem : rem : rem : rem

110 108

89 99

105

Page 111: 16 Voor de 64

1000 a=asc(a$+chr$(O» :pokex,a:x=x+l

1010 ifa<>96then990 1020 close3:goto340 1030 rem 1040 rem save routine 1050 input"[CLR]file naam";k$ 1060 u=im+42:uh=int(u/256) :ul=u-256*

:rem 42 :rem 76 :rem 118 :rem 168 :rem 254 :rem 20

uh :rem 239 1070 input"tape (t) of disk (d)";a$

1080 ifa$="t"thenl160 1090 open15,8,15,"iO" 1100 open3,8,l,"O:"+k$+",p,w" 1110 input#15,en,em$,et,es 1120 ifenthenprint;en,em$,et,es:goto 1240 1130 poke193,40:poke194,195 1140 poke174,ul:poke175,uh:sys62957

1150 close15:close3:goto650 1160 open3,l,l,k$ 1170 forx=is-40toim+40 1180 print#3,chr$(peek(x»; 1190 next:print#3 1200 close3:goto340 1210 closel:input"wilt u verdergaan (j/n) ";d$ 1220 ifd$="j"then620 1230 goto1260 1240 close15:close3:input"wilt u ver dergaan (j/n)";d$ 1250 ifd$="j"then620 1260 pokeg,8:end

112

:rem 96 :rem 137 : rem 65 :rem 202 : rem 6

:rem 21 :rem 243

:rem 115 :rem 148 :rem 130 :rem 58 :rem 52 :rem 39 :rem 118

:rem 168 :rem 78 :rem 200

:rem 195 :rem 81 :rem 180

Page 112: 16 Voor de 64

SUPERBASIC 64

Martin C. Kees

Hoe zou u het vinden om de beschikking te hebben over 41 nieuwe, krachtige opdrachten als u aan het programmeren bent in BASIC? 'SuperBASIC 64' voegt opdrachten voor sprites, kleur, grafiek, geluid en geheugenmanipulatie toe en verbetert daarnaast nog een achttal al bestaande BASIC-opdrachten. Als u SuperBASIC eenmaal heeft geprobeerd, zult u zich afvragen hoe u ooit zonder gekund heeft. Het programma is een bijzonder waardevolle aanvulling op uw programmabibliotheek. Als extraatje heeft de schrijver een paar voorbeeldprogramma's, die in SuperBASIC zijn geschreven, opgenomen, waaronder 'Super BASIC sprite-redacteur'.

Door een speciale techniek, voegt 'SuperBASIC 64' opdrachten toe aan normaal BASIC. BASIC wordt automatisch gekopieerd in het bijbehorende RAM en aangepast zodat de STOP-opdracht in een wig vector (wedge) wordt veranderd (vergelijkbaar met de en (&)-wig van Apple). Het letterteken dat hiervoor werd gekozen, is een rechte linkerhaak ([). Door vier-Ietter- afkortingen achter het wig-teken te plaatsen, kunt u met SuperBASIC elke opdracht uitkiezen, die u wilt laten uitvoeren. De machinetaalroutines maken het eenvoudig om bijna alle speciale faciliteiten van de VIC-II-chip te besturen. Zowel sprites als grafiek in hoge resolutie kunnen vanuit BASIC worden bestuurd, zonder dat u POKEs of Booleaanse funkties voor het maken van grafische modi, nodig heeft. Omdat de BASIC toch naar RAM was verplaatst om de [ wig te kunnen maken, was het eenvoudig om enkele BASIC-opdrachten te verbeteren. Het is nu mogelijk variabele uitdrukkingen te gebruiken voor GOTO en GOSUB en een RESTORE naar regelnummer. Deze aanpassingen van BASIC in het RAM vertragen de werking niet, in tegenstelling tot dezelfde werking door middel van CHRGET-wig-technieken.

De vorm van SuperBASIC-opdrachten De opdrachten kunnen zowel direct als in een programma worden gebruikt. De algemene vorm is: [xxxx <exp>,<exp> ...

Hierbij is xxxx de vier-Ietterafkorting en <exp> is een getal, een variabele of een geldige BASIC-uitdrukking. De speciale grammatica voor elke opdracht vindt u in tabel 1 (SuperBASIC-opdrachten). Als u een kleur uitkiest, dient u dezelfde waarden te gebruiken die anders naar de VIC chip worden gePOKEt. Voor de spriteposities is hetzelfde coordinatenstelsel genomen als opgegeven wordt in de Commodore documentatie. De linker bovenhoek van een scherm met hoge resolutie is 0,0. De rechter benedenhoek is 319,199. Opdrachten die een bepaalde funktie aan- of uitschakelen gebruiken een 0 voor uit en een 1 voor aan. SuperBASIC is op twee manieren een verandering van normaal BASIC; er zijn nieuwe opdrachten bij gekomen en bestaande opdrachten zijn verbeterd. De verbeterde opdrachten zijn onder andere GOTO en GOSUB en varianten daarop met IF en ON. U kunt bij deze opdrachten nu een uitdrukking voor een regelnummer gebruiken. Dit verhoogt de leesbaarheid van het programma, doordat opdrachten als GOTO KNAL, waarbij KNAL=10oo, mogelijk geworden zijn. Door deze opdracht springt het programma naar regel 1000. U kunt op dezelfde wijze ook RESTORE van een variabele uitdrukking als regelnummer voorzien. Zo zou

113

Page 113: 16 Voor de 64

RESTORE KNAL ervoor zorgen dat de eerstvolgende READ-opdracht zijn gegevens haalt uit de DATA-statements die beginnen op regel 1000. De keuze van DATA-statements kan op deze wijze worden bepaald binnen het programma. Kleine bestanden kunnen binnen DAT A-statements worden opgeslagen en door middel van het regelnummer worden opgeroepen. Als u een programma aan het LISTen bent, stopt de listing tijdelijk als u de SHIFT-toets indrukt. De ASC-funktie geeft de waarde 0 als resultaat bij nulstrings. De nieuwe opdrachten kunnen in vijf groepen worden verdeeld: sprites, geluid, kleuren, VIC-geheugenkaart en grafiek. Een handige, extra opdracht is [CAT A. Deze opdracht geeft op het scherm alle afkortingen weer, die in SuperBASIC zijn gedefinieerd. (Ik gebruik de opdracht om te kijken of ik SuperBASIC al aan heb staan.)

Laden van het programma Om SuperBASIC 64 (programma 1) te kunnen intikken heeft u het MTR-programma in bijlage D absoluut nodig. Lees eerst de handleiding bij het programma goed door, en overtuig uzelf ervan dat u de werking goed begrijpt. De getallen die u intikt vormen een laag-geheugenlader voor SuperBASIC waardoor dit geladen en gerund kan worden alsof het een gewoon BASIC-programma is. De gegevens voor de SuperBASIC-Iader moeten in hetzelfde geheugengebied worden gestopt, waar normaal gesproken BASIC zit. Om te voorkomen dat de gegevens voor SuperBASIC het MTR-programma vernietigen, is een speciale tactiek vereist. Zet de computer eerst uit en weer aan. Daardoor staan alle geheugenwijzers op hun beginstand. Tik nu de volgende regel in de directe modus in (zonder regelnummer) en druk op RETURN:

POKE 44,22: POKE 642,22: POKE 5632,0: NEW Door deze directe opdracht wordt het begin van het geheugengebied voor BASIC naar boven geschoven, zodat alle gegevens voor SuperBASIC er nog onder passen en MTR niet beïnvloeden. U kunt nu het MTR-programma laden en runnen zoals u gewend bent. MTR vraagt u om een begin adres en een eindadres. Voor SuperBASIC zijn dat:

Beginadres: 2049 Eindadres: 5330 Als u klaar bent met het intikken van de gegevens voor SuperBASIC, kunt u de SAVE-opdracht van MTR-gebruiken om een kopie van de SuperBASIC-Iader op diskette of cassette te zetten. GeefMTR een unieke naam voor het SuperBASIC-programma op, want het programma is niet in staat een bestand te vervangen. Als u de gegevens niet in een keer intikt, moet u elke keer dat u met tikken begint, de bovenstaande procedure herhalen. Als u een versie van SuperBASIC op cassette of diskette heeft, moet u het geheugen eerst weer in de begintoestand brengen voordat u SuperBASIC laadt en runt. U kunt dit doen door de computer uit en weer aan te zetten of door de directe opdracht SYS 64738. Als u de SuperBASIC-Iader runt, wordt er eerst een kopie van BASIC uit het ROM in het eronder liggende RAM gemaakt, en worden een stel opdrachten verbeterd. Vervolgens wordt de machinetaal voor de overige SuperBASIC-routines in de geheugenlocaties $COOO-$CCOO gekopieerd. Het is onmogelijk om andere machinetaalroutines, die geheugenruimte gebruiken in het gebied dat begint bij $COOO, samen met SuperBASIC te gebruiken. Het DOS-wig-programma kan wel gebruikt worden. Een deel van de grafische opdrachten gebruikt de geheugenruimte $02BO-$02CO om gegevens in op te slaan. Na het runnen, wist de lader zichzelf. De SuperBASIC-opdrachten kunnen worden gebruikt totdat u RUN/STOP-RESTORE indrukt of de directe opdracht POKE 1,55 geeft. Programma's die geschreven zijn met SuperBASIC-opdrachten, kunnen op de normale wijze worden opgeslagen en ingelezen. Het

114

Page 114: 16 Voor de 64

enige verschil met normaal BASIC is het gebruik van de STOP-opdracht. Deze opdracht is in SuperBASIC niet aanwezig. U moet gebruik maken van de END-opdracht. Als de computer SuperBASIC-opdrachten moet listen, terwijl SuperBASIC niet aanwezig is in het geheugen, zal het [teken weergegeven worden als STOP. Als u een [teken tegenkomt, terwijl SuperBASIC niet in het geheugen aanwezig is, betekent dit, dat de programmaregel werd ingevoerd terwijl SuperBASIC niet in werking was. De opdracht zal netjes op het scherm komen, maar het uitvoeren van de opdracht leidt tot een syntax-error.

Sp rite-opdrachten [DSPR [MOVE [KSPR [ESPR [BSPP Deze opdrachten worden gebruikt voor het definieren van de eigenschappen van sprites en voor het besturen van de bewegingen van de sprites. [DSPR (definieer sprite) is een algemene opdracht voor het instellen van een sprite voor de VIC- U-chip. De tien argumenten in de lijst met parameters (zie tabel 1) geven de meeste mogelijkheden die voor sprite-besturing bestaan. [DSPR zet de uit de nummers 0-7 gekozen sprite aan, slaat het blokadres (bik:) op in de huidige schermwijzer-tabel, vergroot de sprite als xexp= 1 of yexp= 1, bepaalt de beginpositie voor de weergave (xpos,ypos) en stelt de sprite-kleurregisters (sprcolor) in. Multi-kleursprites worden aangegeven doordat multi=l, een-kleursprites worden aangegeven doordat multi=O. McO en Mc1 zijn opties in de lijst die multi-kleur 0 en 1 instelt. [MOVE verplaatst de gekozen sprite naar xpos,ypos. Horizontale waarden groter dan 255 worden automatisch herberekend. [KSPR en [ESPR zetten de gekozen sprite uit, respectievelijk aan. [BSPP stelt de voorrangsregeling voor de achtergrond en de sprites in. (sel=l geeft de achtergrond voorrang boven de sprites. Dat wil zeggen dat de sprites achter de achtergrond getekend worden.)

Geluidsopdrachten [SSND [PLAY Deze opdrachten gebruiken verschillende faciliteiten van de SID-chip. [SSND (stel sound=geluid in) produceert een geluid via een van de drie geluidsgeneratoren van de SIC-chip. Stem (1-3) kiest het kanaal waarover het geluid gaat klinken, AD en SR besturen de aanvallverval- en hang/loslaat-registers van het gekozen kanaal. Golf geeft de golgvorm, filters en speciale effecten van de geluidschip aan. Zowel wave, ad als sr gebruiken dezelfde waarden die in normaal BASIC in de registers moeten worden gePOKEt. Freq bestuurt de frequentie van het geluid. het is een 16-bits waarde van 0-65535. Pbreedte is de waarde van de pulsbreedte voor de puls golfvorm. U heeft deze waarde alleen nodig als golf=65. Pbreedte is een 12-bits waarde van 0-4095. [SSND stelt het volumeregister in op 15. [pLAY is een verkorte vorm van [SSND die ervan uitgaat dat de AD/SR waarden reeds eerder zijn ingesteld. De golfvorm en de stemmen worden in het eerste argument aangegeven door de formule golf*256+stem. Freq en pbreedte worden op dezelfde wijze gebruikt als in [SSND. [pLA Y kan goed gebruikt worden om een bepaalde stem uit te zetten. Zo zet bijvoorbeeld [PLA Y 1,0 het geluid van stem 1 uit.

VIC-kleuren [BKGD [BKG4 [EXTC [FCOL Deze opdrachten bepalen de kleur van de achtergrond, rand

en teksttekens. [BKGD stelt de kleur van de achtergrond in. U kunt de kleur zelf opgeven. [BKG4 stelt alle vier de achtergrond-kleurregisters (die gebruikt worden in uitgebreide kleur en multi-kleur bitkaart modi) in. [EXTC geeft de buitenste rand de gekozen kleur. [FCOL vult het kleurgeheugenblok met de gekozen kleur. Hierdoor wordt alle tekst van het huidige scherm weergegeven in de gekozen kleur. [FCOL wordt ook in de multi-kleur bitkaart modus gebruikt om de lichtpunten in te stellen voor multi-kleur.

115

Page 115: 16 Voor de 64

VIC geheugenindeling [BANK rVS IK [CB2K De VIC U-chip kijkt anders tegen het geheugen aan dan de 6510-chip. De VIC II bekijkt slechts 16K tegelijk en deelt de ROM-lijst met lettertekens telkens in een deel van deze 16K in. De nieuwe SuperBASIC-opdrachten bieden u de mogelijkheid om de normale locaties van het scherm en de lijst met lettertekens te veranderen. [BANK bepaalt welk van de vier geheugenbanken (0-3) de VIC II te zien krijgt. Normaal gesproken kijkt de chip naar bank O. [BANK wijzigt de wijzer die door BASIC gebruikt wordt om het scherm te lokaliseren. [VS IK (videoscherm IK blok) bepaalt welk blok van IK, binnen de bank van 16K, beschikbaar is voor het tekstscherm. De blokken zijn van 0 tot en met 15 genummerd. De schermwijzer van BASIC wordt ingesteld, zodat deze naar de gewenste locatie wijst. [CB2K bepaalt welk blok van de acht aanwezige blokken van elk 2K, wordt gebruikt voor de lijst met lettertekens. De blokken zijn van 0 tot en met 7 genummerd. In bank 0 en bank 2 is de ROM-lijst met lettertekens te vinden in de 2K-blokken nummer 2 en 3. [CB2K wordt ook gebruikt om te bepalen welk blok van 8K gebruikt wordt voor het bitkaart-scherm. De waarden 0-3 kiezen het laagste blok van 8K, de waarden 4-7 kiezen het hoogste blok. De hier genoemde drie opdrachten moeten in samenhang worden gebruikt om het scherm soepel te verplaatsen. Voorzichtigheid is geboden bij het uitkiezen van de locaties, want de computer zal 'hangen' als het schermgeheugen andere belangrijke geheugendelen, zoals page nul, gaat overschrijven. De banken 2 en 43 moeten zeer voorzichtig worden gebruikt. Op het gebruik van bank 3 komen we nog terug. Programma 7 laat u zien hoe het scherm en BASIC kunnen worden verplaatst naar de PET -standaardlocaties.

Grafiek en tekst [ECGR [MCGR [BMGR Deze opdrachten kiezen voor grafiek in uitgebreide kleuren,

multi-kleur of bitkaart. De waarde 0 zet de modus buiten werking. Een waarde van 1 stelt de modus in werking. Alleen mul ti-kleur en bitkaart modi kunnen worden samengevoegd om een gecombineerde modus te vormen. Als zowel de uitgebreide kleuren modus als de bitkaart modus aan staan, zal het scherm leeg blijven. Dit effect kan wel gebruikt worden om het scherm (tijdelijk) te verbergen. [MXGR [KMXG [CMXV Deze opdrachten stellen een eenvoudige onderbrekingsroutine in, die twee gemengde modi in verschillende delen van het scherm mogelijk maakt. [MXGR verandert de inhoud van een VIC-register (reg) of een deel van de inhoud (de bits OFF van het masker) als de rasterteller gelijk is aan een van de twee raster-keuzewaarden (rast! en rast2). De waarden in vall en val2 worden opgeslagen in het gekozen VIC-register. U moet zelf de juiste waarde voor het gebruikte register bepalen. Zo zal bijvoorbeeld [MXGR 33,240,152,6,252,1 ervoor zorgen dat de schermlijnen 49 tot en met 151 worden weergegeven met een witte achtergrondkleur (kleur 1), terwijl de schermlijnen 152 tot en met 250 worden weergegeven met een blauwe achtergrondkleur. Het zichtbare deel van het scherm strekt zich uit van rasterlijn 49 tot en met rasterlijn 250. (De Commodore documentatie spreekt van 51-251.) [KMXG stopt de onderbreking en laat het gekozen register in een onbekende toestand achter. Met [CMXV kunt u de waarden van waal en waa2 veranderen terwijl de gecombineerde modus in werking is. Door de waarden gelijk te maken zal een bekende toestand tot stand komen na [KMXG. Het is niet mogelijk om cassette- of diskette- invoer/uitvoer-bewerkingen te verrichten terwijl [MXGR werkt.

116

Page 116: 16 Voor de 64

U kunt de [MXGR-modus niet gebruiken in bank 3 als u opdrachten voor de hoge resolutie gebruikt. Met behulp van [MXGR kunt u een tekstvenster onderaan een scherm met hoge resolutie maken. Probleem daarbij is dat [MXGR slechts een VIC-register kan veranderen. Het is dus niet mogelijk om zowel de wijzer naar de lettertekenlijst te veranderen, als de bitkaart-keuzebit. U kunt dit oplossen door de lijst met lettertekens binnen het hoge-resolutiescherm te plaatsen en vervolgens een venster over de lijst heen te plaatsen. Met deze techniek is het eenvoudig om een tekstvenster van zes regels onderaan het scherm met hoge resolutie te maken. In bank 0, met gebruik van het bovenste 8K blok voor hoge resolutie, gebruikt u eerst [CB2K 7 om het bovenste 8K blok voor hoge resolutie en het zevende 2K lettertekenblok te kiezen. Wis vervolgens het scherm met [FBMS 0 en laadt een lijst van lettertekens naar geheugenlocatie 7*2048. [MXGR 17,223,0,32,201,0 maakt het verhaal af. [S IZE [XYSC Deze opdrachten helpen u bij het gebruik van de registers van de VIC II-chip die voor soepel rollen zorgen. [SIZE bepaalt of het tekstscherm 40 of 38 kolommen heeft door kolsel op 1 of 0 in te stellen (kolsel= 1 zorgt voor 40 kolommen). Daarnaast wordt het aantal regels ingesteld op 25 of 24 (rijsel= 1 kiest 25 regels). [XYSC verplaatst het gehele scherm maximaal zeven lichtpunten in horizontale of verticale richting. Door xpos en ypos in te stellen op een waarde tussen 0 en 7, kan het scherm een lichtpunt tegelijk verschoven worden, waardoor een soepele rol plaatsvindt. Door deze opdracht te gebruiken in samenhang met een machinetaalroutine kan een tekst over het hele scherm in horizontale of verticale richting soepel worden gerold. [DCLS [DCLS helpt bij het gebruik van geheugenbanken zonder ROM lettertekenlijsten en bij het ontwerpen van een eigen lijst van lettertekens. U kunt de hoofdletters/grafiek, hoofd- en kleine letters of beide kopieeren door de waarde 0, 1 of 2 te kiezen. Daarna volgt het adres van de eerste geheugenlocatie waar u de kopielijst wilt hebben. Deze locatie moet op een 2K grens liggen, tenzij u de volgorde van de lijst wilt veranderen. Als het adres gelijk is aan 53248, zal de lijst gekopieerd worden in RAM, onder de ROM-lijst om in bank 3 te gebruiken. [FBMS [FSCR Het huidige hoge-resolutiescherm (bepaald door de laatste [CB2K-opdracht) kan worden gevuld met een willekeurige byte-waarde door [FBMS. [FSCR werkt op vergelijkbare wijze, maar dan voor het huidige tekstscherm. Het hele scherm wordt gevuld met een bepaalde byte-waarde. Omdat het tekstscherm wordt gebruikt om de kleuren in het hoge-resolutie-scherm te bepalen, kan [FSCR worden gebruikt om de kleuren in een scherm met hoge resolutie te besturen. [PLOT [FLIP [CLPX [MCPL Deze opdrachten worden gebruikt om lichtpunten (pixels) in het scherm met hoge resolutie te tekenen. De eerste drie opdrachten tekenen op het scherm met een oplossend vermogen van 320x200 en twee kleuren. De laatste opdracht werkt met een scherm met een oplossend vermogen van 160x200 en vier kleuren. [PLOT kleur het gekozen punt in. [CLPX zet het gekozen lichtpunt uit. [FLIP verandert de toestand van het lichtpunt in het tegenovergestelde. [MCPL accepteert horizontale coordinaten van 0 tot en met 159 en kleurt een lichtpunt in de kleur die met sel is aangegeven. Sel kan de waarden 0 tot en met 3 hebben. Een waarde 0 geeft de achtergrondkleur, 1 kiest de de laagste nibbel van de tekstschermkleur, 2 kiest de hoge nibble van de tekstschermkleur en 3 kiest de kleur van het kleurgeheugen. Voordat u een van de tekenopdrachten uitvoert, moet u [CB2K gebruiken om het juiste blok van 8K te

117

Page 117: 16 Voor de 64

kiezen, en moet [BMGR 1 in werking zijn om de tekening zichtbaar te maken. Onthoudt dat de y-coordinaten in grootte toenemen naarmate u meer naar de onderkant van het scherm gaat. [DRAW [UNDR [FLLN [DRW2 [SETP

Deze opdrachten worden gebruikt om op het scherm met hoge resolutie te tekenen. [DRAW, [UNDR en [FLLN hebben parameters nodig die het begin- en eindpunt van elk lijnstuk aangeven. De lijn wordt getrokken van xl,y1 naar x2,y2. De opdrachten trekken de lijn op drie verschillende manieren. [DRAW zet de lichtpunten van de lijn aan. [UNDR zet de lichtpunten van de lijn uit. [FLLN draait de lichtpunten om, dat wil zeggen dat de punten die aan zijn, uit worden gezet en vice versa. De drie opdrachten bepalen tevens de wijze van tekenen voor de [DRW2-opdracht en slaan de laatste getekende positie op in een penpositie-register. [DRW2 is een Engels woordgrapje. Als u de twee niet als een getal ziet, maar hardop voorleest, staat de afkorting voor DRA WTO (teken naar). [DRW2 heeft alleen een eindpunt als parameters nodig. Het beginpunt van de te trekken lijn, wordt gevonden in het penpositie-register. De waarde in dit register is daar geplaatst door de laatste [DRAW-, [FLLN-, [UNDR- of [SETP-opdracht. [DRW2 tekent, gumt of draait de punten om, naar gelang de laatste tekenwijze die is gebruikt. [SETP slaat een waarde voor xl en yl op in het penpositie-register. [HRCS [CHAR [CHRX [CODE Met deze opdrachten kunt u eenvoudig teksten op een hoge-resolutiescherm plaatsen. [HRCS slaat het adres van de te gebruiken lettertekenlijst op. Deze hoeft niet op een 2K grens te beginnen, en het hoeft zelfs niet dezelfde lijst te zijn als de lijst die wordt gebruikt voor het tekstscherm. Het opgegeven adres is het adres van de eerste byte van de lijst. De waarde 53248 kiest de lijst uit ROM (hoofdletters/grafiek). [CHAR en [CHRX zetten een 8x8 letterteken op een opgegeven positie op het huidige hoge-resolutie scherm. Welk letterteken wordt geplaatst, is afhankelijk van de waarde van tek. De mogelijke waarden hiervoor zijn gelijk aan de scherm-POKE-waarden. Bijvoorbeeld: [CHAR 1,100,100 zet een A op positie 100,100. Dat wil zeggen dat de linker bovenhoek van het 8x8 rooster van het letterteken op positie 100,100 komt te liggen. Met [CHAR wordt het letterteken absoluut (ongeacht de ondergrond) op het scherm geplaatst. [CHRX gebruikt de exclusief OR funktie om de lichtpunten van het letterteken om te draaien. Met [CHRX kunt u dus een eerder getekend letterteken weer verwijderen, zonder de achtergrond te beschadigen. [CODE helpt u bij het vertalen in de scherm-POKE-waarden die door [CHAR en [CHRX worden gebruikt. Het argument voor [CODE moet de naam van een gedefinieerde string variabele zijn. De ASCII-waarden die in de string zijn opgeslagen, worden vertaald in scherm-POKE-waarden. U kunt binnen de string de RVS ON en RVS OFF (inverse aanli.Iit) tekens gebruiken om de bovenste of laagste 128 tekens uit de lijst te kiezen. Alle andere stuurtekens zullen tot onvoorspelbare resulaten leiden. Nadat de string door middel van [CODE is omgezet, kunt u de ASC-funktie en de MID$-funktie gebruiken om de waarden af te lezen. De ASC-funktie geeft juiste resultaten voor teken 0 van de lijst. Wees voorzichtig met het gebruiken van strings die niet gemaakt zijn voor hoog-geheugen omdat [CODE de stringdata in het BASIC-tekstgebied zal veranderen. [HRAM [LOOK [STUF Deze opdrachten gebruiken [BANK 3 van BASIC. Als bank 3 is uitgekozen is, gebruikt de VIC II-chip het RAM-gebied van $COOO tot en met $FFFF en wordt het ROM op dezelfde adressen, inclusief de ROM-Iettertekenlijst, genegeerd. SuperBASIC staat toe dat er een tekstscherm ([VSIK 3 geplaatst op $CCOO) in bank 3 wordt geplaatst. Het RAM-gebied van $DOOO tot en met $FFFF kan worden gebruikt voor lettertekenlijsten, sprites en een scherm met hoge resolutie.

118

Page 118: 16 Voor de 64

Het grootste probleem dat de gebruiker van bank 3 tegen zal komen, is het wisselen dat nodig is om naar deze RAM-locaties te kunnen schrijven en lezen. Alle tekenopdrachten moeten uit RAM lezen en er vervolgens naar schrijven. Deze opdrachten kunnen vooraf worden gegaan door [HRAM om dit in bank 3 te laten plaatsvinden. Ingesloten banken zijn niet toegestaan na [HRAM en de gekozen afkorting. Zo kan bijvoorbeeld [HRAMDRAW 1,0,100,100 worden gebruikt om een lijn op het hoge-resolutie-scherm te tekenen op $EOOO onder de Kernal ROMs. Om deze manier kan [HRAM in bank 3 gebruikt worden met [PLOT, [FLIP, [CLPX, [MCPL, [DRAW, [UNDR, [FLLN, [DRW2, [CHAR en [CHRX. Gebruik van de eerste 3K van bank 3 leidt tot het vastlopen van SuperBASIC. Zorg er dus altijd voor dat het tekstscherm is verplaatst met [VS1K 3. Nadat deze verplaatsing naar bank 3 is gebeurd, kan het IK blok bij $0400 weer worden gebruikt voor opslag van BASIC-programma's. [LOOK en [STUF zijn equivalenten voor PEEK en POKE, die gebruikt kunnen worden met [HRAM om RAM te bekijken en te veranderen. [LOOK verschilt in zoverre van PEEK, dat een gedefinieerde variabelenaam wordt gebruikt in een parameterlijst om de gelezen waarde uit het geheugen in op te slaan. [STUF werkt vergelijkbaar met POKE en is vooral handig om

gegevens op te slaan in blok $DOOO van het RAM. (Bijvoorbeeld: [HRAMSTUF 53248,255 schrijft naar RAM onder de VIC-chip.)

Gebruik van de opdrachten Fouten in het gebruik van de SuperBASIC-opdrachten leiden tot foutmeldingen. Een moeilijk te ontdekken fout is het vormen van een BASIC-woord door het samengaan van een afkorting in SuperBASIC en de parameter er achter. [KSPR INT(X) ziet er uit als een geldige opdracht. BASIC leest in deze opdracht echter het woord PRINT ([KSpr int(X» en zal dit woord omzetten in een interne code. Grammaticale fouten zijn vooral vervelend als ze voorkomen als u in de hoge-resolutie werkt. Het bericht zal te voorschijn komen als een stel gekleurde blokjes op het scherm. U moet dan blind tikken om weer terug te keren naar het normale tekstscherm. Het is handig om een regel in uw programma's op te nemen, die het tekstscherm oproept. U hoeft dan alleen (blind) te tikken: GOTO xxx. RUN/STOP-RESTORE zal SuperBASIC vernietigen. Meestal zal een POKE 1,54 voldoende zijn om SuperBASIC weer terug te halen. U moet extra voorzichtig zijn als u schermlocaties en banken heeft verplaatst. RUN/STOP-RESTORE herstelt de standaardwaarde voor de videokaart niet, dus het is mogelijk dat u een nul-pagina of ander belangrijk RAM uitwist.

Creaties met SuperBASIC Met SuperBASIC is het eenvoudiger dan u ooit voor mogelijk hield om complexe programma's te schrijven. De programma's die aan het eind van dit hoofdstuk staan, demonstreren de vele mogelijkheden van SuperBASIC. Het zijn eenvoudige BASIC-programma's die tonen hoe u SuperBASIC kunt gebruiken om snel indrukwekkende grafische afbeeldingen, sprites die bestuurd worden met een joystick, of bewegende sprites te maken. Vergeet niet dat de programma's alleen werken als SuperBASIC eerst is geladen en gerund. Als u de programma's intikt, zult u verschillende vreemde opdrachten als [DLCS of [FCOL tegenkomen. Hindert niet; de opdrachten zijn wel goed. Dit is gewoon de manier waarop SuperBASIC de opdrachten noteert. Elke keer als u het [ teken ziet, drukt u gewoon de SHIFT en de dubbele-punt tegelijk in. Hierdoor verschijnt de vierkante haak op het scherm. Vervolgens tikt u de rest van de opdracht (bijvoorbeeld DLCS) als een normale opdracht in. De meeste van de programma's zullen weinig uitleg hebben. De computer stelt u verschillende vragen tijdens het runnen van het programma. De vragen zijn duidelijk genoeg.

119

Page 119: 16 Voor de 64

Alleen het programma 'Tik-64' heeft wat extra uitleg nodig. Vergeet niet dat al deze programma's SuperBASIC nodig hebben. Als u nog geen kopie van SuperBASIC heeft, moet u eerst programma 1 intikken en opslaan.

Tik 64 Door SuperBASIC en Tik 64 te gebruiken, kunt u uw 64 veranderen in een computer met 64 kolommen. U hoeft niets te veranderen aan uw 'hardware'. Het programma vormt een nieuwe lijst met lettertekens die kleiner zijn dan de gewone lettertekens, maar wel goed leesbaar zijn. De leesbaarheid wordt nog meer verbeterd als u de achtergrondkleur laat afsteken bij de letters. Het programma bestaat uit twee delen. Tik 64 (programma 8) is geschreven in SuperBASIC en laadt de lettertekenlijst en stelt deze in werking. Programma 9, 64LIJST, vormt de nieuwe lijst met lettertekens die wordt gebruikt op uw 64-kolomsscherm. Tik eerst programma 8 in. Omdat het in SuperBASIC is geschreven, hoeft u geen enkel probleem met het programma te hebben (als u tenminste eerst dit hoofdstuk gelezen heeft). In de listing zult u verschillende SuperBASIC-opdrachten tegenkomen die altijd met het vierkante haakje ([) beginnen. Telkens als u dit teken tegenkomt, drukt u de SHIFT-toets tegelijk met de dubbele-punt-toets in; u ziet nu het haakje op het scherm. De rest van de opdracht kan nu normaal ingetikt worden. Nadat u het programma geSAVEd heeft, kunt u beginnen met het invoeren van 64LIJST. Het programma is helemaal in machinetaal, dus heeft het MTR-programma uit bijlage D nodig. Het begin- en eindadres zijn: Beginadres: 32768 Eindadres: 34819 Voordat u MTR laadt en begint met het intikken van 64LIJST, moet u eerst de volgende regel in de directe modus (zonder regelnummer) invoeren. Door de regel wordt BASIC verplaatst, zodat BASIC niet in de war komt met 64LIJST. Als u 64LIJST in meer dan een keer intikt, moet u elke keer voordat u met tikken begint, deze regel opnieuw invoeren. POKE 56,128: CLR Voer 64UlST op dezelfde wijze in als elk ander programma dat met MTR wordt ingevoerd. Als u klaar bent, slaat u het met SAVE op. Gebruik 64SET als bestandsnaam (SET =LIJST). Gebruik geen andere bestandsnaam (geen spatie tussen 64 en SET, SET in hoofdletters). Als u een andere naam gebruikt, kan programma 8 het bestand niet vinden en laden. Programma 8 en 9 moeten op dezelfde diskette staan. Als beide programma's op dezelfde diskette staan, tikt u LOAD "TYPE64",8 en tikt u, na het laden, RUN. Het programma zal de nieuwe lijst met lettertekens automatisch laden. U kunt beginnen met het tikken op uw 64-kolornsscherm.

Tabel! SuperBASIC-opdrachten

Verbeterde BASIC-opdrachten RESTORE <exp> GOTO<exp> IF <exp> GOTO <exp> IF <exp> GOSUB <exp> ON <exp> GOTO <expb,<exp2>, .. ON <exp> GOSUB <expb,<exp2>, .. LIST (SHIFT-toest stopt listing) ASC(str$) geeft 0 voor nulstring

120

Page 120: 16 Voor de 64

Nieuwe SuperBASIC-opdrachten

Sprite-opdrachten [DSPR spr, bIk, xe xp, yexp, xpos, ypos, multi, sprkle, McO, Mcl [MOVE spr, xpos, ypos [KSPR spr [ESPR spr [BSPP spr,sel Geluid-opdrachten [SSND stem, ad, sr, golf, freq, pbreed [PLAY 256*golf+stem, freq, pbreed VIC kleuren [BKGD kIe [BKG4 kleO, kleI, kle2, kle3 [EXTCkle [FCOL kIe VIC geheugenindeling [BANK sel [VSIK sel [CB2K sel

Grafiek en tekst [ECGR sel [MCGR sel [BMGR sel [MXGR reg, mask, rasU, waal, rast2, waa2 [KMXG [CMXV vall, val2 [SIZE kolsel, rijsel [XYSC xpos, ypos [DLCS stel, adres [FBMS byte [FSCR byte [PLOT x, y [FLIP x, y [CLPXx, Y [LOOK adres, variabele

Gebruikte afkortingen: <exp> = expressie of uitdrukking pos = positie sprkle = spritekleur xexp = x-uitdrukking yexp = y-uitdrukking xpos = x-positie ypos = y-positie sel = selectie of keuze pbreed = puls breedte

121

[STUF adres, byte [HRAM <SuperBASIC afkorting>

<parameterlijst> [MCPL x, y, sel [DRAW xl, yl, x2, y2 [UNDR xl, yl, x2, y2 [FLIN xl, yl, x2, y2 [DRW2x2, y2 [SETP xl, yl [BRCS adres [CHAR tek, x, y [CHRX tek, x, y [CODE str$

ad = aanval/verval sr = hang/verval kIe = kleur reg = register rast = raster mask = masker waa= waarde kolsel = kolomkeuze rijsel = rijkeuze

Page 121: 16 Voor de 64

ste = instelling tek = letterteken str$ = string

Programma 1. SuperBASIC 64

2049 :011,008,000,000,158,050,228 2055 :048,056,048,000,000,000,159 2061 :000,000,000,000,000,000,013 2067 :000,000,000,000,000,000,019 2073 :000,000,000,000,000,000,025 2079 :000,169,039,133,001,169,030 2085 :000,133,020,133,078,169,058 2091 :009,133,021,169,192,133,188 2097 :079,162,012,160,000,177,127 2103 :020,145,078,200,208,249,187 2109 :230,021,230,079,202,208,007 2115 :242,160,008,169,104,032,014 2121 :030,171,169,013,141,119,204 2127 :002,141,120,002,169,002,003 2133 :133,198,169,033,141,001,248 2139 :008,169,020,141,002,008,183 2145 :076,120,008,000,000,000,045 2151 :000,031,147,017,017,048,107 2157 :017,157,082,085,078,019,035 2163 :000,000,000,000,000,169,028 2169 :000,133,020,169,160,133,224 2175 :021,162,032,160,000,177,167 2181 :020,145,020,136,208,249,143 2187 :230,021,202,208,244,162,182 2193 :000,160,003,185,224,160,109 2199 :157,224,160,232,200,224,068 2205 :190,208,244,169,003,141,088 2211 :161,168,169,192,141,162,132 2217 :168,169,074,141,210,166,073 2223 :169,193,141,211,166,141,172 2229 :037,160,169,084,141,036,040 2235 :160,169,219,141,223,160,235 2241 :169,255,141,044,160,169,107 2247 :194,141,045,160,169,038,178 2253 :133,001,169,005,141,143,029 2259 :183,169,076,141,043,169,224 2265 :141,087,169,169,193,141,093 2271 :045,169,141,089,169,169,237 2277 :200,141,088,169,169,227,199 2283 :141,044,169,096,000,000,173 2289 :000,000,000,000,000,000,241 2295 :000,000,000,000,000,000,247 2301 :000,000,000,032,115,000,144

122

Page 122: 16 Voor de 64

2307 :032,158,173,032,247,183,060 2313 :096,032,139,192,032,000,244 2319 :192,165,020,166,002,157,205 2325 :248,007,032,000,192,165,153 2331 :020,162,029,032,162,192,112 2337 :032,000,192,165,020,162,092 2343 :023,032,162,192,032,097,065 2349 :192,032,000,192,165,020,134 2355 :072,162,028,032,162,192,187 2361 :032,000,192,165,020,166,120 2367 :002,157,039,208,104,240,045 2373 :117,032,000,192,165,020,083 2379 :141,037,208,032,000,192,173 2385 :165,020,141,038,208,169,054 2391 :001,162,021,032,162,192,145 2397 :096,032,139,192,032,000,072 2403 :192,165,021,072,165,020,222 2409 :072,032,000,192,165,002,056 2415 :010,170,232,165,020,157,097 2421 :000,208,202,104,157,000,020 2427 :208,104,162,016,032,162,039 2433 :192,169,000,141,030,208,101 2439 :141,031,208,096,032,000,131 2445 :192,165,020,041,007,133,187 2451 :002,170,169,001,224,000,201 2457 :240,004,010,202,208,252,045 2463 :133,078,096,164,078,201,141 2469 :000,240,006,152,029,000,080 2475 :208,208,006,152,073,255,049 2481 :061,000,208,157,000,208,043 2487 :096,000,007,014,032,019,095 2493 :199,240,150,032,000,192,234 2499 :165,020,041,003,170,189,015 2505 :183,192,133,078,169,212,144 2511 :133,079,032,000,192,165,040 2517 :020,160,005,145,078,032,141 2523 :000,192,165,020,160,006,250 2529 :145,078,032,028,193,165,098 2535 :020,133,002,160,004,145,183 2541 :078,032,037,193,169,015,249 2547 :141,024,212,096,032,000,236 2553 :192,165,020,041,003,170,072 2559 :189,183,192,133,078,169,175 2565 :212,133,079,165,021,133,236 2571 :002,169,000,160,004,145,235 2577 :078,032,037,193,165,002,012 2583 :160,004,145,078,096,169,163 2589 :000,160,004,145,078,076,236 2595 :000,192,032,000,192,165,104 2601 :021,160,001,145,078,165,099 2607 :020,136,145,078,165,002,081

123

Page 123: 16 Voor de 64

2613 :201,065,208,016,032,000,063 2619 :192,165,021,041,015,160,141 2625 :003,145,078,165,020,136,100 2631 :145,078,096,173,141,002,194 2637 :208,251,076,044,168,076,132 2643 :029,168,240,251,032,003,038 2649 :192,032,019,166,056,165,207 2655 :095,233,001,164,096,176,092 2661 :001,136,133,065,132,066,122 2667 :096,032,000,192,160,000,075 2673 :177,020,133,002,032,115,080 2679 :000,032,040,175,164,002,020 2685 :169,000,032,145,179,166,048 2691 :071,164,072,032,215,187,104 2697 :096,032,000,192,165,020,130 2703 :133,078,165,021,133,079,240 2709 :032,000,192,165,020,160,206 2715 :000,145,078,096,173,014,149 2721 :220,041,254,141,014,220,027 2727 :165,001,041,253,133,001,249 2733 :169,193,072,169,184,072,008 2739 :032,115,000,076,000,195,085 2745 :165,001,009,002,133,001,240 2751 :173,014,220,009,001,141,237 2757 :014,220,096,165,101,133,158 2763 :254,104,133,002,198,254,124 2769 :208,005,165,002,C76,239,136 2775 :167,032,000,192,032,121,247 2781 :000,201,044,240,237,096,015 2787 :032,121,000,201,137,208,158 2793 :003,076,055,169,201,141,110 2799 :240,249,076,050,169,000,255 2805 :000,000,000,000,000,000,245 2811 :000,000,000,000,000,077,072 2817 :079,086,069,093,192,068,076 2823 :083,080,082,101,196,083,120 2829 :083,078,068,191,192,080,193 2835 :076,065,089,246,192,066,241 2841 :075,071,068,056,195,069,047 2847 :088,084,067,065,195,075,093 2853 :083,080,082,074,195,069,108 2859 :083,080,082,084,195,066,121 2865 :083,080,080,092,195,083,150 2871 :084,085,070,137,193,069,181 2877 :067,071,082,125,195,077,166 2883 :067,071,082,150,195,066,186 2889 :077,071,082,175,195,083,244 2895 :073,090,069,187,195,088,013 2901 :089,083,067,211,195,067,029 2907 :065,084,065,250,195,066,048 2913 :065,078,075,053,196,086,138 2919 :083,049,075,113,196,067,174 2925 :066,050,075,151,196,068,203

124

Page 124: 16 Voor de 64

2931 :076,067,083,172,196,077,018 2937 :088,071,082,065,197,075,187 2943 :077,088,071,180,197,067,039 2949 :077,088,086,200,197,070,083 2955 :067,079,076,217,197,080,087 2961 :076,079,084,130,198,070,014 2967 :076,073,080,122,198,067,255 2973 :076,080,088,138,198,077,046 2979 :067,080,076,148,198,070,034 2985 :083,067,082,197,198,070,098 2991 :066,077,083,232,198,068,131 2997 :082,065,087,097,199,072,015 3003 :082,067,083,060,201,067,235 3009 :072,065,082,134,202,067,047 3015 :072,082,088,142,202,067,084 3021 :079,068,069,150,202,076,081 3027 :079,079,075,107,193,066,042 3033 :075,071,052,105,195,072,019 3039 :082,065,077,158,193,255,029 3045 :255,255,255,255,255,255,223 3051 :255,255,255,255,255,255,229 3057 :255,255,255,255,255,255,235 3063 :255,255,255,255,255,255,241 3069 :255,197,200,162,000,134,177 3075 :002,160,000,177,122,221,173 3081 :000,194,208,026,232,200,101 3087 :192,004,208,243,189,001,084 3093 :194,072,189,000,194,072,230 3099 :165,122,024,105,003,133,067 3105 :122,144,002,230,123,096,238 3111 :165,002,024,105,006,133,218 3117 :002,170,189,000,194,201,033 3123 :255,208,206,076,008,175,211 3129 :032,000,192,165,020,141,095 3135 :033,208,096,032,000,192,112 3141 :165,020,141,032,208,096,219 3147 :032,139,192,169,000,162,001 3153 :021,076,162,192,032,139,191 3159 :192,162,021,076,162,192,124 3165 :032,139,192,032,000,192,168 3171 :165,020,162,027,076,162,199 3177 :192,162,000,134,002,032,115 3183 :000,192,165,020,16~,002,144 3189 :157,033,208,232,224,004,207 3195 :208,239,096,032,000,192,122 3201 :165,020,162,017,160,064,205 3207 :032,164,192,165,020,240,180 3213 :239,169,000,162,022,160,125 3219 :016,076,164,192,032,000,115 3225 :192,165,020,162,022,160,106 3231 :016,032,164,192,165,020,236 3237 :240,214,169,000,162,017,199 3243 :160,064,076,164,192,032,091

125

Page 125: 16 Voor de 64

3249 :000,192,165,020,162,017,221 3255 :160,032,076,164,192,032,071 3261 :000,192,165,020,162,022,238 3267 :160,008,032,164,192,P32,015 3273 :000,192,165,020,162,017,245 3279 :160,008,076,164,192,032,071 3285 :000,192,165,020,041,007,126 3291 :133,020,173,022,208,041,048 3297 :248,005,020,141,022,208,101 3303 :032,000,192,165,020,041,169 3309 :007,133,020,173,017,208,027 3315 :041,248,005,020,141,017,203 3321 :208,096,169,032,141,000,127 3327 :002,162,000,142,005,002,056 3333 :134,002,173,141,002,208,153 3339 :251,160,000,189,000,194,037 3345 :153,001,002,232,200,192,029 3351 :004,208,244,169,000,160,040 3357 :002,032,030,171,165,002,175 3363 :024,105,006,133,002,170,219 3369 :189,000,194,201,255,208,064 3375 :215,032,115,000,208,251,100 3381 :096,173,002,221,009,003,045 3387 :141,002,221,032,000,192,135 3393 :165,020,041,003,072,073,183 3399 :003,133,020,173,000,221,109 3405 :041,252,005,020,141,000,024 3411 :221,104,024,106,106,106,238 3417 :133,020,173,136,002,041,082 3423 :063,005,020,141,136,002,206 3429 :096,173,136,002,024,105,125 3435 :003,141,022,192,076,010,039 3441 :192,032,000,192,165,020,202 3447 :041,063,010,010,133,020,140 3453 :173,136,002,041,192,005,162 3459 :020,141,136,002,165,020,103 3465 :010,010,133,020,173,024,251 3471 :208,041,015,005,020,141,061 3477 :024,208,096,173,024,208,114 3483 :041,241,133,002,032,000,092 3489 :192,165,020,041,007,010,084 3495 :005,002,141,024,208,096,131 3501 :173,014,220,041,254,141,248 3507 :014,220,165,001,041,251,103 3513 :133,001,032,000,192,165,196 3519 :020,041,003,162,008,201,114 3525 :002,208,002,162,016,160,235 3531 :208,201,001,208,002,160,215 3537 :216,132,079,160,000,132,160 3543 :078,134,002,032,000,192,141 3549 :166,002,160,000,177,078,036 3555 :145,020,200,208,249,230,255 3561 :021,230,079,202,208,242,191

126

Page 126: 16 Voor de 64

3567 :165,001,009,004,133,001,040 3573 :173,014,220,009,001,141,035 3579 :014,220,096,000,000,154,223 3585 :000,006,252,000,006,000,009 3591 :033,240,044,025,208,048,093 3597 :003,076,049,234,173,006,042 3603 :197,073,003,141,006,197,124 3609 :170,172,007,197,185,000,244 3615 :208,045,008,197,029,002,008 3621 :197,153,000,208,173,017,017 3627 :208,041,127,029,001,197,134 3633 :141,017,208,189,000,197,033 3639 :141,018,208,169,001,141,221 3645 :025,208,076,129,234,120,085 3651 :169,240,141,026,208,032,115 3657 :000,192,165,020,141,007,086 3663 :197,032,000,192,165,020,173 3669 :141,008,197,032,000,192,143 3675 :165,020,141,003,197,165,014 3681 :021,041,001,240,002,169,059 3687 :128,141,004,197,032,000,093 3693 :192,165,020,141,002,197,058 3699 :032,000,192,165,020,141,153 3705 :000,197,165,021,041,001,034 3711 :240,002,169,128,141,001,040 3717 :197,032,000,192,165,020,227 3723 :141,005,197,173,017,208,112 3729 :041,127,013,004,197,141,156 3735 :017,208,173,003,197,141,122 3741 :018,208,169,003,141,006,190 3747 :197,169,241,141,026,208,121 3753 :169,009,141,020,003,169,168 3759 :197,141,021,003,088,096,209 3765 :120,169,049,141,020,003,171 3771 :169,234,141,021,003,169,156 3777 :240,141,026,208,088,076,204 3783 :115,000,032,000,192,165,191 3789 :020,141,002,197,032,000,085 3795 :192,165,020,141,005,197,163 3801 :096,032,000,192,165,020,210 3807 :041,015,162,000,157,000,086 3813 :216,157,000,217,157,000,208 3819 :218,157,000,219,232,208,245 3825 :241,141,134,002,096,032,119 3831 :000,192,165,020,041,007,160 3837 :133,002,165,020,041,248,094 3843 :133,251,165,021,133,252,190 3849 :032,000,192,165,020,133,039 3855 :078,041,248,133,020,133,156 3861 :253,169,000,133,254,024,086 3867 :006,253,038,254,006,253,069 3873 :038,254,165,020,101,253,096 3879 :133,253,144,002,230,254,031

127

Page 127: 16 Voor de 64

3B85 :024,006,253,038,254,006,114 3891 :253,038,254,006,253,038,125 3897 :254,165,078,041,007,005,095 3903 :253,133,253,024,165,251,118 3909 :101,253,133,251,165,252,200 3915 :101,254,133,252,173,136,100 3921 :002,041,192,005,252,133,194 3927 :252,173,024,208,041,008,025 3933 :010,010,005,252,133,252,243 3939 :166,002,189,107,198,160,153 3945 :000,096,128,064,032,016,185 3951 :008,004,002,001,192,048,110 3957 :012,003,000,085,170,255,130 3963 :032,246,197,081,251,145,051 3969 :251,096,032,246,197,017,200 3975 :251,145,251,096,032,246,132 3981 :197,073,255,049,251,145,087 3987 :251,096,032,000,192,165,115 3993 :020,041,003,024,105,008,098 3999 :133,002,006,020,038,021,123 4005 :032,255,197,133,002,032,048 4011 :000,192,165,020,041,003,080 4017 :170,189,119,198,037,002,124 4023 :133,020,165,002,073,255,063 4029 :160,000,049,251,005,020,162 4035 :145,251,096,032,000,192,143 4041 :173,136,002,133,252,169,042 4047 :000,133,251,168,162,003,156 4053 :165,020,145,251,200,208,178 4059 :251,230,252,202,208,246,072 4065 :145,251,200,192,232,208,173 4071 :249,096,032,000,192,173,205 4077 :136,002,041,192,133,252,225 4083 :173,024,208,041,008,010,195 4089 :010,005,252,133,252,169,046 4095 :000,133,251,162,032,160,225 4101 :000,165,020,145,251,200,018 4107 :208,251,230,252,202,208,082 4113 :246,096,032,121,000,208,208 4119 :001,096,104,104,076,070,218 4125 :192,169,000,141,176,002,197 4131 :141,178,002,141,179,002,166 4137 :173,167,002,013,168,002,054 4143 :208,002,056,096,162,024,083 4149 :046,176,002,046,177,002,246 4155 :046,178,002,046,179,002,000 4161 :056,173,178,002,237,167,110 4167 :002,168,173,179,002,237,064 4173 :168,002,144,006,140,178,203 4179 :002,141,179,002,202,208,049 4185 :219,046,176,002,046,177,243 4191 :002,024,096,032,000,192,185 4197 :165,020,141,193,002,165,019

128

Page 128: 16 Voor de 64

4~Uj :021,141,194,002,032,000,241 4209 :192,165,020,141,197,002,062 4215 :032,000,192,165,020,141,157 4221 :195,002,165,021,141,196,077 4227 :002,032,000,192,165,020,030 4233 :141,198,002,169,000,141,020 4239 :202,002,056,173,198,002,008 4245 :237,197,002,141,199,002,159 4251 :176,014,169,255,141,202,088 4257 :002,077,199,002,141,199,013 4263 :002,238,199,002,169,000,009 4269 :141,203,002,056,173,195,175 4275 :002,237,193,002,141,200,186 4281 :002,173,196,002,237,194,221 4287 :002,141,201,002,176,027,228 4293 :169,255,141,203,002,077,020 4299 :200,002,141,200,002,169,149 4305 :255,077,201,002,141,201,062 4311 :002,238,200,002,208,003,100 4317 :238,201,002,169,000,141,204 4323 :204,002,173,199,002,205,244 4329 :200,002,169,000,237,201,018 4335 :002,176,076,173,199,002,099 4341 :208,005,141,205,002,240,022 4347 :105,141,177,002,173,200,025 4353 :002,141,167,002,173,201,175 4359 :002,141,168,002,169,255,232 4365 :141,205,002,032,030,199,110 4371 :144,003,076,058,201,173,162 4377 :176,002,013,177,002,208,091 4383 :020,169,255,141,176,002,026 4389 :141,177,002,169,000,141,155 4395 :208,002,169,025,141,209,029 4401 :002,208,049,169,000,141,106 4407 :208,002,141,209,002,240,089 4413 :039,169,255,141,204,002,103 4419 :173,200,002,024,109,201,008 4425 :002,240,171,173,199,002,092 4431 :141,167,002,169,000,141,187

.4437 :168,002,173,200,002,141,003 4443 :177,002,169,255,141,205,016 4449 :002,076,016,200,238,200,061 4455 :002,238,199,002,173,193,142 4461 :002,041,007,133,002,173,211 4467 :193,002,041,248,133,251,215 4473 :173,194,002,133,252,173,024 4479 :197,002,032,014,198,017,075 4485 :251,145,251,173,204,002,135 4491 :208,095,173,203,002,240,036 4497 :016,056,173,193,002,233,050 4503 :001,141,193,002,176,013,165 4509 :206,194,002,144,008,238,181 4515 :193,002,208,003,238,194,233

129

Page 129: 16 Voor de 64

4521 :002,056,173,200,002,233,067 4527 :001,141,200,002,176,003,186 4533 :206,201,002,024,173,200,219 4539 :002,109,201,002,240,120,093 4545 :173,205,002,240,165,024,234 4551 :173,176,002,109,208,002,101 4557 :141,208,002,173,177,002,140 4563 :109,209,002,141,209,002,115 4569 :144,144,173,202,002,240,098 4575 :006,206,197,002,076,107,049 4581 :200,238,197,002,076,107,025 4587 :200,173,202,002,240,006,034 4593 :206,197,002,076,250,200,148 4599 :238,197,002,206,199,002,067 4605 :240,058,173,205,002,240,147 4611 :040,024,173,176,002,109,015 4617 :208,002,141,208,002,173,231 4623 :177,002,109,209,002,141,143 4629 :209,002,144,019,173,203,003 4635 :002,240,017,056,173,193,196 4641 :002,233,001,141,193,002,093 4647 :176,003,206,194,002,076,184 4653 :107,200,238,193,002,208,225 4659 :248,238,194,002,208,243,160 4665 :096,198,122,096,032,000,089 4671 :192,165,020,141,075,201,089 4677 :165,021,141,076,201,096,001 4683 :143,183,000,169,000,141,199 4689 :193,002,141,196,002,032,135 4695 :000,192,165,020,141,197,034 4701 :002,032,000,192,169,056,032 4707 :197,020,169,001,229,021,224 4713 :176,005,169,255,141,193,020 4719 :002,165,020,041,007,133,223 4725 :002,165,020,041,248,133,214 4731 :251,165,021,133,252,032,209 4737 :000,192,169,192,197,020,131 4743 :176,005,169,255,141,196,053 4749 :002,165,020,041,007,141,005 4755 :194,002,141,195,002,165,078 4761 :020,032,014,198,165,251,065 4767 :041,248,133,251,173,197,178 4773 :002,133,020,169,000,133,110 4779 :021,006,020,038,021,006,027 4785 :020,038,021,006,020,038,064 4791 :021,024,173,075,201,101,010 4797 :020,133,020,165,021,109,145 4803 :076,201,133,021,024,165,047 4809 :251,105,008,141,177,002,117 4815 :165,252,105,000,141,178,024 4821 :002,165,021,041,208,201,083 4827 :208,208,007,120,165,001,160 4833 :041,251,133,001,169,000,052

130

Page 130: 16 Voor de 64

4839 :141,176,002,166,002,240,190 4845 :005,056,106,202,208,251,041 4851 :141,179,002,172,176,002,147 4857 :177,020,166,002,240,004,090 4863 :074,202,208,252,032,077,076 4869 :202,208,238,044,193,002,124 4875 :048,056,056,169,008,229,065 4881 :002,133,002,201,008,240,091 4887 :045,173,177,002,133,251,036 4893 :173,178,002,133,252,169,168 4899 :000,141,176,002,173,194,209 4905 :002,141,195,002,173,179,221 4911 :002,073,255,141,179,002,187 4917 :172,176,002,177,020,166,254 4923 :002,010,202,208,252,032,253 4929 :077,202,208,240,169,004,197 4935 :005,001,133,001,088,096,139 4941 :172,195,002,044,077,201,000 4947 :048,012,133,254,173,179,114 4953 :002,049,251,005,254,076,214 4959 :099,202,081,251,145,251,100 4965 :200,140,195,002,192,008,070 4971 :208,017,160,064,140,195,123 4977 :002,230,252,044,196,002,071 4983 :016,005,169,007,141,176,121 4989 :002,238,176,002,173,176,124 4995 :002,201,008,096,169,000,095 5001 :141,077,201,076,078,201,143 5007 :169,255,141,077,201,076,038 5013 :078,201,032,115,000,032,095 5019 :040,175,234,234,234,234,026 5025 :234,234,165,071,133,020,250 5031 :165,072,133,021,160,000,206 5037 :177,020,240,213,056,165,020 5043 :020,233,002,133,020,176,251 5049 :002,198,021,177,020,197,032 5055 :069,208,196,200,177,020,037 5061 :197,070,208,189,160,003,000 5067 :177,020,133,251,200,177,137 5073 :020,133,252,169,000,133,148 5079 :253,133,002,133,254,160,126 5085 :000,177,071,170,164,002,037 5091 :177,251,201,018,208,007,065 5097 :169,128,133,253,076,009,233 5103 :203,201,146,208,007,169,149 5109 :000,133,253,076,009,203,151 5115 :041,191,016,002,073,192,254 5121 :005,253,164,254,145,251,049 5127 :230,254,230,002,202,208,109 5133 :211,165,254,160,000,145,180 5139 :071,096,000,000,000,000,186 5145 :000,000,000,000,000,000,025 5151 :000,000,072,020,010,000,133

131

Page 131: 16 Voor de 64

5157 :153,034,147,154,083,085,181 5163 :080,069,082,066,065,083,232 5169 :073,067,032,054,052,032,103 5175 :077,067,083,079,070,084,003 5181 :032,040,067,041,032,049,066 5187 :057,056,051,034,000,101,110 5193 :020,015,000,129,074,178,233 5199 :049,164,053,048,058,161,100 5205 :065,036,058,139,065,036,228 5211 :178,034,034,167,130,058,180 5217 :137,050,048,000,107,020,203 5223 :016,000,130,000,143,020,156 5229 :020,000,153,034,091,067,218 5235 :065,084,065,034,058,144,053 5241 :067,065,084,065,058,144,092 5247 :070,067,079,076,049,052,008 5253 :058,144,066,075,071,068,103 5259 :054,058,162,000,000,058,215 5265 :144,067,065,084,065,058,116 5271 :144,070,067,079,076,049,124 5277 :052,058,144,066,075,071,111 5283 :068,054,058,162,000,000,249 5289 :000,000,000,083,065,131,192 5295 :000,000,000,000,073,000,248 5301 :140,002,176,000,000,073,060 5307 :128,004,096,157,000,000,060 5313 :067,072,134,044,000,000,254 5319 :000,088,000,140,002,176,093 5325 :000,000,066,000,136,041,192 5331 :000,000,000,066,128,003,152

Programma 2. Moire-patroon Om dit programma zonder fouten in te tikken. kunt u gebruik maken van de 'automatische controleur'. Zie bijlage ...

1 rem moire effect demo : rem 99 5 : : [extcO : rem 104 10 :: [cb2k4: [bmgr1: [fbmsO: [fscr1 m 53 15 forj=Oto318step2 : rem 177 20 : : [drawj, 198, 160, 100 :next : rem 112 22 forj=318toOstep-2 : rem 220 23 :: [dràwj, 0, 160, 100 :next : rem 1 24 forj=Oto198step2 : rem 183 25 :: [draw160,100,318,j:next :rem 111 26 forj=198toOstep-2 : rem 230 27 :: [draw161,100,0,j:next : rem 6 29 :: [extc4 : rem 162 30 : :m$="superbasic": [hrcs53248 :m$=m $+"" :rem 77 40 x=120:y=80:gosub50 :rem 227 45 m$=" [RVS ON]door mcsoft":m$=m$+""

132

Page 132: 16 Voor de 64

:x=116:y=120:gosub50 : rem 30 47 : : [chrx54, 152, 89: [chrx52, 160, 89

:rem 202 48 forj=lto1800:next : rem 240 49 :: [fscr16:goto100 : rem 213 50 :: [codem$: forj=ltolen (m$) : rem 221 60 :: [chrxasc (mid$ (m$, j, 1)) ,x,y :rem 46 70 x=x+8:next :rem 48 80 return :rem 72 100 geta$:ifa$=""then100 : rem 69 110 :: [bmgrO: [cb2k2 :rem 130 120 print" [CLR] " :rem 247

Programma 3. Sterren

1 rem sterren demo :rem 93 10 pi=6.28318531 :rem 58 20 print" [CLR] [DOWN] hoeveel hoekpu nten van de ster (0 om te".: input" stoppe n) ";pw 21 ifpw=Othenend 22 print"hoeveel hoekpunten van ster overslaan"

23 print"ongeveer"int(pw/2) "is een 1 euke waarde"; :inputsk 24 input "radius <100 n; r 30 p=pi/pw 50 [bmgr1: [cb2k4: [fbmsO: [fscr1 60 x=160:y=100-r:tl=0 70 forj=ltopw 80 th=tl+sk 90 tl=th:th=th*p-(pi/4) 100 x2=cos(th)*r+160 110 y2=sin(th)*r+100 120 [drawx,y,x2,y2 130 x=int(x2) :y=int(y2) :next 140 geta$:ifa$=""then140 150 [bmgrO: [cb2k2 :print" [CLR] ": goto 20

Programma 4. Cirkels

5 rem demonstratie algoritme cirkelt ekenen 10 input" [CLR]x,y van middelpunt"; a,b 20 input"straal";r 40 [fscr1: [cb2k4: [bmgr1: [fbmsO 50 ph=0:y1=0:x1=r 60 py=ph+y1+y1+1 70 px=py-x1-x1+1

133

: rem :rem

:rem

: rem :rem : rem : rem : rem :rem :rem :rem :rem :rem : rem :rem :rem

: rem

:rem

: rem : rem :rem :rem :rem : rem

91 12

12

90 92 95

197 185

80 170 133 104 105 102 255

77

133

16

106 138 196 237 170 189

Page 133: 16 Voor de 64

80 [plot a+x1,b+y1 :rem 26 90 [plot a-x1,b+y1 :rem 29 100 [plot a+x1,b-y1 : rem 69 110 [plot a-x1,b-y1 :rem 72 120 [plot a+y1,b+x1 :rem 69 130 [plot a-y1,b+x1 :rem 72 140 [plot a+y1,b-x1 :rem 73 150 [plot a-y1,b-x1 :rem 76 160 ph=py:y1=y1+1 :rem 252 170 ifabs (px) <abs (py)thenph=px:x1=x1 -1 :rem 149 180 ifx1>=y1then60 :rem 75 200 geta$:ifa$=""then200 : rem 71 210 [bmgrO: [cb2k2 : rem 15 220 input" [CLR]x,y van middelpunt" ;a,b :rem 157 230 input"straal";r :rem 189 240 [fscr1: [cb2k4: [bmgr1:goto50 :rern 225

Programma 5. Sprites bestuurd door Joy-sticks

1 rem schets :rem 223 5 gosub900: [dspr1, 13,0,0,160+16,100+ 44,0,0:gosub140 :rem 65 10 [bankO: [cb2k4: [bmgr1: [fbmsO: [fscr 1: [bspp1, 1 : rem 250 20 e=1:x=160:y=100:c=-1:forq=lto100: next :rem 129 30 ifpeek(203)=60then130 :rem 99 31 ifpeek(203)=4thene=-e:ife>Othen[d spr1,13,0,0,0,0,0,O :rem 186 32 ife<Othen[dspr1,13,0,0,x+16,y+44, 0,12: [clpxx, y : rem 163 35 jv=peek(56320) :fr=jvand16 :rem 164 40 jv=15-(jvand15) :rem 254 50 ifjv=Oandfr=16then30 :rem 162 60 ifjv=lorjv=50rjv=9theny=y-1:ify<0 theny=199 :rem 223 70 ifjv=2orjv=6orjv=10theny=y+1:ify> 199theny=0 :rem 10 80 ifjv>=4andjv<=6thenx=x-1:ifx<Othen x=319 :rem 208 90 ifjv>=8andjv<=10thenx=x+1:ifx>319 thenx=O :rem 0 100 iffr=Oandjv=Othenc=-c:e=l:forq=l t0100:next:ifc>Othen[kspr1:poke53288,0 105 ife<Othen[espr1: [move1,x+16,y+44 : [clpxx,y:goto30 :rem 117 110 ifc>Othen[plotx,y:goto30 :rem 78 120 ifc<Othen[espr1: [move1,x+16,y+44 :goto30 :rem 199 130 [bankO: [bmgrO: [cb2k2:poke198,0:print "[CLR]": [kspr1:end :rem 13

134

Page 134: 16 Voor de 64

140 print" [CLR] [15xSPATIE] schets 64" :rem 45

150 print"[DOWN] [6xSPATIE] gebruik joy stick in poort 2." :rem 124 160 print" [DOWN] [3xSPATIE]vuurknop sc hake1t inkt aan en uit." :rem 11 165 print" [DOWN] [5xSPATIE] f1 schakelt

wismode aan en uit." :rem 223 170 print" [DOWN] [4xSPATIE] druk op een toets om te starten." :rem 58

180 print" [DOWN] [5xSPATIE] druk op [RIGHT] [RVS ON] spatie [RVS-OFF] om te stoppen."

:rem 99 185 print"[4xDOWN]de zwarte + is de cursor wanneer er geeninkt is." :rem 13 186 print" [DOWN] de grijze + is de cu rsor wanneer wismodeactief is.": [bkgd1 : [fcolO : rem 104 190 geta$:ifa$=""then190 :rem 87 200 ifa$=" "thenreturn :rem 22 210 return :rem 115 900 x=13* 64 : rem 38 910 ready:ify<Othenreturn :rem 172 920 pokex,y:x=x+1:goto910 :rem 55 1000 data1,192,0,1,192,0,1,192,0,1,1 92, 0, 1, 1 9 2, ° : rem 52 1010 dataO,128,0,126,63,0,0,128,0,1, 192,0,1,192,0 :rem 102 1020 data1,192,0,1,192,0,1,192,0,0,0 ,0,0,0,0 :rem 92 1030 dataO,O,O,O,O,O,O,O,O,O,O,O,O,O

, ° 1040 dataO,O,O,-l

Programma 6. Bewegende sprites

1 rem vallende klaverbladen 2 rem druk op een toets om het progr aroma te stoppen 5 [extc13: [cb2k4: [bmgr1: [fscr5: [fbms 171 10 x=832:v=53265:r=128 20 reada:ifa<Othen35 30 pokex,a:x=x+1:goto20 35 forj=Oto7 40 [dsprj,13,1,1,0,0,0,5+j :next

50 forj=lto256:fork=lto8: [movek-1,j+ k*k,j*k+k:next:waitv,r: [fscrj/2 55 geta$:ifa$<>""then300 56 next

135

:rem 22 :rem 81

:rem 203

: rem 55

: r:em 47 : rem 201 :rem 204 : rem 175 :rem 224

:rem 239

:rem 90 :rem 93 :rem 170

Page 135: 16 Voor de 64

60 x=peek(8192)+1: [fbmsx:goto50 :rem 142 100 dataO,102,0,0,255,0,1,255,128,3, 255,192 :rem 81 110 data3,255,192,25,255,152,60,126, 60, 126, 126, 126 : rem 198 120 data255,60,255,255,255,255,127,2 55,254,255,255,255,255 :rem 112 130 data24,255,126,24,126,60,24,60,2 4,24,24,0,24,0,0,24,0,0,0,0,0,0,0,0,0, 0,-1 :rem 190 300 [cb2k2: [bmgrO:forj=Oto7: [ksprj:n~xt

Programma 7. Eenvoudige PET-mededinger

10 rem routine om basic geheugen en scherm naar standaard pet positie te engen 20 rem scherm op 32768 30 rem basic 1024 tot 32767 40 rem begin met c-64 standaard ling

inde

:rem 89

br :rem 90 :rem 177 :rem 112

:rem 73 50 [fscrO: [vs1k 0: [bank 2:print " [CLR] "

60 poke44,4:poke45,3:poke46,4

70 poke55,0:poke56,128 80 new

Programma 8. TIK-64

2 ifa=Othena=1:1oad"64set",8,1 3 print" [CLR] stop het programma me t f1":print"druk op een toets om te nnen." 4 geta$:ifa$=""then4 5 poke56,128:poke55,0:e1r 10 [bmgr1: [eb2k4: [fbmsO: [fser1 20 [hrcs32768 25 x=0:y=0:w=5:rv=0 30 b1=0 35 forj=lto30:getk$:ifk$=""thennext

40 ifj=31andb1=Othen[ehrx160,x,y:b1=

:rem 137 :rem 193

: rem 247 :rem 82

:rem 2

begi :rem 177 :rem 139 :rem 224 :rem 193 :rem 247 :rem 126 :rem 94

:rem 189

1: goto35 : rem 28 42 ifj=31then[chrx160,x,y:goto30

44 j=31:next:ifb1=lthenb1=0: [chrx160 ,x,y 50 ifk$="[CLR]"then[fbmsO:goto25

136

:rem 21

:rem 37

Page 136: 16 Voor de 64

55 ifk$=chr$(13)thenx=0:y=y+8:goto14

° 60 ifk$="[HOME]"then25 65 ifk$=" [RVS ON] "thenrv=128:goto30 66 ifk$=" [RVS OFF] "thenrv=0:goto30 70 ifk$=" [DOWN] "theny=y+8:y=-y* (y<19 3) :j=31:goto40 80 ifk$=" [UP] "theny=y-8:y=-y* (y>=O) : j=31:goto40 90 ifk$="[RIGHT]"thenx=x+w:x=-x*(x<3 16) :j=31:goto40 100 ifk$="[LEFT]"thenx=x-w:x=-x*(x>= 0) :j=31:goto40 105 ifk$="[ F1 ]"then200 106 ifk$=" "then[char32+rv,x,y:goto1

: rem

:rem : rem :rem :rem

:rem

:rem

: rem

:rem : rem

51

227 142 129 151

119

204

156

27 91

20 :rem 5 110 [codek$:cr=asc(k$): [chrx cr+rv,x ,y :rem 85 120 x=x+w:x=-x*(x>=Oandx<316) :ifx=Othen y=y+8 :rem 228 14 ° y=-y* (y<193) : rem 94 150 goto30 :rem 50 200 [bmgrO:[cb2k2:print"[CLR]" :rem 172

Programma 9. 64SET

32768 :000,224,176,016,208,208,064 32774 :112,000,096,240,144,240,070 32780 :144,144,144,000,224,144,044 32786 :144,224,144,144,224,000,130 32792 :096,144,128,128,128,144,024 32798 :096,000,192,160,144,144,254 32804 :144,160,192,000,240,128,132 32810 :128,224,128,128,240,000,122 32816 :240,128,128,224,128,128,000 32822 :128,000,096,144,128,176,214 32828 :144,144,096,000,144,144,220 32834 :144,240,144,144,144,000,114 32840 :112,032,032,032,032,032,088 32846 :112,000,048,016,016,016,030 32852 :144,144,096,000,144,144,244 32858 :160,192,160,144,144,000,122 32864 :128,128,128,128,128,128,096 32870 :240,000,144,240,240,144,086 32876 :144,144,144,000,144,208,124 32882 :208,208,176,176,144,000,002 32888 :096,144,144,144,144,144,168 32894 :096,000,224,144,144,224,190 32900 :128,128,128,000,096,144,244 32906 :144,144,144,096,048,000,202 32912 :224,144,144,224,144,144,144

137

Page 137: 16 Voor de 64

32918 :144,000,096,144,128,096,246 32924 :016,144,096,000,240,064,204 32930 :064,064,064,064,064,000,226 32936 :144,144,144,144,144,144,008 32942 :096,000,144,144,144,144,078 32948 :144,096,096,000,144,144,036 32954 :144,144,240,240,144,000,074 32960 :144,144,096,096,240,144,032 32966 :144,000,144,144,144,240,246 32972 :096,096,096,000,240,016,236 32978 :032,064,128,128,240,000,034 32984 :192,128,128,128,128,128,024 32990 :192,000,224,112,064,240,030 32996 :064,112,224,000,048,016,180 33002 :016,016,016,016,048,000,090 33008 :000,096,096,240,096,096,096 33014 :096,096,016,032,064,240,022 33020 :064,032,016,000,000,000,108 33026 :000,000,000,000,000,000,002 33032 :032,032,032,032,032,000,168 33038 :032,000,000,144,144,000,078 33044 :000,000,000,000,112,096,228 33050 :096,240,096,096,224,000,010 33056 :032,096,144,192,048,144,176 33062 :096,032,128,144,032,064,022 33068 :144,016,000,000,224,160,076 33074 :192,160,144,144,112,000,034 33080 :096,192,128,000,000,000,216 33086 :000,000,096,192,128,128,094 33092 :128,192,096,000,192,096,004 33098 :048,048,048,096,192,000,250 33104 :000,144,096,240,096,144,032 33110 :000,000,000,064,064,224,182 33116 :064,064,000,000,000,000,220 33122 :000,000,000,096,096,192,226 33128 :000,000,000,240,000,000,088 33134 :000,000,000,000,000,000,110 33140 :000,096,096,000,000,000,052 33146 :008,016,032,064,128,000,114 33152 :096,144,176,144,208,144,016 33158 :096,000,096,032,032,032,166 33164 :032,032,112,000,096,144,044 33170 :016,032,064,128,240,000,114 33176 :096,144,016,096,016,144,152 33182 :096,000,032,160,160,160,254 33188 :240,032,032,000,240,128,068 33194 :128,224,016,144,096,000,010 33200 :096,128,128,224,144,144,016 33206 :096,000,240,016,016,032,070 33212 :032,032,032,000,096,144,012 33218 :144,096,144,144,096,000,050 33224 :096,144,144,112,016,016,216 33230 :096,000,000,000,096,000,142

138

Page 138: 16 Voor de 64

33236 :000,096,000,000,000,000,052 33242 :096,000,000,096,096,192,186 33248 :016,032,064,128,064,032,048 33254 :016,000,000,000,240,000,230 33260 :240,000,000,000,128,064,156 33266 :032,016,032,064,128,000,002 33272 :096,144,016,032,032,000,056 33278 :032,000,000,224,176,016,190 33284 :208,208,112,000,096,240,100 33290 :144,240,144,144,144,000,058 33296 :224,144,144,224,144,144,016 33302 :224,000,096,144,128,128,230 33308 :128,144,096,000,192,160,236 33314 :144,144,144,160,192,000,050 33320 :240,128,128,224,128,128,248 33326 :240,000,240,128,128,224,238 33332 :128,128,128,000,096,144,164 33338 :128,176,144,144,096,000,234 33344 :144,144,144,240,144,144,000 33350 :144,000,112,032,032,032,166 33356 :032,032,112,000,048,016,060 33362 :016,016,144,144,096,000,242 33368 :144,144,160,192,160,144,008 33374 :144,000,128,128,128,128,238 33380 :128,128,240,000,144,240,212 33386 :240,144,144,144,144,000,154 33392 :144,208,208,208,176,176,208 33398 :144,000,096,144,144,144,022 33404 :144,144,096,000,224,144,108 33410 :144,224,128,128,128,000,114 33416 :096,144,144,144,144,096,136 33422 :048,000,224,144,144,224,158 33428 :144,144,144,000,096,144,052 33434 :128,096,016,144,096,000,122 33440 :240,064,064,064,064,064,208 33446 :064,000,144,144,144,144,038 33452 :144,144,096,000,144,144,076 33458 :144,144,144,096,096,000,034 33464 :144,144,144,144,240,240,216 33470 :144,000,144,144,096,096,046 33476 :240,144,144,000,144,144,244 33482 :144,240,096,096,096,000,106 33488 :240,016,032,064,128,128,048 33494 :240,000,192,128,128,128,006 33500 :128,128,192,000,224,112,236 33506 :064,240,064,112,224,000,162 33512 :048,016,016,016,016,016,104 33518 :048,000,000,096,096,240,206 33524 :096,096,096,096,016,032,164 33530 :064,240,064,032,016,000,154 33536 :000,000,000,000,000,000,000 33542 :000,000,032,032,032,032,134 33548 :032,000,032,000,000,144,220

139

Page 139: 16 Voor de 64

33554 :144,000,000,000,000,000,162 33560 :112,096,096,240,096,096,248 33566 :224,000,032,096,144,192,206 33572 :048,144,096,032,128,144,116 33578 :032,064,144,016,000,000,042 33584 :224,160,192,160,144,144,048 33590 :112,000,096,192,128,000,070 33596 :000,000,000,000,096,192,092 33602 :128,128,128,192,096,000,226 33608 :192,096,048,048,048,096,088 33614 :192,000,000,144,096,240,238 33620 :096,144,000,000,000,064,132 33626 :064,224,064,064,000,000,250 33632 :000,000,000,000,000,096,192 33638 :096,192,000,000,000,240,118 33644 :000,000,000,000,000,000,108 33650 :000,000,000,096,096,000,050 33656 :000,000,008,016,032,064,240 33662 :128,000,096,144,176,144,046 33668 :208,144,096,000,096,032,196 33674 :032,032,032,032,112,000,122 33680 :096,144,016,032,064,128,112 33686 :240,000,096,144,016,096,230 33692 :016,144,096,000,032,160,092 33698 :160,160,240,032,032,000,018 33704 :240,128,128,224,016,144,024 33710 :096,000,096,128,128,224,078 33716 :144,144,096,000,240,016,052 33722 :016,032,032,032,032,000,074 33728 :096,144,144,096,144,144,192 33734 :096,000,096,144,144,112,022 33740 :016,016,096,000,000,000,076 33746 :096,000,000,096,000,000,146 33752 :000,000,096,000,000,096,152 33758 :096,192,016,032,064,128,238 33764 :064,032,016,000,000,000,084 33770 :240,000,240,000,000,000,202 33776 :128,064,032,016,032,064,064 33782 :128,000,096,144,016,032,150 33788 :032,000,032,000,248,024,076 33794 :072,232,040,040,136,248,002 33800 :152,008,104,008,104,104,232 33806 :104,248,024,104,104,024,110 33812 :104,104,024,248,152,104,244 33818 :120,120,120,104,152,248,122 33824 :056,088,104,104,104,088,064 33830 :056,248,008,120,120,024,102 33836 :120,120,008,248,008,120,156 33842 :120,024,120,120,120,248,034 33848 :152,104,120,072,104,104,200 33854 :152,248,104,104,104,008,014 33860 :104,104,104,248,136,216,212 33866 :216,216,216,216,136,248,042

140

Page 140: 16 Voor de 64

33872 :200,232,232,232,104,104,160 33878 :152,248,104,104,088,056,070 33884 :088,104,104,248,120,120,108 33890 :120,120,120,120,008,248,066 33896 :104,008,008,104,104,104,024 33902 :104,248,104,040,040,040,174 33908 :072,072,104,248,152,104,100 33914 :104,104,104,104,152,248,170 33920 :024,104,104,024,120,120,112 33926 :120,248,152,104,104,104,198 33932 :104,152,200,248,024,104,204 33938 :104,024,104,104,104,248,066 33944 :152,104,120,152,232,104,248 33950 :152,248,008,184,184,184,094 33956 :184,184,184,248,104,104,148 33962 :104,104,104,104,152,248,218 33968 :104,104,104,104,104,152,080 33974 :152,248,104,104,104,104,230 33980 :008,008,104,248,104,104,252 33986 :152,152,008,104,104,248,194 33992 :104,104,104,008,152,152,056 33998 :152,248,008,232,216,184,222 34004 :120,120,008,248,056,120,116 34010 :120,120,120,120,056,248,234 34016 :024,136,184,008,184,136,128 34022 :024,248,200,232,232,232,118 34028 :232,232,200,248,248,152,012 34034 :152,008,152,152,152,152,242 34040 :232,216,184,008,184,216,008 34046 :232,248,248,248,248,248,190 34052 :248,248,248,248,216,216,148 34058 :216,216,216,248,216,248,090 34064 :248,104,104,248,248,248,192 34070 :248,248,136,152,152,008,198 34076 :152,152,024,248,216,152,204 34082 :104,056,200,104,152,216,098 34088 :120,104,216,184,104,232,232 34094 :248,248,024,088,056,088,030 34100 :104,104,136,248,152,056,084 34106 :120,248,248,248,248,248,138 34112 :152,056,120,120,120,056,176 34118 :152,248,056,152,200,200,054 34124 :200,152,056,248,248,104,060 34130 :152,008,152,104,248,248,226 34136 :248,184,184,024,184,184,072 34142 :248,248,248,248,248,248,046 34148 :248,152,152,056,248,248,180 34154 :248,008,248,248,248,248,074 34160 :248,248,248,248,248,152,224 34166 :152,248,248,248,248,232,214 34172 :216,184,120,248,152,104,124 34178 :072,104,040,104,152,248,082 34184 :152,216,216,216,216,216,088

141

Page 141: 16 Voor de 64

34190 :136,248,152,104,232,216,206 34196 :184,120,008,248,152,104,196 34202 :232,152,232,104,152,248,250 34208 :216,088,088,088,008,216,096 34214 :216,248,008,120,120,024,134 34220 :232,104,152,248,152,120,156 34226 :120,024,104,104,152,248,162 34232 :008,232,232,216,216,216,024 34238 :216,248,152,104,104,152,142 34244 :104,104,152,248,152,104,036 34250 :104,136,232,232,152,248,026 34256 :248,248,152,248,248,152,224 34262 :248,248,248,248,152,248,070 34268 :248,152,152,056,232,216,252 34274 :184,120,184,216,7.32,248,130 34280 :248,248,008,248,008,248,216 34286 :248,248,120,184,216,232,206 34292 :216,184,120,248,152,104,244 34298 :232,216,216,248,216,248,090 34304 :248,024,072,232,040,040,144 34310 :136,248,152,008,104,008,150 34316 :104,104,104,248,024,104,188 34322 :104,024,104,104,024,248,114 34328 :152,104,120,120,120,104,232 34334 :152,248,056,088,104,104,014 34340 :104,088,056,248,008,120,148 34346 :120,024,120,120,008,248,170 34352 :008,120,120,024,120,120,048 34358 :120,248,152,104,120,072,102 34364 :104,104,152,248,104,104,108 34370 :104,008,104,104,104,248,226 34376 :136,216,216,216,216,216,008 34382 :136,248,200,232,232,232,078 34388 :104,104,152,248,104,104,132 34394 :088,056,088,104,104,248,010 34400 :120,120,120,120,120,120,048 34406 :008,248,104,008,008,104,070 34412 :104,104,104,248,104,040,044 34418 :040,040,072,072,104,248,178 34424 :152,104,104,104,104,104,024 34430 :152,248,024,104,104,024,014 34436 :120,120,120,248,152,104,228 34442 :104,104,104,152,200,248,026 34448 :024,104,104,024,104,104,096 34454 :104,248,152,104,120,152,006 34460 :232,104,152,248,008,184,060 34466 :184,184,184,184,184,248,050 34472 :104,104,104,104,104,104,024 34478 :152,248,104,104,104,104,222 34484 :104,152,152,248,104,104,020 34490 :104,104,008,008,104,248,250 34496 :104,104,152,152,008,104,048 34502 :104,248,104,104,104,008,102

142

Page 142: 16 Voor de 64

34508 :152,152,152,248,008,232,124 34514 :216,184,120,120,008,248,082 34520 :056,120,120,120,120,120,104 34526 :056,248,024,136,184,008,110 34532 :184,136,024,248,200,232,228 34538 :232,232,232,232,200,248,074 34544 :248,152,152,008,152,152,080 34550 :152,152,232,216,184,008,166 34556 :184,216,232,248,248,248,092 34562 :248,248,248,248,248,248,210 34568 :216,216,216,216,216,248,056 34574 :216,248,248,104,104,248,158 34580 :248,248,248,248,136,152,020 34586 :152,008,152,152,024,248,250 34592 :216,152,104,056,200,104,096 34598 :152,216,120,104,216,184,006 34604 :104,232,248,248,024,088,220 34610 :056,088,104,104,136,248,018 34616 :152,056,120,248,248,248,104 34622 :248,248,152,056,120,120,238 34628 :120,056,152,248,056,152,084 34634 :200,200,200,152,056,248,106 34640 :248,104,152,008,152,104,080 34646 :248,248,248,184,184,024,198 34652 :184,184,248,248,248,248,172 34658 :248,248,248,152,152,056,178 34664 :248,248,248,008,248,248,072 34670 :248,248,248,248,248,248,062 34676 :248,152,152,248,248,248,132 34682 :248,232,216,184,120,248,090 34688 :152,104,072,104,040,104,192 34694 :152,248,152,216,216,216,054 34700 :216,216,136,248,152,104,188 34706 :232,216,184,120,008,248,130 34712 :152,104,232,152,232,104,104 34718 :152,248,216,088,088,088,014 34724 :008,216,216,248,008,120,212 34730 :120,024,232,104,152,248,026 34736 :152,120,120,024,104,104,032 34742 :152,248,008,232,232,216,246 34748 :216,216,216,248,152,104,060 34754 :104,152,104,104,152,248,034 34760 :152,104,104,136,232,232,136 34766 :152,248,248,248,152,248,222 34772 :248,152,248,248,248,248,068 34778 :152,248,248,152,152,056,202 34784 :232,216,184,120,184,216,096 34790 :232,248,248,248,008,248,182 34796 :008,248,248,248,120,184,012 34802 :216,232,216,184,120,248,178 34808 :152,104,232,216,216,248,136 34814 :216,248,013,013,013,013,002

143

Page 143: 16 Voor de 64
Page 144: 16 Voor de 64

STIJLVOL BASIC

De evolutie van een programma Jim Butterfield

Soms komt u een programma tegen dat zo kraakhelder en overzichtelijk is, dat u zich afvraagt hoe een mens zo ordelijk kan denken. De statements zijn allemaal even elegant en haarscherp geplaatst. Elke regel staat op de juiste plaats en volbrengt de juiste taken. Is deze wijze van programmeren ook voor u weggelegd?

Hoe ontwikkelt een programmeur een elegante programmeerstijl? Waarom schrijft u uw programma's niet zo neties? Soms voelt u zich echt een slechte programmeur als u weer zo'n prachtig programma heeft gezien. Toch is zo'n programma niet in een keer geschreven. Ook de prachtigste programma's ons taan in een proces van evolutie; schrijven, herschrijven en gladstrijken. Net als een verhaal of een boek niet in een keer geschreven en wordt gepubliceerd, worden computerprogramma's niet in een zucht geschreven en gepubliceerd. Men heeft mij wel eens beschuldigd van het schrijven van 'kraakheldere' programma's. Maar zo zien de programma's in het begin er helemaal niet uit. Net als de programma's van de meeste andere programmeurs, worden mijn eerste versies vele malen herschreven en herzien, totdat de uiteindelijke versie klaar is. In feite is een goede programeerstijl niet zozeer de kunde om netjes te programmeren, maar de wetenschap waarop moet worden gelet bij het verbeteren en redigeren van het programma. We kunnen dit het gemakkelijkste uitleggen door het te laten zien. Ik: neem u stap voor stap mee door de evolutie van een van mijn programma's.

Een eenvoudig list-programma Ik: had een zeer kleine opdracht: een sequentieel bestand moest van de diskette op een printer worden afgedrukt. Ik: wilde een paar extra's inbouwen: de bladzijden moesten worden gescheiden, dus het aantal regels moest worden geteld, ik wilde een titel boven elke bladzijde, en voor de netheid wilde ik dat de laatste bladzijde altijd uit de printer gerold zou worden. Niet bepaald een erg moeilijke klus, maar ik wil u graag laten zien, hoe ik het probleem aanpakte. Zelfs een eenvoudig programma dat hiervoor nodig is, kan altijd nog revisie en redactie gebruiken. (Opmerking: als u het programma voor uzelf wilt gebruiken, moet u bedenken dat het programma alleen werkt met sequentiele bestanden, dus niet met programmabestanden.) De eerste versie van mijn programma zag er als volgt uit (ik geeft tussen de regels door het commentaar): 100 OPEN 4,3 Open bestandnummer vier voor het scherm. Waarom? Nu kan ik de uitvoer van het programma naar het scherm sturen en zien wat het programma doet. Als het programma klaar is, kan ik de bovenstaande regel veranderen in OPEN 4, 4 . 105 OPEN 1,8,3,"CONTROL" Het bestand dat moet worden gelist, heet CONTROL. 110 REM BEGIN VAN BLADZIJDE 120 FOR J=l TO 2: PRINT#4: L=L+1: NEXT J 130 PRINT#4, "{S spaties}TITEL{3 spaties}": L=L+1 140 PRINT#4: L=L+1 Door dit programmaonderdeel wordt de bladzijdetitel afgedrukt. Het programma zal hier voor

145

Page 145: 16 Voor de 64

elke bladzijde terugkeren, dus ik plaats een REM-statement om de juiste plaats te markeren. Het programma telt 1 op bij de regelteller (L) elke keer dat een regel afgedrukt wordt. 150 INPUT#l,A$: SW=ST 170 PRINT#4,A$: L=L+1 Hier haal ik de gegevens van de diskette (invoer) en breng ik ze naar het scherm (uitvoer). Later zal dit veranderen in uitvoer naar de printer. Ik laat het programma de waarde van ST (de statusvariabele) opslaan, zodat het programma leter kan controleren of de laatste regel van het bestand gevonden is. ST wordt veranderd door de PRINT#-opdracht, dus de waarde van ST moet veilig worden opgeslagen in SW. 180 IF L<62 GOTO 250 190 IF L=66 THEN L=O: GOTO 250 200 PRINT#4: L=L+1: GOTO 190 Als het programma het maximale aantal gewenste regels heeft afgedrukt, moet het vel papier uit de printer worden gerold, doordat er net zowel blanko regels afgedrukt worden, totdat de regelteller 66 bereikt heeft. Omdat elke bladzijde 66 regels bevat, betekent een waarde van L die groter is dan 66, dat de volgende bladzijde al is begonnen. In dat geval moet L weer gelijk gemaakt worden aan O. 250 IF SW<>O GOTO 300 260 IF L=O GOTO 110 270 GOTO 150 Als het programma het einde van het invoerbestand vindt (SW <>0), gaat er een vertakking naar regel 300, waar de laatste resten afgewerkt worden. Is het einde van het invoerbestand nog niet bereikt, dan moet het programma terugspringen. De regels 260 en 270 zijn nogal subtiel. Wellicht te subtiel naar de smaak van sommigen. De variabele L is alleen nul als een bladzijde net is beeindigd. In dat geval wil ik dat de routine terug springt naar regel 110 om een bladzijdetitel af te drukken. Is dit niet het geval, dan moet de routine terugkeren naar regel 50 om een nieuwe regel uit het invoerbestand te halen. 300 IF L<>O GOTO 190 Nu wordt het pas echt subtiel. Ik heb even geaarzeld of ik dit wel moest opnemen. Het is bijna te mooi. Dit soort hele mooie programmeertechnieken kunnen de logica van het programma gemakkelijk ondermijnen. Het idee was als volgt: als het programma klaar is, maar het papier is niet uit de printer gerold, moet het programma terug naar regel 190 om het papier door middel van regelopvoer alsnog uit de printer te laten rollen. Het programma komt daarna weer terecht bij regel 300, maar in dat geval is L wel gelijk aan nul, en kunnen we het programma door twee afsluitende regels afmaken. 310 CLOSE 1 320 CLOSE 4 Zo, dat was het. Het is echt een soepzooitje. Maar het werkt, en voor een tijdelijke klus, is dit toch alles wat we wensen. Maar toch zit het me dan niet echt lekker. Het programma loopt niet echt lekker. De vertakkingen springen alle kanten op, en ik vind het programma niet glad ogen. Als u dat gevoel ook heeft, weet u dat er nog het een en ander aan het programma kan worden verbeterd. Ik luisterde naar de stem van mijn programmeergeweten, en begon verbeteringen aan te brengen.

146

Page 146: 16 Voor de 64

Eerste revisie Het lelijkste punt ligt bij de regel 190 en 200. De routine om het papier uit de printer te laten rollen werkt wel, maar ziet er nogal klunsig uit. Daarbij komt dat de routine twee keer aangeroepen wordt (eenmaal als het papier 62 regels vol heeft, en eenmaal bij het einde van het bestand). Ik vind dat dit zo niet hoeft. Deze regels vormen een apart onderdeel met een aparte taak. Het zou mooier zijn als we dat expliciet maken, en de regels in een aparte subroutine plaatsen. Soms maak ik zelfs een subroutine van enkele regels midden in het programma, om ze in een later stadium weer terug te plaatsen. Op die manier kan ik de verschillende onderdelen waaruit het programma is opgebouwd, beter uit elkaar houden. Laten we de regels die zorgen voor de papier-uitworp in een subroutine vanaf regel 500 plaatsen, het programma bij vegen, en kijken hoe het er dan uit komt te zien. Het resultaat ziet er nu ongeveer zo uit. 100 OPEN 4,3 105 OPEN 1,8,3, "CONTROL" 110 REM BEGIN BLADZIJDE 120 FOR J=l TO 2: PRINT#4: L=L+1: NEXT J 130 PRINT#4, "{5 SPATIES}TITEL{3 SPATIES}": L=L+1 140 PRINT#4: L=L+1 150 INPUT#l,A$: SW=ST 170 PRINT#4,A$: L=L+1 180 IF L<62 GOTO 250 190 GOSUB 500: GOTO 250 250 IF SW<>O GOTO 300 260 IF L=O GOTO 110 270 GOTO 150 300 IF L<>O GOTO 190 310 CLOSE 1 320 CLOSE 4 330 END 500 FOR J=L TO 66: PRINT#4: NEXT J 510 L=O: RETURN

U ziet dat de GOTO 250 in regel 190 overbodig is; het programma zal daar toch wel naartoe gaan. Maar we zijn nog niet klaar. We willen nog meer snoeien en verbeteren in het programma.

Een beetje dieper graven Tussen de regel 250 tot en met 270 springt het programma veel op en neer. Eerst wordt vooruit gesprongen naar 300 en vervolgens twee maal terug gesprongen naar respectievelijk 110 en 150. De logica van het programma lijkt versplinterd. Ik heb iets met lussen. Ik wil dat ze altijd keurig genesteld zijn, met de korte lussen altijd binnen de langere lussen. Het zou zelfs als een vuistregel gehanteerd kunnen worden: maak korte sprongen zo veel mogelijk, zo kort mogelijk. Als we deze regel toepassen, moet de lus die naar regel 150 terugspringt in een logische volgorde worden geplaatst. Nadat dit is gebeurd, kunnen we gaan werken aan de langere lus naar 110. Tot slot komt de lus naar 300 aan de beurt. De logica moet daarvoor worden uitgebreid met een AND operator, maar dat geeft niet teveel problemen.

147

Page 147: 16 Voor de 64

Bij het schrijven van de routine, vallen bepaalde logische zaken keurig op hun plaats. Zo hoeven we niet voorwaarts naar regel 300 te gaan met een GOTO. Als de twee lussen herschreven zijn, komt het programma op natuurlijke wijze in regel 300 terecht. (Op natuurlijke wijze, automatisch, zijn de sleutelwoorden bij het redigeren van computerprogramma's). We kunnen de voorwaarden voor de uitworp van bladzijden ook strikter maken. Als we regel 180 goed schrijven, hoeven we niet terug te keren voor een bladzijde-uitworp. Een van de mogelijkheden is om de subroutine vanaf regel 500 twee keer aan te roepen. Maar als we in gedachten houden wat de bedoeling van het programma is bij regel 180, kunnen we het de eerste keer al goed doen. Door de logica om te draaien en een OR toe te voegen, hebben we de truc volbracht. Kijk eens hoe ons programma er nu uit ziet: 100 OPEN 4,3 105 OPEN 1,8,3,"CONTROL" 110 REM BEGIN BLADZIJDE 120 FOR J=l TO 2: PRINT#4: L=L+1: NEXT J 130 PRINT#4, "{5 SPATIES}TITEL{3 SPATIES}": L=L+1 140 PRINT#4: L=L+1 150 INPUT#l,A$: SW=ST 170 PRINT#4,A$: L=L+1 180 IF L>61 OR SW<> THEN GOSUB 500 250 IF SW=O AND L>O GOTO 150 260 IF SW=O GOTO 110 310 CLOSE 1 320 CLOSE 4 330 END 500 FOR J=L TO 66: PRINT#4: NEXT J 510 L=O: RETURN

Het begint al ergens op te lijken, maar we zijn er nog niet. Het is irritant dat in de regels 250 en 260 verschillende keren SW=O getest wordt. Dat ziet er ook al klunsig uit. Het heeft te maken met de test of een bladtitel moet worden afgedrukt. Is daar niet iets slimmer voor te vinden. Zou de test L>O niet bovenin de lus geplaatst kunnen worden, in plaats van onderin de lus?

De titel-module Nu we het er toch over hebben: die taak van het afdrukken van de bladtitel is eigenlijk een aparte module. We willen het allemaal, dat wil zeggen het afdrukken van de bladtitel op de juiste plaats, of we willen helemaal niets. Als we de taak in een subroutine plaatsen, ziet de logica er misschien weer wat helderder uit. Het resultaat wordt:

100 OPEN 4,3 105 OPEN 1,8,3, "CONTROL" 110 IF L=O THEN GOSUB 600 150 INPUT#l,A$: SW=ST 170 PRINT#4,A$: L=L+1 180 IF L>61 OR SW<>O THEN GOSUB 500

- 148 -

Page 148: 16 Voor de 64

260 IF SW=O GOTO 110 310 CLOSE 1 320 CLOSE 4 330 END 500 FOR J=L TO 66: PRINT#4: NEXT J 510 L=O: RETURN 600 FOR J=l TO 2: PRINT#4: L=L+1: NEXT J 610 PRINT#4,"{5 SPATIES}TITEL{3 SPATIE}": L=L+1 620 PRINT#4: L=L+1 630 RETURN

Kijk nu eens naar het hoofdprogramma in de regels 100 tot en met 330. Het is nu een compact en gesloten geheel, net een precies samengesteld gedicht. Dit is niet zo'n vreemde vergelijking. In een gedicht moet elk woord een betekenis binnen het gedicht hebben. In een programma moet op dezelfde wijze elke statement dienstbaar zijn aan het uiteindelijk resultaat van het programma. De beide subroutines (vanaf regel 500 en vanaf regel 600) worden allebei maar een keer aangeroepen. Als dat belangrijk zou zijn, zouden de routines weer in het hoofdprogramma kunnen worden terug geplaatst. Maar in dit geval ben ik wel zo blij dat ze als duidelijk geisoleerde taken blijven staan. Ik zou nu nog de toevoeging van enkel regels commentaar willen voorstellen (REM BLAD-UITWORP in regel 499 en REM BLADTITEL in regel 599), om het programma ook in de toekomst te begrijpen.

De moraal Ten eerste: wat u in een boek of tijdschrift tegenkomt, is meestal niet het eerste idee dat de schrijver kreeg. De programmeur is lang niet alijd slimmer dan u bent. Tijd en denkwerk hebben ervoor gezorgd, dat het programma zijn uiteindelijke versie kreeg. Als uw programma door veel mensen gelezen gaat worden, is het de moeite van een extra kritische redactie wel waard. Ten tweede: wees niet bang om uw programma's te herschrijven, zelfs als ze al goed werken. Uiteraard hoeven weg-werpprogramma's niet netjes te zijn: gebruiken en weggooien. Maar soms kan de oefening in het verbeteren van het programma, ijzersterke programmeertechnieken te voorschijn brengen. Ten derde: stijl is niet aangeboren. U kunt een betere stijl leren. Sommige zaken zult u zelf ontdekken, en andere technieken kunt u leren door naar de programma's van anderen te kijken. Het vreemde is, dat we het verschil tussen een goed en slecht geschreven stuk proza, snel herkennen. Het verschil tussen goed en slecht geschreven programma's is echter even duidelijk. U vindt een programma er soms goed uitzien. Meestal is dat omdat het stijlvol is.

149

Page 149: 16 Voor de 64
Page 150: 16 Voor de 64

OPSLAG VAN VARIABELEN

Een expeditie door BASIC-RAM Pete Marilde

U kunt uw speurtocht naar fouten in een programma een stuk eenvoudiger maken door een tocht door het BASIC RAM. Gebruik de in dit hoofdstuk gegeven subroutine. die de waarden van variabelen weergeeft.

Normaal gesproken hoeft u niet te weten wat er gebeurt met uw programma als u RUN intikt. De BASIC-interpreter neemt het van u over, waardoor u zich kunt concentreren op het gebruik van de computer om uw inkomstenbelasting te berekenen, om een brief te schrijven of om het heelal te redden. . Als uw programma ergens fout gaat, zult u toch van rol moeten wisselen. Nu kunt u geen computergebruiker blijven. U zult nu programmeur moeten worden, die de fout kan opsporen en vervolgens kan oplossen. Het opsporen en verbeteren van fouten is een stuk eenvoudiger als u tijdens de run van het programma kunt zien welke waarden de verschillende variabelen en arrays hebben om u ervan te kunnen overtuigen dat lussen netjes worden afgewerkt en dat gegevens op de juiste momenten op de juiste posities worden geplaatst. De programma's 1 en 2 aan het einde van dit hoofdstuk, zijn een uitgebreide en een verkorte versie van een subroutine de de huidige waarden van alle variabelen in het programma, weergeeft. Door een STOP-statement in elke regel waar u problemen verwacht te plaatsen, kunt u de werking van het programma stilzetten en vervolgens met GOTO naar de subroutine gaan om de logica van uw programma statement voor statement te controleren.

Een tochtje door BASIC Voordat we de subroutine gaan bekijken, zullen we eerst door dat deel van het RAM gaan, waar de Commodore 64 het programma en de variabelen opslaat. U kunt dan tegelijk zien hoe de computer een string van een variabele onderscheidt en hoe u met minder geheugenruimte toe kunt. Deze tocht door het BASIC-RAM is niet nodig om met de subroutine te werken, maar geeft u wel een beter idee van de werking van het programma. Tik eerst het volgende korte BASIC-programma in. Het stelt u in staat in het geheugen van de computer te kijken. 10 S=256: PRINT "{CLR}STARTADRES": INPUTZ 20 S$="**********************": T$="----------------------" 30 FOR X=Z TO (PEEK(55)+S*PEEK(56» PRINTCHR$(144)X,PEEK(X) SPC(2) CHR$(PEEK(X» 31 Y=X+1 35 U=PEEK(45) +S*PEEK(46): V=PEEK(47) +S*PEEK(48) W=PEEK(49)+ S*PEEK(50) 40 IF Y=U OR Y=V OR Y=W THEN PRINTS$ 45 IF X>=U AND Y<V THEN T=T+1: GOTO 47 46 T=O 47 IF T THEN IF T/7-INT(T/7)<.01 THEN PRINT T$ 50 WAlT 197,32: NEXT

151

Page 151: 16 Voor de 64

60 REM EINDE VAN PROGRAMMA NADERT

(Als u dit programma later weer wilt gebruiken, kunt u het op cassette of diskette opslaan.) Voer nu de volgende twee regels in directe modus (zonder regelnummers) in: AB=12.34: CD=-12.34: AB$="HALLO": AB%=1983: AB(l)=lll: CD(l)=-lll: AB%~l)=1024 AB$(l)="DAG" Druk na elke regel op RETURN, en voer nog wat meer in: DIMCD$(3,5,5): CD$(l,O,O)="NOU": CD$(2,0,0)="TABE": CD$(l,l,l)="DAN" Druk nogmaals op RETURN, en uw computer heeft minstens een voorbeeld van elke mogelijke variabele in RAM. Tik nu GOTO 10 en druk op RETURN. Tik niet RUN (want daardoor worden alle variabelen weer op nul ingesteld). U ziet nu een prompt aan de bovenkant van het scherm. Tik nu 2250.

Het programma en de spiegel De spatiebalk is uw stuurknuppel. Elke keer als u op de spatiebalk drukt, verschijnt er een regel met informatie in zwart op het scherm. Hou de spatiebalk ingedrukt totdat het scherm bijna vol is. Ga er eens rustig voor zitten en bekijk het resultaat. U kijkt nu naar het rondreis-programma, het programma dat u net ingetikt heeft. De geheugenadressen staan links, de inhoud van het adres staat telkens in het midden en rechts vindt u nog een stel interessante lettertekens. Een deel van deze tekens is zonder betekenis, want een CHR$-interpretatie van de inhoud van een geheugenlocatie is ongeldig en buiten de context als de locatie een sleutelwoord, een regelverbinding, een regelnummer of iets dergelijks bevat. Maar de meeste lettertekens zijn wel degelijk geldig. Het zijn herkenbare vertalingen van datgene wat u in het programma heeft geplaatst. We gaan ze eens nader bekijken. Druk nog een tijdje op de spatiebalk tot u bij adres 2377 gekomen bent. U zoekt nu naar het einde van het BASIC-programma. Dit wordt aangegeven door drie opeenvolgende nullen in de middelste kolom achter de adressen 2377 tot en met 2379. Het is niet zo moeilijk te vinden, door het 'uithangbord' dat door het REM-statement in regel 60 is gemaakt. Het eerste adres achter de drie nullen moet 2380 zijn. Dit adres is gemaakt door PEEK(45)+256*PEEK(46). Regel 35 van de routine stelt U gelijk aan dat adres. Hou de spatiebalk ingedrukt totdat 2380 bijna bovenaan het scherm is.

De opslag van variabelen U bevindt zich nu in het opslaggebied voor strings en variabelen. Alles in dit gebied is ingedeeld in clusters van zeven bytes. Om de gegevens goed leesbaar te maken, zijn de clusters gescheiden door schuine strepen. Zoek de letters A en B gevolgd door vijf andere bytes op (de cluster bevindt zich in de adressen 2380-2386). Deze eerste cluster van zeven bytes vormt de variabele AB. De eerste twee bytes zijn de variabelenaam. De volgende vijf bytes bevatten de waarde die u aan AB gaf, in de rekenkundige notatie met vlottende komma. Het is nu niet belangrijk dat u weet welke wiskunde hier bij komt kijken. Neem van mij aan dat de decimale waarde echt in deze vijf bytes opgeslagen is. De volgende variabele, CD (adressen 2387-2393), heeft dezelfde structuur. U stopte in CD dezelfde waarde als in AB, maar dan negatief, door er een min-teken voor te plaatsen. Kijk nu eens goed naar de vijf bytes die op de letters CD volgen. De bytes zijn bijna helemaal gelijk, maar de waarde van de vierde byte is 128 groter dan de waarde van de vergelijkbare byte van

152

Page 152: 16 Voor de 64

AB. Controleer dit door 128 af te trekken van de waarde van de byte in CD en dit te vergelijken met de waarde in de overeenkomstige byte in AB. Het hoogwaardige bit (bit 7) wordt in deze byte gebruikt als een teken; 0 voor positieve getallen en 1 voor negatieve getallen. Omdat het bit aangezet is (ingesteld op 1) in deze byte van CD, is de decimale waarde van de byte 128 (2 tot de macht 7) hoger. De computer negeert dit bit bij het reconstrueren van de waarde van CD, maar gebruikt het bit voor het vaststellen van het teken.

String-variabelen Druk weer op de spatiebalk en bekijk de volgende cluster. Deze geeft de inhoud van de variabele AB$. De A kunt u nog wel herkennen, maar waar is de B gebleven? Het geheim: het tweede teken van een stringnaam (in dit geval de B), wordt opgeslagen nadat er eerst 128 bij de normale CHR$-waarde van dat teken is opgeteld. Het is dezelfde truc als hierboven gebruikt wordt. De hoogwaardige bit is 'aan' gezet. Door te controleren of de hoogwaardige bit een 1 of een 0 is, kan de computer bepalen of de variabele een string variabele of een numerieke variabele met vlottende komma is. Geheugenadres 2395 heeft de waarde 194. Trek daar 128 vanaf en u krijgt 66. Dit is de CHR$-waarde voor de letter B van AB$. Nu weet de computer (doordat de hoogwaardige bit op 1 staat), dat de volgende byte (met de waarde 5 in dit voorbeeld), de lengte van de string AB$ geeft, en dat de volgende twee bytes aangeven op welk adres in het geheugen de lettertekens kunnen worden gevonden, die u aan de stringvariabele hebt toegekend (HALLO). Het adres wordt altijd opgegeven in de volgorde: laagwaardige byte, hoogwaardige byte (decimale adres=LB+256*HB). De computer kan nu naar dat adres springen en daar het opgegeven aantal lettertekens (5) lezen om vervolgens verder te werken met de string (als u daartoe opdracht had gegeven). De laatste twee bytes van de cluster bevatten nullen. Ze dienen om de cluster van zeven bytes

vol te maken. Het adres voor de lettertekens van de string, kan naar twee heel verschillende gebieden in het geheugen wijzen. Als de string in de directe modus is opgegeven, wordt de string met tekens opgeslagen aan de bovenkant van het BASIC-RAM-gebied. Als de string zijn tekens toegekend krijgt in een programma, wijst het adres naar de plaats in het programma waar de string zijn tekens krijgt toegekend. Omdat de lettertekens toch ergens in het programma voorkomen, hoeft de computer geen geheugenruimte te verspillen door de lettertekens ook nog eens elders in het geheugen op te slaan.

Een onleesbare naam Laten we verder gaan met onze ontdekkingsreis. In de volgende cluster is de variabelenaam niet te lezen. De symbolen die u ziet staan zijn een 'schoppen' en een verticale streep (adres 2401 en 2402). De waarden in deze twee bytes zijn 193 en 194. Trek van allebei 128 af en u vindt de CHR$-waarden voor de letters A en B van de integer-variabele AB%. Als allebei de lettertekens in een variabelen aam groter dan 127 zijn, weet de computer dat het om een integer-variabele gaat. Daarmee is gegeven dat er slechts twee bytes nodig zijn om de waarde van de variabele in op te slaan, en dat de laatste drie bytes van de cluster nullen bevatten. De bytes waar de waarde in staat, bevatten een binair getal met teken. Dat is een andere notatie dan u zag bij de variabelen met vlottende komma. U hoeft zich weer geen zorgen te maken over de wiskundige achtergrond hiervan. U heeft weinig profijt van de compacte manier waarop integer-variabelen worden opgeslagen, totdat u hen gaat gebruiken in arrays. Integer-arrays zijn zeer zuinig met geheugenruimte (twee bytes tegenover vijf bytes per

153

Page 153: 16 Voor de 64

element). Nu we het toch over arrays hebben, laten we eens naar een array-variabele kijken. Druk de spatiebalk in om verschillende clusters te passeren. U nadert nu het adres dat kan worden gevonden door PEEK (47) +256*PEEK (48). Daar begint de opslag van de arrays. U ziet vanzelf wanneer u daar bent aangekomen door de grenslijn en door de letters A en B in de rechterkolom. Het adres direct onder de rand moet 2478 zijn.

Opslag van arrays Er zijn drie soorten arrays, parallel aan de drie soorten normale variabelen: arrays met vlottende komma, integer-arrays en string-arrays. Elk van de ~ays kan mul ti-dimensionaal zijn, maar daar hebben we het later over. Uw Commodore 64 stelt u in staat arrays met maximaal 11 elementen (genununerd van 0 tot en met 10) te gebruiken zonder een DIM-statement. Er wordt echter geen ruimte voor de array gereserveerd totdat u een waarde toekent aan een van de array-elementen. Zodra u een waarde aan een van de elementen toekent, reserveert de computer ruimte voor een array met 11 elementen, zelfs als u maar 1 of twee elementen gaat gebruiken. U kunt de reservering van de geheugenruimte voor een array natuurlijk beinvloeden door het DIM-statement, zodat u minder of meer geheugenruimte kunt reserveren. Elke een-dimensionale array begint met een definitie-cluster van zeven bytes, gevolgd door net zoveel clusters als er ruimte is gereserveerd voor de array (als er niet geDIMensioneerd is, volgen er dus 11 clusters). De definitiecluster van zeven bytes bevat in de eerste twee bytes de naam van de array. De volgende twee bytes bevatten een verwijzing naar het begin van de volgende array. De vijfde byte bevat informatie over het aantal dimensies van deze array en de zesde en zevende byte geven het totaal aantal elementen in de array aan (in ons voorbeeld 11). Deze laatste twee bytes slaan het aantal elementen op in de volgorde: hoogwaardige byte/laagwaardige byte. De element-clusters die achter de definitie-cluster komen te staan, kunnen verschillende lengten hebben. Arrays waarin vlottende-kommagetallen worden geplaatst, hebben element-clusters van vijf bytes lang. Voor integer-arrays zijn de clusters twee bytes lang en voor string-arrays zijn de clusters drie bytes lang. De element-clusters bevatten dezelfde informatie als de clusters die bij de opslag van normale variabelen worden gebruikt. Nu zijn de 'opvul'-nullen weggelaten en worden de namen niet telkens vermeld.

Niet-gebruikte elementen met nullen Houd de spatiebalk ingedrukt totdat de eerste array, AB, het scherm bijna vult. Let op de cluster van zeven bytes in de geheugenadressen 2478-2484. Er achter staan vijf nullen, enkel en alleen omdat AB(O), het eerste element in de array, een waarde van nul heeft. De volgende vijf bytes geven de waarde aan die u aan AB(I) gaf. Het daarop volgende stel nullen geeft de resterende, niet-gebruikte, elementen van de array aan. Gebruik de spatiebalk om naar de array CD te kijken, en ga vervolgens naar de integer-array AB%. Beide arrays beginnen met een definitie-cluster van zeven bytes lang, gevolgd door 11 element-clusters van elk twee bytes lang. U ziet dat het werken met integer-arrays enorme hoeveelheden geheugenruimte bespaart. Tot slot van de een-dimensionale arrays ziet u de string-array AB$. Weer een definitie-cluster van zeven byte, nu gevolgd door 11 element-clusters van elk drie bytes. Elke element-cluster bevat een byte die de lengte van de string aangeeft en het adres waar de lettertekens van de string gevonden kunnen worden.

154

Page 154: 16 Voor de 64

De drie-dimensionale array We vervolgen onze weg door het geheugen. We komen dan bij het voorbeeld van een multi-dimensionale array. Nu wordt het wel wat lastiger. De definitie-cluster is nu langer dan zeven bytes. Voor elke extra dimensie moet de definitie-cluster twee bytes langer zijn. U kunt arrays maken met twee, drie, vier of meer dimensies, in elk formaat dat u wilt, zolang u maar genoeg geheugemuimte heeft. Het aantal dimensies van een array staat altijd vermeld in de vijfde byte van de definitie-cluster (in dit voorbeeld adres 2675). De volgende twee bytes bevatten het aantal elementen in de node dimensie (waarbij n het aantal dimensies van de array is). De daarop volgende twee bytes bevatten het aantal elementen in de (n-1)-de dimensie. De daar weer op volgende twee bytes bevatten het aantal elementen in de (n-2)-de dimensie. Dit gaat zo verder totdat het aantal elementen in de eerste dimensie is opgegeven in twee bytes. U moet een ° en een 6 in adres 2676 en 2677 zien. Zo'n zelfde paar in 2678 en 2679 en een ° en een 4 in de adressen 2680 en 2681. De 6,6 en 4 geven in omgekeerde volgorde aan dat u CD$ als een array (3,5,5) gedimensioneerd heeft (arrays beginnen altijd met 0). Onmiddellijk achter de definitie-cluster volgen in keurige volgorde de element-clusters. In dit voorbeeld, waarbij u CD$ geDIMensioneerd heeft met CD$(3,5,5), zal de volgorde van de clusters van drie bytes elk, zijn: CD$(O,O,O), CD$(l,O,O), CD$(2,0,0), CD$(3,0,0), CD$(O,l,O), CD$(l,l,O), CD$(2,1,0) .... etc. tot CD$(3,5,5). Als u door dit gebied loopt met hulp van de spatiebalk, zult u zien dat de clusters voor CD$(l,O,O) en CD$(2,0,0) bezet zijn met informatie. Als u doortelt, zult u zien dat de positie voor CD$(l,l,l) ook bezet is, zoals u met uw directe opdrachten opgegeven had. Net als bij gewone strings zijn de lettertekens die de inhoud van de strings vormen elders opgeslagen. Als u verder gaat met de spatiebalk, komt u bij de PEEK(49)+256*PEEK(50) grens. Voorbij deze grens komt u in het niet-gebruikte RAM-gebied. U moet niet vreemd opkijken als dit gebied niet echt leeg is. U kunt resten van andere programma's die met NEW zijn verwijderd, tegenkomen en her en der zwerven waarschijnlijk nog wat variabelen die door CLR gewist zijn. Om de tocht door RAM te beeindigen, drukt u op de RUN/STOP-toets en drukt u de spatiebalk in.

De routine om variabelen te dumpen Laten we nu dan maar de beloofde routine gaan uitproberen. Omdat de routine alle variabelen in een bepaald gedeelte van het geheugen neemt en naar een uitvoerapparaat stuurt, wordt deze subroutine een dump-routine genoemd. Tik NEW om het vorige programma te wissen, tik programma 1 in en SAVE het naar cassette of diskette. De dump-routine heeft zeer hoge regelnummers, omdat de routine ontworpen is om snel achter al bestaande programma's te worden geplakt. Tik in de directe modus een paar voorbeeld-variabelen in. Als u zo snel niets kunt verzinnen, kunt u de voorbeelden die we voor onze rondtocht gebruikten, weer intikken. Tik geen RUN in, maar tik: GOTO 44444 en RETURN. Uw variabelen worden nu allemaal weergegeven. De arrays worden pas weergegeven als u de spatiebalk indrukt. De dump-routine geeft de inhoud van de multi-dimensionale arrays niet weer. Dat zou niet zo moeilijk zijn, maar wel erg veel tijd kosten. De routine beperkt zich tot weergeven welke multi-dimensionale arrays er allemaal zijn en hoe groot ze zijn.

Het instellen van wijzers beinvloedt de routine Wis uw variabelen nu met CLR. Voer de volgende programmaregel in en RUN het programma.

155

Page 155: 16 Voor de 64

10 A$="HALLO": A=1983: AB$(2)="TOT ZIENS" Er gebeurt niet veel, want het programma stopt bij regel 44443, waar de subroutine wordt afgeschermd. Tik GOTO 44444 en druk op RETURN om de variabelen te kunnen bekijken. Nu komt een verrassing: druk nogmaals op GOTO 44444 en RETURN en u ziet een lijst van de variabelen zoals die gebruikt worden in de dump-routine. Dit gebeurt doordat regel 44444 bij de eerste keer dat deze regel wordt aangeroepen, de wijzers leest voordat ze worden veranderd om plaats te maken voor de interne variabelen van de routine. De tweede keer dat de routine wordt aangeroepen, wijzen de nieuwe wijzers naar een gebied dat mede het opslaggebied voor de routine-variabelen omvat. Als u de variabelen van de routine nooit te zien wilt krijgen, kunt u regel 44543 veranderen in: IF PEEK(ZZ)=90 THEN RETURN

De routine op maat maken U kunt de routine naar eigen smaak en behoeften aanpassen. Bijvoorbeeld: u gebruikt nooit de array- en integer variabelen. In dat geval kunt u de regel 44465, 44525 en alles vanaf regel 44700 verwijderen. Op die manier heeft u een veel kortere routine (slechts 800 bytes), die toch nog alle normale string- en vlottende-komma variabelen dumpt. Als u een van de gewone variabelen verwijdert, moet u ook de erbij horende array verwijderen. Door de REMs en spaties te verwijderen, krijgt u een zeer kleine routine (minder dan 600 bytes) die in de meeste gevallen zal voldoen. Programma 2 is zo'n ingekorte versie. Om deze dump-routine als een instrument voor het verwijderen van fouten uit het programma te gebruiken, moet u op verschillende punten in het programma STOP-statements plaatsen. Zodra het programma stilstaat, tikt u GOTO 44444, RETURN, en analyseert u de verschillende variabelewaarden. Om het programma weer verder te laten lopen, tikt u CONT, RETURN. Door het toevoegen van de juiste printer-opdrachten, kunt u de routine zelfs op papier laten dumpen.

Programma 1. Variabele-routine. Uitgebreide versie. Om de volgende programma's zonder fouten in te voeren, kunt u gebruik maken van de 'automatische controleur'. Zie bijlage C.

44440 rem laat variabelen zien :rem 21 44441 rem***start met goto 44444 :rem 20 44443 end:rem bescherm subroutine :rem 81 44444 zb=peek(47)+256*peek(48)-7:za= peek (45) +256*peek (46) :rem 185 44450 print"strings & [2xSPATIE]variab elen:":print"*********************"

:rem 178 44460 for zz=za to zb step 7 :rem 39 44465 if peek(zz»127 then gosub 447 10:goto44520 :rem integer variabelen

:rem 190 44470 if peek(zz+1)<128then gosub 44 543:goto44520 :rem drijvende komma va

156

Page 156: 16 Voor de 64

riabelen :rem 27 44475 rem*****string**************va riablen :rem 117 44480 gosub44485:goto44520 :rem 255 44485 printchr$(144)chr$(peek(zz))chr$ (peek(zz+1)-128)chr$(36)chr$(61);

:rem 76 44490 zy=peek(zz+3)+256*peek(zz+4):z x=peek(zz+2) :rem stringadres en leng te :rem 94 44495 ifzy=Othen44510 :rem 230 44500 for zO=lto zx:printchr$(peek(z y)); :zy=zy+1:nextzO :rem 234 44510 print:return :rem 165 44520 nextzz :rem 242 44525 gosub 44805:rem nu arrays doen

:rem 66 44530 print:printchr$(144)" .... varia belenlijst compleet":end 44540 rem***drijvende komma*****vari abelen 44543 ifpeek(zz)=90and(peek(zz+1)=65

: rem

: rem

or peek(zz+1)=66)then return : rem 44545 printchr$(144)chr$(peek(zz))chr$ (peek (zz+l)) chr$ (61); : rem 44550 zl=2 (mv) (peek (zz+2) -129) : rem 44560 z2=128:z3=256:z4=1 : rem 44570 z5=peek(zz+3) :ifz5>=128thenz5= z5-128: z4=-1 : rem 44575 j=peek(zz+4) :k=peek(zz+5) :l=peek (zz+6) : rem

4

30

148

198 251

62

123

179 44580 z9=zl+z5*zl/z2+j*zl/z2/z3+k*zl /z2/z3(mv)2+1*zl/z2/z3{mv)3 44590 printz9*z4 44600 return

:rem 145 :rem 222 :rem 222

44700 rem***integer***************va riabelen 44710 printchr$(144)chr$(peek(zz)-12 8)chr$(peek(zz+1)-128)chr$(37)chr$(6 1) ; 44720 z4=1:z7=peek(zz+2) :z8=peek(zz+ 3) 44730 ifz7 >127 then z7=255-z7:z8=25 6-z8:z4=-1 44740 z9=z7*256+z8:rem let op omgewi sselde volgorde hoge orde/lage orde bytes 44750 printz9*z4 44760 return 44800 rem*** array***************var iabelen 44805 ifzq=Othenza=0:gosub44550:za%= 0:gosub44720:zr=2:zq=2~zx=2:zy=2:z0=

157

: rem 190

:rem 12

: rem 29

: rem 25

:rem 186 :rem 220 : rem 229

: rem 48

Page 157: 16 Voor de 64

2 : rem 84 44806 rem stabilizeer Wl]Zer met bov enstaande dummy waarden :rem 241 44810 zz=peek(47)+256*peek{48) :ifzz= peek(49)+256*peek{50)thenreturn :rem 32 44815 print"geef spatie voor de arra ys":wait197,32 :rem 246 44820 ifpeek{zz+4)<>lthengosub45110: goto44820:rem multi-dimensioneel arr ay :rem 181

44825 ifpeek{zz»127thengosub44900:goto 44820:rem integer array :rem 104 44828 ifpeek{zz+1»127 then gosub450 10:goto44820:rem string array :rem 137 44829 rem*****drijvende komma*****ar ray : rem 34 44830 zq=zz:zz=zz+7 :rem 224 44840 for zr=O to peek (zq+6) +256*peek {zq+5)-1:rem **dim :rem 70 44850 printchr$(144)chr${peek(zq»chr$ (peek{zq+1»chr$(40)zrchr$(41)chr$(6 1); :rem 204 44860 zz=zz-2:gosub44550:zz=zz+2

:rem 2 44870 zz=zz+5 :rem 12 44880 nextzr:ifzz=peek(49)+256*peek( 50)then return : rem 108 44890 goto44820 : rem 68 44900 rem*****integer***********arra ys : rem 101 44910 zq=zz:zz=zz+7 : rem 223 44920 forzr=Otopeek{zq+6)+256*peek(z q+5)-1:rem**dim : rem 69 44930 printchr$(144)chr$(peek(zq)-12 8)chr$(peek(zq+1)-128)chr$(37)chr$(4 0) ; : rem 251 44940 printzrchr$ (41) chr$ (61) ; : rem 233 44950 zz=zz-2:gosub44720:zz=zz+2 : rem 1 44960 zz=zz+2 :rem 9 44970 nextzr:ifzz=peek(49)+256*peek( 50)then goto 44530 : rem 197 44980 return : rem 233 45000 rem*****string************arra ys :rem 80 45010 zq=zz:zz=zz+7 :rem 215 45020 for zr=O to peek(zq+6)+256*peek (zq+5)-1:rem **dim :rem 61 45030 printchr$(144)chr$(peek(zq»chr$ (peek(zq+1)-128)chr$(36)chr$(40);

45040 printzrchr$ (41) chr$ (61) ; 45050 zz=zz-2:gosub44490:zz=zz+2

158

:rem 42 :rem 225

Page 158: 16 Voor de 64

m 253 45060 zz=zz+3 45070 nextzr:ifzz=peek(49)+256*peek( 50)then goto 44530 45080 return 45100 rem**multi-dimensionele*****ar rays 45110 zx=2:zy=2:printchr$(43)peek(zz +4)"dimensioneel array:":printtab(5)

: rem 2

: rem 189 :rem 225

:rem 10

; : rem 89 45120 ifpeek(zz<127)thenprintchr$(peek (zz»; :goto45140 :rem 111 45130 printchr$(peek(zz)-128) ;:zx=l :rem 99 45140 ifpeek(zz+1)=Othen45170 :rem 176 45145 ifpeek(zz+1)=128thenzy=1:goto4 5170 45150 ifpeek(zz+1)<127thenprintchr$( peek(zz+1»;:goto45170 45160 printchr$(peek(zz+1)-128);:zy=

: rem 180

: rem 45

1 : rem 195 45170 ifzx=landzy=lthenprint"%";:goto 45190 45180 ifzy=lthenprint"$"; 45190 printchr$(40); 45200 z9=peek(zz+4) 45210 forz8=z9to1step-1:z7=peek(zz+4 +2*z8)+(peek(zz+4+2*z8-1»*256-1 45220 printz7; 45230 ifz8=lthenprintchr$(41) :goto45 250 45240 printchr$(44);:nextz8 45250 print 45260 zz=zz+peek(zz+2)+peek(zz+3)*25 6:ifzz=peek(49)+256*peek(50)then4453 o 45270 return

LISTING programma mini dump

: rem : rem :rem :rem

: rem : rem

122 17

129 84

254 86

:rem 115 :rem 140 :rem 141

: rem : rem

107 226

44443 end :rem minidump string en dri jvende komma getallen :rem 33 44444 zb=peek(47)+256*peek(48)-7:za= peek(45)+256*peek(46) :rem 185 44460 for zz=za to zb step 7 :rem 39 44470 if peek(zz+1)<128then gosub 44 543:goto44520 :rem 20 44480 gosub44485:goto44520 :rem 255 44485 printchr$(144)chr$(peek(zz»chr$ (peek(zz+1)-128)chr$(36)chr$(61);

:rem 76 44490 zy=peek(zz+3)+256*peek(zz+4):z

159

Page 159: 16 Voor de 64

x=peek(zz+2) :rem 168 44495 ifzy=Othen44510 :rem 230 44500 for zO=1to zx:printchr$(peek(z y)); :zy=zy+1:nextzO :rem 234 44510 print:return :rem 165 44520 nextzz :rem 242 44530 end :rem 215 44543 ifpeek(zz)=90and(peek(zz+1)=65 or peek(zz+1)=66)then return :rem 148

44545 printchr$(144)chr$(peek(zz))chr$ (peek(zz+1))chr$(61); :rem 198 44550 z1=2 (mv) (peek (zz+2) -129) : rem 251 44560 z2=128:z3=256:z4=1 :rem 62 44570 z5=peek(zz+3) :ifz5>=128thenz5= z5-128: z4=-1 : rem 123 44575 j=peek(zz+4) :k=peek(zz+5) :l=peek (zz+6) :rem 179 44580 z9=z1+z5*z1/z2+j*z1/z2/z3+k*z1 /z2/z3(mv)2+1*z1/z2/z3(mv)3 :rem 145 44590 printz9*z4 :rem 222 44600 return :rem 222

160

Page 160: 16 Voor de 64

BETER LEESBARE LISTINGS

Brent Dubach

Heeft u ooit geprobeerd om een belangrijke subroutine of lus in een BASIC-programmalisting te vinden? Dan weet u wel hoe vreselijk lastig dat soms kan zijn. Dit hoofdstuk geeft u een korte cursus in het gebruik van enkele slimme BASIC-technieken om uw programma's beter leesbaar te maken.

Het gebruik van zorgvuldig uitgekozen variabelenamen, maakt een groot verschil voor de leesbaarheid van een programmalisting. Maar het uitkiezen van een goede variabelenaam is in BASIC niet altijd even eenvoudig. U heeft vast wel eens een variabelenaam willen gebruiken, waarvan een BASIC-sleutelwoord een onderdeel vormde. Bijvoorbeeld: TOT AAL=G+H of PRINT FN$. Commodore BASIC geeft dan een foutmelding. Maar het is mogelijk om bepaalde BASIC-routines om de tuin te leiden, waardoor niet alleen dit soort namen wel zijn toegestaan, maar tevens het uiterlijk van de listings verbeterd kan worden. Laten we eerst kijken hoe deze techniek kan worden gebruikt, om daarna een blik te werpen op de werking.

Illegale variabelenamen De sleutel tot het gebruik van illegale variabelenamen is het gebruik van grafische tekens waar deze normaal gesproken niet worden gebruikt. U heeft waarschijnlijk al geleerd dat een grafisch teken gebruikt wordt als het laatste teken in een afgekort BASIC-statement. Als u bijvoorbeeld een P tikt, gevolgd door een SHIFT-O, ziet u de letter P, gevolgd door een grafisch teken. BASIC beschouwt deze combinatie als de afkorting voor POKE. Hoe zou BASIC reageren op het gebruik van een grafisch teken in het midden van een variabelen aam? 10 LET NJUMMER = 50 20 PRINT NJUMMER Om het grafische teken tussen de N en de U te krijgen, tikt u een SHIFT-J. U kunt elk gewenst grafisch teken gebruiken, zolang het resultaat maar geen afgekort BASIC-woord is (zo vormen een N en een SHIFT-E het woord NEXT). List nu het twee-regelige programma en u ziet het volgende op het scherm: 10 LET NUMMER = 50 20 PRINT NUMMER Run het programma: 50 READY Niet zo heel indrukwekkend. Het programma list en runt net als elk programma zonder grafische tekens. Laten we daarom iets doen dat echt verboden is op de Commodore 64: 10 LET LOTTO = 65 20 LET TOTAAL = 90 30 PRINT TOTAAL - LOTTO + 1 Als u dit programma invoert, krijgt u natuurlijk een syntax-error (fout in de grammatica). De lettervolgorde TO mag nooit binnen een variabelenaam voorkomen, zoals hier gebeurt in LOTTO en TOTAAL. TO is een gereserveerd BASIC-woord (te vinden in bijvoorbeeld: FOR J=1 TO 5). Maar nu gaan we BASIC foppen. U kunt een grafisch teken (e!,!n SHIFT-J) plaatsen vlak voor de letter die het BASIC-woord compleet maakt. In dit geval de 0 van TO.

161

Page 161: 16 Voor de 64

10 LET LOTTJO = 65 20 LET TJOTAAL = 90 30 PRINT TJOTAAL - LOTTJO + 1 Als u dit programma list, ziet u: 10 LET LOTTO = 65 20 LET TOTAAL = 90 30 PRINT TOTAAL - LOTTO + 1 Deze regels zien er hetzelfde uit als het verboden programma dat u hiervoor invoerde. Run het programma met de ingebouwde grafische tekens en zie wat er gebeurt: 26 READY Het programma werkt, terwijl er toch in elke regel een verboden variabelenaam zit Probeer dit effect ook met andere namen uit, zoals: LETTER, FN$, FORT, ONDER of uw eigen favoriete verboden variabelenaam. Een enkele waarschuwing: ST, TI en TI$ zijn gereserveerde variabelen amen en niet gereserveerde BASIC-woorden als LET, PRINT en andere BASIC opdrachten of functies. Het gebruik van variabelenamen waarvan de eerste twee letters hieraan gelijk zijn (zoals START of TUD), is, zelfs met de hier beschreven techniek, niet toegestaan. U kunt deze variabelenamen wel binnen een andere variabelenaam gebruiken, zonder speciale trucjes.

Listings met inspringen en blanko regels Niet alleen bepaalde variabelenamen zijn verboden in BASIC, maar ook het inspringen van programmaregels en blanco programmaregels zijn niet toegestaan. Het is daardoor niet mogelijk om lussen, subroutines of IF .. THEN .. mogelijkheden in een programma duidelijk af te laten steken. Als u alleen aan BASIC bent gewend, zult u dit wellicht niet als een gemis ervaren, maar iedereen die ooit in bijvoorbeeld Pascal geprogrammeerd heeft, weet hoe prettig het is om een listing te hebben die er zo uit ziet: 10 FOR 1=1 TO 10 20 PRINT "WE LATEN ELKE REGEL" 30 PRINT "DIE BINNEN DE FOR .. NEXT-LUS" 40 PRINT "LIGT, INSPRINGEN." 50 NEXT I 60 70 PRINT "MET EEN BLANCO REGEL TUSSEN DE BLOKKEN"

Probeer dit programma op uw 64 in te voeren. Het resultaat wordt: 10 FOR 1=1 TO 10 20 PRINT "WE LATEN ELKE REGEL" 30 PRINT "DIE BINNEN DE FOR .. NEXT-LUS" 40 PRINT "LIGT, INSPRINGEN." 50 NEXT I 70 PRINT "MET EEN BLANCO REGEL TUSSEN DE BLOKKEN"

De blanco regel en alle spaties aan het begin van de regels, zijn verdwenen. Het is natuurlijk wel mogelijk een enkele komma aan het begin van een regel te plaatsen, met daarachter zoveel spaties als u wilt, maar dat is niet hetzelfde als een blanco regel. Ook nu kunt u door een grafisch teken te gebruiken, BASIC om de tuin leiden. Bij het intikken van een

162

Page 162: 16 Voor de 64

programma, tikken de meeste mensen een spatie achter het regelnummer om het programma beter leesbaar te maken. Tik nu, in plaats van de spatie, een SHIFT-J. Voer bovenstaand programma nogmaals in. 10JFOR 1=1 TO 10 20J PRINT "WE LATEN ELKE REGEL" 30J PRINT "DIE BINNEN DE FOR .. NEXT-LUS" 40J PRINT "LIGT, INSPRINGEN." 50JNEXT I 70JPRINT "MET EEN BLANCO REGEL TUSSEN DE BLOKKEN"

Als u nu LIST tikt, ziet u een inspringende vorm, zoals u eerst probeerde in te voeren. Het is iets moeilijker om BASIC een blanco regel te laten geven. Een enkele SHIFT -J is niet voldoende. Als u bijvoorbeeld regel 99 aan uw programma toevoegt en alleen het grafische teken op die regel zet, zal regel 99 niet in de listing verschijnen. Probeert u het volgende maar eens (let op de spatie tussen de twee SHIFT-J's): 99 J J Tik nu LIST en u ziet een blanco regel 99.

De keerzijde van de medaille Er zijn ook wel nadelen aan dit alles verbonden. Het meest opvallende nadeel is uiteraard het geheugengebruik. Lange variabelenamen en inspringen kosten veel geheugenruimte. Daar staat tegenover dat de uiteindelijke versie van de routine, verkort kan worden door een listing-prop-programma (een programma dat de listing in elkaar duwt), terwijl het origineel als leesbare versie overblij ft om later herlezen of verbeterd te worden. En met de Commodore 64 hoeft u zich bijna nooit zorgen te maken over de hoeveelheid geheugen die u gebruikt. Een ander nadeel is dat u eraan moet denken om de extra tekens in te tikken. Vooral als u regels gaat verbeteren moet u erop letten dat er extra tekens in de regel voorkomen. Om het inspringen te bewaren, moet u, elke keer dat u een regel verbetert, een SHIFT -J aanbrengen in plaats van de spatie achter het regelnummer. En het is niet moeilijk om het aanbrengen van het grafische teken binnen een variabelenaam bij het verbeteren een keer te vergeten. U wordt daar door de syntax-error vanzelf aan herinnerd. Wees voorzichtig bij het verbeteren van het programma. Als u een 'opschieten' typist(e) bent, zult u al die extra tekens maar knap vervelend vinden. Maar een klein beetje moeite bij het intikken, leidt tot grote voldoening als u beter leesbare programma's krijgt.

De werking Er zijn speciale BASIC-routines die een programma listen en runnen. Als u de bovenstaande voorbeelden, of uw eigen experimenten heeft geprobeerd, zult u hebben bemerkt dat de RUN-opdracht het niet erg vindt als er BASIC-woorden in variabelenamen staan, en dat de LIST-opdracht spaties voor een inspringende regel accepteert. Als deze routines zo tolerant zijn, waarom moeten we dan zo moeilijk doen om deze resultaten te bereiken? Het antwoord ligt in het gedrag van andere onderdelen van BASIC.

Is het wel verboden? Laten we eerst eens kijken naar de illegale variabelenamen en een BASIC-routine die we TOKENIZE (van het Engelse woord TOKEN = afkorting van gereserveerd BASIC-woord) zullen noemen.

163

Page 163: 16 Voor de 64

Als wij aan BASIC-opdrachten als INPUT, LET of GOTO denken, denken we aan complete woorden in het Engels. Maar de RUN-routine ziet deze opdrachten heel anders. Tegen de tijd dat de RUN-routine een programma te zien krijgt, zijn de BASIC-sleutelwoorden vervangen door numerieke codes van een byte lang. Deze codes worden tokens genoemd. TOKENIZE is het onderdeel binnen BASIC dat zorg draagt voor de vertaling van de sleutelwoorden in tokens. Als u bijvoorbeeld het woord INPUT intikt, neemt TOKENIZE de verschillende letters uit dat woord, vergelijkt ze met een woord in de lijst met BASIC-sleutelwoorden die zich in de computer bevindt, en vervangt de letters vervolgens door het token voor INPUT (het getal 133). Dit token neemt maar een enkele byte geheugenruimte in beslag, waardoor een sterke besparing op het geheugengebruik verkregen wordt. TOKENIZE negeert tevens alle niet juist geplaatste grafische tekens als het een BASIC-opdracht vertaalt. Daar maken wij gebruik van als we verboden variabelenamen maken. Wat gebeurt er als u een grafisch teken (als de SHIFT-J) in het midden van een sleutelwoord plaatst? Kan TOKENIZE het sleutelwoord vinden? Niet helemaal. Bij het verzamelen van de letters, wordt de routine onderbroken voordat het gehele sleutelwoord gevonden is. Het woord dat tot dan toe samengesteld is uit de letters, past bij geen enkel woord uit de lijst. Maar het letterteken (het grafische teken) dat voor de onderbreking zorgde, wordt eruit gegooid. Als RUN nu met het programma bezig gaat, vindt deze routine het volledige sleutelwoord (het grafische teken is immers verwijderd). RUN vindt het woord als opeenvolgende letters en niet als een token. De TOKENIZE-routine heeft het woord immers niet veranderd. RUN beschouwt de letters dus als variabelenaam. Onze verboden variabelenamen zijn eigenlijk helemaal niet verboden. U moet alleen de TOKENIZE-routine tijdelijk om de tuin leiden.

Vind de juiste routine Hoe zit het nu met de grafische tekens aan het begin van inspringende regels? Opnieuw speelt TOKENIZE een rol. Nu omdat de routine precies doet, wat u wilt dat er gedaan wordt: spaties worden op de door u aangegeven plaats gezet. Verschillende andere onderdelen van BASIC gebruiken een routine die spaties negeert. Een van deze routines is de routine die de lettertekens in een door u getikt regelnummer vertaalt in een numerieke code die door BASIC gebruikt gaat worden. Probeert u maar eens om een regelnummer op te geven met spaties tussen de getallen. De computer heeft er geen enkel probleem mee. De routine negeert de spaties en vertaalt de lettertekens in een numerieke code. BASIC gaat net zo lang verder met het negeren van spaties totdat een letterteken dat geen getal is, wordt gevonden. Daarna wordt de rest van de regel overgedragen aan de TOKENIZE-routine. Maar dan is voor ons het kwaad al geschied. Alle spaties die voor een inspringende regel zorgden, zijn verwaarloosd, en door de routine verwijderd. De tactiek is nu om direct achter het regelnummer een letterteken te zetten, zodat de regelonmiddelljk wordt overgedragen aan de TOKENIZE-routine. We gebruiken een grafisch teken. Dat is niet een getal, dus de routine die de regelnummers vertaalt, geeft de rest van de regel door aan de TOKENIZE-routine. De TOKENIZE-routine, negeert op zijn beurt het grafische teken, zodat het teken in de listing niet is te zien.

De bIanco's bewaken U herinnert zich dat een blanco regel met regelnummer gemaakt werd door een grafisch teken, een spatie en weer een grafisch teken. De reden voor het eerste grafische teken is hierboven

164

Page 164: 16 Voor de 64

gegeven. Een spatie is nodig, omdat er toch iets in de regel moet staan voor TOKENIZE om te herkennen. Als TOKENIZE een regel tegenkomt waar helemaal niets op staat, haalt de routine de hele regel uit het programma. Maar waarom is het tweede grafische teken nog nodig? Als TOKENIZE geen bezwaar heeft tegen spaties, waarom accepteert hij dan geen regel vol met spaties na het eerste grafische teken? In de eerste plaats is een spatie genoeg. Het zou vervelend zijn om een hele regel met spaties in te moeten tikken. Ten tweede komt TOKENIZE toch nooit toe aan de andere spaties. Een van de eerste routines die BASIC gebruikt, haaIt zoveel mogelijk spaties weg, dat wil zeggen dat ook spaties aan het einde van een regel verwijderd worden. Het tweede grafische teken is ervoor om te zorgen dat de spatie tussen de tekens in, niet door deze routine wordt verwijderd. De grafische tekens dienen als een soort hekjes. Als u perse een regel met een heleboel spaties wilt, kunt u rustig uw gang gaan. U kunt bijvoorbeeld best een regel maken met 70 spaties. Als u er maar voor zorgt dat de spaties aan allebei de kanten afgesloten worden door een hek in de vorm van een grafisch teken.

165

Page 165: 16 Voor de 64
Page 166: 16 Voor de 64

REDDINGSBRIGADE 64

Redt verloren programma's! VernBuis

Als u ooit een programma verloren bent door per ongeluk NEW in te tikken. is dit hoofdstuk voor u bedoeld. De korte machinetaalroutine voor de Commodore 64 biedt u een eenvoudige methode om BASIC-programma's die zijn 'gewist', te redden. Het programma heeft slechts tien seconden nodig om te laden en te werken.

Vroeger of later, heus het overkomt ook u, denk u dat u een programma al op diskette of cassette gezet heeft. U tikt NEW om met iets anders te beginnen, en bijna gelijk met het indrukken van de RETURN-toets, rolt u gillend van uw stoel en over de grond. Gelukkig betekent het tikken van NEW bij de Commodore niet dat het programma helemaal uit het geheugen is gehaald. NEW zorgt er alleen voor dat de computer (en de programmeur) denkt dat het programma is verdwenen. Zolang u niet begint met het intikken van een nieuw programma, of de computer uitzet, is het programma nog steeds ergens in het geheugen opgeslagen. Om het programma weer terug te krijgen, hoeft u er alleen maar voor te zorgen dat de computer zich herinnert waar in het geheugen het programma begint en eindigt. Deze taak nu, neemt Reddingsbrigade 64' op zijn schouders. Door deze korte machinetaalroutine onmiddellijk na het begaan van de vreselijke vergissing, te laden en runnen, kunt u het programma redden, en uzelf daarmee uren werk en een zeer slecht humeur besparen.

Invoeren van de reddingsbrigade Reddingsbrigade is gelist als een BASIC-lader. Dat is een BASIC-programma dat een machinetaalprogramma maakt. Lees de volgende instructies goed door, voordat u het programma intikt. De procedure is anders dan u gewend bent en eist het precies opvolgen van bepaalde stappen. Als u met cassettes in plaats van diskettes werkt, moet u eerst regel 60 als volgt invoeren: 60 CLR: SAVE"UNNEW",l,l N adat u de listing ingetikt heeft, moet u deze niet runnen. Eerst moet het programma opgeslagen worden op cassette of diskette met een bestandsnaam. U kunt elke naam gebruiken (bijvoorbeeld "REDDING" of"UNNEW/BASIC", maar de naam "UNNEW" mag u niet gebruiken. Deze is gereserveerd voor het programma. Tik nu RUN in. De BASIC-lader creert het machinetaal-programma en slaat het automatisch op cassette of diskette op, onder de naam "UNNEW". Dit laatste machinetaal programma zult u in feite gaan gebruiken om verloren programma's te redden. De BASIC-lader kunt u opzij leggen als reserve, voor het geval u nog eens een kopie van het machinetaal programma nodig heeft.

Gebruik van de reddingsbrigade Laten we er even vanuit gaan dat u net NEW getikt heeft en daarmee urenlange arbeid vernietigd heeft (om de reddingsbrigade te testen, kunt u een programma van diskette of cassette Iaden, en het vervolgens wissen met NEW). Terughalen van het programma is uiterst eenvoudig. Eerst laadt u reddingsbrigade van cassette door: LOAD "UNNEW",l,l

167

Page 167: 16 Voor de 64

Van diskette door: LOAD "UNNEW",8,1 In beide gevallen is het laden zeer snel gebeurd, omdat het programma zeer kort is. Om de reddingsbrigade aan het werk te zetten tikt u: SYS 525 (RETURN) CLR (RETURN) In dit geval betekent CLR dat u het BASIC-woord CLR in moet tikken, en niet dat u op de CLRJHOME-toets moet drukken. Dat is alles. Als u nu LIST intikt, ziet u dat het verloren gewaande BASIC-programma weer veilig en wel op het scherm verschijnt. De reddingsbrigade blijft nog een tijdje in de buurt (in de computer), maar waarschijnlijk niet lang. Het programma bevindt zich in onbeschermd geheugengebied (locaties die gebruikt worden door de invoerbuffer en de BASIC-interpreter). Heeft u de reddingsbrigade weer nodig, dan moet u het programma opnieuw oproepen. Laten we hopen dat dit niet vaak nodig zal zijn.

Waarom het werkt De Commodore 64 wist een programma na NEW niet uit het geheugen, maar verandert twee wijzers zodanig dat het bedrijfssysteem het programma niet meer ziet. De wijzers geven aan waar in het geheugen een programma begint en eindigt. NEW verplaatst de begin-programma-wijzer naar de onderkant van het BASIC-geheugen en de eerste twee bytes van het BASIC-geheugen worden op nul gezet. Deze twee bytes dienen als wijzer naar het adres van de tweede regel met BASIC-code. Als deze op nul staan, denkt het bedrijfssysteem dat er geen programma in het geheugen aanwezig is. De reddingsbrigade werkt door de eerste twee bytes van het BASIC-geheugen (de adres-wijzer) en de volgende twee bytes (BASIC-regelnummer) over te slaan. Vervolgens wordt gezocht naar de eerst lege byte. Deze geeft het einde van een regel aan. Zodra deze is gevonden, POKEt de routine het adres-plus-een in de BASIC-wijzer naar de tweede regel. Een van de twee veranderde wijzers is daarmee hersteld. Nu zoekt de reddingsbrigade byte-voor-byte het BASIC-geheugen af naar drie opeenvolgende nul-bytes. Deze geven het einde van het programma aan. Zodra deze gevonden zijn, POKEt de routine het adres van de derde nul-byte plus een in de wijzer die de bovenkant van het BASIC-gebied en het begin van het variabelengebied aanwijst. Deze wijzer staat op de locaties 45 en 46. Hiermee is ook de tweede wijzer hersteld. Zij die de reddingsbrigade op een veiliger plaats in het geheugen willen hebben, bijvoorbeeld om de routine altijd bij de hand te hebben, of om de routine met andere routines te combineren, kunnen dat zonder veel problemen doen. De routine is zo geschreven dat hij eenvoudig verplaatsbaar is. Er komen geen absolute JMP- of JSR-instructies in de routine voor. Wij hebben voor speciaal dit geheugengebied gekozen om te zorgen dat de routine eenvoudig geladen kon worden, en om het risico te vermijden dat de routine over het BASIC-programma heen geschreven zou worden.

Reddingsbrigade 64 Om dit programma zonder fouten in te voeren, kunt u gebruik maken van de 'automatische controleur'. Zie bijlage ..

168

Page 168: 16 Voor de 64

10 i=525 : rem 131 20 reada:ifa=256then40 : rem 54 30 pOkei,a:i=i+1:goto20 : rem 130 40 poke43,525 and 255:poke44,2 :rem v uI ondergrens 'old' programma in

: rem 214 50 poke45,578 and 255:poke46,2 :rem v uI bovengrens 'old' programma in

: rem 229 60 clr:save"0:old",8 : rem 161 70 rem tape gebruikers save"old",l,l

:rem 116 525 data160,3,200,177,43,208,251

: rem 82 532 data200,200,152,160,0,145,43

: rem 64 539 data165,44,200,145,43,133,60

: rem 87 546 data160,0,132,59,162,0,200 :rem 231 553 data208,2,230,60,177,59,208 : rem 45 560 data245,232,224,3,208,242,200

: rem 126 567 data208,2,230,60,132,45,164 :rem 37 574 data60,132,46,96,256 : rem 220

169

Page 169: 16 Voor de 64
Page 170: 16 Voor de 64

KOPIEBESTAND

Gregor Larson

Het kopieeren van bestanden. zowel BASIC- als machinetaalprogramma's. is eenvoudig en snel met dit programma. Een korte machinetaalroutine stelt u in staat om bestanden te kopieeren met slechts een diskdrive.

Een van de nadelen van een enkele diskdrive is de onmogelijkheid om bestanden van de ene diskette naar de andere te kopieeren. BASIC-programma's kunnen nog gekopieerd worden door ze eerst te laden en vervolgens op de andere diskette op te slaan door SAVE. Sequentiele bestanden, bijvoorbeeld machinetaalprogramma's kunnen zo echter niet worden gekopieerd. Het programma 'Kopiebestand' biedt u wel de mogelijkheid om bestanden van de ene diskette naar de andere te kopieeren. Het hele bestand wordt in het geheugen van de computer geladen, waarna de computer wacht tot u op de C-toets drukt. Vervolgens wordt het hele bestand weer naar een diskette weggeschreven. Het programma is helemaal in machinetaal geschreven en daardoor erg snel. Het geheugen van de 64 wordt zeer effectief gebruikt, waardoor bestanden tot ruim 170 blokken kunnen worden gekopieerd.

Invoeren en gebruiken Om Kopiebestand in te tikken, kunt u het MTR-programma uit bijlage ... gebruiken. MTR is een programma dat het invoeren van ingewikkelde machinetaalprogramma's eenvoudiger maakt. Lees eerst de instructies in de bijlage, voordat u begint met het intikken van Kopiebestand. Omdat Kopiebestand en MTR gedeeltelijk van hetzelfde geheugengebied gebruik maken, moet u, voordat u MTR gebruikt, een directe POKE-opdracht (zonder regelnummer) invoeren. Deze opdracht zorgt ervoor dat BASIC verplaatst wordt. POKE 44,PEEK(44)+2: POKE(PEEK(44»*256,0: NEW Als u Kopiebestand niet in een keer intikt (hetgeen niet erg waarschijnlijk is, want het programma is erg kort), moet u bovenstaande regel elke keer voordat u MTR gebruikt opnieuw intikken. Nadat u de POKE-opdracht gegeven heeft en MTR geladen heeft, kunt u dit programma runnen. Het MTR-progranlllla vraagt u om een begin- en eindadres. Dit z~ji1: Beginadres: 2049 Eindadres: 2300 Nu kunt u beginnen met het intikken van de getallen uit de listing van Kopiebestand. Zodra u daarmee klaar bent, moet u het programma door middel van SAVE op de diskette opslaan. Zo, u kunt nu elk bestand kopieeren. Om Kopiebestand te gebruiken, laadt u het door middel van LOAD en voert u RUN in. Stop de juiste diskette in de diskdrive en voer de naam van het te kopieeren bestand in. De bestandsnaam moet een van de volgende vormen hebben: - bestandsnaam voor een PRG (programma) bestand - bestandsnaam,S voor een SEQ (sequentieel) bestand - bestandsnaam,U voor een USR (gebruikers) bestand

De bestandsnaam hoeft niet tussen aanhalingstekens te worden geplaatst. Als u de soortaanduiding van het bestandweg laat, gaat Kopiebestand er van uit, dat u een programmabestand bedoelt. Als er iets misgaat bij het laden van het bestand, krijgt u een foutmelding en stopt het programma. Als alles goed gaat, wordt het bestand in het geheugen

171

Page 171: 16 Voor de 64

van de computer geladen. Als de drive ophoudt met draaien, kunt u de diskette eruit halen, en de diskette waar de kopie op terecht moet komen, in de drive stoppen. Druk dan op de C-toets. Het bestand wordt dan op de diskette geplaatst, waarbij de originele naam van het bestand gebruikt wordt. Ook een fout bij het wegschrijven van de kopie zal met een foutmelding kenbaar gemaakt worden. Het programma stopt en wacht op het indrukken van de C-toets om het nog een keer te proberen, of de RUN/STOP-toets om het programma te verlaten. Als er nergens iets fout is gegaan, heeft u nu een werkbare kopie van uw origineel. U kunt ook verschillende kopieen van een enkel origineel maken, door telkens na het wegschrijven van de kopie, op de C-toets te drukken. U dient dan wel eerst de diskette te hebben gewisseld. Door RUN/STOP in te drukken, stopt het programma. Door RUN in te tikken, kunt u het volgende bestand kopieeren.

Kopiebestand

2049 :029,008,010,000,158,050,000 2055 :048(~55,057,058,040,067,076

2061 :041,0,32,049,057,056,051,043 2067 :032,067,079,077,080,085,183 2073 :084,069,033,000,000,000,211 2079 :169,054,133,001,160,000,036 2085 :032,207,255,201,013,240,217 2091 :006,153,000,002,200,208,100 2097 :243,132,063,032,210,255,216 2103 :160,002,032,179,008,032,212 2109 :207,008,208,065,162,002,201 2115 :032,198,255,160,000,032,232 2121 :183,255,041,064,208,012,068 2127 :032,228,255,145,251,200,166 2133 :208,002,230,252,208,237,198 2139 :132,061,165,252,133,062,128 2145 :164,063,169,044,153,000,178 2151 :002,200,169,087,153,000,202 2157 :002,200,132,063,032,207,233 2163 :008,032,240,008,032,228,151 2169 :255,201,067,240,014,201,075 2175 :003,208,245,032,240,008,095 2181 :169,055,133,001,108,002,089 2187 :160,160,001,032,179,008,167 2193 :032,207,008,208,219,162,213 2199 :002,032,201,255,160,000,033 2205 :177,251,032,210,255,200,002 2211 :208,002,230,252,196,061,088 2217 :208,242,165,062,197,252,015

172

Page 172: 16 Voor de 64

2223 :208,236,240,190,169,002,196 2229 :162,008,032,186,255,165,221 2235 :063,162,000,160,002,032,094 2241 :189,255,032,192,255,169,005 2247 :249,133,251,169,008,133,118 2253 :252,096,169,008,032,180,174 2259 :255,169,111,032,150,255,159 2265 :032,165,255,201,048,240,134 2271 :015,208,003,032,165,255,133 2277 :072,032,210,255,104,201,079 2283 :013,208,244,168,096,169,109 2289 :002,032,195,255,032,231,220 2295 :255,096,013,013,013,013,138

173

Page 173: 16 Voor de 64
Page 174: 16 Voor de 64

PROGRAMMEREN ZONDER TOETSENBORD

Programmeren met een verbeterde joystick George Leotti

Het gebruik van het toetsenbord van een computer is niet voor iedereen even gemakkeljk. Sommigen met een lichamelijke handicap, kunnen het toetsenbord zelfs helemaal niet gebruiken. Maar met het programma in dit hoofdstuk, kan de joystick het toetsenbord helemaal vervangen. Het programma is niet alleen geschikt voor lichamelijk gehandicapten, ook kinderen zijn niet altijd gewend aan het toetsenbord. Een joystick ziet er vaak minder bedreigend uit.

Ik ben zelf lichamelijk gehandicapt, dus ik weet hoe het voelt om iets te willen, dat niet voor je is weggelegd. Toen mijn vriend Marc een keer opmerkte dat hij niet langer dan 15 minuten kon tikken, voordat de vermoeidheid hem verder tikwerk onmogelijk maakte, werd het idee voor eenjoystick-programmeer-programma (JPP) geboren. Marc heeft een spieraandoening die ervoor zorgt dat zijn spieren veel te snel vermoeid raken. lPP vormt niet alleen voor hem, maar voor alle mensen die geen computer konden gebruiken doordat het toetsenbord een barriere was, de sleutel tot computergebruik. Ik draag lPP op aan Marc Goldberg. lPP, wat is dat? Om het eenvoudig te houden; JPP is een machinetaalprogramma dat de gebruiker de mogelijkheid biedt om in BASIC te programmeren door middel van een aan poort 2 aangesloten joystick.

Slechts een keer het toetsenbord Om lPP in te voeren, moet natuurlijk wel een keer het toetsenbord gebruikt worden. Dat klinkt onmogelijk (u wilt iets gebruiken in plaats van het toetsenbord, maar u heeft het toetsenbord nodig om dat iets te maken), maar daar is helaas niets aan te doen. Er zal altijd wel iemand met snelle vingers bereid zijn het programma in te tikken. Om het intikken van lPP gemakkelijker te maken, kunt u het MTR-programma gebruiken. Lees eerst bijlage E en tik het MTR-programma in. Zorg dat het MTR-programma op cassette of diskette staat, voordat u begint met het invoeren van JPP. Nadat u MTR geladen en gerund heeft, vraagt dit programma om twee adressen. De adressen die bij JPP horen, zijn: Beginadres: 49152 Eindadres: 51413 Tik programma 1 in. Gebruik de SAVE-mogelijkheid van MTR om het programma op cassette of diskette te zetten. Laad JPP, waarbij u de volgende vorm gebruikt: LOAD "bestandsnaam",8,1 (diskette) LOAD "bestandsnaam",l,l (cassette) Zodra lPP geladen is, tikt u SYS 49152 en vervolgens NEW. Het programma is nu onmiddellijk voor gebruik beschikbaar.

Het menu Als lPP werkt, zijn de bovenste tien regels van het scherm gereserveerd voor een menu waaruit u kunt kiezen bij het maken van een BASIC-programma. Er zijn continue twee cursors op het scherm aanwezig. De normale knipperende cursor van BASIC en een niet-knipperende cursor voor het menu. Om verwarring te voorkomen, en om

175

Page 175: 16 Voor de 64

te zorgen dat het menu er netjes uit blijft zien, kan geen van beide cursors in het andere gebied terechtkomen. Als u de cursor naar de thuispositie stuurt, springt hij dan ook niet naar de linker bovenhoek van het scherm, maar naar de eerste positie op regel1l. Om een keuze uit het menu te maken, verplaatst u de menucursor door de joystick in de juiste richting te duwen, totdat de menucursor op het gewenste letterteken, sleutelwoord of symbool staat. Druk dan op de vuurknop. Het gekozen object zal op de plaats van de BASIC-cursor in de onderste helft van het scherm afgebeeld worden. Het menu is dynamisch. Dat wil zeggen dat het menu niet altijd hetzelfde is, maar reageert op invoer van de joystick. De verschillende onderdelen van het menu zijn: ASCII-codes De bovenste regel van het menu bevat de lettertekens met ASCII-codes van 33 tot en met 95. Hier komt het dynamische karakter van het menu gelijk van pas. Er zijn 63 lettertekens, maar het scherm is slechts 40 posities breed. Door de cursor helemaal naar links of helemaal naar rechts te verplaatsen, zullen de lettertekens verschuiven, en daardoor plaats maken voor de lettertekens die 'buiten' het scherm staan. Bijvoorbeeld: na het runnen van JPP staat de cursor op ASCII-letterteken 33 (het uitroepteken), in de linker bovenhoek van het scherm. Door de joystick eenmaal naar links te drukken, verschuiven alle lettertekens een plaats naar rechts. Onder de cursor staat nu het letterteken ASCII 95 (pijl links). Als u de joystick naar links (of aan de andere kant van het scherm, rechts) blijft drukken, zullen de lettertekens langs blijven rollen. BASIC-woorden De tweede regel bevat alle BASIC-woorden die de Commodore bevat in alfabetische volgorde. De openingshaakjes zijn bij de statements die dat nodig hebben al opgenomen (ASC(, SQR(, LEFT$(, etc.). Het teken voor aantal (een hekje) is opgenomen bij opdrachten die dat nodig hebben (pRINT#, GET# en INPUT#). De gereserveerde variabelen ST, TI en TI$, zijn onder hun volledige spelling opgenomen (TIME$ bijvoorbeeld). Deze tweede regel rolt net als de eerste regel op en neer. Omdat er veel meer tekens op deze regel moesten (door het grote aantal BASIC-woorden), kan het wel even duren, voordat de hele regel voorbijgerold is. Om de zaak te versnellen, kunt u, nadat het rollen begonnen is, de vuurknop indrukken. De woorden vliegen nu voorbij, maar het is nog net mogelijk om een idee te krijgen van het punt waar u in de lijst bent, zodat u weet wanneer u de vuurknop weer los moet laten. Als u de joystick loslaat voordat u de vuurknop loslaat, kan het gebeuren dat u een woord laat afdrukken op de onderste helft van het scherm, terwijl dat niet de bedoeling was. Dit brengt ons bij de volgende regel. Speciale toetsen De derde regel wordt gebruikt voor de speciale toetsen van het toetsenbord van de 64. Deze toetsen zijn: RETURN, SPATIE, cursortoetsen omhoog, omlaag, links en rechts, CLR, HOME, INST en DEL. Deze toetsen werken in het programma precies zo als de werkelijke toetsen, behalve dat u de normale tekstcursor niet boven regel 10 kunt plaatsen. Funktietoetsen Op de vierde regel vindt u de funktietoetsen, die zich op de Commodore 64 rechts van het toetsenbord bevinden. Op dezelfde regel vindt u de letters BBC. De eerste B staat voor de rand (border), de tweede B staat voor de achtergrond (background) en de C staat voor de lettertekens (character). Door de menucursor op een van deze letters te plaatsen en de vuurknop van de joystick in te drukken, kunt u de kleur van deze elementen veranderen. Tevens staan op de regel de afkortingen COMDRE en CTRL. Deze geven de Commodore- en besturingstoetsen (CTRL) aan. Door eerst met de menucursor ofwel de Commodore-toets ofwel de CTRL-toets te kiezen en vervolgens met de menucursor een van de lettertekens van de bovenste regel te kiezen,

176

Page 176: 16 Voor de 64

wordt het letterteken afgedrukt alsof u eerst op de Commodore- of CTRL-toets gedrukt heeft. Gebruik deze combinatie alleen voor een enkele keer indrukken van een toetscombinatie. SHIFT en AUTO Regel vijf geeft SHIFT, LOCK, COMDRE, CTRL, AUTO en OFF aan. SHIFT werkt als COMDRE en CTRL op regel vier, maar nu wordt een SHIFT-letterteken afgedrukt. LOCK, COMDRE en CTRL van regel vijf zorgen voor een vaste SHIFT, COMMODORE-toets of CTRL-toets. Als u een van deze woorden kiest, zal het woord in inverse-video weergegeven worden om u eraan te herinneren dat deze funktie vastgezet is. Omdat het 'intikken' met de joystick toch wel iets langzamer gaat dan met een toetsenbord, zou een programma als JPP niet volledig zijn zonder automatische regelnummering. De funktie AUTO zorgt hiervoor. Verplaats de cursor naar het woord AUTO, druk op de spatiebalk en voer, met behulp van de cijfers op de bovenste regel, een regelnummer in. Dat is het eerste en laatste regelnummer dat u hoeft in te voeren. Zodra u de programmaregel met RETURN afsluit (dat wil zeggen, niet het intikken van de BASIC-opdracht RETURN, maar de RETURN van de derde regel in het menu), zal het volgende regelnummer automatisch voor u worden afgedrukt. De regelnummers verspringen met 10. U kunt AUTO ook gebruiken om verschillende regels snel achter elkaar te wissen. Stel, dat u de regels 150 tot en met 300 wilt verwijderen. U kiest dan eerst AUTO, en vervolgens voert u door de bovenste regel, 150 in. Verplaats de cursor nu naar het woord RETURN in de derde regel. Druk de vuurknop nu net zo lang in, totdat regelnummer 310 gegeven wordt. Druk nu niet meer op de vuurknop, anders wordt regel 310 ook verwijderd. Breng de cursor naar DEL (derde regel), druk op de vuurknop, en het regelnummer 310 is ook verwijderd (waarbij de regel dus in het programma blijft staan). Om AUTO uit te schakelen, brengt u de cursor naar AUTO en drukt u op de vuurknop. Het woord wordt nu weer normaal weergegeven, en de AUTO-funktie is uitgeschakeld. Het laatste woord op regel vijf is OFF. Dit moet niet verward worden met het uitzetten van de automatische regelnummering door OFF. Als u dit woord kiest, wordt JPP uitgeschakeld. Heeft u dit per ongeluk ingevoerd, dan kunt u JPP weer in werking krijgen door SYS 49152, gevolgd door RETURN. Dit moet wel met het toetsenbord gebeuren. Het uit- en weer aanzetten van JPP, beinvloedt uw BASIC-programma niet. De werking is gelijk aan het gelijktijdig indrukken van RUN/STOP en RESTORE. U kunt JPP ook uitschakelen door de RUN/STOP- en RESTORE-toetsen in te drukken. In dat geval moet u, om JPP weer aan het werk te krijgen, de volgende handelingen verrichten: save het BASIC-programma, laad JPP, tik SYS 49152 en tik NEW. Het is veel eenvoudiger om gebruik te maken van OFF van JPP. Standaard-instellingen De snelheid van de cursor is zo afgesteld, dat Marc er goed mee kan werken. Het is heel goed mogelijk dat alles voor u te snel of te langzaam gaat. Gelukkig zijn er verschillende manieren om de snelheid aan te passen. Nadat u JPP ingevoerd heeft, slaat u eerst een versie op cassette of diskette op. Nu runt u het programma met SYS 49152. Probeer een paar programmaregels met JPP uit, om de snelheid van de cursor te kunnen beoordelen en om te zien of er iets moet worden veranderd. Er zijn drie geheugenlocaties waarmee u de snelheid kunt veranderen: POKE 49292,2: Een algemene locatie, maar geschikt om de snelheid links/rechts aan te passen. POKE 49531, 6: Snelheid boven/onder. POKE 4 9603, 4: Snelheid waarmee de vuurknop reageert.

177

Page 177: 16 Voor de 64

De getallen hierboven zijn de instellingen van het programma zoals het in dit hoofdstuk staat. Hoe lager het getal, hoe sneller de afstelling. Hoe hoger het getal, hoe langzamer de afstelling. Opmerking: de locaties tellen af naar O. Daardoor is 1 de snelste afstelling, en is 0 de langzaamste afstelling. Locatie 49292 bepaalt de snelheid van alle bewegingen. Stel deze locatie eerst zodanig in, dat u een lekkere snelheid links/rechts heeft. Daarna kunt u de andere snelheden instellen. Als u alle snelheden naar uw eigen smaak aangepast heeft, zet u lPP uit door middel van OFF, en slaat u het programma op door middel van SAVE "bestandsnaam" ,8, 1 (diskette-gebruikers) of SAVE "bestandsnaam",I,1 (cassette-gebruikers). Nu hoeft u de snelheid niet meer te veranderen. De door u aangebrachte instellingen liggen in het programma vast. Om de verhoging van de automatische regelnummering aan te passen, kunt u een andere verhoging in locatie 50415 POKEn. Deze locatie bevat in de standaard-uitvoering van lPP de waarde 10. U kunt getallen tussen 1 en 255 gebruiken. Tijdens het schrijven van een programma, kan het nodig zijn om het programma te runnen, om eventuele fouten op te sporen. lPP blijft ook tijdens het runnen van het programma in het geheugen aanwezig, maar het menu zal niet afgebeeld worden. Zelfs nadat het programma is afgelopen, keert het menu niet terug. Dit biedt u de mogelijkheid alle uitvoer van uw programma goed te lezen. Er zijn verschillende manieren om het menu terug te krijgen nadat het programma is afgelopen. Als u RUN en RETURN uit het menu koos om het programma te runnen, kunt u gewoon de vuurknop ingedrukt houden totdat het menu verschijnt. U kunt ook door een van de toetsenbordtoetsen RETURN, cursor omlaag, wis scherm en cursor omhoog, de computer dwingen de beeldweergave een regel te laten rollen. Dat is een sein voor lPP om het menu weer op het scherm te plaatsen. Als u wilt dat het menu ook tijdens het runnen van het programma op het scherm blijft staan, moet u de volgende POKEs precies overnemen: POKE 56333,127: POKE 49275,234: POKE 49276,234: POKE 56333,129 Als u deze veranderingen in directe modus (zonder regelnummers) aanbrengt, dient u ze op een regel in te tikken, en dan pas op RETURN te drukken. Waarom? Omdat de eerste POKE de onderbrekingen uitschakelt, waardoor het toetsenbord tot de laatste POKE niet meer werkt. De twee POKEs in het midden, plaatsen de machinetaalopdracht NOP (geen bewerking) in plaats van de BEQ (vertak als gelijk) opdracht. Om lPP weer normaal te krijgen, tikt u de volgende regel: POKE 56333,127: POKE 49275,240: POKE 49276,89: POKE 56333,129

Automatische controleur voor JPP Een van de nuttigste programma's die COMPUTE! ooit heeft uitgegeven is de 'automatische controleur'. Dit programma zorgt ervoor dat fouten bij het intikken van een programma bijna niet mogelijk zijn. Alle programma's voor de Commodore 64 in een van de COMPUTE!-uitgaven, gebruiken de controleur om u te helpen bij het intikken. De automatische controleur is ook beschikbaar voor de lPP-gebruikers. Het programma had daarvoor enige aanpassingen nodig, dus als tweede programma in dit hoofdstuk vindt u lPP-controleur. Net als programma 1, staat ook dit programma in MTR-vorm. Om het programma in te tikken, moet u het MTR-programma uit bijlage E gebruiken. De twee adressen die u moet opgeven zijn:

178

Page 178: 16 Voor de 64

Beginadres: 51500 Eindadres: 51667 Tik JPP-controleur in en save het naar cassette of diskette. Als u JPP-controleur met IPP wilt gebruiken, moet u de volgende volgorde aanhouden: - LOAD "JPP",8,1 en druk op RETURN - tik NEW - LOAD "JPPCONT",8,1 en druk op RETURN - tik NEW - SYS 49152 en druk op RETURN Nu ziet u het gebruikelijke IPP-menu op de bovenste helft van het scherm. JPP is in werking, en u kunt de joystick gebruiken om te 'tikken': - SYS 51400 en RETURN

IPPCONT (de IPP-controleur) is nu in werking en klaar om gebruikt te worden. Om het programma aan het werk te zien, voert u een eenvoudige BASIC-regel in, bijvoorbeeld 10 REM en vervolgens RETURN. U ziet nu rechts van OFF in de vijfde menuregel een getal in inverse-video (in dit geval 069). Dit getal is het controlegetal van de automatische controleur. Als u nu naar een van de BASIC-programma's in dit boek kijkt, zult u zien dat elke regel eindigt met :rem xx (xx is een getal). Als u de regel goed heeft ingevoerd, zijn het getal aan het einde van de regel en het getal in inverse achter OFF aan elkaar gelijk. Voor meer details over de automatische controleur wordt u verwezen naar bijlage E Er is slechts een klein probleem aan JPPCONT. Als u een programmaregel op de onderste regel van het scherm invoert, zal het controle getal achter OFF slechts heel even verschijnen. Niet lang genoeg om goed te bekijken. Daarom moet u, bij gebruik van IPPCONT, ervoor zorgen dat u geen regels op de onderste beeldschermregel invoert. U kunt dit doen, door de BASIC-regels een regel naar boven te laten rollen. Doe dit door de cursor omlaag te verplaatsen (de D in menuregel 3) en vervolgens de cursor weer omhoog te brengen, om verder te tikken. Het lijkt wat omslachtig, maar u zult er snel aan gewend zijn.

De nadelen van JPP Het is moeilijk om andere verbeteringen van de Commodore 64 die software-matig in machinetaal moeten worden aangebracht, tegelijk met IPP te gebruiken. Het is niet mogelijk om een programma (BASIC of machinetaal) dat een geheugenlocatie in het gebied van 49152 tot en met 51413, gebruikt, samen met IPP te gebruiken. De DOS-wig die met de 1541 wordt meegeleverd, werkt samen met IPP. Sorry, maar Simon's BASIC werkt niet samen met IPP. Nog een punt om op te letten: als u een printer aangesloten heeft via de User-port, moet u IPP uitschakelen voordat u begint met printen. IPP gebruikt de locaties die gereserveerd zijn voor de RS-232 invoer/uitvoer-buffers. Van een persoon ben ik zeker dat hij veel plezier van dit programma heeft. Ik hoop dat dit programma ook u in staat stelt vele uren plezier (maar ook frustatie) te beleven aan het programmeren.

Programma 1. Joystick-programmeer-programma

179

Page 179: 16 Voor de 64

Listing : Programeren zonder joystick.

49152 :169,147,032,210,255,169,214 49158 :000,133,172,133,173,133,238 49164 :252,133,248,133,247,133,134 49170 :249,169,004,133,250,133,188 49176 :251,141,168,002,169,006,249 49182 :141,167,002,173,048,003,052 49188 :141,112,197,173,049,003,199 49194 :141,113,197,169,102,141,137 49200 :048,003,169,197,141,049,143 49206 :003,173,050,003,141,134,046 49212 :197,173,051,003,141,135,248 49218 :197,169,124,141,050,003,238 49224 :169,197,141,051,003,173,038 49230 :164,197,133,253,173,165,139 49236 :197,133,254,032,198,195,069 49242 :120,173,020,003,072,173,139 49248 :021,003,072,173,168,197,218 49254 :141,020,003,173,169,197,037 49260 :141,021,003,104,141,169,175 49266 :197,104,141,168,197,088,241 49272 :096,165,157,240,089,024,123 49278 :165,172,101,173,240,003,212 49284 :032,198,195,198,251,208,190 49290 :059,169,002,133,251,160,144 49296 :000,162,000,173,000,220,187 49302 :074,176,003,202,144,015,252 49308 :074,176,003,232,144,009,026 49314 :074,176,001,136,074,176,031 49320 :001,200,074,152,208,011,046 49326 :138,208,008,176,019,032,243 49332 :188,193,076,198,192,152,155 49338 :072,032,096,196,104,168,086 49344 :032,217,192,032,096,196,189 49350 :056,032,240,255,224,010,247 49356 :176,008,162,010,032,240,064 49362 :255,032,198,195,108,168,142 49368 :197,008,104,133,002,152,044 49374 :208,003,076,117,193,016,067 49380 :005,198,248,048,010,Q96,065 49386 :230,248,165,248,201,040,086 49392 :176,067,096,230,248,165,198 49398 :247,208,010,198,252,016,153 49404 :073,169,063,133,252,208,126 49410 :067,201,002,208,041,200,209 49416 :162,001,070,002,176,002,165 49422 :162,005,198,253,165,253,026 49428 :201,255,208,002,198,254,114 49434 :177,253,240,005,202,208,087 49440 :239,240,010,173,166,197,033 49446 :133,253,173,167,197,133,070

180

Page 180: 16 Voor de 64

49452 :254,076,255,195,169,039,008 49458 :133,248,096,198,248,165,114 49464 :247,208,014,230,252,164,147 49470 :252,185,170,197,208,002,052 49476 :133,252,076,233,195,201,134 49482 :002,208,035,162,001,070,040 49488 :002,176,002,162,005,230,145 49494 :253,208,002,230,254,177,186 49500 :253,240,005,202,208,243,219 49506 :240,201,173,164,197,133,182 49512 :253,173,165,197,133,254,255 49518 :208,189,169,000,133,248,033 49524 :096,206,167,002,208,036,063 49530 :169,006,141,167,002,160,255 49536 :001,138,016,027,165,247,210 49542 :208,031,160,004,024,165,214 49548 :249,105,080,133,249,165,097 49554 :250,105,000,133,250,230,090 49560 :247,230,247,136,208,236,176 49566 :096,165,247,201,008,208,059 49572 :229,160,004,056,165,249,003 49578 :233,080,133,249,165,250,000 49584 :233,000,133,250,198,247,213 49590 :198,247,136,208,236,096,023 49596 :206,168,002,240,001,096,133 49602 :169,004,141,168,002,166,076 49608 :198,208,211,164,248,165,114 49614 :247,208,067,024,152,101,237 49620 :252,201,063,144,002,233,083 49626 :063,168,173,169,002,240,009 49632 :010,048,003,206,169,002,150 49638 :185,234,197,208,035,173,238 49644 :170,002,240,010,048,003,197 49650 :206,170,002,185,042,198,021 49656 :208,020,173,171,002,240,038 49662 :012,048,003,206,171,002,184 49668 :185,106,198,208,005,240,178 49674 :003,185,170,197,157,119,073 49680 :002,230,198,096,201,002,233 49686 :208,101,152,024,101,253,093 49692 :141,162,197,165,254,105,028 49698 :000,141,163,197,205,167,139 49704 :197,144,038,240,002,176,069 49710 :010,173,162,197,205,166,191 49716 :197,240,026,144,024,024,195 49722 :173,162,197,237,166,197,166 49728 :133,248,173,164,197,133,088 49734 :253,173,165,197,133,254,221 49740 :032,198,195,164,248,177,066 49746 :253,201,032,240,016,136,192 49752 :016,247,200,198,253,165,143 49758 :253,201,255,208,238,198,167 49764 :254,208,234,166,198,200,080 49770 :177.253.201.032.240,010,251

181

Page 181: 16 Voor de 64

49776 :157,119,002,232,236,137,227 49782 :002,144,240,202,134,198,014 49788 :096,201,004,208,009,185,059 49794 :170,198,157,119,002,230,238 49800 :198,096,201,006,208,017,094 49806 :192,024,176,009,185,209,169 49812 :198,157,119,002,230,198,028 49818 :096,192,024,208,016,208,130 49824 :120,174,032,208,232,224,126 49830 :016,208,002,162,000,142,184 49836 :032,208,096,192,025,208,165 49842 :014,174,033,208,232,224,039 49848 :016,208,002,162,000,142,202 49854 :033,208,096,192,026,208,185 49860 :058,174,134,002,232,224,252 49866 :016,208,002,162,000,142,220 49872 :134,002,165,253,141,162,041 49878 :197,165,254,141,163,197,051 49884 :169,000,133,253,169,216,136 49890 :133,254,138,160,000,145,032 49896 :253,200,208,251,230,254,092 49902 :165,254,201,220,208,240,246 49908 :173,162,197,133,253,173,055 49914 :163,197,133,254,096,192,005 49920 :035,176,011,173,170,002,055 49926 :048,005,169,001,141,170,028 49932 :002,096,173,171,002,048,248 49938 :250,169,001,141,171,002,240 49944 :096,192,006,176,011,173,166 49950 :169,002,048,235,169,001,142 49956 :141,169,002,096,192,011,135 49962 :176,027,173,169,002,073,150 49968 :128,141,169,002,162,004,142 49974 :160,006,185,058,199,073,223 49980 :128,153,058,199,200,202,232 49986 :208,244,076,198,195,192,155 49992 :018,176,014,173,170,002,113 49998 :073,128,141,170,002,162,242 50004 :006,160,011,208,223,192,116 50010 :023,176,014,173,171,002,137 50016 :073,128,141,171,002,162,005 50022 :004,160,018,208,205,192,121 50028 :028,144,019,192,031,144,154 50034 :001,096,032,090,192,173,186 50040 :152,197,016,003,032,130,138 50046 :195,108,046,003,173,152,035 50052 :197,073,128,141,152,197,252 50058 :162,004,160,023,201,128,048 50064 :240,014,173,106,196,141,246 50070 :036,003,173,107,196,141,038 50076 :037,003,208,201,173,036,046 50082 :003,141,106,196,173,037,050 50088 :003,141,107,196,169,105,121 50094 :141,036,003,169,196,141,092

182

Page 182: 16 Voor de 64

50100 :037,003,169,000,132,002,011 50106 :160,004,153,000,002,136,129 50112 :016,250,164,002,208,163,227 50118 :173,134,002,160,000,153,052 50124 :000,216,200,208,250,153,207 50130 :000,217,200,192,144,208,147 50136 :248,032,233,195,032,255,187 50142 :195,032,045,196,032,073,027 50148 :196,032,096,196,096,165,241 50154 :252,162,000,168,185,170,147 50160 :197,240,250,041,063,157,164 50166 :000,004,200,232,224,040,178 50172 :208,240,096,165,253,141,075 50178 :014,196,165,254,141,015,019 50184 :196,160,000,162,000,185,199 50190 :255,255,208,015,168,173,064 50196 :164,197,141,014,196,173,137 50202 :165,197,141,015,196,208,180 50208 :236,041,063,157,080,004,101 50214 :200,232,224,040,208,225,143 50220 :096,160,039,185,234,198,188 50226 :041,063,153,160,004,185,144 50232 :018,199,041,063,153,240,002 50238 :004,185,058,199,153,064,213 50244 :005,136,016,231,096,160,200 50250 :039,169,064,153,040,004,031 50256 :153,120,004,153,200,004,202 50262 :153,024,005,153,104,005,018 50268 :136,016,238,096,164,248,222 50274 :177,249,073,128,145,249,095 50280 :096,032,087,241,141,159,092 50286 :197,142,160,197,140,161,083 50292 :197,008,201,013,208,003,234 50298 :032,136,196,173,159,197,247 50304 :174,160,197,172,161,197,165 50310 :040,096,160,000,140,154,212 50316 :197,140,155,197,185,000,246 50322 :002,140,153,197,201,058,129 50328 :176,077,201,048,144,073,103 50334 :041,015,170,173,154,197,140 50340 :141,156,197,173,155,197,159 50346 :141,157,197,014,154,197,006 50352 :046,155,197,014,154,197,171 50358 :046,155,197,024,173,154,163 50364 :197,109,156,197,141,154,118 50370 :197,173,155,197,109,157,158 50376 :197,141,155,197,014,154,034 50382 :197,046,155,197,138,024,195 50388 :109,154,197,141,154,197,140 50394 :169,000,109,155,197,141,221 50400 :155,197,200,192,005,208,157 50406 :169,173,153,197,208,001,107 50412 :096,024,169,010,109,154,030

183

Page 183: 16 Voor de 64

50418 :197,141,154,197,169,000,076 50424 :109,155,197,141,155,197,178 50430 :160,000,140,156,197,140,023 50436 :157,197,140,158,197,140,225 50442 :153,197,162,015,014,154,193 50448 :197,046,155,197,120,248,211 50454 :173,156,197,109,156,197,242 50460 :141,156,197,173,157,197,025 50466 :109,157,197,141,157,197,224 50472 :173,158,197,109,158,197,008 50478 :141,158,197,216,088,202,024 50484 :016,216,164,198,162,002,042 50490 :189,156,197,072,074,074,052 50496 :074,074,032,087,197,104,120 50502 :041,015,032,087,197,202,132 50508 :016,236,169,032,153,119,033 50514 :002,200,132,198,096,205,147 50520 :153,197,240,009,009,048,232 50526 :141,153,197,153,119,002,091 50532 :200,096,141,159,197,032,157 50538 :090,192,173,159,197,032,181 50544 :255,255,141,159,197,032,127 50550 :090,192,173,159,197,096,001 50556 :141,159,197,032,090,192,167 50562 :173,159,197,032,255,255,177 50568 :141,159,197,032,090,192,179 50574 :169,000,133,172,133,173,154 50580 :173,159,197,096,000,000,005 50586 :000,000,000,000,000,000,154 50592 :000,000,000,000,099,199,202 50598 :211,200,121,192,033,034,189 50604 :035,036,037,038,039,040,141 50610 :041,042,043,044,045,046,183 50616 :047,048,049,050,051,052,225 50622 :053,054,055,056,057,058,011 50628 :059,060,061,062,063,064,053 50634 :065,066,067,068,069,070,095 50640 :071,072,073,074,075,076,137 50646 :077,078,079,080,081,082,179 50652 :083,084,085,086,087,088,221 50658 :089,090,091,092,093,094,007 50664 :095,000,033,034,035,036,209 50670 :037,038,039,040,041,192,113 50676 :219,060,221,062,063,048,149 50682 :033,034,035,036,037,038,207 50688 :039,040,041,091,093,060,108 50694 :061,062,063,186,193,194,253 50700 :195,196,197,198,199,200,173 50706 :201,202,203,204,205,206,215 50712 :207,208,209,210,211,212,001 50718 :213,214,215,216,217,218,043 50724 :091,169,093,255,095,000,227 50730 :129,149,150,151,152,153,158

184

Page 184: 16 Voor de 64

50736 :154,155,041,223,166,060,079 50742 :220,062,063,048,129,149,213 50748 :150,151,152,153,154,155,207 50754 :041,091,093,060,061,062,218 50760 :063,164,176,191,188,172,002 50766 :177,187,165,180,162,181,106 50772 :161,182,167,170,185,175,100 50778 :171,178,174,163,184,190,126 50784 :179,189,183,173,091,168,055 50790 :093,255,095,000,144,005,182 50796 :028,159,156,030,031,158,158 50802 :018,042,043,044,045,046,096 50808 :047,146,144,005,028,159,137 50814 :156,030,031,158,018,027,034 50820 :029,060,031,062,063,000,121 50826 :001,002,003,004,005,006,159 50832 :007,008,009,074,075,076,137 50838 :013,014,015,016,017,018,243 50844 :019,020,021,022,023,024,029 50850 :025,026,027,028,029,030,071 50856 :006,000,013,013,013,013,226 50862 :013,013,013,032,032,032,053 50868 :032,032,032,145,145,017,071 50874 :017,157,157,029,029,147,210 50880 :147,147,147,019,019,019,178 50886 :019,019,148,148,148,148,060 50892 :148,020,020,020,020,133,053 50898 :133,133,137,137,137,134,253 50904 :134,134,138,138,138,135,009 50910 :135,135,139,139,139,136,021 50916 :136,136,140,140,140,000,152 50922 :082,069,084,085,082,078,202 50928 :032,083,080,065,067,069,124 50934 :032,085,032,068,032,076,059 50940 :032,082,032,067,076,082,111 50946 :032,072,079,077,069,032,107 50952 :073,078,083,084,032,068,170 50958 :069,076,032,032,070,049,086 50964 :032,070,050,032,070,051,069 50970 :032,070,052,032,070,053,079 50976 :032,070,054,032,070,055,089 50982 :032,070,056,032,066,066,104 50988 :067,032,067,079,077,068,178 50994 :082,069,032,067,084,082,210 51000 :076,032,019,008,009,006,206 51006 :020,032,012,015,003,011,155 51012 :032,003,015,013,004,018,153 51018 :005,032,003,020,018,012,164 51024 :032,001,021,020,015,032,201 51030 :015,006,006,032,032,032,209 51036 :032,032,032,032,032,032,028 51042 :000,032,065,066,083,040,128

185

Page 185: 16 Voor de 64

51048 :032,065,078,068,032,065,188 51054 :083,067,040,032,065,084,225 51060 :078,040,032,067,072,082,231 51066 :036,040,032,067,076,079,196 51072 :083,069,032,067,076,082,025 51078 :032,067,077,068,032,067,221 51084 :079,078,084,032,067,079,047 51090 :083,040,032,068,065,084,006 51096 :065,032,068,069,070,032,232 51102 :070,078,032,068,073,077,044 51108 :032,069,078,068,032,069,000 51114 :088,080,040,032,070,078,046 51120 :032,070,079,082,032,084,043 51126 :079,032,070,082,069,040,042 51132 :032,071,069,084,032,071,035 51138 :069,084,035,032,071,079,052 51144 :083,085,066,032,071,079,104 51150 :084,079,032,073,070,032,064 51156 :084,072,069,078,032,073,108 51162 :078;080,085,084,032,073,138 51168 :078,080,085,084,035,032,106 51174 :073,078,084,040,032,076,101 51180 :069,070,084,036,040,032,055 51186 :076,069,078,040,032,076,101 51192 :069,084,032,076,073,083,153 51198 :084,032,076,079,065,068,146 51204 :032,076,079,071,040,032,078 51210 :077,073,068,036,040,032,080 51216 :078,069,087,032,078,069,173 51222 :088,084,032,078,079,084,211 51228 :032,079,078,032,079,080,152 51234 :069,078,032,079,082,032,150 51240 :080,069,069,075,040,032,149 51246 :080,079,075,069,032,080,205 51252 :079,083,040,032,080,082,192 51258 :073,078,084,032,080,082,231 51264 :073,078,084,035,032,082,192 51270 :069,065,068,032,082,069,199 51276 :077,032,082,069,083,084,247 51282 :079,082,069,032,082,069,239 51288 :084,085,082,078,032,082,019 51294 :073,071,072,084,036,040,214 51300 :032,082,078,068,040,032,176 51306 :082,085,078,032,083,065,019 51312 :086,069,032,083,071,078,019 51318 :040,032,083,073,078,040,208 51324 :032,083,080,067,040,032,202 51330 :083,081,082,040,032,083,019 51336 :084,065,084,085,083,032,057 51342 :083,084,069,080,032,083,061 51348 :084,079,080,032,083,084,078 51354 :082,036,040,032,083,089,004 51360 :083,032,084,065,066,040,018

186

Page 186: 16 Voor de 64

51366 :032,084,065,078,040,032,241 51372 :084,072,069,078,032,084,079 51378 :073,077,069,032,084,073,074 51384 :077,069,036,032,084,079,049 51390 :032,085,083,082,032,086,078 51396 :065,076,040,032,086,069,052 51402 :082,073,070,089,032,087,123 51408 :065,073,084,032,000,013,219

. Listing proef

51500 :173,036,003,201,077,208,230 51506 :001,096,141,078,201,173,228 51512 :037,003,141,079,201,169,174 51518 :077,141,036,003,169,201,177 51524 :141,037,003,169,000,141,047 51530 :213,201,096,032,087,241,176 51536 :141,210,201,142,211,201,162 51542 :140,212,201,008,201,013,093 51548 :240,022,201,032,240,007,066 51554 :024,109,213,201,141,213,231 51560 :201,173,210,201,174,211,250 51566 :201,172,212,201,040,096,008 51572 :174,213,201,248,169,000,097 51578 :141,000,001,141,001,001,151 51584 :224,000,240,021,202,024,071 51590 :173,000,001,105,001,141,043 51596 :000,001,173,001,001,105,165 51602 :000,141,001,001,076,128,237 51608 :201,216,173,001,001,009,241 51614 :176,141,002,001,173,000,139 51620 :001,074,074,074,074,009,214 51626 :176,141,001,001,173,000,150 51632 :001,041,015,009,176,141,047 51638 :000,001,162,002,160,000,251 51644 :140,213,201,173,134,002,027 51650 :153,096,217,189,000,001,082 51656 :153,096,005,200,202,016,104 51662 :240,076,105,201,013,013,086

187

Page 187: 16 Voor de 64
Page 188: 16 Voor de 64

DISK-DOKTER

Gerald E. Sanders

Verschillende bewerkingen met uw 1540 of 1541 diskdrive kunnen langdradig en rrweilijk zijn. Het programma in dit hoofdstuk werkt vanuit een menu en biedt u de rrwgelijkheid om een disknaam te veranderen. om bestanden te schrappen of weer te plaatsen en zelfs om verschillende lijsten met diskbestanden af te drukken. Dit alles door slechts een paar toetsen in te drukken.

Heeft u ooit een programma van diskette geschrapt, en later gewild dat u dat nooit had gedaan? Heeft u ooit een diskette van een andere naam willen voorzien, zonder de andere bestanden te verwijderen? Heeft u ooit een programma naar diskette weggeschreven, om daarna bij het listen van de inhoudsopgave allemaal rare tekens te krijgen? Of kon u de juiste combinatie van lettertekens niet vinden waarmee een ongewenst bestand van diskette kon worden geschrapt? En dan maar (tevergeefs) in de handleiding bij de diskdrive en in de boeken zoeken! Alle informatie kunt u in de handleidingen vinden, maar het zijn geen korte, handige, een-woords-opdrachten die de problemen oplossen. En de benodigde informatie is her en der ongeordend in de handleidingen verspreid. Met Disk -dokter heeft u een menu-bestuurd programma dat u de mogelijkheid biedt verschillende diskbewerkingen uit te voeren zonder raadpleging van de handleidingen.

U wenst? Voor het intikken van Disk-dokter, kunt u het beste de 'automatische controleur' uit bijlage C gebruiken. Dit programma zorgt ervoor dat u Disk-dokter de eerste keer al goed intikt. Bewaar het programma door het programma na het intikken op een diskette weg te schrijven. U kunt het programma laden en runnen als elk gewoon BASIC-programma. Tik: LOAD "bestandsnaam" ,8. Stop de diskette waaraan u wilt gaan werken in de diskdrive, en druk op een willekeurige toets. De diskdrive zal even zoemen en de naam van de diskette plus de identificatie van de diskette (de ID) zal op het scherm verschijnen. U kunt nu nog van gedachte veranderen, en de diskette wisselen met een andere. Is dit de juiste diskette, dan drukt u op de Y-toets, waardoor de inhoudsopgave van de diskette in het geheugen geladen wordt. Dit kan enkele seconden in beslag nemen, dus wees niet te ongeduldig. U krijgt een menu met acht mogelijkheden op het scherm te zien. Het programma legt zichzelf helemaal uit en neemt u stap voor stap mee langs de onderdelen van elke mogelijkheid die u kiest. Een korte bespreking van alle mogelijkheden, maakt het eenvoudiger om uit de acht opties te kiezen.

Bewerkingen Zodra Disk-dokter aan het werk is, kunt u het programma alleen stoppen door de stop-mogelijkheid van het hoofdmenu. De POKE 808,234 in regel 10 schakelt de werking van de RUN/STOP- en RESTORE-toetsen buiten werking. Dit is opzettelijk gedaan om te verhinderen dat de gebruiker het programma op een verkeerd moment verlaat, waardoor er bestanden open blijven staan of veranderingen niet volledig afgewerkt zijn. Dit zou tot onvoorspelbare resultaten kunnen leiden. Als het u echt hindert dat de RUN/STOP- en

189

Page 189: 16 Voor de 64

RESTORE-toetsen buiten werking zijn, kunt u de POKE in regel 10 verwijderen. Op elk willekeurig moment na het verschijnen van het hoofdmenu kunt u een bepaalde bewerking van het programma stoppen door bij de vraag J/N, de fl-funktietoets in te drukken. Hierdoor keert u terug naar het hoofdmenu. In het onwaarschijnlijke geval dat u een lees/schrijf-fout krijgt, zal Disk-dokter niet stoppen, maar u vragen of u verder wilt gaan met het programma, of opnieuw wilt beginnen. Als u kiest voor opnieuw beginnen, begint Disk-dokter helemaal bij het begin. De berichten zijn door middel van kleuren gecodeerd. Blauwe letters worden gebruikt om algemene informatie en data weer te geven. Zwarte letters geven aan dat er gewacht moet worden. Witte letters vragen om de invoer van de gebruiker, licht-blauwe letters geven de door u ingetikte gegevens weer en rode letters betekenen fouten of waarschuwingen. De acht bewerkingen die u met Disk-dokter kunt uitvoeren zijn hier in het kort aangegeven:

Bewerking 1 . Verander naam van de diskette Om de naam van de diskette te veranderen drukt u op toets 1, en tikt u de nieuwe naam in. De naam mag maximaal 16 lettertekens bevatten. U kunt de DELE TE-toets gebruiken als u iets verkeerds intikt. De computer verzekert zich ervan dat u de juiste naam ingetikt heeft. Na het intikken vraagt de computer om bevestiging van de naam. Tik J als de naam goed is, en N als u een fout ontdekt, of als u zich bedacht heeft. Als disk-dokter met de naam aan de slag mag, wordt de naam van de diskette veranderd. De nieuwe naam zal in de regel met informatie over de diskette, bovenaan het scherm van het hoofdmenu, verschijnen. Bewerking 2 - Bekijk inhoudsopgave Deze optie van het menu kunt u gebruiken om de inhoudsopgave van de diskette te bekijken. Het scherm toont u telkens tien bestanden per keer. Om de volgende tien te bekijken, drukt u op een willekeurige toets. Als u alle bestanden gezien heeft, kunt u ze nogmaals bekijken door de t7 -funktietoets in te drukken. U kunt de bestanden zelfs op papier laten afdrukken (als u tenminste een printer heeft aangesloten), door de f3-funktietoets in te drukken. Bewerking 3· Redden van bestand Wellicht de meest waardevolle bewerking van Disk-dokter. Deze optie biedt u de mogelijkheid een of meer bestanden die u al geschrapt had van de diskette, alsnog te redden. Het doet er niet toe of u de bestanden geschrapt hebt door middel van Disk-dokter of door "SO:bestandsnaam". In beide gevallen zal Disk-dokter het bestand voor u redden. Voorwaarde is wel dat het bestand nog niet door een ander bestand is overschreven. Bewerking 3 is voor 100% effectief als u een geschrapt bestand onmiddellijk na het verwijderen probeert te redden. De kans op succes neemt echter snel af naarmate u meer bestanden op de diskette heeft geschreven na het schrappen van het te schrappen bestand. Er is nog een tweede reden waarom u een geschrapt bestand onmiddellijk moet proberen te redden. Als u een bestand schrapt, vervolgens een bestand naar de betrokken diskette schrijft, en daarna het verwijderde bestand probeert te redden, is er een mogelijkheid dat u daarmee het bestand dat u tussen het schrappen en redden in, weggeschreven heeft, schade toebrengt. Het kan gebeuren dat het bestand dat u wegschreef, enkele bytes plaats gebruikte van het gewiste bestand. Als u nu dit bestand gaat redden, probeert Disk-dokter de desbetreffende bytes weer terug te winnen, daarmee het weggeschreven bestand vernielend. Door de 3-toets in te drukken, gaat Disk-dokter aan het werk. Eerst worden alle geschrapte bestanden die nog niet zijn overschreven, opgezocht en een voor een op het scherm weergegeven. De computer vraagt u bij elk bestand of u dit bestand wilt redden. U kunt antwoorden met het indrukken van de J- of N-toets. Als u het bestand wilt redden, moet u Disk-dokter vertellen wat voor een soort bestand het is. U heeft daarbij de keuze uit sequentiele bestanden, programmabestanden, gebruikersbestanden en relatieve bestanden.

190

Page 190: 16 Voor de 64

Disk-dokter is even aan het werk, redt het bestand, en werkt de diskette weer bij. Het bijwerken van de diskette gaat automatisch (dit gaat ook automatisch bij de beide bewerkingen om een bestand te schrappen). Dit duurt even. U kunt vervolgens controleren dat het bestand gered is, door terug te keren naar het hoofdmenu, en de inhoudsopgave van de diskette te bekijken. Waarschuwing: bij het bijwerken van de diskette, worden de blokken anders gerangschikt. Daardoor kan de rangschikking voor een random-access bestand (een willekeurig toegankelijk bestand) vernield worden. Gebruik Disk-dokter niet voor diskettes waarop (tevens) random-access bestanden voorkomen. Bewerking 4 - Schrap bestand, laat naam in inhoudsopgave Een van de twee mogelijkheden om bestanden van de diskette te schrappen zonder de naam uit de inhoudsopgave te verwijderen. Dit kan vooral handig zijn als u de bestanden later weer wilt redden. Doordat de bestandsnaam nog in de inhoudsopgave staat, hoeft u niet lang te zoeken naar de plaats van het bestand. Net als bij bewerking 3, ziet u de bestandsnamen een voor een op het scherm weergegeven. Door de J-toets in te drukken, gaat de computer het bestand schrappen. De N-toets brengt de volgende bestandsnaam voor. (Waarschuwing: na het indrukken van de J-toets kunt u niet meer van gedachte veranderen. De enige manier om het bestand nu nog te redden is met bewerking 3.) Voordat deze bewerking terugkeert naar het hoofdmenu, wordt de diskette bijgewerkt. Bewerking 5 - Schrap het bestand, ook uit de inhoudsopgave Deze bewerking is gelijk aan bewerking 4, maar nu wordt ook de bestandsnaam uit de inhoudsopgave gehaald. Bewerking 6 - Druk inhoudsopgave af Als u een printer aangesloten heeft, kunt u deze optie gebruiken om de volledige inhoudsopgave, alleen geldige bestanden, alleen verwijderde bestanden of alle programmabestanden op papier af te laten drukken. Elk van deze opties is beschikbaar na het indrukken van de 6-toets als u in het hoofdmenu bent. Bewerking 7 - Ga naar andere diskette U kunt ook tijdens de werking van Disk-dokter naar een andere diskette overstappen, door de 7-toets in te drukken, de oude diskette te verwijderen en de nieuwe diskette in de diskdrive te stoppen. Bewerking 8 - Uit Als u geen veranderingen in het programma heeft aangebracht (bijvoorbeeld het verwijderen van POKE 808,234 uit regel 10), is dit de enige methode om Disk-dokter te verlaten. U krijgt de READY-melding op het scherm te zien. Als u zich bedenkt, tikt u RUN, gevolgd door RETURN.

Zonder studie medicijnen Dit programma is een eenvoudig hulpmiddel. U hoeft helemaal niet te weten hoe DOS werkt om het programma goed te kunnen gebruiken. U zult merken dat Disk-dokter snel en eenvoudig te gebruiken is, en al snel een onmisbare hulp is bij de meest gebruikte diskbewerkingen.

Disk-dokter Om dit programma zonder fouten in te tikken. kunt u gebruik maken van de "automatische controleur". Zie bijlage C

191

Page 191: 16 Voor de 64

LISTING programma

10 poke53280,11:poke53281,12:print"[BLUE]" :poke808,234 :rem 19 20 dim f${144,4),t${4),m${3) :rem 58 30 forx=679to718:reada:pokex,a:next

:rem 6 40 t$(0)="del":t${1)="seq":t$(2)="pr g":t$(3)="usr" 45 t$(4)="rel"

:rem 161 :rem 202

50 m$(O)="[BLACK]gehele directory af drukken ..... geduld" 60 m$(l)="[BLACK]geldige bestanden a fdrukken .... geduld" 70 m$(2)="[BLACK]gewiste bestanden a fdrukken .... geduld[BLUE]" 80 m$ (3) =" [BLACK] programma bestanden

: rem

:rem

: rem

afdrukken .. geduld" : rem 90 goto710 : rem 100 input#15,e,e$,et,es :rem 110 ife<20thenreturn : rem 120 print" [CLR] [RED] [RVS ON] [10xSPATIE] disk fout [2xSPATIE] !!! [16xSPATIE] [BLUE]" :print :print :print : rem 125 print :print : rem 130 printe,e$:printet,es : rem 140 print#15,"iO" : rem 150 close8:close15 : rem 160 print:print:print:print" [WHITE]d ruk een toets om programma te starten."

253

247

63

84 58 57 19

101 236

31 148

90

:rem 137 170 print :print :print :print :print" [RED] [4xSPATIE]geef 'f1' om te stoppen."

: rem 9 180 wait198,1:geta$:ifa$="[ F1 ]"then 2410 :rem 118 190 run :rem 143 200 print" [BLUE] [2xSPATIE] hoofdmenu: "

210 print:print"[2xSPATIE]1. isk naam" 230 print:print"[2xSPATIE]2. ectory" 240 print:print"[2xSPATIE]3. tand terug" 250 print:print"[2xSPATIE]4. and-blijft op directory" 260 print:print"[2xSPATIE]5. and-haal van directory" 270 print:print"[2xSPATIE]6. ectory af" 280 print:print"[2xSPATIE]7.

wijzig d

toon dir

haal bes

wis best

wis best

druk dir

een ande

192

: rem 97

: rem 166

: rem 130

: rem 45

: rem 193

: rem 100

:rem 7

Page 192: 16 Voor de 64

re disk" : rem 73 290 print:print" [2xSPATIE] 8. stop pro gramma" : rem 133 300 print:printspe(9) "[WHITE]welke 0

ptie? (1-8) : rem 157 310 wait198,1:geta$:ifa$<"1"ora$>"8" then310 :rem 169 320 return : rem 117 330 open15,8,15,"i":gosub100 :rem 40 340 open8,8,8,"#":gosub100 : rem 167 350 print#15,"u1:"8;0;t;s:gosub100

: rem 233 360 print#15, "b-p:"8;bp:gosub100

:rem 104 370 print#8,d$;:gosub100 : rem 156 380 print#15,"u2:"8;0;t;s:gosub100

:rem 237 390 elose8:elose15:return :rem 122 400 open15,8,15,"i" : rem 219 410 open8,8,8,"#" :rem 90 420 print#15,"u1:"8;0;t;s:gosub100

: rem 231 430 get#8,nt$:ifnt$=""thennt$=ehr$(0 ) : rem 136 440 nt=ase (nt$) : rem 101 450 get#8,ns$:ifns$=""thenns$=ehr$(0 ) : rem 135 460 ns=ase (ns$) : rem 101 470 bl$="" :rem 206 480 forx=lto254 :rem 135 490 get#8,a$:ifa$=""thena$=ehr$(0)

: rem 107 500 bl$=bl$+a$ : rem 198 510 next :rem 213 520 gosub100 : rem 168 530 elose8:elose15:return :rem 118 540 print:print:printspe(2) "[BLACK]d isk wordt nu gewaarmerkt .... " : rem 65 545 print:print:printspe(13) "even ge duld" : rem 123 550 open15,8,15,"vO":elose15:return

:rem 78 560 sys679:ifa=5then1010 : rem 173 570 printm$(a-1) :open4,4:print#4:print# 4 :print#4, "programmanaam: ", : rem 125 580 print#4, "type:" :print#4 :print#4

: rem 169 590 forx=Oto143 : rem 133 600 ifa=lthenifleft$(f$(x,l),l)=ehr$ (0) then660 : rem 137 610 ifa=2thenifase(f$(x,0))<129then6 60 : rem 206 620 ifa=3thenifase(f$(x,0))>128orleft$

193

Page 193: 16 Voor de 64

(f$-(x, 1) , 1) =chr$ (0) then660 :rem 158 630 ifa=4thenifasc(f$(x,0»<>130then 660 : rem 8 640 p$=f$(x,l) :t=asc(f$(x,0»-128:if t<Othent=O 650 print#4,p$,t$(t) 660 next

: rem 94 :rem 104 :rem 219

670 close4:printspc(8) "[BLUE]afdruk compleet ... " :rem 128 680 print:print:print:print"[WHITE]d ruk een toets voor het hoofdmenu."

: rem 690 print:print"geef [RVS ON]f3[RVS OFF]

om naar het afdrukmenu te gaan." :rem

700 wait198,1:geta$:return : rem 710 print" [CLR] [RVS ON] [BLUE] [13xSPATIE] disk chirurg [15xSPATIE]" :rem 720 print:print:printspc(5) "[BLUE]do e de te behandelen diskette" : rem 730 print:printspc(12) "in de diskdrive. " : rem 740 print:print:print:printspc(6) "[WHITE] druk dan op een toets." : rem 750 wait198,1:geta$:sys679 : rem 760 print:print:print:print:print

: rem 765 printspc(l) "[BLACK]inhoud disk 1

96

218 100

108

160

191

112 46

70

ezen, even geduld." :rem 24 770 t=18:s=0:gosub400 :rem 224

780 forx=143to158 :rem 244 790 ifmid$(bl$,x,1)=chr$(96)then800

:rem 214 795 ifmid$(bl$,x,1)<>chr$(160)thendn $=dn$+mid$(bl$,x,l) :rem 94 800 next :rem 215 810 di$=mid$(bl$,161,2) :sys679 :rem 137 820 print" [BLUE] disk naam: "dn$ :print :print"disk id: "di$ :rem 55 830 print:print:printspc(2) "[WHITE]i s dit de correcte disk? (jIn)" :rem 71 840 wait198,1:geta$:ifa$<>"j"anda$<> "n"then840 :rem 148 850 ifa$="n"thenrun :rem 132 860 sys679:print:print:print:printspc( 4) "[BLACK]directory in geheugen inleze n." :rem 117 870 print:print:printspc(13) "even wa chten." :rem 255 880 t=18:s=1:r=0 :rem 142 890 gosub400 : rem 181

194

Page 194: 16 Voor de 64

900 forx=Oto7 : rem 31 910 f$(x+r*B,0)=mid$(bl$,x*32+1,1)

: rem 242 920 f$(x+r*B,1)=mid$(bl$,x*32+4,16)

: rem 45 930 f$(x+r*B,2)=chr$(t) : rem 207 940 f$(x+r*B,3)=chr$(s) : rem 20B 950 f$(x+r*B,4)=chr$(x*32+2) : rem 195 960 next : rem 222 970 ifnt<>Oandns<=lBthent=nt:s=ns:r= r+1:gotoB90 :rem 41 9BO if(x+r*B»=143then1010 : rem 1BB 990 forz=(x+r*B)to144:f$(z,0)=chr$(0 ) : f$ (z, 1) =chr$ (0) : f$ (z, 2) =chr$ (0)

: rem 37 1000 f$ (z, 3) =chr$ (0) : f$ (z, 4) =chr$ (0) :next :rem 219 1010 iflen(dn$)<16thendn$=dn$+" ":goto 1010 :rem B6 1020 tl$=" [CLR] [RVS ON] [BLUE] disk

naam: "+dn$+"[3xSPATIE]id: "+di$+"[3xSPATIE)"

1030 printtl$ 1040 gosub200 1050 sys679:a=val (a$) :onagoto1060, 14 BO,1670,1950,2120,2290,2400,2410

1060 print:print"[BLUE)nieuwe disk n

:rem 176 :rem 21 :rem 215

:rem 145

aam maximaal 16 tekens." :rem 60 1070 print:printspc(6) "[WHITE]sluit met [RVS ON]return[RVS OFF) af."

:rem 130 10BO nn$="":x=0:print:printspc(6) "[CYAN)"

:rem 34 1090 wait19B,1:geta$ :rem 125 1100 ifa$=chr$(13)then1160 :rem 160 1110 ifa$="[ F1 ]"then1010 :rem 174 1120 ifa$=chr$(20)andlen(nn$»Othenx =x-1: nn$=left$ (nn$, (len (nn$) -1) ) 1125 ifa$=chr$(20)andlen(nn$»Othenprint chr$(20); :goto1090 :rem 199 1130 ifa$=chr$(20)andlen(nn$)=Othen1 090 :rem 211 1140 nn$=nn$+a$:x=x+1:printa$;:ifx=1 6then1160 1150 goto 1090 1160 sys679:print"[BLUE)nieuwe naam:

";nn$ 1170 print:print:printspc(8) "[WHITE) is dit correct? (jin)" 11BO wait19B,1:geta$:ifa$<>"j"anda$< >"n"anda$<>"[ F1 ]"then11BO 1190 ifa$="n"thensys679:goto1060

195

: rem 185 : rem 202

:rem 182

: rem 130

:rem 107

Page 195: 16 Voor de 64

:rem 156 1200 ifa$="[ F1 j"then1010 :rem 174 1210 iflen(nn$)<16thennn$=nn$+chr$(1 60) : goto1210 : rem 29 1220 sys679:print:print:print:print: printspc(10) " [BLACKjwijzig disk naam."

: rem 3 1230 t=18:s=0:bp=144:d$=nn$:gosub330

:rem 75 1240 open15,8,15,"iO":close15 :rem 84 1250 sys679:print:print:print:print: printspc(9) "[BLUEjwijziging[2xSPATIEjc ompleet. " : rem 92 1260 dn$=nn$:forx=Oto500:next:goto10 10 :rem 72 1480 print" [BLUEj toon directory:"

1490 print:print" no.","file type"," [2xSPATIEj filenaam [BLUEj" :print 1500 z=0:poke686,4:poke698,200 1510 forx=Oto9 1520 a=(asc(f$(x+z*10,0)))-128:ifa<0 thena=O 1530 if(a=Oandf$(x+z*10,1)="")or(a=0 and(asc(f$(x+z*10,1))=0))then1590

:rem 236

:rem 150 :rem 200 :rem 79

:rem 89

:rem 2 1540 printx+(z*10)+1,t$(a),"[2xSPATIEj" ;f$(x+z*10,1) :rem 205 1550 next :rem 10 1560 print:print:prirttspc(3) " [WHITEj druk een toets voor rest lijst[BLUEj" :wait198,1:geta$ :rem 77 1570 ifa$="[ F1 j"then1630 :rem 192 1580 sys679:print:print:z=z+1:goto15 10 :rem 194 1590 print:print:print" [BLUEj lijst c ompleet. [WHITEjgeef [RVS ONjf7[RVS OFFj voor herhaling." :rem 157

1600 print:printspc(4) "geef [RVS ONj f3 [RVS OFF j voor afdrukken." : rem 13 1610 print:print" druk een toets voo r hoofdmenu." : rem 22 1620 wait198,1:geta$ :rem 124 1630 poke686,2:poke698,40 :rem 155 1640 ifa$="[ F7 j"thensys679:goto148 o :rem 220 1650 ifa$="[ F3 j"thensys679:goto229 o : rem 219 1660 goto1010 : rem 200 1670 print" [BLUEjbestand terughalen:" :poke686,4:poke698,160 :rem 40 1680 v=O :rem 146 1690 forx=Oto143:a=(asc(f$(x,0)))-12

196

Page 196: 16 Voor de 64

8:ifa<Othena=0 :rem 114 1700 ifa>Othengoto1890 :rem 64 1710 ifa=Oand(left$(f$(x,l),l)=ehr$( 0)orleft$(f$(x,1),1)=ehr$(160))then18 90 :rem 139 1720 sys679:print:print:printx+1,f$( x,l) :rem 20 1730 print:print:printspe(2) " [WHITE] dit bestand terughalen? [2xSPATIE] (jin) [BLUE]" : rem 223 1740 wait198,1:geta$:ifa$<>"j"anda$< >"n"anda$<>"[ F1 ]"then1740 :rem 111 1750 ifa$="n"then1900 :rem 137 1760 ifa$="[ F1 ]"thenpoke686,2:poke 698,40:goto1010 :rem 253 1770 sys679:print"[BLUE]bestandstyp e?" :rem 115 1780 print:print"[2xSPATIE]1. sequent ieel" : rem 11 1790 print:print" [2xSPATIE] 2. program ma" : rem 111 1800 print:print" [2xSPATIE]3. user"

:rem 1 1810 print:print" [2xSPATIE] 4. relativ e" :rem 32 1820 print :print" [RED] [2xSPATIE]5 . te rughalen afbreken. [BLUE] " : rem 92 1830 print:print:printspe(10) " [WHITE] welke optie? (1-5)" :rem 228 1840 wait198,1:geta$:ifa$<"1"ora$>"5" then1840 :rem 24 1850 ifa$="5"thenpoke686,2:poke698,4 0:goto1010 1860 ft=val(a$)+128:ft$=ehr$(ft) :bp= ase (f$ (x, 4)) :t=ase (f$ (x, 2)) : s=ase (i$ ( x, 3) ) 1870 d$=ft$:gosub330 1880 f$(x,O)=ft$:v=l 1890 sys679:print:print:printspe(11) " [BLACK] ... werkend ... [BLUE] " 1900 next 1910 sys679:printspe(2) " [BLUE] verder

geen gewiste bestanden." 1920 ifv=lthengosub540 1930 print:print:printspe(2) " [WHITE] druk een toets voor het hoofd menu."

1940 wait198,1:geta$:poke686,2:poke6 98,40:goto1010 1950 print"[BLUE]wis bestand - blijf t op direetory:":poke686,4:poke698,20 o 1960 v=O

197

:rem 173

: rem 146 :rem 131 :rem 57

: rem 124 : rem 9

:rem 196 : rem 103

: rem 49

: rem 193

: rem 100 :rem 147

Page 197: 16 Voor de 64

1970 forx=Oto143:a=(asc(f$(x,O)))-12 8:ifa<Othen2060 :rem 141 1980 sys679:print:print:printx+1,f$( x,l) :rem 28 1990 print:print:printspc(2) " [WHITE] dit bestand wissen? [3xSPATIE] (jin) [BLUE]"

2000 wait198,l:geta$:ifa$<>"j"anda$< >"n"anda$<>"[ F1 ]"then2000 2010 ifa$="n"then2070 2020 ifa$="[ F1 ]"thenpoke686,2:poke 698,40:goto1010 2030 bp=asc(f$(x,4)) :t=asc(f$(x,2)): s=asc(f$(x,3)) 2040 d$=chr$ (128) :gosub330 2050 f$(x,O)=chr$(128) :v=l 2060 sys679:print:print:printspc(11) "[BLACK] ... werkend ... [BLUE]"

2070 next 2080 sys679:printspc(5) " [BLUE] geen v erdere bestanden." 2090 ifv=lthengosub540 2100 print:print:printspc(2) " [WHITE] druk een toets voor het hoofdmenu." 2110 wait198,l:geta$:poke686,2:poke6 98,40:goto1010 2120 print" [BLUE] wis bestand - haal van directory:":poke686,4:poke698,200

:rem 209

:rem 91 :rem 126

:rem 243

:rem 247 : rem 168 : rem 94

: rem 114 : rem 8

:rem 243 :rem 102

: rem 39

: rem 183

:rem 251 2130 v=O :rem 137 2140 forx=Oto143:a=(asc(f$(x,O)))-12 8:ifa<Othen2230 :rem 130 2150 sys679:print:print:printx+1,f$( x,l) :rem 18 2160 print:print:printspc(2) " [WHITE] dit bestand wissen? [3xSPATIE] (jin) [BLUE]"

2170 wait198,l:geta$:ifa$<>"n"anda$< >"j"anda$<>"[ F1 ]"then2170 2180 ifa$="n"then2240 2190 ifa$="[ F1 ]"thenpoke686,2:poke 698,40:goto1010 2200 bp=asc (f$ (x, 4) ) :t=asc (f$ (x, 2) ) : s=asc(f$(x,3)) 2210 d$=chr$(O) :gosub330 2220 f$(x,O)=chr$(O) :v=l 2230 sys679:print:print:printspc(11) " [BLACK] ... werkend ... [BLUE] " 2240 next 2250 sys679:printspc(5)"[BLUE]verder

geen bestanden." 2260 ifv=lthengosub540

198

:rem 199

:rem 107 :rem 133

:rem 251

:rem 246 :rem 60 :rem 242

:rem 113 :rem 7

:rem 173 :rem 101

Page 198: 16 Voor de 64

2270 print:print:printspc(2) " [WHITE] druk een toets voor het hoofdmenu." :rem 47 2280 wait198,1:geta$:poke686,2:poke6 98 , 40 : got 0 1 0 1 0 : rem 191 2290 print:print:print" [BLUE] opties voor afdrukken directory:" :rem 239 2300 print:print" [2xSPATIE] 1. hele di rectory afdrukken" :rem 42 2310 print:print" [2xSPATIE]2. alleen geldige bestanden" :rem 244 2320 print:print" [2xSPATIE]3. alleen gewiste bestanden" :rem 29 2330 print:print"[2xSPATIE]4. alleen programma' s" : rem 147 2340 print:print"[2xSPATIE]5. stop af drukken" :rem 165 2350 print:print:printspc(9) "[WHITE] welke optie? (1-5)" :rem 186 2360 wait198,1:geta$:ifa$<"1"ora$>"5" then2360 :rem 20 2370 a=val(a$) :gosub560 :rem 56 2380 ifa$="[ F3 ]"thensys679:goto229 o :rem 220 2390 poke686,2:poke698,40:goto1010

2400 run 2410 print" [CLR] [BLUE]" :poke808, 23 7:close8:close15:end 2420 data8,72,138,72,152,72,162,2,16 0,0,24,32,240,255,160,0,169,32,153,40

:rem 212 :rem 187

:rem 42

,4 :rem 133 2430 data153,0,5,153,0,6,153,0,7,200 ,208,241,104,168,104,170,104,40,96

199

:rem 132

Page 199: 16 Voor de 64
Page 200: 16 Voor de 64

Samenvoegen van programma's op de 64

John A. Winnie

Voor iets gevorderde programmeurs, geeft dit programma de mogelijkheid grote programma's te maken door kleine stukken aan elkaar te voegen. Deze aanpak wordt ook door veel professsionals gevolgd. Doet u veel aan programmeren in BASIC, dan komt u vroeg of laat toe aan het samenvoegen van twee korte programma's. Of u moet aan een programma een reeks DATAregeis toevoegen - DATA voor sprites, opnieuw gedefinieerde karakters, geluid, muziek, wat dan ook. Hier volgt een snelle en eenvoudige methode om die DATAregeis - of wat voor BASIC-opdrachten dan ook - aan het einde van uw programma's toe te voegen. Natuurlijk zijn er verschillende technieken voor het samenvoegen van programma's in omloop. Als een eenvoudig aaneenknopen voldoende is, dan voldoet de hier gepresenteerde methode volledig. Het onderstaande programma is ontworpen om opgenomen te worden in elk programma waaraan programmadelen toegevoegd moeten worden, en heeft de mogelijkheid voor een onbeperkt toevoegen van stukken programma's.

Gebruik van programma Na het intikken en opslaan moet u het programma zoals gewoonlijk laden. Start het programma met RUN en laad dan uw hoofdprogramma. Nu dient u zoals locaties 43 en 44 te POKEn met 1 resp. 8. Waarna uw hoofdprogramma vastzit, klaar voor het toevoegen van extra stukken programma's. Let op, u kunt nu uitsluitend stukken programma toevoegen, niet tussenvoegen. Om met de machinetaal routine rekening te houden dienen uw programma's met regelnummers hoger dan 5 te beginnen. Om dezelfde reden moeten de toe te voegen regelnummers hoger zijn dan de regelnummers die al aanwezig zijn in het hoofdprogramma. Bent u klaar, dan kunt u door verwijderen van regels 1 tot en met 5 de routine wissen. Om te beginnen, wis uw Commodore 64 door het tikken van NEW, gevolgd door de RETURN toets. Voer dan het volgende eenvoudige programma in.

10 REM Geef RETURN, en het l-regelige programma is nu aanwezig in het geheugen, beginnend vanaf adres 2048 en verder oplopend. Om te zien hoe het programma is opgeslagen, moet u invoeren: FOR I=2048 TO 2056:PRINT PEEK(I) i:NEXT I

Is dit goed gedaan, dan ziet u het volgende: o 7 8 10 0 143 0 0 0

De 0 in 2048 is onveranderlijk: alle BASICprogramma's beginnen met een O. Evenzo eindigen ze ook met een 0; in feite eindigen ze altijd met drie opeenvolgende nullen - wat we hier vanaf locaties 2054 tot en met 2056 kunnen zien. Vanaf hier kan BASIC variabelen en andere voor programma uitvoering benodigde informatie kwijt. In het algemeen wordt als een BASICregel wordt opgeslagen, het einde aangegeven door een nul en niet door drie nullen. Wordt een programmaregel toegevoegd, dan komt de code direct achter de eerste nul terecht. Wordt in het bovenstaande voorbeeld, de regel

20 REM toegevoegd, dan komt de verbinding (link) tot stand op plaats 2055, het adres van de middelste nul; een nieuw trio nullen verschijnt hoger in het geheugen, waarmee het einde van

201

Page 201: 16 Voor de 64

regel 20 en het einde van het programma aangegeven wordt. (probeer het maar eens uit, dan ziet u het vanzelf.) Dus om programma(stukken) aaneen te voegen is het voldoende te zorgen dat we het nieuwe stuk: programma laden op het adres van de middelste nul (dat was 2055 in ons voorbeeld) van de drie die het einde van het originele programma aangeven. Wat we moeten doen is BASIC op dit adres te laten beginnen, het toe te voegen stuk laden, en dan de oorspronkelijke waarde weer terug plaatsen (hier 2049).

Knoeien met BASIC Het verhogen van het begin van BASIC is simpel. Het nieuwe adres wordt in adressen 43 en 44 gePOKEt in lage-orde/hoge-orde volgorde (HI=INT(ADRES#/256):LO=ADRES#-256*HI). Dit nieuwe adres te vinden is een probleem apart, maar gelukkig een klein probleempje. Zoals ik hierboven al opmerkte, moet BASIC weten waar het veilig z'n variabelen kan opslaan. Met andere woorden, BASIC moet het eerste adres na de drie nullen van het einde van het programma kennen. Daarom wordt dit adres door de computer in een tweetal geheugenlocaties in een gebruikelijk lage orde/hoge orde vorm opgeslagen. Bij de 64 zijn deze locaties de adressen 45 en 46. Om dit te zien, moet u invoeren PRINT PEEK(45),PEEK(46), en dan moet het paar 9,8 te voorschijn komen. Dit omdat adres 2057 het eerste vrije adres is in ons voorbeeldprogramma en 2057=256*8+9. Vandaar. Nu we het adres van de eerste vrije locatie hebben, is de rest simpel. Het nieuwe gedeelte wordt gewoon twee plaatsen voor dit adres geladen. In het voorbeeld zou dat op adres 2055 zijn (2057-2). Dat is alles wat er bij komt kijken. De achtergrondgedachte van dit programma moet nu duidelijk zijn. Alles van beland is in regel 5 gestopt. ten eerste wordt voor elk programma dat met deze regels begint, een nieuwe start van BASIC berekend met behulp van locaties 45 en 46, zoals beschreven. Vervolgens wordt het begin van BASIC op deze waarde geplaatst. Het resultaat is dat elk programma dat nu geladen wordt begint aan het einde van het voorgaande programma - precies waar we het willen hebben.

64 Samenvoegen van programma's. Gebruik de 'automatische controleur' om dit programmafoutloos in te tikken. Zie bijlage C.

1 c=53280:pokec,6:pokec+1,8 2 input" [BLUE] [CLR] [4xDOWN] [8xRIGHT]

: rem 45 samenvoegen (j/n)"ia$

:rem 212 3 ifa$<>"j"thenend :rem 53 4 print"[10xDOWN] [3xRIGHT] laad nu programma":print" [3xRIGHT] en doe dan poke43,1:poke44,8 rem 179 5 e=256*peek(46)+peek(45)-2:h=int(e/256) :1=e-256*h:poke43,1: poke44,h:end :rem 181

202

Page 202: 16 Voor de 64

Bijlage A:

203

Page 203: 16 Voor de 64
Page 204: 16 Voor de 64

EEN INTRODUCTIE TOT HET INTIKKEN VAN PROGRAMMA'S

Wat is een programma? Een computer kan zonder hulp van buitenaf helemaal niets. Het is net als een auto zonder benzine: de computer heeft potentieel bepaalde mogelijkheden, maar zonder programma gebeurt er niets. Een deel van de programma's in dit boek zijn geschreven in de computertaal BASIC. BASIC is een eenvoudig te leren taal, die in alle Commodore 64 computers is ingebouwd.

BASIC-programma's Computers kunnen knap zeurderig zijn. Een normale taal als Nederlands is niet altijd even duidelijk. Een bepaald woord kan verschillende betekenissen hebben, en een bepaalde mededeling kan op vele manieren gezegd of geschreven worden. BASIC is veel strikter. Elk woord heeft een eigen betekenis en het is meestal maar op een manier mogelijk een bepaalde opdracht aan de computer te geven. Elk letterteken in BASIC heeft een betekenis. Vergissingen die in BASIC tot fouten kunnen leiden zijn het verwisselen van de hoofdletter 0 en het getal 0, het wisselen van de kleine letter I met het getal 1, of het wisselen van een hoofdletter B met het getal 8. De leestekens zijn minstens zo precies in BASIC. U moet de leestekens bij het intikken precies overnemen. Het zelfde geldt voor de spaties. Om onnodig verbeterwerk te voorkomen kunt u de listings het beste precies zoals ze in het boek staan, overnemen.

Haakjes en speciale lettertekens Op elke regel bestaat een uitzondering, en deze regel is geen uitzondering daarop. Als u in een listing haakjes tegenkomt, bijvoorbeeld [DOWN], betekent dit dat de tekens tussen de haakjes speciale tekens zijn, die niet op de printer weergegeven konden worden. Wat u moet doen als u zulke tekens tegenkomt, kunt u nalezen in bijlage B, "Het intikken van programma's"

DAT A-statements Een deel van de programma's bevat een deel met DATA-statements. Deze regels bevatten informatie die het programma nodig heeft. Sommige DATA-statements bevatten zelf een programma (in machinetaal), en andere bevatten grafische gegevens. Het zijn vooral deze regels die erg gevoelig zijn voor het maken van fouten bij het intikken. Als u een enkele tikfout maakt in zo'n DATA-statement, kan het programma (en soms zelfs de computer) helemaal vastlopen. Het kan voorkomen dat uw computer helemaal niet reageert, en dat het scherm helemaal leeg is. Geen paniek, niets aan de hand. Om weer aan de slag te kunnen met de computer, hoeft u deze alleen maar even uit te zetten en daarna weer aan. Hierdoor wordt het programma uit het geheugen gewist. Sla dus altijd eerst een versie van het programma op een diskette of cassette op, voordat u het programma voor de eerste keer runt. Soms veroorzaakt een tikfout in een DATA-statement een foutmelding. De foutmelding geeft zelfs aan in welke regel de fout zit. De computer kan de fout echter niet zelf verbeteren. U moet zelf in de aangegeven regel de tikfout verbeteren.

205

Page 205: 16 Voor de 64

Leer uw machine kennen Het is beter als u al een beetje aan uw computer gewend bent, voordat u begint met het intikken van programma's. Leer de statements die worden gebruikt om een programma op een cassette of diskette te schrijven, en de statements die worden gebruikt om programma's weer in het geheugen te lezen. U zult de programma's die u ingetikt heeft, verschillende keren willen gebruiken. Alleen door het programma vast te leggen op magnetisch materiaal, bent u ervan verzekerd dat het programma vele keren gebruikt kan worden, zonder dat u het telkens opnieuw hoeft in te tikken. Leer de toetsen kennen waarmee u tikfouten verbetert. Hoe verandert u een regel waar zich een fout in bevindt? U kunt de regel natuurlijk opnieuw intikken, maar er zijn betere methoden. U moet in ieder geval het gebruik van de DELETE-toets kennen. Weet u hoe u inverse-video, kleine letters en stuurtekens kunt intikken? Uitleg over deze punten vindt u in de handleidingen.

Samenvatting 1. Tik het programma per regel in. Tik de regels in volgorde in. Druk aan het einde van elke regel op RETURN. Gebruik de DELETE-toets of de pijl-Hnks-toets om fouten te verbeteren, voordat u op RETURN drukt 2. Vergelijk elke regel met de regel in het boek. U kunt het hele programma gaan vergelijken als u na het runnen van het programma, foutmeldingen krijgt.

206

Page 206: 16 Voor de 64

Bijlage B:

207

Page 207: 16 Voor de 64
Page 208: 16 Voor de 64

HET INTIKKEN VAN PROGRAMMA's Voordat u begint met intikken is het handig de computer in de kleine letter mode re zetten. Dit doet u door middel van SHIFT/CBM toets gelijk in te drukken. Om geen misverstanden te laten bestaan over wat er precies moet worden ingetikt, hebben we voor het intikken van de programmalistings de volgende regels opgesteld. Normaal gesproken bevat elke Commodore 64 programmalisting wel woorden die tussen haakjes zijn gezet. Dit geeft aan dat het om speciale tekens gaat. [DOWN] betekent dat de pijl-omlaag-toets ingedrukt moet worden. [5xSPA TIE] betekent dat de spatiebalk vijf keer ingedrukt moet worden.

Het kan een enkele keer voorkomen dat u een enkele letter tussen haakjes ziet. Bijvoorbeeld {A}. Dit betekent dat u deze letter samen met de CONTROL-toets moet indrukken. Bij het gebruik van de aanhalingstekens (SHIFT-2) geldt het volgende: De cursor kan over het scherm verplaatst worden met de cursortoetsen. Soms is het echter heel handig om de cursor binnen een programma te verplaatsen, waarbij het programma de cursor bestuurt. Voor deze toepassing worden de hierboven genoemde notaties als [LEFT],[HOME] of [DOWN] gebruikt. De enige manier waarop de computer onderscheid kan maken tussen het direct willen werken met de cursor, en het in een programma opnemen van cursorbesturing, is het gebruik van aanhalingstekens. Zodra u een stel aanhalingstekens (SHIFT-2) invoert, bent u in de aanhalingsteken-modus. Als u nu iets intikt en vervolgens de cursor wilt verplaatsen, krijgt u alleen een stel inverse-videotekens. Dit zijn de symbolen voor de verplaatsingen van de cursor. De enige toets die niet in een programma opgenomen kan worden is de DEL-toets. Daarom kunt u ook nadat u een stel aanhalingstekens heeft ingetikt, de DEL-toets nog wel gebruiken om een programmaregel te verbeteren. U komt ook in de aanhalingsteken-modus als u spaties in een regel tussenvoegt door middel van de INST -toets. De eenvoudigste wijze om uit de aanhalingsteken-modus te komen, is door op RETURN te drukken. Daarna kunt u de cursortoetsen gebruiken om de fouten te verbeteren.

209

Page 209: 16 Voor de 64
Page 210: 16 Voor de 64

Bijlage C: Automatische controleur

211

Page 211: 16 Voor de 64
Page 212: 16 Voor de 64

DE AUTOMATISCHE CONTROLEUR

Charles Brannon

De 'automatische controleur' helpt u bij het foutloos intikken van programmalistings. Het programma is een kort, fouten controlerend programma dat ergens achterin het geheugen opgeslagen is. Als het programma geactiveerd is, wordt u onmiddellijk na het intikken van de regel gemeld of u een fout gemaakt heeft. Lees de volgende instructies zorgvuldig, voordat u een van de programma's in dit boek gaat intikken.

Instellen van de controleur 1. Tik de listing van de controleur in deze bijlage in. Wees erg voorzichtig bij het intikken van DATA-statements. Tik geen I waar een 1 staat, geen 0 waar een 0 staat. Tik geen extra komma's en laat nergens komma's weg. Enzovoorts. 2. Save de controleur minstens tweemaal op cassette of diskette, voordat u het programma runt. Dit is erg belangrijk, want de controleur wist een gedeelte van zichzelf bij het runnen van het programma. 3. Nadat de controleur opgeslagen is, kunt u RUN tikken. Het programma controleert niet alleen andere programma's, maar ook zichzelf. Als u tikfouten gemaakt heeft in de DATA-statements, krijgt u daarvan een melding. Verbeter het programma en save een goede versie op cassette of diskette. Bewaar een extra kopie op een veilige plaats. 4. Als u een goede versie van de controleur runt, zal het programma zichzelf activeren. U kunt nu een programmalisting gaan intikken. Door RUN/STOP met RESTORE in te drukken, wordt de controleur buiten werking gesteld. Om het programma weer aan het werk te krijgen, tikt u SYS 886 en drukt u op RETURN.

Gebruik van de controleur Elke regel van elk programma in dit boek, heeft aan het einde een controlenummer. Bijvoorbeeld ":rem 123". Dit statement moet bij het intikken van het programma niet ingevoerd worden. Het controlegetal is alleen achteraan de regel geplaatst voor uw informatie. Door het rem-statement voor het getal, zal het programma geen hinder van het toch invoeren van het getal ondervinden. Maar zowel de rem-statement als het getal, nemen geheugenruimte in beslag. Daardoor wordt de controleur in de war gebracht, zelfs als u de rest van de regel foutloos intikt. Als u een regel van een programmalisting ingetikt heeft, en u drukt op RETURN, plaatst de controleur een getal bovenaan het scherm. Dit getal moet precies gelijk zijn aan het controlegetal achteraan de regel (achter het rem-statement). Als de twee getallen niet gelijk zijn, is er een verschil tussen de regel die u ingetikt heeft, en de regel zoals die in het boek staat. Controleer onmiddellijk wat u getikt heeft. Vergeet niet dat het rem-statement en het controlegetal zelf niet ingetikt moeten worden. Dit getal dient alleen om vergeleken te worden met het getal dat de controleur opgeeft na het intikken van elke regel. De controleur zeurt niet over het aantal spaties. Als u te weinig of te veel spaties tikt, zal de controleur daar niet op letten. De controleur is zo gemaakt, omdat in het algemeen het aantal spaties niet belangrijk is. Maar soms (vooral binnen PRINT-statements) kunnen spaties wel belangrijk zijn. Wees dus voorzichtig bij het invoeren van de spaties. Alleen bij spaties let de controleur niet echt streng op. Als u de opdrachten in de vorm van afkorting invoert, terwijl de opdrachten

213

Page 213: 16 Voor de 64

voluit in de listing staan, zal de controleur een ander getal aangeven, dan het controlegetal achteraan de regel. U kunt een regel met afkortingen toch nog controleren door, nadat de regel ingevoerd is, de regel te LlSTen. Nu worden de afkortingen voluit geschreven. Verplaats de cursor naar het begin van de regel en druk op RETURN. Het getal dat de controleur nu aangeeft moet wel gelijk zijn aan het controlegetal achteraan de regel.

Speciale cassette-SA VE-instructies Als u klaar bent met het intikken van de listing, moet u de controleur uitzetten, voordat u het programma naar cassette wegschrijft. Zet de controleur uit door middel van RUN/STOP-RESTORE (druk de RUN/STOP-toets in, en druk kort de RESTORE-toets in) .

. Deze procedure hoeft u niet te volgen als u diskettes gebruikt, maar is absoluut noodzakelijk voor cassette-gebruikers. Een SAVE naar een cassette wist de controleur uit het geheugen, zodat u voor een andere

listing, de controleur weer helemaal moet laden. Een SAVE naar diskette wist de controleur niet.

Verborgen gevaren De plaats van de controleur binnen het geheugen is niet echt veilig. Omdat de cassette-buffer tijdens cassette-bewerkingen gewist wordt, is het nodig de controleur uit te zetten voordat u het programma naar cassette wegschrijft. Maar hoe zit het dan als het programma niet in een keer ingetikt wordt, maar in verschillende sessies? Bij de tweede sessie laadt u eerst de controleur en vervolgens wilt u het eerder getikte gedeelte van het programma laden. Maar daarvoor wordt de cassette-buffer gebruikt, zodat de controleur gewist wordt. Het is dus nodig om de controleur te laden nadat u het programma geladen heeft. Maar het laden van een nieuw programma, wist het oude programma in het geheugen. Nadat u de controleur ingetikt en gerund heeft, moet u de volgende regels in de directe modus (zonder regelnummers) precies als ze opgeschreven zijn, intikken: A$= "PCONTROLEUR.T": B$="{lO SPATIES}": FOR X=lT04: A$=A$+B$: NEXT X FOR x=886T01018: A$=A$+CHR$(PEEK(X)): NEXT X OPEN1,1,1,A$: CLOSEl N adat u de laatste regel ingetikt heeft, vraagt de computer u om de opname- (REC) en afspeel­(pLA Y) knop van uw cassette-recorder in te drukken. Plaats dit programma aan het begin van een nieuwe cassette. Hierdoor heeft u een nieuwe methode om de controleur in het geheugen te lezen zonder de inhoud van het geheugen te beroeren. Stop de cassette in de recorder, spoel de cassette naar het begin en tik: OPEN1: CLOSEl U kunt de controleur nu opstarten door SYS 886 in te tikken. Om dit uit te proberen, tikt u PEEK(886). U moet dan het getal 173 krijgen. Zo niet, dan moet u bovenstaande stappen herhalen. Let erop dat A$("PCONTROLEUR.T") precies 13 letterteken bevat en dat B$ 10 spaties bevat. De controleur zal zichzelf in de cassette-buffer laden elke keer dat u OPENl: CLOSEI tikt, en PCONTROLEUR.T het volgende programma op de cassette is. De inhoud van het BASIC-geheugen wordt niet beinvloed.

214

Page 214: 16 Voor de 64

100 print" [CLR] wacht even ... ":fori =886to1018:reada:ck=ck+a:pokei,a:next

110 ifck<>17539thenprint" [DOWN] u hee : rem 12

ft een fout in de" :print "dataregels ge maakt. ":end : rem 90 120 sys886:print" [CLR] [2xDOWN]proo freader geactiveerd.":new : rem 166 886 data 173,036,003,201,150,208 : rem 38 892 data 001,096,141,151,003,173 : rem 36 898 data 037,003,141,152,003,169 : rem 45 904 data 150,141,036,003,169,003 :rem 30 910 data 141,037,003,169,000,133 :rem 26 916 data 254,096,032,087,241,133 : rem 50 922 data 251,134,252,132,253,008 : rem 36 928 data 201,013,240,017,201,032 : rem 22 934 data 240,005,024,101,254,133 : rem 27 940 data 254,165,251,166,252,164 : rem 51 946 data 253,040,096,169,013,032 : rem 47 952 data 210,255,165,214,141,251 : rem 38 958 data 003,206,251,003,169,000 :rem 34 964 data 133,216,169,019,032,210 :rem 43 970 data 255,169,018,032,210,255 :rem 47 976 data 169,058,032,210,255,166 : rem 58 982 data 254,169,000,133,254,172 : rem 48 988 data 151,003,192,087,208,006 : rem 52 994 data 032,205,189,076,235,003 : rem 52 1000 data 032,205,221,169,032,032 : rem 66 1006 data 210,255,032,210,255,173 : rem 75 1012 data 251,003,133,214,076,173 :rem 75 1018 data 003 : rem 119

215

Page 215: 16 Voor de 64
Page 216: 16 Voor de 64

B ij lage D: Machinetaal redacteur MTK

217

Page 217: 16 Voor de 64
Page 218: 16 Voor de 64

DE MACHINETAAL-REDACTEUR: MTR

Charles Brannon

Kunt u zich de laatste keer nog herinneren dat u een BASIC-lader voor een machinetaalprogramma intikte? U tikte honderden getallen en komma's in. Nergens had u houvast of u de getallen wel allemaal goed intikte. Dus, bij het eind gekomen, las u alles nog eens heel precies door. U runde het programma: niets, fouten dus. Nog een keer doorlezen, enkele fouten verbeteren, weer runnen, weer fouten. Weer doorlezen, enzovoorts, enzovoorts. Nogal frustrerend! Toch was dit, tot nu toe, de beste methode om een machinetaalprogramma in te voeren. Tenzij u de beschikking heeft over een assembler, en op asembleemiveau met machinetaal wilt stoeien, is de eenvoudigste manier om een BASIC-PROGRAMMA te nemen, dat DATA-statements leest, en de getallen in het geheugen POKEt. Enkele van dit soort 'BASIC-laders' gebruiken een controlegetal om te zien of u de getallen goed ingetikt heeft. Het eenvoudigste controlegetal is de som van de getallen in een bepaald DATA-statement. Als u een tikfout maakt, zijn het controlegetal en het totaal, verschillend. Sommige programmeurs maken het u nog eenvoudiger, door om de paar regels een controlegetal op te nemen, zodat u telkens een paar regels tegelijk kunt controleren. Maar nu is er MTR. MTR is de manier voor het invoeren van lange machinetaalprogramma's zonder de gebruikelijke ellende. MTR laat u de getallen invoeren vanaf een lijst die er uit ziet als een verzameling DAT A-statements. Uw tikwerk wordt elke regel gecontroleerd. Invoer van illegale lettertekens waar u cijfers moet intikken, wordt onmiddellijk aangegeven. Getallen groter dan 255 (verboden in machinetaal) worden onmiddellijk teruggegeven. Het invoeren van getallen op de verkeerde regel is onmogelijk. Kortom, MTR maakt het herlezen van de ingetikte listing overbodig.

Kopie op cassette of diskette Naast de eenvoud met intikken die MTR u biedt, maakt MTR een kant-en-klare kopie van uw machinetaalprogramma op cassette of diskette. U kunt daarna de LOAD-opdracht gebruiken om het programma, net als elk ander programma, in het geheugen te laden. U tikt daarvoor: LOAD "programmanaam",8,1 (diskette) of LOAD "programmanaam",l,l (cassette) Om het programma nu op te kunnen starten, heeft u een SYS-opdracht nodig. Deze opdracht geeft de controle van BASIC over aan machinetaal. Het adres dat achter SYS moet worden geplaatst, is voor elk programma anders. In de begeleidende tekst bij elk programma is het juiste getal voor dat programma gegeven.

Het gebruik van MTR Tik MTR eerst in, en sla het op een cassette of diskette op. U zult het nog vele malen nodig hebben. Als u een machinetaal programma wilt gaan intikken, runt u MTR. MTR vraagt dan om twee getallen. Het eerste getal is het beginadres en het tweede getal is het eindadres. Beide getallen worden altijd gegeven in de begeleidende tekst bij het programma. Bijvoorbeeld: "Scherm-80" heeft de adressen 49152 en 52811 nodig. U ziet nu een prompt. De prompt geeft de huidige regel die u aan het invoeren bent, aan. De prompt wordt na elke regel met zes verhoogd. Dat is omdat elke regel zeven getallen heeft:

219

Page 219: 16 Voor de 64

zes echte getallen, en een controlegetal. Het controle ge tal controleert of u de voorafgaande zes getallen goed ingetikt heeft. Als u een van de zes getallen, of de controlesom niet goed invoert, klinkt er een zoemer, en wordt u gevraagd de regel opnieuw in te voeren. Als u de regel goed invoerde, klinkt er een bel, en kunt u verder gaan met de volgende regel.

De speciale redacteur Als U MTR gebruikt, beschikt u niet over de normale BASIC-opmaak mogelijkheden. Zo accepteert de MTR alleen getallen. Als u een tikfout maakt, kunt u de INST/DEL-toets indrukken. Het gehele getal wordt dan gewist. U kunt net zo vaak indrukken als u wilt, tot het begin van de regel. Als u een drie-cijfergetal invoert, zoals aangegeven, drukt de computer de komma automatisch af, en gaat verder om het volgende getal te accepteren. Als u minder dan drie cijfers invoert, kunt u ofwel de spatiebalk, ofwel de RETURN-toets indrukken om naar het volgende getal verder te gaan. Het controlegetal verschijnt automatisch in omgekeerde video om het getal te benadrukken. Om het invoeren van getallen nog eenvoudiger te maken, groepeert MTR de toetsen van het toetsenbord op een aparte wijze (regels 581-584).

Bij het uitproberen van MTR, merkte ik dat het programma ontzettend handig is bij het invoeren van lange programma's. Door de geluidssignalen hoeft een goede typist zelfs helemaal niet meer naar het scherm te kijken.

Klaar! Als u klaar bent met tikken (we gaan er even van uit dat u het machinetaalprogramma in een keer intikte), kunt u het fout-vrije programma naar diskette of cassette wegschrijven. Volg daarbij de gebruiksaanwijzing op het scherm. Als u een foutmelding krijgt tijdens het

wegschrijven, heeft u een slechte diskette, is de diskette vol, of heeft u een tikfout gemaakt bij het invoeren van het MTR-programma. (Sorry, MTR kan zichzelf niet controleren!)

Opdrachten Het is natuurlijk niet nodig om het hele machinetaalprogramma in een keer in te tikken. Met MTR kunt u net zoveel tikken als u wilt, waarna u het gedeelte dat af is, op cassette of diskette wegschrijft, om later weer mee verder te gaan. MTR gebruikt daarbij de volgende opdrachten: SHIFT-S: SAVE (wegschrijven) SHIFT-L: LOAD (inlezen) SHIFT-N: Nieuw adres SHIFT-D: Weergave Hou de SHIFT-toets ingedrukt, terwijl u de gewenste toets indrukt. MTR springt uit de regel die u aan het intikken was, dus u kunt dit het beste doen als u net een regel afgemaakt heeft. Gebruik de SAVE-opdracht om uw gedane arbeid op te slaan. Het gedeeltelijke programma zal net als een gewoon programma op cassette of diskette worden weggeschreven, maar het is natuurlijk nog niet mogelijk het programma te gebruiken. Dat kan pas als het programma helemaal ingetikt is. Onhoud bij welk adres u stopte. De volgend keer dat u MTR runt, beantwoordt u alle vragen van de computer op dezelfde wijze als de eerste keer. Stop de cassette of diskette in de recorder of drive en druk op SHIFT-L als u de invoer-prompt op het scherm ziet. Gebruik vervolgens de opdracht Nieuw Adres (SHIFT-N) om verder te gaan op de plaats waar u gebleven was.

220

Page 220: 16 Voor de 64

Nieuw adres en weergave Nadat u SHIFT-N ingedrukt heeft, moet u het adres invoeren van de regel waar u gestopt was met tikken. De prompt zal veranderen en u kunt verder gaan met tikken. Geef als nieuw adres altijd een adres op dat overeenkomt met een van de adressen uit de listing, anders kloppen de controlegetallen niet meer. U kunt de weergave-opdracht gebruiken om een deel van uw tikwerk op het scherm te zien. Na het indrukken van SHIFT-D moet u twee adressen opgeven. Beide adressen moeten binnen het gebied van de regelnummers van de listing vallen. U verlaat de listing door een willekeurige toets in te drukken.

De fijne kneepjes De speciale opdrachten zien er moeilijker uit dan ze zijn. Stel dat u vergeten bent waar u was gebleven met tikken. Gebruik de weergave-opdracht om het geheugen van het begin tot het einde te doorzoeken. Vanaf het punt waar u met tikken was gebleven, zullen de regels willekeurige tekens bevatten. Dat ziet er heel anders uit dan uw tikwerk. Als u op deze manier het eindpunt van uw tikwerk tegenkomt, drukt u op een willekeurige toets om de listing te stoppen. Gebruik nu de nieuwe-adres-opdracht om bij het juiste adres verder te gaan met tikken. U kunt de SA VE- en LOAD-opdrachten gebruiken om kopieen te maken van het complete machinetaal programma. Gebruik de LOAD-opdracht om het programma van cassette of diskette te laden, stop een nieuwe diskette of cassette in het apparaat en gebruik de SA VE-opdracht om een kopie te maken. Als u diskettes gebruikt, is het handig om elke keer dat u het programma wegschrijft, een andere naam te gebruiken. Ik vind het bijvoorbeeld prettig om mijn werk door te nummeren, en gebruik dus bestandsnamen als ASTRO!, ASTR02, ASTR03, enzovoorts. Er is nog een raar effect voor cassette-gebruikers die de SAVE-opdracht geven. Als u een programma dat op deze wijze is opgeslagen weer laadt, ziet u het bericht FOUND programma, twee keer op het scherm verschijnen. De programma's worden wel goed geladen. MTR zal ook voor u een tijdbesparend programma blijken te zijn. Het programma is reeds vele malen getest en goed bevonden. Vergeet niet om MTR op cassette of diskette op te slaan. U zult het programma nog vaak kunnen gebruiken bij het intikken van programma's uit een van de COMPUTE!-publikaties.

Machinetaal redacteur: MTR Om dit programma zonder fouten in te voeren, kunt u gebruik maken van de 'automatische controleur'. Zie hiervoor bijlage C.

90 rv$=chr$(18) :ro$=chr$(146) :rem 86 95 rm$=chr$(223) :rl$=chr$(169) :rr$=r m$+rl$:rs$=rl$+rm$ :rem 97 100 print" [CLR) [L.GREEN) ";chr$(142 );chr$(8);:poke53281,1:poke53280,1

101 poke788,52:rem schakel run/stop :rem 67

uit :rem 112 110 printrv$"[39xSPATIE)"; :rem 176 120 printrv$"[14xSPATIE) [RIGHT) "ro$rr $rv$" [RIGHT) [RIGHT) [2xSPATIE) "rm$ro$rr $rv$rl$rv$"[15xSPATIE)"; :rem 18

221

Page 221: 16 Voor de 64

130 printrv$" [13xSPATIE] [RIGHT] [2xSPATIE] [RIGHT] [2xRIGHT] "ro$rl$rv$rs$ro$rm$r v$" [14xSPATIE] "; :rem 77 140 printrv$" [41xSPATIE]" :rem 120 200 print" [2xDOWN] [PURPLE] [BLACK] mac hinetaal editor versie 2.02[5xDOWN]"

:rem 116 210 print"[GREY 2] [2xUP]startadres?[8xSPATIE] [9xLEFT]"; :rem 26 215 inputs: f=l-f: c$=chr$ (31+119*f)

:rem 166 220 ifs<256or(s>40960ands<49152)ors> 53247thengosub3000:goto210 :rem 235 225 print:print:print :rem 180 230 print" [GREY 2] [2xUP]eindadres?[8xSPATIE] [9xLEFT]";:inpute:f=1-f:c$=chr$(31+119 *f)

:rem 232 240 ife<256or(e>40960ande<49152)ore> 53247thengosub3000:goto230 :rem 183 250 ife<sthenprintc$;"[RVS ON] eind <

etart[2xSPATIE] ":gosub1000:goto230 :rem 27

260 print:print:print :rem 179 300 print"[CLR]";chr$(14) :ad=s

:rem 225 310 a=l:printright$("OOOO"+mid$(str$ (ad) , 2) , 5) ; " : " ; : rem 3 3 315 forj=ato6 :rem 33 320 gosub570:ifn=-lthenj=j+n:goto320

:rem 228 390 ifn=-211then710 :rem 62 400 ifn=-204then790 :rem 64 410 ifn=-206thenprint:input"[DOWN]Ge ef nieuw adres";zz :rem 204 415 ifn=-206thenifzz<sorzz>ethenprint "[RVS ON]buiten bereik":gosub1000:goto 410 :rem 96 417 ifn=-206thenad=zz:print:goto310

:rem 238 420 ifn<>-196then480 :rem 133 430 print:input"Display :van";f:print " tot"; : inputt

:rem 195 440 iff<sorf>eort<sort>ethenprint"Mi nstens";s;"[LEFT],niet meer dan";e:goto 430 :rem 223 450 fori=ftotstep6:print:printright$ ("0000"+mid$(str$(i),2),5);":"; :rem 30 451 fork=Oto5:n=peek(i+k) :printright$ ("00"+mid$(str$(n),2),3);","; :rem 66 460 geta$:ifa$>""thenprint:print:goto

222

Page 222: 16 Voor de 64

310 :rem 25 470 nextk:printchr$(20) ;:nexti:print :print:got0310 :rem 50 480 ifn<Othenprint:got0310 :rem 168 490 a(j)=n:nextj :rem 199 500 cksum=ad-int(ad/256)*256:fori=lto 6:cksum=(cksum+a(i))and255:next :rem 200 510 printchr$(18);:gosub570:printchr$ (146) ; : rem 94 511 ifn=-lthena=6:got0315 :rem 254 515 printchr$(20) :ifn=cksumthen530

:rem 122 520 print:print"Regel verkeerd ingev oerd: nog eens":print:gosubl000:got031 o :rem 171 530 gosub2000 : rem 218 540 fori=lt06:pokead+i-l,a(i) :next:poke 54272,0:poke54273,0 :rem 227 550 ad=ad+6:ifad<ethen310 :rem 212 560 got0710 : rem 108 570 n=O: z=O : rem 88 580 printchr$(166); :rem 84 581 geta$:ifa$=""then581 :rem 95 582 av=-(a$="m")-2*(a$=",")-3*(a$="." )-4*(a$="j")-5*(a$="k")-6*(a$="1")

583 av=av-7*(a$="u")-8*(a$="i")-9*(a :rem 41

$="0") : ifa$="h"thena$="O" : rem 134 584 ifav>Othena$=chr$(48+av) :rem 134 585 printchr$(20) ;:a=asc(a$) :ifa=130r a=440ra=32then670 :rem 229 590 ifa>128thenn=-a:return :rem 137 600 ifa<>20then630 :rem 10 610 gosub690:ifi=landt=44thenn=-1:print "[RVS OFF] [LEFT] [LEFT]"; :got0690

:rem 62 620 got0570 : rem 109 630 ifa<480ra>57then580 :rem 105 640 printa$;:n=n*10+a-48 :rem 106 650 ifn>255thena=20:gosubl000:got060 o :rem 229 660 z=z+1:ifz<3then580 :rem 71 670 ifz=Othengosubl000:got0570 :rem 114 680 print","; : return :rem 240 690 s%=peek(209)+256*peek(210)+peek( 211) :rem 149 691 fori=lt03:t=peek(s%-i) :rem 67 695 ift<>44andt<>58thenpokes%-i,32:next

:rem 205 700 printleft$("[3xLEFT]",i-l);:return

710 print" [CLR] [RVS ON] *** Save ** * [3xDOWN]"

223

: rem 7

:rem 236

Page 223: 16 Voor de 64

715 print" [2xDOWN] (met [RVS ON] RETURN [RVS OFF] geen SAVE) [DOWN]" : rem 170 720 f$='''': input" [DOWN] Filenaam"; f$: iff$=""thenprint:print:goto310 :rem 67 730 print:print" [2xDOWN] [RVS ON]T[RVS OFF] ape of [RVS ON] D [RVS OFF] isk: (T/D)"

:rem 216 740 geta$:ifa$<>"t"anda$<>"d"then740

:rem 36 750 dv=1-7*(a$="d") :ifdv=8thenf$="0:" +f$:open15,8,15,"s"+f$:close15 :rem 212 760 t$=f$:zk=peek(53)+256*peek(54)-len (t$) :poke782,zk/256 : rem 3 762 pOke781,zk-peek(782)*256:poke780 ,len(t$) :sys65469 :rem 109 763 poke780,1:poke781,dv:poke782,1:sys 65466 :rem 69 765 k=s:poke254,k/256:poke253,k-peek (254)*256:poke780,253 :rem 17 766 k=e+1:poke782,k/256:poke781,k-peek (782)*256:sys65496 :rem 235 770 if(peek(783)and1)or(191andst)then 780 :rem 111 775 print" [DOWN] Klaar. [DOWN]" :goto31 o :rem 182 780 print"[DOWN]Fout tijdens schrijv en. Probeer het nog eens [DOWN] ":ifdv=l then720 ' :rem 83 781 open15,8,15:input#15e1$,e2$:print e1$;e2$:close15:goto720 :rem 103 790 print"[CLR] [RVS ON]*** Laad ** * [2xDOWN] " : rem 212 795 print" [2xDOWN] (met [RVS ON]RETURN [RVS OFF] geen LOAD) [DOWN]" : rem 163 800 f$="":input"[2xDOWN] Filenaam";f $:iff$=""thenprint:goto310 :rem 140 810 print:print" [2xDOWN] [RVS ON]T[RVS OFF] ape of [RVS ON]D[RVS OFF]isk: (T/D)"

:rem 215 820 geta$:ifa$<>"t"anda$<>"d"then820

:rem 34 830 dv=1-7*(a$="d") :ifdv=8thenf$="0:" +f$ :rem 157 840t$=f$:zk=peek(53)+256*peek(54)-len (t$) :poke782,zk/256 :rem 2 841 poke781,zk-peek(782)*256:poke780 ,len(t$) :sys65469 :rem 107 845 poke780,1:poke781,dv:poke782,1:sys 65466 :rem 70 850 poke780,0:sys65493 :rem 11 860 if(peek(783)and1)or(191andst)then 870 :rem 111 865 print" [DOVm] Klaar. ":goto310 :rem 165

224

Page 224: 16 Voor de 64

870 print" [DOWN] Fout tijdens lezen. Probeer het nog eens[DOWN]":ifdv=lthen 800 :rem 36 880 open 15,8,15:input#15,e1$,e2$:print e1$;e2$:close15:goto800 :rem 102 1000 rem zoemer :rem 119 1001 poke54296,15:poke54277,45:poke5 4278,165 :rem 207 1002 poke54276,33:poke54273,6:poke54 272,5 :rem 42 1003 fort=lto200:next:poke54276,32:poke 54273,0:poke54272,0:return :rem 202 2000 rem geluid van een belletje

:rem 100 2001 poke54296,15:poke54277,0:poke54 278,247 :rem 152 2002 poke54276,17:poke54273,40:poke5 4272,0 :rem 86 2003 fort=lto100:next:poke54276,16:return

:rem 57 3000 printc$;"[RVS ON] niet in ROM 0

f page zero.":goto1000 :rem 209

wordt CD00 0000

mmm

225

Page 225: 16 Voor de 64