<dostoyevsky2>
nikolapdp: what kind of compilers support the pdp these days?
<nikolapdp>
mainline gcc
<nikolapdp>
though i didn't use it
rustyy has quit [Ping timeout: 240 seconds]
bauen1 has quit [Ping timeout: 264 seconds]
<dostoyevsky2>
> pdp11 | L IC qr b e
<dostoyevsky2>
Didn't realize that gcc supports pdp11 :)
rustyy has joined #osdev
<zid>
pdp11 is basically just at&t intel asssembly output but with different reg names isn't it? :P
<nikolapdp>
kek fewer registers and less ram :P
<zid>
assembler doesn't care about how much ram you have
<zid>
and that's all gcc cares about, spitting out something an assembler can read
<nikolapdp>
not wrong
<dostoyevsky2>
once I have my irc client I could try to compile it with gccgo for pdp11
<clever>
zid: but gcc doesnt entirely understand segmentation, so early x86 stuff wouldnt play well
<nikolapdp>
dostoyevsky2: yeah i wouldn't bt on that wroking lol
<nikolapdp>
clever: luckily pdp-11 doesn't use segmentation
<zid>
The cpu barely understands its own segmentation :P
<nikolapdp>
it's paging with like 8k pages, and there's 64k of address space lol
<zid>
286 and 386 disagree, and then we killed it off by the 586
<zid>
nikolapdp: It's a gameboy!
<zid>
It also does 8kB bank switching, and 64kB of address space
<nikolapdp>
double that if you're lucky, (64k instruction address space, 64k data address space)
<nikolapdp>
also the bsd2.11 kernel doesn't fit in the address space, so the linker is genereating cursed remapping code when accessing symbols from certain object files
<dostoyevsky2>
nikolapdp: does your irc client on the pdp11 support sasl?
<zid>
bank switching woo
<nikolapdp>
had to fiddle with that to get the networking kernel to fit kek
<zid>
it's literally a gameboy
<clever>
but does gcc understand bank switching? :D
<nikolapdp>
dostoyevsky2 define sasl
<zid>
you can use overlays, clever, in the linker script
<zid>
to produce binaries that work correctly with bank switching
<nikolapdp>
yeah well this pdp-11 thing works only for the kernel because it's the only thing that has access to all of ram and can remap it
<zid>
psx uses it but doesn't even have a bankswitcher, your thunk has to make the cd-rom deliver fresh sectors
<nikolapdp>
so you're still stuck with at most 128k of ram for the processes
<zid>
which is why say, the final fantasy VI port, takes about 5 seconds to pause the game
<nikolapdp>
heh
<zid>
it's unloading the game exe, and loading the menu exe back from the cd-rom
<nikolapdp>
is it running the whole time
<zid>
with a little bit of shared memory for your saved game
<zid>
so that it can restore the state
<zid>
FF7 also does this, and has a few bugs you can exploit, where the shared memory region has a 'scratch' space that accidentally gets reused in a couple of places
<zid>
think of it like the 6502 zero page
<nikolapdp>
kek
<zid>
where a subroutine might re-use a 00xx address for its locals/params of another subroutine
<clever>
i had also looked into how some of the c64 bank switching works, and it looks like the cpu itself has a couple gpio pins
<clever>
which modify how the PAL do the addr decoding
<nikolapdp>
6502 zero page is probably more accurately described as a bunch of registerst than ram
<zid>
yea you can conceieve of it that way and it works as an abstraction
<dostoyevsky2>
nikolapdp: how large is your irc client, so it fits in the 64kb limit?
<zid>
but it's definitely just ram
<nikolapdp>
eh i'd have to close it to check
<nikolapdp>
kek give me a bit
<nikolapdp>
zid: it is ram, but you use it like it's regisrters
<nikolapdp>
was my point
nikolapdp has quit [Remote host closed the connection]
<bslsk05>
github.com: bsd2-src/lib/ccom at master · retroprom/bsd2-src · GitHub
<nikolar>
yeah something like that
<dostoyevsky2>
It seems to me they've split the c compiler into many independent binaries to have them all fit into the 64k limit
<nikolar>
looks like it
<nikolar>
there's also pcc
netbsduser has joined #osdev
<nikolar>
cd
<dostoyevsky2>
nikolar: but the 64k limit is for the whole system or just per process?
* Ermine
goes to home dir
<nikolar>
dostoyevsky2: per process, there are pdp-11s with up to 4mb
<nikolar>
though per process you can go up to 128k on some models which allow split instruction and data address spaces
<nikolar>
Ermine: ls
<Ermine>
there's a lot of shit there, and I don't want to get banned for flooding
osdev199 has joined #osdev
<dostoyevsky2>
nikolar: ah, cool... so maybe I could even write a irc client for the pdp11 if I just use exec.Command a lot
navi has joined #osdev
<dostoyevsky2>
(in Go that is)
<nikolar>
dostoyevsky2: eh yeah but it would be painfully slow
<nikolar>
and you'd need to write your own stdlib
<nikolar>
(cc is indeed painfully slow when running the emulator at real machine speeds)
<dostoyevsky2>
go's stdlib is written in go
<nikolar>
yeah, but it certainly wasn't written with bsd2.11 on pdp-11 in mind
<dostoyevsky2>
but not sure if gccgo can actually cross compile
<nikolar>
yeah wouldn't now
<nikolar>
know
scaleww has joined #osdev
[Kalisto] has joined #osdev
foudfou has quit [Remote host closed the connection]
foudfou has joined #osdev
hussein has joined #osdev
<nikolar>
is geist around
<Mondenkind>
i think geist is ahuman
<GeDaMo>
Be alert, we need more lerts :P
<Mondenkind>
and also arottingsackofshitwhostolemyhusband (allegedly) but i digress
<nikolar>
Mondenkind: i sense some unresolved issues there
<Mondenkind>
None.
<nikolar>
convincing
bauen1 has joined #osdev
Renfield has quit [Ping timeout: 268 seconds]
netbsduser has quit [Ping timeout: 252 seconds]
Matt|home has joined #osdev
Renfield has joined #osdev
scaleww has quit [Quit: Leaving]
foudfou has quit [Remote host closed the connection]
foudfou has joined #osdev
gildasio has quit [Remote host closed the connection]
gildasio has joined #osdev
netbsduser has joined #osdev
osdev199 has quit [Ping timeout: 268 seconds]
nikolapdp has joined #osdev
nikolapdp has quit [Remote host closed the connection]
Turn_Left has joined #osdev
nikolapdp has joined #osdev
<nikolapdp>
ello
Left_Turn has quit [Ping timeout: 255 seconds]
<Mutabah>
o/
scaleww has joined #osdev
teardown has quit [Ping timeout: 260 seconds]
foudfou has quit [Remote host closed the connection]
foudfou has joined #osdev
joe9 has joined #osdev
dmxvlx has joined #osdev
rustyy has quit [Ping timeout: 268 seconds]
kof673 has joined #osdev
zetef has joined #osdev
edr has joined #osdev
rustyy has joined #osdev
dmxvlx has quit [Quit: Konversation terminated!]
goliath has quit [Quit: SIGSEGV]
dmxvlx has joined #osdev
dmxvlx has quit [Client Quit]
joe9 has quit [Quit: leaving]
dmxvlx_ has joined #osdev
dmxvlx_ has quit [Quit: Konversation terminated!]
bradd has quit [Ping timeout: 252 seconds]
dmxvlx has joined #osdev
zetef has quit [Ping timeout: 268 seconds]
dmxvlx has quit [Quit: Konversation terminated!]
zetef has joined #osdev
osdev199 has joined #osdev
MiningMarsh has quit [Ping timeout: 268 seconds]
foudfou has quit [Remote host closed the connection]
foudfou has joined #osdev
MiningMarsh has joined #osdev
neo has quit [Read error: Connection reset by peer]
neo has joined #osdev
neo has quit [Read error: Connection reset by peer]
neo has joined #osdev
zetef has quit [Ping timeout: 268 seconds]
bauen1 has quit [Ping timeout: 252 seconds]
zetef has joined #osdev
dalme has joined #osdev
op has quit [Remote host closed the connection]
xenos1984 has quit [Ping timeout: 268 seconds]
xenos1984 has joined #osdev
Shaddox404 has joined #osdev
<Shaddox404>
Hello
<Shaddox404>
Hope its going well for yall
zetef has quit [Remote host closed the connection]
<Shaddox404>
A quick question: To develop an operating system in current day and age, would it be wise to start off by writing code in Rust or to use C/C++?
<nortti>
what is it exactly that you are aiming to do?
<zid>
That's a very nuanced decision
<zid>
and not a cut and dry "rust is stupid"
<zid>
(rust is stupid, though)
<Ermine>
Do you understand you're throwing shit at the fan by asking such a question?
<kof673>
"wise" means double in ye olde tongue :D
<Ermine>
Also, "C/C++" is blatantly incorrect. C and C++ are two different languages
<Shaddox404>
I'm currently learning about OSes and system software. I was curious since Windows and parts of Linux are being (re)written in Rust
<Ermine>
that's their decision
<zid>
note: parts of
<zid>
And was a very complicated decision, and only applies to those parts
<Ermine>
you're writing your own os, and there are decisions that are up to you to make
<Shaddox404>
As far as what i understand, since an OS is vast and large in size in terms of scope and code, would writing the OS completely in Rust help in the development in terms of ease and speed?
<zid>
no, hinder it massively
<nortti>
it depends on what you're aiming at
<zid>
Rust is hard to write in exchange for more invariants being proveably true
<Ermine>
also, nortti's question is a very good one
<zid>
C is fast and loose, comparitively
<Mondenkind>
reminds me. there was this whole thing about rust vs linux concurrency models. but rust's guarantees are useless for concurrent code, so why not just sidestep the problem and say rust only runs in sequential contexts inside of linux and has to rely on c to do any communication?
<nortti>
right, if you're wanting to write the next seL4, it's probably less work with a language where you don't have to built your own verification tooling for *everything*
<Shaddox404>
I know my questions may look noob-ish, but I just want to understand more about it, my apologies for that.
<zid>
why not
<zid>
learn each language then
<zid>
Then you can know, and not just have a brief overview from a random person on irc
<Shaddox404>
>it depends on what you're aiming at
<Shaddox404>
I feel windows is inconsistent
<Ermine>
there's nothing to undestand but 1) your goals; 2) the language you're going to use
<Ermine>
s/going/considering/
<nortti>
Shaddox404: inconsitent how?
<netbsduser>
Shaddox404: i asked a windows kernel engineer about this "rewrite in rust" about which everyone is speaking
<netbsduser>
he confirmed that there is none
<netbsduser>
the only thing being rusticated is win32k, which shouldn't be in the kernel anyway
<Ermine>
correct, nobody will rewrite the whole thing in rust
<Ermine>
It's extremely costly and risky
<zid>
Rust is good as a systems language, it's actually rather poor as a kernel language
<Shaddox404>
I see
<zid>
So you might want to write the font rasterizer in it, as an example
<zid>
which was in the kernel originally, but got moved to userspace because of frequent exploits
<netbsduser>
i am inclined to agree
foudfou has quit [Remote host closed the connection]
foudfou has joined #osdev
<netbsduser>
rust has considerable merit for some relatively low-level systems software but inside the kernel, assuming your kernel is trying to be somewhat good, you are going to be hit in the face by the fact that you need things like frightening concurrency
<nortti>
there are OSs written fully (fsvo fully, you're always going to need a bit of assembly) in rust which can take advantage of the things the compiler can prove true, e.g. hubris (https://cliffle.com/blog/on-hubris-and-humility/), but those make the tradeoff for reliability vs performance vs developer productivity that makes sense for the specific applications
<bslsk05>
cliffle.com: On Hubris And Humility - Cliffle
<netbsduser>
fearless concurrency won't cut it, you will have to resort to loads of unsafe code if you want to use common idioms used to scale the monstrously shared state of a kernel
<dostoyevsky2>
I heard that one of the microsoft engineers actually ported all of windows to Rust over a weekend, but then it was abandoned because it was "too trivial"
<zid>
Like, even a video game is really really hard to write in Rust
<zid>
enough that it would slow development down to a crawl
<zid>
because rapid prototyping and rust do not go hand in hand, you need to extensively allay the compiler's fear that you might be mutating state without having taken exclusive ownership of it
<zid>
like, rand() is incredibly difficult to write in rust
<zid>
and it doesn't get much more basic than that in say, C#
bauen1 has joined #osdev
<dostoyevsky2>
The best thing about the port was that it required only one highly localized unsafe
k_hachig has joined #osdev
<Shaddox404>
Got some clarity from this. Appreciate it folks!
Shaddox404 is now known as [AFK]
k_hachig_ has joined #osdev
[AFK] is now known as Shaddox404
Shaddox404 has left #osdev [Connection Terminated!]
k_hachig has quit [Ping timeout: 268 seconds]
k_hachig has joined #osdev
k_hachig_ has quit [Ping timeout: 255 seconds]
k_hachig has quit [Ping timeout: 255 seconds]
k_hachig has joined #osdev
jjuran has quit [Read error: Connection reset by peer]
jjuran has joined #osdev
xenos1984 has quit [Ping timeout: 256 seconds]
gog has joined #osdev
<dinkelhacker>
Why would it be hard to rapidly prototype in rust? Couldn't you just use unsafe everywhere to silence the borrow checker and deal with it later?
<zid>
why write in rust then
<zid>
dealing with it later is called technical debt btw
<zid>
and it won't ever happen
k_hachig has quit [Ping timeout: 268 seconds]
gog has quit [Client Quit]
<nortti>
also unsafe does not turn off the usual shared xor mutable reference stuff, it just lets you do stuff like dereference pointers and ignore types
<dinkelhacker>
I mean chances are that you still have a good portion of your code beeing safe rust. That's a plus imo. And I mean how would an implementation in C be better regarding to tech debt? If the compiler complains it's because he thinks something is potentially unsafe. If it's not, using unsafe is absolutely fine. If it is and you don't deal with it thats bad if no matter what language.
<dinkelhacker>
nortti: Ah right, that's true.
<zid>
'most of it being safe' defeats *all* of the guarentees still.
<nortti>
it does mean the amount of code the nasal demons are coming from is already narrowed down a lot when you start digging
<zid>
doesn't mean the bug isn't in the safe part though :P
gog has joined #osdev
<zid>
garbage in garbage out
<Mondenkind>
nortti: no because unsafe code can violate the invariants of safe code and cause them ot fail at a great distance
<dinkelhacker>
well at least you can rule out some bugs in the safe part, can't you?
<zid>
sure, but I can do that in all situations in all languages
<zid>
Infact I probably get *more* guarentees in a C program, because of strict TU boundaries and stuff
<zid>
that bugs in a specific file are caused by that file
<Mondenkind>
??
<nortti>
< Mondenkind> nortti: no because unsafe code can violate the invariants of safe code and cause them ot fail at a great distance ← yes, but you know the part that is the root cause has to be one of the unsafe blocks in such case
<zid>
or you don't
<zid>
because the unsafe part isn't the part that was supposed to check the valdity of a state
<zid>
before the unsafe part saw it
<zid>
that's *why* the invariant failed and the unsafe part crashed
<Mondenkind>
zid: no that's not how unsafe works
<zid>
unsafe function that divides a by b
<zid>
I pass it 10 divided by 0
<Mondenkind>
unsafe is supposed to check the validity of a state. if it doesn't there's a bug in unsafe
<Mondenkind>
because ub
<Mondenkind>
(div by 0 is i believe not ub in rust)
<Mondenkind>
(so that example doesn't work anyway)
<zid>
part of using unsafe is that.. it's unsafe, and if you want it not to crash, someone has to not pass it state configurations that are going to crash
<zid>
same as say, free(7);
<zid>
or strcpy("bob", "cat");
<Mondenkind>
you don't understand how unsafe in rust works at all
<zid>
nobody says strcpy should pointer check, and bounds check, they say don't pass crap to strcpy
<zid>
or free or anything else
<nortti>
^ that is the difference with rust – if it's callable from safe code, and it's possible to UB, it is *culturally* considered to be a bug inherently
xenos1984 has joined #osdev
Etabeta1 has quit [Ping timeout: 256 seconds]
foudfou has quit [Remote host closed the connection]
<dostoyevsky2>
I want to write an OS as a shell script
foudfou has joined #osdev
<dinkelhacker>
But in what shell is your OS running then?
<mjg>
powershell
gog is now known as pog
<Ermine>
hi mjg
<mjg>
sup
<dinkelhacker>
mjg: I think it should be self hosted
<dostoyevsky2>
dinkelhacker: you just `exec $0 --just-the-shell-please'
<dostoyevsky2>
otherwise you'd be starting a new kernel/vm I guess
<geist>
nikolar: yawn
<Mondenkind>
compile sh to asm
<Mondenkind>
write memory allocators and device drivers in sh
<Mondenkind>
implement the sh compiler in sh too
<pog>
a self-hosting sh
<pog>
we're reinventing forth
<zid>
Smello poog
<mjg>
awk is the best assembler
<zid>
I went outside today :(
<pog>
me too
<pog>
proud of you
<zid>
I did see an interesting car at least?
* Ermine
gives pog a piece of sh
<Mondenkind>
i haven't gone otuside yet fuck
<zid>
A fuck ugly jaguar SUV, but it had the numberplate G6
<pog>
me too, it was a lotus
<zid>
Half a million quid numberplate that
<pog>
idk what model, it was just the most ostentatious sports car i'd ever seen
<Ermine>
I didn't go out today, it's raining
<pog>
_the_ sports car
<zid>
I see a lot of supercars, but not seen any cool hypercars
<mjg>
you into cars dawg
<Mondenkind>
it's only 11 here though i still have time gonna go thrifting maybe
<zid>
there's a lot of saudi people that attend the college here
<zid>
they ask their dad for a car to run-about the city with
<mjg>
11? it's already too late
<zid>
and end up with a lambo
<Ermine>
but i did continue cleaning up the flat
<mjg>
yo wasted the day man
<pog>
i know enough about cars to know that the monthly cost of maintaining a supercar is more than my rent
<mjg>
get a more expensvie apt
<Mondenkind>
ty for your insightful comments mjg
<mjg>
problem solved
<pog>
working on it
<zid>
The joke here is: "Dad, the other kids take the train!" "Fine, I'll buy you an intercity commuter 440"
<mjg>
Mondenkind: you are welcome mate, anytime
<Ermine>
maintaining a supercar is more expensive than my organs
<zid>
supercar maint is cheap.. until anything goes wrong, which it will
<zid>
almost all of them you see will be leased for that reason
<zid>
they tank in value off the lot and need sending back to the dealer constantly
<mjg>
a rust programmer and a c programmer walk into a bar
<mjg>
what can i get ya, asks the bartender
<mjg>
rust programmer says "soy milk"
<mjg>
c programmer says "bleach"
<mjg>
it's ok if you don't think it's funny
<Mondenkind>
cringe tbh
<mjg>
^^^ genz
* Ermine
giggles
<GeDaMo>
I don't get it :|
<Ermine>
cringe fr
<Mondenkind>
ok boomer at least i'm not insecure about eating quiche
<mjg>
there has to be a good dad joke regarding fearlezz rust
<Mondenkind>
lesbians?
<mjg>
idk 2 rust programmers fearlessly walk down the corridor and deadlock
scaleww has quit [Quit: Leaving]
<Ermine>
the story should involve losing a child
<FireFly>
I mean lesbians and deadlock would track I guess
* mjg
checks channel name
<zid>
"help I've tribbed and I can't get up"?
Gooberpatrol66 has joined #osdev
<pog>
mjg: did you know taht i'm mixing web dev with osdev
<dostoyevsky2>
nikolar: I thought it'd be documented much better because they had all this time to write the documentation
<geist>
it's kinda a mess. but i think the only thing that actually has anything to do with it is the set dz stuff
<geist>
and there's another thing at the bottom that moves dz to 310 for some reason
<nikolar>
dostoyevsky2: yeah all dozen users of it lol
<geist>
i dont precisely know what vector is in this context. irq maybe, but it know it doesn't have that many irq levels. only 7
<geist>
the CSR when it talks about it is the address of the MMIO registers though, in octal
<nikolar>
Eh maybe the mmio address of some kind
<nikolar>
Though if I remember correctly, all memory mapped registers are at high addresses
<geist>
disks traditionally start at 0172150 for example
<dostoyevsky2>
nikolar: fun fact: the spanish intern who wrote the first software documentation was called Manual, which is why it's called that since then
<geist>
yeah i think that's high in octal. iirc 0177777 is 4MB-1
<nikolar>
Yeah something like that
<geist>
and since the address space of the biggest pdp11s ever made is 4MB... that's why that's a high address
<bslsk05>
<corbet> On the radar: using a large-language model to insert thousands of automatically generated "security checks" into the OpenBSD kernel:https://marc.info/?l=openbsd-tech&m=171810103406609&w=2I'm sure that will be received well...
<bslsk05>
en.m.wiktionary.org: manual - Wiktionary, the free dictionary
<geist>
kinda interesting, later on you can put QBUS cards (18 and 22 bit versions) in a VAX
<geist>
so there's a bunch of VAX stuff to punch out the hole <4MB to let the mmio registers are in there and do a bunch of DMA bounce buffering
<nikolar>
Heh nice
<geist>
basically just like ISA and whatnot in the PC world when x86s got > 1MB
<nikolar>
Got to love backwards compatibility
<geist>
a proper unibus or massbus or whatnot card can address the whole 32bit world, but QBUS was a late, simpler, cost reduced bus used mostly on later LSI versions of PDP and later microvaxen
<bslsk05>
gunkies.org: QBUS - Computer History Wiki
<geist>
ah "To reduce the number of gates needed on devices to decode their addresses, the QBUS includes a special signal, BBS7, to indicate a reference to the device registers in the 'I/O page' of the bus address space. Devices need to look at only this signal and address lines 0 through 12 to recognize their address(es). (Some QBUS CPUs do not even drive the high address lines during references to the I/O page.)"
<dostoyevsky2>
geist: use an llm to port openbsd's source to rust... could probably be done in a couple of hours... might not compile yet because AI predicted what Rust would look like in a couple of years, so you just have to wait until then
<geist>
that explains why the CSR configuration is entirely within the computer itself, you're mapping things by slot basically to particular addresses
<geist>
dostoyevsky2: eh? what the heck are you talking about?
<dostoyevsky2>
kof673: so, does the es-shell have a syscall handler, or you would that be part of "extending the shell's builtin services"?
nikolapdp has quit [Remote host closed the connection]
<kof673>
i'm just saying it already has metaproperties...but would need whatever dependencies first
<kof673>
wings but no runway yet
<dostoyevsky2>
I guess one could extends sh's trap syntax, so you could write a syscall handler
<geist>
i dunno what path you're goin o here, but building an os in sh is nnot an OS. it's just another shell
<geist>
as much as i'm generally all into doing whatever you want, etc and leaning. i can tell you from experience that this idea you have is not the first. i've seen this countless times over the years
<geist>
but there's really no point, you're just writing something that kinda looks like a new OS, but thats not an OS
<geist>
it's just another shell
<kof673>
there is also an old ancient ....16-bit dos mssh i think was the name :D
<geist>
think of the shell as a UI for the underlying system. you can change the ui (different text mode shell, graphical, etc) but it is mostly a layer on top of the underlying kernel/system/drivers/etc
<geist>
even somethingl ike dos, the shell is logically separate (command.com) on top of an underlying dos system service
<dostoyevsky2>
Aren't the likes of Smalltalk and LispOSes just large interpreters that run code without any separation between the OS and the user-supplied programs?
<nikolar>
yeah seems same
<geist>
nikolar: what i dunno is if you're gonna need to rebuild the kernel or not
<nikolar>
i mean it looks like it's looking for it
<nikolar>
what was the remap vector line again
<nikolar>
ah found it
<geist>
see above paste. i pasted the whole boot.ini
<geist>
what i dunno is exactly *when* dtab is used. it may be used during compilation of the kernel, instead of run time?
edr has quit [Read error: Connection reset by peer]
<dostoyevsky2>
> An alternative that is common with operating systems on smaller computers (PCs, workstations) is to execute virtually all OS software in the context of a user process. The view is that the OS is primarily a collection of routines the user calls to perform various functions, executed within the environment of the user’s process. When an interrupt, trap, or supervisor call occurs, the processor is
<geist>
or maybe it's run time, but it's just trying to match a CSR/vector with a driver that is supposed to exist
<dostoyevsky2>
placed in kernel mode and control is passed to the OS. To pass control from a user program to the OS, the mode context is saved and a mode switch takes place to an operating system routine. However, execution continues within the current user process.
<kof673>
> The view is that the OS is primarily a collection of routines the user calls <<<<<<<<<<<<<<<<<<<<
<nikolar>
hm added the remap vector thing
<nikolar>
same output again
<nikolar>
do i need the dli/dlo device too
<nikolar>
it's in your config
<geist>
try it
<nikolar>
oh never mind, it's commented out
<geist>
i didn't build that config, came from the pidp11 process
<geist>
which is why it's so messy, i'd rearrange if :)