From fac7abf5ef47dcf59880a6099d3b4db019e49977 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Thu, 2 May 2019 13:06:09 +0200 Subject: [PATCH] TORTIS - toddler's own recursive turtle interpreter system. Published with permission from Radia Perlman. --- Makefile | 2 +- build/misc.tcl | 4 + doc/programs.md | 1 + src/radia/tortis.31 | 406 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 412 insertions(+), 1 deletion(-) create mode 100644 src/radia/tortis.31 diff --git a/Makefile b/Makefile index 2534823c..99d2e389 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ SRC = syseng sysen1 sysen2 sysen3 sysnet kshack dragon channa \ fonts zork 11logo kmp info aplogo bkph bbn pdp11 chsncp sca music1 \ moon teach ken lmio1 llogo a2deh chsgtv clib sys3 lmio turnip \ mits_s rab stan_k bs cstacy kp dcp2 -pics- victor imlac rjl mb bh \ - lars drnil + lars drnil radia DOC = info _info_ sysdoc sysnet syshst kshack _teco_ emacs emacs1 c kcc \ chprog sail draw wl pc tj6 share _glpr_ _xgpr_ inquir mudman system \ xfont maxout ucode moon acount alan channa fonts games graphs humor \ diff --git a/build/misc.tcl b/build/misc.tcl index b9a34989..87ad77ca 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -1651,6 +1651,10 @@ respond "*" ":palx rug;_ar\r" respond "COMPUTER=" "1\r" expect ":KILL" +# TORTIS +respond "*" ":midas;324 radia;_tortis\r" +expect ":KILL" + # BBN Logo respond "*" ":cwd bbn\r" respond "*" ":macro\r" diff --git a/doc/programs.md b/doc/programs.md index 967334e8..b9705cbb 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -322,6 +322,7 @@ - TMPKIL, delete old files from .TEMP. - TREES, list toplevel jobs. - TREK, Star Trek game. +- TORTIS, toddler's own recursive turtle interpreter system. - TOSBLK, convert PALX binaries to SBLK. - TV-11, Knight TV PDP-11. - TVEDIT, paint program. diff --git a/src/radia/tortis.31 b/src/radia/tortis.31 new file mode 100644 index 00000000..ade2bd13 --- /dev/null +++ b/src/radia/tortis.31 @@ -0,0 +1,406 @@ + TITLE TORTIS + + DEFINE PACK A,B,C,D,E + A_29.+B_22.+C_15.+D_8.+E_1 + TERMIN + + LPDL==20 + BOX==2 + TURT==1 + TTO==3 +;JUST CHANNEL NUMBERS + TEMP=4 + DOITFL=1 + P0=2 + PNTR=3 + CHAR=5 + NUM=6 +;NUM HAS TO EQUAL CHAR+1 + P=11 + PSHPOP=12 + REMFLG=10 + P3=13 +;THOSE ARE ALL ACCUMULATORS + LOC 42 + JSR INT + + LOC 100 +BEGIN: MOVE P,[-LPDL,,PDL] ;SET UP PSHDWN FOR SUBRTNES + .OPEN BOX,BOX0 + JRST .-1 ;MAYBE SHOULD BE .VALUE + MOVEI CHAR,200000 ;PDL OVERFLOW + MOVEI NUM,1_BOX ;NUM=CHAR+1 + .SETM2 CHAR, ;TAKES 2 ADJ AC'S AND SETS UP INTRPT MASK + .OPEN TURT,BOX3 ;OPEN TURT OURPUT ON TXY + JRST .-1 + SETZB NUM,REMFLG + MOVE PSHPOP,[-200,,STACK] ;SET UP STACK TO HOLD LISTING + .OPEN TTO,TTO3 + JRST .-1 + PUSHJ P,INIT + JRST MAIN + +INIT: MOVE TEMP,HORIZ + MOVEM TEMP,CHORIZ ;RESET HORIZONTAL + MOVEI TEMP,22. + MOVNM TEMP,VERT ;RESET VERTICAL + MOVE PNTR,INITP ;SAVE INIT CURSOR POS AND CLEAR SCREEN + .IOT TTO,PNTR + MOVE PNTR,TINTP + .IOT TURT,PNTR + MOVEI CHAR,15. + .SLEEP CHAR, + .RESET BOX, + POPJ P, + MAIN: SETZM STOPFL + .IOT BOX,CHAR ;GET NEXT KEY PUSHED + ANDI CHAR,77 + JUMPE CHAR,MAIN + CAIGE CHAR,50 + JRST MAIN + PUSHJ P,@ADRS(CHAR) ;GO OFF TO PROPER RTNE + JRST MAIN +;THIS SUBRTNE CHECKS IF REMFLG IS ON AND STORES INTO LIST IF IT IS +;THEN IT WRITES THECOMMANDIN THE LIST(IF REMFL SET) +;AND UP TOP. THEN SENDS THE COMMAND TO THE TURTLE NUM TIMES +RTN2: MOVEI NUM,0 ;ENTRY PT FOR COMMANDS WITH NO NUM MEANINGFUL +RTN: JUMPN DOITFL,NOWRTE ;NO WRITNG WHEN DOING A PROCDRE + JUMPE REMFLG,RTN1 ;NOT IN REMEMBER MODE + SKIPLE NUM ;NO NUMBER WAS TYPED + HRL CHAR,NUM ;STORE BOTH(NUM ON LEFT AND CHAR ON RIGHT + PUSH PSHPOP,CHAR ;ADD CHAR TO LIST + MOVE PNTR,RSTORE ;RESTORE OLD POSTN + .IOT TTO,PNTR + JUMPG NUM,RTN3 + MOVE PNTR,CHRZP ;RESET HORIZ SO OVERWRITE NUM, IF ANY + .IOT TTO,PNTR ;SEND IT TO TTO +RTN3: MOVE PNTR,1(TEMP) ;TTO STRING PONTR AFTER + .IOT TTO,PNTR ;TURTLE STRING POINTER + AOSN VERT ;MOVE TO NEXT LINE + PUSHJ P,OVERT ;VERTICAL OVERFLOW---NEXT COLUMN + MOVE CHAR,VERT + LSH CHAR,15. + ADD CHAR,SETV + MOVEM CHAR,SETS+1 + MOVE CHAR,CHORIZ ;CURRENT HORZNTL POS + MOVEM CHAR,SETS ;SEND STRING TO MOVE + MOVE PNTR,SETP ;TO NEW POS AND SAVE IT + .IOT TTO,PNTR +RTN1: MOVE CHAR,HOMES + SKIPLE NUM ;NO NUM TYPED + ADDI CHAR,3*2 ;SKIP OVER TYPED NUM + MOVE PNTR,CHARP + .IOT TTO,PNTR + MOVE PNTR,1(TEMP) + .IOT TTO,PNTR +NOWRTE: MOVE PNTR,(TEMP) + SKIPE STOPFL ;WAS STOP PUSHED? + JRST HALT + .IOT TURT,PNTR ;SEND STRING + SOJG NUM,NOWRTE +HALT: SKIPN OFNDFL ;DID IT GO OFF THE END? + POPJ P, ;NO, RETURN + SETZM OFNDFL + POP PSHPOP, + JRST ENDREM ;END THE PROC--TOO LONG +OVERT: MOVE CHAR,CHORIZ + ADDI CHAR,15.*2 ;NOME TO NEXT COLUMN + CAMLE CHAR,MAXHRZ ;OFF END OF SCREEN? + JRST OFFEND + MOVEM CHAR,CHORIZ + MOVEI CHAR,22. + MOVNM CHAR,VERT ;PUT VERT UP + POPJ P, +OFFEND: SOS VERT ;SEND IT TO LAST INST + SETOM ,OFNDFL + POPJ P, + FD: MOVEI TEMP,FPNTR + PUSHJ P,RTN + POPJ P, + +BACK: MOVEI TEMP,BPNTR + PUSHJ P,RTN + POPJ P, + +RIGHT: MOVEI TEMP,RPNTR + PUSHJ P,RTN + POPJ P, + +LEFT: MOVEI TEMP,LPNTR + PUSHJ P,RTN + POPJ P, + +TOOT: MOVEI TEMP,TPNTR + PUSHJ P,RTN + POPJ P, + NUMB: MOVN NUM,CHAR + ADDI NUM,66 ;GET BIN OF WHICH NUM PUSHED + MOVE CHAR,NUM + LSH CHAR,15. + ADD CHAR,NUMST + CAIN NUM,10. + MOVE CHAR,TENST + MOVE PNTR,HOMCP ;MOVE UP + .IOT TTO,PNTR + MOVE PNTR,CHARP ;WRITE NUM ON TOP + .IOT TTO,PNTR + JUMPE REMFLG,NUMB1 + MOVE PNTR,RSTORE ;GO DOWN + .IOT TTO,PNTR + MOVE PNTR,CHRZP + .IOT TTO,PNTR ;GO BACK TO OLD HORZ SO OVERWRITE OTHER NUM IF TYPED + MOVE PNTR,CHARP ;WRITE NEW + .IOT TTO,PNTR + MOVE PNTR,SAVEP + .IOT TTO,PNTR ;SAVE POSITION +NUMB1: POPJ P, + PENUP: MOVEI TEMP,PUPNTR + PUSHJ P,RTN2 + POPJ P, + +PENDWN: MOVEI TEMP,PDPNTR + PUSHJ P,RTN2 + POPJ P, + +LGHTON: MOVEI TEMP,LOPNTR + PUSHJ P,RTN2 + POPJ P, + +LGHTOF: MOVEI TEMP,LFPNTR + PUSHJ P,RTN2 + POPJ P, + +REMEM: MOVEI REMFLG,1 ;SET REMEMBER FLG + MOVE PNTR,RMP + .IOT TTO,PNTR + MOVEI NUM,6 +RLOOP: MOVE PNTR,ASTP ;INSTD OF A LONG STRNG I SEND IT 6 TIMES + .IOT TTO,PNTR + SOJN NUM,RLOOP + MOVE PNTR,RSTORE + .IOT TTO,PNTR + MOVE PNTR,CHRZP + .IOT TTO,PNTR + MOVE PNTR,RSWP + .IOT TTO,PNTR + POPJ P, +FORGET: MOVE PSHPOP,[-200,,STACK] ;REINITIALIZE POINTER + PUSHJ P,INIT + MOVEI REMFLG,0 + MOVE PNTR,FIP + .IOT TTO,PNTR + POPJ P, + +STPREM: SETZB REMFLG,NUM + MOVE PNTR,SRMP + .IOT TTO,PNTR +ENDREM: MOVE PNTR,RSTORE + .IOT TTO,PNTR + MOVE PNTR,CHRZP + .IOT TTO,PNTR + MOVE PNTR,SAVEP + .IOT TTO,PNTR + MOVE PNTR,ASTP + .IOT TTO,PNTR + POPJ P, + +DOIT: PUSHJ P,ENDREM + MOVE CHAR,HOMES + SKIPLE NUM + ADDI CHAR,3*2 + MOVE PNTR,CHARP + .IOT TTO,PNTR + MOVE PNTR,DIP + .IOT TTO,PNTR + MOVEI REMFLG,0 ;MAYBE SHOULD SAVE IT. NOT SURE +DOITN: MOVEI DOITFL,1 + PUSH P,NUM ;SAVE NUMBER + HRRZ P0,PSHPOP ;TOP BALUE + SUBI P0,STACK ;NOW P0 HAS LENGTH + JUMPE P0,DONT + MOVE P3,[STACK+002200000000] ;SET UP STACK PNTR FOR HALF WORDS +DLOOP: ILDB NUM,P3 ;LEFT HALF TO NUM + ILDB CHAR,P3 ;RIGHT HALF TO CHAR + SKIPE STOPFL ;WAS STOP PUSHED? + JRST DONT + PUSHJ P,@ADRS(CHAR) ;GO DO ROUTINE + SOJG P0,DLOOP ;DO NEXT STEP + POP P,NUM ;RESTORE SUM + SOJG NUM,DOITN ;IF DO IT N TIMES SPECIFIED + PUSH P,NUM ;SO DON'T GET MESSED UP BY EXTRA POP +DONT: SETZB DOITFL,STOPFL + POP P,NUM + MOVEI NUM,0 + POPJ P, + STACK: BLOCK 200 +PDL: BLOCK 20 +BOX0: SIXBIT / $T16/ +BOX3: 7,,(SIXBIT /T16/) +TTO3: 27,,(SIXBIT /TTY/) ;LOOK FOR CONTROL CHARACTERS + +;NOT SURE YET WHAT NUMB IT WOULD BE +INT: 0 ;REASON + 0 ;RETURN + SKIPGE INT + JRST INT0 +;NOW IS PDL OVERFLOW RTNE +;FOR NOW I'LL FORGET IT ALL + PUSHJ P,FORGET + .DISMI [MAIN] + +;NOW IS SWITCH PUSHED INTERRUPT +INT0: MOVEM NUM,SAVE + MOVEI NUM,BOX + .ITYIC NUM, + JRST INTX + ANDI NUM,77 + CAIE NUM,77 ;IS IT A STOP + JRST INTX + .RESET TURT, + .RESET BOX, ;GET RID OF ALL INPUT AND OUTPUT + SETOM STOPFL +INTX: MOVE NUM,SAVE + .DISMI INT+1 +SAVE: 0 +STOPFL: 0 +OFNDFL: 0 + +VERT: -22. + NUMST: PACK ","],"0,40,40 +TENST: PACK ","],"1,"0,40 +HOMCP: -1,,HOMEC +HOMEC: PACK ","T,","],0 +HOMES: PACK ","T,","H,8. +CHARP: -1,,CHAR ;POINTER FOR WHEN STRING IS IN AC CHAR +CHORIZ: PACK 0,0,","H,8. +HORIZ: PACK 0,0,","H,8. +MAXHRZ: PACK 0,0,","H,53. +OFENDP: -2,,OFENS +OFENS: PACK ","H,53.,","V + PACK 21.,","S,3,0 +RSTORE: -1,,RSTR +RSTR: PACK ","R,3,0,0 +CHRZP: -1,,CHORIZ +SAVEP: -1,,SAVES +SAVES: PACK ","S,3,0,0 +SETV: PACK ","V,33.,","S +SETS: 0 + 0 +SETP: -2,,SETS +RSWP: -1,,RSWS +RSWS: PACK ","S,","],3 + ADRS=.-50 + FORGET ;IN ASCII ( + DOIT ; ) + STPREM ; * + REMEM ; + + NUMB ; , + NUMB ; - + NUMB ; . + NUMB ; / + NUMB ; 0 + NUMB ; 1 + NUMB ; 2 + NUMB ; 3 + NUMB ; 4 + NUMB ; 5 + LEFT ; 6 + RIGHT ; 7 + BACK ; 8 + FD ; 9 + LGHTOF ; : + LGHTON ; ; + PENDWN ; < + PENUP ; = + TOOT ; > +;STOP IS 77 OR ? IN ASCII BUT NO RTNE IS NEC SINCE +;IT'S HANDLES ON THE INTERRUPT LEVEL + +FPNTR: -1,,FSTRG +FP: -2,,FS +FSTRG: PACK "C,"C,"C,"C,"C +BSTRG: PACK "@,"@,"@,"@,"@ +RSTRG: PACK "B,"B,"B,"B,"B +LSTRG: PACK "A,"A,"A,"A,"A +;IN ALL CASES ABOVE, 5 SINGLE STEPS +BPNTR: -1,,BSTRG +BP: -2,,BS +RPNTR: -1,,RSTRG +RP: -2,,RS +LPNTR: -1,,LSTRG +LP: -2,,LS +TPNTR: -6,,TSTRG +TP: -2,,TS +TS: PACK "T,"O,"O,"T," + PACK "],3,0,0,0 + +TSTRG: PACK "+,40,40,40,40 + PACK 40,40,40,40,40 + PACK 40,40,40,40,40 + PACK 40,40,40,40,40 + PACK 40,40,40,40,40 + PACK 40,40,40,40,40 +PUPNTR: -1,,PUSTRG +PUP: -2,,PUS +PUSTRG: PACK "8,3,0,0,0 +PDPNTR: -1,,PDSTRG +PDP: -2,,PDS +PDSTRG: PACK "0,3,0,0,0 +LOPNTR: -1,,LOSTRG +LOPN: -3,,LONS +LONS: PACK 0,"L,"I,"G,"H + PACK "T,40,"O,"N," + PACK "],3,0,0,0 + +LOSTRG: PACK "",3,0,0,0 +LFPNTR: -1,,LFSTRG +LOFP: -3,,LOFS +LOFS: PACK "L,"I,"G,"H,"T + PACK 40,"O,"F,"F," + PACK "],3,0,0,0 +LFSTRG: PACK "!,3,0,0,0 + +FS: PACK "F,"O,"R,"W,"A + PACK "R,"D,","],3 +BS: PACK "B,"A,"C,"K," + PACK "],3,0,0,0 + +RS: PACK "R,"I,"G,"H,"T + PACK ","],3,0,0 +LS: PACK "L,"E,"F,"T," + PACK "],3,0,0,0 + +PUS: PACK "P,"E,"N,40,"U + PACK "P,","],3,0 +PDS: PACK "P,"E,"N,40,"D + PACK "O,"W,"N,","] +RMP: -5,,RMS +RMS: PACK ","T,"S,"T,"A, + PACK "R,"T,40,"R,"E, + PACK "M,"E,"M,"B,"E + PACK "R,"I,"N,"G,15 + PACK ","V,10.,3,0 + +SRMS: PACK ","T,"S,"T,"O + PACK "P,40,"R,"E,"M, + PACK "E,"M,"B,"E,"R, + PACK "I,"N,"G,15,3 +SRMP: -4,,SRMS +FIS: PACK ","T,"F,"O,"R + PACK "G,"E,"T,40,"I + PACK "T,3,0,0,0 +FIP: -3,,FIS +DISS: PACK "D,"O,40,"I,"T + PACK ","],3,0,0 +DIP: -2,,DISS +ASTP: -2,,ASTS +ASTS: PACK "*,"*,"*,"*,"* + PACK "*,"*,"*,"*,"* +INITP: -2,,INITS +INITS: PACK ","C,","T," + PACK "V,11.,","S,3 +TINTP: -1,,TINTS +TINTS: PACK 151,"%,3,0,0 + + END BEGIN +  \ No newline at end of file