;;;TINY BASIC from PALO ALTO ;20/3/3 5/8 5/9 5/10 5/11 5/12 5/13 5/28 ;6/6 ; ;SOUT=$067C;5/10 SOUT=$10AB ;SIN=$06A3 SIN=$10AE REENT=$1033 ; ORG $8000 JMP START JMP LIST JMP RUN JMP NEW JMP NEXT JMP LET JMP IFF;"IF" JMP GOTO JMP GOSUB JMP RETURN JMP REM JMP FOR JMP INPUT JMP PRINT JMP STOP JMP DEFLT JMP RND JMP ABS JMP SIZE JMP XP40 JMP FR1;"TO" JMP QWHAT;"WHAT" JMP FR2;"STEP" JMP FR3 JMP XP11;">=" JMP XP12;"#" JMP XP13;">" JMP XP15;"=" JMP XP14;"<=" JMP XP16;"<" JMP XP17 ; START:;LXI SP,STACK NOP NOP NOP MVI A,FF JMP INIT ;RST 1(test character) TSTC:XTHL CALL SPJP CMP M JMP TC1 ; CRLF:MVI A,0D ;RST 2(out character) OUTC:PUSH PSW LDA OCSW ORA A JMP OC2 ;RST 3(expression) EXPR:CALL EXPR2 PUSH H JMP EXPR1 ;RST 4(compare HL with DE) HDCP:MOV A,H CMP D RNZ MOV A,L CMP E RET ;RST 5(jump space code) SPJP:LDAX D CPI 20 RNZ INX D JMP SPJP ;RST 6(check end) ENDCK:POP PSW CALL FIN JMP QWHAT ;RST 7(test variables) TSTV:CALL SPJP SUI 40 RC JNZ TV1 INX D CALL PARN DAD H JC QHOW PUSH D XCHG CALL SIZE CALL HDCP JC ASORRY LXI H,VARBGN CALL SUBDE POP D RET TV1:CPI 1B CMC RC INX D LXI H,VARBGN RLC ADD L MOV L,A MVI A,00 ADC H MOV H,A RET ; TC1:INX H JZ TC2 PUSH B MOV C,M MVI B,00 DAD B POP B DCX D TC2:INX D INX H XTHL RET ; TSTNUM:LXI H,$0000 MOV B,H CALL SPJP TN1:CPI 30 RC CPI 3A RNC MVI A,F0 ANA H JNZ QHOW INR B PUSH B MOV B,H MOV C,L DAD H DAD H DAD B DAD H LDAX D INX D ANI 0F ADD L MOV L,A MVI A,00 ADC H MOV H,A POP B LDAX D JP TN1 QHOW:PUSH D AHOW:LXI D,HOW JMP ERROR ; HOW:"HOW?" DB 0D OK:"OK" DB 0D WHAT: "WHAT" "?" DB 0D SORRY:"SORR" "Y" DB 0D RSTART:NOP NOP NOP ST1:CALL CRLF LXI D,OK SUB A CALL PRTSTG LXI H,ST22 SHLD CURRNT ST2:DB 21;LXI H ST22:DW $0000 SHLD LOPVAR SHLD STKGOS ST3:MVI A,29;3E CALL GETLN PUSH D LXI D,BUFFER CALL TSTNUM CALL SPJP MOV A,H ORA L POP B JZ DIRECT DCX D MOV A,H STAX D DCX D MOV A,L STAX D PUSH B PUSH D MOV A,C SUB E PUSH PSW CALL FNDLN PUSH D JNZ ST4 PUSH D CALL FNDNXT POP B LHLD TXTUNF CALL MVUP MOV H,B MOV L,C SHLD TXTUNF ST4:POP B LHLD TXTUNF POP PSW PUSH H CPI 03 JZ RSTART ADD L MOV L,A MVI A,00 ADC H MOV H,A LXI D,TXTEND CALL HDCP JNC QSORRY SHLD TXTUNF POP D CALL MVDOWN POP D POP H CALL MVUP JMP ST3 NEW:CALL ENDCHK LXI H,TXTBGN SHLD TXTUNF STOP:CALL ENDCHK JMP RSTART ; RUN:CALL ENDCHK LXI D,TXTBGN ; RUNNXL:LXI H,$0000 CALL FNDLP JC RSTART ; RUNTSL:XCHG SHLD CURRNT XCHG INX D INX D ; RUNSML:;CALL CHKIO NOP NOP NOP LXI H,TAB2-1 JMP EXEC ; GOTO:CALL EXPR PUSH D CALL ENDCHK CALL FNDLN JNZ AHOW POP PSW JMP RUNTSL ; LIST:CALL TSTNUM CALL ENDCHK CALL FNDLN LS1:JC RSTART CALL PRTLN ;CALL CHKIO NOP NOP NOP CALL FNDLP JMP LS1 ; PRINT:MVI C,06 CALL TSTC DB 3B DB 06 CALL CRLF JMP RUNSML PR2:CALL TSTC DB 0D DB 06 CALL CRLF JMP RUNNXL PR0:CALL TSTC "#" DB 07 CALL EXPR MOV C,L JMP PR3 PR1:CALL QTSTG JMP PR8 PR3:CALL TSTC "," DB 06 CALL FIN JMP PR0 PR6:CALL CRLF CALL ENDCK PR8:CALL EXPR PUSH B CALL PRTNUM POP B JMP PR3 GOSUB:CALL PUSHA CALL EXPR PUSH D CALL FNDLN JNZ AHOW LHLD CURRNT PUSH H LHLD STKGOS PUSH H LXI H,$0000 SHLD LOPVAR DAD SP SHLD STKGOS JMP RUNTSL RETURN:CALL ENDCHK LHLD STKGOS MOV A,H ORA L JZ QWHAT SPHL POP H SHLD STKGOS POP H SHLD CURRNT POP D CALL POPA CALL ENDCK ; FOR:CALL PUSHA CALL SETVAL DCX H SHLD LOPVAR LXI H,TAB5-1 JMP EXEC FR1:CALL EXPR SHLD LOPLMT LXI H,TAB6-1 JMP EXEC FR2:CALL EXPR JMP FR4 FR3:LXI H,$0001 FR4:SHLD LOPINC FR5:LHLD CURRNT SHLD LOPLN XCHG SHLD LOPPT LXI B,$000A LHLD LOPVAR XCHG MOV H,B MOV L,B DAD SP DB 3E;dummy (mov a,n) ,,,skip "DAD B" FR7:DAD B MOV A,M INX H ORA M JZ FR8 MOV A,M DCX H CMP D JNZ FR7 MOV A,M CMP E JNZ FR7 XCHG LXI H,$0000 DAD SP MOV B,H MOV C,L LXI H,$000A DAD D CALL MVDOWN SPHL FR8:LHLD LOPPT XCHG CALL ENDCK ; NEXT:CALL TSTV JC QWHAT SHLD VARNXT NX0:PUSH D XCHG LHLD LOPVAR MOV A,H ORA L JZ AWHAT CALL HDCP JZ NX3 POP D CALL POPA LHLD VARNXT JMP NX0 NX3:MOV E,M INX H MOV D,M LHLD LOPINC PUSH H MOV A,H XRA D MOV A,D DAD D JM NX4 XRA H JM NX5 NX4:XCHG LHLD LOPVAR MOV M,E INX H MOV M,D LHLD LOPLMT POP PSW ORA A JP NX1 XCHG NX1:CALL CKHLDE POP D JC NX2 LHLD LOPLN SHLD CURRNT LHLD LOPPT XCHG CALL ENDCK NX5:POP H POP D NX2:CALL POPA CALL ENDCK REM:LXI H,$0000 DB 3E ; IFF:CALL EXPR MOV A,H ORA L JNZ RUNSML CALL FNDSKP JNC RUNTSL JMP RSTART ; INPERR:LHLD STKINP SPHL POP H SHLD CURRNT POP D POP D ; INPUT:; IP1:PUSH D CALL QTSTG JMP IP2 CALL TSTV JC IP4 JMP IP3 IP2:PUSH D CALL TSTV JC QWHAT LDAX D MOV C,A SUB A STAX D POP D CALL PRTSTG MOV A,C DCX D STAX D IP3:PUSH D XCHG LHLD CURRNT PUSH H LXI H,IP1 SHLD CURRNT LXI H,$0000 DAD SP SHLD STKINP PUSH D MVI A,3A CALL GETLN LXI D,BUFFER CALL EXPR NOP NOP NOP POP D XCHG MOV M,E INX H MOV M,D POP H SHLD CURRNT POP D IP4:POP PSW CALL TSTC DB 2C DB 03 JMP IP1 IP5:CALL ENDCK ; DEFLT:LDAX D CPI 0D;CR JZ LT1 ; LET:CALL SETVAL CALL TSTC DB 2C DB 03 JMP LET LT1:CALL ENDCK EXPR1:LXI H,TAB8-1 JMP EXEC XP11:CALL XP18 RC MOV L,A RET XP12:CALL XP18 RZ MOV L,A RET XP13:CALL XP18 RZ RC MOV L,A RET XP14:CALL XP18 MOV L,A RZ RC MOV L,H RET XP15:CALL XP18 RNZ MOV L,A RET XP16:CALL XP18 RNC MOV L,A RET XP17:POP H RET XP18:MOV A,C POP H POP B PUSH H PUSH B MOV C,A CALL EXPR2 XCHG XTHL CALL CKHLDE POP D LXI H,$0000 MVI A,01 RET EXPR2:CALL TSTC DB 2D;- DB 06 LXI H,$0000 JMP XP26 XP21:CALL TSTC DB 2B;+ DB 00 XP22:CALL EXPR3 XP23:CALL TSTC DB 2B;+ DB 03;jmp to XP25 JMP XP232 JMP XP25 XP232:PUSH H CALL EXPR3 XP24:XCHG XTHL MOV A,H XRA D MOV A,D DAD D POP D JM XP23 XRA H JP XP23 JMP QHOW XP25:CALL TSTC DB 2D;- DB 03;jmp to XP42 JMP XP26 JMP XP42 XP26:PUSH H CALL EXPR3 CALL CHGSGN JMP XP24 EXPR3:CALL EXPR4 XP31:CALL TSTC DB 2A;* DB 03;jmp to XP34 JMP XP312 JMP XP34 XP312:PUSH H CALL EXPR4 MVI B,00 CALL CHKSGN XTHL CALL CHKSGN XCHG XTHL MOV A,H ORA A JZ XP32 MOV A,D ORA D XCHG JNZ AHOW XP32:MOV A,L LXI H,$0000 ORA A JZ XP35 XP33:DAD D JC AHOW DCR A JNZ XP33 JMP XP35 XP34:CALL TSTC DB 2F;/ DB 03;jmp to XP42 JMP XP342 JMP XP42 XP342:PUSH H CALL EXPR4 MVI B,00 CALL CHKSGN XTHL CALL CHKSGN XCHG XTHL XCHG MOV A,D ORA E JZ AHOW PUSH B CALL DIVIDE MOV H,B MOV L,C POP B XP35:POP D MOV A,H ORA A JM QHOW MOV A,B ORA A CM CHGSGN JMP XP31 EXPR4:LXI H,TAB4-1 JMP EXEC XP40:CALL TSTV JC XP41 MOV A,M INX H MOV H,M MOV L,A RET XP41:CALL TSTNUM MOV A,B ORA A RNZ PARN:CALL TSTC DB 28;( DB 09;jmp to XP43 CALL EXPR CALL TSTC DB 29;) DB 01 XP42:RET XP43:JMP QWHAT ; RND:CALL PARN MOV A,H ORA A JP QHOW ORA L JZ QHOW PUSH D PUSH H LHLD RANPNT LXI D,LSTROM CALL HDCP JC RA1 LXI H,START RA1:MOV E,M INX H MOV D,M SHLD RANPNT POP H XCHG PUSH B CALL DIVIDE POP B POP D INX H RET ABS:CALL PARN DCX D CALL CHKSGN INX D RET SIZE:LHLD TXTUNF PUSH D XCHG LXI H,VARBGN CALL SUBDE POP D RET DIVIDE:PUSH H MOV L,H MVI H,00 CALL DV1 MOV B,C MOV A,L POP H MOV H,A DV1:MVI C,FF DV2:INR C CALL SUBDE JNC DV2 DAD D RET SUBDE:MOV A,L SUB E MOV L,A MOV A,H SBB D MOV H,A RET CHKSGN:MOV A,H ORA A RP CHGSGN:MOV A,H PUSH PSW CMA MOV H,A MOV A,L CMA MOV L,A INX H POP PSW XRA H JP QHOW MOV A,B XRI 80 MOV B,A RET ; CKHLDE:MOV A,H XRA D JP CK1 XCHG CK1:CALL HDCP RET SETVAL:CALL TSTV JC QWHAT PUSH H CALL TSTC DB 3D;= DB 0A CALL EXPR MOV B,H MOV C,L POP H MOV M,C INX H MOV M,B RET SV1:JMP QWHAT ; FIN:CALL TSTC DB 3B;';' DB 04 POP PSW JMP RUNSML FI1:CALL TSTC DB 0D DB 04 POP PSW JMP RUNNXL FI2:RET ENDCHK:CALL SPJP CPI 0D RZ ; QWHAT:PUSH D AWHAT:LXI D,WHAT ERROR:SUB A CALL PRTSTG POP D LDAX D PUSH PSW SUB A STAX D LHLD CURRNT PUSH H MOV A,M INX H ORA M POP D JZ RSTART MOV A,M ORA A JM INPERR CALL PRTLN DCX D POP PSW STAX D MVI A,3F CALL OUTC SUB A CALL PRTSTG JMP RSTART QSORRY:PUSH D ASORRY:LXI D,SORRY JMP ERROR GETLN:CALL OUTC LXI D,BUFFER GL1:CALL CHKIO ;JZ GL1 NOP NOP NOP CPI 7F JZ GL3 CALL OUTC CPI 0A JZ GL1 ORA A JZ GL1 CPI 7D JZ GL4 STAX D INX D CPI 0D RZ MOV A,E CPI DD;BUFEND ********************* JNZ GL1 GL3:MOV A,E CPI 9D;BUFFER ********************* JZ GL4 DCX D MVI A,5C;\(back slash)************ CALL OUTC JMP GL1 GL4:CALL CRLF MVI A,5E;^ *******? JMP GETLN ; FNDLN:MOV A,H ORA A JM QHOW LXI D,TXTBGN ; FNDLP:; FL1:PUSH H LHLD TXTUNF DCX H CALL HDCP POP H RC LDAX D SUB L MOV B,A INX D LDAX D SBB H JC FL2 DCX D ORA B RET ; FNDNXT:INX D FL2:INX D ; FNDSKP:LDAX D CPI 0D JNZ FL2 INX D JMP FL1 PRTSTG:MOV B,A PS1:LDAX D INX D CMP B RZ CALL OUTC CPI 0D JNZ PS1 RET ; QTSTG:CALL TSTC DB 22;" DB 0F MVI A,22 QT1:CALL PRTSTG CPI 0D POP H JZ RUNNXL QT2:INX H INX H INX H PCHL QT3: CALL TSTC DB 27;' DB 05 MVI A,27;' JMP QT1 QT4:CALL TSTC DB 5F;_;******* DB 0C MVI A,8D;******* CALL OUTC;***** CALL OUTC;****** POP H JMP QT2 QT5:RET ; PRTNUM:MVI B,00 CALL CHKSGN JP PN1 MVI B,2D;- DCR C PN1:PUSH D LXI D,$000A;DECIMAL PUSH D DCR C PUSH B PN2:CALL DIVIDE MOV A,B ORA C JZ PN3 XTHL DCR L PUSH H MOV H,B MOV L,C JMP PN2 PN3:POP B PN4:DCR C MOV A,C ORA A JM PN5 MVI A,20 CALL OUTC JMP PN4 PN5:MOV A,B ORA A CNZ OUTC MOV E,L PN6:MOV A,E CPI 0A POP D RZ ADI 30 CALL OUTC JMP PN6 ; PRTLN:LDAX D MOV L,A INX D LDAX D MOV H,A INX D MVI C,04 CALL PRTNUM MVI A,20 CALL OUTC SUB A CALL PRTSTG RET MVUP:CALL HDCP RZ LDAX D STAX B INX D INX B JMP MVUP MVDOWN:MOV A,B SUB D JNZ MD1 MOV A,C SUB E RZ MD1:DCX D DCX H LDAX D MOV M,A JMP MVDOWN ; POPA:POP B POP H SHLD LOPVAR MOV A,H ORA L JZ PP1 POP H SHLD LOPINC POP H SHLD LOPLMT POP H SHLD LOPLN POP H SHLD LOPPT PP1:PUSH B RET ; PUSHA:LXI H,STKLMT CALL CHGSGN POP B DAD SP JNC QSORRY LHLD LOPVAR MOV A,H ORA L JZ PU1 LHLD LOPPT PUSH H LHLD LOPLN PUSH H LHLD LOPLMT PUSH H LHLD LOPINC PUSH H LHLD LOPVAR PU1:PUSH H PUSH B RET INIT:STA OCSW CALL CRLF SUB A LXI D,MSG1 CALL PRTSTG LXI H,START SHLD RANPNT LXI H,TXTBGN SHLD TXTUNF JMP RSTART OC2:JNZ OC3 POP PSW RET OC3:POP PSW PUSH B MVI B,E7 CALL OCSUB CPI 0D;CR JNZ OC4 MVI A,0A;LF CALL OCSUB MVI A,0D;CR OC4:POP B RET ; OCSUB:PUSH PSW CALL SOUT ;CALL SOUTT POP PSW RET ; CHKIO:PUSH B ;MVI B,EF ;CALL SIN ;CALL SINT CALL SINSB CPI 1A JZ BREAK;ctrl+Z ;MOV A,C POP B CPI 61;a RC CPI 7B;z+01 RNC SUI 20 RET BREAK:XRA A LXI D,BREAKT CALL PRTSTG JMP REENT BREAKT:"END " "of " MSG1:"TINY" "BASI" "C" TAB1-1:DB 0D "LIST";TAB1 DB 80 DB 03 "RUN" DB 80 DB 06 "NEW" DB 80 TAB2-1:DB 09 "NEXT";TAB2 DB 80 DB 0C "LET" DB 80 DB 0F "IF" DB 80 DB 12 "GOTO" DB 80 DB 15 "GOSU" "B" DB 80 DB 18 "RETU" "RN" DB 80 DB 1B "REM" DB 80 DB 1E "FOR" DB 80 DB 21 "INPU" "T" DB 80 DB 24 "PRIN" "T" DB 80 DB 27 "STOP" DB 80 DB 2A DB 80 TAB4-1:DB 2D "RND";TAB4 DB 80 DB 30 "ABS" DB 80 DB 33 "SIZE" DB 80 DB 36 DB 80 TAB5-1:DB 39 "TO";TAB5 DB 80 DB 3C DB 80 TAB6-1:DB 3F "STEP";TAB6 DB 80 DB 42 DB 80 TAB8-1:DB 45 DB 3E;">=";TAB8 DB 3D DB 80 DB 48 DB 23;"#" DB 80 DB 4B DB 3E;">" DB 80 DB 4E DB 3D;"=" DB 80 DB 51 DB 3C;"<=" DB 3D DB 80 DB 54 DB 3C;"<" DB 80 DB 57 DB 80 DB 5A ; DIRECT:LXI H,TAB1-1 ; EXEC:; EX0:CALL SPJP PUSH D EX1:LDAX D INX D CPI 2E JZ EX3 INX H CMP M JZ EX1 MVI A,7F DCX D CMP M JC EX5 EX2:INX H CMP M JNC EX2 INX H POP D JMP EX0 EX3:MVI A,7F EX4:INX H CMP M JNC EX4 EX5:MOV A,M INX H MOV L,M ;ANI 7F MOV H,A POP PSW PCHL ;******test SINSB:MVI A,05 CALL SOUT CALL SIN RET ; ORG $9000 LSTROM:; OCSW:DB 00 CURRNT:DB 00 DB 00 STKGOS:DB 00 DB 00 VARNXT:DB 00 DB 00 STKINP:DB 00 DB 00 LOPVAR:DB 00 DB 00 LOPINC:DB 00 DB 00 LOPLMT:DB 00 DB 00 LOPLN: DB 00 DB 00 LOPPT: DB 00 DB 00 RANPNT:DB 00 DB 00 TXTUNF:DB 00 DB 00 TXTBGN:DB 00 DB 00 ORG $9F66 TXTEND:; VARBGN:NOP;@(),A to Z 54+1byte ORG $9F9D BUFFER:NOP;input buffer 80byte ORG $9FDD BUFEND:NOP STKLMT:NOP ORG $A000 STACK:; ; ;END