<<

SOFTWARE SECTION DEVELOPMENT SOFTWARE

DR. WANG'S PALO ALTO TINY BASIC

By Roger Rauskolb

Tiny Basic was first proposed in Dr. Dobb's Journal. Variables Li-Chen Wang's version of Palo Alto Tiny Basic There are 26 variables denoted by letters A through originally appeared in Issue No.5, May 1976 of Dr. Z. There is also a single array @(1). The dimension of Dobb's Journal. A complete listing was printed, but Dr. this array (i.e., the range of value of the index 1) is set Wang did the assembly on an IBM and he automatically to make use of all the memory space defined different mnemonics. In order to assemble that is left unused by the program. (i.e., 0 through with an Intel Compatible Assembler a translation of SIZE/2, see SIZE function below.) most mnemonics had to be performed. I had developed my own system, which consists of two small p.. boards, one containing the 8080 CPU, Functions 4k of 2708 type EROM and 1 K of RAM. The other For the time being, there are only 3 functions: PCB contained the RS-232 Interface using the Intel ABS(X) gives the absolute value of X. 8251. So I wanted to change the 1/0 section. RND(X) gives a random number between 1 and X If you want to change 1/0, all routines are contained (inclusive). in the OUTC and CH Kia routines. My system uses the SIZE gives the number of bytes left unused by the following configuration: program. 2708 EROMS OOOOH TO 07FFH 1k OF RAM 1000H TO 13FFH Arithmetic and Compare Operators 8251 DATA PORT OFAH 82-51 STATUS PORT I divide. Note that since we have integers only, 2/3=0. 27H = 2 stop bits parity disabled. Command * multiply. Instruction 8 bit characters. Baud Rate Factor of 04. - subtract. + add. Mode OCFH = No Hunt Mode. Not (RTS) forced Instruction to O. Receive Enabled Data Ter­ > compare if greater than. minal Ready Transmit Enabled. < compare if less than. Transmitter Ready Status£it = Bit 0 (01 H) = compare if equal to. Note than to certain ver­ Receiver ..Buffer Ready Status. Bit = Bit 1 (02H) sions of Basic "LET A==O" means "set both A and B to 0". To this version of Tiny Basic, it The program is contained in locations OOOOH to means "set A to the result of comparing B with 0768H. 0". In 1 K of RAM 847 bytes are left over for program. # compare if not equal to. Tiny Basic does not offer much in terms of functions > = compare if greater than or equal to. and general mathematical capabilities. But it is great to teach programming to children (and adults) and < = compare if less than or equal to. for games, since it has the RN 0 function. It takes up +, -, *, and I operations result in a value of between little memory space and executes a lot faster than -32767 and 32767. All compare operators result in a other basics. 1 if true and a 0 if not true. Dr. Wang was very helpful and assisted me all the way. Some errors were eliminated. I appreciate his Expressions help and he deserves a lot of credit for his implemen­ Expressions are formed with numbers, variables, tation of Tiny Basic. and functions with arithmetic and compare operators See Microcomputer Software Depository Program between them. and - signs can also be used at the Index for Copies of this program. + beginning of an expression. The value of an expression THE TINY BASIC LANGUAGE is evaluated from left to right. except that * and I are always done first. and then + and -, and then com­ Numbers pare operators. Parentheses can also be used to alter the order of evaluation. In Tiny Basic, all numbers are integers and must be Statements less than or equal to 32767. A Tiny Basic statement consists of a statement

92 INTERFACE AGE DECEMBER 1976 SOFTWARE SECTION MICROCOMPUTER DEVELOPMENT SOFTWARE number between 1 and 32767 followed by one or will produce the same output as before, except that more commands. Commands in the same statement there is no CR-LF after the last item is printed. This are separated by a semi- ";". "GOTO", "STOP", enables the program to continue printing on the same and "RETURN" commands must be the last command line with another "PRINT". in any given statement. PRINT A, B, #3, C, D, E, #10, F, G Program will print the values of A and B in 6 spaces, the values of C, D, and E in 3 spaces, and the values of F and G in A Tiny B~sic program consists of one or more 10 spaces. If there are not enough spaces specified for statements. When a direct command "RUN" is issued, a given value to be printed, the value will be printed the statement with the lowest statement number is with enough spaces anyway. executed first. then the one with the next lowest statement number, etc. However, the "GOTO", PRINT 'ABC', +-; 'XXX' "GOSUB", "STOP", and "RETURN" commands can will print the string "ABC", a CR without a LF, and then alter this normal sequence. Within the statement. ex­ the string "XXX" (over the ABC) followed by a CR-LF. ecution of the commands is from left to right. The "IF" command can cause the execution of all the com­ INPUT Command mands to its right in the same statement to be skipped INPUT A. B over. When this command is executed, Tiny Basic will print "A:" and wait to read in an expression from the input Commands device. The variable A will be set to the value of this Tiny Basic commands are listed below with expression. Then "B:" ·is printed and variable B is set to examples. Remember that commands can be the value of the next expression read from the input concatenated with semi-colons. In order to store the device. Note that not only numbers, but also statement. you must also have a statement number in expressions can be read as input. front of the commands. The statement number and the INPUT 'WHAT IS THE WEIGHT'A. "AND SIZE"B concatenation are not shown in the examples. This is the same as the command above, except the prompt "A:" is replaced by "WHAT IS THE WEIGHT:" REM or REMARK Command and the prompt "B:" is replaced by "AND SIZE:". REM anything goes Again, both single and double quotes can be used as This line will be ignored by TBI. long as they are matched.

INPUT A, 'STRING', ~ "ANOTHER STRING", B LET Command The strings and the '~" have the same effect as in LET A=234-5*6, A=AI2, X=A-100, "PRINT". @(X+9)=A-1 will set the variable A to the value of the expression IF Command 234-5 * 6 (i.e., 204). set the variable A (again) to the IF AB)*X+(A

94 INTERFACE AGE DECEMBER 1976 SOFTWARE SECTION MICROCOMPUTER DEVELOPMENT SOFTWARE except that: a) the current statement number and When the paper tape is finished, turn it off and type a position within the statement is remembered; and b) a Control-O again. semi-colon and other commands can follow it in the same statement. Control-Shift-P's and turn off the punch. GOSUB 120 To read back such a paper tape, type "NEW," CR. and Control-?, then turn on the paper tape reader. will cause the execution to jump to statement 120. When the paper tape is finished, turn it off and type a GOSU B A * 10+ B Control-O. then turn on the paper tape reader. When the paper tape is finished, turn it off and type a Control­ will cause the execution to jump to different o again. statements as computed from the value of the ex­ pression A' 10+ B. Error Report RETURN There are only three error conditions in TINY BASIC. The statement with the error is printed out with a A RETURN command must be the last command in inserted at the point where the error is a statement and followed by a CR. When a RETURN detected. command is encountered, it will cause the execution to (1) WHAT? means it does not understand you. Ex­ jump back to the command following the most recent ample: GOSUB command. where PRINT is mistyped GOSUB can be nested. The depth of is WHAT? 210 P?TINT "THIS" limited only by the stack space. LIST WHAT? 260 LET A=B+3. C=(3+41, X=4 (2) HOW? means it understands you but does not will print out all the statements in numerical order. know how to do it. LIST 120 HOW? 310LET A=B*C?+2 where B*C is larger than 32767 will print out all the statements in numerical order 120. HOW? 380 GOTO 412? where 412 dose not exist NEW (3) SORRY means it understands you and knows how to do it but there is not enough memory to do it. will delete all the statements. Error Corrections Stopping the Execution If you notice an error in typing before you hit the CR. The execution of program or listing of program can you can delete the last character by the Rub-Out key or be stopped by the Control-C key on the input device. delete the entire line by the Alt-Mode key. Tiny will echo a back-slash for each Rub-Out. Echo for Alt­ Abbreviation and blanks Mode consists of a LF, a CR, and an up-arrow. You may use blanks freely, except that numbers, To correct a statement, you can retype the state­ command key words, and function names can not have ment number and the correct commands. Tiny Basic embedded blanks. will replace the old statement with the new one. You can truncate all command key werds and func­ To delete a statement, type the statement number tion names and follow each by a period. "P.", "PR.", and a CR only. "PRI.", and "PRIN." all stand for "PRINT." Also the Verify the corrections by "LIST nnnn" and hit the word LET in LET command can be omitted. The Control-C key while the line is being printed. "shortest" abbreviation for all the key words are as FOR and NEXT Commands follows: FOR X=A+1 TO 3*B STEP C-1 A.=ABS F.=FOR GOS.=GOSUB G.=GOTO IF=IF IN.=INPUT L. = LIST N.=NEW The variable X is set to the value of the expression N.=NEXT P.=PRINT REM=REMARK .=RETURN A+ 1. The values of the expressions (not the expres­ R.=RND R.=RUN S.=SIZE S.=STEP S.=STOP TO=TO sions themselves) 3 * Band C-1 are remembered. The Implied= LET name of the variable X. the statement number and the position of this command within the statement are al­ Control of Output Device so remembered. Execution then continues the normal way until a NEXT command is encountered. The Control-O key on the input device can be used The STEP can be positive, negative or even zero. to turn the output device ON and OFF. This is useful The word STEP and the expression following it can be when you want to read in a program punched on paper omitted if the desired STEP is + 1. tape. To produce such a paper tape, type "LIST' without NEXT X CR. Turn on the paper tape punch and type a few The name of the variable (X) is checked with that of Control-Shift-P's and then a CR. When listing is the most recent FOR command. If they do not agree, finished, type more Control-Shift-P's and turn off the that FOR is terminated and the next recent FOR is punch. checked, etc. When a match is found, this variable will To read back such a paper tape, type "NEW," CR, be set to its current value plus the value of the STEP and Control-O, then turn on the paper tape reader. expression saved by the FOR command. The updated

96 INTERFACE AGE DECEMBER 1976 SOFTWARE SECTioN MICROCOMPUTER DEVELOPMENT SOFTWARE

value is then compared with the value of the TO eelF ~7 DB ... W.... expression also saved by the FOR command. If this is 0020 7C MOV A, H ; *** COMP oR RST "' *** 0021 SA eMP D ; COMPARE HL WITH DE within the limit. execution will jump back to the com­ 0022 ce RNZ ; RETURN CORRECT C AND 0023 7D MOV A, L ; Z FLAGS mand following the FOR command. If this is outside 91324 SS CMP E J BUT OLD A IS LOST 1312125 C9 RET the limit. execution continues following the NEXT com­ 0026 414E DB ""AN"" 9028 .1A SS1: LDAX D ; *** I GNBLK..... RST '5 *** mand itself. 0929 FE20 CPI 20H ; IGNORE BLANKS 0028 C8 RNZ ; IN TEXT (WHERE OE-)-) FOR can be nested. The depth of nesting is limited 982C 13 INX D ; AND RETURN THE FIRST only by the stack space. If a new FOR command with 992D C3281313 JMP SSl ; NON-BLANK CHAR. I N A 8930 F1 POP PSW ; *** FINISH/RST 6 *** the same control variable as that of an old FOR com­ 813:3:1 C08394 CALL FIN ; CHECk END OF COMMAND 0034 C3:C604 JMP QWHAT ; PRINT "WHAT?" IF WRONG mand is encountered, the old FOR will be terminated 0037 47 DB "G ....

automatically. 9038 EF RST 5 ; *** TSTV OR RST 7 *** 003:9 D649 SUI 40H ; TEST VARIABLES 9038 08 RC ; C: NOT A VARIABLE 003C C258e0 JN2 TVl ; NOT "!jI" ARRAY ee3F 13: INX D J IT IS THE "@I" ARRAY STOP Command 0048 C01A04 13843 29 ~=~L ~ARN ~ ~Y S7~~~~) B~SF~~~O~~gEX 131344 OA9F00 JC QHOW ; IS INDEX TOO BIG? STOP 01347 05 PUSH D ; WILL IT OYERWR ITE 0048 ES XCHG ; TEXT? 0049 CDS904 CALL SIZE ; FIND SIZE OF FREE This command stops the execution of the program 004C E7 RST 4 ; AND CHECK THAT 9040 OAF404 JC ASORRY ; IF SO, SAY "SORRY" and returns control to direct commands from the input 13950 216613 LXI H, YARBGN ; IF NOT, GET ADDRESS 01353 CD7C04 CALL SUBDE ; OF Ij(EXPR) AND PUT IT device. It can appear many times in a program but 00!!56 01 POP D ; IN HL 0057 C9 RET ; C FLAG I S CLEARED must be the last command in any given statement. i.e., 13058 FE1B TYl : CPI 1BH ; NOT 11', IS IT A TO Z? 00SA 3F CMC J IF NOT RETURN C FLAG it cannot be followed by semi-colon and other com­ 00SB D8 RC e0SC 13 INX D ; IF A THROUGH Z 005[:+ 216613 LXI H, VARBGN ; COMPUTE ADDRESS OF mands. 0060 07 RLC ; THAT VARIABLE 0061 85 ADD L ; AND RETURN IT IN HL 0062 6F MOV LA ; WITH C FLAG CLEARED 0063 3Eee MVI A,. 0065 8C ADC H Direct Commands 0066 67 MOV H.A 0067 C9 RET As defined earlier, a statement consists of a state­ TSTC XCH HL

eeee E: :"-:THL ; *** TSTC OR RST 1 *** AT START, IT PRINTS OUT "(CR)OK(CR)", AND INITIALIZES THE aeeS' EF RST 5 ; I GNORE BLANkS AND STACK AND SOME OTHER INTERNAL VARIABLES. THEN IT PROMPTS eeeA BE CMF' M ,TEST CHARACTER ")-" AND READS A LINE. IF THE LINE STARTS WITH A NON-ZERO ageB C3:6899 JMP Tel ; REST OF THIS IS AT Tel NUMBER, THIS NUMBER IS THE . THE t,.INE NUM8ER

98 INTERFACE AGE DECEMBER 1976 SOFTWARE SECTION MICROCOMPUTER DEVELOPMENT SOFTWARE

RUNSML: TIN.,.. BASIC PROGRAM SAVE AREA STARTS AT THE MEMORY LOCATION 8157 C084e6 CALL CHK I 0 ; *** RUNSML *** LABELED "TXTBGN" AND ENDS AT "TXTENO". WE ALWAYS FILL THIS e15A 21BD06 LX I H. TAB2-1 ; F I NO COMMAND IN TAB2 AREA STARTING AT "TXTBGN". THE UNFILLED PORTION IS POINTED 8150 C33B07 JMP EXEC ; AND EXECUTE IT BY THE CONTENT OF A MEMORY LOCATION LABELED "TXTUNF". 01613 DF GOTO: RST 3: ; **'" GOTO EXPR * ...... THE MEMORY LOCAT I ON "CURRNT" PO I NTS TO THE LINE NUMBER 8161 05 PUSH D ; SAVE FOR ERROR ROUT I NE THAT IS CURRENTLY BEING INTERPRETED. WHILE WE ARE IN 8162 CDC204 CALL ENDCHI< ; MUST FIND A CR THIS LOOP OR WHILE WE ARE INTERPRETING A DIRECT COMMAND 8165 CD3:805 CALL FNDLN ; FIND THE TARGET LINE (SEE NEXT SECTION). "CURRNT" SHOULD POINT. TO A 0. 13168 C2Aeee JNZ AHOW ; NO SUCH LINE * e16B F1 POP PSW ; CLEAR THE "PUSH DE" ; RSTART LOD I SP. STACK 016C C3:50e1 JMP RUNTSL ; GO DO IT RSTART: aeBA 319014 LXI sp, STACK eeBD CD0E00 ST1. : 'CALL CRLF ; AND JUMP TO HERE ; ******* ... *"'***** ... * ... "' ... * ... **************** ... *** ... **** ...... * ... *** ... ***** BOCS l1AB00 LXI D. OK ; DE-)-STRING 1<"'''' LIST ...... &- PRINT ... ** 00C3 97 SUB A ; A=0 00C4 CD6005 CALL PRTSTG ; PRINT STRING UNTIL CR LIST HAS TWO FORMS: ..-LIST

FOR .... LI ST...... NEW, AND ~ STOP .... : GO BACK TO .... RSTART'" .... GOSUB EXPR; .... OR "'GOSUB EXPR (CRV IS LIKE THE ... GOTO .... FOR .... RUN ... : GO EXECUTE THE FIRST STORED LINE IF ANY; ELSE COMMAND. EXCEPT THAT THE CURRENT TEXT POINTER. STACK POINTER GO BACK TO .... RSTART ..... ETC. ARE SAVE SO THAT EXECUTION CAN BE CONTINUED AFTER THE FOR .... GOTO .... AND .... GOSUS .... : GO EXECUTE THE TARGET LINE. .... RETURN..... IN ORDER THAT ... GOSUB .... CAN BE NESTED FOR "'RETURW AND .... NEXT .... : GO BACK TO SAVED RETURN LINE. (AND EVEN RECURSIVE). THE SAVE AREA MUST BE STACKED. FOR ALL OTHERS: IF .... CURRNT" -) €I, GO TO .... RSTART..... ELSE THE STACK POINTER IS SAVED IN .... STKOOS ..... THE OLD .... STKGOS .... IS GO EXECUTE NEXT COMMAND.

*** NEW ... * ... STOP *** RUN (& FRIENDS) ...... * &- GOTO ... * ...... RETURN

100 INTERFACE AGE DECEMBER 1976 SOFTWARE SECTION MICROCOMPUTER DEVELOPMENT SOFTWARE

*** REM *** IF *** INPUT *** 8: LET (& DEFLT) ***

**.., FOR *** 8: NEXT *** REW CAN BE FOLLOWED BY ANYTHING AND IS IGNORED BY TBI TBI TREATS IT LIKE AN .' IF~ WITH A FALSE CONC'ITION " FOR " HAS TWO FORMS: /FOR VAR=EXPl TO EXP2 STEP EXP3'~ AND ~FOR VAR=EXPl TO EXP2/ ~ IF" IS FOLLOWED B"I" AN EXPR. AS A CONDITION AND ONE OR MORE THE SECOND FORM MEANS THE SAME TH I HG AS THE FIRST FORM WITH CONMANOS (INCLUDING OTHER "IF"S) SEPERATED B"I" SEMI-COLONS. EXP3=1 (I. E WITH A STEP OF +1. ) ~~OTE THAT THE WORD .' THEW I S NOT USED. TB I EVALUATES THE TB I WILL FIND THE liAR I ABLE VAR. AND SET I TS VALUE TO THE EXPR, IF IT IS NON-ZERO, EXECUTION CONTINUES IF THE CURRENT VALUE OF EXP1. IT ALSO EVALUATES EXP2 AND EXP3 EXPR. IS ZER'O, THE COMMANDS THAT FOLLOWS ARE IGNORED AND AND SAVE ALL THESE TOGETHER WITH THE TEXT POINTER ETC. IN EXECUTION CONTINUES AT THE NEXT LINE THE / FOR ~ SAVE AREA, WH I CH CONS I STS OF "" LOPVAR ,', ... LOP I NC ~ , ~ LOPU1T" , LOPLN ~, AND ... LOPPT -'". I F THERE IS ALREAD"I" SOME­ 'INPUT" COMMAND IS LIKE THE "PRINT-"" COMMAND" AND IS FOLLOWED THING IN THE SAVE AREA (THIS IS INDICATED B"I" A NON-ZERO 8'y' A LIST OF ITEMS IF THE ITEM IS A STRING IN SINGLE OR "LOPYAP/), THEN THE OLD SAVE AREA IS SAVED IN THE STACK DOUBLE QUOTES, OR IS A BACK-ARROW, IT HAS THE SAME EFFECT AS BEFORE THE NEW ONE OVERWR ITES IT IN ~PRINT/. IF AN ITEM IS A YARIABLE, THIS VARIABLE NAME IS TBI WILL THEN DIG IN THE STACK AND FIND OUT IF THIS SAME PRINTED OUT FOLLOWEC, BY A COLON THEN T8I WAITS FOR AN VARIABLE WAS USED IN ANOTHER CURRENTLY ACT lYE ~FOR~ LOOP EXPR. TO 8E T'r'PED IN. THE VARIABLE IS THEN SET TO THE IF THAT IS THE CASE, THEN THE OLD ~FOR/ LOOP IS DEACTIVATED, \/ALUE OF THIS E)

NE:~:T VAR' SERVES AS THE LOGICAL (NOT NECESSARILL"I" PHYSICAL) (AGAIN IN SINGLE OR DOUBLE QUOTES), THE STRING WILL BE END OF THE "'FOR·e LOOP THE CONTROL VARIABLE YAR. IS CHECKED PR I NTED FOLLOWED BY A COLON. TB I THEN WA I TS FOR INPUT EXPR. ~.J I TH THE ,,' LOPYAR" I F THEY ARE NOT THE SAME, TB I DIGS IN AND SET THE YAR I ABLE TO THE VALUE OF THE EXPR. THE STACK TO FIND THE RIGHT ONE AND PURGES ALL THOSE THAT C'W NOT MATCH EITHER WAY,. TBI THEN ADDS THE ~STEP" TO IF THE INPUT EXPR. IS INVALID, TSI WILL PRINT "WHAT?", THAT VARIABLE AND CHECI< THE RESULT WITH THE LIMIT IF IT "HOW?" OR "SORR"I"" AND REPRINT THE PROMPT AND REDO THE INPUT. IS L.JITHIN THE LIMIT,. CONTROL LOOPS BACV TO THE COMMAND THE EXECUT I ON WILL NOT TERM I NATE UNLESS YOU TYPE CONTROL-C. FOLLOHING THE ~FOR/ IF OUTSIDE THE LIMIT, THE SAVE ARER THIS IS HANDLED IN ~ INPERR/ IS PURGED At~D £:X:ECUTION CONTINUES "LET" IS FOLLOWED BY A LIST OF ITEMS SEPERATED BY COMMAS. elF:? (:[:'1.9136 FO~' CALL PUSHA ; SAVE THE OLD SAVE Ar<'EA EACH I TEM CONS I ST5 OF A VAR I ABLE, AN EQUAL S ION, AND AN EXPR. eiFB C.[:oA004 CALL SETVAL ; SET THE CONTROL ....'AR TB I E ..... ALUATES THE EXPR. AND SET THE VAR I BlE TO THAT VALUE. €liFE 28 DC::< H ; HL IS ITS ADDRESS TB I WILL ALSO HANDLE ~ LET ~ COMMAND WITHOUT THE WORD .; lET"'. 131FF 22~)91(1 SHL(.o LOPVAR ; SAVE THAT THIS IS DONE B'r' ~DEFL T~. 132132 211:::.07 L:x:I H, TAB5-1 ; USE "EXEC" TO LOO~ 13213'5 C:·::807 -.T/'IP E:~;EC .' FOR THE WORC' "'TO~ 02Be 211313013 REM U';I H,eH ; *,..,* REM *** 13208 OF FF:l RST : ; EVALUATE THE LIM I T 02B3 3:E OB :?:EH 02139 220[,'1() SHL[' LOF"Lt1T ; ::.AVE THAT 020(: 211907 U,;EC ,FOr<: THE L·JORD ", STEP' 02B5 7C MOV A, H , I S THE EXPR. =0? 0212 DF FR2 RST : ,FOUN[' IT, GET STEF' 82B6 B5 ORA L 13217 (:31902 .TMP FR4 8287 C257e1 .JNZ RUNSML ; NO" CONTINUE 13216 21131.00 FR: LXI H,lH ,NOT FOUND, SET TO 1 028A CD5685 CALL FNDSKP ; 'r'ES, SK I PREST' OF LINE 13219 220810 FR4 SHLC' LOP I NC ; SAVE THAT TOO 132BD D2S1301 JNC RUNTSL 021C 2A0110 FR5 LHLD CURRNT ; SA\/E CURRENT LINE .. 132('13 C3BAoe JMP RSTART 021F 220F10 SHLD LOPLN 0222 E8 XCHG ; AND Tn:T POINTER INPERF: : 13223: 221110 SHLO LOPPT 132C? 2A0710 LHLD STKINP -' *** I NPERR *** 13226 0113A00 L~1 POP [! ; REDO I NF'UT 822E 68 t10V L,8 ; HL=0 NOW 022F 39 DAO SF' ; HERE I S THE STACK I~~PUT ; ***. INPUT **'* 0230 ::E DB 3EH 02CD D5 IPl PUSH D ; SAVE IN CASE OF ERROR 1323:1 139 Fr<:7 C.A[- 8 ; EACH LEVEL ISle DEEP 02CE C[:'6C05 CALL QTSTG ; IS NEXT ITEM A STRING? 02:'2 7E MOV A, ~1 ; GET THAT OL[:' .' lOPVAR 82Dl (,:3:["802 -.TM? IP2 ; NO 1323::::: 2: IN:'; H 82D4 FF RST 7 ; YES, BUT FOLLOWEr' 8Y A 0.2:4 S":: ORA M 132D5 DA15e3 JC IP4 ; ..... ARIABLE? NO 13235 eFt'S;?!);:: JZ FR8 ; €I SAYS NO MORE IN IT 132[!8 (:3EBe2 JMP IP3 ; 'r'ES INPUT VAR I ABLE 132::8 7E t'10\/ A, M 02[)B D5 IP2 PUSH C' ,SAVE FOR 'PRTSTG' 0239 28 DO': H O;2D(: FF RST 7 ; /'lUST 8E VARIABLE NOW 02::A 8A (:I1P 0 ; SAME AS THIS ONE? 02DD [!AC604 JC m~HAT "WHAT?" IT IS NOT? -.TNZ FR7 02E0 1A LDA:"; D ; GET READY FOR 'PRTSTG' 023:E 7E r'10V A, M ;. THE OTHER HALF-! 02El 4F MOV c.. A 023F 88 Ct'IP E 02E2 97 SU8 A 0240 ('2:.1132 n~z FR7 e2E3 12 STAX [. 1324:::' EE; i<:CHG ; YES, FOUND ONE 02E4 [:'1 POP [.. 13244 2H3000 L::-:I H,0H 132E5 C[-613e5 CALL PFnSTG ; PR I NT STR I NG AS F'F:O~lPT 0247 :::;a C'AC' SP ;. TP'T' TO MOVE SP MOV B, H 8248 44 e2E8 79 MOV A, C ; RESTORE T£:><:T 13249 4[- MOV C, L e2E9 lB DCX D U-;I H,OAH 024Ft 210800 02EA 12 STA::-: [:. 024[:' 19 DAD D 82E8 05 IP3 PUSH [.. ; SA'v'E TEXT PO INTER 824E CDEE0'5 CALL MV[.)OWN ; AND PURGE 113 WORDS 02E(' EE: :'':T F'O INTEr<' 13279 2AOBl13 LHLO LOPINC 0315 Fl IP4 POP PS~J ; PURGE .JU~jf I ~j ::.TAO 027(. E5 PUSH H (e16 CF RST 1 ,Isun:TCH ~, e27C' 7C MO\-' A, H (C:17 .::C ('8 0:'1:::::: (12- DB IP5-:J:-l e27E AA ;':r<:A C' 0::19 (':.('D02 .TI1P IPl ; YES, MOF:E ITEMS e27F 7A MOV A, D 0::?1C F7 IP~, F.:5T 132:::1) 19 OAO 0 ; ADD ONE STEP 1)281 FA::::::E:I2 ~Tt1 ~~><4 0::::,1[:' lA DEFL T L['A>': [, 132:::4 AC >';RA H ,*** OEFL T 0::::,lE FEI)[.' CPI CR Et1PTY L I t·JE I S Of 02:::5 FAAA02 JM Ni-";S OJ'2(1 CA2C(12- JZ LT1 ELSE IT IS "LET 02:::::: E8 WN :~:CHG 02:::9 2A091G LHL[- LOPVAR ; PUT IT BAc!< 032: (:[,'A004 LET CALL ::.ET\/AL 028C 7: 110'.,1 N,. E -' ***, LET *"',. 0326 CF RST 1 ; SET VALUE TO ","AR 02:::[' 2: IN;< H 0::27 2C DB 132:::E 72 ~10V ~1, E:' (Co2:? CC- C'B L Tl-:i-l 132:::F 2AO[,'1Cl LHL[o LOPLMT . HL=LIMIT 0?29 C32:K!· Jr1P LET ITEM 8'y' I TE~I 0292 Fl POP PS~J ,OLE:' HL 0:'::(: F7 L Tl PST 6 ; UNTIL FHU::.H 1329:' E:7 ORA A 13294 F29802 JP N>a ; STEP :> €I 0297 EB :~;CHG 1329::: C['9:::1214 N:~:l CALL Cf IS ONE OF THE OF'ERATORS IN TAB::: fiND THE 02AA El N:,':5 POF' H RESUL T OF THESE OPERATIONS IS 1 IF TRUE AN[.' 121 IF FALSE 02AB D1 POP 0 (EXPF:2:' ::(+ OR ->',:+ OR --(E:::., ) 02AC CDFC'05 N::-:2 CfILL POPA ,PURGE THIS LOOP '''HERE (;, ARE OPT I Ot~AL AND ,! ARE OPTI ONAL REPEATS 02AF F7 RST 6 ~-=E: : =(\lARIABLE:.

102 INTERFACE AGE DECEMBER 1976 SOFTWARE SECTION MICROCOMPUTER DEVELOPMENT SOFTWARE

CCF7 [oJ. :VP::5 POP D ; AND TEr.:T POINTER <(E:><:PR:.» 1)2F:3 7C I'10\} Fl .. H ; Hl MUST BE + 03F:3 B7 OFi:A A AS I NDE:'(, FUNC T IONS CAN HAVE A~j AS ARGUMENTS, AND f)?FA FA9F(n) 1M QHOH ; ELSE IT IS OVERFLOLoJ :E;-';PR4:: CAN BE AN VALUE .)·'102 C:lASO:;:: _Jt1P ::-;P3J. ; LOOI< FOR MORE TERMS 0::.2[) 2121137 EXPR1: L;~: I H, TAB8-1 ,LOO~JJP REL. OP 1323121 C::::807 JMP E:><:E(: ;GO C'O IT 0"O~, 210107 L:--O:I H, TA84-1 ; FINE.' FUNCTION IN TAB4 13:::::: CD5C0:: ;~:P11 CALL ;-';P18 REL. OP. "}=" 0408 C::3807 JNP E:X:EC ; AND GO DO IT 1333:6 D8 RC ; NO, RETURN HL=0 1)"11)8 FF RST 7 ; NO_. t-mT A FUNCTION 13::::7 6F 1'10\,' L, A ; '..'E5.. RETURN HL=l 040(. DA1404 _.IC XP4:1 ; NOR A \IAR I A8LE 133.38 (:9 RET ("IOF 7E MO'.... A, M ; VARIABLE '213:39 CD5cec :',::P12 CALL ::-~P18 ; REL. OP_ "#" 0410 2: 1~4:< H e:nc (:8 RZ ; FALSE.. RETURN HL=12I 0411 66 MOV H .. M ; VALUE IN HL 13::::[', 6F MOV L, A ,TP.UE.. RETUf<:~f HL~l 0412 6F t·10'·/ L_. A 033E (:9 RET C1,U:::::_ C9 RET 0::3F C[!5CO: :-C:Pl:1 CALL :";PH: ; REL op, "}" 041·4 (,E"77(,12I :-O:P41 CALL TSTNUN ; OR I SIT A NUN8EF: 0242 (:8 RZ FALSE 1).-11, 7:3 ''11)'./ A, B ; .. OF DIGIT D8 RC ; ALSO FALSE. HL=O ec·c. 041:3 87 ORA A eC44 6F MOV L, A ; TRUE, HL=l. 04150 CO F:NZ ; OV 13::45 (:9 I<:ET 041A CF PARN RST :1 NO DIGIT. MUST 8E 1213:46 CD5(:(C XP14 CALL :><:P18 ; REL. OP "(=" 1)418 28 DB 13:49 6F "10V L_. A ; SET HL=l 041C I)S ['B ;'~F'43:-$-1 03:4E ('[:'5C(13" XP15 CALL :-';P18 ; REL. OP "=" (q2:1 C9 RET 0351 co RNZ ; FALSE, RETRUN HL=O 0422 C :,C6134 .TI·lP OWHAT ELSE SA.... ': "WHAT';'" 0352 6F MOV L, A ELSE SET HL=1 13:5:: (,9 RET (;H25 C[.'lA04 RN['" 0354 (:["5(,03 >':Plt;; CALL :-':;P18 ; PEL. OP, "<:" CALL F'ARN ; *** RN[)\ D';PR) *** 'ZH2::: 7C MO\,' A, H ; E:-::I D_. LSTROt1 ; NU~IE:EF' RE\·'EP~.E TOF' OF STAO e3SF E5 PUSH H 04::9 E7 RST 4 036(:::1 C5 PUSH El o·eA DA4004 .]C F'Al ; WRAF' AROUND IF LAST 0:6:1 "'IF f10\,J C, A ~34::['o 2J.'3(1)13 U:THL 1ST <:E:":F'P2:,- IN HL. 13:66 E3 0442 56 MOV D, M 1):67 (:["9:=:134 t: ALL CI-: H 0:'7:, 13':: ['8 .-:F-·.:':1-'!-'!' >2':.7--1 .: '11)'30'j L:>: 1 :-1. OH 't'F::':.. FFIf'_E 0- PET 0::77 ': ::;'80: JI'I'" P,~:';:_ TREAT L If:E :::U8TF;ACT I::'(~-"?A C F :

': eC7r· (,DA5(1~ CALL E:':F'P: . 1ST 1 [,'1 PDF' C' 0·165 CS- 7C ~'1(1',,1 H. H . COI'IF'APE SIGN PET O:_:::A fiR '~PH [. 0:'88 7H MO\/ A, [', 02:::C 19 [.'R[' (', i2t:.:3D D1 POF' D · RESTOl<'E TE:-: T PI~I I t-j TEF .TM :'-:F'':::::- ;151 .::t-j[.1 SIGN ["IFFEF' 0::91 AC :'-:F'H H · 1ST ::::N[' -::: li:iN EClUAL [,'1',,11[:0£ [.'IVIOES HL B't' DE" PESUL T I~j BC_. REMAHJDER IN HL 0:-92 F280r:C .IP :~;F'2: SO I ~::, F:ESUL T 0:95 C:9F00 -.IMP G!HO~j · ELSE t~E HAVE OVEPFLOW O::9~: CF :'';P2':, F:ST 1 · SU8TF:AC T :. 0:::99 2[) L"E: CHf'SG~V CHECY5 SIGN OF HL IF +, NO CHANGE IF -, CHANGE 1329A 86 L'8 :-:F'4.::'-:t-l SIGN AND FLIP SIGN OF B 13?9E: E5 ;':P':::6 PUSH H 029C CORSO: CALL E>';PF<:: GET 2N[" '--"PP:::- CHI::lSGW CHNGES SIGN OF HL AN[' 8 UNCON[:'ITIONALL't· OJ:9F CD86.0.J CALL CHC6Gt-j · NEGATE 0]:A2 (3871)]: • .]MP "':P24 ; AND ADD THEt'l Cf-::HLL'E-- CHECI::F'R4> 1)'186. 7( ~10V A, H (er,C C(:005(H CALL E:-O:PR4 · ANE" (lET 2~K' ONE (H27 FS PUSH PSW 0: ['F .::'t6IJO I'WI 8.,OH CLEAR 8 FOR SIGN 0488 2F C''1A ; CHANGE S I (:iN OF HL (:eEl CC':3'::,(1.J CALL (W--'SGN · CHECK SIGN OF 2N[:' 1Z,'189 057 MOV H, A :><:THL · GET 1ST IN HL 048A 7D NOV Fl., L 'CC ES (.[,'83-134 (ALL CH~'5C:iN ; CHECV S. I Gt-I OF 1ST O·~:38 2F r)::E::: EB >';CHG C''1A (H8C 6F MOV L, A eeE9 E: .'ZCEE: 7A ~10V A, C. 134:::F AC :>

DECEMBER 1976 INTERFACE AGE 103 SOFTWARE SECTION MICROCOMPUTER DEVELOPMENT SOFTWARE

6'lFA [,'7 GETL~~ R-:.T ; ... ',.,'" GETLN **ot (1'19:~: 7C ~10V A, H O'lFP 119[,'1:::: L>':I C'.· BUFFEP ; F"F:OMF'T AN[t INIT CH99 FlFI 7:RA U : SAME SIGN? 6·1FE CD:::40f I:JU CALL CHt-.: I 0 ; CHECI< I CPI 7DH ; [:'ELETE THE lolHOLE LI NE? "SET'./AL" E>10F:E FF:EE ROOf1 7' NE>':T LINE AND CONT I NUE FROM THERE 1}5.:!..E FE[o[:' C:P I 8UFEN[.' A~m 0FFH r)520 C1FE04 .m:: GLl ; 'r'ES, GET NE>n INPUT "ENDCH~<" CHECIIMANCS. (GOTO, RETURN, AND STOP ETC. ) 6524 FE9[' CP I BUFFER At·l[.. (,"lFFH 1)52oS CR::'.605 .1: GL4 t·lO.. F:E[.'O Lo./HOLE LINE "ERROR" PRWTS THE STRING POWTEC' 8'r' C'E " 05.2R 1)52C ['7 RST INSERTED AT .,jHEF:E THE OL[' TE:n POItHEF~ '.:SHOUL[' 8E Ot-l TOP Jt'lP GL1. . GO GET ND':T INPUT OF THE STACI"':> POHlTS TO E:":ECUTION OF T8 IS STOPPED 1352[" C:3.FEI2:!4 AND TB I IS F:ESTAF·TE[.' Hm·jEVEF:, IF CURRtH .. ' -:--- ZERO 1)5::'.0 C[)(1H:n!1 GL4 CALL CF"LF pEDO ENTIPE LINE t1V I ff, 1215EH . CF:.. LF AN(, UP-ARF:O~I ': I m.. I CATIN':J A [)IRECT COf'1t'IAN(!:', THE [)IRECT COf'1f1At'lD IS NOT 1;15::':3 3E5E P!<'UHE[l AND IF . CURR.NT" -:: NEGATIVE # .: INDICATING . INPUT' 0535 C3FAI}4 JMP GETLN Cor'l1>lA~l[' .. THE INPUT LINE IS NOT PRINTEC' AN[:' E";ECUTION IS (1~'::8 MO"·' A .. H ; ·.. ·t·", FNDLN .. NOT TEF:1>1I NATEC' E:UT CONT It.,lUEC' AT ..' I NPEPF' . 7C '..,*' 0539 87 ORA ; CHECI< SIGN OF HL 05::'.A FA9F00 .JM OHOI·J I T CANNOT EIE - pELATE[" TO "EPPOP" ARE THE FOLLOWING L>:I [), T:":TBGN . INIT. TE:--:T POINTER m'lHAT SAVE::. TE:-:T POHlTEp IN ::.TACk AN[' GET ~IESSAI:JE "WHAT'":>" 1215:::::[' 11.1710 A~.lHAT JUST I:JET t'IESSAGE "~·jHAT-::·" AN[" JU~IP TO '"ERpOF' .., ..., .., FNDLt~P .,,..,. C'SOPF"'T' At'l[' 'A::,ORP'~'" [,'0 SA~IE t.:It~[, OF THUlG SAVE LINE .. C!Hm,j" AN[' AHm·j IN THE ZEpO PAGE SECTION ALSO C'O THI::· 0540 E5 PUSH H

1)~;·11 2AJ.SI0 LHLD T:~:TUNF ; CHECK I F WE PASSED Et~[:' ::.ETIiAL (1':=-1-'1 '::::E: DC>O: PST 7 ot:ot:* 5ETVAL *.-to" O'-IA!3 FF 0':"0<1':, E7 RST 1)·lAl l'Ft(€O·'l .JC I)~·JHAT ; "~·jHAr'" NO ...·'APIABLE I}S'l~ El POP H · GET LINE .. 8AO-:: !)'lft,1 E5 F'U::H H . SA ... .'E A[.o[:oPE:::S OF ...·'RF' 05'17 [ .. :~: C.' NZ PASSED END 1}·iA~, CF F:ST 1 .. PASS "=" SIC":!N 05,'18 lA : ~,jE [)IC' NOT .. I:JET 80,.'TE 1 f:l' ~ Flo:. ::: [.. ['8 05'13 95 SUB IS THIS THE LINE-::" '}·'lA7" 13t: [.lE· SV1-J"-1 1?l5"IA '17 1'10\0' B, A : COf1PARE LOL~ ORC'ER fdA:;:: [·F PST EVALUATE E:Y~PR (1~He 1::' It'l:'" r::';·IA9·'t-"j t'10',.' E: .. H ,'lALUE IN E:C Nmo./ OS·Ie: iA LDK': : GET P'~'TE .2 l:t·'!AA ·-lE' t'I!)\-, C .. L 1)~,"1[.. :?C S8B ; COI'lPAF:E HIGH ORDEp !}·IAB E1 POF' H (lET AN.'PE:::S 1~1':'cj E f'A5':,05 JC FL2 ; NO, NOT THERE YET 1'10\1 t1 .. C : ';A\IE '·,1ALUE I;'!·'IAC 71 (651. lE: [·C::-: [.. : EL::,E \'IE EITHEF: FOUND w:~: H 1)·'11'1[- .::: ')5':'':' FlO OPA E: ; IT .. OF: IT IS NOT THERE t'10V /1.8 O'IAE 7(t 1355::: C9 RET : NL 2.: FOUN('; NC. NZ' NO Ij'IAF (9 RET NO "=" SII:JN i'}iE'O (..:(.60·1 H1F m·JHAT "+",., ... Fm.. N:':L . RUN ~lD:T LI NE FI':::' F:ET ; ELSE RETURN TO CALLEF'

0,1('2 EF F·:::.T ·t·ot· t EN[.. CH~.: ... ·ot·.., PRTSTG" PPINTS A STRHJI:J F'OINTEC, B',' [.lE IT STOPS PI':INTING (1:I D. ~JHAT ... 't· ... AWHAT ... ,..·t· I),-!CA 9, EPPOF' SUB A ; ·t.: .. * ERPOR .-to:t.-to ('T:;[I.::' LOI)t·."S FI)R A BA(:I".:-ARROI~., SINGLE QUOTE:, OR DOUBLE [t·ICE' C[.''';:!:?II)!,) CALL PRTSTI:J PRINT "'loJHAT" HOW"? OUOTE IF NO~JE OF THESE .. pETlJpt·l TO CALLEF' IF BACK-ARROW, O':I(E [:-1 F'OP [) : OR ..' SOF'R'~' OUTF'UT A CF: ~'HTHOUT A LF IF SINGLE OR C'OUBLE OUOTE, PRINT O'ICF iF! LuFl;'-: D SA'·... E THE CHARACTEp THE STRIUG IN THE C!UOTE AN[" C'EI'IA~l["S A I>IATCHING UNG!UOTE O:H[-,{:t F5 PUSH PSI~ ; AT HHERE OLD DE -) AFTER THE PRINTINI:J THE NE>':T :( 8'r'TES OF THE CALLEp IS SKIPPE(:' IZt·1['1 97 SUE' A A~J(.' PUT A 121 THEFi:E (I'·iEF' (USUAL.L'~' A ..fIJI·IF· INSTF:UCTIOt·l·' (1'1[,'':: 12 STR>': [., LHL[" CUF:F:NT · GET CUPRENT LI NE .. PRTNUI'I" F'RHHS THE ~,1U~lE=:EF: HJ HL LEA[:'ING BLA~lt<:3 AF'E ADOED 1)·1['€ E5 PUSH H IF t-IEE[.'E[, FI F'A[' THE NU~1E:EP OF SPACES TO THE NU~18ER IN C 1),1['-7 7E 1'10 ...·' fj,~' ; CHEct< THE VALUE HOL·JE'··'EF·. IF THE NUr'IBER OF DIGITS IS LARGER THA~l THE .. IN 1).-1[.0::' .:::: IN:~: H C.' ALL [.'IGITS AF:E PRItHE[) AN'.."I,jA',.' NEGATIVE SIGN IS ALSO ,::'H[.·986 OF:A ~, F·F:HHE[.' AN[" COUNTEr, W. POSITIVE SIGN IS NOT G,-IVA ["1 POF [:, 0'1 ["E: C AE:AO(1 J:: pSTART IF ZERO. JUST RERSTAF:T PRTLW' PRINTS A SAVE[., TE>':T LH1E ~·JITH LINE .. AND ALL. O,I[-E 7E MOV A. M · IF NEGATIVE, Ct·l['·F 87 ORA A F'F:TSHl (~'l EI3 FAC :'13':: .m r~lPEpF: · pE['O INPUT 05';0 ,·t7 1'10\·' 8. A > ·t.. -to:+: PRTSTG ,.··t:"t O·lE:: (,N'205 CALL PfHLN ELSE PpINT THE LINE 1)561 lA PSi LDA;": (.0 ; GET A CHAF'AC TEF' (}"H.;.b IE' DC": D UP TO loJHERE THE 121 IS 05~2 1: Itl:"< E' ,BUt'lP POINTEF' !3.IE7 Fl POP PSI,j ,RESTORE THE CHApACTER 05':::::: 8::: Ct'lF' P SAI'IE AS OL(:o A 7' (1"jE:=: 12 STA>': D ('0::''''''1 (.8 R:: · 'I"'ES., RETURN 04E'? :E:F MVI A.. :::::FH ,PpHlT A 135;::"" [ .. 7 PST ,ELSE F'F'HH IT 1)·'IE8 [:'( RST O'.~r:::.; FEI)[, CPI CF' HA'; IT A CF'~' O,:,r::::~' (2':::105 ':;:"'IEC ~~7 SUE A ANL' THE REST OF THE He F'Sl · NO. ~lE>:T 0'IE[" (.(:0":'1305 CALL PRTSTG 1)5r:::E C9 F'ET 'T'ES. Fi:ETUF:~l 134Ft) C:.BAOO .Jt'lF· RSTAPT 1:1':,,,,:( CF ('T ~::TI:J RST 1 C!TSTG PUSH [.. 05.-::(, ~._ ["E: A:::.OPP',.' "f)6E OF [,'E: OT2.-"*-1 (HF'/ 118..JOO L:"':I [.', SOF:P'r' ')':,.;F ::::E2':;: if·iI A.22H · IT IS A " (H F7 C:?CAI)··. JMP ERROP ()57.1 ('[.. 600':, !-'Tl CALL PPTSTG PRINT UNTIL ANOTHER 1:''';.7·1 FEO(.. CF'I CF' ',jAS LAST ONE A cp·~· (,,:,.;-''':: E1 F'OF' H RETURN A['[.'F:ESS 1'')577 C.A·1701 J:: F'Ut'Jt'l:-:L ~·jAS CF:. PUN NE:--':T L WE I:'!O:,?A ,:-:,:::. (.IT.:' Hl:': H 5V I F' J: B',.'TES ON RETURN (157E: .::: IN>: "GETLW pEADS A INPUT LIt-1E It-JTO "'E:UFFER' IT FIp5T PpOMPT IN:-: THE CHARACTER I N A'.: G I VEt-l 8'r' THE CALLER:" THEN IT FILLS THE E9 PCHL ; RETUF:~~ THE BUFFER ANE.' ECHOS IT IGNORES LPS A~l[" NULLS., BUT STILL (157E CF C'T:;' FST 1. IS IT A ECHOS THEI>l EaiCI< RUB-OUT I S USED TO CAUSE I T TO ['ELETE (1"57F '::::7 ["E' .27H THE LAST CHARATER (IF THERE I:::. ONE> .. At-l["O ALT-MOD IS USED TO (15:::0 0':, ['B OT4-t-l CAUSE IT TO ['ELETE THE ~·JHOLE LI t~E At·J[' START IT ALL O"/ER (l':,:":::!" :E27 t'IVI A.27H ,'''"E5.. [to SAt'IE CR SII3NALS THE ENC' OF A LHJE, Am.· CAUSE "GETLW TO RETURt-l 058:::' (:::'7105 JMp OTl ,AS Hl " 05:?-6 CF OT-I F:ST 1 ,IS IT BACf::-AF:F:mo FN[.·LW FINe's A LINE !-lITH A GIllEN LINE" (IN HU IN THE 1):-:::::7 SF ['E: 5FH 0':",::'8 (1:3 TE:":T SAVE AREA C'E IS USED AS THE TE:~:T POINTEI': IF THE ["8 OT5-$-1 LINE 15 FOUt·1D, [IE HILL POHJT TO THE 8EGWNING OF THAT LINE 0':",::::'9 ?.E8[.. I'WI A.. 08C'H ""E5., CR l-JITHOUT LF 1)58B [,'7 F:ST [·'0 IT nnCE TO GIVE ..: I. E THE LOW 8'r'TE OF THE LINE ,,::0, AN[" FLAGS ARE NC 8: Z (15:::(. [,'7 F'ST TT.,.. ENOUGH T I ME IF THAT LINE IS NOT THEPE ANC' A LINE !-lITH A HIGHER LINE .. 05:~:[.. E1 F"OP H ; RETlIR~l AN.'PESS IS FOUNC', ['E POINTS TO THERE AND FLAGS ARE Ne & NZ IF JI1P OT.2 loJE RERCHE[) THE END OF T£:"

05Ft1 [..0;. PUSH (> l SAVE AS A FLAG .'CHKIO f CHECKS THE INPUT. IF NO INPUT, IT WILL RETURN TO 85Ft2 13[,' DCR C ,l C=SPACES THE CALLER WITH THE Z FLAG SET. IF THERE IS INPUT. Z FLAG B~A: (,5 PUSH 8 ,SAVE SIGN &. SPACE IS CLEARED AND THE INPUT BYTE IS IN A. HOWERER, IF THE 8SFl"1 CD6604 PH.2. CALL DIVIDE .! DEVIDE HL Bit' 113 INPUT IS A CONTROL-D, THE "'OCSW SWITCH IS COMPLIMENTED, AND e!5A7 78 MOV FI, B ; RESULT 0? 2: FLAG IS RETURNED IF A CONTROL-C IS READ,· "'CHKIO'" WILL 135A8 81 ORA C RESTART TBI AND DO NOT RETURN TO THE CALLER 05A9 CAB405 JZ PN3 ! It'ES, WE GOT ALL e'5AC E? XTHL ; NO, SAVE REMA I NDER OUTC PUSH AF THIS IS AT LOC. 113 12''5A['' 2(.0 DCR L .l AND COUNT SPACE LD A,OCSW CHECK SOFTWARE SWITCH 8SAE E5 PUSH H .; HL IS OLD BC lOR A B'SAF 68 MOV H,8 ; MOVE RESULT TO Be 06-12 3.213010 I NIT' STA OCSI-l t7l5BO 69 MOV L C 0645 3ECF M..... I A,9CFH' 13581 C~A1eS JMP PN2 ; AND DIVIDE Bit' 1121 86'17 C'3.FB OUT 0FBH 13584 C1 PH? POP B ; WE GOT ALL DIGITS IN 136'19 3E27 1'1 ..... 1 A,27H rt5B5 13D PN. DCR C ,THE STACK 06<-1B D2FB OUT 0FBH e~86 79 MOV A,(. ; LOOK AT SPACE COUNT 064[.' 1619 MVI D,19H 13587 87 ORA A PATLOP: esse FACiOS JM PHS ! NO LEADING BLANKS e64F CDeE80 CALL CRLF eSBB 3:E28 MYI FI,20H ,LEADING BLANKS 0652 15 . OCR D 058D D7 RST 2- eS8E C38585 JMP PN4 ; MORE? 1365: C24F06 .JNZ PATLOP 135C1 78 PN5: MOV A, B ; PRINT SIGN 8656 97 SUB A EII557 llA:?e6 LXI D,MSG1 l?!~C2 87 ORA A esc::? (:411312113 CNZ 10H 065A CD68e5 CALL PRTSTG 05(,6 5[:­ MOV E, l ; LAST REMAINDER IN E 865D 2101388 LXI H, START esc? 78 PN6' MOV FI, E .; CHECK DIGIT IN E 0660 221?10 SHU;' RANPNT 85(,8 FEaR CPI 0AH ; 10 I S FLAG FOR NO MORE e66:? .211710 LXI H, naBON ElSeA D1 POP D 9666 2215113 SHLD TXTUNF eseB C8 RZ ; I F so, RETURN 8£69 C2SA09 JMP RSTART 05(.(. C63e ADI 30H ; ELSE COVERT TO ASC I I 866(' C271e6 OC2: .JNZ OC3 IT IS ON 135('E D7 RST 2 ; AND PRINT THE DIGIT 866F Fl POP PSW IT IS OFF OSCF C3C705 JMP PN6 ! GO BACK FOR MORE a67e ('9 RET RESTORE AF AND RETURN 0671 DBFB DC:?: : IN eFBH COME HERE TO DO OUTPUT 8673 E6el 85[·-2 1A PRTLN: LDA:>-: D ; PRTLN ANI lH STATUS BIT *** *** 13675 CA71eE: e~D3 6F MOV LA; LOW ORDER LINE .. JZ OC3 NOT READY. w!=1IT e5D'1 13- INX D e678 Fl POP PSW READY, GET OLD A BACK 1ZI!!it'5 1A LDAX D ! HIGH ORDER 81579 D?FA OUT 0FAH AND SEND I TOUT 9SD6 67 MOV H, A 0678 FE0D CPI CR WAS IT CR? 135[:>7 13 INX D 8670 ce RNZ NO, FINISHED 8S[!8 111£134 MVI C,4H ; PRINT 4 DIGIT LINE .. 1367E J:EeA MYI A, LF SEND LF 05DA CC'9205 CALL PRTNUM 136813 D7 RST ;2 THIS IS RECURSIVE 13681 3EeD 8SDC·' 3E2e 1'1"1 I A, 20H ! FOLLOWED Bit' A BLANK MYI A, CR GET CR BACK IN A 05C'F /)7 RST 2 13683 C9 RET eSEe 97 SU8 A ; AND THEN THE TEXT 9681 DEeFEe CHK I a : IN 0FBH ; ... * ... CHKIO ...... * 85E1 C[.>6ee5 CALL PRTSTO 9686 12113 NOP ; STATUS BIT FL I PPED? BSE4 C9 RET 121687 E6e2 ANI 2H ; M!=1SK STATUS BIT 8689 C8 RZ ; NOT READY, RETURN "Z" ; ********* ...... "' ...... "''''''''''* ... '''''''''*'''''''''*'''*''' ... '''''''''*'''''' ...... *****... **... * ... * ...... 06aA DBFA IN 9FAH ; READY, READ DATA *''' ... e6ac E67F ANI 7FH ; MASK BIT 7 OFF "'** MVUP *,..'" MVDOWN *** POPA *** & PuSHR * ... * e68E FEeF CPI eFH ; IS IT CONTROL-O? 06913 C29De6 JNZ Cll ; NO, MORE CHECKING "'MVUP'" MOVES A UP FROM WHERE DE-) TO WHERE BC-) UNTIL a693 3Ae010 LOA OCSW ; CONTROL -0 FL I PS OCSW DE "" HL 8696 2F CMA ;. ON TO OFF, OFF TO ON 9697 321211211121 STA OCSW "'MVDOWW MOvES A BLOCK DowN FROM WHERE DE-> TO WHERE HL-) 869A CJ:80496 JMP CHKIO ; GET ANOTHER INPUT UNTIL DE "" Be Bt;;9D FE03 Cll: CPI J:H ; IS IT CONTROL-C? 069F ce RNZ ; NO, RETURN "NZ" 06Ae C3BAe9 ... POPA'" RESTORES THE ... FOR'" LOOP vAR I ABLE SAVE AREA FROM THE .JMP RSTART ; YES, RESTART TBI 96A3 54494E~9 MSG1: STACK DB -'TINY'" 96A7 29 136A8 42415349 ... PUSHA'" STACKS THE ... FOR'" LOOP VAR I ABLE SAVE AREA I NTO THE DB "'BASIC'" e6AC 4J: STACI< B6AD eD DB CR 85E5 E, MVUP: RST 4 ;*** MVUP ... ; ... **...... *****... **... **...... * ...... * ...... **... * ...... * ...... ***'"* ...... * ... * 85E6 c. RZ ; DE = HL RETURN * ... 85E7 1A LDAX D ; GET ONE BYTE 85E8 82: STAX B ; MOVE IT .... ** TABLES **... DIRECT *** 8. EXEC ...... * 85E9 1? INX D ! INCREASE BOTH POINTERS 85EA B7. IN:": B THIS SECTION OF THE CODE TESTS A STRING AGAINST A TABLE. WHEN A MATCH IS FOUND, CONTROL IS TRANSFERED TO THE SECTION ~5E8 (7.E595 JMP MVUP ; UNTIL DONE

11VDOWN' OF CODE ACCORD I NG TO THE TABLE. 85EE 78 MOY A, B ; *1<* MVDOWN ... AT .' EXEC"', DE SHOULD PO I NT TO THE STR I NG AND HL SHOULD PO: 8SEF SUB D ; TEST IF DE = BC TO THE TABLE-i. AT f DIRECT', DE SHOULD PO I NT TO THE STR It 8SFB C2F605 JNZ MDl !NO, GO MOVE .' HL WILL BE SET UP TO POINT TO TAB1-i, WHICH IS THE TABLE ( 8SF2 79 MOV A, C ; MAYBE, OTHER BYTE? ALL DIRECT AND STATEMENT COMMANDS. OSF·I 51? SUB E 95F5 (8 RZ ; YES, RETURN A .' .... IN THE STRING WILL TERMINATE THE TEST AND THE PARTIf 05F6 18 MD:l DC;": D .l ELSE MOVE A BYTE MATCH WILL BE CONSIDERED AS A MATCH. E. G., -'P .... , "'PR 8'5F7 2B DCX H ; BUT FIRST DECREASE ·PRJ. ... , "'PRIN ... , OR ·'PRINT'" WILL ALL MATCH ... PRINT .... 05F8 1A LDAX L' ; BOTH POINTERS AND 05F9 77 MOY M, A .; THEN DO IT THE TABLE CONS I STS OF ANIt' NUMBER OF I TEMS. EACH ITEM 135FA C?EE05 JI'IP MVDOWN . LOOP BACK IS A STRING OF CHARACTERS WITH BIT 7 SET TO €I AND A JUMP ADDRESS STORED HI-LOW WITH BIT 7 OF THE HIGH 0SH' Ci POPA' POP B ; BC RETURN ADDR. = BYTE SET TO 1. 1)'5FE E1 POP H .; RESTORE LOPVAR, BUT (35FF 228918 SHLD LOPVAR ; =9 MEANS NO MORE END OF TABLE IS AN ITEM WITH A JUMP ADDRESS ONLIt'. IF THE 0602 7C MOY A.H STRING DOES NOT MATCH ANY OF THE OTHER ITEMS, IT WILL 86e?: 85 OPA L MATCH THIS NULL ITEM AS DEFAUl T. 061!t1 CA17136 JZ PPl ; It'EP, GO RETURN 06137 E1 POP H ; NOP, RESTORE OTHERS TABl ,DIRECT COMMANDS €I€138 220811:l SHLD LOP INC 136AE -1C495?:54 DB "LIST'" 8613E' El POP H 0€13( 220["10 SHLD LOPLMT DWA LIST G6B2 8i DB (8e16FH SHR 8) +128 f:'I6GF E1 POP H 068?· bF DB 9916FH AND OFFH '3618 220F18 SHL['· LOPLN 13';:1: EJ POF' H 86B4 52554E 17,'=';1'. 221110 SHLD LOPPT DB "'RUN'" 13";17 C'5 PPl PUSH B ; BC = RETURN ADDR DWA RUN 136B7 81 DB (00141H SHR 8) +128 0618 C:? RET ; 06B8 <11 DB e0141H AND OFFH 13619 21DE.l.3. PUSHA' LXI H, STKLMT PUSHA ;. *>+<* ••* €l6B9 4E1557 DB "'NEW'" .!t61C (:0868'1 CALL CHGSQN DWA NEW 061F (,1 POP B ; BC""RETURN ADDRESS 136B( 81 DB (90132H SHR 8) +128 86B[.' 3.2 (621) ~9 DAD SP .; IS STACK NEAR THE TOP? DB ee132H AND 0FFH 13621 (·2F?EH JNC QSORRY ; YES, SORRY FOR THAT. c~t:=:.?·! ..?A0910 LHLD LOPVAR ; ELSE SAVE LOOP YAR. S TAB2: ,DIRECT;STMTEI1ENT G6.?? 7C MOV A,H ; BUT IF LOPYAR IS 068E 1E4'358504 DB "NEXT' 1")628 85 ORA L ; THAT wILL BE ALL • DWA NE>-:T .36C2 I?I~.;::? C.A?.F86 JZ PUl 82 DB (00257H SHR a) +128 8132':- 2A1118 LHL[· LOPpT ;. ELSE, MORE TO SAVE 06C: 57 DB ee257H AND 9FFH ';:,,;'2F E~ PUSH H 136:8 2AGF10 LHLD LOPLN 96C4 4C45!54 DB 'LET' DWA LET 06::'?- E' PUSH H 063.'1 2AOD10 LHLD LOPLMT e6C7 83 DB ..: 00J:23H SHR 8) +128 .313:.7 E~ PUSH H 136C8 2? DB 90J:2J:H AND 0FFH I31F?8 2.A0810 LHLD LOPINe 0P5:P. .5 PUSH H e6C9 4946 De 'IF' 0€?( 2Ao91G LHLD LOPYAR DWA IFF 8.;?-F E5 PU1 PUSH H a6eB 82 DB <002B4H SHR 8) +1.28 06'10 (.~ PUSH 8 ; 8C . RETURN ADDR . 96ec B4 '~II:'"l1 (.$1 RET DB 002B4H AND 0FFH 06CD 474F5044F DB ··GOTO' DWA GOTO "+' ...... OUTC .., ... ,.., & CHKIO .., ... * 06Dl 81 DB (00160H SHR a) +128 0'6D.2 60 DB e0160'H AND 0FFH THESE ARE THE ONLY 110 ROUT I NES IN TB I. 06D: 17'4F53"55 DB "'GOSUS'" " OUTC ~ I S CONTROLLED BY A SOFTWARE SW ITCH ,. OCSIo!". IF ocsw-=e .' OUTe·' I·JI LL JUST RETURN TO THE CALLER. IF OCSW I S NOT e. 96D7 42 DWA GOSUB IT WILL OUTPUT THE BYTE IN A. IF THAT IS A CR. A LF IS ALSO 06Da 81 DB (0019FH SHR 8) +1;29 SEND OUT. ONLY THE FLAGS MAY BE CHANGED AT RETURN. ALL REG. el$D9 BF ARE RESTORED. DB 001BFH AND 0FFH

106 INTERFACE AGE DECEMBER 1976 SOFTWARE SECTION MICROCOMPUTER DEVELOPMENT SOFTWARE

06DA 52455455 DB "RETURN'" 137'55 .23. INX H : BUMP TO NEXT TAB. ITEM 06DE 524E 0756 ['1 POP 0 . RESTORE srR I NG PO INTER DWA RETURN 0757 C12807 JMP Exe ,TEST AGAINST NEXT ITEM 06ES 81 DB < 001DFH SHR 8) +128 06E1 OF DB 0'010FH AND 0FFH '~75A 3E?F E:y;:- : MVI FI,07FH , PARTI AL MATCH, FIND ')75(, '::2 E:--:'* 1N>-: H ; JUMP AD[IR. , WHICH IS 06E2 52454D DB "'REM/ 1375[:' BE eMP M ; FLAGGED BY BIT 7 DWA REM 07SE D25('87 JNC E:-<:4 O€E!3 82 DB (092B0H SHR 8) +128 13761 7E E:--:5 MOV A, M ; LOAD HL WITH THE JUMP 13GE6 Be DB 902B0H AND 8FFH 1376.2 .22 IN:«: H ,ADDRESS FROM THE TABLE 07'::2 6E MOY L, M 06E7 464F52 DB / FOR'" tZ!761 E67F ANI 7FH ; MASt·: OFF BIT 7 DWA FOR 0766 67 MOY H, A 06EA 81 DB...: 0elF8H SHR 8) +128 137b7 Fl POP P5~'l ,CLEAN UP THE GARBAGE 9GEe F8 DB 091F8H AND 0FFH ')768 E9 PCHL ,AN(.I LoJE GO DO IT

06EC 494ES055 ["B / INPUT / LSTROM: 06FO 54 l.E'nJO ORG 1000H ; HERE ON MUST 8E RAM DWA INPUT 11308 OCSW: DS 1 ; SW I TCH FOR OUTPUT 06Fl 82 DB (0S2CDH SHR 8) +128 1001 CURP.NT. DS 2 ; POINTS TO CURRENT LINE 06F 2. CD DB ee2CDH AND 9FFH 100: sn-::GOs' DS 2 ; SAVES SP IN /OOsUB' 1121135 VARN:>-:T: DS 2 ; TEMP STORAGE 06F3. 5052494E DB "'PRINT/ 1007 STKINp· DS 2 ; SAVES SP IN / INPUT·· 96F7 54 1009 LOP ..... AR: DS 2 ; / FOR / LOOP SAVE AREA Di-JA PRINT .100B LOPINC DS 2 ; INCREMENT 06F8 81 D8 (80187H SHR 8) +128 lCCD LOPLMT· DS , LIMIT 96F9 87 DB e0187H AND 0FFH J.r313F LOPLN: OS 2 , LINE NUMBER 11311 LOPPT: DS 2 ; TEXT PO INTER 96FA S3544F50 08 /STOP'· 112112 RANPNT: DS 2 ; RANDOM NUMBER POINTER DWA STOP 1015 TXTUNF DS 2 ; - )UNF I LLED TE:-QT. QT5 e591 137213 82 DB (ee216H SHR 8) +128 QT2 057A on 957E 0~86 QWHAT 94C6 RA1 044e FJ:ANPN 1013 9721 16 D8 00216H AND 0FFH OTSTG 0S6C REM 02B0 RETUR a10F RND e425 RSTAR aeBA RUN 8:141 RUNNX 9147 RUNSM e157 RUNTS 015e TABS: ; RELATI ON OPERATORS 13722 3E3D DB /)=/ SETVA 04A0 SIZE e459 SORR'T' eeB4 SS1 0028 eeSD ~12 aeCL> ST3 00D6 ST4 0198 DWA XP11 S11 STACK 14913 START 00e9 STKGO le93 STKIN 1087 13724 83 DB (00333H SHR 8) +128 STKLM 13DE STOP 9138 sueDE 947C SV1 0480 0725 33 DB e033J:H AND 0FFH TABl 06AE TAB2 06BE TAB4 0792 TAB5 e714 9726 23 DB .... / TAB6 a71A TABS 0722 Tel 9068 TC2 0e73 TNl 007C TSTNU 9977 TV1 ee58 TXTBG 1017 DWA XP12 TXTEN 1366 TXTUN 1915 YARBO 13:66 VARNX 1005 0727 83 DB (e93J:9H 5HR 8) +128 WHAT aeAE XP1:1 9333 XP12 83:39 XP13 ellF 13728 39 DB 0e339H AND 0FFH XP14 13346 XP1.!5 034E XP16 9354 XP17 03~A XP18 93SC XP21 e37A XP22 037D XP2l 838e 13729 lE DB />/ XP24 9387 XP25 0398 XP26 0398 XPll e3A8 DWA XP13 XP32 03C5 XP33 03CO XP34 93D8 XPl5 elF7 072A 83 DB (e033FH SHR 8) +128 XP40 t340e XP41 041. XP42 8421 r XP43 0422 0728 3F DB e0J;3FH AND 0FFH

e72C 3D DB DWA XP15 13720 83 DB (ee34EH SHR 8) +128 072E 1E DB 9034EH AND 9FFH

072F :?C3D DB /(:/ DWA XP14 DB (00346H SHR 8) +128 DB 0e346H AND 0FFH

DB /( ... DWA XP16 8734 83 DB (e0354H SHR 8) +128 137]:5 54 DB ee354H AND 0FFH

DWA XP17 0736 8]: DB (e035AH SHR e) +128 0737 5A DB ee35AH AND 0FFH

DIRECT: 13738 21AD06 LXI H, TAB1-1 ; *** DIRECT ***

EXEC; ; *** EXEC ••• 0738 EF EX0: RST 5 ; IGNORE LEADING BLANKS 87:?;C D5 PUSH D ; SAVE POINTER 1372D lA EX1: LDAX D ; IF FOUND / .... IN STRING 07!E 13 INX D ; BEFORE ANY MISMATCH 873F FE2E CPI 2EH ; WE DECLARE A MATCH 13·""11 CASA07 JZ EX3 9711 21- INX H ; HL->TABLE 13745 BE CMP M ; IF MATCH. TEST NEXT 13746 CA2:D07 JZ EXl 13749 3:E7F MVI A,07FH ELSE. SEE IF BIT (' 87-18 18 OCX D OF TABLE IS SET, WHICH 074C BE CMP M IS THE JUMP ADDR. (HI) 074D DAI!S187 . JC EX5 C : 'T'ES. MATCHED 137513 23 EX2: INX H NC: NO. FINO JUMP ADDR. 13751 BE CMP M e7~52 02512197 JNC EX2

108 INTERFACE AGE DECEMBER 1976