********* Welcome to Project 64! The goal of Project 64 is to preserve Commodore 64 related documents in electronic text format that might otherwise cease to exist with the rapid advancement of computer technology and declining interest in 8- bit computers on the part of the general population. If you would like to help by converting C64 related hardcopy documents to electronic texts please contact the manager of Project 64, Cris Berneburg, at 74171.2136@compuserve.com. Extensive efforts were made to preserve the contents of the original document. However, certain portions, such as diagrams, program listings, and indexes may have been either altered or sacrificed due to the limitations of plain vanilla text. Diagrams may have been eliminated where ASCII-art was not feasible. Program listings may be missing display codes where substitutions were not possible. Tables of contents and indexes may have been changed from page number references to section number references. Please accept our apologies for these limitations, alterations, and possible omissions. Document names are limited to the 8.3 file convention of DOS. The first characters of the file name are an abbreviation of the original document name. The version number of the etext follows next. After that a letter may appear to indicate the particular source of the document. Finally, the document is given a .TXT extension. The author(s) of the original document and members of Project 64 make no representations about the accuracy or suitability of this material for any purpose. This etext is provided "as-is". Please refer to the warantee of the original document, if any, that may included in this etext. No other warantees, express or implied, are made to you as to the etext or any medium it may be on. Neither the author(s) nor the members of Project 64 will assume liability for damages either from the direct or indirect use of this etext or from the distribution of or modification to this etext. ********* The Project 64 etext of the Commodore 64 User's Guide. Converted to etext by Frank Jeno Kontros , the Non Stop Cracker. C64USG10.TXT, September 1996, etext #91. ********* Note: To extract the ascii text basic programs all at once from this etext use "tok64" by Cris Berneburg <74171.2136@compuserve.com>. Or to extract the uuencoded basic programs all at once use "uud" by Edwin Kremer . ********* There was a great work, but finally, after 2 weeks of correcting and formatting the text to the format what you now see, it is ready. I hope that this manual is the second greatest project after COMMDODORE 64 PROGRAMMER'S REFERENCE GUIDE. It is dedicated to C64 users who haven't the original manual or buy 64 without it. Enjoy it! Generally it is the original US manual with all programs and near all pictures. There was many bugs & mispells corrected by me. Also the index now is more usable instead original. If you find errors in the text, please report them so that they can be fixed. There should not be many, though... Frank Kontros, The Non Stop Cracker, jeno@kontr.uzhgorod.ua ********* COMMODORE 64 USER'S GUIDE _____ / ___|___ | / |__/ c o m m o d o r e | \___|__\ C O M P U T E R \_____| USER'S MANUAL STATEMENT "This equipment generates and uses radio frequency energy and if not installed and used properly, that is, in strict accordance with the manufacturer's instructions, may cause interference to radio and television reception. It has been type tested and found to comply with the limits for a Class B computing device in accordance with the specifications in Subpart J of Part 15 of FCC rules, which are designed to provide reasonable protection against such interference in a residential installation. However, there is no guarantee that interference will not occur in a particular installation. If this equipment does cause interference to radio or television reception, which can be determined by turning the equipment off and on, the user is encouraged to try to correct the interference by one or more of the following measures: - reorient the receiving antenna, - relocate the computer with respect to the receiver, - move the computer away from the receiver, - plug the computer into a different outlet so that computer and receiver are on different branch circuits. "If necessary, the user should consult the dealer or an experienced radio/television technician for additional suggestions. The user may find the following booklet prepared by the Federal Communications Commission helpful: 'How to Identify and Resolve Radio-TV Interference Problems.' This booklet is available from the U.S. Government Printing Office, Washington, D.C. 20402, Stock No. 004-000-00345-4." COMMODORE 64 USER'S GUIDE Published by Commodore Business Machines, Inc. and Howard W. Sams & Co., Inc. FIRST EDITION THIRD PRINTING-1983 Copyright (C) 1982 by Commodore Business Machines, Inc. All rights reserved. This manual is copyrighted and contains proprietary information. No part of this publication may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, electronic, mechanical, photocopying, recording, or otherwise, without the prior written permission of COMMODORE BUSINESS MACHINES, Inc. TABLE OF CONTENTS INTRODUCTION 1. SETUP 1.1. Unpacking and Connecting the Commodore 64 1.2. Installation 1.3. Optional Connections 1.4. Operation 1.5. Color Adjustment 2. GETTING STARTED 2.1. Keyboard 2.2. Back to Normal 2.3. Loading and Saving Programs 2.4. PRINT and Calculations 2.5. Precedence 2.6. Combining Things 3. BEGINNING BASIC PROGRAMMING 3.1. The Next Step GOTO 3.2. Editing Tips 3.3. Variables 3.4. IF ... THEN 3.5. FOR ... NEXT Loops 4. ADVANCED BASIC 4.1. Introduction 4.2. Simple Animation Nested Loops 4.3. INPUT 4.4. GET 4.5. Random Numbers and Other Functions 4.6. Guessing Game 4.7. Your Roll 4.8. Random Graphics CHR$ and ASC Functions 5. ADVANCED COLOR AND GRAPHIC COMMANDS 5.1. Color and Graphics 5.2. PRINTing Colors 5.3. Color CHR$ Codes 5.4. PEEKs and POKEs 5.5. Screen Graphics 5.6. Screen Memory Map 5.7. Color Memory Map 5.8. More Bouncing Balls 6. SPRITE GRAPHICS 6.1. Introduction to Sprites 6.2. Sprite Creation 6.3. Additional Notes on Sprites 6.4. Binary Arithmetic 7. CREATING SOUND 7.1. Using Sound if You're Not a Computer Programmer 7.2. Structure of a Sound Program 7.3. Sample Sound Program 7.4. Making Music on Your Commodore 64 7.5. Important Sound Settings 7.6. Playing a Song on the Commodore 64 7.7. Creating Sound Effects 7.8. Sample Sound Effects To Try 8. ADVANCED DATA HANDLING 8.1. READ and DATA 8.2. Averages 8.3. Subscripted Variables One-Dimensional Arrays Averages Revisited 8.4. DIMENSION 8.5. Simulated Dice Roll With Arrays 8.6. Two-Dimensional Arrays APPENDICES Introduction A: COMMODORE 64 ACCESSORIES AND SOFTWARE B: ADVANCED CASSETTE OPERATION C: COMMODORE 64 BASIC D: ABBREVIATIONS FOR BASIC KEYWORDS E: SCREEN DISPLAY CODES F: ASCII AND CHR$ CODES G: SCREEN AND COLOR MEMORY MAP H: DERIVING MATHEMATICAL FUNCTIONS I: PINOUTS FOR INPUT/OUTPUT DEVICES J: PROGRAMS TO TRY K: CONVERTING STANDARD BASIC PROGRAMS TO COMMODORE 64 BASIC L: ERROR MESSAGES M: MUSIC NOTE VALUES N: BIBLIOGRAPHY O: SPRITE REGISTER MAP P: COMMODORE 64 SOUND CONTROL SETTINGS INDEX INTRODUCTION Congratulations, on your purchase of one of the best computers in the world. You are now the proud owner of the COMMODORE 64. Commodore is known as The Friendly Computer company, and part of being friendly is giving you easy to read, easy to use and easy to understand instruction manuals. The COMMODORE 64 USER'S GUIDE is designed to give you all the information you need to properly set up your equipment, get acquainted with operating the COMMODORE 64, and give you a simple, fun start at learning to make your own program. For those of you who don't want to bother learning how to program, we've put all the information you need to use Commodore programs or other prepackaged programs and/or game cartridges (third party software) right up front. This means you don't have to hunt through the entire book to get started. Now let's look at some of the exciting features that are just waiting for you inside your COMMODORE 64. First, when it comes to graphics you've got the most advanced picture maker in the microcomputer industry. We call it SPRITE GRAPHICS, and it allows you to design your own pictures in 4 different colors, just like the ones you see on arcade type video games. Not only that, the SPRITE EDITOR let's you animate as many as 8 different picture levels at one time. The SPRITE EDITOR will soon be available as software program that you can load directly into your COMMODORE 64. You can move your creations anywhere on the screen, even pass one image in front of or behind another. Your COMMODORE 64 even provides automatic collision detection which instructs the computer to take the action you want when the sprites hit each other. Next, the COMMODORE 64 has built-in music and sound effects that rival many well known music synthesizers. This part of your computer gives you 3 independent voices, each with a full 9 octave "piano-type" range. In addition you get 4 different waveforms (sawtooth, triangle, variable pulse, and noise), a programmable ADSR (attack, decay, sustain, release) envelope generator and a programmable high, low, and bandpass filter for the voices, and variable resonance and volume controls. If you want your music to play back with professional sound reproduction, the COMMODORE 64 allows you to connect your audio output to almost any high-quality amplification system. While we're on the subject of connecting the COMMODORE 64 to other pieces of equipment ... your system can be expanded by adding accessories, known as peripherals, as your computing needs grow. Some of your options include items like a DATASSETTE recorder or as many as 5, VIC 1541 disk drive units for the programs you make and/or play. If you already have a VIC 1540 disk drive your dealer can update it for use with the COMMODORE 64. You can add a VIC dot matrix printer to give you printed copies of your programs, letters, invoices, etc... If you want to connect up with larger computers and their massive data bases then just plug in a VICMODEM cartridge, and get the services of hundreds of specialists and a variety of information networks through your home or business telephone. Finally if you're one of those people interested in the wide variety of applications software available in CP/M, the COMMODORE 64 can be fitted with a plug-in Z-80 microprocessor. Just as important as all the available hardware is the fact that this USER'S GUIDE will help you develop your understanding of computers. It won't tell you everything there is to know about computers, but it will refer you to a wide variety of publications for more detailed information about the topics presented. Commodore wants you to really enjoy your new COMMODORE 64. And to have fun, remember: programming is not the kind of thing you can learn in a day. Be patient with yourself as you go through the USER'S GUIDE. But before you start, take a few minutes to fill out and mail in the owner/registration card that come with your computer. It will ensure that your COMMODORE 64 is properly registered with Commodore Headquarters and that you receive the most up-to-date information regarding future enhancements for your machine. Welcome to a whole new world of fun! NOTE: Many programs are under development while this manual is being produced. Please check with your local Commodore dealer and with Commodore User's Magazines and Clubs, which will keep you up to date on the wealth of applications programs being written for the Commodore 64, worldwide. 1. SETUP 1.1. Unpacking and Connecting the Commodore 64 The following step-by-step instructions show you how to connect the Commodore 64 to your television set, sound system, or monitor and make sure everything is working properly. Before attaching anything to the computer, check the contents of the Commodore 64 container. Besides this manual, you should find the following items: 1. Commodore 64 2. Power supply (black box with an AC plug and supply cord) 3. Video cable 4. TV Switchbox (small silver box with short antenna leads). If any items are missing check back with your dealer immediately for a replacement. First, let's take a look at the arrangement of the various connections on the computer and how each functions. /####\--------^--\ /#### | /#### | ____/#### | / | | ---- ---- __ /-\ | | \--/ \--/ == \_/ | \________________\___/______/____|__/ \/ / | 3 2 1 GAME POWER POWER PORTS SWITCH SOCKET ___/###\__/##_##_##_##_##_##_##_##_##_##_##_##_##_##_##_##\__ |-------------------------------------------------------------| | | | | | | | +--------------+ /-\ /-\ +------+ +----------+ | | |==============| [=] O \_/ \_/ |======| |==========| | +-----/-------------/----/-----\-----\--------\---------\-----+ / / / \ \ \ \ 4 5 6 7 8 9 10 CARTRIDGE CHANNEL TV AUDIO/VIDEO SERIAL CASSETTE USER SLOT SELECTOR CONNECTOR CONNECTOR PORT INTERFACE PORT SIDE PANEL CONNECTIONS 1. POWER SOCKET. The free end of the cable from the power supply is attached here to supply power to the Commodore 64. 2. POWER SWITCH. Turns on power to the Commodore 64. 3. GAME PORTS. Each game connector can accept a joystick or game controller paddle, while the lightpen can only be plugged into the game port closest to the front of your computer. REAR CONNECTIONS 4. CARTRIDGE SLOT. The rectangular slot to the left accepts program or game cartridges. 5. CHANNEL SELECTOR. Use this switch to select which TV channel the computer's picture will be displayed on. 6. TV CONNECTOR. This connector supplies both the picture and sound to your television set. 7. AUDIO & VIDEO OUTPUT. This connector supplies direct audio, which can be connected to a high quality sound system, and a "composite" video signal, which can be fed into a television "monitor". 8. SERIAL PORT. You can attach a printer or single disk drive directly to the Commodore 64 through this connector. 9. CASSETTE INTERFACE. A DATASSETTE recorder can be attached to the computer so you can save information entered for use at a later time. 10. USER PORT. Various interface cartridges can be attached to the user port, such as the VICMODEM, or RS 232 communication cartridge. 1.2. Installation CONNECTIONS TO YOUR TV Connect the computer to your TV as shown below. TV Switchbox +--+-----------------+--+ +-----+ | | /-------------\#| | /---------------#= =| |= | | | |#| | | +--#--+ | | | |#| | | \\_ | | | | | | | \_ | | | | | | To TV | To 300 Ohm | | \-------------/ | | Signal # Antenna Input +==+=================+==+ Jack | /------------------------\ | |=---\ | #################### ## | | | #################### ## | | | ################## ## | | | ############## ## | | \________________________/ | | | | +---+ | | Power | | Supply +---+ | | 1. Attach one end of the TV cable to the phono type TV signal jack at the rear of the Commodore 64. Just push it in. Either end of the cable can be used. 2. Connect the other end of the cable to the antenna switchbox. Just push it in. 3. If you have a VHF antenna, disconnect it from your TV set. 4. Connect your VHF antenna cable to the screw terminals labeled "antenna input" on the switchbox. If your antenna cable is the round 75-ohm coax type, use a 75-ohm to 300-ohm adapter (not supplied) to attach your antenna cable to the switchbox. 5. Connect the twin lead output cable of the antenna switchbox to the VHF antenna terminals of your TV set. If your set is one of the newer types with a round 75-ohm VHF connector, you will need a 300-ohm to 75-ohm converter (not supplied) to connect the switchbox to the 75-ohm VHF antenna input on the set. 6. Set the TV's VHF tuner to the channel number indicated on the computer's channel selector switch (channel 3 move the switch to the left, channel 4 move the switch to the right). If a strong local TV signal is present on one of these channels, select the other channel to avoid possible interference. 7. Plug the power supply cable into the power socket on the side of the Commodore 64. Just push it in. It is "keyed" to allow insertion in only one direction, so you can't connect the power cord the wrong way. The power supply converts household current into the form the computer uses. /+---------------+ + | | | | | | | | | | / | | | | |========| | | |========| | | / | | | | | | | | | _ _ / | | |O| |O| | + | # # | \+-----\---/----+ \ / | | | | | | ++-++ 75 Ohm to |___| 300 Ohm ----> | | Adapter | | +---+ \=/ ### Your 75 Ohm ----> | | Coax VHF Antenna | | /----------- -----------\ | /==\ /==\ /==\ | | ||__|| ||__|| ||__|| | | \__/ \__/ \__/ | \__________________________/ ^ To VHF _|___ ANT. +---+/ 300 Ohm | || to 75 Ohm --> | || Adapter ++-++/ | | | | |_|/ / The Commodore 64 is now correctly connected. No additional connections are required to use the computer with your TV. The antenna switchbox will connect the computer to the TV when the slide switch is in the "computer" position. When the switch is in the "TV" position your set will operate normally. ___/###\__/##_##_##_##_##_##_##_##_##_##_##_##_##_##_##_##\__ |-------------------------------------------------------------| | | | | | | | +--------------+ /-\ /-\ +------+ +----------+ | | |==============| [=] O \_/ \_/ |======| |==========| | +-------------------------------------------------------------+ ^ To | TV Signal | Jack | Back of Your TV # _/----------------------------- | | / \ / +-------------------------------- | | \__________I______________________ | \ |-------+ | | UHF | | | O O | |#| | VHF | | ||O| |O|| /---------=-\ /| # # | | COMPUTER | / |-|---|-+ | | | 200 Ohm | | | | | | VHF | | \_____| | | Input | \_________| | | | | | | | | TV | | Antenna ->| |O| |O| | | Switch \___#___#___/ | Box | | __ | |___|/ __/ Your VHF Antenna (If Used) 1.3. Optional Connections Since the Commodore 64 furnishes a channel of high fidelity sound, you may wish to play it through a quality amplifier to realize the best sound possible. In addition, the Commodore 64 also provides a standard "composite" video signal, which can be fed into a television monitor. These options are made possible by the audio/video output jack on the rear panel of the Commodore 64. The easiest way to gain access to these signals is by using a standard 5-Pin DIN audio cable (not supplied). This cable connects directly to the audio/video connector on the computer. Two of the four pins on the opposite end of the cable contain the audio and video signals. Optionally, you can construct your own cable, using the pinouts shown in Appendix I as a guide. Normally, the BLACK connector of the DIN cable supplies the AUDIO signal. This plug may be connected to the AUXILIARY input of an amplifier, or the AUDIO IN connector of a monitor or other video system, such as a video cassette recorder (VCR). The WHITE or RED connector usually supplies the direct VIDEO signal. This plug is connected to the VIDEO IN connector of the monitor or video input section of some other video system, such as a VCR. Depending on the manufacturer of your DIN cable, the color coding of the plugs may be different. Use the pinouts shown in Appendix I to match up the proper plugs if you don't get an audio or video signal using the suggested connections. __###__################################__ / \ | Audio/Video | | Output | |-----------------_---_-------------------| | ========= = o | | | | ===== ========= | +-----------------------------------------+ ^ | /-\ | | | | # | | To AUXILIARY | INPUT or | ____________ TUNER INPUT | / \ / \ To VIDEO IN +----++------------++----+ <-#-/ \-#-> +------------+---+ | || ### ====== || | | /--------\ | O | | || === OoooO || | || || = | | ||------------|| | || || o | | || | | | || | | \________/ | | | || | | | || | +------------+---+ +----++============++----+ TV Monitor Audio System If you purchased peripheral equipment, such as a VIC 1541 disk drive or a VIC 1525E printer, you may wish to connect it at this time. Refer to the user's manuals supplied with any additional equipment for the procedure for connecting it to the computer. A completed system might look like this. [ Picture omitted ] 1.4. Operation USING THE COMMODORE 64 1. Turn on the computer using the rocker switch on the right-side panel when you're looking at the computer from the front. 2. After a few moments the following will be displayed on the TV screen: **** COMMODORE 64 BASIC V2 **** 64K RAM SYSTEM 38911 BASIC BYTES FREE READY. _ <----------- Cursor signals Commodore 64 is waiting for your input 3. If your TV has a manual fine tuning knob, adjust the TV until you get a clear picture. 4. You may also want to adjust the color and tint controls on the TV for the best display. You can use the color adjustment procedure described later to get everything setup properly. When you first get a picture, the screen should appear mostly dark blue, with a light blue border and letters. If you don't get the expected results, recheck the cables and connections. The accompanying chart will help you isolate any problem. TROUBLESHOOTING CHART +-----------------------------------------------------------------------+ | Symptom Cause Remedy | +-----------------------------------------------------------------------+ | Indicator Light Computer not "On" Make sure power switch | | not "On" is in "On" position | | | | Power cable not Check power socket for | | not plugged in loose or disconnected | | power cable | | | | Power supply not Check connection with | | plugged in wall outlet | | | | Bad fuse in Take system to authorized | | computer dealer for replacement of | | fuse | | | | TV on wrong Check other channel | | channel for picture (3 or 4) | | | | Incorrect Computer hooks up to | | hookup VHF antenna terminals | | | | Video cable not Check TV output cable | | plugged in connection | | | | Computer set for Set computer for same | | wrong channel channel as TV (3 or 4) | | | | Random patterns on Cartridge not Reinsert cartridge after | | TV with cartridge properly inserted turning off power | | in place | | | | Picture without Poorly tuned TV Retune TV | | color | | | | Picture with Bad color Adjust color/hue/ | | poor color adjustment on TV brightness controls on TV | | | | Sound with excess TV volume up high Adjust volume of TV | | background noise | | | | Picture OK, TV volume too low Adjust volume of TV | | but no sound | | | | Aux. output not Connect sound jack to | | properly connected aux. input on amplifier | | and select aux. input | +-----------------------------------------------------------------------+ TIP: The COMMODORE 64 was designed to be used by everyone. But we at Commodore recognize that computer users may, occasionally, run into difficulties. To help answer your questions and give you some fun programming ideas, Commodore has created several publications to help you. You might also find that it's a good idea to join a Commodore Users Club to help you meet some other COMMODORE 64 owners who can help you gain knowledge and experience. CURSOR The flashing square under READY is called the cursor and indicates where what you type on the keyboard will be displayed on the screen. As you type, the cursor will move ahead one space, as the original cursor position is replaced with the character you typed. Try typing on the keyboard and watch as characters you type are displayed on the TV screen. 1.5. Color Adjustment There is a simple way to get a pattern of colors on the TV so you can easily adjust the set. Even though you may not be familiar with the operation of the computer right now, just follow along, and you'll see how easy it is to use the Commodore 64. First, look on the left side of the keyboard and locate the key marked . This stands for ConTRoL and is used, in conjunction with other keys, to instruct the computer to do a specific task. [ Picture omitted ] To use a control function, you hold down the key while depressing a second key. Try this: hold the key while also depressing the <9> key. Then release both keys. Nothing obvious should have happened, but if you touch any key now, the screen will show the character displayed in reverse type, rather than normal type -- like the opening message or anything you typed earlier. Hold down the . What happens? If you did the above procedure correctly, you should see a light blue bar move across the screen and then move down to the next line as long as the is depressed. **** COMMODORE 64 BASIC V2 **** 64K RAM SYSTEM 38911 BASIC BYTES FREE READY. ____________________________ __________ Now, hold while depressing any of the other number keys. Each of them has a color marked on the front. Anything displayed from this point will be in that color. For example, hold and the <8> key and release both. Now hold the . Watch the display. The bar is now in yellow! In a like manner you can change the bar to any of the colors indicated on the number keys by holding and the appropriate key. Change the bar to a few more different colors and then adjust the color and tint controls on your TV so the display matches the colors you selected. The display should appear something like this: **** COMMODORE 64 BASIC V2 **** 64K RAM SYSTEM 38911 BASIC BYTES FREE READY. _________________________ <------ <3> Red bar _______ ____________ ____ <------ <3>,<6>,<7> Red, Green, Blue bars __________ ______________ <------ <7>,<8> Blue, Yellow bars ____________ <------ <8> Yellow bar At this point everything is properly adjusted and working correctly. The following chapters will introduce you to the BASIC language. However, you can immediately start using some of the many prewritten applications and games available for the Commodore 64 without knowing anything about computer programming. Each of these packages contains detailed information about how to use the program. It is suggested, though, that you read through the first few chapters of this manual to become more familiar with the basic operation of your new system. 2. GETTING STARTED 2.1. Keyboard Now that you've got everything set up and adjusted, please take a few moments to familiarize yourself with the keyboard which is your most important means of communication with the Commodore 64. You will find the keyboard similar to a standard typewriter keyboard found in most areas. There are, however, a number of new keys which control specialized functions. What follows is a brief description of the various keys and how they function. The detailed operation of each key will be covered in later sections. [ Picture omitted ] The key signals the computer to look at the information that you typed and enters that information into memory. The key works like that on a standard typewriter. Many keys are capable of displaying two letters or symbols and two graphic characters. In the "upper/lower case" mode the key gives you standard upper case characters. In the "upper case/graphic" mode the key will display the graphic character on the right hand side of the front part of the key. In the case of special YELLOW function keys, the key will give you the function marked on the front of the key. EDITING No one is perfect, and the Commodore 64 takes that into account. A number of editing keys let you correct typing mistakes and move information around on the screen. There are two keys marked (CuRSoR), one with up and down arrows, the other with left and right arrows. You can use these keys to move the cursor up and down or left and right. In the unshifted mode, the keys will let you move the cursor down and to the right. Using the key and keys allows the cursor to be moved either up or to the left. The cursor keys have a special repeat feature that keeps the cursor moving until you release the key. If you hit the key, the cursor will move back a space, erasing (DELeting) the previous character you typed. If you're in the middle of a line, the character to the left is deleted and the characters to the right automatically move together to close up the space. A ed allows you to INSerT information on a line. For example, if you noticed a typing mistake in the beginning of a line -- perhaps you left out part of the name -- you could use the key to move back to the error and then hit to insert a space. Then just type in the missing later. positions the cursor at the "HOME" position of the screen, which is the upper left-hand corner. A shifted will clear the screen and place the cursor in the home position. operates as the name implies. It stores the computer to the normal state it was in before you changed things with a program or some command. A lot more will be said on this in later chapters. FUNCTION KEYS The four function keys on the right side of the keyboard can be "programmed" to handle a variety of functions. They can be defined in many ways to handle repetitive tasks. [ Picture omitted ] The key, which stands for ConTRoL, allows you to set colors, and perform other specialized functions. You hold the key down while depressing another designated key to get a control function. You had an opportunity to try the key when you changed text colors to create different color bars during the setup procedure. Normally, depressing the key will stop the execution of a BASIC program. It signals the computer to STOP doing something. Using the key in the shifted mode will allow you to automatically load a program from tape. COMMODORE KEY The Commodore key performs a number of functions. First, it allows you to move between the text and graphic display modes. When the computer is first turned on, it is in the upper case/graphic mode, that is, everything you type is in upper case letters. As was mentioned, using the key in this mode will display the graphic on the right side of the keys. If you hold down the key and key, the display will change to upper and lower case. Now, if you hold down the key and any other key with a graphic symbol, the graphic shown on the left side of the key will be displayed. To get back into the upper case/graphic mode hold down the key and key again. The second function of the key is to allow you access to a second set of eight text colors. By holding down the key and any of the number keys, any text now typed will be in the alternate color available from the key you depressed. Chapter 5 lists the text colors available from each key. 2.2. Back to Normal Now that you've had a chance to look over the keyboard, let's explore some of the Commodore 64's many capabilities. If you still have the color bars on the screen from adjusting your TV set, hold and . The screen should clear and the cursor will be positioned in the "home" spot (upper left-hand corner of the screen). Now, simultaneously hold and the <7> key. This sets the text color back to light blue. There is one more step needed to get everything back to normal. Hold and <0> (Zero not Oh!). This sets the display mode back to normal. If you remember, we turned REVERSE type on with the <9> to create the color bars (the color bars were actually reversed spaces). If we were in the normal text mode during the color test, the cursor would have moved, but just left blank spaces. TIP: Now that you've done things the hard way, there is a simple way to reset the machine to the normal display. First press the key and then press the key. must always be held down in order to use the key function. This will clear the screen and return everything to normal. If there is a program in the computer, it will be left untouched. This is a good sequence to remember, especially if you do a lot of programming. If you wish to reset the machine as if it were turned off and then switched on again, type, SYS 64759 and press . Be careful using this command! It will wipe out any program or information that is currently in the computer. 2.3. Loading and Saving Programs One of the most important features of the Commodore 64 is the ability to save and load programs to and from cassette tape or disk. This capability allows you to save the programs you write for use at a later time, or purchase prewritten programs to use with the Commodore 64. Make sure that either the disk drive or cassette unit is attached properly. LOADING PREPACKAGED PROGRAMS For those of you interested in using only prepackaged programs available on cartridges, cassette, or disk here's all you have to do: 1. CARTRIDGES: The Commodore 64 computer has a line of programs and games on cartridge. The programs offer a wide variety of business and personal applications and the games are just like real arcade games -- not imitations. To load these games, first turn on your TV set. Next turn OFF your Commodore 64. YOU MUST TURN OFF YOUR COMMODORE 64 BEFORE INSERTING OR REMOVING CARTRIDGES OR YOU MAY DAMAGE THE CARTRIDGE AND/OR YOUR COMMODORE 64! Third insert the cartridge. Now turn your Commodore 64 on. Finally type the appropriate START key as is listed on the instruction sheet that comes with each game. 2. CASSETTES: Use your DATASSETTE recorder and the ordinary audio cassettes that came as part of your prepackaged program. Make sure the tape is completely rewound to the beginning of the first side. Then just type LOAD. The computer will answer with PRESS PLAY ON TAPE, so you respond by pressing play on your datassette machine. At this point the computer screen will go blank until the program is found. The computer will say FOUND (PROGRAM NAME) on the screen. Now you press down on the key. This will actually load the program into the computer. If you want to stop the loading simply press key. 3. DISK: Using your disk drive, carefully insert the preprogrammed disk so that the label on the disk is facing up and is closest to you. Look for a little notch on the disk (it might be covered with a little piece of tape). If you're inserting the disk properly the notch will be on the left side. Once the disk is inside close the protective gate by pushing down on the lever. Now type LOAD "PROGRAM NAME",8 and hit the key. The disk will make noise and your screen will say: SEARCHING FOR PROGRAM NAME LOADING READY. _ When the READY comes on and the _ is on, just type RUN, and your prepackaged software is ready to use. LOADING PROGRAMS FROM TAPE Loading a program back from tape or disk is just as simple. For tape, rewind the tape back to the beginning and type: LOAD "PROGRAM NAME" If you don't remember the program name, just type LOAD and the first program on the tape will be loaded into memory. After you press the computer will respond with: PRESS PLAY ON TAPE After you depress the play key, the screen will blank, turning the border color of the screen as the computer searches for the program. When the program is found, the screen will display: FOUND PROGRAM NAME To actually load the program, depress the key. To abandon the loading procedure, hit . If you hit the Commodore key, the screen will again turn the border color while the program is loaded. After the loading procedure is completed, the screen will return to the normal state and the READY prompt will reappear. LOADING PROGRAMS FROM DISK Loading a program from disk follows the same format. Type: LOAD "PROGRAM NAME",8 The 8 is the code for the disk, so you're just letting the computer know that you want the program loaded from the disk. After you hit the disk will start whirring and the display shows: SEARCHING FOR PROGRAM NAME LOADING READY. _ NOTE: When you load a new program into the computer's memory, any instructions that were in the computer previously will be erased. Make sure you save a program you're working on before loading a new one. Once a program has been loaded, you can RUN it, LIST, or make changes and re-save the new version. SAVING PROGRAMS ON TAPE After entering a program, if you wish to save it on tape, type: SAVE "PROGRAM NAME" "PROGRAM NAME" can be up to 16 characters long. After you hit the computer will respond with: PRESS PLAY AND RECORD ON TAPE Press both the record and play keys on the datassette. The screen will blank, turning the color of the border. After the program is saved on tape, the READY prompt will reappear, indicating that you can start working on another program, or just turn off the computer for a while. SAVING PROGRAMS ON DISK Saving a program on disk is even simpler. Type: SAVE "PROGRAM NAME",8 The 8 is the code for the disk, so you're just letting the computer know you want the program saved to disk. After you press the disk will start to turn and the computer will respond with: SAVING PROGRAM NAME OK READY. _ 2.4. PRINT and Calculations Now that you've gotten through a couple of the more difficult operations you need in order to keep the programs you like, lets start making some programs for you to save. Try typing the following exactly as shown: PRINT "COMMODORE 64" <----- Type this line and hit COMMODORE 64 <------ Computer typed READY. _ If you make a typing mistake, use the key to erase the character immediately to the left of the cursor. You can delete as many characters as necessary. Let's see what went on in the example above. First, you instructed (commanded) the computer to PRINT whatever was inside the quote marks. By hitting you told the computer to do what you instructed and COMMODORE 64 was printed on the screen. When you use the PRINT statement in this form, whatever is enclosed in quotes is printed exactly as you typed it. If the computer responded with: ?SYNTAX ERROR ask yourself if you made a mistake in typing, or forgot the quote marks. The computer is precise and expects instructions to be given in a specific form. But don't get worried; just remember to enter things as we present them in the examples and you'll get along great with the Commodore 64. Remember, you can't hurt the computer by typing on it, and the best way to learn BASIC is to try different things and see what happens. PRINT is one of the most useful and powerful commands in the BASIC language. With it, you can display just about anything you wish, including graphics and results of computations. For example, try the following. Clear the screen by holding down the key and key and type (be sure to use the '1' key for one, not a letter 'I'): PRINT 12 + 12 <----- Type this line and hit 24 <------ Computer printed the answer READY. _ What you've discovered is that the Commodore 64 is a calculator in its basic form. The result of "24" was calculated and printed automatically. In fact, you can also perform subtraction, multiplication, division, exponentiation, and advanced math functions such as calculating square roots, etc. And you're not limited to a single calculation on a line, but more on that later. Note that in the above form, PRINT behaved differently from the first example. In this case, a value or result of a calculation is printed, rather than the exact message you entered because the quote marks were omitted. ADDITION The plus sign (+) signals addition: we instructed the computer to print the result of 12 added to 12. Other arithmetic operations take a similar form to addition. Remember to always hit after typing PRINT and the calculation. SUBTRACTION To subtract, use the conventional minus (-) sign. Type: PRINT 12 - 9 <----- Hit 3 MULTIPLICATION If you wanted to multiply 12 times 12, use the asterisk (*) to represent multiplication. You would type: PRINT 12 * 12 <----- Hit 144 DIVISION Division uses the familiar "/". For example, to divide 144 by 12, type: PRINT 144 / 12 <----- Hit 12 EXPONENTIATION In a like fashion, you can easily raise a number to a power (this is the same as multiplying a number by itself a specified number of times). The '^' (up arrow) signifies exponentiation. PRINT 12 ^ 5 248832 This is the same as typing: PRINT 12 * 12 * 12 * 12 * 12 248832 TIP: BASIC has number of shortcut ways of doing things. One such way is abbreviating BASIC commands (or keywords). A '?' can be used in place of PRINT, for example. As we go on you'll be presented with many commands; Appendix D shows the abbreviations for each and what will be displayed on the screen when you type the abbreviated form. The last example brings up another important point: many calculations may be performed on the same line, and they can be of mixed types. You could calculate this problem: ? 3 + 5 - 7 + 2 (The '?' replaces the word PRINT) 3 Up to this point we've just used small numbers and simple examples. However, the Commodore 64 is capable of more complex calculations. You could, for example, add a number of large figures together. Try this, but don't use any commas, or you'll get an error: ? 123.45 + 345.78 + 7895.687 8364.917 That looks fine, but now try this: ? 12123123.45 + 345.78 + 7895.687 12131364.9 If you took the time to add this up by hand, you would get a different result. What's going on here? Even though the computer has a lot of power, there's a limit to the numbers it can handle. The Commodore 64 can work with numbers containing 10 digits. However when a number is printed, only nine digits are displayed. So in our example, the result was "rounded" to fit in the proper range. The Commodore 64 rounds up when the next digit is five or more; it rounds down when the next digit is four or less. Numbers between 0.01 and 999,999,999 are printed using standard notation. Numbers outside this range are printed using scientific notation. Scientific notation is just a process of expressing a very large or small number as a power of 10. If you type: ? 123000000000000000 1.23E+17 This is the same as 1.23 * 10^17 and is used just to keep things tidy. There is a limit to the numbers the computer can handle, even in scientific notation. The limits are: Largest: +/- 1.70141183E+38 Smallest (different from zero): +/- 2.93873588-39 2.5. Precedence If you tried to perform some mixed calculations different from the examples we showed earlier, you might not have gotten the results that you expected. The reason is that the computer performs calculations in a certain order. In this calculation: 20 + 8 / 2 you can't tell whether the answer should be 24 or 14 until you know in which order to perform the calculations. If you add 20 to 8 divided by 2 (or 4), then the result is 24. But, if you add 20 plus 8 and then divide by 2 the answer is 14. Try the example and see what result you get. The reason you got 24 is because the Commodore 64 performs calculations left to right according to the following: First : - minus sign indicating negative numbers Second: ^ exponentiation, left to right Third : */ multiplication and divisions, left to right Fourth: +- addition and subtraction, left to right Follow along according to the order of precedence, and you will see that it the above example the division was performed first and then the addition to get a result of 24. Make up some problems of your own and see if you can follow along and predict the results according to the rules set down above. There's also an easy way to alter the precedence process by using parentheses to set off which operations you want performed first. For example, if you want to divide 35 by 5-plus-2 you type: ? 35 / 5 + 2 9 you will get 35 divided by 5 with 2 added to the answer, which is not what you intended at all. To get what you really wanted, try this: ? 35 / (5 + 2) 5 What happens now is that the computer evaluates what is contained in the parentheses first. If there are parentheses within parentheses, the innermost parentheses are evaluated first. Where there are a number of parentheses on a line, such as: ? (12 + 9) * (6 + 1) 147 the computer evaluates them left to right. Here 21 would be multiplied by 7 for the result 147. 2.6. Combining Things Even though we've spent a lot of time in areas that might not seem very important, the details presented here will make more sense once you start to program, and will prove invaluable. To give you an idea how things fit in place, consider the following: how could you combine the two types of PRINT statements we've examined so far to print something more meaningful on the screen? We know that by enclosing something within quote marks prints that information on the screen exactly as it was entered, and by using math operators, calculations can be performed. So why not combine the two types of PRINT statements like this: ? "5 * 9 = "; 5 * 9 (Semicolon means no space) 5 * 9 = 45 Even though this might seem a bit redundant, what we've done is simply use both types of print statements together. The first part prints "5 * 9 =" exactly as it was typed. The second part does the actual work and prints the result, with the semicolon separating the message part of the statement from the actual calculation. You can separate the parts of a mixed PRINT statement with punctuation for various formats. Try a comma in place of the semicolon and see what happens. For the curious, the semicolon causes the next part of the statement to be printed immediately after the previous part, without any spaces. The comma does something different. Even though it is an acceptable separator, it spaces things out more. If you type: ? 2,3,4,5,6 <-------------------------------- Hit 2 3 4 5 6 the numbers will be printed across the screen and down on to the next line. The Commodore 64's display is organized into 4 areas of 10 columns each. The comma tabs each result into the next available area. Since we asked for more information to be printed than would fit on one line, (we tried to fit five 10-column areas on one line) the last item was moved down to the next line. The basic difference between the comma and semicolon in formatting PRINT statements can be used our advantage when creating more complex displays: it allow us to create some sophisticated results very easily. 3. BEGINNING BASIC PROGRAMMING 3.1. The Next Step Up to now we've performed some simple operations by entering a single line of instructions into the computer. Once was depressed, the operation that we specified was performed immediately. This is called the IMMEDIATE or CALCULATOR mode. But to accomplish anything significant, we must be able to have the computer operate with more than a single line statement. A number of statements combined together is called a PROGRAM and allows you to use the full power of the Commodore 64. To see how easy it is to write your first Commodore 64 program, try this: Clear the screen by holding down the key, and then depressing the key. Type NEW and press . (This just clears out any numbers that might have been left in the computer from your experimenting.) Now type the following exactly as shown (remember to hit after each line) 10 ? "COMMODORE 64" 20 GOTO 10 Now, type RUN and hit -- watch what happens. Your screen will come alive with COMMODORE 64. After you've finished watching the display, hit to stop the program. COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 BREAK IN 10 READY A number of important concepts were introduced in this short program that are the basis for all programming. Notice that here we preceded each statement with a number. This LINE number tells the computer in what order to work with each statement. These numbers are also a reference point, in case the program needs to get back to a particular line. Line numbers can be any whole number (integer) value between 0-63999. 10 PRINT "COMMODORE 64" ^ ^ | |-- Statement | +------- Line number It is good programming practice to number lines in increments of 10 -- in case you need to insert some statements later on. Besides PRINT, our program also used another BASIC command, GOTO. This instructs the computer to go directly to a particular line and perform it, then continue from that point. +--> 10 PRINT "COMMODORE 64" | +--- 20 GOTO 10 In our example, the program prints the message in line 10, goes to the next line (20), which instructs it to go back to line 10 and print the message over again. Then the cycle repeats. Since we didn't give the computer a way out of this loop, the program will cycle endlessly, until we physically stop it with the key. Once you've stopped the program, type: LIST. Your program will be displayed, intact, because it's still in the computer's memory. Notice, too, that the computer converted the '?' into PRINT for you. The program can now be changed, saved, or run again. Another important difference between typing something in the immediate mode and writing a program is that once you execute and clear the screen of an immediate statement, it's lost. However, you can always get a program back by just typing LIST. By the way, when it comes to abbreviations don't forget that the computer may run out of space on a line if you use too many. 3.2. Editing Tips If you make a mistake on a line, you have a number of editing options. 1. You can retype a line anytime, and the computer will automatically substitute the new line for the old one. 2. An unwanted line can be erased by simply typing the line number and . 3. You can also easily edit an existing line, using the cursor keys and editing keys. Suppose you made a typing mistake in a line of the example. To correct it without retyping the entire line, try this: Type LIST, then using the and keys together move the cursor up until it is positioned on the line that needs to be changed. Now, use the cursor-right key to move the cursor to the character you want to change, typing the change over the old character. Now hit and the corrected line will replace the old one. If you need more space on the line, position the cursor where the space is needed and hit and at the same time and a space will open up. Now just type in the additional information and hit . Likewise, you can delete unwanted characters by placing the cursor to the right of the unwanted character and hitting the key. To verify that changes were entered, type LIST again, and the corrected program will be displayed! And lines don't have to be entered in numerical order. The computer will automatically place them in the proper sequence. Try editing our sample program on Section 3.1 by changing line 10 and adding a comma to the end of the line. Then RUN the program again. 10 PRINT "COMMODORE", Don't forget to move the cursor past line 20 before you RUN the program. COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE BREAK IN 10 READY 3.3. Variables Variables are some of the most used features of any programming language, because variables can represent much more information in the computer. Understanding how variables operate will make computing easier and allow us to accomplish feats that would not be possible otherwise. Imagine a number of boxes within the computer that can hold a number or a string of text characters. Each of these boxes is to be labeled with a name that we choose. That name is called a variable and represents the information in the respective box. For example, if we say: 10 X% = 15 20 X = 23.5 30 X$ = "THE SUM OF X% + X =" The computer might represent the variables like this: X% 15 X 23.5 X$ THE SUM OF X% + X = A variable name represents the box, or memory location, where the current value of the variable is stored. As you can see, we can assign either an integer number, floating point number, or a text string to a variable. The '%' symbol following a variable name indicates the variable will represent an integer number. The following are valid integer variable names: A% X% A1% NM% The '$' following the variable name indicates the variable will represent a text string. The following are examples of string variables: A$ X$ MI$ Floating point variables follow the same format, with the type indicator: A1 X Y MI In assigning a name to a variable there are a few things to keep in mind. First, a variable name can have one or two characters. The first character must be an alphabetic character from A to Z; the second character can be either alphabetic or numeric (in the range 0 to 9). A third character can be included to indicate the type of variable (integer or text string), '%' or '$'. You can use variable names having more than two alphabetic characters, but only the first two are recognized by the computer. So PA and PARTNO are the same and would refer to the same variable box. The last rule for variable names is simple: they can't contain any BASIC keywords (reserved words) such as GOTO, RUN, etc. Refer back to Appendix D for a complete list of BASIC reserved words. To see how variables can be put to work, type in the complete program that we introduced earlier and RUN it. Remember to hit after each line in the program. NEW 10 X% = 15 20 X = 23.5 30 X$ = "THE SUM OF X% + X =" 40 PRINT "X% = "; X%, "X = "; X 50 PRINT X$; X% + X If you did everything as shown, you should get the following result printed on the screen. RUN X% = 15 X = 23.5 THE SUM OF X% + X = 38.5 READY We've put together all the tricks learned so far to format the display as you see it and print the sum of the two variables. In lines 10 and 20 we assigned an integer value to X% and assigned a floating point value to X. This puts the number associated with the variable in its box. In line 30, we assigned a text string to X$. Line 40 combines the two types of PRINT statements to print a message and the actual value of X% and X. Line 50 prints the text string assigned to X$ and the sum of X% and X. Note that even though X is used as part of each variable name, the identifiers '%' and '$' make X%, X, and X$ unique, thus representing three distinct variables. But variables are much more powerful. If you change their value, the new value replaces the original value in the same box. This allows you to write a statement like: X = X + 1 This would never be accepted in normal algebra, but is one of the most used concepts in programming. It means: take the current value of X, add one to it and place the new sum into the box representing X. 3.4. IF ... THEN Armed with the ability to easily update the value of variables, we can now try a program such as: NEW 10 CT = 0 20 ? "COMMODORE 64" 30 CT = CT + 1 40 IF CT < 5 THEN 20 50 END RUN COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 What we've done is introduce two new BASIC commands, and provided some control over our runaway little print program introduced at the start of this chapter. IF ... THEN adds some logic to the program. If says IF a condition holds true THEN do something. IF the condition no longer holds true, THEN do the next line in the program. A number of conditions can be set up in using an IF ... THEN statement: SYMBOL MEANING < Less Than > Greater Than = Equal To <> Not Equal To >= Greater Than or Equal To <= Less Than or Equal To The use of any one of these conditions is simple, yet surprisingly powerful. 10 CT = 0 +--> 20 ? "COMMODORE 64" | 30 CT = CT + 1 +-<- 40 IF CT < 5 THEN 20 | ! 50 END In the sample program, we've set up a "loop" that has some constrains placed on it by saying: IF a value is less than some number THEN do something. Line 10 sets CT (CounT) equal to 0. Line 20 prints our message. Line 30 adds one to the variable CT. This line counts how many times we do the loop. Each time the loop is executed, CT goes up by one. Line 40 is our control line. If CT is less than 5, meaning we've executed the loop less than 5 times, the program goes back to line 20 and prints again. When CT becomes equal to 5 -- indicating 5 COMMODORE 64's were printed -- the program goes to line 50, which signals to END the program. Try program and see what we mean. By changing the CT limit in line 40 you can have any number of lines printed. IF ... THEN has a multitude of other uses, which we'll see in future examples. 3.5. FOR ... NEXT Loops There is a simpler, and preferred way to accomplish what we did in the previous example by using a FOR ... NEXT loop. Consider the following: NEW 10 FOR CT = 1 TO 5 20 ? "COMMODORE 64" 30 NEXT CT RUN COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 As you can see, the program has become much smaller and more direct. CT starts at 1 in line 10. Then, line 20 does some printing. In line 30 CT is incremented by 1. The NEXT statement in line 30 automatically sends the program back to line 10 where the FOR part of the FOR ... NEXT statement is located. This process will continue until CT reaches the limit you entered. The variable used in a FOR ... NEXT loop can be incremented by smaller amounts than 1, if needed. Try this: NEW 10 FOR NB = 1 TO 10 STEP .5 20 PRINT NB, 30 NEXT NB RUN 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8 8.5 9 9.5 10 If you enter and run this program, you'll see the numbers from 1 to 10, by .5, printed across the display. All we're doing here is printing the values that NB assumes as it goes through the loop. You can even specify whether the variable is increasing or decreasing. Substitute the following for line 10: 10 FOR NB = 10 TO 1 STEP -.5 and watch the opposite occur, as NB goes from 10 to 1 in descending order. 4. ADVANCED BASIC 4.1. Introduction The next few chapters have been written for people who have become relatively familiar with the BASIC programming language and the concepts necessary to write more advanced programs. For those of you who are just staring to learn how to program, you may find some of the information a bit too technical to understand completely. But take heart ... because for these two fun chapters, SPRITE GRAPHICS and CREATING SOUND, we've set up some simple examples that are written for the new user. The examples will give you a good idea of how to use the sophisticated sound and graphics capabilities available on your COMMODORE 64. If you decide that you want to learn more about writing programs in BASIC, we've put a bibliography (Appendix N) in the back of this manual. If you are already familiar with BASIC programming, these chapters will help you get started with advanced BASIC programming techniques. More detailed information can be found in the COMMODORE 64 PROGRAMMER'S REFERENCE MANUAL, available through your local Commodore dealer. 4.2. Simple Animation Let's exercise some of the Commodore 64's graphic capabilities by putting together what we've seen so far, together with a few new concepts. If you're ambitious, type in the following program and see what happens. You will notice that within the print statements we can also include cursor controls and screen commands. When you see something like {CRSR LEFT} in a program listing, hold the key and hit the key. The screen will show the graphic representation of a cursor left (two vertical reversed bars). In the same way, pressing and shows as a reversed heart. NEW 10 REM BOUNCING BALL 20 PRINT "{CLR/HOME}" 25 FOR X=1 to 10 : PRINT "{CRSR DOWN}" : NEXT 30 FOR BL=1 to 40 40 PRINT" O{CRSR LEFT}"; : REM (O is a SHIFT-Q) 50 FOR TM=1 TO 5 60 NEXT TM 70 NEXT BL 75 REM MOVE BALL RIGHT TO LEFT 80 FOR BL=40 TO 1 STEP -1 90 PRINT" {CRSR LEFT}{CRSR LEFT}O{CRSR LEFT}"; 100 FOR TM=1 TO 5 110 NEXT TM 120 NEXT BL 130 GOTO 20 NOTES: The ':' in lines 25 and 40 indicates new command. The spaces in lines 40 and 90 are intentional. TIP: All words in this text will be completed on one line. However, as long as you don't hit your 64 will automatically move to the next line even in the middle of a word. The program will display a bouncing ball moving from left to right, and back again, across the screen. If we look at the program closely, you can see how this feat was accomplished. 10 REM BOUNCING BALL +----> 20 PRINT "{CLR/HOME}" | +--> 25 FOR X=1 to 10 : PRINT "{CRSR DOWN}" : NEXT | | 30 FOR BL=1 to 40 | | 40 PRINT" O{CRSR LEFT}"; : REM (O is a SHIFT-Q) | | +> 50 FOR TM=1 TO 5 | | +- 60 NEXT TM | +--- 70 NEXT BL | 75 REM MOVE BALL RIGHT TO LEFT | +--> 80 FOR BL=40 TO 1 STEP -1 | | 90 PRINT" {CRSR LEFT}{CRSR LEFT}O{CRSR LEFT}"; | | +> 100 FOR TM=1 TO 5 | | +- 110 NEXT TM | +--- 120 NEXT BL +----- 130 GOTO 20 Line 10 is a REMark that just tells what the program does; it has no effect on the program itself. Line 20 clears the screen of any information. Line 25 PRINTs 10 cursor-down commands. This just positions the ball in the middle of the screen. If line 25 was eliminated the ball would move across the top line of the screen. Line 30 sets up a loop for moving the ball the 40 columns from the left to right. Line 40 does a lot of work. It first prints a space to erase the previous ball positions, then it prints the ball, and finally it performs a cursor-left to get everything ready to erase the current ball position again. The loop set up in lines 50 and 60 slows the ball down a bit by delaying the program. Without it, the ball would move too fast to see. Line 70 completes the loop that prints balls on the screen, set up in line 30. Each time the loop is executed, the ball moves another space to the right. As you notice from the illustration, we have set up a loop within a loop. This is perfectly acceptable. The only time you get in trouble is when the loops cross over each other. It's helpful in writing programs to check yourself as illustrated here to make sure the logic of a loop is correct. To see what would happen if you cross a loop, reverse the statements in lines 60 and 70. You will get an error because the computer gets confused and cannot figure out what's going on. Lines 80 through 120 just reverse the steps in the first part of the program, and move the ball from right to left. Line 90 is slightly different from line 40 because the ball is moving in the opposite direction (we have to erase the ball to the right and move to the left). And when that's all done the program goes back to line 20 to start the whole process over again. Pretty neat! To stop the program hold down and hit . For a variation on the program, edit line 40 to read: 40 PRINT"O"; To make the O, hold SHIFT key down and hit the letter "Q" Run the program and see what happens now. Because we left out the cursor control, each ball remains on the screen until erased by the ball moving right to left in the second part of the program. 4.3. INPUT Up to now, everything within a program has been set before it is run. Once the program was started, nothing could be changed. INPUT allows us to pass new information to a program as it is running and have that new information acted upon. To get an idea of how INPUT works, type NEW and enter this short program: 10 INPUT A$ 20 PRINT "YOU TYPED: ";A$ 30 PRINT 40 GOTO 10 RUN ? COMMODORE 64 <--------------- You typed YOU TYPED: COMMODORE 64 <----- Computer responded What happens when you run this simple program. A question mark will appear, indicating that the computer is waiting for you to type something. Enter any character, or group of characters, from the keyboard and hit . The computer will then respond with "YOU TYPED:" followed by the information you entered. This may seem very elementary, but imagine what you can have the computer do with any information you enter. You can INPUT either numeric or string variables, and even have the INPUT statement prompt the user with a message. The format of INPUT is: INPUT "PROMPT MESSAGE";VARIABLE ^ +---- Prompt must be 38 characters or less Or, just: INPUT VARIABLE NOTE: To get out of this program hold down the and keys. The following program is not only useful, but demonstrates a lot of what has been presented so far, including the new input statement. NEW 1 REM TEMPERATURE CONVERSION PROGRAM 5 PRINT "{CLR/HOME}" 10 PRINT "CONVERT FROM FAHRENHEIT OR CELSIUS (F/C): ": INPUT A$ 20 IF A$ = "" THEN 10 <----------------------- No space within quotes 30 IF A$ = "F" THEN 100 40 IF A$ <> "C" THEN 10 50 INPUT "ENTER DEGREES CELSIUS: ";C 60 F = (C*9)/5+32 70 PRINT C;" DEG. CELSIUS ="; F ;"DEG. FAHRENHEIT" 80 PRINT 90 GOTO 10 100 INPUT "ENTER DEGREES FAHRENHEIT: ";F <- Don't forget to hit RETURN 110 C = (F-32)*/5/9 120 PRINT F;" DEG. FAHRENHEIT ="; C ;"DEG. CELSIUS" 130 PRINT 140 GOTO 10 If you entered and run this program, you'll see INPUT in action. Line 10 uses the input statement to not only gather information, but also print our prompt. Also notice that we can ask for either a number or string (by using a numeric or string variable). Lines 20, 30, and 40 do some checks on what is typed in. In line 20, if nothing is entered (just is hit), then the program goes back to line 10 and requests the input again. In line 30, if F is typed, you know the user wants to convert a temperature in degrees Fahrenheit to Celsius, so the program branches to the part that does that conversion. Line 40 does one more check. We know there are only two valid choices the user can enter. To get to line 40, the user must have typed some character other than F. Now, a check is made to see if that character is a C; if not, the program requests input again. This may seem like a lot of detail, but it is good programming practice. A user not familiar with the program can become very frustrated if it does something strange because a mistake was made entering information. Once we determine what type of conversion to perform, the program does the calculation and prints out the temperature entered and the converted temperature. The calculation is just straight math, using the established formula for temperature conversion. After the calculation is finished and answer printed, the program loops back and starts over. After running, the screen might look like this: CONVERT FROM FAHRENHEIT OR CELSIUS (F/C): ? F ENTER DEGREES FAHRENHEIT: 32 32 DEG. FAHRENHEIT = 0 DEG. CELSIUS CONVERT FROM FAHRENHEIT OR CELSIUS (F/C): ? After running the program, make sure to save it on disk or tape. This program, as well as others presented throughout the manual, can form the base of your program library. 4.4. GET GET allows you to input one character at a time from the keyboard without hitting . This really speeds entering data in many applications. Whatever key is hit is assigned variable to the variable you specify with GET. The following routine illustrates how GET works: NEW 1 PRINT "{CLR/HOME}" 10 GET A$: IF A$ = "" THEN 10 20 PRINT A$; ^ 30 GOTO 10 |-------------- No SPACE here If you RUN the program, the screen will clear and each time you hit a key, line 20 will print it on the display, and then GET another character. It is important to note that the character entered will not be displayed unless you specifically PRINT it to the screen, as we've done here. The second statement on line 10 is also important. GET continually works, even if no key is pressed (unlike INPUT that waits for a response), so the second part of this line continually checks the keyboard until a key is hit. See what happens if the second part of line 10 is eliminated. To stop this program you can hit the and keys. The first part of the temperature conversion program could easily be rewritten to use GET. LOAD the temperature conversion program, and modify lines 10,20 and 40 as shown: 10 PRINT "CONVERT FROM FAHRENHEIT OR CELSIUS (F/C) ?" 20 GET A$: IF A$ = "" THEN 20 <---------------- No space within quotes 30 IF A$ <> "C" THEN 20 This modification will make the program operate smoother, as nothing will happen unless the user types in one of the desired responses to select the type of conversion. Once this change is made, make sure you save the new version of the program. 4.5. Random Numbers and Other Functions The Commodore 64 contains a number of functions that are used to perform special operations. Functions could be thought of as built-in programs included in BASIC. But rather than typing in a number of statements each time you need to perform a specialized calculation, you just type the command for the desired function and the computer does the rest. Many times when designing a game or educational program, you need to generate a random number, to simulate the throw of dice, for example. You could certainly write a program that would generate these numbers, but an easier way to call upon the RaNDom number function. To see what RND actually does, try this short program: NEW 10 FOR X = 1 TO 10 20 PRINT RND(1), <------------ If you leave out the comma, your list 30 NEXT of numbers will appear as 1 column After running the program, you will see a display like this: .789280697 .664673958 .256373663 .0123442287 .682952381 3.90587279E-04 .402343724 .879300926 .158209063 .245596701 Your numbers don't match? Well, if they did we would all be in trouble, as they should be completely random! Try running the program a few more times to verify that the results are always different. Even if the numbers don't follow any pattern, you should start to notice that some things remain the same every time the program is run. First, the results are always between 0 and 1, but never equal to 0 or 1. This will certainly never do if we want to simulate the random toss of dice, since we're looking for numbers between 1 and 6. The other important feature to look for is that we are dealing with real numbers (with decimal places). This could also be a problem since whole (integer) numbers are often needed. There are a number of simple ways to produce numbers from the RND function in the range desired. Replace line 20 with following and run the program again: 20 PRINT 6*RND(1), RUN 3.60563664 4.53660853 5.47238963 8.40850227 3.19265054 4.39547668 3.16331095 5.50620749 9.32527884 4.17090293 That cured the problem of not having results larger than 1, but we still have the decimal part of the result to deal with. Now, another function can be called upon. The INTeger function converts real numbers into integer values. Once more, replace line 20 with the following and run the program to see the effect of the change: 20 PRINT INT(6*RND(1)), RUN 2 3 1 0 2 4 5 5 0 1 That took care of a lot, getting us closer to our original goal of generating random numbers between 1 and 6. If you examine closely what we generated this last time, you'll find that the results range from 0 to 5, only. As a last step, add a one to the statement, as follows: 20 PRINT INT(6*RND(1))+1, Now, we have achieved the desired results. In general, you can place a number, variable, or any BASIC expression within the parentheses of the INT function. Depending on the range desired, you just multiply the upper limit by the RND function. For example, to generate random numbers between 1 and 25, you could type: 20 PRINT INT(25*RND(1))+1, The general formula for generating a set of random numbers in a certain range is: NUMBER=INT(LOWER+(UPPER-LOWER+1)*RND(1)) 4.6. Guessing Game Since we've gone to some lengths to understand random numbers, why not put this information to use? The following game not only illustrates a good use of random numbers, but also introduces some additional programming theory. In running this program, a random number, NM, will be generated. NEW 1 REM NUMBER GUESSING GAME 2 PRINT "{CLR/HOME}" 5 INPUT "ENTER UPPER LIMIT FOR GUESS ";LI 10 NM = INT(LI*RND(1))+1 15 CN = 0 20 PRINT "I'VE GOT THE NUMBER." : PRINT 30 INPUT "WHAT'S YOUR GUESS "; GU 35 CN = CN + 1 40 IF GU > NM THEN PRINT "MY NUMBER IS LOWER." : PRINT : GOTO 30 50 IF GU < NM THEN PRINT "MY NUMBER IS HIGHER.": PRINT : GOTO 30 60 PRINT "GREAT! YOU GOT MY NUMBER" 65 PRINT "IN ONLY"; CN ;"GUESSES." : PRINT 70 PRINT "DO YOU WANT TO TRY ANOTHER (Y/N) ?"; 80 GET AN$ : IF AN$ = "" THEN 80 90 IF AN$ = "Y" THEN 2 100 IF AN$ <> "N" THEN 70 110 END You can specify how large the number will be at the start of the program. Then, it's up to you to guess what the number is. A sample run follows along with an explanation. ENTER UPPER LIMIT FOR GUESS ? 25 I'VE GOT THE NUMBER. WHAT'S YOUR NUMBER GUESS ? 15 MY NUMBER IS HIGHER. WHAT'S YOUR NUMBER GUESS ? 20 MY NUMBER IS LOWER. WHAT'S YOUR NUMBER GUESS ? 19 GREAT! YOU GOT MY NUMBER IN ONLY 3 GUESSES. DO YOU WANT TO TRY ANOTHER (Y/N) ? IF/THEN statements compare your guess to the number generated. Depending on your guess, the program tells you whether your guess was higher or lower than the random number generated. From the formula given for determining random number range, see if you can add a few lines to the program that allow the user to also specify the lower range of numbers generated. Each time you make a guess, CN is incremented by 1 to keep track of the number of guesses. In using the program, see if you can use good reasoning to guess a number in the least number of tries. When you get the right answer, the program prints out the "GREAT! YOU GOT MY NUMBER" message, along with the number of tries it took. You can then start the process over again. Remember, the program generates a new random number each time. PROGRAMMING TIPS: In line 40 and 50, a colon is used to separate multiple statements on a single line. This not only saves typing, but in long programs will conserve memory space. Also notice in the IF/THEN statements on the same two lines, we instructed the computer to PRINT something, rather than immediately branching to some other point in the program. The last point illustrates the reason behind using line numbers in increments of 10. After the program was written, we decided to add the count part. By just adding those new lines at the end of the program, numbered to fall between the proper existing lines, the program was easily modified. 4.7. Your Roll The following program simulates the throw of two dice. You can enjoy it as it stands, or use it as part of a larger game. 5 PRINT "CARE TO TRY YOUR LUCK?" 10 PRINT "RED DICE =";INT(6*RND(1))+1 20 PRINT "WHITE DICE =";INT(6*RND(1))+1 30 PRINT "HIT SPACE BAR FOR ANOTHER ROLL" : PRINT 40 GET A$ : IF A$ = "" THEN 40 50 IF A$ = CHR$(32) THEN 10 From what you've learned about random numbers and BASIC, see if you can follow what is going on. 4.8. Random Graphics As a final note on random numbers, and as an introduction to designing graphics, take a moment to enter and run this neat little program: 10 REM MAZE 20 PRINT "{CLR/HOME}" 30 PRINT CHR$(205.5+RND(1)); 40 GOTO 20 As you may have expected, line 20 is the key here. Another function, CHR$ (Character String), gives you a character, based on a standard code number from 0 to 255. Every character the Commodore 64 can print is encoded this way (see Appendix F). To quickly find out the code for any character, just type: PRINT ASC("X") where X is the character you're checking (this can be any printable character, including graphics). The response is the code for the character you typed. As you probably figured out, "ASC" is another function, which returns the standard "ASCII" code for the character you typed. You can now print that character by typing: PRINT CHR$(X) If you try typing: PRINT CHR$(205); CHR$(206) you will see the two right side graphic characters on the M and N keys. These are two characters that the program is using for the maze. By using the formula 205.5 + RND(1) the computer will pick a random number between 205.5 and 206.5. There is a fifty-fifty chance of the number being above or below 206. CHR$ ignores any fractional values, so half the time the character with code 205 is printed and the remaining time code 206 is displayed. If you'd like to experiment with this program, try changing 205.5 by adding or subtracting a couple tenths from it. This will give either character a greater chance of being selected. 5. ADVANCED COLOR AND GRAPHIC COMMANDS 5.1. Color and Graphics Up to now we've explored some of the sophisticated computing capabilities of the Commodore 64. But one of its most fascinating features is an outstanding ability to produce color and graphics. You've seen a quick example of graphics in the "bouncing ball" and "maze" programs. But these only touched on the power you command. A number of new concepts will be introduced in this section to explain graphic and color programming and show how you can create your own games and advanced animation. Because we've concentrated on the computing capabilities of the machine, all the displays we've generated so far were a single color (light blue text on a dark blue background, with a light blue border). In this chapter we'll see how to add color to programs and control all those strange graphic symbols on the keyboard. 5.2. PRINTing Colors As you discovered if you tried the color alignment test in Chapter 1, you can change text colors by simply holding the key and one of the color keys. This works fine in the immediate mode, but what happens if you want to incorporate color changes in your programs? When we showed the "bouncing ball" program, you saw how keyboard commands, like cursor movement, could be incorporated within PRINT statements. In a like way, you can also add text color changes to your programs. You have a full range of 16 text colors to work with. Using key and a number key, the following colors are available: 1 2 3 4 5 6 7 8 Black White Red Cyan Purple Green Blue Yellow If you hold down the key along with the appropriate number key, these additional eight colors can be used: 1 2 3 4 5 6 7 8 Orange Brown Lt.Red Gray 1 Gray 2 Lt.Green Lt.Blue Gray 3 Type NEW, and experiment with the following. Hold down the key and at the same time hit the <1> key. Next, hit the key without holding down the key. Now, while again depressing the key at the same time hit the <2> key. Release the key and hit the key. Move through the numbers, alternating with the letters, and type out the word RAINBOW as follows: 10 PRINT " R A I N B O W" ^ ^ ^ ^ ^ ^ ^ <1 2 3 4 5 6 7> RUN RAINBOW Just as cursor controls show as graphic characters within the quote marks of print statements, color controls are also represented as graphic characters. In the previous example, when you held down and typed <3> a "{Pound Sign}" was displayed. <7> displayed a "<-". Each color control will display its unique graphic code when used in this way. The table shows the graphic representations of each printable color control. KEYBOARD COLOR DISPLAY KEYBOARD COLOR DISPLAY --------------------------------------------------------------------- <1> BLACK <1> ORANGE <2> WHITE <2> BROWN <3> RED <3> LT. RED <4> CYAN <4> GRAY 1 <5> PURPLE <5> GRAY 2 <6> GREEN <6> LT. GREEN <7> BLUE <7> LT. BLUE <8> YELLOW <8> GRAY 3 Even though the PRINT statement may look a bit strange on the screen, when you RUN the program, only the text will be displayed. And it will automatically change colors according to the color controls you placed in the print statement. Try a few examples of your own, mixing any number of colors within a single PRINT statement. Remember, too, you can use the second set of text colors by using the Commodore key and the number keys. TIP: You will notice after running a program with color or mode (reverse) changes, that the "READY." prompt and any additional text you type is the same as the last color or mode change. To get back to the normal display, remember to depress: and . 5.3. Color CHR$ Codes Take a brief look at Appendix F, then turn back to this section. You may have noticed in looking over the list of CHR$ codes in Appendix F that each color (as well as most other keyboard controls, such as cursor movement) has a unique code. These codes can be printed directly to obtain the same results as typing CTRL and the appropriate key within the PRINT statement. For example, try this: NEW 10 PRINT CHR$(147) : REM {CLR/HOME} 20 PRINT CHR$(30); "CHR$(30) CHANGES ME TO?" RUN CHR$(30) CHANGES ME TO? The text should now be green. In many cases, using the CHR$ function will be much easier, especially if you want to experiment with changing colors. The following program is a different way to get a rainbow of colors. Since there are a number of lines that are similar (40-110) use editing keys to save a lot of typing. See the notes after the listing to refresh your memory on the editing procedures. NEW 1 REM AUTOMATIC COLOR BARS 5 PRINT CHR$(147) : REM CHR$(147) = CLR/HOME 10 PRINT CHR$(18); " "; : REM REVERSE BAR 20 CL = INT(8*RND(1))+1 30 ON CL GOTO 40,50,60,70,80,90,100,110 40 PRINT CHR$(5); : GOTO 10 50 PRINT CHR$(28); : GOTO 10 60 PRINT CHR$(30); : GOTO 10 70 PRINT CHR$(31); : GOTO 10 80 PRINT CHR$(144); : GOTO 10 90 PRINT CHR$(156); : GOTO 10 100 PRINT CHR$(158); : GOTO 10 110 PRINT CHR$(159); : GOTO 10 Type lines 1 through 40 normally. Your display should look like this: 1 REM AUTOMATIC COLOR BARS 5 PRINT CHR$(147) : REM CHR$(147) = CLR/HOME 10 PRINT CHR$(18); " "; : REM REVERSE BAR 20 CL = INT(8*RND(1))+1 30 ON CL GOTO 40,50,60,70,80,90,100,110 40 PRINT CHR$(5); : GOTO 10 EDITING NOTES Use the key to position the cursor on line 40. Then type 5 over the 4 of 40. Next, use the key to move over to the 5 in the CHR$ parentheses. Hit to open up a space and type '28'. Now just hit with the cursor anywhere on the line. The display should now look like this: 1 REM AUTOMATIC COLOR BARS 5 PRINT CHR$(147) : REM CHR$(147) = CLR/HOME 10 PRINT CHR$(18); " "; : REM REVERSE BAR 20 CL = INT(8*RND(1))+1 30 ON CL GOTO 40,50,60,70,80,90,100,110 50 PRINT CHR$(28); : GOTO 10 Don't worry. Line 40 is still there. LIST the program and see. Using the same procedure, continue to modify the last line with a new line number and CHR$ code until all the remaining lines have been entered. See, we told you the editing keys would come in handy. As a final check, list the entire program to make sure all the lines were entered properly before you RUN it. Here is a short explanation of what's going on. You've probably figured out most of the color bar program by now except for some strange new statement in line 30. But let's quickly see what the whole program actually does. Line 5 prints the CHR$ code for CLR/HOME. Line 10 turns reverse type on and prints 5 spaces, which turn out to be a bar, since they're reversed. The first time through the program the bar will be light blue, the normal text color. Line 20 uses our workhorse, the random function to select a random color between 1 and 8. Line 30 contains a variation of the IF ... THEN statement which is called ON ... GOTO. ON ... GOTO allows the program to choose from a list of line numbers to go to. If the variable (in this case CL) has a value of 1, the first line number is the one chosen (here 40). If the value is 2, the second number in the list is used, etc. Lines 40-110 just convert our random key colors to the appropriate CHR$ code for that color and return the program to line 10 to PRINT a section of the bar in that color. Then the whole process starts over again. See if you can figure out how to produce 16 random numbers, expand ON ... GOTO to handle them, and add the remaining CHR$ codes to display the remaining 8 colors. 5.4. PEEKs and POKEs No, we're not talking about jobbing the computer, but we will be able to "look around" inside the machine and "stick" things in there. Just as variables could be thought of as a representation of "boxes" within the machine where you placed your information, you can also think of some specially defined "boxes" within the computer that represent specific memory locations. The Commodore 64 looks at these memory locations to see what the screen's background and border color should be, what characters are to be displayed on the screen -- and where -- and a host of other tasks. By placing, "POKEing", a different value into the proper memory location, we can change colors, define and move objects, and even create music. These memory locations could be represented like this: +-----------+ +-----------+ +-----------+ +-----------+ | 53280 | | 53281 | | 53282 | | 53283 | | X | | Y | | | | | +-----------+ +-----------+ +-----------+ +-----------+ BORDER BACKGROUND COLOR COLOR Above we showed just four locations, two of which control the screen and background colors. Try typing this: POKE 53281,7 The background color of the screen will change to yellow because we placed the value '7' -- for yellow -- in the location that controls the background color of the screen. Try POKEing different values into the background color location, and see what results you get. You can POKE any value between 0 and 255, but only 0 through 15 will work. The actual values to POKE for each color are: +-----------------------------------------------------------------------+ | 0 BLACK 8 ORANGE | | 1 WHITE 9 BROWN | | 2 RED 10 Light RED | | 3 CYAN 11 GRAY 1 | | 4 PURPLE 12 GRAY 2 | | 5 GREEN 13 Light GREEN | | 6 BLUE 14 Light BLUE | | 7 YELLOW 15 GRAY 3 | +-----------------------------------------------------------------------+ Can you think of a way to display the various background and border combinations? The following may be of some help: NEW 10 FOR BA = 0 TO 15 20 FOR BO = 0 TO 15 30 POKE 53280, BO 40 POKE 53281, BA 50 FOR X = 1 TO 2000 : NEXT X 60 NEXT BO : NEXT BA Two simple loops were set up to POKE various values to change the background and border colors. The DELAY loop in line 50 just slows things down a bit. For the curious, try: ? PEEK(53280) AND 15 You should get a value of 15. This is the last value BORDER was given and makes sense because both the background and border colors are GRAY (value 15) after the program is run. By entering AND 15 you eliminate all other values except 1-15, because of the way color codes are stored in the computer. Normally you would expect to find the same value that was last POKEd in the location. In general, PEEK lets us examine a specific location and see what value is presently there. Can you think of a one line addition to the program that will display the value of BACK and BORDER as the program runs? How about this: 25 PRINT CHR$(147); "BORDER =";PEEK(53280) AND 15, "BACKGROUND ="; PEEK(53281) AND 15 5.5. Screen Graphics In all the printing information that you've done so far, the computer normally handled information in a sequential fashion: one character is printed after the next, starting from the current cursor position (except where you asked for a new line, or used the ',' in PRINT formatting). To PRINT data in a particular spot you can start from a known place on the screen and PRINT the proper number of cursor controls to format the display. But this takes program steps and is time consuming. But just as there are certain spots in the Commodore 64's memory to control color, there are also locations that you can use to directly control each location on the screen. SCREEN MEMORY MAP Since the computer's screen is capable of holding 1000 characters (40 columns by 25 lines) there are 1000 memory locations set aside to handle what is placed on the screen. The layout of the screen could be thought of as a grid, with each square representing a memory location. And since each location in memory can contain a number from 0 to 255, there are 256 possible values for each memory location. These values represent the different characters the Commodore 64 can display (see Appendix E). By POKEing the value for a character in the appropriate screen memory location, that character will be displayed in the proper position. Screen memory in the Commodore 64 normally begins at memory location 1024, and ends at location 2023. Location 1024 is the upper left corner of the screen. Location 1025 is the position of the next character to the right of that, and so on down the row. Location 1063 is the right-most position of the first row. The next location following the last character on a row is the first character on the next row down. COLUMN 1063 0 10 20 30 39 / +------------------------------------------------------------/ 1024 | | 0 1064 | | 1104 | | 1144 | | 1184 | | 1224 | | 1264 | | 1304 | | 1344 | | 1384 | | 1424 | | 10 1464 | | 1504 | | ROW 1544 | | 1584 | | 1624 | | 1664 | | 1704 | | 1744 | | 1784 | | 1824 | | 20 1864 | | 1904 | | 1944 | | 1984 | | 24 +------------------------------------------------------------\ \ 2023 Now, let's say that you're controlling a ball bouncing on the screen. The ball is in the middle of the screen, column 20, row 12. The formula for calculation of the memory location on the screen is: POINT = 1024 + X + 40 * Y ^ ^ | |__ Column |___________ Row where X is the column and Y is the row. Therefore, the memory location of the ball is: 1024 + 20 + 480 or 1524 ^ ^ | |_____________ Row (40 * 12) |___________________ Column Clear the screen with and and type: POKE 1524, 81 POKE 55796, 1 ^ ^ | |______ Color |___________ Location COLOR MEMORY MAP A ball appears in the middle of the screen! You have placed a character directly into screen memory without using the PRINT statement. The ball that appeared was white. However there is a way to change the color of an object on the screen by altering another range of memory. Type: POKE 55796, 2 ^ ^ | |______ Color |___________ Location The ball's color changes to red. For every spot on the Commodore 64's screen there are two memory locations, one for the character code, and the other for the color code. The color memory map begins at location 55296 (top left-hand corner), and continues on for 1000 locations. The same color codes, from 0-15, that we used to change border and background colors can be used here to directly change character colors. COLUMN 55335 0 10 20 30 39 / +------------------------------------------------------------/ 55296| | 0 55336| | 55376| | 55416| | 55456| | 55496| | 55536| | 55576| | 55616| | 55656| | 55696| | 10 55736| | 55776| | ROW 55816| | 55856| | 55896| | 55936| | 55976| | 56016| | 56056| | 56096| | 20 56136| | 56176| | 56216| | 56256| | 24 +------------------------------------------------------------\ 56295 The formula we used for calculating screen memory locations can be modified to give the locations to POKE color codes. The new formula is: COLOR PRINT = 55296 + X + 40 * Y 5.6. More Bouncing Balls Here's a revised bouncing ball program that prints directly on the screen with POKEs, rather than using controls within PRINT statements. As you will see after running the program, it is much more flexible than the earlier program, and will lead up to programming much more sophisticated animation. NEW 10 PRINT "{CLR/HOME}" 20 POKE 53280,7 : POKE 53281,13 30 X = 1 : Y = 1 40 DX = 1 : DY = 1 50 POKE 1024 + X + 40 * Y, 81 60 FOR T = 1 TO 10 : NEXT 70 POKE 1024 + X + 40 * Y, 32 80 X = X + DX 90 IF X <= 0 OR X >= 39 THEN DX = -DX 100 Y = Y + DY 110 IF Y <= 0 OR Y >= 24 THEN DY = -DY 120 GOTO 50 Line 10 clears the screen, and line 20 sets the background to light green with a yellow border. The X and Y variables in line 30 keep track of the current row and column position of the ball. The DX and DY variables in line 40 are the horizontal and vertical direction of the ball's movement. When a +1 is added to the X value, the ball is moved to the right; when -1 is added, the ball moves to the left. A +1 added to Y moves the ball down a row; a -1 added to Y moves the ball up a row. Line 50 puts the ball on the screen at the current cursor position. Line 60 is the familiar delay loop, leaving the ball on the screen just long enough to see it. Line 70 erases the ball by putting a space (code 32) where the ball was on the screen. Line 80 adds the direction factor to X. Line 90 tests to see if the ball has reached one of the side walls, reversing the direction if there's a bounce. Line 100 and 110 do the same thing for the top and bottom walls. Line 120 sends the program back to display and moves the ball again. By changing the code in line 50 from 81 to another character code, you can change the ball to any other character. If you change DX and DY to 0 the ball will bounce straight instead of diagonally. We can also add a little more intelligence. So far the only thing you checked for is the X and Y values getting out of bounds for the screen. Add the following lines to the program: 21 FOR L = 1 TO 10 25 POKE 1024 + INT(RND(1)*1000), 166 <------------------ Screen Code 27 NEXT L 85 IF PEEK(1024 + X + 40 * Y) = 166 THEN DX = -DX : GOTO 80 105 IF PEEK(1024 + X + 40 * Y) = 166 THEN DY = -DY : GOTO 100 Lines 21 to 27 put 10 blocks on the screen in random positions. Lines 85 and 105 check (PEEK) to see if the ball is about to bounce into a block, and changes the ball's direction if so. 6. SPRITE GRAPHICS 6.1. Introduction to Sprites In previous chapters dealing with graphics, we saw that graphic symbols could be used in PRINT statements to create animation and add chartlike appearances to our display. A way was also shown to POKE character codes in specific screen memory locations. This would then place the appropriate characters directly on the screen in the right spot. Creating animation in both these cases requires a lot of work because objects must be created from existing graphic symbols. Moving the object requires a number of program statements to keep track of the object and move it to new spot. And, because of the limitation of using graphic symbols, the shape and resolution of the object might not be as good as required. Using sprites in animated sequences eliminates a lot of these problems. A sprite is a high-resolution programmable object that can be made into just about any shape -- through BASIC commands. The object can be easily moved around the screen by simply telling the computer the position the sprite should be moved to. The computer takes care of the rest. And sprites have much more power than just that. Their color can be changed; you can tell if one object collides with another; they can be made to go in front and behind another; and they can be easily expanded in size, just for starters. The penalty for all this is minimal. However, using sprites requires knowing some more details about how the Commodore 64 operates and how numbers are handled within the computer. It's not as difficult as it sounds, though. Just follow the examples and you'll be making your own sprites do amazing things in no time. 6.2. Sprite Creation Sprites are controlled by a separate picture-maker in the Commodore 64. This picture maker handles the video display. It does all the hard work of creating and keeping track of characters and graphics, creating colors, and moving around. This display circuit has 46 different "ON/OFF" locations which act like internal memory locations. Each of these locations breaks down into a series of 8 blocks. And each block can either be "ON" or "OFF". We'll get into more detail about this later. By POKEing the appropriate decimal value in the proper memory location you can control the formation and movement of your sprite creations. In addition to accessing many of the picture making locations we will also be using some of the Commodore 64's main memory to store information (data) that defines the sprites. Finally, eight memory locations directly after the screen memory will be used to tell the computer exactly which memory area each sprite will get its data from. As we go through some examples, the process will be very straightforward, and you'll get the hang of it. So let's get on with creating some sprite graphics. A sprite object is 24 dots wide by 21 dots long. Up to eight sprites can be controlled at a time. Sprites are displayed in a special independent 320 dot wide by 200 dot high area. However, you can use your sprite with any mode, high- resolution, low-resolution, text etc. Say you want to create a balloon and have it float around the sky. The balloon could be designed as in the 24 by 21 grid: SERIES |SERIES |SERIES 1 | 2 | 3 | | 1 1 1 2631 2631 2631 842684218426842184268421 +------------------------+ 1 |.........#######........| 2 |.......###########......| 3 |......#############.....| 4 |......#####...#####.....| 5 |.....#####.###..####....| 6 |.....#####.###.#####....| 7 |.....#####.###..####....| 8 |......#####...#####.....| 9 |......#############.....| R 10 |......#############.....| O 11 |......#.#########.#.....| W 12 |.......#.#######.#......| 13 |.......#..#####..#......| 14 |........#..###..#.......| 15 |........#..###..#.......| 16 |.........#..#..#........| 17 |.........#..#..#........| 18 |..........#####.........| 19 |..........#####.........| 20 |..........#####.........| 21 |...........###..........| +------------------------+ 1 1 2 2 1 5 0 5 0 4 COLUMN The next step is to convert the graphic design into data the computer can use. Get a piece of notebook or graph paper and set up a sample grid that is 21 spaces down and 24 spaces across. Across the top write 128, 64, 32, 16, 8, 4, 2, 1, three times (as shown) for each of the 24 squares. Number down the left side of the grid 1-21 for each row. Write the word DATA at the end of each row. Now fill in the grid with any design or use the balloon that we have. It's easiest to outline the shape first and then go back and fill in the grid. Now if you think of all the squares you filled in as "ON" then substitute a 1 for each filled square. For the one's that aren't filled in, they're "OFF" so put a zero. Starting on the first row, you need to convert the dots into three separate pieces of data the computer can read. Each set of 8 squares is equal to one piece of data called a byte in our balloon. Working from the left, the first 8 squares are blank, or 0, so the value for that series of numbers is 0. The middle series looks like this (again a 1 indicates a dot, 0 is a space): 128 64 32 16 8 4 2 1 +-----+-----+-----+-----+-----+-----+-----+-----+ | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +-----+-----+-----+-----+-----+-----+-----+-----+ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | 0 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 127 The third series on the first row also contains blanks, so it, too, equals zero. Thus, the data for the first line is: DATA 0, 127, 0 The series that make up row two are calculated like this: +-----+-----+-----+-----+-----+-----+-----+-----+ Series 1: | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +-----+-----+-----+-----+-----+-----+-----+-----+ 1 = 1 +-----+-----+-----+-----+-----+-----+-----+-----+ Series 2: | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +-----+-----+-----+-----+-----+-----+-----+-----+ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 +-----+-----+-----+-----+-----+-----+-----+-----+ Series 3: | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | +-----+-----+-----+-----+-----+-----+-----+-----+ ^ ^ | | 128 + 64 = 192 For row 2, the data would be: DATA 1, 255, 192 In the same way, the three series that make up each remaining row would be converted into their decimal value. Take the time to do the remainder of the conversion in this example. Now that you have the data for your object, how can it be put to use? Type in the following program and see what happens. 1 REM UP, UP, AND AWAY! 5 PRINT "{CLR/HOME}" 10 V = 53248 : REM START OF DISPLAY CHIP 11 POKE V+21, 4 : REM ENABLE SPRITE 2 12 POKE 2042, 13 : REM SPRITE 2 DATA FROM 13TH BLOCK 20 FOR N = 0 TO 62 : READ Q : POKE 832+N, Q : NEXT 30 FOR X = 0 TO 200 ^------ GETS ITS INFO. FROM DATA* 40 POKE V+4, X : REM UPDATE X COORDINATES 50 POKE V+5, X : REM UPDATE Y COORDINATES 60 NEXT X 70 GOTO 30 200 DATA 0,127,0,1,255,192,3,255,224,3,231,224 <- INFO. READ IN FROM "Q" 210 DATA 7,217,240,7,223,240,7,217,240,3,231,224 220 DATA 3,255,224,3,255,224,2,255,160,1,127,64 230 DATA 1,62,64,0,156,128,0,156,128,0,73,0,0,73,0 240 DATA 0,62,0,0,62,0,0,62,0,0,28,0 * FOR MORE DETAIL ON READ & DATA SEE CHAPTER 8. If you typed everything correctly, your balloon is smoothly flying across the sky: [ PICTURE OMITTED ] In order to understand what happened, first you need to know what picture making locations control the functions you need. These locations, called registers, could be illustrated in this manner: Register(s) Description 0 X coordinate of sprite 0 1 Y coordinate of sprite 0 2 - 15 Paired like 0 and 1 for sprites 1-7 16 Most Significant Bit -- X coordinate 21 Sprite appear: 1 = appear, 0 = disappear 29 Expand sprite in "X" Direction 23 Expand sprite in "Y" Direction 39-46 Sprite 0-7 color In addition to this information you need to know from which 64 byte section sprites will get their data (1 byte is used). This data is handled by 8 locations directly after screen memory: +------+------+------+------+------+------+------+------+ | 2040 | 2041 | 2042 | 2043 | 2044 | 2045 | 2046 | 2047 | +------+------+------+------+------+------+------+------+ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | SPRITE 0 1 2 3 4 5 6 7 Now let's outline the exact procedure to get things moving and finally write a program. There are only a few things necessary to actually create and move an object. 1. Make the proper sprite(s) appear on the screen by POKEing into location 21 a 1 for the bit which turns on the sprite. 2. Set sprite pointer (locations 2040-2047) to where sprite data should be read from. 3. POKE actual data into memory. 4. Through a loop, update X and Y coordinates to move sprite around. 5. You can, optionally, expand the object, change colors, or perform a variety of special functions. Using location 29 to expand your sprite in the "X" direction and location 23 in the "Y" direction. There are only a few items in the program that might not be familiar from the discussion so far. In line 10, V = 53248 sets V to the starting memory location of the video chip. In this way we just increase V by the memory number to get the actual memory location. The register numbers are the ones given on the sprite register map. In line, POKE V+21,4 makes sprite 2 appear by placing a 4 in what is called the sprite enable register (21) to turn on sprite 2. Think of it like this: SPRITES Decimal Values of Each Sprite Number 128 64 32 16 8 4 2 1 Sprite Level Numbers 7 6 5 4 3 2 1 0 +-------+-------+-------+-------+-------+-------+-------+-------+ 21 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | = 4 +-------+-------+-------+-------+-------+-------+-------+-------+ ^ | Put a 1 For The SPRITE You Want Each sprite level is represented in section 21 of the sprite memory and 4 happens to be sprite level 2. If you were using level 3 you would put a 1 in sprite 3 which has a value of 8. In fact, if you used both sprites 2 and 3 you would put a 1 in both 4 and 8. You would then add the numbers together just like you did with the DATA on your graph paper. So, turning on sprites 2 and 3 would be represented as V+21,12. In line 12, POKE 2042,13 instructs the computer to get the data for sprite 2 (location 2042) from the 13th area of memory. You know from making your sprite that it takes up 63 sections of memory. You may not have realized it, but those numbers you put across the top of your grid equal what is known as 3 bytes of the computer. In other words each collection of the following numbers, 128, 64, 32, 16, 8, 4, 2, equals 1 byte of computer memory. Therefore with the 21 rows of your grid times the 3 bytes of each row, each sprite takes up 63 bytes of memory. 20 FOR N = 0 TO 62 : READ Q : POKE 832+N, Q : NEXT ^ ^ | | +---------------+------- 1 WHOLE SPRITE This line handles the actual sprite collision. The 63 bytes of data that represent the sprite you created are READ in through the loop and POKEd into the 13th block of memory. This starts at location 832. 30 FOR X = 0 TO 200 40 POKE V+4, X <---- SPRITE 2'S X COORDINATE 50 POKE V+5, X <---- SPRITE 2'S Y COORDINATE If you remember from school the X coordinate represents an objects horizontal movement across the screen and the Y coordinate represents the sprite's vertical movement across the screen. Therefore as the values of X change in line 30 from 0 to 200 (one number at a time) the sprite moves across the screen DOWN and TO THE RIGHT one space for each number. The numbers are READ by the computer fast enough to make the movement appear to be continuous, instead of 1 step at a time. If you need more details take a look at the register map in Appendix O. When you get into moving multiple objects, it would be impossible for one memory section to update the locations of all eight objects. Therefore each sprite has its own set of 2 memory sections to make it move on the screen. Line 70 starts the cycle over again, after one pass on the screen. The remainder of the program is the data for the balloon. Sure looks different on the screen, doesn't it? Now, try adding the following line: 25 POKE V+23, 4 : POKE V+29, 4 : REM EXPAND and RUN the program again. The balloon has expanded to twice the original size! What we did was simple. By POKEing 4 (again to indicate sprite 2) into memory sections 23 and 29, sprite 2 was expanded in the X and Y direction. It's important to note that the sprite will start in the upper left- hand corner of the object. When expanding an object in either direction, the starting point remains the same. For some added excitement, make the following changes: 11 POKE V+21, 12 12 POKE 2042, 13 : POKE 2043, 13 30 FOR X = 1 TO 190 45 POKE V+6, X 55 POKE V+7, 190-X A second sprite (number 3) has been turned on by POKEing 12 into the memory location that makes the sprite appear (V+21). The 12 turns sprites 3 and 2 on (00001100 = 12). The added lines 45 and 55 move sprite 3 around by POKEing values into sprite 3's X and Y coordinate locations (V+6 and V+7). Want to fill the sky with even more action? Try making these additions: 11 POKE V+21, 28 <-- 28 IS REALLY 4(SPRITE 2)+8(SPRITE 3)+16(SPRITE 4) 12 POKE 2042, 13 : POKE 2043, 13 : POKE 2044, 13 25 POKE V+23, 12 : POKE V+29, 12 48 POKE V+8, X 58 POKE V+9, 100 In line 11 this time, another sprite (4) was made to appear by POKEing 28 into the appropriate "ON" location of the sprite memory section. Now sprites 2-4 are on (00011100 = 28). Line 12 indicates that sprite 4 will get its data from the same memory area (13th 63 section area) as the other sprites by POKEing 2044,13. In line 25, sprites 2 and 3 are expanded by POKEing 12 (Sprites 2 and 3 on) into the X and Y direction expanded memory locations (V+23 and V+29). Line 48 moves sprite 3 along the X axis. Line 58 positions sprite 3 halfway down the screen, at location 100. Because this value does not change, like it did before with X=0 to 200, sprite 3 just moves horizontally. 6.3. Additional Notes on Sprites Now that you've experimented with sprites, a few more words are in order. First, you can change a sprite's color to any of the standard 16 color codes (0-15) that were used to change character color. These can be found in Chapter 5 or in Appendix G. For example, to change sprite 1 to light green, type: POKE V+40,13 (be sure to set V = 53248). You may have noticed in using the example sprite programs that the object never moved to the right-hand edge of the screen. This was because the screen is 320 dots wide and the X direction register can only hold a value up to 255. How then can you get an object to move across the entire screen? There is a location on the memory map that has not been mentioned yet. Location 16 (of the map) controls something called the Most Significant Bit (MSB) of the sprite's X direction location. In effect, this allows you to move the sprite to a horizontal spot between 256 and 320. The MSB of X register works like this: after the sprite has been moved to X location 255, place a value into memory location 16 representing the sprite you want to move. For example, to get sprite 2 to move to horizontal locations 256-320, POKE the value for sprite 2 (which is 4) into memory location 16: POKE V+16, 4 Now start from 0 again in the usual X direction register for sprite 2 (which is in location 4 of the map). Since you are only moving another 64 spaces, X locations would only range between 0 and 63 this time. This whole concept is best illustrated with a version of the original BALLOON SPRITE program: 10 V = 53248 : POKE V+21, 4 : POKE 2042, 13 20 FOR N = 0 TO 62 : READ Q : POKE 832+N, Q : NEXT 25 POKE V+5, 100 30 FOR X = 0 TO 255 40 POKE V+4, X 50 NEXT 60 POKE V+16, 4 70 FOR X = 0 TO 63 80 POKE V+4, X 90 NEXT 100 POKE V+16, 0 110 GOTO 30 200 DATA 0,127,0,1,255,192,3,255,224,3,231,224 210 DATA 7,217,240,7,223,240,7,217,240,3,231,224 220 DATA 3,255,224,3,255,224,2,255,160,1,127,64 230 DATA 1,62,64,0,156,128,0,156,128,0,73,0,0,73,0 240 DATA 0,62,0,0,62,0,0,62,0,0,28,0 Line 60 sets the most significant bit for sprite 2. Line 70 starts moving the standard X direction location, moving sprite 2 the rest of way across the screen. Line 100 is important because it "TURNS OFF" the MSB so that the sprite can start moving from the left edge of the screen again. To define multiple sprites, you may need additional blocks for the sprite data. You can use so