Skip to main content

Создание исходного Commodore 64 KERNAL Source

Существует немало реверсированных версий «KERNAL», операционной система ROM C64, а некоторые из них - даже в форме, которая может быть встроена в исходный двоичный файл. Но как насчет создания исходного источника C64 KERNAL с помощью оригинальных инструментов?

Инженер Commodore Деннис Джарвис спас много дисков с источником Commodore, которые он дал Стиву Грей для сохранения. Один из этих дисков c64kernal.d64 содержит полный источник исходной версии KERNAL (901227-01), включая все инструменты сборки. Давайте построим его!

Построение KERNAL

Во-первых, нам нужен Commodore PET. Любой PET будет делать, если у него достаточно ОЗУ. 32 КБ должно быть достаточно. Для дисковода рекомендуется использовать 2040 или 4040, если вы хотите создать базу данных перекрестных ссылок (требуется больше ОЗУ для многих открытых файлов), в противном случае 2031 будет прекрасно работать. VICE emulator позволит вам настроить такую систему.

Сначала вы должны удалить существующие файлы перекрестных ссылок на диске. С помощью инструмента командной строки c1541, который поставляется с VICE, это можно сделать следующим образом:

c1541 c64kernal.d64 -delete xr * -validate

Теперь прикрепите образ диска и либо запустите автозапуск эмулятора, либо

LOAD"ASX4.0",8
RUN

Это запустит ассемблер «PET RESIDENT». Теперь ответьте на следующие вопросы:

PET RESIDENT ASSEMBLER V102780
(C) 1980 BY COMMODORE BUSINESS MACHINES

OBJECT FILE (CR OR D:NAME): KERNAL.HEX
HARD COPY (CR/Y OR N)? N
CROSS REFERENCE (CR/NO OR Y)? N
SOURCE FILE NAME? KERNAL

Теперь ассемблер выполнит свою работу и создаст файл «KERNAL.HEX» на диске. Это займет около 16 минут, поэтому вы, вероятно, захотите переключить свой эмулятор в «Warp Mode». Когда это будет сделано, выйдите из эмулятора, чтобы очистить содержимое образа диска.

Используя c1541, мы можем извлечь выход ассемблера:

c1541 c64kernal.d64 -read kernal.hex

Файл находится в формате MOS Technology Hex и может быть преобразован с использованием srecord:

tr '\r' '\n' < kernal.hex > kernal_lf.hex
srec_cat kernal_lf.hex -MOS_Technologies \
    -offset -0xe000 \
    -fill 0xaa 0x0000 0x1fff \
    -o kernal.bin -Binary

Эта команда позволяет заполнить пробелы значением 0xAA, как и исходным ПЗУ KERNAL.

Полученный файл идентичен 901227-01, за исключением следующего:

  • $ E000- $ E4AB пуст вместо того, чтобы содержать код переполнения BASIC
  • $ E4AC не содержит контрольную сумму (для вычисления используется программа BASIC «chksum» на диске)
  • $ FFF6 не содержит подпись «RRBY»

Также обратите внимание, что $ FF80, байт версии KERNAL равен $ AA - первая версия KERNAL еще не использовала это местоположение для байта версии, поэтому эффективный байт версии является байтом заполнения.

Просмотр источника

Версия исходного кода ASCII / LF доступна по адресу https://github.com/mist64/cbmsrc.

;****************************************
;*                                      *
;* KK  K EEEEE RRRR  NN  N  AAA  LL     *
;* KK KK EE    RR  R NNN N AA  A LL     *
;* KKK   EE    RR  R NNN N AA  A LL     *
;* KKK   EEEE  RRRR  NNNNN AAAAA LL     *
;* KK K  EE    RR  R NN NN AA  A LL     *
;* KK KK EE    RR  R NN NN AA  A LL     *
;* KK KK EEEEE RR  R NN NN AA  A LLLLL  *
;*                                      *
;***************************************
;
;***************************************
;* PET KERNAL                          *
;*   MEMORY AND I/O DEPENDENT ROUTINES *
;* DRIVING THE HARDWARE OF THE         *
;* FOLLOWING CBM MODELS:               *
;*   COMMODORE 64 OR MODIFED VIC-40    *
;* COPYRIGHT (C) 1982 BY               *
;* COMMODORE BUSINESS MACHINES (CBM)   *
;***************************************
.SKI 3
;****LISTING DATE --1200 14 MAY 1982****
.SKI 3
;***************************************
;* THIS SOFTWARE IS FURNISHED FOR USE  *
;* USE IN THE VIC OR COMMODORE COMPUTER*
;* SERIES ONLY.                        *
;*                                     *
;* COPIES THEREOF MAY NOT BE PROVIDED  *
;* OR MADE AVAILABLE FOR USE ON ANY    *
;* OTHER SYSTEM.                       *
;*                                     *
;* THE INFORMATION IN THIS DOCUMENT IS *
;* SUBJECT TO CHANGE WITHOUT NOTICE.   *
;*                                     *
;* NO RESPONSIBILITY IS ASSUMED FOR    *
;* RELIABILITY OF THIS SOFTWARE. RSR   *
;*                                     *
;***************************************
.END