Listing of file='TTRL11.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> 65484THEN PLOT 1 120 A2= 256* PEEK (ADR+ 50)+ PEEK (ADR+ 49):IF A2< > ADRTHEN PLOT 1 125 POKE ADR+ 41,1:POKE ADR+ 42,1 130 LN= PEEK (ADR+ 44):IF LN< > PEEK (ADR+ 45)OR LN= 0THEN 140 135 ON LNGOTO 145,525 140 POKE ADR+ 44,1:POKE ADR+ 45,1 145 PLOT 6,0,12,3,10,2:PRINT " BASIC STATEMENTS FOR MACHINE INTERFACING 150 PRINT :PRINT " FOR THE MOST PART, BASIC PROGRAMS MIND THEIR OWN BUSINESS 155 PRINT :PRINT " AS FAR AS CONTACT WITH THE OUTSIDE WORLD GOES. HOW TRULY 160 PRINT :PRINT "MAGNIFICENT IS THE PROGRAM THAT USES FILES AND INPUT STATEMENTS 165 PRINT :PRINT "FOR GETTING A REAL JOB DONE! BUT THERE ARE THOSE FEW PROGRAMMERS 170 PRINT " NOT AFRAID TO TAKE THE CHALLENGE OF FINDING OUT WHAT IS GOING 175 PRINT :PRINT "ON IN THE REST OF THE WORLD: FOR THEM, IT IS TIME TO DISCUSS THE 180 PRINT TAB( 9)"BASIC STATEMENTS THAT "CHR$ (34)"LOOK"CHR$ (34)" OUTSIDE OF BASIC. 185 PRINT :PRINT TAB( 5)"THESE INCLUDE OUT AND INP, WHICH USE THE PORTS ON THE 190 PRINT :PRINT TAB( 5)"COMPUCOLOR LOGIC BOARD. THE CALL FUNCTION, WHICH ALLOWS 195 PRINT :PRINT " BASIC TO USE MACHINE-LANGUAGE SUBROUTINES, WILL BE DISCUSSED. 200 PRINT :PRINT " IN ADDITION, HOW TO VIEW AND CHANGE MEMORY CONTENTS WILL BE 205 PRINT :PRINT TAB( 10)"SHOWN WITH THE PEEK AND POKE STATEMENTS. 210 GOSUB 1145 215 PLOT 3,6,10:PRINT "THE INP AND OUT STATEMENTS ARE USED TO READ AND WRITE 220 PRINT :PRINT " VALUES TO THE PORTS OF THE CCII. PORTS ARE MOST EASILY DEFINED 225 PRINT :PRINT "AS HARDWARE DATA PATHS THAT CAN BE OBSERVED AND ADDRESSED BY THE 230 PRINT " CENTRAL PROCESSOR. NOTE THAT SOME PORTS ARE OUTPUT ONLY, AND 235 PRINT :PRINT TAB( 20)"OTHERS ARE INPUT ONLY. 240 GOSUB 1145:PLOT 3,2,6 245 PRINT "THE OUT STATEMENT IS FOR SENDING VALUES TO A PORT. IT IS USED 250 PRINT :PRINT TAB( 25)"IN THIS FORM: 255 PRINT :PRINT TAB( 27)"OUT 8,255 260 PRINT :PRINT TAB( 5)"8 IS THE PORT, AND 255 IS THE VALUE TO BE SENT TO IT. 265 PRINT :PRINT " THE VALUE THAT IS SENT TO THE PORT MUST BE 0-255, INCLUSIVE. 270 PRINT :PRINT TAB( 5)"THE PORT ASSIGNMENTS ARE LISTED IN APPENDIX D.2 OF THE 275 PRINT :PRINT " PROGRAMMING MANUAL, AND A EXPLANATION OF EACH PORT IS GIVEN IN 280 PRINT :PRINT TAB( 11)"APPENDIX G.2 UNDER TMS 5501 SPECIFICATIONS. 285 PRINT :PRINT " NOTE: SERIOUS DAMAGE CAN RESULT FROM OUTPUTTING TO THE 5027 290 PRINT :PRINT TAB( 28)"CRT CHIP. 295 GOSUB 1145:PLOT 3,3,11 300 PRINT "THE INP STATEMENT ALLOWS THE STATUS OF A PORT TO BE FOUND. 305 PRINT :PRINT TAB( 27)"Z=INP(1) 310 PRINT :PRINT " IS THE FORMAT FOR USING THE INP STATEMENT. IN THIS EXAMPLE, THE 315 PRINT TAB( 11)"STATUS OF THE PORT 1 WILL BE STORED IN Z. 320 GOSUB 1145 325 PLOT 3,3,9:PRINT "BY USING THE OUT AND INP STATEMENTS IT WILL BE POSSIBLE FOR 330 PRINT :PRINT " YOU TO DO VARIOUS OPERATIONS FROM YOUR BASIC PROGRAMS. FOR 335 PRINT :PRINT " COMPLETE INFORMATION ON WHAT EACH OF THE PORTS DOES, CHECK IN 340 PRINT :PRINT " THE PROGRAMMING MANUAL UNDER THE DESCRIPTION OF THE 5501 345 PRINT :PRINT " INPUT/OUTPUT CHIP. SOME APPLICATIONS FOR INP AND OUT WILL BE 350 PRINT :PRINT TAB( 25)"IN TUTORIAL 15. 355 GOSUB 1145 360 PLOT 3,2,5:PRINT "THERE ARE OCCASIONS WHEN INFORMATION NEEDS TO BE STORED, BUT 365 PRINT :PRINT "VARIABLES OR FILES WON'T WORK (FOR THOSE NON-BELIEVERS, DID YOU 370 PRINT :PRINT "EVER WONDER HOW THE COMPUTER KNOWS WHERE AND IN WHICH LESSON OF 375 PRINT :PRINT "BASIC LANGUAGE TO RESTART WHEN YOU HIT AUTO? THINK ABOUT IT...) 380 PRINT :PRINT " THE PEEK AND POKE STATEMENTS ARE SIMILAR TO THE INP AND OUT 385 PRINT :PRINT TAB( 3)"STATEMENTS, EXCEPT THAT INSTEAD OF WORKING WITH PORTS THEY 390 PRINT :PRINT TAB( 9)"WORK WITH MEMORY LOCATIONS. HERE IS AN EXAMPLE: 395 PRINT :PRINT " 100 FOR X=1 TO 150 : Z=PEEK(32101)":PRINT " 200 POKE 32101,Z+X AND 255 : NEXT X 400 PRINT TAB( 3)"LINE 100 ASSIGNS Z THE VALUE IN MEMORY LOCATION 32101, AND 405 PRINT :PRINT TAB( 9)"LINE 200 CHANGES THE VALUE OF 32101 TO Z+X AND 255 . 410 PRINT :INPUT " HIT RETURN TO CONTINUE: ";ZZ$:PLOT 28,11 415 PRINT TAB( 12)"THIS IS WHAT LINES 100 AND 200 DO --> C 420 FOR X= 1TO 150:Z= PEEK (32101):POKE 32101,Z+ XAND 255:NEXT X 425 GOSUB 1145 430 PLOT 3,4,6:PRINT "YOU CAN USE THE PEEK AND POKE STATEMENTS WITH ANY OF THE 435 PRINT :PRINT " 65536 MEMORY LOCATIONS, EACH OF WHICH CAN HOLD ANY NUMBER FROM 440 PRINT :PRINT " 0 TO 255. HOWEVER, BE AWARE THAT 0-24575 AND 32768-33433 ARE 445 PRINT :PRINT "USED FOR THE SYSTEM; POKES TO ROM (READ ONLY MEMORY) WILL CHANGE 450 PRINT "NOTHING, WHILE POKING TO SYSTEM RAM (RANDOM ACCESS MEMORY) CAN 455 PRINT :PRINT TAB( 6)"CAUSE LITERALLY HORRIBLE, NASTY THINGS TO HAPPEN.... 460 PRINT :PRINT TAB( 4)"HOWEVER, POKE CAN BE OUR FRIEND, TOO. WHILE YOU'VE BEEN 465 PRINT :PRINT " READING THIS, EVERY COLOR ON THE SCREEN HAS BEEN INCREASED BY 470 PRINT :PRINT TAB( 3)"ONE! POKE IS VERY HANDY, PROVIDED ONE HAS THE KNOWLEDGE OF 475 PRINT :PRINT TAB( 4)"WHERE TO POKE (A LITTLE KNOWLEDGE IS A DANGEROUS THING). 480 PRINT TAB( 19)" HIT RETURN TO CONTINUE: ";:FOR I= 28673TO 32080STEP 256 485 FOR J= 0TO 126STEP 2:POKE I+ J,PEEK (I+ J)+ 1:NEXT J,I:INPUT "";Z$:PLOT 12,3,3,9 490 PRINT "IT'S TIME TO STOP FOR A WHILE AND LET YOU TRY A LITTLE BIT 495 PRINT :PRINT "OF WHAT WE'VE GONE OVER. REMEMBER TO REFER TO THE APPENDICES OF 500 PRINT :PRINT " THE CCII PROGRAMMING MANUAL FOR INFORMATION ON PORTS AND 505 PRINT :PRINT "FOR SOME KEY MEMORY LOCATIONS (MORE KEY MEMORY LOCATIONS WILL BE 510 PRINT TAB( 20)"DISCUSSED IN TUTORIAL 12)." 515 PRINT :PRINT TAB( 14)"HIT AUTO WHEN YOU WISH TO CONTINUE. 520 POKE ADR+ 44,2:POKE ADR+ 45,2:GOTO 1140 525 PLOT 6,2,12,29,3,3,1 530 PRINT "EVEN THOUGH OUR MAIN CONCERN IS BASIC (AS THE NAME BASIC 535 PRINT :PRINT " LANGUAGE IMPLIES), THE CALL STATEMENT CANNOT BE OVERLOOKED. 540 PRINT :PRINT TAB( 3)"THE CALL STATEMENT IS USED FOR ACCESSING MACHINE-LANGUAGE 545 PRINT :PRINT TAB( 14)"ROUTINES. IT IS USED IN THIS FORM: 550 PRINT :PRINT TAB( 26)"ZZ=CALL(1) 555 PRINT :PRINT TAB( 3)"1 IS THE VALUE PASSED TO THE ROUTINE, AND THE RESULT WHEN 560 PRINT :PRINT " THE ROUTINE IS FINISHED IS STORED IN ZZ. TO LET BASIC KNOW 565 PRINT :PRINT " WHERE YOUR ROUTINE IS IN MEMORY, THE HIGH AND LOW ORDER BYTES 570 PRINT :PRINT "OF THE ADDRESS MUST BE POKED IN AT 33283 AND 33284. THE VALUE 1 575 PRINT :PRINT " FROM OUR EXAMPLE WILL BE LOADED INTO REGISTERS D AND E OF THE 580 PRINT :PRINT "8080 CPU, AND WHEN THE ROUTINE RETURNS, THE VALUES IN THE D AND 585 PRINT :PRINT " E REGISTERS ARE STORED IN ZZ. IF NONE OF THIS MAKES ANY SENSE, 590 PRINT :PRINT " DON'T WORRY; RIGHT NOW WE'RE GOING TO TAKE A LOOK AT THE NEW 595 PRINT :PRINT TAB( 4)"MENU PROGRAM ON MOST COMPUCOLOR DISKS, AND HOW IT WORKS. 600 GOSUB 1145:PLOT 3,2,3:GOSUB 605:GOTO 630 605 PRINT "60010 TM=PEEK(32940)+PEEK(32941)*256 610 PRINT " 60020 IF TM>65335 THEN 60060 615 PRINT " 60030 POKE TM+1,50 : POKE TM+3,15 620 PRINT " 60040 A=0 : FOR N=TM+176 TO TM+182 : A=A+PEEK(N) : NEXT 625 PRINT " 60050 IF A=1445 THEN 60150":RETURN 630 PRINT :PRINT " THESE ARE THE FIRST FIVE LINES OF THE CODE THAT LOADS IN THE 635 PRINT :PRINT TAB( 5)"MACHINE-LANGUAGE SUBROUTINES FOR SCROLLING, READING THE 640 PRINT :PRINT TAB( 6)"KEYBOARD, AND USING SOUNDWARE. THESE LINES DETERMINE 645 PRINT :PRINT TAB( 12)"IF THE SUBROUTINE HAS BEEN LOADED BEFORE. 650 PRINT :PRINT " BEFORE WE GO ON, LET'S DEFINE HIGH AND LOW ORDER BYTES. TO 655 PRINT :PRINT " REPRESENT NUMBERS BETWEEN 256 AND 65535, TWO BYTES ARE USED: 660 PRINT :PRINT "ONE TO REPRESENT A PARTICULAR GROUP, OR PAGE, OF 256 BYTES, (THE 665 PRINT " HIGH ORDER BYTE) THE SECOND FOR A PARTICULAR BYTE IN THAT PAGE 670 PRINT :PRINT "(THE LOW ORDER BYTE). SUCH PAIRS OF BYTES ARE USUALLY STORED IN 675 PRINT " CONSECUTIVE BYTES, THE LOW FOLLOWED BY THE HIGH.":GOSUB 1145 680 PLOT 3,2,1:GOSUB 605:PRINT TAB( 22)" LINE 60010 FINDS THE 685 PRINT :PRINT " TOP OF MEMORY BY PEEKING AT 32941 (HIGH) AND 32940 (LOW), AND 690 PRINT :PRINT TAB( 6)"COMBINES THEM. IF THIS NUMBER IS GREATER THAN 65535," 695 PRINT :PRINT " THE SUBROUTINE MUST NOT BE LOADED (SINCE THE ROUTINE IS 700 PRINT :PRINT " 200 BYTES LONG), AND IT IMMEDIATELY STARTS THE LOADING PROCESS 705 PRINT :PRINT " AT LINE 60060. OTHERWISE, THE CONTENTS OF MEMORY FROM THE END 710 PRINT :PRINT TAB( 4)"OF WHERE THE ROUTINE SHOULD BE ARE TOTALED. IF THE RESULT 715 PRINT :PRINT " COMPARES WITH WHAT MEMORY SHOULD CONTAIN IF THE ROUTINE IS 720 PRINT :PRINT " LOADED, THE ROUTINE IS NOT LOADED AGAIN, AND THE PROGRAM GOES 725 PRINT :PRINT TAB( 24)"TO LINE 60150. 730 GOSUB 1145:PLOT 3,1,4 735 PRINT "60060 AD=32940 : TM=TM-200 : DA=TM : GOSUB 60160 : CLEAR 100 740 PRINT " 60070 TM=PEEK(32940)+PEEK(32941)*256 745 PRINT " 60080 RESTORE 60190 750 PRINT " 60090 FOR N=1 TO 200 : READ A 755 PRINT " 60095 IF A>255 THEN N=220 : GOTO 60140 760 PRINT " 60100 IF A<0 THEN DA=TM-A : AD=TM+N : GOSUB 60160 : GOTO 60140 765 PRINT " 60110 POKE TM+N,A 770 PRINT " 60140 NEXT 775 PRINT " 60150 AD=33283 : DA=TM+8 : GOSUB 60160 : GOTO 120 780 PRINT " 60160 Z1=INT(DA/256) : Z2=DA-Z1*256 785 PRINT " 60170 POKE AD,Z2 : N=N+1 : POKE AD+1,Z1 : RETURN":IF ZTHEN RETURN 790 PRINT :PRINT " THIS SECTION OF CODE LOADS THE MACHINE-LANGUAGE SUBROUTINES. 795 PRINT :PRINT " LINE 60060 MOVES THE TOP OF MEMORY DOWN 200 BYTES, SO BASIC 800 PRINT :PRINT "WON'T INTERFERE WITH IT, AND GOSUBS TO 60160 TO POKE THE VALUES 805 PRINT :PRINT " IN (VALUE TO BE POKED IS DA, MEMORY LOCATION IS AD; Z1 AND Z2 810 PRINT :PRINT " ARE HIGH AND LOW VALUES). A CLEAR RESETS BASIC'S POINTERS AND 815 PRINT :PRINT TAB( 4)"CLEARS STRING SPACE, AND THE NEW TOP OF MEMORY IS FOUND. 820 GOSUB 1145:PLOT 3,1,1:Z= - 1:GOSUB 735 825 PRINT :PRINT " NEXT THE ACTUAL DATA IS LOADED. THE VALUE A IS READ IN 60090, 830 PRINT :PRINT TAB( 6)"AND IF IT IS GREATER THAN 255, THEN THERE IS NO MORE 835 PRINT :PRINT " DATA. IF A IS LESS THAN 0, THEN AN ABSOLUTE MEMORY ADDRESS IS 840 PRINT :PRINT TAB( 5)"DETERMINED AND POKED IN AT 60160. OTHERWISE, THE VALUE 845 PRINT :PRINT TAB( 22)"IS SIMPLY POKED IN. 850 PRINT :PRINT "LINE 60150 POKES IN THE JUMP INSTRUCTION FOR THE CALL STATEMENT 855 PRINT :PRINT " AT THE PROPER LOCATION, AND GOES BACK TO LINE 120. NOTE THAT A 860 PRINT :PRINT "GOSUB CANNOT BE DONE TO USE THIS ROUTINE, AS THE CLEAR STATEMENT 865 PRINT TAB( 19)"IN LINE 60060 WIPES IT OUT. 870 GOSUB 1145 875 PLOT 3,1,5:PRINT "60290 DATA 254,2,194,-182,245,229,197,205,36,0,194,-166 880 PRINT " 60300 DATA 95,175,87,50,255,129,193,225,241,201,201 885 PRINT " 60310 DATA 300 890 PRINT :PRINT " THESE ARE THE LAST THREE LINES OF THE MACHINE-LANGUAGE DATA. 895 PRINT :PRINT " BECAUSE THE MACHINE-LANGUAGE PROGRAM IS LOADED AT NO DEFINITE 900 PRINT :PRINT "PLACE IN MEMORY, AND BECAUSE IT HAS HAS INSTRUCTIONS THAT REFER 905 PRINT :PRINT " TO OTHER MEMORY LOCATIONS THAT ALSO ARE IN NO DEFINITE PLACE, 910 PRINT :PRINT " NEGATIVE NUMBERS ARE USED TO TELL THE COMPUTER THAT IT MUST 915 PRINT :PRINT TAB( 4)"COMPUTE THE MEMORY LOCATION. BECAUSE LINE 60310'S DATA IS 920 PRINT :PRINT "IS GREATER THAN 255, THE COMPUTER WILL RECOGNIZE THIS AS THE END 925 PRINT " OF DATA. NOW THAT YOU KNOW HOW THE DATA IS LOADED, LET'S SEE 930 PRINT :PRINT TAB( 13)"HOW THE CALL STATEMENT USES THIS SUBROUTINE. 935 GOSUB 1145 940 PLOT 3,1,7:PRINT "100 TM=256*PEEK(32941)+PEEK(32940) 945 PRINT " 110 Z=TM+8 : AD=33283 : GOSUB 160 : TM=TM+1 950 PRINT " 120 X=0 : Y=26 : H=6 : W=63 : C=1 955 PRINT " 130 Z=28672+128*Y+X+X : AD=TM+126 : GOSUB 160 960 PRINT " 140 Z=128-W-W : AD=TM+149 : GOSUB 160 : POKE TM+129,H-1 965 PRINT " 150 POKE TM+131,W*(C+1) : POKE TM+143,35*(C-1) : GOTO 1000 970 PRINT " 160 ZZ=INT(Z/256) : POKE AD,Z-256*ZZ : POKE AD+1,ZZ : RETURN 975 PRINT :PRINT " THESE LINES ARE TAKEN FROM A PROGRAM THAT USES THE SCROLLING 980 PRINT :PRINT " PATCH. THEY ARE SHOWN SIMPLY AS A REMINDER THAT THEY MUST BE 985 PRINT :PRINT " INCLUDED IN THE PROGRAM (THEY LOCATE THE ASSEMBLY ROUTINE, SO 990 PRINT :PRINT TAB( 10)"THEIR ABSENCE COULD SAFELY BE CALLED A BUG). 995 GOSUB 1145:PLOT 3,1,7 1000 PRINT "200 L=L+1 : IF L=32 THEN ZZ=CALL(1) : L=31 1005 PRINT " 210 GOSUB 220 : PRINT SPC(63)"Q$;Q$ 1010 PRINT " 220 PLOT 3,0,L : RETURN 1015 PRINT :PRINT " WHEN AN ITEM IS PRINTED IN THE SCROLLING AREA, THIS ROUTINE IS 1020 PRINT :PRINT " CALLED. L STANDS FOR THE LINE OF THE SCREEN THAT IS CURRENTLY 1025 PRINT :PRINT TAB( 4)"BEING PRINTED ON. WHEN IT IS GREATER THAN 32, THE CALL IS 1030 PRINT :PRINT TAB( 4)"EXECUTED. L IS THEN SET TO 31 AGAIN, SO THAT L WILL EQUAL 1035 PRINT :PRINT " 32 THE NEXT TIME. LINES 210 AND 220 MOVE THE CURSOR TO THE NEW 1040 PRINT :PRINT " LINE, ERASE WHATEVER MAY BE ON THE LINE, AND REPOSITION THE 1045 PRINT :PRINT TAB( 19)"CURSOR THERE ONCE AGAIN. 1050 GOSUB 1145 1055 PLOT 3,3,7:PRINT "THE ARGUMENTS FOR THE THREE ROUTINES ARE 0 FOR SOUNDWARE, 1060 PRINT :PRINT " 1 FOR THE SCROLLING PATCH, AND 2 FOR THE NO-ECHO KEY PATCH. 1065 PRINT :PRINT "OF THE THREE SUBROUTINES, ONLY THE NO-ECHO KEY PATCH WILL RETURN 1070 PRINT " A VALID RESULT, AS THE OTHER TWO ROUTINES HAVE NO REASON TO 1075 PRINT :PRINT TAB( 18)"RETURN A VALUE TO THE USER. 1080 PRINT :PRINT " ALL THE MACHINE-LANGUAGE ROUTINE DOES IS TAKE THE ARGUMENT 1085 PRINT :PRINT "AND GO TO EACH ROUTINE WITHIN THE SUBROUTINE, COMPARE THE VALUE 1090 PRINT :PRINT " THAT IS USED TO CALL THE ROUTINE WITH THE ARGUMENT, AND IF THE 1095 PRINT :PRINT TAB( 12)"TWO ARE EQUAL, THE ROUTINE IS PERFORMED. 1100 GOSUB 1145 1105 PRINT " THIS CONCLUDES TUTORIAL ELEVEN. DO YOU WISH TO REVIEW THIS 1110 INPUT " LESSON (YES/NO)? ";ZZ$:IF LEFT$ (ZZ$,1)= "Y"THEN 145:REM 1115 PLOT 6,2:IF LEFT$ (ZZ$,1)< > "N"THEN PLOT 28,11:GOTO 1110 1120 PRINT :PRINT "FEEL FREE TO TRY SOME OF WHAT HAS BEEN DISCUSSED IN THIS LESSON 1125 PRINT " (SINCE OBVIOUSLY I CAN'T STOP YOU), AND WHEN YOU'RE READY FOR 1130 PRINT " TUTORIAL TWELVE, JUST HIT AUTO. 1135 POKE ADR+ 41,2:POKE ADR+ 42,2:POKE ADR+ 44,0:POKE ADR+ 45,0:PLOT 27,11 1140 POKE 33434,0:POKE 33435,0:END 1145 PRINT :INPUT " HIT RETURN TO CONTINUE: ";ZZ$:PLOT 12 1150 IF ZZ$= "MENU"THEN LOAD ZZ$:RUN 170 1155 IF PEEK (33278)< > 1THEN RETURN 1160 PLOT 1