dseagrav / ld Goto Github PK
View Code? Open in Web Editor NEWLambdaDelta
License: GNU General Public License v2.0
LambdaDelta
License: GNU General Public License v2.0
When restoring the system tape one gets the following,
File is "Exp 130.0, 11/11"; 22453 blocks.
Default partition to load into is LOD1
reading 22453 blocks into LOD1.
copying 22453 blocks from "bigtape" to "LOD1"
copy done
band did not end with an EOF mark.
Skipping to next file ...
Next file ...
File doesn't start with LMFL
Skip to next file? (y/n)
Skipping forward in the tape ends with,
tape error 0x9 (end of tape)
command=2C control=8000 asked=6000 transferred=400 actual=1
bufaddr=59710000 drivestat=58 cmdstat=C9
End of tape.
Writing unit 0 label
The resulting disk manages to get SDU via the console, but "config" is not available.
Full log follows:
$ telnet localhost 3637
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SDU Monitor version 8
>> init
SDU Monitor version 8
>> /tar/setup clear eagle sp shell
setup version 25
> /tar/load
using 220K in slot 9
load version 307
(creating block-22 mini-label)
(creating mini-label)
Disk is eagle
Loading "/tar/bigtape"
Loading "/tar/st2181"
Disk unit 0 needs to be initialized:
Disk has no label, or mini-label is wrong.
Create new unit 0 label from scratch? (y/n) y
Creating lisp label from scratch.
How many LAMBDA processors: 1
Type "?" for command list.
load > install
*****************************************************
The new backup label track number is 16340.
Record this number and keep it with the machine.
*****************************************************
Writing unit 0 label
Using half-inch tape
Installing track-0 disk driver ...
copying 10 blocks from "/tar/disk" to "disk"
copy done
Tape-ID = "FRED gm 7/23/86 12:33:34 522520414 "
File is "SDU5 3.0 rev 14"; 1500 blocks.
"SDU5 3.0 rev 14" wants to be loaded into UNX6.
reading 1500 blocks into UNX6.
copying 1500 blocks from "bigtape" to "UNX6"
copy done
band did not end with an EOF mark.
Skipping to next file ...
Next file ...
Tape-ID = "FRED gm 7/23/86 12:33:35 522520415 "
File is "ulambda ver 1762"; 256 blocks.
"ulambda ver 1762" wants to be loaded into LMC1.
reading 256 blocks into LMC1.
copying 256 blocks from "bigtape" to "LMC1"
copy done
band did not end with an EOF mark.
Skipping to next file ...
Next file ...
Tape-ID = "FRED gm 7/23/86 12:33:36 522520416 "
File is "ulambda ver 1762"; 256 blocks.
"ulambda ver 1762" wants to be loaded into LMC2.
reading 256 blocks into LMC2.
copying 256 blocks from "bigtape" to "LMC2"
copy done
band did not end with an EOF mark.
Skipping to next file ...
Next file ...
File is "Exp 130.0, 11/11"; 22453 blocks.
Default partition to load into is LOD1
reading 22453 blocks into LOD1.
copying 22453 blocks from "bigtape" to "LOD1"
copy done
band did not end with an EOF mark.
Skipping to next file ...
Next file ...
File doesn't start with LMFL
Skip to next file? (y/n)
On MacOS 10.14.4, after "autoconf -f", the following seems to indicate a missing file in the repo:
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
....
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: error: cannot find input file: `tools/Makefile.in'
Not everything involving SM-stepping is known or implemented.
BIOCSSEESENT (or the more modern BIOCSDIRECTION) don't exist on OpenBSD's BPF implementation.
Beeping is currently done by my old hack which looks at writes on the keyboard serial port and occasionally outputs a Ctrl-G to make a beep.
A cooler way is to capture calls to the XBEEP routine in the microcode, and instead call some SDL Audio code and then jumping to XFALSE. The attached code implements this, and now SYS:DEMO;BEEPS (mostly) works.
It REQUIRES the RIGHT VERSION of the ulambda.lmc-sym file to be installed, in order to find the XBEEP and XFALSE symbols. (OK, the most recent one in the dj_full archive has the right addresses, matching the more recent microcode in release 5.)
Caveat: not tried with SDL1, but "should work".
When trying to restore the 00_install.tap (http://bitsavers.org/bits/LMI/lambda/00_install.tap) from Bitsavers in the current master of ld, it fails to to restore the LOD partition and LMC partition. It works if one tries using 0.98.1.
According to http://bitsavers.org/bits/LMI/lambda/0x_tap.txt:
It differs from a real tools tape in that there is a double EOF after the band images. The SDU expects some kind of indication of end-of-file that I don't know about yet, so this makes it proceed in the right order anyway (albeit with complaints)
Might have something to do with that?
Right now the config file support directly integrates the configuration variables and their types. The config file/variable handling should be independent, so:
/opt/ld/share/ld.conf
for site-wide config and ~/ld.conf
for per-user config)While trying to list a tape, I got this strange segfault:
Assertion '!e->dead' failed at pulse/mainloop.c:254, function mainloop_defer_enable(). Aborting.
Thread 4 "SDLAudioP1" received signal SIGABRT, Aborted.
[Switching to Thread 0x7ffff2966700 (LWP 29033)]
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt full
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
set = {__val = {234975239, 140737336089633, 0, 13897781614037987840, 4, 93825024178528, 0, 140737336097593, 93825024270272, 93825024178528, 93825024258656, 140737336170286, 93825024270272, 140737336098616, 93824992331216, 93825024178528}}
pid = <optimized out>
tid = <optimized out>
ret = <optimized out>
#1 0x00007ffff7b4c535 in __GI_abort () at abort.c:79
save_stage = 1
act = {__sigaction_handler = {sa_handler = 0x1, sa_sigaction = 0x1}, sa_mask = {__val = {13897781614037987840, 0, 36, 93825027829216, 93825027807144, 93825027806688, 140737350027145, 0, 8, 93825027794400, 8, 140737263328400, 140737336553409, 1, 93825027794400, 140737263328400}}, sa_flags = -140592660, sa_restorer = 0x7ffff7a07237}
sigs = {__val = {32, 0 <repeats 15 times>}}
#2 0x00007ffff79eb9f5 in ?? () from /lib/x86_64-linux-gnu/libpulse.so.0
No symbol table info available.
#3 0x00007ffff6f597f1 in ?? () from /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-12.2.so
No symbol table info available.
#4 0x00007ffff6f59bb9 in ?? () from /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-12.2.so
No symbol table info available.
#5 0x00007ffff6f5a40a in ?? () from /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-12.2.so
No symbol table info available.
#6 0x00007ffff79eccb8 in pa_mainloop_dispatch () from /lib/x86_64-linux-gnu/libpulse.so.0
No symbol table info available.
#7 0x00007ffff79ecf8c in pa_mainloop_iterate () from /lib/x86_64-linux-gnu/libpulse.so.0
No symbol table info available.
#8 0x00007ffff7f34cc7 in ?? () from /lib/x86_64-linux-gnu/libSDL2-2.0.so.0
No symbol table info available.
#9 0x00007ffff7e9195b in ?? () from /lib/x86_64-linux-gnu/libSDL2-2.0.so.0
No symbol table info available.
#10 0x00007ffff7edae8c in ?? () from /lib/x86_64-linux-gnu/libSDL2-2.0.so.0
No symbol table info available.
#11 0x00007ffff7f4e119 in ?? () from /lib/x86_64-linux-gnu/libSDL2-2.0.so.0
No symbol table info available.
#12 0x00007ffff6faafa3 in start_thread (arg=<optimized out>) at pthread_create.c:486
ret = <optimized out>
pd = <optimized out>
now = <optimized out>
unwind_buf = {cancel_jmp_buf = {{jmp_buf = {140737263331072, 2301452079668870344, 140737488347614, 140737488347615, 140737263331072, 93825027788256, -2301476480502252344, -2301467449764266808}, mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}}
not_first_call = <optimized out>
#13 0x00007ffff7c2380f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
No locals.
(gdb)
Perhaps you can stuff "newboot -a" into a keyboard buffer at the right instant?
As the title asks, is there a way to change the SDL window width?
I've read that the original monitor was 800x1024 (portrait) and would like to set it to that. (I tile my windows to half the screen and it's slightly oversized for a standard HD display.)
Cache is not implemented
You can't map some SDL key to the lambda CapsLock key. (The code for it is missing.)
It'd be useful to specify where to look for ROM files in the config file, that would allow someone to run a prebuilt copy of LambdaDelta more easily.
There’s an unused symbol FILE *logout;
in sdu_hw.c that can conflict with some operating systems unless renamed.
Symptom: When the Lambda system is up while the host system goes to sleep, the RTC time falls behind.
Diagnosis: the RTC is based on counting cycles (see sdu_clock_pulse in sdu.c), not elapsed time.
Solution: use gettimeofday() to see how many seconds actually elapsed between calls to sdu_clock_pulse (when rtc_cycle_count >= 5000000) rather than assuming one second. A call to gettimeofday takes about 3.8e-8 s on my system.
Perhaps I see this only because I tell SDL to allow the screensaver to run, but I think this should be handled. (Will produce a patch.)
%BEEP support is non-existant when linking against SDL1 causing a undefined reference to xbeep(). Requiring the use of --disbale-no-xbeep
.
It looks like the initial name of the machine when using the new tape images should be "LISPM-A" rather than "LAMBDA-A". If you use the latter, the machine gets no chaosnet address and refers to itself as AMNESIAC.
Edit: since these and other details of installation may become increasingly more dependent on the system releases themselves, perhaps those notes should move to that distribution. I didn't want to propose a PR for this until there was a public repository for it, though.
It's unnecessarily awkward to configure key mappings, since it requires you to look up scancode values. It would be more convenient to just input key names.
The headers <linux/if.h> and <net/if.h> both define IFF_??? macros on GNU/Linux.
In file included from 3com.c:40:0:
/usr/include/net/if.h:44:5: error: redeclaration of enumerator ‘IFF_UP’
IFF_UP = 0x1, /* Interface is up. */
^
/usr/include/linux/if.h:79:2: note: previous definition of ‘IFF_UP’ was here
IFF_UP = 1<<0, /* sysfs */
^~~~~~
/usr/include/net/if.h:46:5: error: redeclaration of enumerator ‘IFF_BROADCAST’
IFF_BROADCAST = 0x2, /* Broadcast address valid. */
^
/usr/include/linux/if.h:80:2: note: previous definition of ‘IFF_BROADCAST’ was here
IFF_BROADCAST = 1<<1, /* __volatile__ */
^~~~~~~~~~~~~
/usr/include/net/if.h:48:5: error: redeclaration of enumerator ‘IFF_DEBUG’
IFF_DEBUG = 0x4, /* Turn on debugging. */
^
/usr/include/linux/if.h:81:2: note: previous definition of ‘IFF_DEBUG’ was here
IFF_DEBUG = 1<<2, /* sysfs */
^~~~~~~~~
/usr/include/net/if.h:50:5: error: redeclaration of enumerator ‘IFF_LOOPBACK’
IFF_LOOPBACK = 0x8, /* Is a loopback net. */
^
/usr/include/linux/if.h:82:2: note: previous definition of ‘IFF_LOOPBACK’ was here
IFF_LOOPBACK = 1<<3, /* __volatile__ */
^~~~~~~~~~~~
/usr/include/net/if.h:52:5: error: redeclaration of enumerator ‘IFF_POINTOPOINT’
IFF_POINTOPOINT = 0x10, /* Interface is point-to-point link. */
^
/usr/include/linux/if.h:83:2: note: previous definition of ‘IFF_POINTOPOINT’ was here
IFF_POINTOPOINT = 1<<4, /* __volatile__ */
^~~~~~~~~~~~~~~
/usr/include/net/if.h:54:5: error: redeclaration of enumerator ‘IFF_NOTRAILERS’
IFF_NOTRAILERS = 0x20, /* Avoid use of trailers. */
^
/usr/include/linux/if.h:84:2: note: previous definition of ‘IFF_NOTRAILERS’ was here
IFF_NOTRAILERS = 1<<5, /* sysfs */
^~~~~~~~~~~~~~
/usr/include/net/if.h:56:5: error: redeclaration of enumerator ‘IFF_RUNNING’
IFF_RUNNING = 0x40, /* Resources allocated. */
^
/usr/include/linux/if.h:85:2: note: previous definition of ‘IFF_RUNNING’ was here
IFF_RUNNING = 1<<6, /* __volatile__ */
^~~~~~~~~~~
/usr/include/net/if.h:58:5: error: redeclaration of enumerator ‘IFF_NOARP’
IFF_NOARP = 0x80, /* No address resolution protocol. */
^
/usr/include/linux/if.h:86:2: note: previous definition of ‘IFF_NOARP’ was here
IFF_NOARP = 1<<7, /* sysfs */
^~~~~~~~~
/usr/include/net/if.h:60:5: error: redeclaration of enumerator ‘IFF_PROMISC’
IFF_PROMISC = 0x100, /* Receive all packets. */
^
/usr/include/linux/if.h:87:2: note: previous definition of ‘IFF_PROMISC’ was here
IFF_PROMISC = 1<<8, /* sysfs */
^~~~~~~~~~~
/usr/include/net/if.h:64:5: error: redeclaration of enumerator ‘IFF_ALLMULTI’
IFF_ALLMULTI = 0x200, /* Receive all multicast packets. */
^
/usr/include/linux/if.h:88:2: note: previous definition of ‘IFF_ALLMULTI’ was here
IFF_ALLMULTI = 1<<9, /* sysfs */
^~~~~~~~~~~~
/usr/include/net/if.h:67:5: error: redeclaration of enumerator ‘IFF_MASTER’
IFF_MASTER = 0x400, /* Master of a load balancer. */
^
/usr/include/linux/if.h:89:2: note: previous definition of ‘IFF_MASTER’ was here
IFF_MASTER = 1<<10, /* __volatile__ */
^~~~~~~~~~
/usr/include/net/if.h:69:5: error: redeclaration of enumerator ‘IFF_SLAVE’
IFF_SLAVE = 0x800, /* Slave of a load balancer. */
^
/usr/include/linux/if.h:90:2: note: previous definition of ‘IFF_SLAVE’ was here
IFF_SLAVE = 1<<11, /* __volatile__ */
^~~~~~~~~
/usr/include/net/if.h:72:5: error: redeclaration of enumerator ‘IFF_MULTICAST’
IFF_MULTICAST = 0x1000, /* Supports multicast. */
^
/usr/include/linux/if.h:91:2: note: previous definition of ‘IFF_MULTICAST’ was here
IFF_MULTICAST = 1<<12, /* sysfs */
^~~~~~~~~~~~~
/usr/include/net/if.h:75:5: error: redeclaration of enumerator ‘IFF_PORTSEL’
IFF_PORTSEL = 0x2000, /* Can set media type. */
^
/usr/include/linux/if.h:92:2: note: previous definition of ‘IFF_PORTSEL’ was here
IFF_PORTSEL = 1<<13, /* sysfs */
^~~~~~~~~~~
/usr/include/net/if.h:77:5: error: redeclaration of enumerator ‘IFF_AUTOMEDIA’
IFF_AUTOMEDIA = 0x4000, /* Auto media select active. */
^
/usr/include/linux/if.h:93:2: note: previous definition of ‘IFF_AUTOMEDIA’ was here
IFF_AUTOMEDIA = 1<<14, /* sysfs */
^~~~~~~~~~~~~
/usr/include/net/if.h:79:5: error: redeclaration of enumerator ‘IFF_DYNAMIC’
IFF_DYNAMIC = 0x8000 /* Dialup device with changing addresses. */
^
/usr/include/linux/if.h:94:2: note: previous definition of ‘IFF_DYNAMIC’ was here
IFF_DYNAMIC = 1<<15, /* sysfs */
^~~~~~~~~~~
In file included from 3com.c:48:0:
/usr/include/net/if.h:111:8: error: redefinition of ‘struct ifmap’
struct ifmap
^~~~~
In file included from 3com.c:40:0:
/usr/include/linux/if.h:189:8: note: originally defined here
struct ifmap {
^~~~~
In file included from 3com.c:48:0:
/usr/include/net/if.h:126:8: error: redefinition of ‘struct ifreq’
struct ifreq
^~~~~
In file included from 3com.c:40:0:
/usr/include/linux/if.h:226:8: note: originally defined here
struct ifreq {
^~~~~
In file included from 3com.c:48:0:
/usr/include/net/if.h:176:8: error: redefinition of ‘struct ifconf’
struct ifconf
^~~~~~
In file included from 3com.c:40:0:
/usr/include/linux/if.h:278:8: note: originally defined here
struct ifconf {
^~~~~~
Apparently only the newest versions of autotools actually work. If you have issues with autothings, download the latest tar.gz release instead of cloning the git repository. The tar.gz releases have the autotools-generated stuff. The git repository doesn't because git is not a release, it's what is used to make releases.
Symptom: in the Backup tool, middle-click on "Rewind/Unload". The emulator halts.
This is quite surprising and annoying, I'd say.
Rather than use printf
directly for logging, there should be some logging API used that supports a concept of log levels and subsystems, where levels can be set per-subsystem either on the command line or via the config file. (Or in the future even possibly changed at runtime via a config menu.)
When not having a YAML config, it seems that ld doesn't boot into the SDU ... but explicitly setting SDU in the YAML config to one makes it work.
Sorry for vague report, I'll see about getting a few more details and fill in.
The keyboard input for me is quite haphazard, entering one key results more often than not in two simultaneous key presses. Same behavior is with SDL1 and SDL2.
Need-fetch is inoperative. Fetches happen on every macroinstruction.
When running the emulator I get the following output when the lispm tries to use DHCP, in addition to time out errors on the console.
(I set logging to 10.)
This is with cap_net_admin enabled (or root)
3COM: TBSW given to interface: Packet offset 1974, length 74
3COM: Sending 78 bytes
ether:write(): Input/output error
3COM: TBSW given to interface: Packet offset 1974, length 74
3COM: Sending 78 bytes
ether:write(): Input/output error
3COM: TBSW given to interface: Packet offset 1974, length 74
3COM: Sending 78 bytes
ether:write(): Input/output error
3COM: TBSW given to interface: Packet offset 1974, length 74
3COM: Sending 78 bytes
ether:write(): Input/output error
3COM: TBSW given to interface: Packet offset 1974, length 74
3COM: Sending 78 bytes
ether:write(): Input/output error
Without cap_net_admin, it fails to access the tun device with the following
3COM: TBSW given to interface: Packet offset 1974, length 74
3COM: TBSW given to interface: Packet offset 1974, length 74
3COM: TBSW given to interface: Packet offset 1974, length 74
3COM: TBSW given to interface: Packet offset 1974, length 74
3COM: TBSW given to interface: Packet offset 1974, length 74
VCMEM: Memory Control Reg Read
VCMEM: Memory Control Reg Write: 0x28
VC 0 BLACK-ON-WHITE MODE now 1
VCMEM: Memory Control Reg Read
VCMEM: Memory Control Reg Write: 0x38
VC 0 BLACK-ON-WHITE MODE now 0
3COM: RESET
ether_init(): Operation not permitted
3COM: AMSW given to interface: Our address is 00:02:9C:55:89:C6
3COM: TBSW given to interface: Packet offset 546, length 1502
3COM: TBSW given to interface: Packet offset 546, length 1502
There is no need, and it's quite undesirable, to disable the screensaver. It just happens to be the default for SDL, for some reason.
Rather than expect ld.conf
in the current working directory, LambdaDelta should look in standard locations.
Even with a properly configured disk and ROMs, ld doesn't enter the SDU on the console.
But if one copies the exact same disks, ROMs and configuration files to a GNU/Linux system everything runs as expected.
The Lambda screen was huge at its time, but with a virtual screen it could be even larger. For address space reasons it seems only up to 1024 in height could work (without microcode changes).
I get the following error when trying to build on Kubuntu 20.04
gcc -std=gnu99 -Wall -Wextra -ggdb -g -O2 -DXBEEP -D_REENTRANT -I/usr/include/SDL2 -DSDL2 -Wno-packed-bitfield-compat -Og -DSYSCONFDIR=/usr/local/etc -lm -o lam 3com.o lambda_cpu.o mem.o sdu.o smd.o tapemaster.o kernel.o nubus.o sdu_hw.o syms.o vcmem.o -lSDL2 -lyaml
/usr/bin/ld: kernel.o: undefined reference to symbol 'sin@@GLIBC_2.2.5'
/usr/bin/ld: /lib/x86_64-linux-gnu/libm.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.