Listing of file='TTRL15.BAS;01' on disk='vmedia/BASIC_language_11-15-sector.ccvf'
100 REM COPYRIGHT (C) BY COMPUCOLOR 1980 105 REM BY KLH 7/17/80 REV 1.1 110 CLEAR 1000:ADR= 256* PEEK (32941)+ PEEK (32940) 115 IF ADR> 65535- 51THEN PLOT 1 120 A2= 256* PEEK (ADR+ 50)+ PEEK (ADR+ 49):IF A2< > ADRTHEN PLOT 1 125 Q$= CHR$ (34):POKE ADR+ 41,5:POKE ADR+ 42,5 130 POKE ADR+ 44,1:POKE ADR+ 45,1 135 PLOT 6,2,12,3,16,7:PRINT " ALGORITHMS AND MISCELLANEOUS 140 PRINT " IT IS ONE THING TO KNOW ALL THE COMMANDS OF BASIC, AND QUITE 145 PRINT :PRINT TAB( 4)"ANOTHER TO USE THEM EFFECTIVELY IN YOUR PROGRAMMING. BY 150 PRINT :PRINT " THIS TIME YOU SHOULD BE (PAINFULLY) FAMILIAR WITH BASIC, SO 155 PRINT :PRINT " FOR THIS LESSON WE'RE GOING TO DISCUSS ALGORITHMS, AND A FEW 160 PRINT :PRINT "OTHER THINGS THAT HAVEN'T BEEN DISCUSSED ANYWHERE YET. FOR THIS 165 PRINT :PRINT TAB( 3)"REFER TO THE ENCLOSED LISTINGS OF PROGRAMS #1,#2, AND #3. 170 GOSUB 695 175 PLOT 3,5,6:PRINT "THERE ARE THREE GOOD REASONS FOR USING AN ALGORITHM; TO 180 PRINT :PRINT "INCREASE PROGRAM SPEED, TO SAVE MEMORY SPACE, AND TO PERFORM AN 185 PRINT :PRINT " OPERATION OR FUNCTION THAT CAN BEST BE DONE BY A PROGRAM. AN 190 PRINT :PRINT "EXAMPLE OF THE FIRST TWO CASES WOULD BE COMPARING VALUES. IF AN 195 PRINT :PRINT " INPUT IS CHECKED AGAINST ONE HUNDRED VALUES, A SIMPLE ALGORITHM 200 PRINT " COULD BE WRITTEN USING AN ARRAY AND A FOR-NEXT LOOP AS OPPOSED 205 PRINT :PRINT " TO ONE HUNDRED SEPARATE IF STATEMENTS. EVEN THOUGH THIS IS A 210 PRINT :PRINT "LITTLE DRASTIC, YOU CAN SEE THE ADVANTAGE OF THE ALGORITHM. THE 215 PRINT :PRINT " OTHER CASE WILL BE THE POINT OF OUR THREE EXAMPLE PROGRAMS. 220 GOSUB 695 225 PLOT 3,1,4:PRINT "PROGRAM #1 IS AN INTERESTING SOLUTION TO THE AGE-OLD QUESTION 230 PRINT :PRINT TAB( 5)Q$"HOW DO I GET EXTENDED PRECISION?"Q$". THIS PROGRAM TAKES 235 PRINT :PRINT "THREE NUMBERS, AND DIVIDES THE FIRST BY THE SECOND TO THE NUMBER 240 PRINT " OF PLACES SPECIFIED BY THE THIRD. FOR WHAT IT DOES THE PROGRAM 245 PRINT :PRINT TAB( 12)"IS VERY SIMPLE, SO LET'S GO THROUGH IT. 250 PRINT :PRINT " AFTER GETTING ALL INPUTS, DD (THE DIVIDEND) IS DIVIDED BY DR 255 PRINT :PRINT " (THE DIVISOR), AND THE INTEGER PORTION Q IS KEPT AND PRINTED. 260 PRINT :PRINT " NEXT, THE REMAINDER (DD-Q*DR) IS MULTIPLIED BY TEN AND STORED 265 PRINT :PRINT TAB( 4)"BACK IN DD. THE PROCESS IS REPEATED UNTIL THE DIVISION HAS 270 PRINT :PRINT " BEEN DONE THE SPECIFIED NUMBER OF TIMES OR UNTIL THERE IS NO 275 PRINT :PRINT TAB( 17)"REMAINDER LEFT TO BE DIVIDED. 280 GOSUB 695:PLOT 3,3,9 285 PRINT "THE REASON THIS ALGORITHM WORKS IS THAT IT IS BASED ON THE 290 PRINT :PRINT " SAME PRINCIPLE AS USED FOR DIVISION; MULTIPLY THE NUMBER OF 295 PRINT :PRINT " TIMES THE DIVISOR WILL GO INTO THE DIVIDEND TIMES THE DIVISOR, 300 PRINT :PRINT " SUBTRACT THAT NUMBER FROM THE DIVIDEND, THE RESULT BECOMES THE 305 PRINT :PRINT " NEW DIVIDEND, AND START OVER. BY LOOKING AT THE PROGRAM THIS 310 PRINT :PRINT TAB( 17)"SHOULD BECOME CLEAR TO YOU. 315 GOSUB 695 320 PLOT 3,2,7:PRINT "PROGRAM #2 IS A DEMONSTRATION OF A WAY TO READ THE KEYBOARD, 325 PRINT :PRINT "EVEN WHEN IT IS LOCKED OUT. THIS SENTENCE MAY SEEM TO CONTRADICT 330 PRINT " ITSELF, BUT IT IS TRUE. BY USE OF THE OUT AND INP STATEMENTS, 335 PRINT :PRINT " THE STATUS OF MOST KEYS CAN BE READ. NOTE THE WORD MOST: THIS 340 PRINT :PRINT " ALGORITHM MAY TELL YOU SOME KEYS ARE DOWN THAT ARE NOT. THIS 345 PRINT :PRINT " IS ONE REASON THE SYSTEM SOFTWARE WILL NOT RESPOND WHEN TWO OR 350 PRINT :PRINT " MORE KEYS ARE SIMULTANEOUSLY STRUCK. ALSO NOTE THAT THE SHIFT, 355 PRINT :PRINT TAB( 12)"CONTROL AND COMMAND KEYS HAVE NO EFFECT. 360 GOSUB 695 365 PLOT 3,2,4:PRINT "THERE ARE SIXTEEN VALUES TO BE OUTPUT IN ORDER TO READ THE 370 PRINT :PRINT "STATUS ON ALL THE KEYS. WHEN THE PROGRAM IS RUN, THE ARRAY A IS 375 PRINT :PRINT "DIMENSIONED FOR 16 VALUES (0-15). EACH VALUE IS OUTPUT TO PORT 380 PRINT :PRINT "7 (TRANSMITS PARALLEL DATA TO KEYBOARD) AND THE INPUT FROM PORT 385 PRINT :PRINT " 1 (READ PARALLEL DATA FROM KEYBOARD) IS STORED IN THE ARRAY. 390 PRINT :PRINT " NEXT, EACH OF THE SIXTEEN INPUTS ARE CHECKED. IF THE VALUE IS 395 PRINT :PRINT "255 NO KEY IN THAT SECTION WAS DOWN; OTHERWISE AT LEAST ONE KEY 400 PRINT :PRINT " WAS DOWN. THE VALUE IS REARRANGED - LINES 160 AND 170 IN EFFECT 405 PRINT " EXCHANGE THE UPPER AND LOWER FOUR BITS. THE NEW VALUE IS THEN 410 PRINT :PRINT " SCANNED BIT BY BIT, AND EACH BIT THAT IS ZERO IS CONVERTED IN 415 PRINT :PRINT " LINE 200 TO REPRESENT THE KEY THAT IS DOWN. WHEN ALL VALUES 420 PRINT :PRINT TAB( 6)"HAVE BEEN ACCOUNTED FOR, THE CYCLE STARTS OVER AGAIN. 425 GOSUB 695 430 PLOT 3,3,3:PRINT "PROGRAM #3 IS A PROGRAM THAT MAY HAVE NO IMMEDIATE PURPOSE 435 PRINT :PRINT " OTHER THAN TO PROVE THAT INCREDIBLY OBSCURE PROBLEMS CAN BE 440 PRINT :PRINT TAB( 19)"SOLVED ONE WAY OR ANOTHER. 445 PRINT :PRINT " THIS PROGRAM TAKES AN INPUT FOR AN X-Y COORDINATE, AND TELLS 450 PRINT :PRINT " WHETHER THE POINT IS ON, OFF, OR IF IT IS A CHARACTER BLOCK. 455 PRINT :PRINT "THE PROGRAMMING ITSELF IS FAIRLY SIMPLE. FROM THE X-Y INPUT THE 460 PRINT :PRINT " BYTE OF SCREEN MEMORY IS DETERMINED (LINES 120 & 130). THE 465 PRINT :PRINT " CONTENTS OF BYTES SC AND SC+1 ARE STORED IN SC AND SL. IF SL 470 PRINT :PRINT " IS LESS THAN 128 (THUS A7=0) THEN IT IS A CHARACTER BLOCK. 475 PRINT :PRINT " OTHERWISE THE BIT IN THE BLOCK IS DETERMINED (LINES 170 & 180) 480 PRINT :PRINT " AND THE RESULT IS ANDED WITH SC. IF THIS RESULT IS NOT ZERO, 485 PRINT :PRINT TAB( 14)"THEN THE BIT (AND POINT) MUST BE ON. 490 GOSUB 695 495 PLOT 3,5,12:PRINT "AS A LAST POINT, THERE ARE TWO OTHER ITEMS THAT MAY BE 500 PRINT :PRINT "COME IN USEFUL LATER. THESE ARE EMBEDDING CONTROL CHARACTERS IN 505 PRINT :PRINT TAB( 19)"STRINGS AND ESCAPE CODES. 510 GOSUB 695:PLOT 3,2,5 515 PRINT "CONTROL CHARACTERS CAN BE ADDED TO STRING VARIABLES. THE TWO 520 PRINT :PRINT " EASIEST WAYS TO DO THIS ARE EITHER BY THE CHR$ STATEMENT, OR 525 PRINT :PRINT " WITH THE COMPUCOLOR BASIC EDITOR (FREDI). FOR EXAMPLE, INSTEAD 530 PRINT :PRINT "OF PLOTTING A FREQUENTLY USED DESIGN IN THE POINT PLOT MODE EACH 535 PRINT " TIME IT IS USED, YOU COULD CREATE THE STRING A$ WITH ALL THE 540 PRINT :PRINT " VALUES IN IT, AND PRINT IT EACH TIME IT IS NEEDED. (IF THE 545 PRINT :PRINT " STRING IS LONGER THAN 64 CHARACTERS, YOU WILL NEED TO POKE A 550 PRINT :PRINT "VALUE GREATER THAN THE LENGTH OF THE STRING AT 33289 [NUMBER OF 555 PRINT :PRINT " CHARACTERS ON TERMINAL OUTPUT]). LIKEWISE, A FREQUENTLY PRINTED 560 PRINT " STRING COULD HAVE THE CURSOR X-Y COORDINATES (PLOT 3) ENCODED 565 PRINT :PRINT " IN IT. DEPENDING ON YOUR APPLICATION, THIS COULD SAVE MEMORY. 570 GOSUB 695 575 PLOT 3,4,3:PRINT "THERE ARE ESCAPE CODES FOR MACHINE LANGUAGE APPLICATIONS. 580 PRINT :PRINT " EACH OF THESE "Q$"JUMPS"Q$" TO A SPECIFIED MEMORY LOCATION. THEY ARE 585 PRINT :PRINT " ESC P - 16384 ESC Z - 18432":PRINT " ESC \ - 20480 ESC ] - 22528 590 PRINT " ESC ^ - 33215 ESC T - 33280":PRINT " ESC I - 36864 ESC S - 40960 595 PRINT :PRINT " THE ESC ^ SEQUENCE JUMPS TO AN AREA OF SYSTEM RAM. AT THOSE 600 PRINT :PRINT "THREE BYTES (33215-33217), THE USER CAN POKE A MACHINE LANGUAGE 605 PRINT :PRINT " JUMP TO HIS PROGRAM LOCATED ELSEWHERE IN MEMORY. FROM BASIC 610 PRINT :PRINT " THESE ESCAPE SEQUENCES CAN BE DONE BY A PLOT STATEMENT. IF YOU 615 PRINT :PRINT " DO USE THEM FROM BASIC, THE TOP-OF-MEMORY POINTER MUST BE SET 620 PRINT :PRINT " BELOW THE MACHINE LANGUAGE PROGRAM SO THAT BASIC DOESN'T 625 PRINT :PRINT " DISTURB THAT AREA OF MEMORY. LIKEWISE, ANY MACHINE LANGUAGE 630 PRINT :PRINT " PROGRAMS AT 36864 OR 40960 WILL NOT "Q$"KILL"Q$" BASIC (DESTROY 635 PRINT :PRINT " THE POINTERS SET UP TO RUN BASIC). 640 GOSUB 695:PRINT " THIS CONCLUDES TUTORIAL FIFTEEN. DO YOU WISH TO REVIEW THIS 645 PLOT 6,2:INPUT " LESSON (YES/NO)? ";ZZ$:IF LEFT$ (ZZ$,1)= "Y"THEN 135:REM 650 IF LEFT$ (ZZ$,1)< > "N"THEN PLOT 28,11:GOTO 645 655 PRINT :PRINT " TAKE A LOOK AT THE PROGRAMS WE'VE DISCUSSED IN THIS LESSON 660 PRINT " AND IF YOU WANT TO START WITH LESSON ELEVEN AGAIN, 665 PRINT TAB( 25)"JUST HIT AUTO. 670 POKE ADR+ 41,1:POKE ADR+ 42,1:POKE ADR+ 44,0:POKE ADR+ 45,0:PLOT 27,11 675 POKE 33434,0:POKE 33435,0:END 680 IF ZZ$= "MENU"THEN LOAD ZZ$:RUN 170 685 IF PEEK (33278)< > 1THEN RETURN 690 PLOT 1 695 PRINT :INPUT " HIT RETURN TO CONTINUE: ";ZZ$:PLOT 12:GOTO 680