Das Betriebssystem          

Das Betriebssystem unterteilt sich in vier Teile: Im unteren Adressbereich (0000h - 7FFFh) sind der Kernel und das Dateisystem untergebracht. Der obere Adressbereich (8000h - FFFFh) beherbergt den Basic-Interpreter und die kShell. Diese Trennung wurde nötig, da das Betriebsystem so gewaltig anwuchs, dass es nicht mehr in einem einzigen 32kb-Eprom unterzubringen war.


Inhaltsverzeichnis:

Der Kernel
Das Dateisystem
Der Basicinterpreter
Die kShell
   Gerätenummern
   Kommandos
   Umleitungen und Pipes
   Umgebungsvariablen
   Starten von Programmen



Der Kernel
Der Kernel (engl. "Kern") enthält alle wichtigen Betriebsystem-Funktionen. Er ist für die Speicherverwaltung zuständig und enthält den Interrupt-Händler. Des weiteren beherbergt er alle Treiber, die zum ansprechen der angeschlossenen Geräte benötigt werden, z.B. Tastatur-, LCD-, RS232- und Drucker-Treiber. In ihm ist natürlich auch das Datei-Subsystem untergebracht, das es erst ermöglicht, über File-Handles Dateien und Treiber zu öffnen.



Das Dateisystem
Das Dateisystem ist proprietär, das heißt, dass es eine absolute Eigenentwicklung und zu nichts anderem kompatibel ist. Es ist auf Silicon-Disks (z.B. batteriegepuffertes SRAM) zugeschnitten und entfaltet dort seine volle Geschwindigkeit. Es werden alle gängigen DOS-Funktionen unterstützt, wie z.B. Unterverzeichnisse und eine Undelete-Funktion. Es kann Laufwerke mit einer maximalen Größe von 16 Mb verwalten, daher macht es wenig Sinn, eine Festplatte anzuschließen (wer braucht überhaupt die vielen Gigabytes an Speicher, wenn der Prozessor nur einen Adressraum von 64kb hat?)



Der Basic-Interpreter
Den Basic-Interpreter habe ich mir vom Commodore 64 abgeguckt. Ich hatte damals viele Basic-Erweiterungen für den C64 geschrieben, so dass ich den Code des Basic-Interpreter-ROMs schon fast im schlaf auswendig aufsagen konnte ;-). So lag es also nahe, den Basic-Interpreter für mein System nachzuprogrammieren, damit ich auch die alten CBM-Basic-Programme auf meinem Computer ausführen kann. Das Basic brauche ich hier somit nicht näher zu beschreiben; wer etwas über die Kommandos wissen möchte, braucht nur in das C64 Benutzerhandbuch gucken ;-). Aber eins sei noch gesagt: Die altbekannten peek's, poke's und sys' funktionieren natürlich nicht, sie führen höchstens zum Absturz des Systems. Wenn man aber alte Basic-Programme ausführen möchte, die mittels poke's auf den Bildschirmspeicher zugreifen, sollte man mit dem Kommando 'trap 1' diese pokes 'entschärfen'.
Hier ist eine (unvollständige) Liste der Befehle, die ich zusätzlich zu den CBM-Kommandos in meinen Interpreter eingebaut habe:

adr(Ausdruck) Funktion. Liefert Speicheradressen zurück. Wird eine positive Zahl angegeben, wird sie als Basic-Zeilennummer interpretiert und die Funktion liefert die Startadresse der Basiczeile im Speicher zurück. Wird eine Stringvariable (z.B. a$) als Ausdruck angegeben, so wird deren Adresse im Speicher zurückgeliefert.
deek(adr) Funktion. Wie peek(), liefert aber eine 16Bit-Zahl zurück: peek(adr)+256*peek(adr+1)
dez("string") Funktion. Wandelt eine hexadezimale Zahl (string) in eine Dezimalzahl (Integer) um.
env$("var") Funktion. Gibt den Inhalt der angegebenen Umgebungsvariable zurück.
hex$(integer) Funktion. Wandelt eine integer Zahl in eine hexadezimale Zahl (string) um.
lib nr,func,x,y, oa,ox,oy Bibliotheksfunktion 'func' der Bibliothek 'nr' aufrufen. x und y sind Eingabeparameter, oa, ox und oy stehen für Variablen, die die Ausgabeparameter zugewiesen bekommen. Alle Parameter sind ganze Zahlen im Bereich von 0 bis 255. Parameter können auch weggelassen werden.
maxx(0) Funktion. Liefert die Breite des Bildschirms/Terminals zurück
maxy(0) Funktion. Liefert die Höhe des Bildschirms/Terminals zurück
cls Bildschirm löschen
doke adr,wert Wie poke, jedoch für 16Bit-Zahlen: poke adr,wert%256 : poke adr+1,wert/256
exit Beendet den Basic-Interpreter und kehrt zur kShell zurück
help Listet alle Kommandos und Funktionen auf
old Holt ein durch "new" gelöschtes Basicprogramm zurück
setenv "string" Setzt eine Umgebungsvariable. Der String muss folgendes Format haben: "Variablenname=Variablenwert" (vgl. set-Kommando der kShell)
shell Startet eine neue Instanz der kShell. Wird ein Befehls-String angegeben, so wird der Befehl sofort von der Shell verarbeitet und zur Basic-Eingabeaufforderung zurückgekehrt ("ready.")
trap Schaltet die peek/poke/sys-Falle ein, wenn der Parameter '1' angegeben wird. Der Basic-Interpreter versucht dann, die altbekannten peeks, pokes und sys' des C64 auf die eigenen internen Adressen umzuleiten. Ein 'poke 53281,x' bewirkt somit z.B. die Veränderung der Hindergrundfarbe auch auf dem MyCPU-System.



Die kShell
Dies ist die "Kernel Shell". Sie ist eine Art "DOS-Eingabeaufforderung", mit der sich das System bedienen und steuern lässt. In der Tat versteht sie viele DOS-Kommandos, aber auch ein paar Unix-Kommandos sind dabei. Bei den DOS-Kommandos ist darauf zu achten, dass das System den Backslash "\" nicht oder nur teilweise kennt. Es ist darum besser, wie unter Unix immer den Schrägstrich "/" zu verwenden. Wie unter DOS gibt es auch bei meinem Betriebsystem Laufwerke, jedoch werden sie nicht von A: bis Z: gezählt, sondern von 0: bis 15:. Der Grund dafür lässt sich im Basic-Interpreter finden, da er nur mit Geräte-"adressen" umgehen kann (z.B. load "datei" ,8,1). Hier folgt nun eine Liste der verschiedenen Geräte:

 Gerät  Alias  Beschreibung
0:   Tastatur
1: COM1: Erste serielle Schnittstelle
2: COM2: Zweite serielle Schnittstelle
3: CON: Bildschirm (+Tastatur)
4: PRN: Drucker (automatische Konvertierung von PETSII nach ASCII und Anfügen von LF nach CR)
5: LPT1: physikalischer Druckeranschluss (keine Konvertierung der Druckdaten)
6:   frei (später evt. Sound-Device)
7:   frei
8:   erstes Massenspeichergerät (vgl. MS-DOS: "A:")
15:   letztes Massenspeichergerät (vgl. MS-DOS: "H:")


Durch diese Gerätebezeichnungen ist es z.B. möglich, folgende Konstrukte in der Shell einzugeben:

copy con: 8:/datei.txt Erzeugt eine Datei. Der text wird am Bildschirm eingegeben. Abbruch durch CTRL-C + Enter.
copy 8:/datei.txt con: Gibt die soeben erzeugte Datei auf dem Bildschirm aus.
copy 8:/datei.txt prn: Gibt die Datei auf dem Drucker aus.
copy com1: lpt1: Empfängt Daten von der seriellen Schnittstelle und gibt sie auf dem Drucker aus.




Beschreibung der kShell-Kommandos


attrib [+a | -a] [+h | -h] [+r | -r] [[Gerät:][Pfad]Dateiname]
Setzen bzw. zurücksetzen von Dateiattributen. Im Dateinamen können Joker-Zeichen verwendet werden. Werden keine Attribute angegeben, so werden die momentan gesetzten Attribute der spezifizierten Datei ausgegeben. Wird kein Dateiname angegeben, werden alle Dateien des aktuellen Verzeichnisses mit ihren Attributen aufgelistet. Das Attribut 'D' bezeichnet ein Unterverzeichnis.

basic [Kommando]
Startet den Basic-Interpreter. Wird ein Kommando angegeben, so wird dieses vom Basic-Interpreter ausgeführt und der Interpreter beendet sich.

call Adresse [accu [xreg [yreg [-c] [-z] [-v]]]]
Ruft eine Maschinensprache-Unterroutine auf. Zusätzlich zur Startadresse der Routine können noch die Registerwerte und Flags als Aufrufparameter mitgegeben werden. Wird eines der Flag-Kennzeichner -c/-z/-v angegeben, so wird das entsprechende Flag beim Routinenaufruf auf eins gesetzt. Über dieses call-Kommando können Unterroutinen im Kernel (0000h-7FFFh) und in der ersten RAM-Seite (8000h-FFFFh) aufgerufen werden.

cd [[Gerät:][Pfad]]
Wechselt das aktuelle Gerät und/oder den Pfad. Wird kein Parameter angegeben, so wird das aktuelle Gerät und der Pfad ausgegeben.

chkdsk [-f] [Gerät:]
Prüft das angegebene Gerät auf Fehler und repariert sie automatisch. Der Parameter -f zwingt chkdsk dazu, einen vollständigen Gerätetest durchzuführen.

cls
Säubert den Bildschirm.

coldstart
Führt einen Kaltstart (Reset) des Systems durch.

console  lcd | screen | tty | ttydisp | ttykeyb | keyb
Wählt die Konsole für Tastatur-Eingaben und Bildschirm-Ausgaben."tty" bezeichnet die erste serielle Schnittstelle. Die Schnittstellenparameter werden auf 115200 baud, 8 Datenbits, 1 Stoppbit, keine Parität und Hardware-Handshake gestellt. "lcd" schaltet auf LCD-Betrieb und impliziert die Benutzung der lokalen Tastatur. "screen" verhält sich genauso, texte werden auf dem angeschlossenen Bildschirm ausgegeben (ist noch nicht implementiert).

copy [Gerät:][Pfad]Dateiname(Quelle) [+ [G:][P]Datei [+ [G:][P]Datei]] [Gerät:][Pfad]Dateiname(Ziel)
Kopiert Dateien. Quelle und Ziel können Joker-Zeichen (* und ?) enthalten. Der Befehl kann auch dazu benutzt werden, um mehrere Deteien miteinander zu verbinden (a + b + c = d). Wird als Ziel nur ein Pfad angegeben, so muss dieser durch einen Schrägstrich ("/") abgeschlossen werden, um dem System zu verdeutlichen, dass keine Datei gemeint ist.

date [tt.mm.jjjj]
Setzt das aktuelle Tagesdatum. Werden Tag, Monat und Jahr nicht als Parameter mit angegeben, so fragt das System selber nach. Wenn dann keine Eingabe gemacht wird, bleibt das Datum unverändert.

deltree [Gerät:][Pfad]Verzeichnis
Löscht das angegebene Verzeichnis mit samt seinen Unterverzeichnissen. Joker-Zeichen sind im Verzeichnisnamen nicht erlaubt.

del [Gerät:][Pfad]Dateiname
Löscht eine oder mehrere Dateien. Der Dateiname kann Joker-Zeichen enthalten. Versehentlich gelöschte Dateien können mit dem Kommando "undel" zurückgeholt werden.

dir [Gerät:][Pfad][Dateiname] [-a] [-o] [-p]
Listet den Inhalt des angegebenen Verzeichnisses auf. Der Parameter -a zeigt auch versteckte Dateien an. Der Parameter -o führt zur sortierten Ausgabe (noch nicht implementiert). Der Parameter -p zeigt den Inhalt seitenweise an.

df [Gerät:]
Zeigt den freien Speicher auf dem angegebenen Gerät an. Wird kein Gerät angegeben, wird der freie Speicher aller Geräte angezeigt.

echo [text]
Gibt den angegebenen Text auf dem Bildschirm aus. Der Text kann in Anführungszeichen stehen, um die Ausgabe zu formatieren (z.B. Ausgabe führender Leerzeichen). Die Anführungszeichen werden nicht mit gedruckt. Folgt direkt nach dem hinteren Anführungszeichen ein Semikolon, so wird kein Zeilenumbruch gedruckt.

exit
Beendet die aktuelle Instanz der kShell.

format Gerät:
Löscht alle Daten auf dem angegebenen Gerät und bereitet es für die Datenspeicherung vor.

goto Label
Dieser Befehl steht nur in Shell-Skripten zur Verfügung. Die Skriptausführung wird beim angegebenen Label fortgesetzt. Ein Label wird durch ein vorangestellten Doppelpunkt markiert. (vgl. MSDOS Batchdateien)

if Ausdruck1 Operator Ausdruck2 Befehl
Dieser Befehl steht nur in Shell-Skripten zur Verfügung. Er Vergleicht die beiden Ausdrücke 1 und 2 über den angegeben Operator miteinander. Nur wenn das Ergebis des Vergleichs war (true) ist, wird der angegebene Befehl ausgeführt. Es stehen folgende Operatoren zur Verfügung: = (gleich), <> (ungleich), < (kleiner), > (größer), <= (kleiner oder gleich), >= (größer oder gleich). Die zu vergleichenden Ausdrücke können Zeichenketten und dezimale Zahlen sein.

info Wert
Gibt Systemspeziefische Informationen in Abhängigkeit von der Zahl "Wert" aus.

help
Listet alle Kommandos auf, die die kShell versteht.

kshell [Kommando]
Startet eine neue Instanz der Shell. Wird ein Kommando angegeben, so wird dieses ausgeführt und die Instanz der Shell wieder beendet.

load Dateiname Startadresse [RAM-Seite [ROM-Seite]]
Lädt eine Datei in den Arbeitsspeicher an die angegebene Startadresse. Zusätzlich kann die Seitennummer einer RAM- bzw. ROM-Seite angegeben werden, um die Datei in sonst unzugänglichen Speicher zu laden.

md [Gerät:][Pfad]Verzeichnis
Erzeugt ein neues Unterverzeichnis

mode COM1|COM2:baud,Datenbits,Stoppbits,Parität,Handshake
Stellt den Modus einer seriellen Schnittstelle ein. "Datenbits" und "Stoppbits" sind Zahlenwerte. "Parität" kann "n" (keine), "e" (gerade) oder "o" (ungerade) sein. "Handshake" kann "n" (keins), "h" (Hardware-RTS/CTS) oder "s" (Software-XON/XOFF) sein.

move [Gerät:][Pfad]Verzeichnis(alt) [Gerät:][Pfad]Verzeichnis(neu)
Verschiebt ein Verzeichnis (nur innerhalb eines Gerätes) oder benennt es um.

pwd
Gibt das aktuelle Gerät und den aktuellen Pfad aus.

ramdrive [-n] [-r] Größe [Gerät:]
Erzeugt ein RAM-Laufwerk zur Datenspeicherung. Die "Größe" ist ein Zahlenwert und beschreibt die gewünschte Laufwerksgröße in Kilobyte. "Gerät" gibt die Gerätenummer an, wenn keine Gerätenummer angegeben wird, wird das nächste freie Gerät belegt. Der Parameter -n führt beim Anlegen eines Lauferks dazu, dass der belegte Speicher nicht formatiert wird. Dafür wird aber ein 'chkdsk' ausgeführt. Wird der Parameter -r angegeben, wird das Laufwerk wieder gelöscht. Werden gar keine Parameter angegeben, wird der Laufwerkstatus angezeigt (Ramdrive installiert oder nicht).

rd [Gerät:][Pfad]Verzeichnis
Löscht ein Unterverzeichnis. Das Unterverzeichnis muss leer sein, bevor es gelöscht werden kann.

ren [Gerät:][Pfad]Dateiname(alt) Dateiname(neu)
Benennt eine Datei um.

save Dateiname Startadresse Endadresse [RAM-Seite [ROM-Seite]]
Speichert den angegeben Speicherbereich in eine Datei. Um sonst unzugänglichen Speicher sichern zu können, können zusätzlich die Nummern der RAM- und ROM-Seiten angegeben werden.

set [Variablenname[=NeuerWert]]
Weist einer Umgebungsvariable einen Wert zu. set ohne Parameter gibt den Inhalt aller definierten Umgebungsvariablen auf dem Bildschirm aus. set gefolgt von einem Variablennamen gibt nur den Inhalt der spezifizierten Variable aus. Umgebungsvariablen werden durch zwei %-Zeichen referenziert, beispielsweise gibt ein 'echo %path%' den aktuellen Suchpfad aus.

shift
Dieser Befehl steht nur in Shell-Skripten zur Verfügung. Er bewirkt das Schieben der Aufrufparameter: %0 bekommt den Wert von %1, %1 den Wert von %2 und so weiter. Durch diese Maßnahme können mehr als nur 10 Parameter in Skripten verarbeitet werden.

stack
Gibt den aktuellen Stand des Stack-Pointers aus. Der Stack-Pointer bewegt sich Rückwerts, ein FFh bedeutet, dass kein Stack-Speicher belegt ist.

status
Gibt den Status der letzten Operation aus (Bitmaske). 0 bedeutet, dass kein Fehler vorliegt.

term Bitmaske
Stellt Terminal-Parameter über eine Bitmaske ein. Hier eine Liste mit gängigen Terminals und den zugehörigen Bitmasken: ANSI-Terminal=$00, Hyperterm=$30, Linux=$10, VT100 kompatibles Terminal=$04, XTERM=$20

time [hh:mm:ss]
Setzt die aktuelle Uhrzeit. Werden Stunde, Minute und Sekunde nicht als Parameter mit angegeben, so fragt das System selber nach. Wenn dann keine Eingabe gemacht wird, bleibt die Uhrzeit unverändert.

type [Gerät:][Pfad]Dateiname
Gibt den Inhalt der angegebenen Datei auf dem Bildschirm aus.

undel [Dateiname]
Rettet eine bereits gelöschte Datei. Wenn kein Dateiname angegeben wird, werden alle Dateien, die zurückgeholt werden können, aufgelistet.

ver
Gibt die Version der kShell aus.

warmstart
Führt einen Warmstart des Systems durch. Die Konsole für die Ein-/Ausgabe wird wieder hergestellt und der Stack wird gelöscht. Wichtige Systemvektoren bleiben unverändert.

xcopy [Gerät:][Pfad]Verzeichnis|Dateiname(Quelle) [Gerät:][Pfad]Verzeichnis(Ziel)
Dieses Kommando kopiert ganze Verzeichnisse samt ihren Unterverzeichnissen. Existiert das Zielverzeichnis noch nicht, so wird es automatisch angelegt.

xget COM1|COM2:[Parameter] [Dateigröße]
X-Modem bzw. Y-Modem: Empfängt eine Datei (X-Modem) oder eine/mehrere Dateien (Y-Modem) von einem angeschlossenem Terminal. Die Dateigröße muss nur angegeben werden, wenn das X-Modem- Protokoll verwendet wird. Bei X-Modem wird die empfangene Datei unter dem Namen "x-file" abgespeichert. Bei einer Y-Modem-Gegenstelle ist die Angabe der Dateigröße nicht nötig, da sie genauso wie der Dateiname mit übertragen wird. Die "Parameter" sind die gleichen wie beim "mode"-Befehl, sie legen die Verbindungsparameter der seriellen Schnittstelle fest.

xput [xmodem] COM1|COM2:[Parameter] Datei
X-Modem bzw. Y-Modem: Sendet eine oder mehrere Dateien zu einem über die serielle Schnittstelle angeschlossenem Terminal. Wird der Parameter "xmodem" nicht angegeben, arbeitet das Programm im Y-Modem-Betrieb. Bei Y-Modem können mehrere Dateien auf einmal übertragen werden, wenn Joker-Zeichen (* oder ?) im Dateinamen benutzt werden. Die "Parameter" sind die gleichen wie beim "mode"-Befehl, sie legen die Verbindungsparameter der seriellen Schnittstelle fest.

? [Numerischer Ausdruck bzw. Formel]
Mini-Taschenrechner. Berechnet das Ergebnis des angegebenen Ausdrucks. Der Taschenrechner benutzt den Basic-Interpreter zur Berechnung, somit kann der Taschenrechner nicht benutzt werden, wenn bereits eine Instanz des Basic-Interpreters läuft.




Umleitungen und Pipes

Wie unter DOS und Unix ist es auch bei meinem Betriebssystem möglich, die Textausgabe (stdout) von Befehlen und Programmen umzuleiten. Die Umleitung von Texteingaben (stdin) ist zwar vorgesehen aber noch nicht implementiert. Für die Umleitung von stdin und stdout stehen folgende Symbole zur Verfügung:

<  und  << Umleitung der Eingabe (stdin), noch nicht implementiert
>  und  >> Umleitung der Ausgabe, mögliche Ziele: nul oder Datei
¦ Filterung der Ausgabe, zur Zeit ist nur der Filter "more" definiert

Für die Umleitung von Ein- und Ausgabe gilt folgendes Befehlsformat:
  [Laufwerk:][Pfad]Kommando  Parameter  Pipe-Symbol  Datei_oder_Filter

Beispiele:
  8:/>mem  -a  ¦  more     zeigt den Inhalt des Speichers seitenweise an (Filter "more")
  8:/>dir  >  8:/temp/dir.txt     leitet die Ausgabe des dir-Befehls in die Datei "8:/temp/dir.txt" um.




Umgebungsvariablen

Umgebungsvariablen werden mittels des set-Kommandos definiert. Eine Liste aller zur Zeit definierten Variablen erhält man, wenn man das set-Kommando ohne weitere Parameter eingibt. Folgende Umgebungsvariablen gibt es:

 LIB Gibt den Pfad zu den Systembibliotheken an.
 PATH Gibt den allgemeinen Suchpfad an. Verzeichnisse werden durch ein Semikolon (;) voneinander getrennt.
 PRG Diese Umgebungsvariable wird vom System gesetzt. Sie gibt die Befehlszeile des zuletzt ausgeführten Programms an.
 PROMPT Gibt die Formatierung des Prompt-Symbols (Eingabeaufforderung) an. Folgende Makros sind definiert:
$b Ersatz für "|"
$cX Ändert die farbliche Darstellung des Prompts. Das Zeichen X steht dabei für einen dezimalen Zahlenwert, der eine Zeichen- bzw. Hintergrundfarbe beschreibt: 0=schwarz, 1=weiss, 2=rot, 3=cyan, 4=purpur, 5=grün, 6=blau, 7=gelb, 8=orange, 9=braun, 10=hellrot, 11=grau1, 12=grau2, 13=hellgrün, 14=hellblau, 15=grau3. Die Werte 16 bis 23 entsprechen den Werten 0 bis 7, geben aber die Hintergrundfarbe an.
$d gibt das aktuelle Datum aus
$e Ersatz für das ESC-Zeichen (chr$(27))
$g Ersatz für ">"
$h Ersatz für das delete-Zeichen (chr$(20))
$l Ersatz für "<"
$n gibt die Nummer des aktuellen Laufwerks aus
$p gibt den gesamten aktuellen Laufwerkspfad aus
$q Ersatz für "="
$t gibt die aktuelle Uhrzeit aus
$$ Ersatz für "$"
$_ Ersatz für das CR-Zeichen (chr$(13))
 RC Diese Umgebungsvariable wird vom System gesetzt. Sie zeigt den Beendigungsstatus des zuletzt ausgeführten Progammes an. Eine 0 zeigt gewöhnlich eine erfolgreiche Ausführung des Programmes an.




Starten von Programmen

Die kShell verfügt über einen eingebauten Dateilader. Wie unter MSDOS ist es möglich, Programme durch Eingabe ihres Dateinamens zu starten. Die kShell erkennt automatisch den Dateityp (Skript / Basicprogramm / Maschinenspracheprogramm). Wie unter MSDOS ist der Suchpfad in der Umgebungsvariable PATH gespeichert. Das aktuelle Verzeichnis wird nicht automatisch durchsucht, es muss mit im Suchpfad angegeben werden ( set path=. ).

Maschinensprache-Programme werden anhand ihrer ersten beiden Bytes erkannt. Die Bytes müssen den Wert 02h 80h haben. Ein Programm wird, nachdem es geladen wurde, automatisch im Speicher reloziert, d.h. die absoluten Sprünge und Datenzugriffe im Programmcode werden automatisch an den neuen Speicherbereich angepasst. Speicherresistente Programme (TSR) werden unterstützt. Es gibt einen Bibliotheks-Mechanismus ähnlich der dynamischen Bibliotheken unter Windows (DLL). Bibliotheken werden in dem Verzeichnis, auf den die Umgebungsvariable 'lib' zeigt, gesucht. Sie beginnen mit den beiden Buchstaben 'SL' gefolgt von einer eindeutigen, zweistelligen hexadezimalen Nummer.

Skript-Dateien sind Textdateien. Die ersten beiden Bytes in einem Skript müssen die ASCII-Zeichen #! sein (vgl. UNIX-Skripte). Ein Skript kann sämtliche kShell-Kommandos enthalten. Zusätzlich gibt es aber noch die Befehle if, goto und shift. Bemerkungen werden durch ein # eingeleitet. Skripte können nicht geschachtelt aufgerufen werden. Skripte können mit Parametern aufgerufen werden, die im Skript durch ein %-Zeichen referenziert werden (wie unter DOS; %1 meint den ersten und %9 den letzten Parameter; %0 ist der aktuelle Pfad plus Dateiname).

Basic-Programme werden anhand ihrer ersten beiden Bytes erkannt. Die Bytes müssen die Werte 01h 04h oder 01h 08h haben. Zum Ausführen eines Basic-Programms wird automatisch der eingebaute Basic-Interpreter gestartet.