COPY

Материал из ПМК вики
Версия от 18:37, 30 июня 2021; AtH (обсуждение | вклад) (→‎Советская реализация)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

COPY (копировать, читается «копи») — встроенное слово Каллисто. Копирует экран в новый блок.

COPY           ( c1 c2 −− )                         Копировать блок c1 в блок c2.
Пример работы слова COPY

n m COPY копирует экран n на экран m

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

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

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

В некоторых Фортах это команда редактора, но её удобно иметь в ядре.

3898 ;#COPY
3899 ; COPY             ( c1 c2 −− )                         Копировать блок c1 в блок c2.
3900 ; n m COPY копирует экран n на экран m
3901 ; Часто это команда редактора, но её удобно иметь в ядре.
3902 LCOPY:          .DB     4
3903                 .TEXT   "COPY"                  ; ( откуда куда −− )
3904                 .DW     LWORDS
3905 COPY:           .DW CALL, SWAP, BLOCK,TWOM,STORE, UPDAT, BRAN,RFLUSH

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

Юрий Семёнов приводит следующее определение слова COPY (стр. 33), как пример использования слова FLUSH:

 : COPY ↔      ( в стеке m n )
        BLOCK  (         m и адрес первого байта буфера,
                         куда считан экран с номером n)
        2-     (         m и адрес ячейки, где лежит номер
                         экрана, хранящегося в буфере)
        !      ( очистка стека, номер экрана n заменён на m)
        UPDATE                 ( установка флага "спасения")
        FLUSH ;                            ( запись на диск)

Определение слова COPY в FORTH ИТЭФ тоже использует FLUSH:

             HEAD    204Q,'COP',331Q,COPY,$COL            ; COPY
             DW  SWAP,BLOCK,CFA,STORE,UPDAT,FLUSH,SEMI

colorForth (cf2019.nasm 2019 Sep 14)[править]

copy_:   ; ( blk -- )    \ copy the given block (and shadow) to the currently displayed block (and shadow)
    cmp _TOS_, byte 0x0C        ; below block 12 is machine code
    jc abort
    push edi
    push esi
    push ecx
    call blockToCellAddress     ; source block
    shl _TOS_, 0x02             ; convert cell address to byte address
    mov esi, _TOS_
    mov _TOS_, [ v_blk ]
    call blockToCellAddress     ; destination block
    shl _TOS_, 0x02             ; convert cell address to byte address
    mov edi, _TOS_
    mov ecx, 0x0200
    rep  movsd                  ; copy ecx 32 bit words from ds:esi to es:edi
    pop ecx
    pop esi
    pop edi
    _DROP_
    ret

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


  Это заготовка статьи. Вы можете помочь проекту, дополнив её.