КЕРНАЛ
КЕРНАЛ [1] — это Commodore название ПЗУ , резидентного в для ядра операционной системы , на 8-битных домашних компьютерах ; от оригинального PET 1977 года, за которым последовали расширенные, но связанные версии, используемые в его преемниках: VIC-20 , Commodore 64 , Plus/4 , Commodore 16 и Commodore 128 .
Описание
[ редактировать ]KERNAL 8-битных машин Commodore состоит из низкоуровневых, близких к аппаратному обеспечению процедур ОС, примерно эквивалентных BIOS в IBM PC-совместимых устройствах (в отличие от процедур интерпретатора BASIC , также расположенных в ПЗУ), а также высокоуровневая, независимая от устройства функциональность ввода-вывода. Он может быть вызван пользователем через таблицу переходов в оперативной памяти, центральная (самая старая) часть которой по соображениям совместимости обратной [2] остается практически идентичным на протяжении всей 8-битной серии. ПЗУ KERNAL занимает последние 8 КБ 64-КБ адресного пространства 8-битного процессора ($E000–$FFFF).
Таблицу переходов можно изменить так, чтобы она указывала на написанные пользователем процедуры, например, интегрировать быстрый загрузчик , чтобы его процедуры быстрой замены использовались во всей системе, или заменить системную процедуру вывода текста на ту, которая работает в растровом режиме, а не в растровом режиме. режим персонажа. В то время такое использование таблицы переходов было новым для маленьких компьютеров. [3]
Игры Adventure International , выпущенные для VIC-20 на картридже, являются примером программного обеспечения, использующего KERNAL. Поскольку они используют только таблицу переходов, игры можно сбрасывать из памяти на диск, загружать в Commodore 64 и запускать без изменений. [4]
Первоначально KERNAL был написан для Commodore PET Джоном Фигансом, который предложил идею отделения процедур BASIC от операционной системы. В дальнейшем его доработали несколько человек, в частности Роберт Рассел, который добавил многие функции для VIC-20 и C64.
Пример
[ редактировать ]Простой, но характерный пример использования KERNAL представлен следующей 6502. языка ассемблера подпрограммой [5] (написано в формате/синтаксисе ассемблера ca65 ):
CHROUT = $ffd2 ; CHROUT is the address of the character output routine CR = $0d ; PETSCII code for Carriage Return ; hello: ldx #0 ; start with character 0 by loading 0 into the x index register next: lda message,x ; load byte from address message+x into the accumulator beq done ; if the accumulator holds zero, we're done and want to branch out of the loop jsr CHROUT ; call CHROUT to output char to current output device (defaults to screen) inx ; increment x to move to the next character bne next ; loop back while the last character is not zero (max string length 255 bytes) done: rts ; return from subroutine ; message: .byte "Hello, world!" .byte CR, 0 ; Carriage Return and zero marking end of string
В этой заглушке кода используется CHROUT
подпрограмма, адрес которой находится по адресу $FFD2
(65490), чтобы отправить текстовую строку на устройство вывода по умолчанию (например, на экран дисплея).
Имя
[ редактировать ]КЕРНАЛ был известен как ядро [6] неправильно написал слово « кернал» внутри Commodore со времен PET, но в 1980 году Роберт Рассел в своих записных книжках . Когда технические писатели Commodore Нил Харрис и Энди Финкель собрали заметки Рассела и использовали их в качестве основы для руководства программиста VIC-20, орфографические ошибки последовали за ними и прижились. [7]
Согласно раннему мифу о Коммодоре, о котором среди прочих сообщил писатель и программист Джим Баттерфилд , «слово» KERNAL — это аббревиатура (или, что более вероятно, бэкроним ), означающая « клавиатуры с Чтение » , « Сеть», « Связь » . , что на самом деле имеет смысл, учитывая его роль. Позже 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
затем закрывает канал.
Обратите внимание, что не существует системного вызова для «создания» канала ввода-вывода, поскольку в обычных обстоятельствах устройства не могут создаваться или уничтожаться динамически. Аналогично, в Unix не существует средств для поиска и выполнения функций «управления вводом-выводом», таких как ioctl (). Действительно, здесь KERNAL оказывается гораздо ближе к философии Plan-9, где приложение открывает специальный «командный» канал для указанного устройства для проведения таких «мета» или «внеполосных» транзакций. Например, чтобы удалить («стереть») файл с диска, пользователь обычно «открывает» ресурс с именем S0:THE-FILE-TO-RMV
на устройстве 8 или 9 — канал 15. Согласно общепринятому соглашению в 8-битном мире Commodore, канал 15 представляет собой «канал управления» для периферийных устройств, полагаясь на методы передачи сообщений для передачи как команд, так и результатов, включая исключительные случаи. Например, в Commodore BASIC они могут найти программное обеспечение, похожее на следующее:
70 ...
80 REM ROTATE LOGS CURRENTLY OPENED ON LOGICAL CHANNEL #1.
90 CLOSE 1
100 OPEN 15,8,15,"R0:ERROR.1=0:ERROR.0":REM RENAME FILE ERROR.0 TO ERROR.1
110 INPUT# 15,A,B$,C,D:REM READ ERROR CHANNEL
120 CLOSE 15
130 IF A=0 THEN GOTO 200
140 PRINT "ERROR RENAMING LOG FILE:"
150 PRINT " CODE: "+A
160 PRINT " MSG : "+B$
170 END
200 REM CONTINUE PROCESSING HERE, CREATING NEW LOG FILE AS WE GO...
210 OPEN 1,8,1,"0:ERROR.0,S,W"
220 ...
Номера устройств согласно установленной документации ограничены диапазоном [0,16]. Однако это ограничение возникло в результате специфической адаптации протокола IEEE-488 и, по сути, распространяется только на внешние периферийные устройства. Благодаря векторизации всех соответствующих системных вызовов KERNAL программисты могут перехватывать системные вызовы для реализации виртуальных устройств с любым адресом в диапазоне [32,256]. Возможно, можно загрузить двоичный файл драйвера устройства в память, исправить векторы ввода-вывода KERNAL, и с этого момента можно будет обращаться к новому (виртуальному) устройству. До сих пор эта возможность никогда не была публично известна как используемая, предположительно по двум причинам: (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), для работы не требуют имен файлов, либо предполагая разумные значения по умолчанию, либо просто не нуждаясь в них. совсем.
Примечания
[ редактировать ]- ^ Справочное руководство программиста Commodore 64 . Commodore Business Machines, Inc., 1982, с. 268
- ^ Таблица переходов KERNAL, используемая для доступа ко всем подпрограммам в KERNAL, представляет собой массив инструкций JMP (перехода), ведущих к реальным подпрограммам. Эта функция обеспечивает совместимость с программным обеспечением, написанным пользователем, в случае, если код в ПЗУ KERNAL необходимо переместить в более поздней версии.
- ^ «Исследование ВИК-20» . Январь 1983 года.
- ^ Кевелсон, Мортон (январь 1986 г.). «Синтезаторы речи для компьютеров Commodore / Часть II» . Эй! . п. 32 . Проверено 17 июля 2014 г.
- ^ Многие из подпрограмм KERNAL (например, OPEN и CLOSE) переносились через третью страницу в оперативной памяти, что позволяло программисту перехватывать связанные вызовы KERNAL и добавлять или заменять исходные функции.
- ^ Ядро — это наиболее фундаментальная часть программы, обычно операционной системы, которая постоянно находится в памяти и предоставляет основные службы. Это часть операционной системы, которая находится ближе всего к машине и может активировать оборудование напрямую или взаимодействовать с другим программным уровнем, который управляет оборудованием.
- ^ На грани: захватывающий взлет и падение Коммодора , страница 202.
- ^ Справочное руководство для программистов Commodore 128 , Commodore Business Machines, Inc., 1986, стр. 382