COLD

Материал из ПМК вики
Перейти к навигации Перейти к поиску

COLD («холодный» старт) — фортовское слово Каллисто. «Холодная» перезагрузка.

COLD           ( −− )                               Холодная перезагрузка, со сбросом словаря.

Словарь приводится в исходное состояние. Все слова, определённые после стандартного слова TASK, удаляются. COLD не возвращает управление назад. Символы, идущие во входном потоке после COLD, игнорируются.

Ввод слова COLD[править]

В режиме ЛАТ последовательно нажмите четыре клавиши  С/П   5      K 

Детали реализации[править]

COLD это первая словарная статья. Это примитив, то есть COLD написан на ЯМК. COLD инициализирует регистры ЭКВМ, использующиеся Каллисто, включая оба словаря — двоичный и десятичный, после чего передаёт управление на адресный интерпретатор, который начинает исполнение шитого кода.

Высокоуровневая часть COLD выводит на индикатор номер версии Каллисто, после чего передаёт управление слову WARM.

История[править]

COLD в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]

COLD
       The cold start proceedure to adjust the dictionary pointer to
       the minimum standard and restart via ABORT.
       May be called from the terminal to remove application programs and
       restart.

Реализация[править]

В Каллисто 1.0 слово COLD начинается на языке МК, инициализирует переменные USER и переходит на исполнение шитого кода:

 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 (оптимизация)

Советская реализация[править]

Каллистянское слово COLD в FORTH ИТЭФ называется INI (первые три буквы английского слова initialization, инициализация). INI начинается с ассемблерного кода, после чего инициализирует регистры и переходит исполнению шитого кода:

       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

Ссылки[править]


  Nopictures-icon.png У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.