Версия CP/M для MSX
1987.10/29
Использовалась в классах Ямаха КУВТ на базе Yamaha YIS-503IIIR и Yamaha YIS-805-128R2 для работы Yamaha Локальная сеть, версия 3.0.
Запуск
CALL CPM
или
_CPM
Программа обмена с периферийными устройствами.
Параметры запуска:
PIP | загрузка программы PIP в оперативную память и переход в режим диалога |
PIP y:=x:filename.ext PIP y:=x:filename.* PIP y:=x:*.ext PIP y:=x:*.* | копирование файла (файлов) с диска «x:» на диск «y:» (возможно использование метасимволов * и ?) |
PIP y:newfile.ext= x:oldfile.ext | копирование с диска «x:» на диск «y:» с изменением имени файла «oldfile.ext» на «newfile.ext» |
PIP y:newfile.ext= x:old1.ext, old2.ext, old3.ext | копирование с диска «x:» на диск «y:» с объединением файлов «old1.ext», «old2.ext» и «old3.ext» в файл «newfile.ext» |
PIP CON:=x:filename.ext PIP TTY:=x:filename.ext PIP CRT:=x:filename.ext | копирование файла «filename.ext» с диска «x:» на указанное консольное устройство |
PIP PUN:=x:filename.ext PIP PTP:=x:filename.ext PIP OUT:=x:filename.ext PIP AUX:=x:filename.ext | копирование файла «filename.ext» с диска «x:» на указанное устройство вывода |
PIP LST:=x:filename.ext PIP LPT:=x:filename.ext PIP PRN:=x:filename.ext | копирование файла «filename.ext» с диска «x:» на указанное устройство печати |
PIP x:filename.ext=CON: PIP x:filename.ext=TTY PIP x:filename.ext=CRT: | копирование файла «filename.ext» на диск «x:» с указанного консольного устройства до ввода ^Z |
PIP x:filename.ext=RDR: PIP x:filename.ext=PTR: PIP x:filename.ext=INP: | копирование файла «filename.ext» на диск «x:» с указанного устройства, работающего в режиме «только ввод», до ввода ^Z |
Для перфоленты: | |
PIP PUN:=NUL: PIP PUN:=NUL:,x:file.ext PIP PUN:=NUL:,x:file.ext,NUL: PIP PUN:=x:file.ext,NUL: | вывод начальных и хвостовых промежутков при копировании файла «file.ext» с диска «x:» на устройство, работающее в режиме «только вывод» |
PIP PUN:=x:file.ext,EOF | вывод маркера конца файла при копировании файла «file.ext» с диска «x:» на устройство, работающее в режиме «только вывод» |
Дополнительные параметры команды PIP:
(пишутся в конце командной строки в квадратных скобках)
[V] | проверить правильность копирования путем сравнения результирующего и исходного файлов |
[E] | отображать копируемый файл на консоли |
[Sstring^Z] | начать копирование после того, как в исходном файле будет обнаружена строка «string» (строку завершает ^Z ) |
[Qstring^Z] | завершить копирование после того, как в исходном файле будет обнаружена строка «string» (строку завершает ^Z ) |
[L] | преобразовать в процессе копирования все символы верхнего регистра в символы нижнего регистра |
[U] | преобразовать в процессе копирования все символы нижнего регистра в символы верхнего регистра |
[Dn] | удалять в процессе копирования в каждой строке все символы, расположенные после позиции с номером n |
[Tn] | преобразовать в процессе копирования все символы табуляции кода ASCII в n пробелов |
[F] | удалить в процессе копирования все символы перевода формата |
[Pn] | вставить через каждые n строк в процессе копирования символы перевода формата |
[N] | дополнить в процессе копирования строки соответствующими порядковыми номерами без ведущих нулей |
[N2] | дополнить в процессе копирования строки соответствующими порядковыми номерами с ведущими нулями |
[R] | копировать «системный» файл (определенный с помощью команды STAT) |
[W] | удалить файл со статусом защиты «R/O» (устанавливается с помощью команды STAT), имеющего то же имя, что и выходной файл |
[Gn] | копировать файл (файлы) из области пользователя с номером «n» (от 0 до 15) в файл, расположенный в текущей области пользователя |
[O] | рассматривать содержимое копируемого файла (файлов) как объектный (машинный) код |
[B] | установить блочный режим копирования |
[H] | использовать 16-чный формат фирмы Intel при передаче данных на (с) устройство, работающее в режиме «только вывод» («только ввод») |
[I] | при передаче в 16-чном формате фирмы Intel игнорировать все нулевые (NULL) записи |
[Z] | в процессе копирования символов в коде ASCII устанавливает бит чётности в 0 |
Запуск на выполнение последовательности команд ОС CP/M.
Параметры запуска:
SUBMIT filename a b c …
запуск на выполнение командного файла «filename» (с расширением «.SUB») с предварительной заменой в тексте параметров:
Параметры запуска:
ASM filename.123 Z80 filename.123
ассемблировать исходный файл «filename» (с расширением .ASM) и создать файл с промежуточным кодом (с расширением .HEX). При этом дополнительные параметры трактуются следующим образом:
«1» | в этой позиции указывается имя диска, на котором находится исходный файл |
«2» | в этой позиции указывается имя диска, на который надо записать выходной файл с расширением .HEX, или символ Z, если объектный файл не требуется |
«3» | в этой позиции указывается имя диска, на который надо записать выходной файл печати с расширением .PRN, или символ X, если листинг ассемблирования надо вывести на экран |
Программа преобразования промежуточного файла в исполняемый машинный код.
Параметры запуска:
LOAD filename
преобразовать объектный файл с расширением .HEX в файл с исполняемым машинным кодом (с расширением .COM)
Программа распечатки содержимого файла.
Параметры запуска:
DUMP filename.ext
вывести в 16-чном формате содержимое файла «filename.ext» </code>
Инструментальное средство отладки для микропроцессора I8080 (DDT.COM) или для микропроцессора Z-80 (ZSID.COM).
Параметры запуска:
DDT [filename.ext] ZSID [filename.ext]
загрузить программу DDT или ZSID и (если присутствует) файл с отлаживаемой программой «filename.ext» в память.
При загрузке файла печатается сообщение:
PC: nnnn NEXT: kkkk
,
где:
Команды программ DDT и ZSID:
D Dstart Dstart,end | вывести в 16–чном формате содержимое следующих 192 ячеек памяти, начиная с текущей («D»), или с ячейки, расположенной по заданному адресу («Dstart»), или с ячейки «start» по ячейку «end» («Dstart,end») |
Fstart,end,data - записать во все ячейки памяти с адреса "start" по адрес "end" 16-чное значение "data". Ifilename.ext - создать блок управления файлом (FCB) и записать в него имя "filename.ext" для последующей загрузки файла с этим именем в память по команде R. R - загрузить содержимое файла, имя которого указано в коман- Rstart де I, в память, начиная с текущей ячейки ("R"), или с ячейки, расположенной по адресу "start" ("Rstart"). L - реассемблировать и вывести содержимое следующих 192 яче- Lstart ек памяти, начиная с текущей ("L"), или с ячейки, рас- Lstart,end положенной по заданному адресу ("Lstart"), или с ячейки "start" по ячейку "end" ("Lstart,end"). Sstart - вывести в 16-чном формате и, возможно, изменить содержи- мое ячейки памяти, расположенной по адресу "start". Про- должить обработку следующих ячеек до ввода символа "." Astart - вставить, начиная с адреса "start", оператор языка Ас- семблер. Продолжить обработку следующих ячеек до ввода символа "." или <CR>. Mstart1,end1,start2 - копировать содержимое области памяти, расположенной с адреса "start1" по адрес "end1", в другую область па- мяти, расположенную, начиная с адреса "start2". G - выполнение программы: полностью, без прерываний; Gstart начиная с адреса "start"; Gstart,end начиная с адреса "start", с прерыванием по адресу "end"; Gstart,end1,end2 начиная с "start", с прерыванием в "end1", либо в "end2"; G,end начиная с текущей ячейки, с прерыванием по адресу "end"; G,end1,end2 начиная с текущей, с прерыванием в "end1", либо в "end2". Unumber - выполнить "number" машинных инструкций и по завершению вывести содержимое всех регистров ЦП. Тnumber - трассировать выполнение "number" машинных инструкций, распечатывая содержимое всех регистров ЦП после выпол- нения каждой инструкции. Xregister - распечатать содержимое регистра "register" или бита ус- ловия (регистр F: C,Z,M,E,I) и изменить его, если необ- ходимо. Ha,b - использование встроенного калькулятора 16-чных чисел: a и b - 16-чные числа. Команда после <CR> выдает два числа: a+b и a-b. Дополнительные команды: ^S - приостанов; ^P - установка эхо-печати; ^N - отмена эхо-печати; ^C - выход из программы с ОС CP/M. Примечание: В отлаживаемой программе для возврата в DDT или ZSID ставится не RET, а RST #07.
Программа печати в фоновом режиме (DESPOOL.COM).
Параметры запуска:
DESPOOL - загрузка программы с диска в память. После загрузки вводится ^F, после чего программа спрашивает файл для печати: File name: (надо ввести имя файла) Далее начинается печать и появляется подсказка системы: A> или др.
Программа-сборщик фирмы Microsoft (L80.COM).
Функции программы:
Параметры запуска:
A>L80 <CR> или A>L80 file1.ext,file2.ext,...,fileN.ext/E <CR> *█
Ключи программы LINK-80:
/G | Передача управления сформированной программе после того, как закончена её сборка, затем возврат в CP/M после завершения программы. Можно указать стартовый адрес запуска программы: /G:nnnn , где nnnn — 16–чное число (адрес запуска). |
/Е | Завершение работы L80 и возврат в CP/M после выполнения заданных действий. Можно указать стартовый адрес запуска программы: /E:nnnn , где nnnn — 16–чное число (адрес запуска). После завершения выполнения программы (при определенном адресе запуска) управление передается CP/M. |
/N | Все предварительно загруженные программы и подпрограммы должны быть сохранены в файле, имя которого предшествует этому параметру. Другая форма: /N:P — в файл записывается только содержимое области транзитных программ (TPA). Если этого ключа нет, то выходного файла (с расширением .COM) не создается. |
/P/R/D - /P устанавливает начальный адрес сформированной программы и области данных; /D - начальный адрес только области данных (если /P исполь- зуется совместно с /D, то он указывает только начальный адрес прог- раммы). /R используется для возврата L80 в начальное состояние. /S - Указывает, что файл сразу после него является библиотечным. L80 будет просматривать библиотечные файлы, созданные программой LIB80 и искать те модули, которые могли быть, но еще не использованы в процессе сбор- ки. /U/M - /U печатает неопределенные внешние имена; /М - все внешние ссылки. /O/H - Установка системы счисления: /O - 8-чная, /H - 16-чная. /X/Y - /X создает вместо исполняемого машинного кода результирующий файл с неперемещаемым 16-чным объектным кодом (т.е. вместо файла .COM файл .HEX). /Y создает таблицу символов (файл .SYM), которая используется при отладке программы (/Y применяется только совместно с /E). Примечание: При соединении с ассемблерными программами последние должны ассемблироваться без окончания: .END <label> ,т.к. <label> при этом считается начальным адре- сом всей программы. Поэтому возникает конфликт. A>L80 PROG,MYASM,PROG/N/E PROG.REL - создается компиляторами BASIC, Си и др. MYASM.REL - создается макроассемблером М80. PROG.COM - итоговый файл работы L80. После завершения работы L80 выдает следующую информацию: DATA <prog-start> <prog-end> <bytes> <free-bytes> FREE BYTES <start-adr> <prog-end> <num-of-pages> где: <prog-start> - 16-чный адрес начала программы; <prog-end> - 16-чный адрес конца программы; <bytes> - 10-чное число байт в программе; <free-bytes> - объем свободной (оставшейся) памяти; <start-adr> - 16-чный адрес запуска (не всегда равен <prog-start>); <num-of-pages> - 10-чное число страниц по 256 байт в программе.
Управление библиотечными файлами, содержащими произвольное число модулей в перемещаемом объектном коде, созданных компиляторами фирмы Microsoft: BASIC, Си, Macro-80 и др. (LIB80.COM)
Функции программы:
Параметры запуска:
A>LIB80 <CR> или A>LIB80 имена-файлов/ключи <CR> *█ Создание библиотечного файла: A>LIB80 filelib=file1,file2,...,fileN где: filelib - имя создаваемого библиотечного файла (по умолчанию .REL, можно .LIB); file1,file2,...,fileN - список имен файлов (только перемещаемых объектных), входящих в библиотеку (по умолчанию .REL). Примечание: После каждого file? можно перечислить имена модулей, входящих в ис- ходный файл: ...,file3<module1,module3,...,moduleN>,file4... Ключи программы LIB-80: (обычно ставятся после имени файла, к которому они относятся) /E - Завершение работы LIB80 (в режиме командных строк) и возврат в CP/M. Используется только при создании нового библиотечного файла или при изменении существующего. В остальных случаях для выхода используют ^C (реинициализация системы). Это важно, т.к. /E переименовывает созда- ваемый файл .LIB в .REL и уничтожает предыдущую версию. Если /E исполь- зовать с существующим файлом, и этот файл не обновлен, то он будет уда- лен. Этого не будет, если рядом с исходным указан результирующий файл. /R - Изменение расширения имени обрабатываемого файла .LIB на .REL. Нужны те же меры предосторожности, что и при /E. Использовать только при соз- дании библиотечного файла. Выполняет то же, что и /E, но не выходит в CP/M, а попадает в командный режим. Применяется, если, завершив обработ- ку текущего файла, надо продолжить работу с LIB80. /L - Выдача на экран списка всех модулей, содержащихся в указанном файле, и определение всех внешних имен, имеющихся в модуле. /U - Выдача на экран списка всех неопределенных внешних имен, найденных при однократном просмотре библиотечного файла. Если в библиотечном файле какой-либо модуль содержит внешнее имя, которое относится к предыдущему модулю, то /U выдает это имя на экран. /C - Отмена всех введенных ранее команд, без завершения работы LIB80. Созда- ваемый библиотечный файл уничтожается и программа начинает работу заново. Полезен, если определен некорректный модуль или неправильно введена пос- ледовательность модулей. /O - Установка 8-чной системы счисления. Используется совместно с /L. /H - Установка 16-чной системы счисления. Используется после /O, т.к. 16-чная система устанавливается по умолчанию.
Построение отчета о перекрестных ссылках для программ на языке Ассемблера для ОС CP/M (CREF80.COM).
Функция программы:
Обработка специального файла печати, созданного макроассемблером M80.COM для получения списка межмодульных ссылок и точек определения внешних имен. Отчёт используется далее при отладке. В итоге создается файл с нумерацией строк и таблицей ссылок с номерами строк, где обнаружен каждый символ. В каждой строке флагом «#» отмечается символическое имя, которое входит в нее в качестве первой лексемы. Для каждого символического имени в отчете представлено его значение, назначенное ему M80.
Параметры запуска:
A>CREF80 filename.ext=filename где: filename.ext - имя результирующего файла (расширение по умолчанию .LST, можно назначать вывод на экран - TTY: и печать - LST:); filename - имя исходного файла с расширением .CRF, созданного M80.
Интерпретатор языка BASIC (MBASIC.COM).
Параметры запуска:
A>MBASIC [filename.ext][/ключи] где: filename.ext - имя BASIC файла (расширение по умолчанию .BAS). Ключи программы MBASIC: /F:nnnn - максимальное число файлов с данными, которое может быть открыто в BASIC программе (если отсутствует, то nnnn равно 3). /M:nnnn - максимальный объем оперативной памяти, который доступен MBASIC, резервируется область памяти для программ на Ассемблере Intel 8080, которая находится перед интерпретатором. /S:nnnn - максимальный объем записи для файла прямого доступа; nnnn - 10-чное число, количество байт в одной записи (если отсутствует, то этот объем равен 128 байтам).
Компилятор языка BASIC (BASCОМ.COM).
Параметры запуска:
A>BASCОМ file1.ext,file2.ext=file3.ext где: file1.ext - результирующий файл с промежуточным кодом (расширение по умолчанию .REL); file2.ext - файл печати (расширение по умолчанию .LST, можно назначить вывод на экран - TTY: или на печать - LST:); file3.ext - исходный файл с текстом программы на BASIC'е (расширение по умолчанию .BAS). Ключи программы BASCОМ: /C - ослабление ограничений на нумерацию строк (не применять совместно с /4); /D - формировать средства отладки, используемые затем для обнаружения ошибок при выполнении программы; /E - в исходной программе содержатся операторы "ON ERROR GOTO" с командой "RESUME <номер строки>"; /N - отмена вывода результатов ассемблирования объектного кода в файл печати; /O - замена библиотеки времени исполнения BASLIB.REL на OBSLIB.REL, которая будет основной библиотекой при работе LINK-80, когда этой программе задан параметр /E или /G; /S - запись строк в кавычках в результирующий файл с объектным кодом (.REL), а не в область данных ОП; /T - применение соглашений BASIC'а, поддерживаемого интерпретатором BASIC-80 версии 4.51 Microsoft (не применять совместно с /C); /X - в исходной программе есть операторы "ON ERROR GOTO" с командой "RESUME", "RESUME 0", "RESUME NEXT"; /Z - использовать по возможности коды операций микропроцессора Z-80; /4 - применение синтаксиса BASIC'а, поддерживаемого интерпретатором BASIC-80 версии 4.51 Microsoft (не применять совместно с /C).
Инструментальное средство отладки для микропроцессора Z80 (S-BUG.COM).
Параметры запуска:
S-BUG [filename.ext] - загрузить программу S-BUG и (если присутствует) файл с отлаживаемой программой "filename.ext" в память. Команды програмы S-BUG: (см. команды DDT и ZSID) ? Help A Assemble A [address] C Trace over CALL C[N] [count] D Dump memory D [addr] [addr] E Format FCB E string F Fill in memory F addr addr dd G Go user program G [addr] [/addr[(count)] [addr[(count)]]...] H Hex math H expr [expr] I Input I [port] IO Input/Output IO [port] J Simple Memory check J addr addr JS Speed Memory Test JS addr addr K Set permanent break point K addr[(count)] [addr[(count)]]... Display permanent break point K KX Reset permanent break point KX [addr]... L Disassemble L [addr] [addr] M Move memory to memory M addr addr addr N Search in memory N addr addr bb [bb]... O Output O [port] data P Excecute macro command P Define macro command P command[:command]... PX Reset macro command PX R Read from Disk R [offset] S Substitute memory S [addr] T Trace user program T[N] [count] V Verify memory V addr addr addr W Write to Disk W addr addr X Display user register X Xr Examine user register r= F A B C D E H L BC DE HL S P X Y SP PC IX IY F' A' B' C' D' E' H' L' BC' DE' HL' Y All symbol display Y Display symbol selective Y symbol(with wild card chr) YR Append symbol from disk YR file-name[.TYPE] YS Define symbol YS symbol YX Kill symbol YX [symbol] ZAE Abort entry Enable ZAE ZAD Abort entry Disable ZAD
М.Г.Эпиктетов — Сравнительная характеристика файловых структур операционных систем CP/M, MSX-DOS и MS DOS.
Структура диска CP/M:
Системные дорожки | ← при загрузке в память читается первый сектор файловая система эти дорожки не трогает! |
---|---|
Область оглавления | ← начало файловой системы на диске |
Область данных | |
… |
Имеется описатель диска (Disk Parameter Block), который полностью определяет физический формат дискеты (количество секторов, системных дорожек, входов в оглавление и пр.), однако его положение в системной области не определено — BIOS при работе с файловой системой должен получить его от вызываемой программы.
Весь диск, кроме системных дорожек, разбит на группы — последовательность физических секторов размером 128×21) байт (от 1Кб до 16Кб, на Корвете — 2Кб). Группа является неделимым квантом файловой системы (аналогично кластеру в MS DOS).
Оглавление диска имеет фиксированный размер (на Корвете — 2 группы, на 128 входов). На файл может выделяться несколько входов в директорию (экстентов), каждый размером по 32 байта:
Usr | Имя файла + расширение | Ext | 1 | 2 | Размер |
Номера групп, занимаемых файлом (на 16Кб) |
где
В зависимости от размера диска на номер группы может отводиться разное число байт. На Корвете номер группы занимает 2 байта (таким образом, один экстент содержит 8 групп, как и было обещано).
(?) имеется предположение, что директорию можно свободно двигать в пределах первых 16 групп, но это не задокументировано и не проверено экспериментально (в DPB имеется 16 бит, в которых положение оглавления указано единицами, но обычно в 1 установлено несколько старших битов).
Структура диска MSX-DOS и MS DOS:
Boot sector | ← при загрузке читается в память,содержит программу начальной загрузки и параметры, описывающие физический формат дискеты: размеры сектора и кластера, количество зарезервированных секторов и FAT'ов, корневой директории |
---|---|
Reserved sectors | ← могут отсутствовать |
FAT N 1 | |
FAT N 2 | ← может отсутствовать |
… | |
Root directory | |
Data area | |
… |
MSX-DOS = MS DOS, прошедший хорошую «предпродажную подготовку»: из MS DOS убрали зарезервированные сектора, поддиректории, количество FAT и размер директории фиксированны, и т.д.
Формат загрузочного сектора:
00: jmp начальная загрузка ; команда процессора 8086 ! 03: db "YD-640 " ; ASCII string of OEM name 0B: dw Sector_size ; размер сектора (в байтах) 0D: db Cluster_size ; размер кластера (в секторах) 0E: dw Res_sect ; 10: db Num_FATs ; количество FAT'ов 11: dw Root_lenght ; размер корневой директории 13: dw Total_sectors ; (количество файлов) 15: db Media_descr ; описание носителя 16: dw Sect_FATs ; размер FAT'ов (в секторах) 18: dw Sect track ; кол-во секторов на дорожке 1A: dw Num_heads ; 1C: dw Num_hidden ; кол-во зарезервированных секторов на диске. 1E: программа начальной загрузки
FAT (File Allocation Table) содержит описание того, как расположены файлы на диске. В области данных физические сектора объединены в кластеры, их нумерация начинается (почему﹣то) с 002, поэтому первые 3 или 4 байта FAT свободны (в первом байте лежит media descriptor). На каждый кластер (неделимый квант при записи файла, на MSX — 2 сектора, 1Кб) диска отводится 12 или 16 бит (число бит определяется автоматически в зависимости от количества кластеров на диске), в которых содержится:
Корневая директория (в MSX других нет) содержит по 32 байта на каждый файл (независимо от длины) в следующем формате:
Имя файла+расширение | Атрибуты | Дата | Время | First | Размер файла |
где
В системе MS DOS можно заводить поддиректории — обычные (с точки зрения файловой системы) файлы, имеющие формат корневой директории, но неограниченный размер.
Недостатки CP/M и достоинства MS DOS:
Make
).
Примечание 1
128 байт в данном контексте это размер логического сектора, принятый в CP/M как стандартный размер минимального блока информации.
Размер файлов в CP/M всегда кратен числу занятых им логических секторов.
В CP/M не задаётся какой либо стандарт на структуру данных, которые хранятся на физических носителях, кроме одного — кратность 128 байтам.
Размер физических секторов определяется свойствами и аппаратными особенностями устройств, применяемых для хранения информации.
Если вспомнить о накопителях на гибких магнитных дисках, то размер физических секторов на них всегда был кратен 128 байтам и был равен 128, 256, 512 или 1024 байта.
Кроме размера физического сектора в CP/M задаётся ещё размер кластера — блока физических секторов, но который разбивается весь объём физического носителя.
Минимальный размер кластера равен объёму физического сектора, но при большом объёме носителя увеличивается из–за ограничений максимального размера информации хранимой на устройстве.
— Камиль Каримов (caro)
CP/M находится в слоте 83h. Для запуска CP/M необходимо включить в программу фрагмент:
;------------------------------------------------------------------- rst 30h ;Запуск CP/M defb 83h defw 405Ah ;-------------------------------------------------------------------
При запуске CP/M переносит себя с 4200h на 00C4h и запускается с адреса 16C4h, по которому находится таблица JP. Кроме того, дубль CP/M переносится с 4200h на C400h, причем все обращения идут именно туда.
Адреса подпрограмм, к которым обращается CP/M при прерываниях:
5B1Bh | SETADR | Установка адресов для прерываний | |
DA03h | CALL0 | Адрес для | JP 0 |
CC06h | CALL5 | JP 5 | |
DA45h | CALLC | JP 0Ch | |
DA4Bh | CALL14 | JP 14h | |
DA51h | CALL1C | JP 1Ch | |
DA57h | CALL24 | JP 24h | |
DB47h | CALL30 | JP 30h |
Таблица адресов BDOS находится по адресу CC47h в формате:
Low byte ; High byte Low byte ; High byte ..........
Встроенная CP/M система в учинические Ямахи КУВТ2