GET: A String Input Routine

Here is the 2nd-prize winner in the TS1000 category of our DISPLAY CONTEST. Interestingly, we received THREE separate programs that performed a similar function, and choosing between them was a real challenge. GET took the prize for its relocatability, flexibility, and internal documentation.

Use HOT Z or your favorite hex-loader to enter the 295 machine-code bytes into a 1 REM statement. Then add the BASIC listing and save it to tape. You will have a completely self-documenting program on the use of GET.

To INPUT numbers, first GET the number into G$, then use VAL to change it into floating-point form. To allow decimal points, make the line following the USR GET a “REM .-9”.

The original program required the first six bytes in the first REM statement for its internal variables. We took the liberty of moving these variables into the printer buffer area, making the GET code usable even if you have other machine-code in the 1 REM area (starting at 16514). This buffer is cleared before being used for printer operations, so the change should in no way affect your hard-copy.

GET also uses the “unused” system variables at 16417 and 16507/16508. This latter one is also used by the Aerco disk system, so if you’re using the program with the disk you should change references to VARS (407B) to 4042 (also in the printer buffer). GET to it!

“GET” Machine Code

Enter each number from left to right starting with the top line. Ex: 0, 0, 0, 0, 0, 0, 42, 16, etc.

000 000 000 000 000 000 042 016 064 062 128 190
200 062 076 190 040 036 203 110 040 024 203 126
040 014 203 118 040 005 017 018 000 024 008 035
203 126 040 251 017 006 000 025 024 219 035 094
035 086 035 025 024 211 035 094 035 086 229 025
034 123 064 225 035 034 060 064 033 000 000 034
062 064 062 000 050 064 064 033 065 064 054 000
033 033 064 203 198 042 062 064 017 001 000 025
034 062 064 048 007 058 064 064 060 050 064 064
042 014 064 058 062 064 203 119 032 004 054 056
024 002 054 128 205 187 002 068 077 093 033 033
064 203 070 040 007 028 032 205 203 134 024 201
028 040 198 205 189 007 126 254 119 032 035 033
065 064 062 000 190 040 177 053 042 014 064 054
000 043 062 118 190 032 001 043 034 014 064 042
060 064 043 054 000 034 060 064 024 150 254 118
032 007 042 014 064 054 000 024 087 095 042 041
064 035 035 070 005 035 035 035 016 002 024 228
086 123 186 040 029 035 016 002 024 218 062 022
190 040 006 062 026 190 192 024 230 035 016 002
024 202 126 187 056 231 122 187 048 227 033 065
064 052 042 014 064 115 035 245 062 118 190 032
001 035 034 014 064 042 060 064 241 115 035 034
060 064 043 237 075 123 064 175 237 066 032 156
006 000 033 065 064 078 201
   2 REM GET BY SHAWN BYRNE 1983
3 LET GET=16520
4 LET A$="ENTER CONT TO CONTINUE, STOP TO STOP "
90 GOTO 1000
100 PRINT AT 20,0;A$
110 LET G$=" "
120 PRINT AT 21,12;
130 LET N$=G$( TO USR GET)
140 REM C,N,O,P,S,T
150 IF N$="" THEN GOTO 110
160 IF N$="STOP" THEN STOP
170 IF N$<>"CONT" THEN GOTO 110
180 CLS
190 RETURN
1000 SLOW
1010 PRINT " *** GET *** BY SHAWN BYRNE 1983"
1020 PRINT
1030 PRINT " GET IS A MACHINE LANGUAGE SUB- ROUTINE, 289 BYTES LONG, WHICH CAN BE USED TO GET A USER INPUT."
1040 PRINT "THIS VERSION OF GET USES PRINTERBUFFER FOR ITS VARIABLES + AL3016507/16508 AND 16417. THE SUB-ROUTINE ITSELF IS RELOCATABLE AND CAN RESIDE ABOVE RAMTOP,IN AREM STATEMENT OR BETWEEN A BASICPROGRAM AND THE DISPLAY FILE."
1050 PRINT
1060 PRINT "IF GET IS USED IN A 1 REM STATE-MENT, POKE 16419,2 SO THE BASIC (STARTING AT LINE 2) CAN BE DIS-PLAYED. DO NOT LIST; USE LIST 2."
1070 GOSUB 100
1080 PRINT "BEFORE GET IS CALLED FROM WITH-IN A BASIC PROGRAM,ITS STARTINGLOCATION MUST BE DEFINED:"
1090 PRINT
1100 PRINT "EXAMPLE: 10 LET GET=16520"
1110 GOSUB 100
1120 PRINT "THE FUNCTION ""USR GET"" WILL RE- TURN THE LENGTH OF THE RESPONSE.THE STRING G$ MUST BE DEFINED (A STRING OF SPACES) BEFORE GET IS CALLED AND THE LENGTH OF THE RESPONSE IS LIMITED BY THE"
1130 PRINT "LENGTH OF G$. THE RESPONSE IS RETURNED IN G$."
1140 PRINT
1150 PRINT "THE RESPONSE IS INPUT ON THE SCREEN WHEREVER THE PRINT"
1160 PRINT "POSITION IS LOCATED. THE DELETE KEY WILL WORK. EXIT FROM GET IS PERFORMED WHEN ENTER IS PRESSED OR THE LENGTH OF THE INPUT = G$."
1170 GOSUB 100
1180 PRINT "IF THE RESPONSE IS NOT NEEDED ONTHE SCREEN, THE PRINT POSITION CAN BE MOVED OFFSCREEN BY:"
1190 PRINT
1200 PRINT TAB 8;"POKE 16399,0"
1210 PRINT
1220 PRINT "OTHERWISE, THE RESPONSE CAN BE POSITIONED ON THE SCREEN BY:"
1230 PRINT
1240 PRINT TAB 5;"PRINT AT (LINE),(COL.);"
1250 PRINT
1260 PRINT "BEFORE THE ROUTINE IS CALLED."
1270 GOSUB 100
1280 PRINT "IMMEDIATELY FOLLOWING THE LINE NUMBER IN WHICH GET IS CALLED,"
1290 PRINT "THERE MUST BE A REM LINE WHICH SPECIFIES THE CHARACTER(S) WHICHARE TO BE USED IN THE RESPONSE. CHARACTERS MUST BE SEPARATED BY A COMMA OR A HYPHEN."
1300 PRINT
1310 PRINT "EXAMPLE 1: REM 0-9"
1320 PRINT
1330 PRINT "WILL GIVE A RESPONSE TO ALL THE NUMBERS FROM 0 THROUGH 9."
1340 PRINT
1350 PRINT "EXAMPLE 2: REM 2,7,C,R"
1360 PRINT
1370 PRINT "WILL GIVE A RESPONSE ONLY TO THOSE CHARACTERS."
1380 GOSUB 100
1390 PRINT "EXAMPLE 3: REM A-F"
1400 PRINT
1410 PRINT "WILL GIVE A RESPONSE ONLY TO THELETTERS A THROUGH F."
1420 PRINT
1430 PRINT "EXAMPLE 4: REM 0-Z"
1440 PRINT
1450 PRINT "WILL GIVE A RESPONSE TO ALL THE NUMBERS (0 THROUGH 9) AND TO ALLTHE LETTERS (A THROUGH Z)."
1460 GOSUB 100
1470 PRINT "GET HAS A COUNTER WHICH CAN BE USED AS A TIMER. AFTER GET HAS EXECUTED, THIS COUNTER VALUE CANBE FOUND BY:"
1480 PRINT
1490 PRINT "PEEK 16446+256*PEEK 16447+65536 *PEEK 16448"
1500 PRINT
1510 PRINT "A GET EXECUTION TIME OF 1 MINUTEWILL RESULT IN A COUNT OF ABOUT 26,770."
1520 PRINT
1530 PRINT "THE EXACT COUNT WILL VARY WITH EACH COMPUTER AND WILL HAVE TO BE DETERMINED BY EXPERIMENTING."
1540 GOSUB 100
1550 PRINT "EXAMPLE OF GET COUNTER:"
1560 PRINT
1570 PRINT "PLEASE PRESS THE ""Q"" KEY."
1580 LET G$=" "
1590 PRINT AT 5,15;
1600 RAND USR GET
1610 REM Q
1620 PRINT
1630 LET N=INT ((PEEK 16446+256*PEEK 16447+65536*PEEK 16448)/446.1667)
1640 PRINT
1650 PRINT TAB 6;"YOUR RESPONSE TIME WAS "
1660 PRINT
1670 PRINT TAB 10;N;" SECONDS."
1680 GOSUB 100
1690 POKE GET+113,CODE "S"
1700 PRINT "THE FLASHING CURSER USED ON THE SCREEN CAN BE ANY CHARACTER. FOR EXAMPLE, FOR A FLASHING ""S"":"
1710 PRINT
1720 PRINT "POKE GET+113,CODE ""S"""
1730 PRINT
1740 PRINT "TO RETURN TO THE FLASHING SPACE:"
1750 PRINT
1760 PRINT "POKE GET+113,0"
1770 GOSUB 100
1780 POKE GET+113,0
1790 PRINT "GET WILL NOT ACCEPT A CHARACTER UNTIL AFTER IT HAS RECIEVED THE SIGNAL THAT NO KEY IS BEING PRESSED,SO UPON ENTERING GET,IF A KEY IS BEING PRESSED, IT WILL NOT BE ACCEPTED UNTIL THE FINGERIS LIFTED AND A KEY PRESSED AGAIN."
1800 PRINT "THIS PREVENTS A CHARACTER FROM BEING REPEATED RAPIDLY."
1810 PRINT "TO ALLOW A CHARACTER TO BE AC- CEPTED ON ENTERING GET WHEN IT IS ALREADY BEING PRESSED:"
1820 PRINT
1830 PRINT TAB 4;"POKE GET+129,24"
1840 PRINT
1850 PRINT "TO RETURN TO NORMAL:"
1860 PRINT
1870 PRINT TAB 4;"POKE GET+129,40"
1880 GOSUB 100
1890 PRINT "AN EXAMPLE OF A BASIC LISTING TOUSE GET IS:"
1900 PRINT
1910 PRINT "10 LET GET=16520"
1920 PRINT "100 LET G$="" """
1930 PRINT "110 PRINT AT 10,15;"
1940 PRINT "120 LET N$=G$( TO USR GET)"
1950 PRINT "130 REM N,Y"
1960 PRINT "140 IF N$="""" THEN GOTO 100"
1970 PRINT "150 IF N$=""N"" THEN GOTO 1000"
1980 PRINT "160 IF N$=""Y"" THEN GOSUB 60"
1990 PRINT
2000 PRINT "LINE 140 PREVENTS A RESPONSE TO ENTER."
2010 PRINT "LINES 150 AND 160 DETERMINE THE RESPONSE ACTION."
2020 GOSUB 100
2030 PRINT "GET CAN BE USED AS MANY TIMES INA BASIC PROGRAM AS NEEDED. EACH TIME IT IS USED THE LENGTH OF THE RESPONSE AND THE CHARACTERS CAN BE REDEFINED IN BASIC."
2040 PRINT
2050 PRINT AT 10,10;"SHAWN A. BYRNE"
2060 PRINT TAB 10;"[address omitted]"
2070 PRINT TAB 10;"[address omitted]"
2080 PRINT TAB 20;"[address omitted]"
2090 PRINT
2100 PRINT TAB 10;"[phone number omitted]"
2110 GOSUB 100
2120 RUN
9997 STOP
9998 SAVE "GET"
9999 RUN

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.