Compucolor.org – Virtual Media

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