Compucolor.org – Virtual Media

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