1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-25 17:58:40 +00:00

TORTIS - toddler's own recursive turtle interpreter system.

Published with permission from Radia Perlman.
This commit is contained in:
Lars Brinkhoff
2019-05-02 13:06:09 +02:00
parent 9959392ca7
commit fac7abf5ef
4 changed files with 412 additions and 1 deletions

406
src/radia/tortis.31 Normal file
View File

@@ -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