aldos operator's manual

ortfero

the operator

aldos is the operating system of the aldan machine. it serves one installation, one operator and one console.

the operator is accountable for every byte on the disk.

the system

layers

the machine is built in layers, lowest first.

there is no separate kernel image and no system-call interface. a program reaches an aldos module by importing it, exactly as it reaches core/tty or a module of the operator's own.

modules

fibers

services

the tick

faults and traps

everything runs in one address space: the aldos modules, the core library, the operator's definitions and every program are modules of the one almac image, and nothing isolates one from another. a program that writes where it should not can damage anything.

booting

booting is the sequence from power-on to the first pane. the firmware needs no input and the operator cannot interrupt it.

a successful boot prints what rc.alm chooses to say — in the shipped script, two lines of heap figures — and the environment then covers it. anything else printed before the environment comes up is a diagnostic naming the step that failed.

if the boot does not reach the environment:

the environment

the environment is loom. it is the shell, and the only prompt a working machine shows.

the emergency prompt is the almac prompt inside the resident binary. it is reached when the environment cannot be compiled, when a fault reaches out of it, and when reset is typed. it offers the language and nothing else. the word loom returns to the environment.

panes

there are eight panes, one up at a time.

keypanewhat it holds
ctrl+1the listingthe working directory
ctrl+2the editorthe documents that are open
ctrl+3the readerone document, read and unchanged
ctrl+4the picture paneone picture
ctrl+5the music panea tune or a recording, and the files beside it
ctrl+6the journal panewhat the services have written, as they write it
ctrl+7the prompt's paneeverything the prompt has said
ctrl+8the debugger panea session of the debugger

the input line

the listing

keywhat it does
up, downwalk the cursor
page up, page downwalk the cursor by twenty
rightopen what the cursor is on
leftleave for the parent directory
enterwith nothing typed, open what the cursor is on
shift+enteropen the name under the cursor in the editor
ctrl+cwith nothing typed, take the file under the cursor, to be copied
ctrl+xwith nothing typed, take it to be moved
ctrl+vwith nothing typed and a file held, put it down in the directory being listed

ctrl+c, ctrl+x and ctrl+v carry a file from one directory to another.

the table fm/config carries:

endingopened with
.moffread
.almread
.pixllook
.fotolook
.plotplot
.echoplay
.songplay

the editor

keywhat it does
ctrl+swrite the document back to its file
ctrl+c, ctrl+xcopy or cut the selection, or the whole line the cursor is on when nothing is selected
ctrl+vpaste, over the selection if one stands
ctrl+qclose the document
ctrl+comma, ctrl+leftthe document before this one in the ring
ctrl+period, ctrl+rightthe document after this one in the ring
ctrl+ffind, from the cursor
ctrl+rreplace, one match at a time
ctrl+bwrite the document and compile it
ctrl+tabnext pane; with shift, back

everything else is the document's:

keywhat it does
left, rightmove by one byte
up, downmove by one row
page up, page downmove by one window
hometo the first thing on the line, then to its left edge
endto the end of the line
backspace, delremove
tabinsert two spaces
enteropen a line

a long line wraps rather than scrolling sideways, and the window follows the cursor.

the left of the document is a gutter of line numbers, always shown. they are source lines, so the wrapped continuation of a long line carries no number of its own, and neither does a row below the end of the text. a pane too narrow to carry both the numbers and the text is all text.

the reader

keywhat it does
up, downone row
page up, page downa windowful, less two rows
home, endthe top of the document, and its last page
ctrl+wthe other reading width
ctrl+qput the document down
ctrl+tabnext pane; with shift, back

the picture pane

keywhat it does
right, leftthe next, and the previous, picture in the directory
ctrl+qput the picture down
ctrl+tabnext pane; with shift, back

the music pane

keywhat it does
up, downwalk the listing
page up, page down, home, endwalk it further
enterplay what the cursor is over
right, leftthe next, and the previous, file in the listing
ctrl+qstop the music and put it down
ctrl+tabnext pane, the music playing on

the journal pane

keywhat it does
up, downone row
page up, page downa windowful, less two rows
home, endthe oldest line, and the tail, which it then follows
ctrl+tabnext pane; with shift, back

the prompt's pane

the debugger pane

keywhat it does
s, f11step one instruction
n, f10over: step, running a call to its return
o, shift+f11out: run to the return of this function
g, c, f5go
bset or clear a breakpoint at the selection
urun until the selection
up, downmove the selection a row; page up, page down a windowful
homethe selection back to the current instruction
ctrl+qend the session, and go to the prompt's pane

lines the environment reads

eight lines are read by the environment before the compiler sees them: edit, read, look, play, save, compile, journal and reset. the first seven name the pane rather than a symbol, and cannot be commands.

compiling has two shapes, because a document has two.

limits

limitvalue
the input line256 bytes
one entry, continuation lines included4096 bytes
entries a listing shows128
a name in a listing64 bytes
documents besides the scratchedit/config documents, 3
one documentedit/config document_bytes, 65536
a document readread/config max_bytes, 262144, held between 4096 and 262144
the reading widthsread/config narrow_columns, 72, and wide_columns, 0 — the whole pane
the prompt's panerepl/config screen_history_bytes, 9600, held between 4800 and 240000
lines the arrows walk backrepl/config command_history_lines, 16, held at 16
names one compiled unit may replace16
the page up and page down step20 rows

when either input limit is reached the environment refuses further input on that entry; the operator submits or abandons what is already typed. a scratch of seventeen definitions compiles once and is refused the second time, reported as incomplete.

the prompt

whatever is typed at the prompt is almac source. there are no shell commands in the unix sense.

> fn greet () {
.   tty.say "hello";
. }
> cd 'nowhere
[repl:1] unknown symbol

what a name means:

> plot '/a/samples/plots/rect.plot
> import '/a/modules/math/sieve
> sieve.bench

how a call is written:

files, volumes and devices

paths

drive a

drive a is the boot volume, and is read-write. it holds:

pathwhat it holds
/a/almac.binthe resident binary
/a/rc.almthe start-up script
/a/rcthe module the script draws its commands from
/a/corethe core library
/a/aldosthe operating-system modules
/a/modulesthe applications
/a/codexthe documents
/a/samplesthe sample pictures, tunes and recordings

the applications are one directory to a sort: text, graphics, sound, games, demos, math, net, compression, system, and loom. the samples are in pixels, fotos, plots, songs and music. whatever else is on the disk the operator put there.

drive b

where the drives differ

devices

configuration

there are two places to configure the machine, and reset is what makes a change to either take effect.

the start-up script

import 'core/file, 'core/bytes, 'core/boolean, 'core/heap,
  '/a/modules/graphics/plot

fn art () raises file.fault | bytes.fault | boolean.fault | heap.fault {
  plot.show '/a/samples/plots/vicsek.plot;
}

the environment's configuration

an app in the environment is a directory, and every one of them has a config module of the same name.

modulewhat it holds
/a/modules/loom/repl/configscreen_history_bytes, command_history_lines
/a/modules/loom/fm/configsize_column, extensions, commands
/a/modules/loom/edit/configdocument_bytes, documents

programs

resident commands

each entry gives a synopsis, the rules, and an example. no command takes an option. the lines the environment reads for itself — edit, save and compile — are described under the environment.

import

synopsis: import 'name, 'name, ...

> import '/a/modules/math/sieve
> import '/a/modules/graphics/plot, '/a/modules/games/snake

reset

synopsis: reset

> reset

tty.say

synopsis: tty.say expression, expression, ...

> tty.say "hello"
hello
> tty.say (1 + 2)
3
> tty.say "x = ", 42
x = 42

tty.sayin

synopsis: tty.sayin expression, expression, ...

> tty.sayin "x = "
> tty.say 42
x = 42

clear

synopsis: clear

> clear

date

synopsis: date

> date
2026-06-16 14:30:00

calendar

synopsis: calendar

> calendar
       july 2026            august 2026         september 2026
su mo tu we th fr sa   su mo tu we th fr sa   su mo tu we th fr sa
...

ls

synopsis: ls

> ls
almac.bin
rc.alm
rc/
core/
aldos/
modules/
codex/

lsd

synopsis: lsd 'path

> lsd '/a/modules/math
sieve.alm

cd

synopsis: cd 'path

> cd '/a/notes
/a/notes
> cd '..
/a

mkdir

synopsis: mkdir 'path

> mkdir '/a/notes

rmdir

synopsis: rmdir 'path

> rmdir '/a/notes

touch

synopsis: touch 'path

> touch '/a/notes/today

rm

synopsis: rm 'path

> rm '/a/notes/old

cat

synopsis: cat 'path

> cat '/a/notes/today
buy bread.
fix the disk light.

cp

synopsis: cp 'source, 'destination

> cp '/a/notes/today, '/a/notes/yesterday
> cp '/a/notes/today, '/b

mv

synopsis: mv 'source, 'destination

> mv '/a/notes/old, '/a/archive/old

fsck

synopsis: fsck

> fsck

services

synopsis: services

> services
no services

stop

synopsis: stop 'name

> services
  watcher
> stop 'watcher

restart

synopsis: restart 'name

> restart 'watcher

journal

synopsis: journal

> journal
watcher: started
watcher: 3 files changed

memory

synopsis: memory

> memory
pool total    : 3712kb
pool free     : 2860kb
live blocks   : 34
...

halt

synopsis: halt

> halt

reboot

synopsis: reboot

> reboot

help

synopsis: help

> help
commands:
  clear                 clear the screen
  date                  print the current date and time
...

the debugger

synopsis: launch "line". step n. over. out. go. until 'fn. stop_at 'fn. clear_at 'fn. regs. fregs. dis 'fn. code. where. kill

a session of the debugger is one compiled line, run an instruction at a time. the commands are core/debug's, bound to bare names by the start-up script. break, continue, halt and stop were already taken, hence the names stop_at, go and kill.

> import '/a/modules/math/sieve
> stop_at 'sieve.next
breakpoint 1 at sieve.next+0x0
> launch "sieve.print 30"
launched at launch+0x0
...
> go
breakpoint at sieve.next+0x0
...
> where
#0 sieve.next+0x0
#1 sieve.print+0x...
#2 launch+0x...
> clear_at ""
cleared 1 breakpoint(s)
> go
2 3 5 7 11 13 17 19 23 29
finished
> kill

applications

these are modules on the disk. the start-up script imports most of them and binds each to a bare name; the function a name stands for is given in each entry. an application the script does not import is marked as such, and is imported by hand before it is called.

edit

synopsis: edit 'path

> edit '/a/notes/today

read

synopsis: read 'path

> read '/a/codex/aldos_operators_manual.moff

look

synopsis: look 'path

> look '/a/samples/pixels/kandinsky/several_circles.pixl
> look '/a/samples/fotos/kandinsky/several_circles.foto

play

synopsis: play 'path

> play '/a/samples/songs/ode_of_joy.song
ode_of_joy.song                                playing  0:04 / 0:32
ode to joy
beethoven, ninth symphony, 1824
tempo 250 ms/row, 3 phrases, 96 rows, 4 in the chain

*> ode_of_joy.song
   flat_wave_society.song

snake

synopsis: snake

> snake

sieve

synopsis: sieve.bench. sieve.print n

> import '/a/modules/math/sieve
> sieve.bench
10
> sieve.print 30
2 3 5 7 11 13 17 19 23 29

golife

synopsis: golife.play

> import '/a/modules/demos/golife
> golife.play

plot

synopsis: plot 'path

> plot '/a/samples/plots/vicsek.plot

galaxy

synopsis: galaxy

> galaxy

jingle

synopsis: jingle

> jingle

compress

synopsis: compress 'path

> compress '/a/notes/log.moff
> lsd '/a/notes
log.moff
log.moff.lz

decompress

synopsis: decompress 'path

> decompress '/a/notes/log.moff.lz

pack

synopsis: pack 'dir

> pack '/a/notes
> lsd '/a
notes/
notes.pack

unpack

synopsis: unpack 'path

> unpack '/a/notes.pack

catalog

synopsis: catalog 'path

> catalog '/a/notes.pack
today.moff  1204
old/
  log.moff  8817

udp

synopsis: udp.echo port. udp.say "host", port, "message"

> udp.echo 7777
> udp.say "127.0.0.1", 9999, "hello"

fex

synopsis: fex.generate 'dir, 'name, 'intro. fex.generate_relay 'dir, 'name, 'addr, 'intro. fex.identity 'root. fex.publish 'root. fex.inventory 'root. fex.roster 'root. fex.fetch 'root, 'path

every command but generate takes the member's root, a directory laid out so:

pathwhat it holds
keys/node.danothe member's identity, secret and all
keys/relay.relay.danlthe relay's card, which carries its address
self/name@relay/files/the capsule: the content, and nothing else
self/name@relay/files/ inventory.danlthe relay's inventory as last known
self/name@relay/state/staging/downloads in progress
> fex.generate '/b/fex/keys, 'alice, "family photos"
> mv '/b/fex/keys/alice.dano, '/b/fex/keys/node.dano
> fex.identity '/b/fex
> fex.publish '/b/fex
> fex.inventory '/b/fex
> fex.roster '/b/fex
> fex.fetch '/b/fex, 'docs/readme.txt