mirror of
https://github.com/PDP-10/its.git
synced 2026-01-13 07:19:57 +00:00
Note: SHRDLU only works with the visual block rendering on pdp10-ka with the
Type 340 display enabled. Even then, there is some issue that causes the
SLAVE interface to the Type 340 display to fail, with an error indicating that
the 340 is not available. This is still to be tracked down.
Without the Type 340 display, SHRDLU should work reasonably well. It fails at
some things that the DEMO apparently succeeded in doing. It is not clear why,
but likely the demo was created at one point, and the SHRDLU sources were updated
after that point, breaking some things.
SHRDLU can be invoked with :SHRDLU;SHRDLU.
Once you invoke SHRDLU, you'll see output similar to this:
SHRDLU VERSION 1000 LOADED 2024-07-21 IN BLISP 2156
REFER
COMMENTS AND QUESTIONS TO DDM
VERSION
RECONSTRUCTED BY EJS
-IF YOU ARE NEAR A DEC-340
DO YOU WANT THE DISPLAY (TYPE " Y " OR " N " )
If you are running the pdp10-ka emulator, have enabled the DPY device, and want
to see the display, answer "Y". Otherwise, answer "N".
Then, after some more output you will see:
YOU ARE NOW IN A READ-EVAL-PRINT LOOP
TYPE " GO " TO ENTER READY STATE
>>>
You are now in command mode and can type various commands, such as "SHOW".
You can also type "GO" to enter ready mode. It is in ready mode that you can
issue commands like "pick up a big red block.", to which SHRDLU should
respond "OK.". Note that commands should be ended with a period (".").
Questions should be ended with an exclamation mark ("?"). An example question
might be: "what is in the box?".
MicroPlanner can be invoked with :SHRDLU;PLNR. As a simple test of MicroPlanner,
you can enter these expressions (marked with "==>" -- don't type that). If the
(THVAL ...) form results in printing "(FALLIBLE TURING)" then you know that basic
goal reaching works.
>>> TOPLEVEL
LISTENING THVAL
==> (THASSERT (HUMAN TURING))
((HUMAN TURING))
==> (DEFPROP THEO1 (THCONSE (X) (FALLIBLE $?X) (THGOAL (HUMAN $?X))) THEOREM)
THEO1
==> (THASSERT THEO1)
THEO1
==> (THVAL (THGOAL (FALLIBLE TURING) (THTBF THTRUE)) NIL)
(FALLIBLE TURING)
230 lines
5.0 KiB
Tcl
230 lines
5.0 KiB
Tcl
proc log_progress {x} {
|
|
puts ""
|
|
puts "$x"
|
|
puts [exec date]
|
|
puts ""
|
|
}
|
|
|
|
log_progress "ENTERING MAIN BUILD SCRIPT"
|
|
|
|
puts ""
|
|
puts "BUILDING $mchn ITS"
|
|
puts ""
|
|
|
|
# If the environment variable BASICS is set to "yes", only build
|
|
# the basics; ITS, tools, infastructure.
|
|
if {![info exists env(BASICS)]} {
|
|
set env(BASICS) "no"
|
|
}
|
|
|
|
# If the MACSYMA environment variable is set, then we'll use
|
|
# it later to decide whether to build Macsyma. If it is not set,
|
|
# maintain current behavior of building Macsyma.
|
|
|
|
if {![info exists env(MACSYMA)]} {
|
|
set env(MACSYMA) "yes"
|
|
}
|
|
|
|
# If the NODUMP environment variable is set, don't do the final full
|
|
# dump.
|
|
|
|
proc cleanup {} {
|
|
global spawn_id
|
|
close -i $spawn_id
|
|
sleep 1
|
|
exec kill [exp_pid $spawn_id]
|
|
}
|
|
|
|
proc abort {} {
|
|
puts ""
|
|
puts "The last command timed out."
|
|
exit 1
|
|
}
|
|
|
|
exit -onexit cleanup
|
|
trap {exit 1} {SIGINT SIGTERM}
|
|
|
|
proc type s {
|
|
sleep .1
|
|
foreach c [split $s ""] {
|
|
send -- $c
|
|
if [string match {[a-zA-Z0-9]} $c] {
|
|
expect -nocase $c
|
|
} else {
|
|
expect "?"
|
|
}
|
|
sleep .03
|
|
}
|
|
}
|
|
|
|
proc respond { w r } {
|
|
expect -exact $w
|
|
type $r
|
|
}
|
|
|
|
proc patch_its_and_go {} {
|
|
# Disable SYSJOB output (e.g. "IT IS NOW ...") that appears at random
|
|
# places during the build process.
|
|
respond "\n" "styo+2/popj p,\r"
|
|
respond "\n" "\033g"
|
|
}
|
|
|
|
proc pdset {} {
|
|
expect "IN OPERATION"
|
|
sleep 1
|
|
type "\032"
|
|
|
|
respond "Fair" ":pdset\r"
|
|
set t [timestamp]
|
|
respond "PDSET" [expr [timestamp -seconds $t -format "%Y"] / 100]C
|
|
type [timestamp -seconds $t -format "%y%m%dD"]
|
|
type [timestamp -seconds $t -format "%H%M%ST"]
|
|
type "!."
|
|
expect -exact "DAYLIGHT SAVINGS TIME? " {
|
|
type "N"
|
|
expect "\n"
|
|
} "\n" {
|
|
}
|
|
type "Q"
|
|
expect ":KILL"
|
|
}
|
|
|
|
proc shutdown {} {
|
|
global emulator_escape
|
|
respond "*" ":lock\r"
|
|
respond "_" "5kill"
|
|
respond "GO DOWN?\r\n" "y"
|
|
respond "BRIEF MESSAGE" "\003"
|
|
respond "_" "q"
|
|
expect ":KILL"
|
|
respond "*" ":logout\r"
|
|
respond "SHUTDOWN COMPLETE" $emulator_escape
|
|
}
|
|
|
|
proc ip_address {string} {
|
|
set x 0
|
|
set octets [lreverse [split $string .]]
|
|
for {set i 0} {$i < 4} {incr i} {
|
|
incr x [expr {256 ** $i * [lindex $octets $i]}]
|
|
}
|
|
format "%o" $x
|
|
}
|
|
|
|
# Respond to the output from (load ...).
|
|
proc respond_load { r } {
|
|
expect -re {[\r\n][0-9]+\.? *[\r\n]}
|
|
type $r
|
|
}
|
|
|
|
proc build_macsyma_portion {} {
|
|
respond "*" "complr\013"
|
|
respond "_" "\007"
|
|
respond "*" "(load \"liblsp;iota\")"
|
|
respond_load "(load \"maxtul;docgen\")"
|
|
respond_load "(load \"maxtul;mcl\")"
|
|
respond_load "(load \"maxdoc;mcldat\")"
|
|
respond_load "(load \"libmax;module\")"
|
|
respond_load "(load \"libmax;maxmac\")"
|
|
respond_load "(progn (print (todo)) (print (todoi)) \"=Build=\")"
|
|
expect "=Build="
|
|
respond "\r" "(mapcan "
|
|
type "#'(lambda (x) (cond ((not (memq x\r"
|
|
type "'(DUMMY)\r"
|
|
type ")) (doit x)))) (append todo todoi))"
|
|
set timeout 1000
|
|
expect {
|
|
";BKPT" {
|
|
type "(quit)"
|
|
}
|
|
"NIL" {
|
|
type "(quit)"
|
|
}
|
|
}
|
|
set timeout 100
|
|
}
|
|
|
|
set timeout 100
|
|
proc setup_timeout {} {
|
|
# Don't do this until after you've called "spawn", otherwise it'll cause a
|
|
# read from stdin which will return EOF if stdin isn't a tty.
|
|
expect_after timeout abort
|
|
}
|
|
|
|
proc mkdir {name} {
|
|
respond "*" ":print $name;..new. (udir)\r"
|
|
expect "FILE NOT FOUND"
|
|
type ":vk\r"
|
|
}
|
|
|
|
proc move_to_klfe {file} {
|
|
copy_to_klfe $file
|
|
respond "*" ":delete $file\r"
|
|
}
|
|
|
|
set ip [ip_address [lindex $argv 0]]
|
|
set gw [ip_address [lindex $argv 1]]
|
|
|
|
source $build/mark.tcl
|
|
source $build/basics.tcl
|
|
|
|
if {$env(BASICS)!="yes"} {
|
|
source $build/misc.tcl
|
|
source $build/$cpu/processor.tcl
|
|
source $build/lisp.tcl
|
|
if {$env(MACSYMA)=="yes"} {
|
|
source $build/macsyma.tcl
|
|
}
|
|
source $build/scheme.tcl
|
|
source $build/dm.tcl
|
|
source $build/muddle.tcl
|
|
source $build/zork.tcl
|
|
source $build/sail.tcl
|
|
source $build/typeset.tcl
|
|
source $build/shrdlu.tcl
|
|
}
|
|
|
|
bootable_tapes
|
|
|
|
# Make BACKUP directory and copy some important files there.
|
|
|
|
mkdir "backup"
|
|
|
|
respond "*" ":copy .; @ its, dsk0: backup;\r"
|
|
respond "*" ":copy .; @ ddt, dsk0: backup;\r"
|
|
respond "*" ":copy .; @ $salv, dsk0: backup;\r"
|
|
respond "*" ":copy sys; ts ddt, dsk0: backup;\r"
|
|
respond "*" ":copy sys; ts dump, dsk0: backup;\r"
|
|
respond "*" ":copy sys; ts midas, dsk0: backup;\r"
|
|
|
|
if [file exists $build/mchn/$mchn/custom.tcl] {
|
|
source $build/mchn/$mchn/custom.tcl
|
|
}
|
|
|
|
# Set timestamp for current uptime record.
|
|
respond "*" ":create sys;record time\r"
|
|
respond "for help" "\003"
|
|
expect ":KILL"
|
|
respond "*" ":sfdate sys;record time, 0/0/00\r"
|
|
|
|
if {![info exists env(NODUMP)]} {
|
|
# make output.tape
|
|
respond "*" $emulator_escape
|
|
create_tape "$out/output.tape"
|
|
type ":dump\r"
|
|
respond "_" "dump links full list\r"
|
|
respond "LIST DEV =" "tty\r"
|
|
respond "TAPE NO=" "1\r"
|
|
expect -timeout 6000 "REEL"
|
|
respond "_" "rewind\r"
|
|
respond "_" "icheck\r"
|
|
expect -timeout 6000 "_"
|
|
type "quit\r"
|
|
}
|
|
|
|
shutdown
|
|
quit_emulator
|
|
|
|
puts ""
|
|
puts "MAIN BUILD SCRIPT DONE"
|
|
puts [exec date]
|