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:
406
src/radia/tortis.31
Normal file
406
src/radia/tortis.31
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user