Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

KERNAL [1] - это имя Commodore резидентного ядра операционной системы в ПЗУ на его 8-битных домашних компьютерах ; от оригинального PET 1977 года, за которым последовали расширенные, но тесно связанные версии, используемые в его преемниках: VIC-20 , Commodore 64 , Plus / 4 , C16 и C128 .

Описание [ править ]

KERNAL 8-битных машин Commodore состоит из низкоуровневых, близких к аппаратному обеспечению программ ОС, примерно эквивалентных BIOS в совместимых с IBM PC (в отличие от подпрограмм интерпретатора BASIC , также находящихся в ПЗУ), а также высокоуровневые, независимые от устройств функциональные возможности ввода-вывода и вызываемые пользователем через таблицу переходов в ОЗУ, центральная (самая старая) часть которой по причинам обратной совместимости [2] остается в основном идентичной на протяжении всей 8-битной серии. KERNAL ROM занимает последние 8 КБ адресного пространства 8-битного ЦП 64 КБ ($ E000- $ FFFF).

Таблица переходов может быть изменена, чтобы указывать на написанные пользователем подпрограммы, например, переписывая подпрограммы отображения экрана для отображения анимированной графики или копируя набор символов в RAM. В то время использование таблицы переходов было новым для маленьких компьютеров. [3]

Игры Adventure International, выпущенные для VIC-20 на картридже, являются примером программного обеспечения, использующего KERNAL. Поскольку они используют только таблицу переходов, игры можно выгружать из памяти на диск, загружать в Commodore 64 и запускать без изменений. [4]

Первоначально KERNAL был написан для Commodore PET Джоном Фигансом , который представил идею отделения подпрограмм BASIC от операционной системы. В дальнейшем он был разработан несколькими людьми, в частности Робертом Расселом , который добавил многие функции для VIC-20 и C64.

Пример [ править ]

Простой, но характерный пример использования KERNAL дается следующей подпрограммой языка ассемблера 6502 [5] (написанной в формате / синтаксисе ассемблера ca65 ):

 CHROUT = $ ffd2; CHROUT - это адрес процедуры вывода символов. CR = $ 0d; Код PETSCII для возврата каретки  ; Привет: ldx # 0; начать с символа 0, загрузив 0 в индексный регистр x следующий: lda message, x; загрузить байт из адресного сообщения + x в аккумулятор beq done; если аккумулятор содержит ноль, мы закончили и хотим выйти из цикла jsr CHROUT; вызовите CHROUT для вывода символа на текущее устройство вывода (по умолчанию экран) inx; увеличить x, чтобы перейти к следующему символу bne next; цикл назад, пока последний символ не равен нулю (максимальная длина строки 255 байтов) Выполнено: rts; возврат из подпрограммы  ; сообщение: .byte " Привет, мир! " .byte CR, 0; Возврат каретки и нулевое обозначение конца строки

Эта заглушка кода использует CHROUTпроцедуру, адрес которой находится по адресу $FFD2(65490), для отправки текстовой строки на устройство вывода по умолчанию (например, экран дисплея).

Имя [ править ]

KERNAL был известен как ядро [6] внутри Commodore со времен ПЭТ, но в 1980 году Роберт Рассел неправильно написал слово как ядро в своих записных книжках. Когда технические писатели Commodore Нил Харрис и Энди Финкель собрали записи Рассела и использовали их в качестве основы для руководства программиста VIC-20, орфографические ошибки последовали за ними и застряли. [7]

В соответствии с ранним коммодором мифа и сообщает автор / программист Джим Баттерфилд среди прочего, «слова» Kernal является аббревиатурой (или , возможно , более вероятно, бэкронит ) , стоящий на K eyboard E Ntry R EAD, N etwork, А й л чернила , что на самом деле имеет смысл, учитывая его роль. Позже Berkeley Softworks использовала его, называя основные процедуры своей ОС с графическим интерфейсом пользователя для 8-битных домашних компьютеров: GEOS KERNAL.

О независимом от устройства вводе-выводе [ править ]

Удивительно, но в KERNAL реализован аппаратно-независимый API ввода-вывода, не совсем отличающийся от API Unix или Plan-9 , который, насколько известно, никто фактически не использовал. В то время как можно было бы разумно утверждать, что «все является файлом» в этих последних системах, другие могут легко утверждать, что «все является устройством GPIB » в первых.

Из-за ограничений архитектуры 6502 в то время для открытия канала ввода-вывода требовалось три системных вызова. Первый обычно устанавливает логическое имя файла с помощью SETNAMсистемного вызова. Второй вызов SETLFSустанавливает адрес «устройства» GPIB / IEEE-488 для связи. Наконец, OPENвызывается для выполнения фактической транзакции. Приложение , затем используется CHKINи CHKOUTсистемные вызовы , чтобы установить текущие входные и выходные каналы приложения, соответственно. Приложения могут иметь любое количество одновременно открытых файлов (до некоторого системно-зависимого предела; например, C64 позволяет открывать десять файлов одновременно). После этого CHRINи CHROUTокажется полезным для фактического проведения ввода и вывода соответственно. CLOSEзатем закрывает канал.

Обратите внимание, что не существует системного вызова для «создания» канала ввода-вывода, поскольку устройства не могут быть созданы или уничтожены динамически при нормальных обстоятельствах. Точно так же не существует средств для поиска или выполнения функций «управления вводом- выводом», таких как ioctl () в Unix. Действительно, здесь KERNAL оказывается намного ближе к философии Plan-9, когда приложение открывает специальный «командный» канал для указанного устройства для проведения таких «мета» или «внеполосных» транзакций. Например, чтобы удалить («очистить») файл с диска, пользователь обычно «открывает» ресурс с именемS0:THE-FILE-TO-RMVна устройстве 8 или 9, канал 15. Согласно установленному соглашению в 8-битном мире Commodore канал 15 представляет собой «командный канал» для периферийных устройств, полагаясь на методы передачи сообщений для передачи как команд, так и результатов, включая исключительные случаи. Например, в Commodore BASIC они могут найти программное обеспечение, похожее на следующее:

 70  ...  80  УДАЛЕННОЕ ВРАЩЕНИЕ ЖУРНАЛОВ, В НАСТОЯЩЕЕ ВРЕМЯ ОТКРЫТО НА ЛОГИЧЕСКОМ КАНАЛЕ №1.  90  ЗАКРЫТЬ  1  100  ОТКРЫТЫЙ  15 , 8 , 15 , "R 0: ERROR.1 = 0: ERROR.0" : REM ПЕРЕИМЕНОВАТЬ ФАЙЛА ERROR.0 К ERROR.1  110  ВХОД #  15 , , B $ , C , D : REM ЧИТАТЬ ОШИБКУ КАНАЛ 120 ЗАКРЫТЬ 15 130 ЕСЛИ A = 0 ТОГДА НАЙТИ 200 140 ПЕЧАТЬ "ОШИБКА ПЕРЕИМЕНОВАНИЯ ЖУРНАЛА:" 150              ПЕЧАТЬ  «КОД:» + A  160  ПЕЧАТЬ  «СООБЩЕНИЕ:» + B $  170  КОНЕЦ  200  УДАЛИТЬ ПРОДОЛЖИТЬ ОБРАБОТКУ ЗДЕСЬ, СОЗДАВАЯ НОВЫЙ ФАЙЛ  ЖУРНАЛА ПО ВРЕМЕНИ ... 210  ОТКРЫТЬ  1 , 8 , 1 , «0: ОШИБКА.0, S , Вт "  220  ...

Номера устройств, согласно установленной документации, ограничены диапазоном [0,16]. Однако это ограничение возникло из-за специальной адаптации протокола IEEE-488 и, по сути, применяется только к внешним периферийным устройствам. Имея векторную ориентацию всех соответствующих системных вызовов KERNAL, программисты могут перехватывать системные вызовы для реализации виртуальных устройств с любым адресом в диапазоне [32,256]. Возможно, можно загрузить двоичный файл драйвера устройства в память, исправить векторы KERNAL I / O, и с этого момента можно будет адресовать новое (виртуальное) устройство. До сих пор эта возможность никогда не была публично известна как используемая, предположительно по двум причинам: (1) KERNAL не предоставляет средств для динамического распределения идентификаторов устройств и (2) KERNAL не предоставляет средств для загрузки перемещаемого двоичного образа. Таким образом,бремя конфликтов как в области ввода-вывода, так и в области памяти ложится на пользователя, в то время как совместимость платформ на широком диапазоне машин ложится на автора программного обеспечения. Тем не менее, при желании можно легко реализовать программное обеспечение для поддержки этих функций.

Форматы логических файлов зависят от конкретного устройства. Самым распространенным устройством, конечно же, является система гибких дисков, которая использует формат, аналогичный MD:NAME,ATTRS, где M - это своего рода флаг ($ для списка каталогов, @ для указания желания перезаписать файл, если он уже существует, неиспользуемый в противном случае.), D - (необязательный) номер физического диска (0: или 1: для систем с двумя дисками, только 0: для однодисковых устройств, таких как 1541 и др., по умолчанию 0: если не указано ) NAME- это имя ресурса длиной до 16 символов (разрешено большинство символов, за исключением некоторых специальных), а ATTRSтакже необязательный список атрибутов или флагов, разделенных запятыми. Например, если пользователь хочет перезаписать программный файл с именем PRGFILE, он может увидеть имя файла, например@0:PRGFILE,Pиспользуется вместе с устройством 8 или 9. Между тем имя файла для драйвера RS-232 (устройство 2) состоит просто из четырех символов, закодированных в двоичном формате. [8]

Другие устройства, такие как клавиатура (устройство 0), кассета (устройство 1), интерфейс дисплея (устройство 3) и принтер (устройство 4 и 5), не требуют имен файлов для работы, либо предполагая разумные значения по умолчанию, либо просто не нуждаясь в них. вообще.

Заметки [ править ]

  1. ^ Справочное руководство программиста Commodore 64 . Commodore Business Machines, Inc., 1982, стр. 268
  2. ^ Таблица переходов KERNAL, используемая для доступа ко всем подпрограммам в KERNAL, представляет собой массив инструкций JMP (переходов), ведущих к фактическим подпрограммам. Эта функция обеспечивает совместимость с программным обеспечением, написанным пользователем, в случае, если код в KERNAL ROM необходимо переместить в более позднюю версию.
  3. ^ "Изучение VIC-20" .
  4. ^ Kevelson, Мортон (январь 1986). «Синтезаторы речи для компьютеров Commodore / Часть II» . Эй! . п. 32 . Проверено 17 июля 2014 года . CS1 maint: обескураженный параметр ( ссылка )
  5. ^ Многие из подпрограмм KERNAL (например, OPEN и CLOSE) были перенесены через третью страницу в RAM, что позволяло программисту перехватывать связанные вызовы KERNAL и добавлять или заменять исходные функции.
  6. ^ Ядро является наиболее фундаментальной частью программы,правилооперационной системы, которая находится в памяти в любое время и предоставляет основные услуги. Это часть операционной системы, которая находится ближе всего к машине и может активировать оборудование напрямую или взаимодействовать с другим программным уровнем, который управляет оборудованием.
  7. On The Edge: The Spectacular Rise and Fall of Commodore , стр.202.
  8. ^ Commodore 128 Программисты Справочное руководство , Commodore Business Machines, Inc., 1986, стр. 382

Внешние ссылки [ править ]

  • Commodore KERNAL История