FILEIN  EQU #5C            ; Системные адреса хранения
FILEOUT EQU #6C            ; слов командной строки
BDOS    EQU #5             ; Адрес вызова BDOS

;Некоторые макроопределения:
READ MACRO
        LD   HL,#4000      ;Копирование по 16кБ
        LD   DE,FIN        ;
        LD   C,#27         ;Функция считывания с диска
        CALL BDOS          ;
        LD   (VAL),HL      ;
        RET                ;
        ENDM               ;
WRITE MACRO                ;
        LD   DE,FOUT       ;
        LD   C,#26         ;Функция записи на диск
        LD   HL,(VAL)      ;
        CALL BDOS          ;
        RET                ;
        ENDM               ;
CLOSE MACRO                ;
        LD   DE,FOUT       ;
        LD   C,#10         ;Функция закрытия файла
        CALL BDOS          ;
        RET                ;
        ENDM               ;
ADRES MACRO                ;
        LD   DE,#0800      ;
        LD   C,#1A         ;Установка адреса передачи
        CALL BDOS          ;
        RET                ;
        ENDM               ;
                           ;Н а ч а л о  самой программы
START:  LD   A,#C9         ;Для скоростной работы дисковода
        LD   (#38),A       ;прерывания по таймеру отключили
        DI                 ;
        LD   HL,FILEIN     ;
        LD   DE,FIN        ;Первое слово командной строки -
        LD   BC,#0C        ;и есть первый файл
        LDIR               ;
        LD   HL,FILEOUT+1  ;
        LD   A,#20         ;
        CP   (HL)          ;
        JR   NZ,OTHER      ;
        EX   DE,HL         ;
        LD   HL,FILEIN+1   ;
        LD   BC,#0B        ;Если второго слова нет, то
        LDIR               ;имя файла(2) =: имя файла(1)
OTHER:  LD   HL,FILEOUT    ;
        LD   DE,FOUT       ;
        LD   BC,#0C        ;
        LDIR               ;
        EI                 ;
        LD   DE,FIN        ;
        LD   C,#0F         ;Открытие для считывания файла(1)
        CALL BDOS          ;
        RЕТ  NZ            ;
        LD   DE,FOUT       ;
        LD   C,#16         ;Открытие для записи файла(2)
        CALL BDOS          ;
        LD   HL,0          ;
        LD   (FIN+33),HL   ;
        LD   (FIN+35),HL   ;Считываем и записываем с 0-й записи
        LD   (FOUT+33),HL  ;
        LD   (FOUT+35),HL  ;
        INC  HL            ;
        LD   (FIN+14),HL   ;
        LD   (FOUT+14),HL  ;Размер записей = 1
SNOWA:  CALL LDIRADRES     ;
        CALL DISKIN        ;
        LD   A,H           ;Пока на выходе при считывании в HL
        OR   L             ;не будет 0, записываем количество
        JR   Z,ENDCOPY     ;считанных записей, иначе закрываем
        CALL LDIRADRES     ;файл(2)
        CALL DISKOUT       ;
        JR   SNOWA         ;
ENDCOPY:CALL DISKCLOSE     ;
        LD   DE,STROKA     ;Сообщение о выполнении
        LD   C,#9          ;
        CALL BDOS          ;
        LD   A,#C3         ;Восстановление прерываний по таймеру
        LD   (#38),A       ;и выход в систему
        RST  0             ;

;Подпрограммы работы с дисководом, FCB, сообщение, переменные.
DISKIN:     READ
DISKOUT:    WRITE
DISKCLOSE:  CLOSE
LDIRADRES:  ADRES
STROKA:     DEFB #0D,#0A
            DEFM "COPY COMPLETE$"
VAL:        DEFS 2
FIN:        DEFS 40
FOUT:       DEFS 40
KONEC:      NOP
