Indrekis
Indrekis

Categories

  • retrocomputing
  • cpm
  • CP/M

Tags

  • CP/M
  • retrocomputing

Книжок по CP/M1 було багато – навіть в документації до Osborne-ів є детальна інструкція, тому тут лише коротка ‘‘шпаргалка’’.

Огляд

CP/M складається з трьох частин:

  • Basic Input/Output System (BIOS),
  • Basic Disk Operating System (BDOS),
  • Console Command Processor (CCP).

BIOS i BDOS резидентні, CCP може бути затертим прикладною програмою. Детальніше див. CP/M Internals.

Зовнішні програми називаються транзієнтними, мають розширення .COM. В коді вважається, що їх завантажують за адресою 0x100 та передають керування безпосередньо – виконавчі файли не мають якоїсь структури, на відміну від більш просунутих ОС2.

Файлова система з точки зору користувача

Оперує дисками: A:, B:, C: тощо. Директорії не підтримуються, але підтримуються користувачі, яким належить кожен файл. Задаються номерами від 0 до 15. Якщо обрати користувача (командою USER n), за замовчуванням будуть видимі лише його файли – такий собі примітивний спосіб організувати файли.

Імена файлів 8+3, як і в DOS, регістр літер не має значення, а фізично імена зберігаються великими літерами. Літера та цифри дозволені, ‘$’, ‘+’, ‘-’ тощо – іноді, але ‘’, ‘=’, ‘;’, ‘:’, ‘.’, ‘*’, ‘?’, ‘>’, ‘<’, ‘_’, ‘[’, ‘]’, ‘(’, ‘)’, ‘/’, ‘\’, ‘|’, ‘%заборонені, оскільки мають спеціальне значення як не для CCP то для PIP – але є певна неузгодженість, наприклад, створити файл із символом ‘/’ в імені можна, і частина програм нормально з ним працювати.

Час модифікації може зберігатися лише на нових версіях CP/M. Розмір зберігається лише як кількість блоків, розміром 128 байт, тому кінець файлу відзначається символом 0x1A десь в останньому блоці3.

Підтримує захист файлу паролем, але цей захист чисто символічний.

Вбудовані команди

Вбудовані – команди, реалізовані CCP. Часто існують у двох варіантах: простіший, реалізований CPP, і окрема транзієнтна утиліта із ширшими можливостями. Приклад – DIR i DIR.COM. Вбудовані команди детектують деякі ситуації, коли потрібна зовнішня аналогічна утиліта (наприклад, передано опції команді DIR) і викликають її, а якщо не знайдено – виводять щось типу DIR COM required.

Оскільки утиліти CP/M часто використовують квадратні дужки, [ та ] в опціях, позначення дещо відрізняються від стандартних – опціональні аргументи позначаю фігурними дужками, але, типово, вертикальною рискою розділено різні варіанти.

Команди можна скорочувати – ERASE можна писати як ERA, ERAS, ERASE.

Деякі команди, якщо не передати аргументи, запитують їх інтерактивно.

  • DIR {wildcard|filename} – вивести список файлів. Системні – не показує.
    • DIRSYS – вивести лише системні файли.
  • ERA filename|wildcard – стерти файл. Повне ім’я команди – ERASE.
  • REN newfilename|wildcard=oldfilename|wildcard – перейменувати файл. Повне ім’я – RENAME. Якщо не передати аргумент – запитується інтерактивно.
  • TYPE filename|wildcard – вивести на консоль.
  • USER usern – обрати користувача з номером usern, від 0 до 15.
  • SAVE pages filename – зберегти у файл filename кількість pages сторінок із пам’яті, розміром 256 байт, починаючи з адреси 0x100 = 256. Спрацьовує при виході із програми, запущеної зразу після.

Стандартні транзієнтні команди

Виконавчі файли мають розширення .COM, але вказувати його не обов’язково.

Не всі команди будуть доступні для CPM 2.2, що йде з Osborne 1.

DIR.COM

Виводить помітно детальнішу інформацію, ніж вбудована DIR.

Приклад виводу DIR.COM. Видно, що розмір файлу в полі Bytes вказується кратним фізичним секторам, які для Osborne Executive, за замовчуванням – 1Кб, навіть для T.TXT, у якому десяток літер, а Recs – в записах по 128 байт.
Вивід вбудованої DIR для того ж диску, що й на попередній картинці.

Приймає ряд опцій у квадратних дужках, наприклад: DIR [DRIVER=(A,B)] – вивести файли на дисках A i B. Якщо DIR передати опції, вона автоматично шукатиме DIR.COM.

Деякі опції:

  • [ATT] – вивести всі атрибути файлу.
  • [DATE] – вивести дати файлів, або повідомити, що їх підтримка не активована.
  • [DRIVE=ALL] – вивести файли на всіх дисках.
  • [DRIVER=(A,B)] – вивести файли на переданих дисках.
  • [FULL] – вивести детальну інформацію про файли.
  • [NOPAGE] – не зупинятися після заповнення сторінки.
  • [NOSORT] – не сортувати вивід.
  • [RO]/[RW] – показувати лише read-only/read-write файли.
  • [SIZE] – показувати розмір.
  • [USER=ALL]/[USER=n] – показувати файли всіх користувачів, або для вказаного користувача.
Приклад виводу команди DIR a: [FULL].

Ремарка: підтримуються “CP/M Plus” – CP/M 3, але не підтримуються CP/M 2.2, тому (поки?) не працюватимуть в RunCPM.

DEVICE.COM

Виводить відповідність фізичних та логічних пристроїв.

PIP.COM

Копіювати файли: pip dest=src. Приклади:

  • PIP A:=B:*.COM – копіювати всі COM-файли з диску B: на диск A:.
  • PIP A:=B:FILE1.TXT,FILE1.OVR – скопіювати два файли.
  • PIP B:NEWNAME.TXT=B:OLDNAME.TXT – створити копію файлу з іншим іменем.
  • PIP COMB.TXT=PART1.TXT,PART2.TXT,PART3.TXT – об’єднати три файли з поточного диску в COMB.TXT.
  • PIP B:[G1]=A:*.BAS – скопіювати всі файли з розширенням .BAS поточного користувача для користувача з номером 1 диску B:.

Назви спеціальних пристроїв:

  • AUX:
  • CON:
  • PRN:
  • LST:
  • NUL:
  • EOF:

Наприклад:

  • відправити файл на друк: PIP PRN:=FILE.TXT,
  • безпосередньо друкувати з консолі: PIP PRN:=CON:,
    • Ctrl-Z припиняє копіювання, якщо ввід відбувається з консолі.

Найпростіший спосіб створити файл: PIP NEW.TXT=CON:. Мені певне бракує знань, але RETRUN лише переводить курсор на початок, і нові літери вводяться поверх старих. Вдалося ввести більше одного рядка, використовуючи Ctrl-M для створення нового рядка і RETURN для переходу на початок. Ймовірно, воно працює як пара CR-LF.

DDT.COM

Dynamic Debugging Tool – інтерактивний дебагер із CP/M 2.x. Див., наприклад, тут.

SID.COM

Symbol Debugger – більш просунутий дебагер. Див., наприклад, тут.

І DDT i SID приємно здивували, враховуючи епоху.

ED.COM

Вбудований ‘‘рядковий’’ редактор. Не для слабких духом, тому я витратив час на портування TE.

STAT.COM

Виводить інформацію про послідовні та паралельні порти, диски і файли. Застаріла в CP/M 3.0, її функцію виконує DIR.COM та SHOW.COM.

COPYSYS.COM

Копіює ОС на дискету.

DATE.COM

Встановити або подивитися (‘‘DATE SET``) дату та час.

DUMP.COM

Вивести вміст файлу як HEX.

GET.COM

Дозволяє наступній команді отримувати ввід з файлу, замість із консолі – таке собі мінімалістичне перенаправлення. Опція [SYSTEM] вказує зразу читати з файлу, а без неї – одну команду можна ввести з консолі. Файл, який використовується для вводу, може вказати брати ввід з консолі: GET CONSOLE.

INITDIR.COM

Підготувати диск до збереження дати модифікації файлів.

PUT.COM

Дзеркальна до GET.COM – перенаправляє вивід на консоль чи принтер, у файл.

SET.COM

  • Вмикає-вимикає паролі.
  • Керує, зберігати час та дату створення, зміни чи доступу до файлів.
  • Присвоює імена дискам.
  • Керує атрибутиами файлів – архівним, RO/RW, системним, DIR та користувацькими4.

SHOW.COM

Показує режим доступу (RW/RO) до диску, доступне місце тощо.

  • SHOW
  • SHOW a:[DIR]
  • SHOW b:[USERS]
  • SHOW b:[DRIVE]
  • SHOW b:[LABEL]

SUBMIT.COM

Дозволяє виконати команди із .SUB файлу – примітивна можливість створювати скрипти.

Можна передавати аргументи, доступні із скрипта за іменами $1, $2, …, $9.

Якщо команда потребує інтерактивного вводу, його, після неї, можна передати за допомогою символа <:

PIP
<B:=*.ASM
<B:=*.HEX
<

Символ < без інших літер – ввести Return, PIP.COM на цьому завершує. Якщо вводу замало – чекатиме з клавіатури, якщо забагато – проігнорує, вивівши попередження.

Спецсимволи виду Ctrl-@ можна вводити як ^@.

PROFILE.SUB

Цей файл виконується при старті – аналог AUTOEXEC.BAT з DOS.

Виноски

  1. Control Program/Monitor або Control Program for Microcomputers. 

  2. Хоча CP/M-3.0 додала Resident System Extensions, RSE, зі своїм форматом. Але, все рівно, перший байт таких виконавчих файлів містив команду RET – щоб не ‘‘зламатися’’ на версіях ОС, які про них не знають. 

  3. І наслідки цього ми досі відчуваємо у Windows… 

  4. Цікаво, що атрибути файлова система зберігає в старших бітах імен файлів – оскільки самі дозволені коди літер завжди семибітні.