Listing of file='TTRL12.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:Q$= CHR$ (34):ADR= 256* PEEK (32941)+ PEEK (32940) 115 IF ADR> 65484THEN PLOT 1 120 A2= 256* PEEK (ADR+ 50)+ PEEK (ADR+ 49):IF A2< > ADRTHEN PLOT 1 125 C= 33227:Q$= CHR$ (34):POKE ADR+ 41,2:POKE ADR+ 42,2 130 LN= PEEK (ADR+ 44):IF LN< > PEEK (ADR+ 45)OR LN= 0THEN 140 135 ON LNGOTO 145,665 140 POKE ADR+ 44,1:POKE ADR+ 45,1 145 PLOT 6,0,12,3,19,7:PRINT " KEY MEMORY LOCATIONS 150 PRINT TAB( 4)" NOW THAT YOU HAVE BEEN SHOWN THE WONDERS OF THE PEEK AND 155 PRINT :PRINT "POKE STATEMENTS, NO DOUBT YOU JUST CAN'T WAIT TO FIND SOMETHING 160 PRINT :PRINT " IN MEMORY TO LOOK AT AND REARRANGE AND PLAY WITH. EVEN THOSE 165 PRINT :PRINT " WHO HAVE KNOWN HOW TO USE THESE STATEMENTS STILL FIND A NEW 170 PRINT :PRINT " MEMORY LOCATION TO USE AS HANDY AS ADDING A NEW COMMAND TO 175 PRINT :PRINT " BASIC. THEREFORE, THIS LESSON IS DEVOTED TO SHOWING KEY MEMORY 180 PRINT :PRINT TAB( 18)"LOCATIONS AND WHAT THEY DO. 185 GOSUB 1165 190 ME= 8:IF ADR> 40959THEN ME= 16:IF ADR> 49151THEN ME= 32 195 PLOT 3,1,4:PRINT "AS YOU MAY HAVE NOTICED, THIS COMPUCOLOR IS CALLED A"ME"K UNIT, 200 PRINT :PRINT " WHICH WOULD IMPLY THAT THE FREE RAM SHOULD BE"1024* ME" BYTES OF 205 PRINT :PRINT " MEMORY AVAILABLE. HOWEVER, THIS DOES NOT SEEM TO BE SO. WHEN 210 PRINT :PRINT " `YOU TURN THE COMPUTER ON, IT TELLS YOU THAT THERE ARE"1024* ME- 719 215 PRINT :PRINT " BYTES FREE. NOTE THAT THE ACTUAL FREE SIZE IS 719 BYTES LESS! 220 PRINT :PRINT TAB( 14)"WHERE DOES THIS MEMORY DISAPPEAR TO?" 225 PRINT :PRINT " ("Q$"....YOU ARE ABOUT TO ENTER...."Q$") 230 PRINT :PRINT " FEAR NOT; THIS MEMORY HAS NOT GONE ANYWHERE. KEEP IN MIND THAT 235 PRINT :PRINT " YOUR BASIC PROGRAM IS NOT THE ONLY FUNCTIONING SOFTWARE IN THE 240 PRINT :PRINT " COMPUTER. BASIC ITSELF IS OPERATING, ALONG WITH THE GRAPHIC 245 PRINT :PRINT " SOFTWARE, AND THE FILE CONTROL SYSTEM. ALL OF THESE REQUIRE A 250 PRINT :PRINT TAB( 10)"SMALL AMOUNT OF RAM TO DO THEIR JOBS ALSO. 255 GOSUB 1165 260 PLOT 3,2,6:PRINT "THE FIRST AREA WE'LL DISCUSS IS THE FCS RAM AREA. SINCE THERE 265 PRINT :PRINT " IS VERY LITTLE IN FCS THAT CAN'T BE DONE FROM BASIC, HERE ARE 270 PRINT :PRINT TAB( 6)"A FEW TRICKS THAT YOU CAN DO TO USE THE FCS BETTER. 275 PRINT :PRINT TAB( 4)"THE MOST IMPORTANT AREA USED BY FCS IS THE FILE PARAMETER 280 PRINT :PRINT " BLOCK, OR FPB. WHEN ANY KIND OF FILE OPERATION IS DONE, RANDOM 285 PRINT :PRINT "OR OTHERWISE, THE INFORMATION FROM THE DIRECTORY IS STORED HERE 290 PRINT :PRINT " AT LEAST TEMPORARILY. FROM THIS YOU CAN DETERMINE THE SPECS OF 295 PRINT :PRINT TAB( 10)"A FILE, AND DO SOME VERY INTERESTING THINGS. 300 GOSUB 1165 305 PRINT TAB( 12)"THE FPB IS LAID OUT IN MEMORY LIKE THIS: 310 PLOT 3,13,2:PRINT "ATTRIBUTE BYTE 33016" 315 PRINT TAB( 13)"FILE NAME 33017-33022" 320 PRINT TAB( 13)"FILE TYPE 33023-33025" 325 PRINT TAB( 13)"VERSION NUMBER 33026" 330 PRINT TAB( 13)"STARTING BLOCK 33027-33028" 335 PRINT TAB( 13)"SIZE IN BLOCKS 33029-33030" 340 PRINT TAB( 13)"LAST BLOCK BYTE COUNT 33031" 345 PRINT TAB( 13)"LOADING ADDRESS 33032-33033" 350 PRINT TAB( 13)"STARTING ADDRESS 33034-33035" 355 PLOT 6,1,2,24,82,242,103,82,103,121,24,121,24,83,255 360 PRINT " IN THE FPB, THE NAME AND TYPE ARE IN ASCII; ALL OTHER ENTRIES" 365 PRINT :PRINT "ARE NUMERIC. IN THE DIRECTORY, THEY WILL APPEAR IN HEXADECIMAL," 370 PRINT " SO DON'T BE SURPRISED IF THEY APPEAR DIFFERENT. THE NUMBERS" 375 PRINT :PRINT " TAKING UP TWO BYTES ARE STORED WITH THE LOW ORDER BYTE IN THE" 380 PRINT :PRINT TAB( 5)"FIRST LOCATION, AND THE HIGH ORDER BYTE IN THE SECOND." 385 PRINT :PRINT " NOTE: THE LOADING AND STARTING ADDRESSES ARE VALID ONLY FOR" 390 PRINT :PRINT "MACHINE-LANGUAGE PROGRAMS. IN BASIC THEY REPRESENT THE BEGINNING" 395 PRINT "AND ENDING ADDRESSES; WITH RANDOM FILES THEY TELL THE NUMBER OF" 400 PRINT :PRINT TAB( 9)"RECORDS, RECORD SIZE, AND BLOCKING FACTOR." 405 GOSUB 1165:PLOT 3,1,9 410 PRINT " LAST BLOCK BYTE COUNT MEANS THE NUMBER OF BYTES IN THE LAST 415 PRINT :PRINT " BLOCK OF THE FILE ON THE DISK. SINCE EACH BLOCK IS 128 BYTES 420 PRINT :PRINT " LONG, AND MOST OFTEN THE PROGRAM DOESN'T USE ALL 128 BYTES OF 425 PRINT :PRINT " THE LAST BLOCK, THIS REFERENCE IS KEPT. THE PROGRAM SIZE IS: 430 PRINT :PRINT " ((SIZE IN BLOCKS) - 1) * 128 + (LAST BLOCK COUNT) 435 GOSUB 1165 440 PLOT 3,2,5:PRINT "THE LARGEST AREA OF MEMORY SET ASIDE BY FCS IS THE DIRECTORY 445 PRINT :PRINT " BUFFER. WHEN A DIRECTORY IS DONE, THE INFORMATION IS READ INTO 450 PRINT :PRINT " THIS BUFFER, AND FCS INTERPRETS AND DISPLAYS IT. ALTHOUGH THE 455 PRINT :PRINT " ONLY WAY TO STOP IN THE MIDDLE OF A DIRECTORY IS BY A LINEFEED 460 PRINT :PRINT " (WHICH ALSO, INCIDENTALLY, STOPS BASIC), YOU CAN SEE WHAT IS 465 PRINT :PRINT " LEFT IN THE BUFFER AFTER THE DIRECTORY IS FINISHED. IN SOME 470 PRINT :PRINT " CASES, THIS WILL LET YOU SEE SOME OF THE LAST PROGRAMS ON THE 475 PRINT :PRINT "DISK, BUT IN ANY CASE THE LAST ENTRY IN THE DIRECTORY (THE FREE 480 PRINT :PRINT " SPACE ENTRY) WILL BE THERE. FROM THIS YOU CAN FIND THE AMOUNTS 485 PRINT :PRINT TAB( 14)"OF USED AND FREE SPACE ON THE DISK." 490 GOSUB 1165:PLOT 3,7,7 495 PRINT "HERE IS HOW TO FIND FREE SPACE FROM THE DIRECTORY:" 500 PRINT :PRINT TAB( 3)"THE FIRST AND EVERY TWENTY-FIRST BYTE AFTERWARDS WILL BE 505 PRINT :PRINT " THE ATTRIBUTE BYTE. FOR A FILE THIS VALUE WILL BE 3. FOR THE 510 PRINT :PRINT " FREE SPACE ENTRY, SIGNIFYING THE END OF THE DIRECTORY, THIS 515 PRINT :PRINT "VALUE WILL BE 1. WHEN A 1 IS FOUND, THE STARTING BLOCK AND SIZE 520 PRINT :PRINT "IN BLOCKS ENTRIES WILL REPRESENT USED SPACE AND SPACE REMAINING. 525 PRINT " BY SCANNING DOWN THE BUFFER UNTIL THE ATTRIBUTE BYTE IS FOUND, 530 PRINT :PRINT "THE AMOUNT OF FREE SPACE REMAINING ON THE DISK CAN BE CALCULATED" 535 PRINT TAB( 25)"QUITE EASILY. 540 GOSUB 1165:PLOT 3,2,8 545 PRINT "100 PLOT 27,4 : PRINT "Q$"DIR"Q$" : PLOT 27,27 550 PRINT " 200 FOR X=33055 TO 33181 STEP 21 : REM ATR BYTES IN BUFFER 555 PRINT " 300 IF PEEK(X)=1 THEN 500 : REM IF "Q$"FREE SPACE"Q$" EXIT LOOP 560 PRINT " 400 NEXT X 565 PRINT " 500 US=256*PEEK(X+12)+PEEK(X+11) : REM USED SPACE 570 PRINT " 600 FR=256*PEEK(X+14)+PEEK(X+13) : REM FREE SPACE 575 PRINT " 700 PRINT "Q$"USED IS"Q$";US,"Q$"FREE IS"Q$";FR 580 PRINT :PRINT TAB( 3)"FOR THOSE OF YOU STILL SCRATCHING YOUR HEAD FROM THE LAST 585 PRINT :PRINT " PAGE, HERE'S AN EXAMPLE PROGRAM THAT FINDS USED AND FREE SPACE 590 PRINT :PRINT " IN THE DIRECTORY BUFFER (LOCATIONS 33055-33181). 595 GOSUB 1165:PLOT 3,2,9 600 PRINT " ONE OTHER BIT OF INFORMATION; AT 33010 IS THE ASCII VALUE FOR 605 PRINT " WHICH DISK DRIVE IS THE DEFAULT DRIVE (0 OR 1). BY POKING THE 610 PRINT :PRINT " PROPER ASCII VALUE THERE, YOU CAN CHANGE THE DEVICE WITHOUT 615 PRINT :PRINT " HAVING FCS ECHO THE CHANGE, OR YOU CAN CHECK FROM A PROGRAM TO 620 PRINT :PRINT TAB( 15)"TO SEE WHICH DRIVE IS THE DEFAULT. 625 GOSUB 1165:PLOT 3,0,7 630 PRINT TAB( 4)"WELL, THIS SHOULD BE ENOUGH TO KEEP YOU BUSY FOR A LITTLE 635 PRINT :PRINT " WHILE, SO WE'LL STOP AND LET YOU DO SOME ON YOUR OWN. HERE ARE 640 PRINT :PRINT " THE LOCATIONS THAT HAVE BEEN DISCUSSED SO FAR; YOU MAY WANT TO 645 PRINT :PRINT " WRITE THEM DOWN, BUT SINCE THIS IS ALL ABOUT PROGRAMMING, TRY 650 PRINT :PRINT " USING REM STATEMENTS. AFTER ALL, BE PRACTICAL. 655 PRINT " FPB 33016-33035":PRINT " DIRECTORY BUFFER 33055-33181":PRINT " DEFAULT UNIT (DRIVE) 33010 660 POKE ADR+ 44,2:POKE ADR+ 45,2:GOTO 1120 665 PLOT 6,2,12,29,3,4,3 670 PRINT "BASIC'S MAIN INTEREST AS FAR AS KEY MEMORY LOCATIONS ARE 675 PRINT :PRINT " CONCERNED LIES MAINLY IN WHERE EVERYTHING ELSE IS. SINCE IT 680 PRINT :PRINT "UTILIZES FCS AND THE GRAPHICS SOFTWARE, IT KEEPS POINTERS TO ITS 685 PRINT TAB( 4)"OWN CRITICAL AREAS. HERE ARE THE LOCATIONS OF MOST USE: 690 PRINT TAB( 14)"END OF BASIC RAM 32940-32941 695 PRINT TAB( 14)"CURRENT LINE NUMBER 32972-32973 700 PRINT TAB( 14)"BASIC'S STACK POINTER 32978-32979 705 PRINT TAB( 14)"START OF SOURCE 32980-32981 710 PRINT TAB( 14)"START OF VARIABLES 32982-32983 715 PRINT TAB( 14)"START OF ARRAYS 32984-32985 720 PRINT TAB( 14)"END OF ARRAYS 32986-32987 725 PLOT 6,6,2:PRINT "6<0xF2> a6aUU7";:PLOT 255:PRINT 730 PRINT "OF THESE LOCATIONS, THE MOST FREQUENTLY USED IS THE END OF BASIC" 735 PRINT " RAM POINTER. CHANGING IT TO POINT TO A LOWER AREA OF MEMORY SO" 740 PRINT :PRINT "A MACHINE-LANGUAGE PATCH COULD BE USED WAS SHOWN IN TUTORIAL 11." 745 PRINT " FROM THESE OTHER LOCATIONS, YOU CAN FIND OUT MORE ABOUT YOUR" 750 PRINT :PRINT TAB( 14)"BASIC PROGRAM, EVEN DURING RUNTIME." 755 GOSUB 1165 760 PLOT 3,3,9:PRINT "IN GRAPHICS (CRT) RAM, THERE ARE QUITE A FEW LOCATIONS USED 765 PRINT :PRINT " TO KEEP UP WITH EVERYTHING THAT THE SCREEN IS DOING. BEFORE WE 770 PRINT :PRINT " GET INTO THE ACTUAL GRAPHIC LOCATIONS, LET'S DISCUSS THREE 775 PRINT :PRINT "ROUTINES THAT RESIDE IN CRT RAM THAT DON'T ACTUALLY DO GRAPHICS. 780 GOSUB 1165:PLOT 3,2,7 785 PRINT "THE FIRST IS THE REAL TIME CLOCK. IT IS LOCATED IN MEMORY AT 790 PRINT :PRINT " 33209-33211. IT IS UPDATED AUTOMATICALLY, ACCURATE TO 795 PRINT :PRINT " WITHIN A FEW SECONDS A DAY AND IS GUARANTEED TO RUN 800 PRINT :PRINT TAB( 15)"FOR THE LIFE OF YOUR COMPUCOLOR II. 805 PRINT " (THE ROUTINE THAT DISPLAYS THE CLOCK IS LOCATED 810 PRINT TAB( 11)"FROM LINES 1125 TO 1160 IN THIS PROGRAM.) 815 PRINT :PRINT "NOTE THAT THE CLOCK USES 60 HZ, BUT CAN BE ADJUSTED TO WORK WITH 820 PRINT TAB( 25)"50 HZ AS WELL. 825 PRINT " HIT RETURN TO CONTINUE: "; 830 PLOT 6,7,2:PRINT "7O<0xF2> HOHX7X7O";:PLOT 255,6,56 835 POKE 33278,0:GOSUB 1125:PLOT 6,2,12 840 PLOT 3,3,6:PRINT "THE OTHER LOCATION IS USED BY THE SYSTEM TO STORE THE ASCII 845 PRINT :PRINT " VALUE OF A KEY WHEN IT IS HIT. 33278 IS THE KEYBOARD CHARACTER 850 PRINT :PRINT " LOCATION. IT CAN BE USED IN REAL TIME APPLICATIONS WHERE YOU 855 PRINT :PRINT "DON'T WANT YOUR PROGRAM TO WAIT AT AN INPUT BUT DO WANT TO KNOW 860 PRINT :PRINT "WHEN A KEY HAS BEEN STRUCK. NOTE THAT WHEN A KEY IS STRUCK, THE 865 PRINT :PRINT " VALUE WILL REMAIN IN 33278 UNTIL ANOTHER KEY IS STRUCK, SO IF 870 PRINT :PRINT " YOU PEEK HERE FOR A CHARACTER YOU WILL NEED TO RESET THE VALUE 875 PRINT :PRINT " TO 0, AND ONLY LOOK FOR VALUES GREATER THAN 0. 880 GOSUB 1165 885 PLOT 3,2:PRINT " NOW FOR THE CRT RAM LOCATIONS. HERE IS A LIST OF WHAT THEY 890 PRINT TAB( 9)"ARE, WHAT THEY DO, AND WHERE THEY ARE LOCATED. 895 PRINT :PRINT " NAME FUNCTION ADDRESS(ES)":PRINT 900 PRINT "VISIBLE CURSOR LOCATION X AND Y COORDINATES OF 33227-33228 905 PRINT " CURSOR (0-31 AND 0-63) 910 PRINT "# ROLLED LINES NUMBER OF LINES THAT TOP 33229 915 PRINT " OF SCREEN HAS SCROLLED 920 PRINT "VISIBLE CURSOR CCI STATUS OF A7 AND COLOR 33230-33231 925 PRINT " FOR VISIBLE CURSOR 930 PRINT "BLIND CURSOR CCI STATUS OF A7 AND COLOR 33232-33233 935 PRINT " FOR BLIND CURSOR 940 PRINT "VISIBLE CURSOR ADDRESS MEMORY LOCATION OF 33234-33235 945 PRINT " VISIBLE CURSOR 950 PRINT "BLIND CURSOR ADDRESS MEMORY LOCATION OF BLIND 33236-33237 955 PRINT " CURSOR 960 PRINT "CURRENT PLOT SUBMODE 255 MINUS SUBMODE VALUE 33242 965 PRINT " ROLL FLAG MODE OF SCREEN (1 IF 33244 970 PRINT " SCROLL, 0 IF PAGE) 975 PRINT "DUPLEX FLAG 255=FULL,1=HALF,0=LOCAL 33245 980 PRINT " BAUD RATE SETTING SEE APPENDIX G.2, 33250 985 PRINT " PARAGRAPH 2.2.6 990 PRINT "FLAG MODE STATUS OF FLAG FOR BG/FG 33254 995 PRINT " (1 FOR ON, 0 FOR OFF) 1000 PRINT "TERMINAL OUTPUT # CHARACTERS OUTPUT IN 33289 1005 PRINT " BASIC BEFORE CR/LF 1010 GOSUB 1165 1015 PLOT 3,3,6:PRINT "NOW THAT YOU KNOW THESE LOCATIONS, YOU MAY ASK "Q$"WHAT CAN I 1020 PRINT :PRINT " DO WITH THEM?"Q$". THIS IS A LEGITIMATE QUESTION. WELL, WITH THEM 1025 PRINT :PRINT "YOU CAN SPEED UP YOUR GRAPHICS AND LET YOUR PROGRAM BE AWARE OF 1030 PRINT :PRINT " WHAT IS ACTUALLY HAPPENING WITH THE SCREEN. SOME EXAMPLES: 1035 PRINT :PRINT " 1) CHANGE COLOR AND FLAG STATUS WHILE IN THE POINT PLOT MODE. 1040 PRINT " 2) EXAMINE THE STATUS OF THE GRAPHICS AND RESET ANY IMPROPER 1045 PRINT TAB( 4)"VALUES (SUCH AS CAUSED BY USER ERROR). 1050 PRINT " 3) YOUR PROGRAM CAN FIND VISIBLE AND BLIND CURSOR LOCATIONS, 1055 PRINT TAB( 4)"SAVE THEM, GO DO SOME OTHER GRAPHICS, AND RETURN THE CURSOR 1060 PRINT TAB( 4)"TO ITS PREVIOUS LOCATION AND CONTINUE. 1065 PRINT " 4) UNSCROLL THE SCREEN WITHOUT ERASING IT (POKE 0 AT 33229). 1070 PRINT " 5) ANYTHING ELSE YOU CAN THINK OF. 1075 GOSUB 1165 1080 PRINT " THIS CONCLUDES TUTORIAL TWELVE. DO YOU WISH TO REVIEW THIS 1085 INPUT " LESSON (YES/NO)? ";ZZ$:IF LEFT$ (ZZ$,1)= "Y"THEN 145:REM 1090 IF LEFT$ (ZZ$,1)< > "N"THEN PLOT 28,11:GOTO 1085 1095 PRINT :PRINT "FEEL FREE TO TRY SOME OF WHAT HAS BEEN DISCUSSED IN THIS LESSON 1100 PRINT " (SINCE OBVIOUSLY I CAN'T STOP YOU [SHORT OF LOCKING OUT THE 1105 PRINT " KEYBOARD...]) AND WHEN YOU'RE READY FOR TUTORIAL THIRTEEN HIT 1110 PRINT TAB( 24)"AUTO AS USUAL. 1115 POKE ADR+ 41,3:POKE ADR+ 42,3:POKE ADR+ 44,0:POKE ADR+ 45,0:PLOT 27,11 1120 POKE 33434,0:POKE 33435,0:END 1125 PLOT 14:A= PEEK (C):B= PEEK (C+ 1) 1130 FOR X= 33209TO 33211:A(X- 33209)= PEEK (X):NEXT 1135 IF A(0)= STHEN 1155 1140 S= A(0):PLOT 3,28,11:FOR X= 2TO 0STEP - 1 1145 PRINT RIGHT$ ("00"+ MID$ (STR$ (A(X)),2),2);:IF XTHEN PRINT ":"; 1150 NEXT :PRINT :PLOT 3,A,B 1155 IF PEEK (33278)= 13THEN PLOT 15:RETURN 1160 GOTO 1130 1165 PRINT :INPUT " HIT RETURN TO CONTINUE: ";ZZ$:PLOT 12 1170 IF ZZ$= "MENU"THEN LOAD ZZ$:RUN 170 1175 IF PEEK (33278)< > 1THEN RETURN 1180 PLOT 1