Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''COLD''' («холодный» старт) — фортовское слово [[Каллисто]]. «Холодная» перезагрузка. | | '''COLD''' («холодный» старт) — стандартное слово [[Каллисто]]. «Холодная» перезагрузка. [[Словарь]] приводится в исходное состояние. Все слова, определённые после стандартного слова [[TASK]], удаляются. |
| COLD ( −− ) Холодная перезагрузка, со сбросом словаря.
| | ( -- ) |
| [[Словарь]] приводится в исходное состояние. Все слова, определённые после стандартного слова [[TASK]], удаляются. COLD не возвращает управление назад. Символы, идущие во входном потоке после COLD, игнорируются. | | |
| | COLD не возвращает управление назад, всё идущее после COLD игнорируется. |
|
| |
|
| == Ввод слова COLD ==
| |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите четыре клавиши [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша 5|{{Серая клавиша|5}}]] [[Клавиша -|{{Серая клавиша|−}}]] [[Клавиша K|{{Синяя клавиша|K}}]]
| |
|
| |
|
| == Детали реализации == | | == Детали реализации == |
| COLD это первая словарная статья. Это [[примитив]], то есть COLD написан на [[ЯМК]]. COLD инициализирует [[Регистр памяти данных|регистры ЭКВМ]], использующиеся [[Каллисто]], включая оба словаря — [[Словарь|двоичный]] и [[Десятичный словарь|десятичный]], после чего передаёт управление на [[адресный интерпретатор]], который начинает исполнение [[Шитый код|шитого кода]]. | | COLD это первая словарная статья. Это примитив, то есть COLD написан на [[ЯМК]]. COLD инициализирует регистры ЭКВМ, использующиеся [[Каллисто]], включая оба словаря — [[Словарь|двоичный]] и [[Десятичный словарь|десятичный]], после чего передаёт управление на адресный интерпретатор, который начинает исполнение шитого кода. |
| | |
| | Высокоуровневая часть COLD выводит на экран номер версии [[Каллисто]], после чего передаёт управление слову [[WARM]]. |
| | |
| | |
| | == Начальная загрузка [[Каллисто]] == |
| | Первая команда Каллисто передаёт управление метке INIT. |
|
| |
|
| Высокоуровневая часть COLD выводит на [[индикатор]] номер версии [[Каллисто]], после чего передаёт управление слову [[WARM]].
| | Программа INIT целиком написана на [[ЯМК]] и не является словом [[Каллисто]]. Её задача — запустить [[Каллисто]] с помощью слова COLD или [[WARM]]. Решение принимается на основании содержимого регистра 19. Если R19 совпадает с номером запущенной версии [[Каллисто]], INIT его сразу обнуляет и первым исполненным словом будет [[WARM]], то есть написанная или загруженная пользователем программа сохраняется. С помощью R19 и переменной [[AUTOEXEC]] программа на [[Каллисто]] может запускать себя при включении ЭКВМ (например, после сбоя питания) или после загрузки с электронного диска словом [[LOAD"]]. |
|
| |
|
| == История ==
| | Если в R19 расположено любое другое число, первым исполняется слово COLD, то есть [[словарь]] приводится в исходное состояние. |
| === COLD в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
| | |
| | == COLD в fig-FORTH Release 1 glossary, май 1979 (англ.) == |
| COLD | | COLD |
| The cold start proceedure to adjust the dictionary pointer to | | The cold start proceedure to adjust the dictionary pointer to |
Строка 18: |
Строка 24: |
| May be called from the terminal to remove application programs and | | May be called from the terminal to remove application programs and |
| restart. | | restart. |
|
| |
| == Реализация ==
| |
| В [[Каллисто|Каллисто 1.0]] слово COLD начинается на [[Язык МК|языке МК]], инициализирует [[USER|переменные USER]] и переходит на исполнение [[Шитый код|шитого кода]]:
| |
| <pre>
| |
| 122 ; Эта часть переменных инициализируется в COLD
| |
| 123 ;
| |
| 124 nbEmpty .EQU 126 ; 126 сколько байт обнулит COLD перед инициализацией _FONT и далее
| |
| 125
| |
| 126 ; Описание активного шрифта
| |
| 127 ; Порядок полей важен, они заполняются словом FONT!
| |
| 128 ;
| |
| 129 pFONT .EQU 126 ; 11126 _FONT − Структура терминала, описывающая активный шрифт
| |
| 130 rrCHW .EQU 1126 ; 11126 +0 максимальная ширина литеры при выводе на индикатор
| |
| 131 rrCHH .EQU 1127 ; 11127 +1 высота литеры при выводе на индикатор
| |
| 132 rrBSW .EQU 1128 ; 11128 +2 ширина курсора и средней литеры для BS
| |
| 133 rrSCRLN .EQU 1129 ; 11129 +3 на сколько линий поднять экран при прокрутке
| |
| 134 rrSCRLFIX .EQU 1130 ; 11130 +4 на сколько строк поднять курсор после прокрутки
| |
| 135
| |
| 136 rrS0 .EQU 1131 ; 11131 S0 − Указатель начала стека параметров
| |
| 137 rlS0 .EQU 1132
| |
| 138 pS0 .EQU 131
| |
| 139 rrR0 .EQU 1133 ; 11133 R0 − Указатель начала стека возвратов
| |
| 140 rlR0 .EQU 1134
| |
| 141 pR0 .EQU 133
| |
| 142 rrDDP .EQU 1135 ; 11135 ДH − Указатель на первую свободную ячейку десятичного словаря
| |
| 143 rlDDP .EQU 1136
| |
| 144 pDDP .EQU 135
| |
| 145 rrDP .EQU 1137 ; 11137 H − Указатель на первую свободную ячейку словаря H @ = HERE
| |
| 146 pDP .EQU 137
| |
| 147 rlDP .EQU 1138
| |
| 148 rrVOCLINK .EQU 1139 ; 11139 VOC−LINK − Переменная связи наборов слов
| |
| 149 pVOCLINK .EQU 139
| |
| 150 rrAUTOEXEC .EQU 1141 ; 11141 APP − код отсюда будет выполняться сразу после WARM
| |
| 151 pAUTOEXEC .EQU 141
| |
| 152 rlAUTOEXEC .EQU 1142
| |
| …
| |
| 420 ;#COLD
| |
| 421 ; COLD ( −− ) Холодная перезагрузка, со сбросом словарей.
| |
| 422 ;−−−−−−−−−−−−−−−−−−−−−−−−
| |
| 423 ; Первая словарная статья
| |
| 424 ; Слово COLD может использоваться, как более суровый вариант FORGET TASK
| |
| 425 LCOLD: .DB 4 ; NFA: байт−счётчик 4 − длина имени
| |
| 426 .TEXT "COLD" ; Имя слова, длина переменная и записана в байте счётчика
| |
| 427 .DW 0 ; LFA: Поле связи равно 0, завершающее слово набора FORTH
| |
| 428 COLD: .DW JCOLD ; CFA: Поле кода ссылается на поле параметров, слово на ЯМК
| |
| 429 JCOLD: ; PFA: Поле параметров содержит программу на ЯМК
| |
| 430 2 PPM 9010 ; Инициализация графического экрана, шрифт 0
| |
| 431 256 ME ; В RE всегда 256, экономит память и время
| |
| 432 .NUMT nbEmpty ; Столько байт предстоит обнулить
| |
| 433 M0
| |
| 434 999 M5 ; Начиная с R1000, прединкримент
| |
| 435 Cx
| |
| 436 COLD0: KM5 FL0 COLD0 ; Обнулить их все!
| |
| 437 .NUMT SSTR
| |
| 438 PPM 9042 ; Читать шитый код из памяти программ
| |
| 439 44 M0 ; Всего 17+27 байт
| |
| 440 CLDCPY: PPRM 9044 KM5 FL0 CLDCPY ; Копировать в байтовую область переменные USER + заготовку словаря
| |
| 441 PGOTO SETPRG ; Начать исполнять код из памяти программ
| |
| 442
| |
| 443 SSTR:
| |
| 444 ; Теневая таблица для инициализации _FONT и шести переменных USER (5+12=17 байт)
| |
| 445
| |
| 446 .DB 8,8,6,1,0 ; 11126..11130 rrCHW, rrCHH, rrBSW, rrSCRLN, rrSCRFIX для шрифта 0
| |
| 447 ;
| |
| 448 ; S0 R0 ДH H VOC−LINK APP
| |
| 449 ; 1131 1133 1135 1137 1139 1141 ∗
| |
| 450 ; .DW rrXS0, rrXR0, 10020, rrXDP, rrXVOC, QUIT
| |
| 451 ; .DW 10998, 15090, 10020, 11170, 11159, QUIT ∗
| |
| 452 .DB 2aH,0f6H, 3aH,0f2H, 27H,24H, 2bH,0a2H, 2bH,97H
| |
| 453 .DW QUIT ; APP
| |
| 454
| |
| 455 ; Эти две статьи (27 байт) COLD переносит в словарь в области двоичных регистров
| |
| 456 ; Их поле данных сможет меняться
| |
| 457 ;
| |
| 458 ;#FORTH
| |
| 459 ; FORTH ( −− ) Сделать набор слов FORTH контекстным.
| |
| 460 ; LFORTH:
| |
| 461 .DB 5 ; 11143 = 2b87 = LFORTH:
| |
| 462 .TEXT "FORTH" ; 11144:
| |
| 463 .DW LLOADQ ; 11149:
| |
| 464 .DW SDOEP ; 11151 = 2b8f = FORTH: (xt)
| |
| 465 .DW DOVOC ; 11153: Обработчик VOCABULARY для DOES>
| |
| 466 .DB 1,20H ; 11155: псевдозаголовок первого слова
| |
| 467 .DB 2bH,99H ; 11157: ссылка на LTASK в новой адресации
| |
| 468
| |
| 469 ; Этим адресом инициализируется VOC−LINK
| |
| 470 .DW 0 ; 11159 = 2b97 = XVOC: Это должно быть уже в байтовой памяти
| |
| 471
| |
| 472 ;#TASK
| |
| 473 ; TASK ( −− ) Последнее слово ядра Каллисто.
| |
| 474 ; В Форте слово TASK чаще всего используется оператором FORGET для сброса словаря в начальное состояние.
| |
| 475 ;LTASK:
| |
| 476 .DB 4 ; 11161 = 2b99 = LTASK
| |
| 477 .TEXT "TASK" ; 11162:
| |
| 478 .DB 2bH,87H ; 11166: 11143 rrDict, ссылка на LFORTH в единой адресации
| |
| 479 .DW JNOP ; 11168 = TASK: (xt)
| |
| 480 ; 11170 = 2ba2: этим адресом инициализируется H
| |
| 481
| |
| 482 ; Отсюда, из памяти программ, запускается шитый код −− сразу после "болванки" для инициализации USER и словаря.
| |
| 483 ;
| |
| 484 .DW SPSTO,RPSTO ; Инициализировать оба стека
| |
| 485 .DW DARK,PDOTQ ; Вывести название и версию транслятора
| |
| 486 .DB 22 ; Длина первой строки
| |
| 487 strForthM1: .DB 12 ; Начать с CLS
| |
| 488 .TEXT "Каллисто Классик 1.0" ; Фраза означает, что Каллисто удалила словарь разработчика
| |
| 489 .DB 10 ; Закончить LF
| |
| 490 .DW BRAN,RWARM ; Передать управление WARM (оптимизация)
| |
| </pre>
| |
|
| |
| === Советская реализация ===
| |
| [[Каллисто|Каллистянское]] слово COLD в FORTH ИТЭФ называется INI (первые три буквы английского слова ''initialization'', инициализация). INI начинается с ассемблерного кода, после чего инициализирует регистры и переходит исполнению шитого кода:
| |
| <pre>
| |
| ASSUME CS:ARRAY, DS:ARRAY, ES:ARRAY, SS:STACK
| |
|
| |
| $INI PROC FAR
| |
| JMP ENT
| |
| ; ** PRIMITIVES **
| |
|
| |
| HEAD 203Q,'IN',311Q,INIT ;INI
| |
| ENT: MOV CX, ARRAY
| |
| MOV DS, CX ; Установка DX
| |
| MOV ES, CX
| |
| MOV BX, $US
| |
| MOV AX, $STI ; Восстановление словаря
| |
| LEA SI, FORTH+6
| |
| MOV [SI], AX
| |
| MOV SI, $BUF
| |
| MOV CX, 1730 ; Установка счетчика
| |
| XXX: MOV WORD PTR [SI],0 ; Обнуление массивов
| |
| ADD SI, 2
| |
| LOOP XXX
| |
|
| |
| ; INIT 'OFFSET, USE, PREV
| |
|
| |
| MOV CX, $BUF ; TO 'USE'
| |
| MOV [BX]+72Q,CX
| |
| MOV [BX]+74Q,CX ; ?
| |
| MOV CX, 14Q ; Установка счетчика USER
| |
| MOV DI, $US ; Запись адреса области USER
| |
| ADD DI, 6
| |
| LEA SI, $STK ; Запись начального адреса
| |
| REP MOVS WORD PTR ES:[DI],HORD PTR DS:[SI]
| |
| MOV BP, $RS ; Установка начального значения
| |
| MOV DI, $US ; указателя стека возвратов
| |
| MOV WORD PTR [DI+32Q],7 ; Установка цвета
| |
| MOV WORD PTR [DI+42Q],0 ; Сброс флага печати
| |
| LEA SI, G0$
| |
| NEXT
| |
| G0$: DW SPSTO,DEC,FORTH,DEFIN,ONE,LOAD
| |
| $INI ENDP
| |
| ...
| |
| END $INI
| |
| </pre>
| |
|
| |
|
| == Ссылки == | | == Ссылки == |
| * {{Исходник|COLD|COLD}}
| |
| * См. статью [[Начальная загрузка Каллисто]]
| |
| * См. слова [[QUIT]], [[ABORT]] и [[BYE]]
| |
| * См. также [[WARM]] — «горячий» старт. | | * См. также [[WARM]] — «горячий» старт. |
| * [https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0 Перезагрузка в Википедии] | | * [https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0 Перезагрузка в Википедии] |
Строка 182: |
Строка 32: |
| {{нет иллюстраций}} | | {{нет иллюстраций}} |
| [[Категория:Слова Каллисто]] | | [[Категория:Слова Каллисто]] |
| [[Категория:Примитивы]] | | [[Категория:Описание бета-версии Каллисто]] |