    ORG  1F00H
;
START:
    JMP  M00 
    RST  7
;               для варианта в ПЗУ
        DW      M00     ; точка входа в программу
        DB      20H     ; начальная страница загрузки
        DB      40H     ; количество загружаемых страниц
;
M06:LXI  SP,M00 
    JMP  M02 
        DS      256-18
T19:
        DS      4
M00:
        DI
        LXI  SP,M00     ; стек на 2100H
    MVI  B,14H
        LXI     H,0FA7FH
        LDA     0F703H
        CPI     1CH
        JZ      UST
        MVI     H,0FFH
UST:    MOV     A,B
        MOV     M,A
        STA     0F703H
    MVI  D,60H
    CALL M04    ; перемещение на 8000H
M02:
        CALL    OLD
        MVI  A,0C3H
    STA  M05 
    LXI  H,M06 
    SHLD M07 
    LXI  H,M08  ; нач. адрес АЦЗУ
    MVI  E,00H
M09:MOV  M,E
    INX  H
    MOV  A,L
    ORA  H
    JNZ  M09 
    LXI  D,M0A  ; обнуление АЦЗУ
M0F:MVI  A,0FFH
    STAX D
    XRA  A
    STA  M08 
    LXI  H,M0A 
M0E:MOV  A,E
    CMP  L
    JNZ  M0B 
    MOV  A,D
    CMP  H
    JNZ  M0B 
    MVI  A,0FFH
    CMP  M
    JNZ  M0C 
    JMP  M0D 
M0B:XRA  A
    CMP  M
    JNZ  M0C 
M0D:MOV  A,L
    ADD  A
    MOV  L,A
    JNZ  M0E 
    MOV  A,H
    RAL
    ORI  0FCH
    MOV  H,A
    ANI  03H
    JNZ  M0E 
    XRA  A
    STAX D
    MOV  A,E
    ADD  A
    MOV  E,A
    JNZ  M0F 
    MOV  A,D
    RAL
    ORI  0FCH
    MOV  D,A
    ANI  03H
    JNZ  M0F 
    JMP  M10 
M0C:CALL M11 
    LXI  B,M12 
M13:DCX  B
    MOV  A,C
    ORA  B
    JNZ  M13 
    JMP  M0C 
CONIN:
        EI
        CALL    0049H
        DI
        RET
CONST:
        EI
        CALL    0046H
        DI
        RET
;
CON:
        LXI     H,CONFIG
        LDA     0304H
        CPI     20H
        MOV     A,M
        JZ      CON1
        ORA     A
        RZ
CON1:
        RAR
        JC      CON2
        MVI     A,0FFH
        ORA     A
        RET
CON2:
        XRA     A
        ORA     A
        RET
;
M10:
    LXI  H,M15 
    CALL MSG    ; 'ФОРМАНТА ПК8020'
    MVI  A,5CH
    STA  M17    ; установка DOSA
    XRA  A
    STA  M18 
;       начальная проверка ОЗУ
    LXI  B,M12 
    LXI  H,M19 
M1C:MOV  A,B
    CMA
    MOV  E,M
    MOV  M,A
    CMA
    STAX B
    MOV  A,M
    MOV  M,E
    CMA
    CMP  B
    CNZ  M1A 
    MOV  A,B
    ORA  A
    JNZ  M1B 
    MOV  A,H
    RRC
    MOV  H,A
    JNC  M1C 
    LXI  B,M1D 
    LXI  H,M1E 
    MVI  A,00H
    STA  M03    ; установка TRS80
    JMP  M1C 
M1B:MOV  A,H
    RRC
    MOV  H,A
    JC   M1C 
    MVI  A,14H
    STA  M1F    ; установка NDOS
    LDA  M18    ; M18 - ячейка признака ошибки ОЗУ, 0 - исправно
    ORA  A
    JZ   M20 
    LXI  H,M21 
    CALL MSG    ; 'проверка невозможна'
    HLT
M18:NOP
M1A:PUSH H
    PUSH PSW
    MOV  A,H
    STA  M18 
    MOV  A,B
    ORA  A
    JNZ  M22 
    MVI  A,14H
    STA  M03 
    JMP  M23 
M22:MVI  A,14H
    STA  M1F 
M23:PUSH H
    LXI  H,M24 
    CALL MSG 
    POP  H
    CALL M25 
    MVI  A,20H
    CALL M26 
    MOV  A,B
    CMA
    CALL M27 
    MVI  A,20H
    CALL M26 
    POP  PSW
    CMA
    CALL M27 
    LXI  H,RTN 
    CALL MSG 
    POP  H
    MOV  A,B
    ORA  A
    JNZ  M29 
    MVI  A,5CH
    STA  M17 
    RET
M29:MVI  A,00H
    STA  M17 
    RET
;
;       сюда выход после начального теста ОЗУ
;
M20:CALL M2A    ; очистка ГЗУ
    LXI  H,M2B 
    CALL MSG    ; 'возможные режимы проверки'
M35:LXI  H,M2C 
    CALL MSG    ; 'выберите из списка'
    LXI  H,M2D 
    PUSH H      ; в стек - адрес вывода 'прекратить работу?'
    CALL CONIN  ; получить символ режима
    PUSH PSW
    MOV  C,A
    CALL CONOUT ; вывести символ режима
    LXI  H,M30 
    CALL MSG    ; очистить экран
    POP  PSW
    CPI  31H
    JZ   M31    ; последовательность всех тестов
    CPI  32H
    JZ   M32    ; циклическое выполнение
    CPI  33H
    JZ   M33    ; отдельные тесты
    CPI  03H
    JZ   M34    ; загрузка МикроДОС
    POP  H
    JMP  M35 
M2D:LXI  H,M36 
    CALL MSG    ; 'прекратить работу?'
    CALL M37 
    JZ   M34 
    LXI  H,M38 
    CALL MSG    ; 'временно отсутствует'
    JMP  M20 
M36:DB   0DH,0AH,'Прекратить работу? (Д/Н) ',0
;
G02:
U06:
M37:CALL CONIN 
    PUSH PSW
    MOV  C,A
    CALL CONOUT 
    POP  PSW
    ANI  5FH
    CPI  44H
    RET
;
;       последовательное выполнение всех тестов
;
M31:CALL ASZU   ; АЦЗУ
    CALL CPU 
    CALL ROM 
        CALL    PIC
        CALL    OZU
    CALL GZU 
    LXI  H,RTN 
    CALL MSG    ; вывод графической информации
    CALL M3E    ; для продолжения - ВК
    CALL M3F 
    CALL M3E    ; для продолжения - ВК
    CALL M40 
    CALL M2A    ; очистка ГЗУ
    LXI  H,M38 
    CALL MSG    ; очистка экрана
    CALL ZUM 
    CALL LAN 
        CALL    MAG
        CALL    CON
    JNZ  MFF
    CALL PRINTER 
    CALL IFPS
        CALL    NGMD
MFF:LXI  H,M45 
    CALL MSG    ; 'проверка окончена'
    RET
M3E:LXI  H,M46 
    CALL MSG 
M47:CALL CONIN 
    CPI  0DH
    JNZ  M47 
    RET
;
;       циклическое выполнение автоматических тестов
;
M32:LXI  H,M48 
    CALL MSG    ; 'задайте число циклов'
    CALL M49 
    SHLD M4A 
M50:CALL ASZU 
    CALL CPU 
    CALL ROM 
        CALL    PIC
    CALL OZU 
    CALL GZU 
    MVI  C,2AH
    CALL M4D 
    LXI  H,M4E 
    CALL MSG    ; 'осталось провести циклов'
    LHLD M4A
    MOV  A,L
    ADI  99H
    DAA
    MOV  L,A
    MOV  A,H
    ACI  99H
    DAA
    MOV  H,A
    SHLD M4A 
    ORA  L
    PUSH PSW
    CALL M25 
    LXI  H,RTN 
    CALL MSG    ; ВКПС
    CALL M4F 
    CALL ZUM 
    POP  PSW
    JNZ  M50 
;               перевод строки на принтере
    MVI  C,0DH
    CALL M4D 
    MVI  C,0AH
    CALL M4D 
;
    LXI  H,M51 
    CALL MSG    ; 'нужны операторские тесты?'
    CALL M37 
    RNZ
    CALL M3F    ; отображение информации
    CALL M3E    ; для продолжения ВК
    CALL M40    ; проверка клавиатуры
        CALL    M2A     ; очистка ГЗУ
        LXI     H,M38
        CALL    MSG     ; очистка АЦЗУ
        CALL    MAG
        CALL    CON
    JNZ  MFE
        CALL    PRINTER
        CALL    IFPS
        CALL    NGMD
MFE:CALL M2A 
    LXI  H,M38 
    CALL MSG    ; очистка экрана
    RET
M4A:NOP
    NOP
M48:DB   'Задайте число циклов (1 - 9999): '
    DB   1BH    ; запрет курсора
    DB   ';    '
    DB   00H
M56:DB   1BH    ; разрешение курсора
    DB   ':'
    DB   00H
M52:DB   08H
    DB   08H
    DB   08H
    DB   08H    ; возврат курсора на 4 позиции
    DB   00H
M4E:DB   0DH
    DB   0AH
    DB   'Осталось провести циклов: ',0
M51:DB   'Нужны операторские тесты? (Д/Н) ',0
M49:LXI  H,M12 
M55:PUSH H
    LXI  H,M52 
    CALL MSG    ; возврат курсора на 4 позиции
    POP  H
    PUSH H
    CALL M25 
M54:CALL CONIN 
    CPI  0DH
    JZ   M53 
    SUI  30H
    JC   M54 
    CPI  0AH
    JNC  M54 
    POP  H
    DAD  H
    DAD  H
    DAD  H
    DAD  H
    ORA  L
    MOV  L,A
    JMP  M55 
M53:LXI  H,M56 
    CALL MSG    ; разрешение курсора
    POP  H
    RET
M4F:RET
;
;       выполнение отдельных тестов
;
M33:CALL M2A    ; очистка ГЗУ
    LXI  H,M57 
    CALL MSG    ; меню тестов
    LXI  H,M2C 
    CALL MSG    ; 'выберите из списка'
    CALL CONIN  ; ввод номера теста
    PUSH PSW
    MOV  C,A
    CALL CONOUT ; вывод номера теста
    LXI  H,M30 
    CALL MSG    ; ВКПС 2 раза
    POP  PSW
    CPI  30H
    JNZ  M58 
    LXI  SP,M00 
    JMP  M20    ; рестарт
M58:LXI  H,M33 
    PUSH H      ; установка адреса возврата
    CPI  31H
    JZ   ASZU 
    CPI  32H
    JZ   CPU 
    CPI  33H
    JZ   OZU 
    CPI  34H
    JZ   ROM 
    CPI  35H
    JZ   GZU 
    CPI  36H
    JNZ  M59 
    CALL M3F 
    CALL M3E 
    LXI  H,M38 
    CALL MSG 
    RET
M59:CPI  37H
    JNZ  M5A 
    CALL M40 
    LXI  H,M38 
    CALL MSG 
    RET
M5A:CPI  38H
    JZ   ZUM 
    CPI  39H
    JZ   LAN 
    CPI  41H
    JZ   PRINTER 
    CPI  42H
    JZ   MAG 
    CPI  43H
    JZ   IFPS
        CPI     44H
        JZ      NGMD
        CPI     45H
        JZ      PIC
    RET
;
;       тест ОЗУ
;
OZU:CALL M5C    ; тест ОЗУ 0000 - 7FFF
    MVI  D,0C0H
    CALL M04    ; перемещение на 4000H
    LXI  H,M5D 
    CALL MSG    ; 'окончено'
    CALL M5E    ; тест ОЗУ 8000 - FFFF
    MVI  D,40H
    CALL M04    ; перемещение на 8000H
    LXI  H,M5D 
    CALL MSG    ; 'окончено'
        MVI     A,0C3H
        STA     M05
        LXI     H,M06
        SHLD    M07
;
        LHLD    0F700H
        PUSH    H
        LHLD    0F703H
        PUSH    H
        LHLD    0F705H
        PUSH    H
;
        LXI     H,100H
        LXI     D,0F600H
        MVI     B,2
MOVE:
        MOV     A,M
        STAX    D
        INX     H
        INR     E
        JNZ     MOVE
        INR     D
        DCR     B
        JNZ     MOVE
;
        POP     H
        SHLD    0F705H
        POP     H
        SHLD    0F703H
        POP     H
        SHLD    0F700H
;
        LXI     H,STIR
        CALL    MSG
   RET
;
STIR:   DB      20H,8,0
;
;       очистка ГЗУ
;
N25:
M2A:MVI  A,60H
    STA  M17    ; установка BASG
    MVI  A,80H
    STA  M5F 
    LXI  H,M60 
M61:MVI  M,0FFH
    INX  H
    MOV  A,H
    ORA  L
    JNZ  M61 
    MVI  A,14H
    STA  M62    ; установка NDOS
    RET
;
;       программа перемещения
;       в DE - величина перемещения
;
M04:LXI  H,M63 
    CALL MSG    ; 'перемещение КТДП'
    LXI  H,START; начало программы
    SHLD M65 
    LXI  H,M66  ; адрес начала BITMAP
    SHLD M67 
M6B:LHLD M67 
    MOV  B,M
    INX  H
    SHLD M67 
    DCX  H
    MOV  A,H
    ADD  D
    MOV  H,A    ; новый адрес вычислен
    MOV  M,B    ; запись по новому адресу
    MVI  C,08H
M6A:MOV  A,B
    RLC
    MOV  B,A
    MVI  A,00H
    JNC  M68 
    MOV  A,D
M68:LHLD M65 
    ADD  M      ; коррекция адреса при необходимости
    MOV  E,A
    INX  H
    SHLD M65 
    DCX  H
    MOV  A,H
    ADD  D
    MOV  H,A
    MOV  M,E
    PUSH D
    LHLD M65 
    LXI  D,M66 
    MOV  A,E
    SUB  L
    MOV  A,D
    SBB  H
    POP  D
    JC   M69 
    DCR  C
    JNZ  M6A 
    JMP  M6B 
M69:LXI  H,M12 
    DAD  SP
    MOV  A,H
    ADD  D
    MOV  H,A
    SPHL
    POP  H
    MOV  A,H
    ADD  D
    MOV  H,A
    PCHL
M65:DS   2
M67:DS   2
ASZU:LXI  H,M38 
    CALL MSG    ; очистка экрана
    LXI  H,M6C 
    CALL MSG    ; 'тест АЦЗУ'
    LXI  B,M6D  ; VIREG
    MVI  A,10H  ; ATRSET
    STAX B
    LXI  H,M08  ; перезапись содержимого АЦЗУ в буфер на 2000H
    LXI  D,M64 
M6E:MOV  A,M
    STAX D
    MVI  M,00H
    INX  H
    INX  D
    MOV  A,H
    ORA  L
    JNZ  M6E 
    LHLD M6F    ; ячейка адреса курсора
    MOV  A,H
    ANI  23H
    MOV  H,A
    SHLD M70    ; сохранить адрес курсора
    LXI  D,M71 
    MVI  C,3AH
    MVI  A,20H  ; ATRRES
    STAX B
M78:MVI  A,30H  ; ATRFRE
    STAX B
    MVI  C,38H
    LXI  H,M08 
M74:MOV  A,M
    CMP  E
    JNZ  M72 
    LDAX B
    ANI  08H
    CMP  D
M72:CNZ  M73 
    INX  H
    MOV  A,H
    ORA  L
    JNZ  M74 
    ORA  D
    JZ   M75 
    MVI  C,3AH
    MVI  A,20H  ; ATRRES
    STAX B
    LXI  H,M08 
M76:MVI  M,0FFH
    INX  H
    MOV  A,L
    ORA  H
    JNZ  M76 
    LXI  D,M77 
    MVI  A,10H  ; ATRSET
    STAX B
    JMP  M78 
M75:MVI  C,3AH
    MVI  A,20H
    STAX B
    MVI  C,0FH
M82:LXI  D,M79 
M81:LXI  H,M08 
M7C:MOV  A,E
    ANA  L
    JNZ  M7A 
    MOV  A,D
    ANA  H
M7A:MOV  A,C
    JZ   M7B 
    CMA
M7B:MOV  M,A
    INX  H
    MOV  A,H
    ORA  L
    JNZ  M7C 
    LXI  H,M08 
M80:MOV  A,E
    ANA  L
    JNZ  M7D 
    MOV  A,D
    ANA  H
M7D:MOV  B,M
    MOV  A,C
    JZ   M7E 
    CMA
M7E:CMP  B
    CNZ  M7F 
    INX  H
    MOV  A,H
    ORA  L
    JNZ  M80 
    MOV  A,E
    ADD  A
    MOV  E,A
    JNZ  M81 
    MOV  A,D
    RAL
    MOV  D,A
    ANI  04H
    JZ   M81 
    MOV  A,C
    RLC
    MOV  C,A
    CPI  0FH
    JNZ  M82 
M89:MVI  A,20H  ; ATRRES
    STA  M6D 
    LXI  H,M08 
    LXI  D,M64  ; содержимое АЦЗУ до теста
M83:LDAX D
    MOV  M,A
    INX  D
    INX  H
    MOV  A,H
    ORA  L
    JNZ  M83 
    LHLD M70 
    MOV  A,H
    ORI  0FCH
    MOV  H,A
    SHLD M6F    ; адрес курсора
    LXI  H,M84 
    CALL MSG    ; 'окончен'
    RET         ; выход из теста AЦЗУ
M73:PUSH D
    PUSH H
    LHLD M70 
    CALL M85 
    JNC  M86 
    POP  D
    CALL M87 
    MVI  M,20H
    INX  H
    XCHG
    XTHL
    XCHG
    MOV  A,D
    RRC
    RRC
    RRC
    ADI  30H
    MOV  M,A
    INX  H
    MOV  A,E
    CALL M88 
    MVI  M,20H
    INX  H
    XCHG
    XTHL
    XCHG
    LDAX B
    ANI  08H
    RRC
    RRC
    RRC
    ADI  30H
    MOV  M,A
    INX  H
    LDAX D
    CALL M88 
    SHLD M70 
    XCHG
    POP  D
    RET
M86:SHLD M70 
    POP  H
    POP  D
    POP  PSW
    JMP  M89 
M7F:PUSH D
    PUSH B
    PUSH PSW
    PUSH H
    LHLD M70 
    CALL M85 
    JC   M8A 
    SHLD M70 
    POP  H
    POP  PSW
    POP  B
    POP  D
    POP  PSW
    JMP  M89 
M8A:POP  D
    CALL M87 
    MVI  M,20H
    INX  H
    POP  PSW
    CALL M88 
    MVI  M,20H
    INX  H
    POP  B
    MOV  A,B
    CALL M88 
    SHLD M70 
    XCHG
    POP  D
    RET
M85:MOV  A,L
    ANI  0FH
    JZ   M8B 
    INX  H
    JMP  M85 
M8B:MOV  A,H
    CPI  23H
    RC
    MOV  A,L
    CPI  80H
    RET
M70:NOP
    NOP
CPU:LXI  H,M8C 
    CALL MSG    ; 'тест процессора'
    MVI  A,5CH
    STA  M17 
    LXI  H,M8D 
    LXI  D,M12 
    MVI  C,03H
    CALL M8E 
    ANI  00H
    JZ   M8F 
    RST  0
M8F:JNC  M90 
    RST  0
M90:JPE  M91 
    RST  0
M91:JP   M92 
    RST  0
M92:JNZ  M93 
    JC   M93 
    JPO  M93 
    JM   M93 
    JMP  M94 
M93:RST  0
M94:ADI  06H
    JNZ  M95 
    RST  0
M95:JC   M96 
    JPO  M96 
    JP   M97 
M96:RST  0
M97:ADI  70H
    JPO  M98 
    RST  0
M98:JM   M99 
    JZ   M99 
    JNC  M9A 
M99:RST  0
M9A:ADI  81H
    JM   M9B 
    RST  0
M9B:JZ   M9C 
    JC   M9C 
    JPO  M9D 
M9C:RST  0
M9D:ADI  0FEH
    JC   M9E 
    RST  0
M9E:JZ   M9F 
    JPO  M9F 
    JM   MA0 
M9F:RST  0
MA0:CPI  00H
    JC   MA1 
    JZ   MA1 
    CPI  0F5H
    JC   MA1 
    JNZ  MA1 
    CPI  0FFH
    JZ   MA1 
    JC   MA2 
MA1:RST  0
MA2:ACI  0AH
    ACI  0AH
    CPI  0BH
    JZ   MA3 
    RST  0
MA3:SUI  0CH
    SUI  0FH
    CPI  0F0H
    JZ   MA4 
    RST  0
MA4:SBI  0F1H
    SBI  0EH
    CPI  0F0H
    JZ   MA5 
    RST  0
MA5:ANI  55H
    CPI  50H
    JZ   MA6 
    RST  0
MA6:ORI  3AH
    CPI  7AH
    JZ   MA7 
    RST  0
MA7:XRI  0FH
    CPI  75H
    JZ   MA8 
    RST  0
MA8:ANI  00H
    CC   MA9 
    CPO  MA9 
    CM   MA9 
    CNZ  MA9 
    CPI  00H
    JZ   MAA 
    RST  0
MAA:SUI  77H
    CNC  MA9 
    CPE  MA9 
    CP   MA9 
    CZ   MA9 
    CPI  89H
    JZ   MAB 
    RST  0
MA9:RST  0
MAB:ANI  0FFH
    CPO  MAC 
    CPI  0D9H
    JZ   MAD 
    RST  0
MAC:RPE
    ADI  10H
    CPE  MAE 
    ADI  02H
    RPO
    RST  0
MAE:RPO
    ADI  20H
    CM   MAF 
    ADI  04H
    RPE
    RST  0
MAF:RP
    ADI  80H
    CP   MB0 
    ADI  80H
    RM
    RST  0
MB0:RM
    ADI  40H
    CNC  MB1 
    ADI  40H
    RP
    RST  0
MB1:RC
    ADI  8FH
    CC   MB2 
    SUI  02H
    RNC
    RST  0
MB2:RNC
    ADI  0F7H
    CNZ  MB3 
    ADI  0FEH
    RC
    RST  0
MB3:RZ
    ADI  01H
    CZ   MB4 
    ADI  0D0H
    RNZ
    RST  0
MB4:RNZ
    ADI  47H
    CPI  47H
    RZ
    RST  0
MAD:MVI  A,11H
    MVI  B,22H
    MVI  C,33H
    MVI  D,44H
    MVI  E,55H
    MVI  H,66H
    MVI  L,77H
    CPI  11H
    CNZ  M12 
    CMP  B
    CZ   M12 
    CMP  C
    CZ   M12 
    CMP  D
    CZ   M12 
    CMP  E
    CZ   M12 
    CMP  H
    CZ   M12 
    CMP  L
    CZ   M12 
    CMP  A
;
M03:EQU  0FF7FH
M05:EQU  0F5FDH
M07:EQU  0F5FEH
M08:EQU  0FC00H
M0A:EQU  0FC01H
M11:EQU  00C9H
M12:EQU  0000H
M14:EQU  0FB29H
M17:EQU  0FA7FH
M19:EQU  8000H
M1D:EQU  0FFFFH
M1E:EQU  7FFFH
M1F:EQU  3A7FH
M34:EQU  0043H
M5F:EQU  0BFBFH
M60:EQU  0C000H
M62:EQU  0BF7FH
M64:EQU  2000H
M6D:EQU  0FB3AH
M6F:EQU  0F705H
M71:EQU  0800H
M77:EQU  00FFH
M79:EQU  0001H
M87:EQU  00E1H
M88:EQU  00E6H
    CNZ  T00 
    ADI  11H
    CMP  B
    CNZ  T00 
    ADI  11H
    CMP  C
    CNZ  T00 
    ADI  11H
    CMP  D
    CNZ  T00 
    ADI  11H
    CMP  E
    CNZ  T00 
    ADI  11H
    CMP  H
    CNZ  T00 
    ADI  11H
    CMP  L
    CNZ  T00 
    INR  A
    INR  B
    INR  C
    INR  D
    INR  E
    INR  H
    INR  L
    DCR  A
    DCR  B
    DCR  C
    DCR  D
    DCR  E
    DCR  H
    DCR  L
    CPI  77H
    CNZ  T00 
    CMP  L
    CNZ  T00 
    SUI  11H
    CMP  H
    CNZ  T00 
    SUI  11H
    CMP  E
    CNZ  T00 
    SUI  11H
    CMP  D
    CNZ  T00 
    SUI  11H
    CMP  C
    CNZ  T00 
    SUI  11H
    CMP  B
    CNZ  T00 
    MVI  A,0AAH
    MOV  B,A
    MOV  C,B
    MOV  D,C
    MOV  E,D
    MOV  H,E
    MOV  L,H
    MOV  A,L
    CPI  0AAH
    CNZ  T00 
    MVI  A,0BBH
    MOV  C,A
    MOV  E,C
    MOV  L,E
    MOV  B,L
    MOV  D,B
    MOV  H,D
    MOV  A,H
    CPI  0BBH
    CNZ  T00 
    MVI  A,0CCH
    MOV  D,A
    MOV  L,D
    MOV  C,L
    MOV  H,C
    MOV  B,H
    MOV  E,B
    MOV  A,E
    CPI  0CCH
    CNZ  T00 
    MVI  A,0DDH
    MOV  E,A
    MOV  B,E
    MOV  H,B
    MOV  C,H
    MOV  L,C
    MOV  D,L
    MOV  A,D
    CPI  0DDH
    CNZ  T00 
    MVI  A,0EEH
    MOV  H,A
    MOV  D,H
    MOV  B,D
    MOV  L,B
    MOV  E,L
    MOV  C,E
    MOV  A,C
    CPI  0EEH
    CNZ  T00 
    MVI  A,0FFH
    MOV  L,A
    MOV  H,L
    MOV  E,H
    MOV  D,E
    MOV  C,D
    MOV  B,C
    MOV  A,B
    CPI  0FFH
    CNZ  T00 
    MVI  A,00H
    MVI  B,01H
    MVI  C,03H
    MVI  D,07H
    MVI  E,0FH
    MVI  H,1FH
    MVI  L,3FH
    ADD  B
    ADD  C
    ADD  D
    ADD  E
    ADD  H
    ADD  L
    ADD  A
    CPI  0F0H
    CNZ  T00 
    SUB  B
    SUB  C
    SUB  D
    SUB  E
    SUB  H
    SUB  L
    CPI  78H
    CNZ  T00 
    SUB  A
    CNZ  T00 
    MVI  A,80H
    ADD  A
    MVI  B,01H
    MVI  C,02H
    MVI  D,03H
    MVI  E,04H
    MVI  H,05H
    MVI  L,06H
    ADC  B
    MVI  B,80H
    ADD  B
    ADD  B
    ADC  C
    ADD  B
    ADD  B
    ADC  D
    ADD  B
    ADD  B
    ADC  E
    ADD  B
    ADD  B
    ADC  H
    ADD  B
    ADD  B
    ADC  L
    ADD  B
    ADD  B
    ADC  A
    CPI  37H
    CNZ  T00 
    MVI  A,80H
    ADD  A
    MVI  B,01H
    SBB  B
    MVI  B,0FFH
    ADD  B
    SBB  C
    ADD  B
    SBB  D
    ADD  B
    SBB  E
    ADD  B
    SBB  H
    ADD  B
    SBB  L
    CPI  0E0H
    CNZ  T00 
    MVI  A,80H
    ADD  A
    SBB  A
    CPI  0FFH
    CNZ  T00 
    MVI  A,00H
    MVI  B,01H
    MVI  C,02H
    MVI  D,04H
    MVI  E,08H
    MVI  H,10H
    MVI  L,20H
    STC
    ORA  B
    ORA  C
    ORA  D
    ORA  E
    ORA  H
    ORA  L
    ORA  A
    CC   T00 
    CPI  3FH
    CNZ  T00 
    MVI  A,0FFH
    MVI  B,0FEH
    MVI  C,0FCH
    MVI  D,0EFH
    MVI  E,7FH
    MVI  H,0F4H
    MVI  L,0BFH
    STC
    ANA  B
    ANA  C
    ANA  D
    ANA  E
    ANA  H
    ANA  L
    ANA  A
    CC   T00 
    CPI  24H
    CNZ  T00 
    MVI  A,00H
    MVI  B,01H
    MVI  C,02H
    MVI  D,04H
    MVI  E,08H
    MVI  H,8FH
    MVI  L,4FH
    STC
    XRA  B
    XRA  C
    XRA  D
    XRA  E
    XRA  H
    XRA  L
    CC   T00 
    CPI  0CFH
    CNZ  T00 
    XRA  A
    CNZ  T00 
    MVI  B,44H
    MVI  C,45H
    MVI  D,46H
    MVI  E,47H
    MVI  H,00H
    MVI  L,4EH
    MOV  M,B
    MVI  B,00H
    MOV  B,M
    MVI  A,44H
    CMP  B
    CNZ  T00 
    MOV  M,C
    MVI  C,00H
    MOV  C,M
    MVI  A,45H
    CMP  C
    CNZ  T00 
    MOV  M,D
    MVI  D,00H
    MOV  D,M
    MVI  A,46H
    CMP  D
    CNZ  T00 
    MOV  M,E
    MVI  E,00H
    MOV  E,M
    MVI  A,47H
    CMP  E
    CNZ  T00 
    MOV  M,H
    MVI  H,00H
    MVI  L,4EH
    MOV  H,M
    MVI  A,00H
    CMP  H
    CNZ  T00 
    MOV  M,L
    MVI  H,00H
    MVI  L,4EH
    MOV  L,M
    MVI  A,4EH
    CMP  L
    CNZ  T00 
    MVI  H,00H
    MVI  L,4EH
    MVI  A,32H
    MOV  M,A
    CMP  M
    CNZ  T00 
    ADD  M
    CPI  64H
    CNZ  T00 
    XRA  A
    MOV  A,M
    CPI  32H
    CNZ  T00 
    MVI  A,11H
    MVI  B,22H
    MVI  C,33H
    MVI  D,10H
    MVI  E,03H
    MVI  H,05H
    MVI  L,07H
    NOP
    MOV  A,A
    NOP
    MOV  B,B
    NOP
    MOV  C,C
    NOP
    MOV  D,D
    NOP
    MOV  E,E
    NOP
    MOV  H,H
    NOP
    MOV  L,L
    ADD  B
    ADD  C
    ADD  D
    ADD  E
    ADD  H
    ADD  L
    CPI  85H
    CNZ  T00 
    MVI  H,00H
    MVI  L,4EH
    MOV  A,M
    SUB  M
    CNZ  T00 
    MVI  A,80H
    ADD  A
    ADC  M
    CPI  33H
    CNZ  T00 
    MVI  A,80H
    ADD  A
    SBB  M
    CPI  0CDH
    CNZ  T00 
    ANA  M
    CNZ  T00 
    MVI  A,25H
    ORA  M
    CPI  37H
    CNZ  T00 
    XRA  M
    CPI  05H
    CNZ  T00 
    MVI  A,22H
    MVI  M,55H
    INR  A
    INR  M
    DCR  A
    DCR  M
    ADD  M
    CPI  77H
    CNZ  T00 
    LXI  B,T01 
    LXI  D,T01 
    LXI  H,T01 
    INX  B
    INX  D
    INX  H
    MVI  A,13H
    CMP  B
    CNZ  T00 
    CMP  D
    CNZ  T00 
    CMP  H
    CNZ  T00 
    MVI  A,00H
    CMP  C
    CNZ  T00 
    CMP  E
    CNZ  T00 
    CMP  L
    CNZ  T00 
    DCX  B
    DCX  D
    DCX  H
    MVI  A,12H
    CMP  B
    CNZ  T00 
    CMP  D
    CNZ  T00 
    CMP  H
    CNZ  T00 
    MVI  A,0FFH
    CMP  C
    CNZ  T00 
    CMP  E
    CNZ  T00 
    CMP  L
    CNZ  T00 
    MVI  A,55H
    STA  T02 
    XRA  A
    LDA  T02 
    CPI  55H
    CNZ  T00 
    LHLD T03 
    SHLD T02 
    LDA  T03 
    MOV  B,A
    LDA  T02 
    CMP  B
    CNZ  T00 
    LDA  T04 
    MOV  B,A
    LDA  T05 
    CMP  B
    CNZ  T00 
    MVI  A,0AAH
    STA  T02 
    LXI  B,T00 
    MOV  B,H
    MOV  C,L
    XRA  A
    LDAX B
    CPI  0AAH
    CNZ  T00 
    MVI  A,0FFH
    STAX B
    XRA  A
    LDA  T02 
    CPI  0FFH
    CNZ  T00 
    MVI  A,77H
    STA  T02 
    LHLD T03 
    LXI  D,T00 
    XCHG
    XRA  A
    LDAX D
    CPI  77H
    CNZ  T00 
    XRA  A
    ADD  H
    ADD  L
    CNZ  T00 
    MVI  A,0CCH
    STAX D
    XRA  A
    LDA  T02 
    CPI  0CCH
    CNZ  T00 
    LXI  H,T06 
    DAD  H
    MVI  A,0EEH
    CMP  H
    CNZ  T00 
    CMP  L
    CNZ  T00 
    LXI  H,T07 
    LXI  B,T08 
    DAD  B
    MVI  A,55H
    CNC  T00 
    CMP  H
    CNZ  T00 
    MVI  A,54H
    CMP  L
    CNZ  T00 
    LXI  H,T09 
    LXI  D,T0A 
    DAD  D
    MVI  A,0DDH
    CMP  H
    CNZ  T00 
    CMP  L
    CNZ  T00 
    STC
    CNC  T00 
    CMC
    CC   T00 
    MVI  A,55H
    CMA
    CPI  0AAH
    CNZ  T00 
    XRA  A
    MVI  A,55H
    DAA
    CPI  55H
    CNZ  T00 
    MVI  A,88H
    ADD  A
    DAA
    CPI  76H
    CNZ  T00 
    XRA  A
    MVI  A,0AAH
    DAA
    CNC  T00 
    CPI  10H
    CNZ  T00 
    XRA  A
    MVI  A,9AH
    DAA
    CNC  T00 
    CNZ  T00 
    STC
    MVI  A,42H
    RLC
    CC   T00 
    RLC
    CNC  T00 
    CPI  09H
    CNZ  T00 
    RRC
    CNC  T00 
    RRC
    CPI  42H
    CNZ  T00 
    RAL
    RAL
    CNC  T00 
    CPI  08H
    CNZ  T00 
    RAR
    RAR
    CC   T00 
    CPI  02H
    CNZ  T00 
    LXI  B,T0B 
    LXI  D,T09 
    LXI  H,T07 
    XRA  A
    PUSH B
    PUSH D
    PUSH H
    PUSH PSW
    LXI  B,T00 
    LXI  D,T00 
    LXI  H,T00 
    MVI  A,0C0H
    ADI  0F0H
    POP  PSW
    POP  H
    POP  D
    POP  B
    CC   T00 
    CNZ  T00 
    CPO  T00 
    CM   T00 
    MVI  A,12H
    CMP  B
    CNZ  T00 
    MVI  A,34H
    CMP  C
    CNZ  T00 
    MVI  A,0AAH
    CMP  D
    CNZ  T00 
    CMP  E
    CNZ  T00 
    MVI  A,55H
    CMP  H
    CNZ  T00 
    CMP  L
    CNZ  T00 
    LXI  H,T00 
    DAD  SP
    SHLD T0C 
    LXI  SP,T0D 
    DCX  SP
    DCX  SP
    INX  SP
    DCX  SP
    MVI  A,55H
    STA  T0E 
    CMA
    STA  T0F 
    POP  B
    CMP  B
    CNZ  T00 
    CMA
    CMP  C
    CNZ  T00 
    LXI  H,T0D 
    SPHL
    LXI  H,T10 
    DCX  SP
    DCX  SP
    XTHL
    LDA  T0F 
    CPI  77H
    CNZ  T00 
    LDA  T0E 
    CPI  33H
    CNZ  T00 
    MVI  A,55H
    CMP  L
    CNZ  T00 
    CMA
    CMP  H
    CNZ  T00 
    LHLD T0C 
    SPHL
    LXI  H,T11 
    PCHL
    CALL T00 
T11:LXI  H,T12 
    LXI  D,T00 
    MVI  C,3BH
    CALL T13 
    RST  0
    CPI  00H
    JZ   T14 
    LXI  H,T12 
    LXI  D,T00 
    MVI  C,3BH
    CALL T13 
    CALL T00 
T14:RST  1
    CPI  01H
    CNZ  T00 
    RST  2
    CPI  02H
    CNZ  T00 
    RST  3
    CPI  03H
    CNZ  T00 
    RST  4
    CPI  04H
    CNZ  T00 
    RST  5
    CPI  05H
    CNZ  T00 
    RST  6
    CPI  06H
    CNZ  T00 
    RST  7
    CPI  07H
    CNZ  T00 
    LXI  H,T12 
    LXI  D,T00 
    MVI  C,3BH
    CALL T13 
    LXI  H,T15 
    LXI  D,T00 
    MVI  C,03H
    CALL T13 
    MVI  A,14H
    STA  T16 
    LXI  H,T17 
    CALL MSG 
    LXI  SP,T19 
    RET
T1D:LXI  H,T15 
    LXI  D,T00 
    MVI  C,03H
    CALL T13 
    MVI  A,14H
    STA  T16 
    LXI  H,T1A 
    CALL MSG 
    LXI  H,RTN 
    CALL MSG 
    LXI  SP,T19 
    RET
;
M8E:
T13:MOV  A,M
    XCHG
    MOV  B,M
    MOV  M,A
    XCHG
    MOV  M,B
    INX  H
    INX  D
    DCR  C
    JNZ  T13 
    RET
T03:DW   T02
T04:EQU  T03+1
T02:DB   0
T05:NOP
    NOP
    NOP
    NOP
    NOP
    NOP
T0E:NOP
T0F:NOP
T0D:NOP
T0C:NOP
    NOP
;
M8D:
T15:JMP  T1D 
T12:MVI  A,00H
    RET
    NOP
    NOP
    NOP
    NOP
    NOP
    MVI  A,01H
    RET
    NOP
    NOP
    NOP
    NOP
    NOP
    MVI  A,02H
    RET
    NOP
    NOP
    NOP
    NOP
    NOP
    MVI  A,03H
    RET
    NOP
    NOP
    NOP
    NOP
    NOP
    MVI  A,04H
    RET
    NOP
    NOP
    NOP
    NOP
    NOP
    MVI  A,05H
    RET
    NOP
    NOP
    NOP
    NOP
    NOP
    MVI  A,06H
    RET
    NOP
    NOP
    NOP
    NOP
    NOP
    MVI  A,07H
    RET
;
M5C:LXI  H,T1E 
    CALL MSG 
    MVI  C,0FH
    XRA  A
    STA  T1F 
T30:PUSH B
    LXI  H,T20 
    CALL MSG 
    LDA  T1F 
    CALL T21 
    MVI  A,09H
    CALL T22 
    POP  B
    MVI  A,5CH
    STA  T23 
    LXI  D,T24 
T2F:LXI  H,T25 
T28:DCX  H
    MOV  A,E
    ANA  L
    JNZ  T26 
    MOV  A,D
    ANA  H
T26:MOV  A,C
    JZ   T27 
    CMA
T27:MOV  M,A
    MOV  A,H
    ORA  L
    JNZ  T28 
    LXI  H,T29 
T2A:DCX  H
    MOV  A,H
    ORA  L
    JNZ  T2A 
    LXI  H,T25 
T2E:DCX  H
    MOV  A,E
    ANA  L
    JNZ  T2B 
    MOV  A,D
    ANA  H
T2B:MOV  B,M
    MOV  A,C
    JZ   T2C 
    CMA
T2C:CMP  B
    CNZ  T2D 
    MOV  A,H
    ORA  L
    JNZ  T2E 
    MOV  A,E
    ADD  A
    MOV  E,A
    JNZ  T2F 
    MOV  A,D
    RAL
    MOV  D,A
    ANI  80H
    JZ   T2F 
    MVI  A,14H
    STA  T16 
    MVI  A,2AH
    CALL T22 
    LXI  H,RTN 
    CALL MSG    ; ВКПС
    LXI  H,T1F 
    INR  M
    MOV  A,C
    RLC
    MOV  C,A
    CPI  0FH
    JNZ  T30 
    RET
T2D:PUSH D
    PUSH B
    PUSH PSW
    PUSH H
    MVI  A,14H
    STA  T16 
    LXI  H,T31 
    CALL MSG    ; 'ошибка ОЗУ'
    POP  H
    CALL T32 
    MVI  A,20H
    CALL T22 
    POP  PSW
    CALL T21 
    MVI  A,20H
    CALL T22 
    POP  B
    MOV  A,B
    CALL T21 
    PUSH H
    LXI  H,RTN 
    CALL MSG    ; ВКПС
    MVI  A,5CH
    STA  T23 
    POP  H
    POP  D
    RET
T20:DB   9,'Проход #',0
T1F:NOP
;
M5E:
    LXI  H,T35 
    CALL MSG    ; 'тест ОЗУ 8000-FFFF'
    LXI  H,RTN 
    CALL MSG    ; ВКПС
    MVI  C,0FH
    XRA  A
    STA  T1F 
T41:PUSH B
    LXI  H,T20 
    CALL MSG    ; 'проход #'
    LDA  T1F 
    CALL T21    ; вывод N прохода
    MVI  A,09H
    CALL T22    ; табуляция
    CALL T36 
    MVI  A,00H
    STA  T23 
    POP  B
    LXI  D,T24 
T3F:LXI  H,T25 
T39:MOV  A,E
    ANA  L
    JNZ  T37 
    MOV  A,D
    ANA  H
T37:MOV  A,C
    JZ   T38 
    CMA
T38:MOV  M,A
    INX  H
    MOV  A,H
    ORA  L
    JNZ  T39 
    LXI  H,T29 
T3A:DCX  H
    MOV  A,H
    ORA  L
    JNZ  T3A 
    LXI  H,T25 
T3E:MOV  A,E
    ANA  L
    JNZ  T3B 
    MOV  A,D
    ANA  H
T3B:MOV  B,M
    MOV  A,C
    JZ   T3C 
    CMA
T3C:CMP  B
    CNZ  T3D 
    INX  H
    MOV  A,H
    ORA  L
    JNZ  T3E 
    MOV  A,E
    ADD  A
    MOV  E,A
    JNZ  T3F 
    MOV  A,D
    RAL
    MOV  D,A
    ANI  80H
    JZ   T3F 
    PUSH B
    MVI  A,14H
    STA  T40 
    CALL T36 
    MVI  A,2AH
    CALL T22    ; '*'
    LXI  H,RTN 
    CALL MSG    ; ВКПС
    LXI  H,T1F 
    INR  M
    POP  B
    MOV  A,C
    RLC
    MOV  C,A
    CPI  0FH
    JNZ  T41 
    RET
T36:LXI  H,2000H        ; буфер системной области
    LXI  D,0F5FDH       ; начало системной области
    MVI  C,03H          ; число обменивающихся ячеек
    CALL T13            ; обмен 3-х ячеек рестарта
    CALL T13            ; обмен страницы
    CALL T13            ; обмен страницы
    RET
T3D:PUSH D
    PUSH B
    PUSH PSW
    PUSH H
    MVI  A,14H
    STA  T40 
    CALL T36 
    LXI  H,T31 
    CALL MSG 
    POP  H
    CALL T32 
    MVI  A,20H
    CALL T22 
    POP  PSW
    CALL T21 
    MVI  A,20H
    CALL T22 
    POP  B
    MOV  A,B
    CALL T21 
    PUSH B
    PUSH H
    LXI  H,RTN 
    CALL MSG 
    CALL T36 
    MVI  A,00H
    STA  T23 
    POP  H
    POP  B
    POP  D
    RET
;
ROM:
    LXI  H,T44 
    CALL MSG 
    MVI  A,40H
    STA  T23 
    LXI  H,T00 
    MOV  B,L
    LXI  D,T45 
    CALL T46 
    CPI  0
    JZ   T47 
        CPI     0BFH
        JZ      T47
    MOV  A,B
    ORI  01H
    MOV  B,A
T47:MVI  D,3FH
    CALL T46 
    CPI  0A7H
    JZ   T48 
        CPI     0CFH
        JZ      T48
    MOV  A,B
    ORI  02H
    MOV  B,A
T48:MVI  D,5FH
    CALL T46 
    CPI  5BH
    JZ   T49 
        CPI     72H
        JZ      T49
    MOV  A,B
    ORI  04H
    MOV  B,A
T49:MOV  A,B
    ORA  A
    PUSH PSW
    MVI  A,14H
    STA  T23 
    LXI  H,T17 
    CALL MSG 
    POP  PSW
    RZ
    MVI  C,03H
T4B:RRC
    CC   T4A 
    DCR  C
    JNZ  T4B 
    MVI  C,07H
    CALL T4C 
    RET
T4A:PUSH PSW
    PUSH B
    LXI  H,T4D 
    CALL MSG 
    POP  B
    PUSH B
    MVI  A,03H
    SUB  C
    CALL T4E 
    MOV  C,A
    CALL T4C 
    LXI  H,RTN 
    CALL MSG 
    POP  B
    POP  PSW
    RET
;
GZU:
    LXI  H,T4F 
    CALL MSG    ; 'тест ГЗУ'
    LXI  H,T50  ; "конфигурация:"
    CALL MSG 
;
    MVI  A,20H
    STA  T23    ; ROMB2
    XRA  A
    STA  T51    ; байт признаков наличия/отсутствия слоев
                ; окончательный формат:0001 0101; D0-слой 0,
                ; D2-слой 1, D4-слой 2
    LXI  B,5546H        ; B-проверочный байт, C-режим для сл.2
    LXI  D,NCREG+RGBASE1 
    LXI  H,GRBASE 
;
; проверка на наличие слоев
;
T57:MOV  A,C    ; установка в NCREG
    STAX D      ; режима работы с проверяемым слоем
;
    MVI  M,0FFH ; обнулений 1-й ячейки страницы ГЗУ
;
; устанвка для записи единиц в ГЗУ
;
    INR  A
    STAX D
;
    MOV  M,B    ; запись 55H
    MVI  M,00H  ; сброс данных
    MOV  A,M    ; чтение записанного
    CMP  B      ; сравнение с образцом 55H
    JNZ  T55    ; если ошибка, перейти на формирование битов
                ; наличия/отсутствия проверяемого слоя
;
    MVI  M,0FFH ; запись FF в ячейку
    MOV  A,C    ; режим для записи нолей
    STAX D
    MOV  M,B
    MVI  M,00H  ; запись AA
    MOV  A,M
    CMA
    CMP  B      ; сравнение с образцом
    MVI  M,0FFH ; обнуление ячейки
;
T55:LDA  T51    ; получить текущий байт признаков
    JNZ  T56    ; если были ошибки, то не устанавливать
                ; текущий бит
    ORI  40H    ; установка в единицу бита для текущего слоя
                ; при его наличии
;
T56:RLC         ; подготовка байта признаков для проверки
    RLC         ; следующего слоя
    STA  T51 
;
; подготовка байта режима для NCREG для следующего слоя
;
    MOV  A,C
    RRC
    ORI  08H
    ANI  7EH
    MOV  C,A
    CPI  0EH    ; слой был последний (#0) ?
    JNZ  T57    ; если нет, то проверить следующий
;
; проверка на емкость слоев
;
    LXI  B,VIREG+PBASE1 
    MVI  A,1CH  ; байт режима для NCREG (начать со слоя 0)
    STA  T59 
;
N06:LDA  T51 
    ANI  03H    ; проверяемый слой присутствует ?
    JNZ  T5A    ; если да, то обойти вывод 'отсутствует'
;
    PUSH H      ; сохранить GRBASE
    LXI  H,T5B  ; "отсутствует"
    MVI  A,14H
    STA  T40    ; NDOS
    CALL MSG 
    MVI  A,20H
    STA  T23    ; ROMB2
    POP  H      ; восстановить GRBASE
    STC         ; установить признак отсутствия слоя
    JMP  T5C    ; перейти на формирование признаков емкости сл.
;
T5A:LDAX B
    ORI  0C0H   ; установить работу со страницей 3
    STAX B
;
    LDA  T59 
    STAX D      ; установить режим работы с текущим слоем
; 
    MVI  M,0FFH ; обнулить нулевую ячейку третьей страницы
    INR  A
    STAX D      ; установить режим для записи единиц
    MVI  M,04H  ; признак третьей страницы
;
    LDAX B
    ANI  7FH    ; установить страницу #1
    STAX B
;
    LDA  T59 
    STAX D      ; установить режим записи нолей в текущий слой
;
    MVI  M,0FFH ; обнулить ячейку
    INR  A
    STAX D      ; установить режим записи единиц
    MVI  M,02H  ; записать признак первой страницы
;
    LDAX B
    ANI  3FH    ; установить страницу #0
    STAX B
;
    LDA  T59 
    STAX D      ; установить режим записи нолей
;
    MVI  M,0FFH ; обнулить ячейку
    INR  A
    STAX D      ; установить режим записи единиц
    MVI  M,01H  ; записать признак нулевой страницы
;
    LDAX B
    ORI  0C0H   ; установить страницу #3
    STAX B
;
    MOV  A,M    ; прочитать признак страницы
    PUSH PSW
;
    MVI  A,14H  ; NDOS
    STA  T40 
;
    POP  PSW
    PUSH PSW
    ADI  30H    ; сформировать код символа 4, 2 или 1
    CALL T22    ; вывести его
;
    PUSH H      ; сохранить GRBASE
    LXI  H,T5D  ; 'x16K'
;
T00:EQU  0000H
T01:EQU  12FFH
T06:EQU  7777H
T07:EQU  5555H
T08:EQU  0FFFFH
T09:EQU  0AAAAH
T0A:EQU  3333H
T0B:EQU  1234H
T10:EQU  7733H
T16:EQU  0FF7FH
T1C:EQU  002CH
T23:EQU  0FA7FH
T24:EQU  0001H
T25:EQU  8000H
T29:EQU  00D0H
T40:EQU  3A7FH
T42:EQU  2000H
T43:EQU  0F5FDH
T45:EQU  1FFFH
T46:EQU  00B0H
T4C:EQU  004CH
T4E:EQU  00F7H
NCREG:  EQU     0BFH
RGBASE1:EQU     3A00H
GRBASE: EQU  0C000H
VIREG:  EQU     3AH
PBASE1: EQU     3B00H
T5E:EQU  2749H
;
    CALL MSG 
    POP  H      ; восстановить GRBASE
;
    MVI  A,20H
    STA  N01    ; ROMB2
;
    POP  PSW    ; воостановить признак объема
    CPI  02H
T5C:PUSH B
    LDA  N02    ; получить байт наличия слоев
;
    JC   N03 
    MVI  C,02H
    JNZ  N04 
    INR  C
N04:ANI  0FCH
    ORA  C
N03:RRC
    RRC
    STA  N02 
;
    POP  B
    LDA  N05 
    RLC
    ORI  02H
    ANI  6EH
    STA  N05    ; установить работу со следующим слоем
    CPI  0EH
    JNZ  N06 
;
    LDAX B
    ANI  3CH    ; работа и отображение страницы 0
    STAX B
;
    MVI  A,14H  ; NDOS
    STA  N07 
;
    LXI  H,RTN 
    CALL MSG 
;
; в T51 00 XX  XX XX, где XX=00 - слой отсутствует,
;                         XX=01 - 1x16,
;                         XX=11 - 2x16,
;                         XX=10 - 4x16
;
    LDA  N02 
    RRC
    RRC
    STA  N02 
;
    XRA  A
    STA  N09 
    MVI  A,1CH
    STA  N05 
;
N1E:LDA  N02 
    ANI  03H    ; проверка на присутствие проверяемого слоя
    JZ   N0A 
    LXI  H,N0B  ; "тест слоя #"
    CALL MSG 
    LDA  N09 
    ADI  30H    ; вывод номера слоя
    CALL N0C 
;
        LDA     N02
        ANI     3
        CPI     1
        JZ      NFE
        XRA     A
        STA     PGE
        LXI     H,RTN
        CALL    MSG
NFD:
        LXI     H,SPAGE ; "страницы #"
        CALL    MSG
        LDA     PGE
        ADI     30H
        CALL    N0C
;
NFE:
    MVI  A,09H
    CALL N0C 
;
        LDA     VIREG+PBASE
        ANI     3CH
        MOV     B,A
        LDA     PGE
        PUSH    PSW
        ORA     B
        MOV     B,A
        POP     PSW
        RRC
        RRC
        ORA     B
        STA     VIREG+PBASE
;
VIREG   EQU     3AH

;
    MVI  A,20H
    STA  N01 
    MVI  C,0FH
N19:LXI  D,1
N18:MVI  B,0FFH
    LXI  H,GRBASE
;
    LDA  N05 
    STA  N0F    ; в р-р цвета
;
; обнуление
;
N10:MOV  M,B
    INX  H
    MOV  A,L
    ORA  H
    JNZ  N10 
;
; режим для записи единиц
;
    LXI  H,GRBASE
    LDA  N05 
    INR  A
    STA  N0F 
;
; запись байтов-образцов
;
N13:MOV  A,E
    ANA  L
    JNZ  N11 
    MOV  A,D
    ANA  H
N11:MOV  A,C
    JZ   N12 
    CMA
N12:MOV  M,A
    INX  H
    MOV  A,L
    ORA  H
    JNZ  N13 
;
; проверка байтов-образцов
;
    LXI  H,GRBASE
N17:MOV  A,E
    ANA  L
    JNZ  N14 
    MOV  A,D
    ANA  H
N14:MOV  B,M
    MOV  A,C
    JZ   N15 
    CMA
N15:CMP  B
    CNZ  N16 
    INX  H
    MOV  A,L
    ORA  H
    JNZ  N17 
    MOV  A,E
    ADD  A
    MOV  E,A
    JNZ  N18 
    MOV  A,D
    RAL
    MOV  D,A
    ANI  40H
    JZ   N18 
    MOV  A,C
    XRI  0FFH
    MOV  C,A
    JM   N19 
    CPI  0FH
    JNZ  N1A 
    MVI  C,33H
    JMP  N19 
N1A:CPI  33H
    JNZ  N1B 
    MVI  C,55H
    JMP  N19 
N1B:LDA  N05 
    STA  N0F 
    MVI  B,0FFH
    LXI  H,N0E 
N1C:MOV  M,B
    INX  H
    MOV  A,L
    ORA  H
    JNZ  N1C 
    MVI  A,14H
    STA  N07 
    LXI  H,N1D  ; "окончен"
    CALL MSG 
;
; работа со следующей страницей
;
        LDA     N02
        ANI     3
        CPI     1
        JZ      N0A
        LDA     PGE
        INR     A
        STA     PGE
        CPI     4
        JNZ     NFD
;
; работа со следующим слоем
;
N0A:LDA  N05 
    RLC
    ORI  02H
    ANI  6EH
    STA  N05 
    LDA  N02 
    RRC
    RRC
    STA  N02 
    LDA  N09 
    INR  A
    STA  N09 
    CPI  03H
    JC   N1E 
;
        LDA     VIREG+PBASE
        ANI     3CH
        STA     VIREG+PBASE
;
    RET
;
; п/п вывода ошибки
;
N16:PUSH D
    PUSH B
    PUSH PSW
    PUSH H
    MVI  A,14H
    STA  N07 
;
    LXI  H,N1F  ; ошибка ГЗУ:
    CALL MSG 
    POP  H
    CALL N20    ; вывод адреса
    MVI  A,20H
    CALL N0C    ; вывод пробела
    POP  PSW
    CALL N21    ; вывод байта
    MVI  A,20H
    CALL N0C    ; вывод пробела
    POP  B
    MOV  A,B
    CALL N21    ; вывод байта-образца
    PUSH H
    LXI  H,RTN 
    CALL MSG 
    MVI  A,20H
    STA  N01 
    POP  H
    POP  D
    RET
;
T4F:DB   'Тест ГЗУ',0DH,0AH,0
T50:DB   '    Конфигурация:',9
    DB   'Слой #0     Слой #1     Слой #2',0DH,0AH,9,9,9,0
T5B:DB   'отсутствует ',0
T5D:DB   'x16К       ',0
N0B:DB   09H
    DB   'Тест слоя  #',0
N1F:DB   09H
    DB   'Ошибка ГЗУ:   ',0
SPAGE:
        DB      9,9,'страницы #',0
N09:DS   1
T51:
N02:DS   1
T59:
N05:DS   1
PGE:    DS      1
;
M3F:CALL N25    ; очистка ГЗУ
    LXI  H,N26  ; "проверка отображения информации"
    CALL MSG 
N28:CALL CONIN 
    CPI  0DH
    JNZ  N28 
    LXI  H,N29 
    CALL MSG 
    MVI  A,3CH
    STA  N01 
    MVI  A,8EH
    STA  N2A 
    LXI  H,N2B 
    LXI  D,N2C 
    LXI  B,N0E 
N2E:MOV  M,B
    MOV  A,B
    RRC
    RRC
    MOV  B,A
    JNC  N2D 
    INX  H
N2D:DAD  D
    DCR  C
    JNZ  N2E 
    LXI  H,N2F 
    LXI  D,N30 
    LXI  B,N0E 
N32:MOV  M,B
    MOV  A,B
    RRC
    RRC
    MOV  B,A
    JNC  N31 
    INX  H
N31:DAD  D
    DCR  C
    JNZ  N32 
    MVI  A,0FFH
    LXI  H,N33 
    MOV  M,A
    INX  H
    MOV  M,A
    INX  H
    MOV  M,A
    INX  H
    MOV  M,A
    LXI  H,N34 
    MOV  M,A
    INX  H
    MOV  M,A
    INX  H
    MOV  M,A
    INX  H
    MOV  M,A
    LXI  H,N35 
    LXI  D,N2C 
    LXI  B,N36 
N37:MOV  M,B
    DAD  D
    DCR  C
    JNZ  N37 
    LXI  H,N38 
    LXI  B,N39 
N3A:MOV  M,B
    DAD  D
    DCR  C
    JNZ  N3A 
    LXI  H,N2B 
    MVI  C,08H
N3C:MOV  A,M
    ORA  A
    JNZ  N3B 
    INX  H
    JMP  N3C 
N3B:MVI  M,0FFH
    INX  H
    MOV  A,M
    ORA  A
    JZ   N3B 
    MVI  M,0FFH
    MOV  B,A
    LXI  D,N2C 
N3D:DAD  D
    MOV  A,M
    MOV  M,B
    ANI  03H
    JZ   N3D 
N3E:MVI  M,0FFH
    DCX  H
    MOV  A,M
    ORA  A
    JZ   N3E 
    MVI  M,0FFH
    MOV  B,A
    LXI  D,N30 
N3F:DAD  D
    MOV  A,M
    MOV  M,B
    ANI  0C0H
    JZ   N3F 
    LXI  D,N40 
    DAD  D
    INX  H
    DCR  C
    JNZ  N3C 
    MVI  A,14H
    STA  N41 
    LXI  H,N42 
    CALL MSG 
N43:CALL CONIN 
    CPI  0DH
    JNZ  N43 
    CALL N25 
    LXI  H,N44 
    CALL MSG 
    MVI  A,3CH
    STA  N01 
    LXI  H,N45 
    MVI  B,8EH
    MVI  C,08H
N48:MOV  A,B
    STA  N2A 
    MVI  D,20H
N47:MVI  E,20H
N46:MVI  M,0FFH
    INX  H
    DCR  E
    JNZ  N46 
    MOV  A,L
    ADI  20H
    MOV  L,A
    MOV  A,H
    ACI  00H
    MOV  H,A
    DCR  D
    JNZ  N47 
    MOV  A,B
    SUI  02H
    MOV  B,A
    DCR  C
    JNZ  N48 
    MVI  A,14H
    STA  N41 
    RET
;
M40:
N62:LXI  H,N49 
    CALL MSG    ; 'проверка клавиатуры'
    CALL N25    ; очистка ГЗУ
    MVI  A,3CH
    STA  N01    ; установка DOSG1
    MVI  A,8EH
    STA  N2A    ; RGBASE+NCREG
    LXI  H,N4A  ; адрес массива графики
    MVI  C,50H
N4D:PUSH B      ; вывод графики (подсвечивания)
    PUSH H
    CALL N4B 
    POP  H
    LXI  D,N4C 
    DAD  D
    POP  B
    DCR  C
    JNZ  N4D 
    MVI  A,14H
    STA  N41    ; установка NDOS
    LXI  H,N4E 
    MVI  C,09H
N4F:MVI  M,0FFH
    INX  H
    DCR  C
    JNZ  N4F 
    MVI  M,43H
    INX  H
    MVI  M,1FH
    LXI  H,N50 
    CALL MSG    ; 'нажимая, погасите; выход - УПР и СТОП'
;
;       настройка таймера
;
        LXI     H,BCNTC+PBASE; адрес р-ра упр-я таймерв
        MVI     M,STR0S OR RLLM OR MODE3; загр. мл и ст, сч 0, делитель F
;
STR0S   EQU     00000000B; выбор счетчика 0
RLLM    EQU     00110000B; чт/загр обоих байтов
MODE3   EQU     00000110B; режим делителя частоты
SNDEN   EQU     8       ; константа разрешения звука
SOUNDC  EQU     32H     ; адрес р-ра разрешения звука
;
        MVI     L,0     ; адрес р-ра счета таймера
        LXI     D,12000 ; коэф. счета 12000
        MOV     M,E     ; загрузка младшего байта
        MOV     M,D     ; загрузка старшего байта
;
N53:
        CALL    SOUNDNOT; выключить звук
;
        LXI  D,N51      ; выбираются все основные группы
    LXI  H,N52  ; выбираются все дополнительные группы
    LDAX D
    ORA  M
    JZ   N53    ; не нажата
;
        CALL    SOUNDEN ; включить звук
;
    XRA  A
N54:DCR  A
    JNZ  N54    ; задержка
    LDAX D
    ORA  M
    JZ   N53    ; дребезг, начать снова
;
;               клавиша нажата
;
    MVI  E,80H  ; выбор группы 8 (для УПР)
    LXI  H,N55  ; выбор группы 6 (для СТОП)
    LDAX D
    RRC
    RRC
    RRC
    ANA  M
    ANI  04H
    JNZ  N56    ; нажаты УПР и СТОП, переход
N5D:LXI  D,N0D  ; первоначально выбор группы 0
    LXI  B,N57
N5A:LXI  H,N58  ; выбор KBBASE
    DAD  D      ; получение абсолютного адреса группы
    MOV  A,M
    ORA  A
    JNZ  N59    ; нажата клавиша выбранной группы, переход
    MOV  A,E
    RLC
    MOV  E,A
    MOV  A,D
    ACI  00H
    MOV  D,A
    INR  C
    DCR  B
    JNZ  N5A    ; проверить на нажатие следующую группу
    JMP  N53    ; ни одна из клавиш не нажата, начать сначала
N59:PUSH H      ; сохранить адрес группы
    LXI  H,N4E  ; адрес таблицы
    MVI  B,00H
    DAD  B
    MOV  B,A    ; в A был скан-код, сохранить его
    MOV  A,C
    RLC
    RLC
    RLC
    MOV  C,A
    MVI  E,01H
N5C:MOV  A,E
    ANA  B
    JNZ  N5B 
    INR  C
    MOV  A,E
    RLC
    MOV  E,A
    JNC  N5C 
    POP  H
    JMP  N5D 
N5B:PUSH D
    MOV  A,M
    XRA  E
    MOV  M,A
    ANA  E
    MVI  A,8EH
    JNZ  N5E 
    ANI  84H
N5E:STA  N5F 
    MVI  A,3CH
    STA  N01 
    LXI  H,N4A 
    LXI  D,N4C 
    MVI  B,50H
N61:MOV  A,M
    CMP  C
    JZ   N60 
    DAD  D
    DCR  B
    JNZ  N61 
    POP  D
    POP  H
    MVI  A,14H
    STA  N41 
    JMP  N62 
N60:CALL N4B 
    MVI  A,14H
    STA  N41 
    LXI  D,N63 
    LXI  H,N55 
    LDAX D
    RRC
    RRC
    RRC
    ANA  M
    ANI  04H
    POP  D
    POP  H
    JNZ  N56 
N68:LXI  B,N64 
N66:MOV  A,M
    ANA  E
    JZ   N65 
    DCX  B
    MOV  A,C
    ORA  B
    JNZ  N66 
    JMP  N67 
N65:DCR  A
    JNZ  N65 
    MOV  A,M
    ANA  E
    JNZ  N68 
N67:LXI  H,N4E 
    MVI  C,0BH
N69:ORA  M
    INX  H
    DCR  C
    JNZ  N69 
    ORA  A
    JNZ  N53 
N56:
        CALL    SOUNDNOT; выключить звук
        MVI  A,0DH
    CALL N0C 
    MVI  A,04H
    CALL N0C 
    RET
;
SOUNDNOT:               ; выключить звук
        LDA     SOUNDC+PBASE
        ANI     NOT SNDEN
        STA     SOUNDC+PBASE
        RET
SOUNDEN:                ; включить звук
        LDA     SOUNDC+PBASE
        ORI     SNDEN
        STA     SOUNDC+PBASE
        RET
;
N4B:MVI  C,1EH
    INX  H
    MOV  E,M
    INX  H
    MOV  D,M
    INX  H
    MOV  B,M
    XCHG
    LXI  D,N2C 
N6B:PUSH B
    PUSH H
N6A:MVI  M,0FFH
    INX  H
    DCR  B
    JNZ  N6A 
    POP  H
    POP  B
    DAD  D
    DCR  C
    JNZ  N6B 
    RET
N4E:DS   11
N49:DB   0CH,4,9,9,'ПРОВЕРКА КЛАВИАТУРЫ',0DH,0AH,0AH
    DB   ' F1   F2   F3   F4   F5  ',9,9,' СТОП',9,' ИЗ ВЗ СТ ',0DH,0AH
    DB   '   F6   F7   F8   F9  F10',0DH,0AH
    DB   ' ПФ ;  1  2  3  4  5  6  7  8  9  0  -  :  ВШ',0DH,0AH
    DB   '    +  !  "  #  $  %  &  ',27H,'  (  )     =  *',9,'  7  8  9',0DH,0AH
    DB   ' ТАБ Й  Ц  U  К  Е  Н  Г  Ш[ Щ] З  Х  ъ_',0DH,0AH
    DB   '      J  C  U  K  E  N  G  {  }  Z  H     ВК',9,'  4  5  6',0DH,0AH
    DB   ' УПР  Ф  Ы  В  А  П  Р  О  Л  Д  Ж  Э\ .',0DH,0AH
    DB   '       F  Y  W  A  P  R  O  L  D  V  | >',9,'  1  2  3',0DH,0AH
    DB   '  РЕГ  Я  Ч  С  М  И  Т  Ь  Б  Ю@ ,  /   РЕГ',0DH,0AH
    DB   '        Q  ~  S  M  I  T  X  B  ` <  ?',9,9,'  0   .',0DH,0AH
    DB   '   ФИКС АЛ',9,9,9,'   ГР СЕЛ',0DH,0AH,0AH,0
N50:DB   'Нажимая клавиши, погасите их изображение'
    DB   0DH
    DB   0AH
    DB   'Для прерывания теста нажмите одновременно УПР и СТОП ',0
N4A:DB   'PAH'
    DB   04H
    DB   'QFH'
    DB   04H
    DB   'RKH'
    DB   04H
    DB   'SPH'
    DB   04H
    DB   'TUH'
    DB   04H
    DB   '2iH'
    DB   04H
    DB   ';AP'
    DB   02H
    DB   '+DP'
    DB   02H
    DB   '!GP'
    DB   02H
    DB   '"JP'
    DB   02H
    DB   '#MP'
    DB   02H
    DB   '$PP'
    DB   02H
    DB   '%SP'
    DB   02H
    DB   '&VP'
    DB   02H
    DB   27H,'YP'
    DB   02H
    DB   '(\P'
    DB   02H
    DB   ')_P'
    DB   02H
    DB   ' bP'
    DB   02H
    DB   '-eP'
    DB   02H
    DB   '*hP'
    DB   02H
    DB   '5kP'
    DB   02H
    DB   '6AX'
    DB   03H
    DB   0AH
    DB   'EX'
    DB   02H
    DB   03H
    DB   'HX'
    DB   02H
    DB   15H
    DB   'KX'
    DB   02H
    DB   0BH
    DB   'NX'
    DB   02H
    DB   05H
    DB   'QX'
    DB   02H
    DB   0EH
    DB   'TX'
    DB   02H
    DB   07H
    DB   'WX'
    DB   02H
    DB   1BH
    DB   'ZX'
    DB   02H
    DB   1DH
    DB   ']X'
    DB   02H
    DB   1AH
    DB   '`X'
    DB   02H
    DB   08H
    DB   'cX'
    DB   02H
    DB   1FH
    DB   'fX'
    DB   02H
    DB   '0iX'
    DB   04H
    DB   '=A`'
    DB   04H
    DB   06H
    DB   'F`'
    DB   02H
    DB   19H
    DB   'I`'
    DB   02H
    DB   17H
    DB   'L`'
    DB   02H
    DB   01H
    DB   'O`'
    DB   02H
    DB   10H
    DB   'R`'
    DB   02H
    DB   12H
    DB   'U`'
    DB   02H
    DB   0FH
    DB   'X`'
    DB   02H
    DB   0CH
    DB   '[`'
    DB   02H
    DB   04H
    DB   '^`'
    DB   02H
    DB   16H
    DB   'a`'
    DB   02H
    DB   1CH
    DB   'd`'
    DB   02H
    DB   '.g`'
    DB   02H
    DB   '8Ah'
    DB   05H
    DB   11H
    DB   'Gh'
    DB   02H
    DB   1EH
    DB   'Jh'
    DB   02H
    DB   13H
    DB   'Mh'
    DB   02H
    DB   0DH
    DB   'Ph'
    DB   02H
    DB   09H
    DB   'Sh'
    DB   02H
    DB   14H
    DB   'Vh'
    DB   02H
    DB   18H
    DB   'Yh'
    DB   02H
    DB   02H
    DB   '\h'
    DB   02H
    DB   00H
    DB   '_h'
    DB   02H
    DB   ',bh'
    DB   02H
    DB   '/eh'
    DB   02H
    DB   '?hh'
    DB   05H
    DB   '>Cp'
    DB   04H
    DB   '9Hp'
    DB   02H
    DB   '7Kp'
    DB   17H
    DB   ':cp'
    DB   02H
    DB   '<fp'
    DB   04H
    DB   '3qH'
    DB   02H
    DB   '4tH'
    DB   02H
    DB   '1wH'
    DB   02H
    DB   'GqP'
    DB   02H
    DB   'Ht'
;
N01:EQU  0FA7FH
N07:EQU  3A7FH
N0D:EQU  0001H
N0E:EQU  0C000H
N0F:EQU  3ABFH
N2A:EQU  0FFBFH
N2B:EQU  4000H
N2C:EQU  0040H
N2F:EQU  7FC0H
N30:EQU  0FFC0H
N33:EQU  5FDEH
N34:EQU  601EH
N35:EQU  5E1FH
N36:EQU  0110H
N38:EQU  5E20H
N39:EQU  8010H
N40:EQU  0400H
N41:EQU  0FF7FH
N45:EQU  400DH
N4C:EQU  0004H
N51:EQU  0F8FFH
N52:EQU  0F907H
N55:EQU  0F840H
N57:EQU  0B00H
N58:EQU  0F800H
N5F:EQU  0FABFH
N63:EQU  0F880H
N64:EQU  0000H
    DB   'P'
    DB   02H
    DB   'IwP'
    DB   02H
    DB   'DqX'
    DB   02H
    DB   'EtX'
    DB   02H
    DB   'FwX'
    DB   02H
    DB   'Aq`'
    DB   02H
    DB   'Bt`'
    DB   02H
    DB   'Cw`'
    DB   02H
    DB   '@qh'
    DB   03H
    DB   'Nuh'
    DB   03H
;
ZUM:LXI  H,K00 
    CALL MSG 
    MVI  C,20H
K04:CALL K02 
    MVI  A,07H
    CALL K03 
    DCR  C
    JNZ  K04 
    LXI  H,K05 
    CALL MSG 
    RET
K00:DB   'Тест формирователя звука:',0
;
;       Тест НКМЛ
;
MAG:
K07:LXI  H,K08 
    CALL MSG    ; 'тест НКМЛ'
    LXI  H,K09 
    CALL MSG    ; меню
    LXI  H,K0A 
    CALL MSG    ; ESC - меню, СТОП - выход из теста
    LXI  H,K0B 
    CALL MSG    ; 'наберите номер'
    CALL K0C    ; ввод символа
    CPI  03H
    RZ          ; СТОП
    CPI  31H
    JZ   K0D    ; запись
    CPI  32H
    JZ   K0E    ; чтение
    CPI  33H
    JZ   K0F    ; управление мотором
    JMP  MAG 
;
;       запись
;
K0D:
    LXI  H,K12 
    CALL MSG    ; 'пример 1'
    LXI  H,K13 
    CALL MSG    ; 'пример 2'
    LXI  H,K14 
    CALL MSG    ; 'пример 3'
    LXI  H,K0B 
    CALL MSG    ; 'наберите номер'
    CALL K0C    ; 'ввод номера'
    STA  K1A 
    CALL K1B 
    JNZ  K0D    ; недопустимый номер
    JMP  K1C 
K1B:LDA  K1A 
    CPI  31H
    MVI  B,00H
    JZ   K1D 
    CPI  32H
    MVI  B,02H
    JZ   K1D 
    CPI  33H
    MVI  B,04H
    JZ   K1D 
    RNZ
K1D:MOV  A,B
    STA  K1E    ; сохранить смещение
    RET
K1C:MVI  A,01H
    CALL K1F    ; записать длинный маркер
;
;       запись 10 байт 0D3H
;
    MVI  B,0AH
K21:MVI  A,0D3H
    CALL K20 
    DCR  B
    JNZ  K21 
;
;       вычисление адреса сообщения 'пример N'
;
    MVI  B,08H
    LXI  H,K22 
    CALL K23 
    MOV  E,M
    INX  H
    MOV  D,M
    XCHG
;
;       запись 'пример N'
;
K24:MOV  A,M
    CALL K20 
    DCR  B
    INX  H
    JNZ  K24 
;
;       записать короткий маркер
;
K2B:XRA  A
    CALL K1F 
;
;       вычисление адреса массива в HL
;
    LXI  H,K25 
    CALL K23 
    MOV  E,M
    INX  H
    MOV  D,M
    XCHG
;
;       запись массива
;
    MVI  B,00H
K26:MOV  A,M
    CALL K20 
    DCR  B
    JNZ  K26 
;
;       останов записи и мотора
;
    CALL K27 
    LXI  H,RTN 
    CALL MSG    ; ВКПС
    JMP  MAG 
;
;       чтение
;
K0E:CALL K2C    ; включить мотор и читать маркер
    JC   K2D    ; есть ошибкка
;
;       читать 10 байт
;
    MVI  B,0AH
K2F:CALL K2E 
    JC   K2D 
    DCR  B
    JNZ  K2F 
;
;       читать 'пример N' в буфер K30
;
    MVI  B,08H
    LXI  D,K30 
K31:CALL K2E 
    JC   K2D 
    STAX D
    INX  D
    DCR  B
    JNZ  K31 
    STA  K1A    ; сохранить N примера
    CALL K32    ; выключить мотор
    CALL K1B    ; вычислить N
    XRA  A
    STAX D      ; 0 - ограничитель сообщения
    LXI  H,K30 
    CALL MSG    ; 'пример N'
    LXI  H,RTN 
    CALL MSG    ; ВКПС
K39:LXI  H,K33 
    CALL MSG    ; 'контрольная строка'
    CALL K2C    ; включить мотор и читать маркер
    JC   K2D 
;
;       чтение блока в буфер K34
;
    LXI  D,K34 
    MVI  B,00H
K35:CALL K2E 
    JC   K2D 
    STAX D
    INX  D
    DCR  B
    JNZ  K35 
    CALL K32    ; выключить мотор
    CALL K36    ; вывести считанное
    LXI  H,PROD
    CALL MSG    ; ВКПС
        CALL    CONIN
    JMP  MAG 
K36:LXI  H,K3A 
    CALL K23 
    MOV  E,M
    INX  H
    MOV  D,M
    XCHG
    MVI  B,08H
K3C:MOV  A,M
    CALL K3B 
    INX  H
    DCR  B
    JNZ  K3C 
    CALL K3D 
    JMP  K3E 
K3D:LXI  H,RTN 
    CALL MSG 
    LXI  H,K3F 
    CALL MSG 
    RET
K3E:LXI  H,K34 
    MVI  B,00H
K40:MOV  A,M
    CALL K3B 
    INX  H
    DCR  B
    JNZ  K40 
    LXI  H,K41 
K42:DCX  H
    MOV  A,L
    ORA  H
    JNZ  K42 
    RET
K0C:PUSH H
    PUSH D
    PUSH B
    CALL CONIN 
        PUSH    PSW
        MOV     C,A
        CALL    CONOUT
        LXI     H,RTN
        CALL    MSG
        POP     PSW
        JMP     K47
K2D:CALL K32 
    LXI  H,K44 
    CALL MSG 
    LXI  H,K41 
K45:DCX  H
    JNZ  K45 
    JMP  MAG 
K23:LDA  K1E 
    MVI  D,00H
    MOV  E,A
    DAD  D
    RET
K2E:PUSH H
    PUSH D
    PUSH B
    CALL TAPIN 
    JNC  K47 
    JMP  K48 
K20:PUSH H
    PUSH D
    PUSH B
    CALL TAPOUT 
    JMP  K47 
K2C:PUSH H
    PUSH D
    PUSH B
    CALL TAPION 
    JNC  K47 
K48:CALL K32 
    STC
    JMP  K47 
K32:PUSH H
    PUSH D
    PUSH B
    CALL TAPIOF 
        JMP     K47
K27:PUSH H
    PUSH D
    PUSH B
    CALL TAPOOF 
        JMP     K47
K53:PUSH H
    PUSH D
    PUSH B
    CALL SMOTR 
    JMP  K47 
K1F:PUSH H
    PUSH D
    PUSH B
    CALL TAPOON 
K47:POP  B
    POP  D
    POP  H
    RET
;
;       управление мотором
;
K0F:
    LXI  H,K4F 
    CALL MSG 
    CALL K0C 
    CPI  31H
    JZ   K50 
    CPI  32H
    JZ   K51 
    JMP  MAG 
K50:MVI  A,01H
    JMP  K52 
K51:XRA  A
K52:CALL K53 
    JMP  MAG 
    DB   02H
K10:DB   00H
K1A:DB   00H
K1E:DB   00H
    DB   00H
K30:DS  9       ; буфер для 'пример N' при чтении
K4F:DB   'Включить - 1',0DH,0AH
    DB   'Выключить - 2',0DH,0AH,0
K44:DB   'ОШИБКА',0
K3F:DB   'Считано',0DH,0AH,0
K33:DB   'Контрольная строка',0DH,0AH,0
K0A:
    DB   'СТОП - конец теста',0
K08:DB   'Тест НКМЛ:',0DH,0AH,0AH,0
K12:DB   'Пример 1  00000000...',0DH,0AH,0
K13:DB   'Пример 2  11111111...',0DH,0AH,0
K14:DB   'Пример 3  01010101...',0DH,0AH,0
K09:DB   '1 - запись',0DH,0AH
    DB   '2 - чтение',0DH,0AH
    DB   '3 - мотор',0DH,0AH,0
PROD:   DB      0DH,0AH,0AH,'Для продолжения нажмите любую клавишу',0DH,0AH,0
K0B:DB   0DH
    DB   0AH
    DB   'номер ?',0
    DB   00H
K25:
        DW      PRIM1
        DW      PRIM2
        DW      PRIM3
PRIM1:
    DB   0,0,0,0,0,0,0,0,0
PRIM2:
    DB   0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
PRIM3:
    DB   55H,55H,55H,55H,55H,55H,55H,55H,55H
;
K34:    EQU     6000H
;
K22:    DW      K12
        DW      K13
        DW      K14
;
K3A:
        DW      PRIM1
        DW      PRIM2
        DW      PRIM3
K02:EQU  00C9H
K41:EQU  7D00H
TAPIN:EQU  0052H
TAPOUT:EQU  005BH
TAPION:EQU  004FH
TAPIOF:EQU  0055H
TAPOOF:EQU  005EH
SMOTR:EQU  0061H
TAPOON:EQU  0058H
;
LAN:
    LXI  H,G00 
    CALL MSG    ; 'тест адаптера л.с. подключен кабель или шлейф?'
    CALL G02    ; получить потверждение
    JZ   G03    ; да, переход
    LXI  H,G04 
    CALL MSG    ; проверка отменена
    RET
;
M4C:
G03:LDA  LANADR 
    CMA
    ANI  0F0H
    RRC
    RRC
    RRC
    RRC
    STA  ADRRM 
    ADI  00H
    DAA
    PUSH PSW
    LXI  H,G07 
    CALL MSG    ; 'номер рабочего места:'
    POP  PSW
    CALL G08    ; вывод числа в HEX-виде
    LXI  H,RTN 
    CALL MSG    ; ВКПС
    LXI  H,PBASE2+LANC 
    MVI  M,40H
    NOP
    MVI  M,5EH
    NOP
    MVI  M,05H
    DCR  L
    MOV  A,M
    INR  L
    XRA  A
G0B:DCR  A
    JNZ  G0B 
    MOV  A,M
    CPI  85H
    JZ   G0C 
    CALL G0D 
    DB   01H,85H
G0C:DB   2EH
    DB   28H
    MOV  A,M
    ANI  08H
    JZ   G0F 
    CALL G0D 
    STAX B
    NOP
G0F:MVI  L,21H
    MVI  M,0DH
    XRA  A
G10:DCR  A
    JNZ  G10 
    MOV  A,M
    CPI  0FFH
    JZ   G11 
    CALL G0D 
    INX  B
    RST  7
G11:MVI  L,28H
    MOV  A,M
    ANI  08H
    JNZ  G12 
    CALL G0D 
    INR  B
    DB   08H
G12:MVI  C,00H
    MVI  L,21H
    MVI  M,05H
    XRA  A
G13:DCR  A
    JNZ  G13 
    DCR  L
    MOV  A,M
    INR  L
    CMP  C
    JZ   G14 
    CALL G0D 
    DCR  B
    NOP
G14:MVI  M,15H
    XRA  A
G15:DCR  A
    JNZ  G15 
    MOV  A,M
    CPI  85H
    JZ   G16 
    CALL G0D 
    MVI  B,85H
    RET
G16:LXI  B,G17 
G1C:DCR  L
    MOV  M,C
    INR  L
    MOV  A,C
    STA  G18 
G19:MOV  A,M
    ANI  04H
    JZ   G19 
    MOV  A,M
    CPI  87H
    JZ   G1A 
    CALL G0D 
    RLC
    ADD  A
G1A:DCR  L
    MOV  A,M
    INR  L
    CMP  C
    JZ   G1B 
    CALL G0D 
    DB   08H
G18:NOP
G1B:DCX  B
    MOV  A,C
    ORA  B
    JNZ  G1C 
    LXI  H,G1D 
    CALL MSG    ; 'окончен'
    RET
G0D:MOV  E,A
    PUSH H
    LXI  H,G1E 
    CALL MSG 
    POP  H
    XTHL
    MOV  A,M
    INX  H
    MOV  D,M
    INX  H
    XTHL
    CALL G08 
    MVI  A,09H
    CALL G1F 
    MOV  A,E
    CALL G08 
    MVI  A,20H
    CALL G1F 
    MOV  A,D
    CALL G08 
    PUSH H
    LXI  H,RTN 
    CALL MSG    ; ВКПС
    POP  H
    MOV  A,E
    RET
;
M4B:
G00:DB   'Тест адаптера локальной сети:',0DH,0AH
    DB   09H,'Подключен кабель или шлейф 4.137.080-02 ? (Д/Н):',0
;
LANADR:EQU  0FB38H
ADRRM:EQU  0F700H
PBASE2:EQU  0FB00H
LANC:EQU  21H
G17:EQU  0400H
G07:DB   0DH,0AH,9,'Номер рабочего места: ',0
G1E:DB   'ошибка  ',0
PRINTER:LXI  H,U00 
    CALL MSG    ; 'проверка принтера'
    CALL        CON
    JZ   IFP
    LXI  H,U04 
NEW:CALL MSG    ; 'проверка невозможна'
    RET
U03:LXI  H,U05 
    CALL MSG    ; 'принтер готов к работе?'
    CALL U06    ; получить потверждение
    JNZ  U07 
    XRA  A
    STA  U08    ; сброс признака перекодировки
    LXI  H,U09 
    CALL MSG    ; 'загружаемый знакогенератор?'
    CALL U06    ; получить потверждение
    JNZ  U0A 
    LXI  H,U0B  ; адрес таблицы знакогенератора
    LXI  B,U0C  ; число элементов таблицы знакогенератора
U0F:PUSH B
    MOV  C,M
    CALL U0D    ; вывод байта на принтер
    POP  B
    JZ   U0E    ; состояние не готов
    INX  H
    DCX  B
    MOV  A,B
    ORA  C
    JNZ  U0F 
    JMP  U10    ; перейти к выводу на печать
U0A:LXI  H,U11 
    CALL MSG    ; 'перекодировка символов?'
    CALL U06 
    JNZ  U10 
    MVI  A,0FFH
    STA  U08    ; установка признака перекодировки
U10:
        LXI     H,MS6313
        CALL    MSG
        CALL    U06
        JZ      MS13
        LXI     H,U13   ; адрес текста
        LXI     B,U14-U13; число символов
        JMP     U1111
MS13:
        LXI     H,U14
        LXI     B,M25-U14
U1111:  PUSH    H
        PUSH    B
    LXI  H,U12 
    CALL MSG    ; 'вывод данных на печать:'
        POP     B
        POP     H
U15:PUSH B
    MOV  C,M
    CALL U0D    ; вывод байта на принтер
    POP  B
    JZ   U0E 
    INX  H
    DCX  B
    MOV  A,B
    ORA  C
    JNZ  U15 
    LXI  H,U16 
    CALL MSG    ; 'окончен'
    RET
U07:LXI  H,U17 
    CALL MSG    ; 'прверка отменена'
    RET
U0E:LXI  H,U18 
    CALL MSG    ; 'состояние НЕ ГОТОВ'
    RET
;
IFP:
;**********************************************************
;
;       Программа проверяет работу интерфейса ПУ
;   и использует следующие линии разъема расширения:
;
;       KA0...KA7 - в качестве D0...D7;
;       KC0 - СТБПУ;
;       KC1 - ВБПУ;
;       KC4 - ЗНТПУ.
;
;***********************************************************
;
LSTDAT  EQU     30H     ; регистр данных принтера
LSTSTS  EQU     38H     ; регистр состояния
LSTCTL  EQU     33H     ; регистр управления
LSTINT  EQU     6       ; уровень прерывания по готовности
PIA3    EQU     08H     ; адрес канала A порта расширения
PIC3    EQU     0AH     ; адрес KC порта расширения
PIMC3   EQU     0BH     ; адрес р-ра упр-я порта расширения
PBASE   EQU     0FB00H  ; базовый адрес в конфигурации NDOS
CONOUT  EQU     004CH   ; вывод символа из р-ра C
IRISRG  EQU     28H     ; адрес р-ра запросов прерываний
INT6    EQU     40H     ; маска прерывания по гот. принтера
;
        LXI     H,SASK
        CALL    MSG
        CALL    M37
        JNZ     U03
;
TEST:
        LXI     H,S0
        CALL    MSG
;
;  Настройка порта расширения: KA, KC0-KC3 на ввод,
;                              KC4-KC7 на вывод
;
        LXI     H,PIMC3+PBASE
        MVI     M,93H
;
;  Проверка линии ВБПУ
;
        LXI     H,LSTCTL+PBASE
        MVI     M,08H   ; записали "0"
;
        LDA     PIC3+PBASE; ждем "1"
        ANI     2
        JZ      ERRSEL
;
        MVI     M,09H   ; записали "1"
;
        LDA     PIC3+PBASE; ждем "0"
        ANI     2
        JNZ     ERRSEL
;
;  Проверка линии ЗНТПУ
;
        LXI     H,COUNT
        MVI     M,0FFH
;
BUSY:
        LXI     H,PIMC3+PBASE
        LXI     D,LSTSTS+PBASE
        MVI     M,8     ; записали "0"
;
        LDAX    D       ; ждем "1"
        ANI     4
        JZ      ERRBYS
;
        LDA     IRISRG+PBASE
        ANI     INT6
        JZ      ERRINT
;
        MVI     M,9     ; записали "1"
;
        LDAX    D       ; ждем "0"
        ANI     4
        JNZ     ERRBYS
;
        LDA     IRISRG+PBASE
        ANI     INT6
        JNZ     ERRINT
;
        LXI     H,COUNT
        DCR     M
        JNZ     BUSY
;
;   Проверка линии СТБПУ
;
        LXI     H,LSTCTL+PBASE
        MVI     M,0AH   ; записали "0"
;
        LDA     PIC3+PBASE; ждем "1"
        ANI     1
        JZ      ERRSTB
;
        MVI     M,0BH   ; записали "1"
;
        LDA     PIC3+PBASE; ждем "0"
        ANI     1
        JNZ     ERRSTB
;
;   Проверка линий данных
;
        LXI     H,LSTDAT+PBASE
        LXI     D,PIA3+PBASE
;
        MVI     C,1
D1:     MOV     M,C
        LDAX    D
        CMA
        CMP     C
        JNZ     ERRDAT
;
        MOV     A,C
        RLC
        MOV     C,A
        JNC     D1
;
; проверка земли принтера
;
        LDA     PIC3+PBASE
        ANI     4
        JZ      TEST1
        LXI     H,SGND
        CALL    MSG
;
TEST1:
        LXI     H,U16
        CALL    MSG
        RET
;
;   обработка ошибок
;
ERRSEL:
        PUSH    H
        LXI     H,S1
        CALL    MSG
        LXI     H,PROD
        CALL    MSG
        POP     H
;
SEL1:   MVI     M,8
        MVI     M,9
        CALL    CONSOST
        JMP     SEL1
;
;
ERRBYS:
        PUSH    H
        LXI     H,S2
        CALL    MSG
        LXI     H,PROD
        CALL    MSG
;
        POP     H
BYS1:   MVI     M,8
        MVI     M,9
        CALL    CONSOST
        JMP     BYS1
;
;
ERRSTB:
        PUSH    H
        LXI     H,S3
        CALL    MSG
        LXI     H,PROD
        CALL    MSG
;
        POP     H
STB1:   MVI     M,0AH
        MVI     M,0BH
        CALL    CONSOST
        JMP     STB1
;
;
ERRDAT:
        PUSH    H
        LXI     H,S4
        CALL    MSG
        LXI     H,PROD
        CALL    MSG
;
        POP     H
        MVI     A,1
DAT1:   MOV     M,A
        RLC
        CALL    CONSOST
        JMP     DAT1
;
ERRINT:
        PUSH    H
        LXI     H,S6
        CALL    MSG
        POP     H
        JMP     BYS1
;
CONSOST:
        PUSH    H
        PUSH    PSW
        CALL    CONST
        ORA     A
        JZ      CONSOST1
        CALL    CONIN   ; ввод паразитного символа
        POP     PSW
CONSOST1:
        POP     PSW
        POP     H
        RET
;
SASK:   DB      0AH,0DH,'Подключен кабель "ПУ - РАСШИРЕНИЕ" 4.137.080-01? (Д/Н) ',0
S0:     DB      0AH,0DH,'Тест интерфейса принтера:  ',0
S1:     DB      0AH,0DH,'Неисправна и тестируется линия ВБПУ',0
S2:     DB      0AH,0DH,'Неисправна и тестируется линия ЗНТПУ',0
S3:     DB      0AH,0DH,'Неисправна и тестируется линия СТБПУ',0
S4:     DB      0AH,0DH,'Неверные данные, тест данных',0
S6:     DB      0AH,0DH,'Нет прерывания от принтера, тест ЗНТПУ',0
SGND:   DB      'НЕТ ЗЕМЛИ',0
U00:DB   'Проверка принтера:',0
M21:
U04:DB   9,'Проверка невозможна',0DH,0AH,0
U05:DB   0DH,0AH,9,'Принтер готов к работе? (Д/Н) ',0
U09:DB   0DH,0AH,9,'Загружаемый знакогенератор? (Д/Н) ',0
U11:DB   0DH,0AH,9,'Перекодировка символов? (Д/Н) ',0
U12:DB   0DH,0AH,9,'Вывод на печать:',0
G04:
U17:DB   0DH,0AH,9,'Проверка отменена',0DH,0AH,0
U18:DB   ' состояние НЕ ГОТОВ',0DH,0AH,0
MS6313: DB      0DH,0AH,'Принтер "Электроника МС6313" версии 130690/МС6307? (Д/Н): ',0
COUNT:  DB      0       ; счетчик циклов проверки линии ЗНТПУ
U08:DB   00H    ; ячейка признака перекодировки
;
;               таблица перекодировки
;
U1F:DB   0EEH,0D0H,0D1H,0E6H,0D4H,0D5H,0E4H,0D3H
    DB   0E5H,0D8H,0D9H,0DAH,0DBH,0DCH,0DDH,0DEH
    DB   0DFH,0EFH,0E0H,0E1H,0E2H,0E3H,0D6H,0D2H
    DB   0ECH,0EBH,0D7H,0E8H,0EDH,0E9H,0E7H,0EAH
    DB   0CEH,0B0H,0B1H,0C6H,0B4H,0B5H,0C4H,0B3H
    DB   0C5H,0B8H,0B9H,0BAH,0BBH,0BCH,0BDH,0BEH
    DB   0BFH,0CFH,0C0H,0C1H,0C2H,0C3H,0B6H,0B2H
    DB   0CCH,0CBH,0B7H,0C8H,0CDH,0C9H,0C7H,0CAH
;
;       выдача байта на принтер из р-ра C
;
M4D:
U0D:PUSH D
    MVI  B,05H
U1D:LXI  D,U19 
U1C:LDA  U1A 
    ANI  04H    ; есть готовность принтера ?
    JNZ  U1B    ; есть, переход
    DCX  D
    MOV  A,E
    ORA  D
    JNZ  U1C 
    DCR  B
    JNZ  U1D 
    POP  D
    RET
U1B:MOV  A,C
    CPI  0C0H   ; русский алфавит ?
    JC   U1E    ; нет, обход
    LDA  U08 
    ORA  A      ; нужна перекодировка ?
    JZ   U1E    ; нет перекодировки
    PUSH H
    MOV  E,C
    MVI  D,00H
    LXI  H,U1F-0C0H
    DAD  D
    MOV  C,M
    POP  H
U1E:POP  D
    MOV  A,C
    CMA
    STA  U20 
    ORA  C
    MVI  A,0BH
    STA  U21 
    MVI  A,0AH
    STA  U21 
    RET
;
;       Загружаемый знакогенератор
;
U0B:DB   1BH
    DB   ':'
    DB   00H
    DB   00H
    DB   00H
    DB   1BH
    DB   '%'
    DB   01H
    DB   00H
    DB   1BH
    DB   '&'
    DB   00H
    DB   0C0H
    DB   0FEH
    DB   8BH
    DB   00H
    DB   '>'
    DB   00H
    DB   08H
    DB   00H
    DB   1CH
    DB   '"'
    DB   00H
    DB   '"'
    DB   1CH
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   04H
    DB   0AH
    DB   ' '
    DB   0AH
    DB   ' '
    DB   1CH
    DB   02H
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   '|'
    DB   82H
    DB   ' '
    DB   82H
    DB   ' '
    DB   82H
    DB   1CH
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   '>'
    DB   00H
    DB   02H
    DB   00H
    DB   02H
    DB   '<'
    DB   03H
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   1CH
    DB   82H
    DB   ' '
    DB   82H
    DB   ' '
    DB   82H
    DB   '|'
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   1CH
    DB   '"'
    DB   08H
    DB   '"'
    DB   08H
    DB   '"'
    DB   18H
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   18H
    DB   '$'
    DB   00H
    DB   '$[$'
    DB   00H
    DB   '$'
    DB   18H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   '>'
    DB   00H
    DB   ' '
    DB   00H
    DB   ' '
    DB   00H
    DB   ' '
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   '"'
    DB   14H
    DB   00H
    DB   08H
    DB   00H
    DB   14H
    DB   '"'
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   '>'
    DB   00H
    DB   04H
    DB   08H
    DB   10H
    DB   00H
    DB   '>'
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   '>'
    DB   00H
    DB   '$H'
    DB   10H
    DB   00H
    DB   '>'
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   '>'
    DB   00H
    DB   08H
    DB   00H
    DB   14H
    DB   00H
    DB   '"'
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   06H
    DB   08H
    DB   10H
    DB   ' '
    DB   00H
    DB   '>'
    DB   00H
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   '>'
    DB   00H
    DB   10H
    DB   00H
    DB   08H
    DB   00H
    DB   10H
    DB   00H
    DB   '>'
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   '>'
    DB   00H
    DB   08H
    DB   00H
    DB   08H
    DB   00H
    DB   '>'
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   1CH
    DB   '"'
    DB   00H
    DB   '"'
    DB   00H
    DB   '"'
    DB   1CH
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   '>'
    DB   00H
    DB   ' '
    DB   00H
    DB   ' '
    DB   00H
    DB   '>'
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   10H
    DB   '*'
    DB   04H
    DB   '('
    DB   00H
    DB   '('
    DB   00H
    DB   '>'
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   '?'
    DB   00H
    DB   '$'
    DB   00H
    DB   '$'
    DB   00H
    DB   18H
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   1CH
    DB   00H
    DB   '"'
    DB   00H
    DB   '"'
    DB   00H
    DB   '"'
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   ' '
    DB   00H
    DB   ' '
    DB   1EH
    DB   ' '
    DB   00H
    DB   ' '
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   '8'
    DB   01H
    DB   04H
    DB   01H
    DB   04H
    DB   01H
    DB   '>'
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   '"'
    DB   14H
    DB   08H
    DB   00H
    DB   '>'
    DB   00H
    DB   08H
    DB   14H
    DB   '"'
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   '>'
    DB   00H
    DB   '*'
    DB   00H
    DB   '*'
    DB   00H
    DB   '*'
    DB   14H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   '>'
    DB   00H
    DB   0AH
    DB   00H
    DB   0AH
    DB   00H
    DB   0AH
    DB   04H
    DB   00H
    DB   8BH
    DB   00H
    DB   '>'
    DB   00H
    DB   0AH
    DB   00H
    DB   0AH
    DB   04H
    DB   00H
    DB   00H
    DB   '>'
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   14H
    DB   '"'
    DB   00H
    DB   '*'
    DB   00H
    DB   '*'
    DB   14H
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   '>'
    DB   00H
    DB   02H
    DB   00H
    DB   '>'
    DB   00H
    DB   02H
    DB   00H
    DB   '>'
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   '"'
    DB   00H
    DB   '*'
    DB   00H
    DB   '*'
    DB   00H
    DB   1CH
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   '>'
    DB   00H
    DB   02H
    DB   00H
    DB   '>'
    DB   00H
    DB   02H
    DB   00H
    DB   '?'
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   '8'
    DB   00H
    DB   08H
    DB   00H
    DB   08H
    DB   00H
    DB   '>'
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   ' '
    DB   00H
    DB   '>'
    DB   00H
    DB   0AH
    DB   00H
    DB   0AH
    DB   04H
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   10H
    DB   00H
    DB   '|'
    DB   82H
    DB   00H
    DB   82H
    DB   '|'
    DB   00H
    DB   8BH
    DB   00H
    DB   0EH
    DB   10H
    DB   '(@'
    DB   88H
    DB   00H
    DB   88H
    DB   00H
    DB   0FEH
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   92H
    DB   00H
    DB   92H
    DB   00H
    DB   92H
    DB   00H
    DB   8CH
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   02H
    DB   00H
    DB   02H
    DB   00H
    DB   0FEH
    DB   00H
    DB   03H
    DB   00H
    DB   8BH
    DB   00H
    DB   03H
    DB   00H
    DB   '>@'
    DB   82H
    DB   00H
    DB   0FEH
    DB   00H
    DB   03H
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   92H
    DB   00H
    DB   92H
    DB   00H
    DB   92H
    DB   00H
    DB   82H
    DB   00H
    DB   8BH
    DB   00H
    DB   '8D'
    DB   00H
    DB   'D'
    DB   0BAH
    DB   'D'
    DB   00H
    DB   'D8'
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   0FEH
    DB   00H
    DB   80H
    DB   00H
    DB   80H
    DB   00H
    DB   80H
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   00H
    DB   82H
    DB   'D('
    DB   10H
    DB   '(D'
    DB   82H
    DB   00H
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   04H
    DB   08H
    DB   10H
    DB   ' @'
    DB   00H
    DB   0FEH
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   04H
    DB   'H'
    DB   90H
    DB   ' @'
    DB   00H
    DB   0FEH
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   10H
    DB   00H
    DB   '('
    DB   00H
    DB   'D'
    DB   00H
    DB   82H
    DB   00H
    DB   8BH
    DB   00H
    DB   0EH
    DB   10H
    DB   ' @'
    DB   80H
    DB   00H
    DB   80H
    DB   00H
    DB   0FEH
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   '@ '
    DB   10H
    DB   ' @'
    DB   00H
    DB   0FEH
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   10H
    DB   00H
    DB   10H
    DB   00H
    DB   10H
    DB   00H
    DB   0FEH
    DB   00H
    DB   8BH
    DB   00H
    DB   '|'
    DB   00H
    DB   82H
    DB   00H
    DB   82H
    DB   00H
    DB   82H
    DB   00H
    DB   '|'
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   80H
    DB   00H
    DB   80H
    DB   00H
    DB   80H
    DB   00H
    DB   0FEH
    DB   00H
    DB   8BH
    DB   00H
    DB   '`'
    DB   02H
    DB   94H
    DB   08H
    DB   90H
    DB   00H
    DB   90H
    DB   00H
    DB   0FEH
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   90H
    DB   00H
    DB   90H
    DB   00H
    DB   90H
    DB   00H
    DB   '`'
    DB   00H
    DB   8BH
    DB   00H
    DB   '|'
    DB   00H
    DB   82H
    DB   00H
    DB   82H
    DB   00H
    DB   82H
    DB   00H
    DB   'D'
    DB   00H
    DB   8BH
    DB   00H
    DB   80H
    DB   00H
    DB   80H
    DB   00H
    DB   0FEH
    DB   00H
    DB   80H
    DB   00H
    DB   80H
    DB   00H
    DB   8BH
    DB   00H
    DB   0E0H
    DB   02H
    DB   10H
    DB   02H
    DB   10H
    DB   02H
    DB   10H
    DB   02H
    DB   0FCH
    DB   00H
    DB   8BH
    DB   00H
    DB   0C6H
    DB   '('
    DB   10H
    DB   00H
    DB   0FEH
    DB   00H
    DB   10H
    DB   '('
    DB   0C6H
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   92H
    DB   00H
    DB   92H
    DB   00H
    DB   92H
    DB   00H
    DB   'l'
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   12H
    DB   00H
    DB   12H
    DB   00H
    DB   12H
    DB   00H
    DB   0CH
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   12H
    DB   00H
    DB   12H
    DB   0CH
    DB   00H
    DB   00H
    DB   0FEH
    DB   00H
    DB   8BH
    DB   00H
    DB   'D'
    DB   00H
    DB   82H
    DB   00H
    DB   92H
    DB   00H
    DB   92H
    DB   00H
    DB   'l'
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   02H
    DB   00H
    DB   0FEH
    DB   00H
    DB   02H
    DB   00H
    DB   0FEH
    DB   00H
    DB   8BH
    DB   00H
    DB   'D'
    DB   00H
    DB   92H
    DB   00H
    DB   92H
    DB   00H
    DB   92H
    DB   00H
    DB   '|'
    DB   00H
    DB   8BH
    DB   00H
    DB   0FEH
    DB   00H
    DB   02H
    DB   00H
    DB   0FEH
    DB   00H
    DB   02H
    DB   00H
    DB   0FFH
    DB   00H
    DB   8BH
    DB   00H
    DB   0F0H
    DB   00H
    DB   10H
    DB   00H
    DB   10H
    DB   00H
    DB   10H
    DB   00H
    DB   0FEH
    DB   00H
U13:DB   20H,0EH,'Тест проверки принтера',0DH,0AH,0AH
    DB   9,'ТАБ',9,'ТАБ',9,'ТАБ',9,'ТАБ',9,'ТАБ',0DH,0AH
        DB      'Возврат на шаг         =====',8,'/=',8,'/=',8,'/=',8,'/',0DH,0AH
    DB   'Отмена данных в буфере печати',18H,0DH,0AH
    DB   'Режим нормальной и ',0EH,'расширенной печати',0DH,0AH
    DB   'Режим нормальной и ',0FH,0EH,'расширенной печати со сжатием',0DH,0AH
    DB   1BH,2DH,31H,1BH,0FH
    DB   'Печать с подчеркиванием сжатых, ',12H,1BH,0EH,'расширенных и  '
    DB   14H,'нормальных знаков',1BH,2DH,30H,0DH,0AH
    DB   1BH
    DB   'E'
    DB   'Режим утолщенной печати',1BH,46H,0DH,0AH
    DB   1BH,47H,'Режим двойной печати',1BH,48H,0DH,0AH
    DB   1BH,45H,1BH,47H,'Режим утолщенной двойной печати',1BH,48H,1BH,46H,0DH,0AH
    DB   1BH,4DH,'Печать 12 знаков/дюйм',0DH,0AH
    DB   1BH,50H,'Печать 10 знаков/дюйм',0DH,0AH
    DB   'Печать со смещением вверх   Y=aX'
    DB   1BH
    DB   'S03'
    DB   1BH
    DB   'T+bX'
    DB   1BH
    DB   'S02'
    DB   1BH
    DB   'T+c'
    DB   0DH
    DB   0AH
    DB   'Печать со смещением вниз    H'
    DB   1BH
    DB   'S12'
    DB   1BH
    DB   'TSO'
    DB   1BH
    DB   'S14'
    DB   1BH
    DB   'T'
    DB   0DH
    DB   0AH
    DB   1BH
    DB   'A'
    DB   05H
    DB   1BH
    DB   'S0'
    DB   09H
    DB   'Печать уменьшенными',0DH,0AH
    DB   9,'знаками с шагом строк',0DH,0AH
    DB   9,'5/72 дюйма',1BH,54H,0DH,0AH,0AH
    DB   1BH,30H,'Шаг строк 1/8 дюйма',0DH,0AH
    DB   '   ------------',0DH,0AH
    DB   '   ------------',0DH,0AH
    DB   1BH,31H,'Шаг строк 7/72 дюйма',0DH,0AH
    DB   '   ------------',0DH,0AH
    DB   '   ------------',0DH,0AH
    DB   1BH,32H,'Шаг строк 1/6 дюйма',0DH,0AH
    DB   '   ------------',0DH,0AH
    DB   '   ------------',0DH,0AH
        DB      1BH,33H,14H,'Шаг строк 20/216 дюйма',0DH,0AH
    DB   '   ------------',0DH,0AH
    DB   '   ------------',1BH,32H,0DH,0AH,0DH,0AH,0DH,0AH
;
U14:    DB      1BH,'[5w Тест проверки принтера',1BH,'[0w',0DH,0AH
        DB      9,'ТАБ',9,'ТАБ',9,'ТАБ',9,'ТАБ',9,'ТАБ',0DH,0AH
        DB      'Возврат на шаг         =====',8,'/=',8,'/=',8,'/=',8,'/',0DH,0AH,0AH
        DB      'Режим нормальной и ',1BH,'[5wрасширенной печати',1BH,'[0w',0DH,0AH
        DB      'Режим нормальной и ',1BH,'[8wрасширенной печати со сжатием',1BH,'[0w',0DH,0AH
        DB      1BH,'[4w',1BH,'[4mПечать с подчеркиванием сжатых, ',1BH,'[5wрасширенных и ',1BH,'[0wнормальных знаков',1BH,'[m',0DH,0AH
        DB      1BH,'[1mРежим утолщенной печати',1BH,'[m',0DH,0AH
        DB      1BH,'[2mРежим двойной печати',0DH,0AH
        DB      1BH,'[1mРежим утолщенной двойной печати',1BH,'[m',0DH,0AH
        DB      1BH,'[2wПечать 12 знаков/дюйм',0DH,0AH
        DB      1BH,'[0wПечать 10 знаков/дюйм',0DH,0AH
        DB      'Печать со смещением вверх   Y=aX',1BH,'[5m3',1BH,'[m+bX',1BH,'[5m2',1BH,'[m+c',0DH,0AH
        DB      'Печать со смещением вниз    H',1BH,'[6m2',1BH,'[mSO',1BH,'[6m4',1BH,'[m',0DH,0AH
        DB      9,1BH,'[5m',1BH,'[3zПечать уменьшенными',0DH,0AH
        DB      9,'знаками с шагом строк',0DH,0AH
        DB      9,'5/72 дюйма',1BH,'[m',1BH,'[0z',0DH,0AH
        DB      1BH,'[2zШаг строк 1/8 дюйма',0DH,0AH
        DB      '   ------------',0DH,0AH
        DB      '   ------------',0DH,0AH
        DB      1BH,'[3zШаг строк 7/72 дюйма',0DH,0AH
        DB      '   ------------',0DH,0AH
        DB      '   ------------',0DH,0AH
        DB      1BH,'[0zШаг строк 1/6 дюйма',0DH,0AH
        DB      '   ------------',0DH,0AH
        DB      '   ------------',0DH,0AH
        DB      1BH,'[3zШаг строк 20/216 дюйма',0DH,0AH
        DB      '   ------------',0DH,0AH
        DB      '   ------------',1BH,'[0z',0DH,0AH,0AH
;
CONFIG:EQU  0F701H
U0C:EQU  0302H
U19:EQU  0000H
U1A:EQU  0FB38H
U20:EQU  0FB30H
U21:EQU  0FB33H
;
M25:
T32:
N20:
    MOV  A,H
    CALL O04 
    MOV  A,L
M27:
T21:
N21:
K3B:
G08:
O04:PUSH PSW
    RRC
    RRC
    RRC
    RRC
    CALL O05 
    CALL O06 
    POP  PSW
    CALL O05 
;
M26:
T22:
N0C:
K03:
G1F:
O06:PUSH B
    PUSH D
    PUSH H
    MOV  C,A
    CALL CONOUT 
O09:LDA  O08 
    ORA  A
    JNZ  O09 
    POP  H
    POP  D
    POP  B
    RET
;
;       п/п печати сообщения
;
MSG:MOV  A,M
    ORA  A
    RZ
    CALL O06 
    INX  H
    JMP  MSG 
;
M15:
    DB   0CH,4,'ФОРМАНТА ПК8020',0DH,0AH
    DB   'Качканар  1991',0DH,0AH
    DB   'КТДП версия 1.5'
M30:DB   0DH,0AH,0AH,0
M2B:DB   9,9,'Возможные режимы проверки:',0DH,0AH,0AH
    DB   9,'1 - Последовательное выполнение всех тестов',0DH,0AH,0AH
    DB   9,'2 - Циклический прогон автоматических тестов',0DH,0AH,0AH
    DB   9,'3 - Выполнение отдельных тестов',0DH,0AH,0AH
    DB   9,'СТОП - Прекращение работы программы',0DH,0AH,0AH,9,0
;
M57:DB   0DH,0AH,'0 - Смена режима ',9,'7 - Проверка клавиатуры',0DH,0AH
    DB   '1 - Тест АЦЗУ',9,9,'8 - Проверка формирователя звука',0DH,0AH
    DB   '2 - Тест процессора',9,'9 - Тест адаптера локальной сети',0DH,0AH
    DB   '3 - Тест ОЗУ',9,9,'A - Тест принтера',0DH,0AH
    DB   '4 - Тест ПЗУ',9,9,'B - Тест НКМЛ',0DH,0AH
    DB   '5 - Тест ГЗУ',9,9,'C - Тест интерфейса ИРПС и С2',0DH,0AH
    DB   '6 - Вывод информации',9,'D - Тест НГМД',0DH,0AH
    DB   9,9,9,'E - Тест контроллера прерываний',0DH,0AH,0AH,0
M2C:DB   9,'Выберите из списка: ',0
M45:DB   'Проверка окончена.',0
M6C:DB   'Тест АЦЗУ:',9,0
T35:DB   'Тест ОЗУ 8000-FFFF:',9,0
T1E:DB   'Тест ОЗУ 0000-7FFF:',0DH,0AH,0
T31:
M24:DB   9,'Ошибка ОЗУ:   ',0
M63:DB   'Перемещение КТДП:',0
M5D:DB   9,'окончено',0DH,0AH,0
T44:DB   'Тест ПЗУ:',9,0
T4D:DB   9,9,'Неисправность ПЗУ #',0
M8C:DB   'Тест процессора:',0
T1A:DB   9,'НЕИСПРАВНОСТЬ!',0
;
T17:
N1D:
M84:
K05:
G1D:
U16:
    DB   9,'окончен',0DH,0AH,0
N26:DB   0CH
    DB   04H
    DB   1BH
    DB   '=      '
    DB   'ПРОВЕРКА ОТОБРАЖЕНИЯ АЛФАВИТНО-ЦИФРОВОЙ ИНФОРМАЦИИ',0DH,0AH,0AH
    DB   '   Русский алфавит:',0DH,0AH
    DB   'А Б В Г Д Е Ж З И Й К Л М Н 0 П Р С Т У Ф Х Ц Ч Ш Щ '
    DB   0FFH,' Ы Ь Э Ю Я ',0DH,0AH
    DB   'а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ '
    DB   'ъ ы ь э ю я ',0DH,0AH
    DB   '   Латинский алфавит:',0DH,0AH
    DB   '@ A B C D E F G H I J K L M N O P Q R S T U V '
    DB   'W X Y Z [ \ ] ^ _ ',0DH,0AH
    DB   '` a b c d e f g h i j k l m n o p q r s t u v '
    DB   'w x y z { | } ~ '
    DB   10H
    DB   '',0DH,0AH
    DB   '   Цифры и знаки:',0DH,0AH
    DB   '  ! " # $ % & ',27H,' ( ) * + , - . / 0 1 2 3 4 5 6 '
    DB   '7 8 9 : ; < = > ? ',0DH,0AH
    DB   10H
    DB   '  '
    DB   10H
    DB   01H
    DB   ' '
    DB   10H
    DB   02H
    DB   ' '
    DB   10H
    DB   03H
    DB   ' '
    DB   10H
    DB   04H
    DB   ' '
    DB   10H
    DB   05H
    DB   ' '
    DB   10H
    DB   06H
    DB   ' '
    DB   10H
    DB   07H
    DB   ' '
    DB   10H
    DB   08H
    DB   ' '
    DB   10H
    DB   09H
    DB   ' '
    DB   10H
    DB   0AH
    DB   ' '
    DB   10H
    DB   0BH
    DB   ' '
    DB   10H
    DB   0CH
    DB   ' '
    DB   10H
    DB   0DH
    DB   ' '
    DB   10H
    DB   0EH
    DB   ' '
    DB   10H
    DB   0FH
    DB   ' '
    DB   10H
    DB   10H
    DB   ' '
    DB   10H
    DB   11H
    DB   ' '
    DB   10H
    DB   12H
    DB   ' '
    DB   10H
    DB   13H
    DB   ' '
    DB   10H
    DB   14H
    DB   ' '
    DB   10H
    DB   15H
    DB   ' '
    DB   10H
    DB   16H
    DB   ' '
    DB   10H
    DB   17H
    DB   ' '
    DB   10H
    DB   18H
    DB   ' '
    DB   10H
    DB   19H
    DB   ' '
    DB   10H
    DB   1AH
    DB   ' '
    DB   10H
    DB   1BH
    DB   ' '
    DB   10H
    DB   1CH
    DB   ' '
    DB   10H
    DB   1DH
    DB   ' '
    DB   10H
    DB   1EH
    DB   ' '
    DB   10H
    DB   1FH
    DB   ' '
    DB   0DH
    DB   0AH
    DB   0AH
    DB   '   '
    DB   'Псевдографика:  '
    DB   80H
    DB   0A0H
    DB   96H
    DB   0A9H
    DB   98H
    DB   83H
    DB   0A4H
    DB   0B8H
    DB   87H
    DB   0A1H
    DB   0B2H
    DB   0ABH
    DB   0B6H
    DB   0B9H
    DB   90H
    DB   0B1H
    DB   0B5H
    DB   0BCH
    DB   9CH
    DB   8EH
    DB   9EH
    DB   0BEH
    DB   0BDH
    DB   80H
    DB   88H
    DB   99H
    DB   91H
    DB   80H
    DB   0AEH
    DB   0B3H
    DB   9DH
    DB   80H
    DB   0A8H
    DB   80H
    DB   94H
    DB   0AAH
    DB   95H
    DB   0DH
    DB   0AH
    DB   '                   '
    DB   80H
    DB   82H
    DB   0A5H
    DB   9AH
    DB   89H
    DB   0B0H
    DB   86H
    DB   8BH
    DB   0B4H
    DB   92H
    DB   0A3H
    DB   0BAH
    DB   0A7H
    DB   9BH
    DB   81H
    DB   93H
    DB   97H
    DB   8FH
    DB   8DH
    DB   0ACH
    DB   0ADH
    DB   0AFH
    DB   9FH
    DB   80H
    DB   0A2H
    DB   0A6H
    DB   84H
    DB   80H
    DB   0BBH
    DB   8CH
    DB   0B7H
    DB   80H
    DB   80H
    DB   0BFH
    DB   80H
    DB   85H
    DB   8AH
    DB   0DH
    DB   0AH
    DB   0AH
;
N42:
M46:
    DB   07H
   DB   '      Для продолжения проверки нажмите <ВК>:',0
;
RTN:
    DB   0DH,0AH,0
N29:DB   0CH
    DB   04H
    DB   1BH
    DB   '6 '
    DB   1BH
    DB   'Y _ '
    DB   1BH
    DB   'Y/  '
    DB   1BH
    DB   'Y/_ '
    DB   1BH
    DB   '7'
    DB   1BH
    DB   'Y !'
    DB   09H
    DB   'Проверка отображения графической информации'
    DB   1BH
    DB   'Y/!'
    DB   00H
N44:DB   0CH
    DB   04H
    DB   ' '
    DB   'ЯРКОСТЬ: 7'
    DB   1BH
    DB   'Y O'
    DB   'ЦВЕТ: БЕЛЫЙ',0DH,0AH,0AH
    DB   ' ЯРКОСТЬ: 6'
    DB   1BH
    DB   'Y"O'
    DB   'ЦВЕТ: ЖЕЛТЫЙ',0DH,0AH,0AH
    DB   ' ЯРКОСТЬ: 5'
    DB   1BH
    DB   'Y$O'
    DB   'ЦВЕТ: ЛИЛОВЫЙ',0DH,0AH,0AH
    DB   ' ЯРКОСТЬ: 4'
    DB   1BH
    DB   'Y&O'
    DB   'ЦВЕТ: КРАСНЫЙ',0DH,0AH,0AH
    DB   ' ЯРКОСТЬ: 3'
    DB   1BH
    DB   'Y(O'
    DB   'ЦВЕТ: ГОЛУБОЙ',0DH,0AH,0AH
    DB   ' ЯРКОСТЬ: 2'
    DB   1BH
    DB   'Y*O'
    DB   'ЦВЕТ: ЗЕЛЕНЫЙ',0DH,0AH,0AH
    DB   ' ЯРКОСТЬ: 1'
    DB   1BH
    DB   'Y,O'
    DB   'ЦВЕТ: СИНИЙ',0DH,0AH,0AH
    DB   ' ЯРКОСТЬ: 0'
    DB   1BH
    DB   'Y.O'
    DB   'ЦВЕТ: ЧЕРНЫЙ',0DH,0AH
    DB   1BH
    DB   '<'
    DB   00H
;
M38:DB   0CH,4,0
;
O05:EQU  00F7H
O08:EQU  0F8FFH
IFPS:
;***********************************************************
;
;       Программа проверяет работу последовательного
;                  интерфейса ПК8020
;
;**********************************************************
;
;
BCNTC   EQU     03H     ; адрес регистра режима таймера
BCNTD   EQU     01H     ; адрес регистра счета таймера
;
STR1S   EQU     01000000B; выбор счетчика 1
RLMB    EQU     00100000B; чтение/загрузка старшего байта
RLLB    EQU     00010000B; чтение/загрузка младшего байта
MODE3   EQU     00000110B; режим 3 (делитель частоты)
;
B9600   EQU     13      ; скорость 9600 бод
B4800   EQU     26      ; скорость 4800 бод
B2400   EQU     52      ; скорость 2400 бод
B1200   EQU     104     ; скорость 1200 бод
;
SERC    EQU     11H     ; адрес регистра управления ВВ51
SERD    EQU     10H     ; адрес регистра данных ВВ51
SERS    EQU     11H     ; адрес регистра состояния ВВ51
;
R16X    EQU     00000010B; коэффициент деления частоты
;                          синхронизации 16
CL8     EQU     00001100B; длина символа 8 бит
ST2     EQU     11000000B; пауза при передаче 2 стоповых бита
PEHB    EQU     00010000B; разрешение контроля
USRST   EQU     01000000B; программный сброс
;
CLERR   EQU     00010000B; сброс признаков ошибок
TXEN    EQU     00000001B; разрешение работы передатчика
RXEN    EQU     00000100B; разрешение работы приемника
DTR     EQU     00000010B; сигнал "Готовность ПК"
;
TRDY    EQU     00000001B; признак готовности передатчика
RRDY    EQU     00000010B; признак готовности приемника
;
        LXI     H,SIFPS
        CALL    MSG
;
        CALL    CON
        JNZ     NEW-3
;       Инициализация таймера
;
        LXI     H,BCNTC+PBASE; адрес регистра упр-я таймера
        MVI     M,STMRM ; сч.1, чт/загр мл и ст байтов, дел. F
;
STMRM   EQU     STR1S OR RLMB OR RLLB OR MODE3
;
        MVI     L,BCNTD ; адрес р-ра счета таймера
        MVI     M,B1200 ; коэф. счета для скорости 1200 бод
        MVI     M,0     ; ст. байт коэф. счета
;
;       Инициализация контроллера последовательного интерфейса
;
        MVI     L,SERC  ; адрес регистра управления ВВ51
        MVI     M,SERMD ; к.дел.16, дл.8 сим., 2ст., разр.кон.
;
SERMD   EQU     R16X OR CL8 OR ST2 OR PEHB
;
        MVI     M,SERCOM; сброс ош., вкл.пр.и перед., гот. ПК
;
SERCOM  EQU     CLERR OR TXEN OR RXEN OR DTR
;
        MVI     L,10H   ; адрес регистра данных ВВ51
        MOV     A,M     ; псевдоприем, сброс триг. гот. пр.
;
;  Выбор режима
;
        LXI     H,S14
        CALL    MSG     ; подключен ли шлейф
;
        CALL    M37
        JZ      TESTIFPS
        JMP     U07     ; вывести сообщение об отмене и выйти
;
TESTIFPS:
        MVI     B,0FFH
IFPS1:
        MOV     C,B
;
        LDA     SERS+PBASE
        ANI     TRDY
        JZ      ERRTX
;
        CALL    TX      ; передать символ в линию
;
        CALL    TIMER
        LDA     SERS+PBASE
        ANI     RRDY
        JZ      ERRRX
;
        CALL    RX      ; принять символ из линии
;
        CMP     B
        JNZ     ERRD
;
        DCR     B
        JNZ     IFPS1
        LXI     H,RTN
        CALL    MSG
        LXI     H,RTN
        CALL    MSG
        LXI     H,U16
        CALL    MSG
        JMP     EXIT
;
;
;   подпрограмма вывода символа в линию из регистра C
;
TX:
        MOV     A,C
        STA     SERD+PBASE; передача данных в линию
;
        RET
;
;   подпрограмма ввода символа из линии в регистр A
;
RX:
        LDA     SERD+PBASE; ввод данных из линии
;
        RET
;
EXIT:   LXI     H,SERC+PBASE; выход из теста
        MVI     M,USRST ; с программным сбросом ВВ51
        RET
;
;   Контроль сигналов
;
SIG:
        LXI     H,PROD
        CALL    MSG
;
SIG1:
        CALL    CONST   ; опрос состояния консоли
        ORA     A
        JZ      $+9
        CALL    CONIN   ; ввод паразитного символа
        JMP     EXIT
;
        MVI     C,55H
        LDA     SERS+PBASE
        ANI     TRDY
        JZ      $-5
        CALL    TX
        JMP     SIG1
;
TIMER:
        LXI     D,0FFFH
        DCX     D
        MOV     A,D
        ORA     E
        RZ
        JMP     TIMER+3
;
ERRTX:
        LXI     H,S12
        CALL    MSG
        JMP     SIG
;
ERRRX:
        LXI     H,S13
        JMP     ERRTX+3
;
ERRD:
        LXI     H,S15
        JMP     ERRTX+3
;
S12:    DB      0AH,0DH,'Не готов передатчик',0
S13:    DB      0AH,0DH,'Не готов приемник',0
SIFPS:  DB      0AH,0DH,'Тест ИРПС и С2:',0
S14:    DB      0AH,0DH,9,'Подключен шлейф ИРПС 4.137.080-03'
        DB      0AH,0DH,9,'или С2 4.137.080-04? (Д/Н)',0
S15:    DB      0AH,0DH,'Ошибка данных',0
;
;       Тест НГМД
;
NGMD:
    LXI  H,L02 
    CALL MSG    ; 'тест НГМД'
        CALL    CON
        JNZ     NEW-3
;
        LXI     H,L43
        CALL    MSG     ; 'используйте технологический диск'
L0A:LXI  H,L04 
    CALL MSG    ; 'имя диска или ВК для выхода из теста'
    CALL CONIN
        PUSH    PSW
        MOV     C,A
        CALL    CONOUT
        POP     PSW
    CPI  0DH
    RZ
    STA  L06 
    CPI  41H
    JZ   L07 
    CPI  42H
    MVI  A,02H
    JZ   L08 
    JMP  L0A 
L07:MVI  A,01H
L08:    LXI     H,PBASE+DRVREG 
        MOV     M,A
        ORI     MOTOR
        MOV     M,A     ; включить мотор
        LXI     B,0
        LXI     H,PBASE+CMDREG
DEFLOOP:
        MOV     A,M
        RLC             ; состояние ?
        JNC     NGMDTST ; есть готовность диска
        DCX     B
        MOV     A,B
        ORA     C
        JNZ     DEFLOOP
;               готовности диска не обнаружено
NRD:
        LXI     H,L44
        CALL    MSG
        RET
NGMDTST:
    LXI  H,L0C 
    CALL MSG 
    CALL CONIN
    CPI  0DH
    JNZ  L0A 
    MVI  C,0AH
    CALL CONOUT
    SUB  A
    STA  L0D 
    STA  L0E 
    LXI  H,L01 
    LXI  D,L0F 
    MVI  A,4EH
    CALL L10 
    LXI  D,L11 
    MVI  A,00H
    CALL L10 
    LXI  D,L12 
    MVI  A,0F6H
    CALL L10 
    MVI  M,0FCH
    INX  H
    LXI  D,L13 
    MVI  A,4EH
    CALL L10 
    LDA  L14 
    MOV  C,A
    MVI  B,01H
L1A:LXI  D,L11 
    MVI  A,00H
    CALL L10 
    LXI  D,L12 
    MVI  A,0F5H
    CALL L10 
    MVI  M,0FEH
    INX  H
    MVI  M,00H
    INX  H
    MVI  M,00H
    INX  H
    MOV  M,B
    INX  H
    LDA  L15 
    CPI  04H
    JNZ  L16 
    DCR  A
L16:MOV  M,A
    INX  H
    MVI  M,0F7H
    INX  H
    LXI  D,L17 
    MVI  A,4EH
    CALL L10 
    LXI  D,L11 
    MVI  A,00H
    CALL L10 
    LXI  D,L12 
    MVI  A,0F5H
    CALL L10 
    MVI  M,0FBH
    INX  H
    LDA  L18 
    CMA
    MOV  E,A
    LDA  L15 
    CMA
    MOV  D,A
    INX  D
    MVI  A,0E5H
    CALL L10 
    MVI  M,0F7H
    INX  H
    LXI  D,L19 
    MVI  A,4EH
    CALL L10 
    INR  B
    DCR  C
    JNZ  L1A 
    LXI  D,L1B 
    MVI  A,4EH
    CALL L10 
    CALL L1C 
L2A:MVI  A,04H
L22:PUSH PSW
    CALL L1D 
    LXI  D,L01 
    LXI  B,PBASE+DATREG 
    MVI  M,0F0H
    CALL L1F 
    CALL L20 
    MOV  A,M
    ANI  5DH
    JZ   L21 
    POP  PSW
    DCR  A
    JNZ  L22 
    LXI  H,L23 
    CALL MSG 
    CALL CONIN
    CPI  0DH
    JZ   L24 
    JMP  L0A 
L21:POP  PSW
        MVI     A,4
L41:    PUSH    PSW
;
        MVI     A,5
        STA     SECREG+PBASE
        CALL    L1D     ; включить мотор
        LXI     H,PBASE+CMDREG
        LXI     B,PBASE+DATREG
        MVI     M,84H   ; чтение сектора
        CALL    L1F     ; задержка
        CALL    TRKREAD
        MOV     A,M
        ANI     5DH
        JZ      L42
        POP     PSW
        DCR     A
        JNZ     L41
        LXI     H,LERRD
        CALL    MSG
        CALL    CONIN
        CPI     0DH
        JZ      L24
        JMP     L0A
;
L42:    POP     PSW
    LDA  L0E 
    CPI  3CH
    JNZ  L25 
        LXI     H,RTN
        CALL    MSG
    SUB  A
L25:INR  A
    STA  L0E 
    MVI  C,2AH
    CALL CONOUT
L24:LXI  H,PBASE+DRVREG 
    MOV  A,M
    ANI  10H
    JNZ  L26 
    MOV  A,M
    ORI  10H
    MOV  M,A
    MVI  A,01H
    LXI  H,L14 
    MOV  C,M
    LHLD L27 
    XCHG
    LHLD L18 
    DAD  D
    XCHG
    LXI  H,L28 
L29:MOV  M,A
    DAD  D
    DCR  C
    JNZ  L29 
    JMP  L2A 
L26:MOV  A,M
    ANI  0EFH
    MOV  M,A
    LDA  L0D 
    INR  A
    LXI  H,L2B 
    CMP  M
    JNC  L2C 
    STA  L0D 
    MVI  B,00H
    LXI  H,L14 
    MOV  C,M
    LHLD L27 
    XCHG
    LHLD L18 
    DAD  D
    XCHG
    DCX  D
    LXI  H,L2D 
L2E:MOV  M,A
    INX  H
    MOV  M,B
    DAD  D
    DCR  C
    JNZ  L2E 
    MVI  A,40H+10H+8+4+3
    CALL L2F 
    JMP  L2A 
L2C:LXI  H,PBASE+DRVREG 
    MOV  A,M
    ANI  0EFH
    MOV  M,A
    CALL L1C 
    LXI  H,L30 
    LXI  D,L31 
    MVI  C,20H
L32:LDAX D
    MOV  M,A
    INX  D
    INX  H
    DCR  C
    JNZ  L32 
    MVI  A,00H
    STA  PBASE+TRKREG 
    MVI  A,01H
    STA  PBASE+SECREG 
    CALL L1D 
    LXI  D,L30 
    LXI  B,PBASE+DATREG 
    MVI  M,0A4H
    CALL L1F 
    CALL L20 
    MOV  A,M
    ANI  5DH
    JZ   L35 
    LXI  H,L36 
    CALL MSG 
L35:
        LXI     H,RTN
        CALL    MSG
LXI  H,T17 
    CALL MSG 
    JMP  L0A 
L20:MOV  A,M
    RRC
    RNC
    RRC
    JNC  L20 
    LDAX D
    STAX B
    INX  D
L39:SUB  A
L38:INR  A
    XRA  M
    JZ   L38 
    RRC
    LDAX D
    STAX B
    RC
    INX  D
    JMP  L39 
TRKREAD:
        MOV     A,M
        RRC
        RNC
        RRC
        JNC     TRKREAD
        LDAX    B
        JMP     TRKREAD
L1C:MVI  A,00000011B
L2F:LXI  H,PBASE+CMDREG 
    MOV  M,A
    CALL L1F 
L3B:MOV  A,M
    RRC
    JNC  L3B
L3C:MOV  A,M
    RRC
    JC   L3C 
    RET
L1D:LXI  H,PBASE+DRVREG 
    MOV  A,M
    ANI  0DFH
    MOV  M,A
    ORI  20H
    MOV  M,A
    LXI  H,PBASE+CMDREG 
L3D:MOV  A,M
    RLC
    JC   L3D
    RET
L1F:MVI  A,0AH
L3E:DCR  A
    JNZ  L3E 
    RET
L10:MOV  M,A
    INX  H
    INR  E
    JNZ  L10 
    INR  D
    JNZ  L10 
    RET
L02:DB   0DH
    DB   0AH
    DB   'Тест НГМД:',0
L43:    DB      0DH,0AH,'Для проверки используйте диск 133 мм DS/DD',0
L44:    DB      0DH,0AH,'Не готов',0DH,0AH,0
L04:DB   0DH
    DB   0AH
    DB   0AH
    DB   'Имя дисковода (ВК для выхода из теста) ?',0DH,0AH,0
L0C:DB   0DH
    DB   0AH
    DB   'Для проверки дисковода '
L06:DB   00H
    DB   ': введите ВК',0
L23:DB   0DH
    DB   0AH
    DB   'Сбой, введите ВК',0
L36:DB   0DH
    DB   0AH
    DB   'Ошибка записи',0
LERRD:  DB      0DH,0AH,'Ошибка чтения, введите ВК',0
;
L31:DB   00H
    DB   00H
    DB   00H
    DB   00H
    DB   00H
    DB   00H
    DB   00H
    DB   01H
    DB   01H
    DB   01H
    DB   03H
    DB   01H
    DB   05H
    DB   00H
    DB   0A0H
    DB   00H
    DB   '('
    DB   00H
    DB   04H
    DB   0FH
    DB   00H
    DB   8CH
    DB   01H
    DB   ''
    DB   00H
    DB   0C0H
    DB   00H
    DB   ' '
    DB   00H
    DB   01H
    DB   00H
    DB   ':'
L18:DB   00H
L15:DB   04H
L27:DB   0BEH
    DB   00H
L14:DB   05H
L2B:DB   'P'
L0D:DB   00H
L0E:DB   00H
L01:EQU  2000H
DRVREG  EQU  39H
L0F:EQU  0FFB0H
L11:EQU  0FFF4H
L12:EQU  0FFFDH
L13:EQU  0FFCEH
L17:EQU  0FFEAH
L19:EQU  0FF7EH
L1B:EQU  0FC18H
DATREG  EQU  1BH
L28:EQU  L01+0A3H
L2D:EQU  L01+0A2H
L30:EQU  L01+0CDH
TRKREG  EQU  19H
SECREG  EQU  1AH
CMDREG  EQU  18H
MOTOR   EQU     20H
;
PIC:
;       Тест контроллера прерываний
;
SICP0   EQU     28H
ICW1    EQU     12H
SHORT   EQU     4
INTTBL  EQU     4000H
INT4    EQU     00010000B
SELRID  EQU     00001000B
SELEN   EQU     00000010B
SELIRR  EQU     00000000B
;
        LXI     H,SPIC
        CALL    MSG
;
        MVI     A,0C3H
        STA     INTTBL+10H
        LXI     H,NORM
        SHLD    INTTBL+11H
;
        DI
        LXI     H,SICP0+PBASE
        MVI     M,ICW1 + SHORT + (LOW INTTBL); СКИ1
        INR     L
        MVI     M,HIGH INTTBL   ; СКИ2
        MVI     M,NOT INT4      ; СКО1
        DCR     L
        MVI     M,SELRID + SELEN + SELIRR; СКО3
        EI
;
        LXI     B,0FFFFH
        DCX     B
        MOV     A,B
        ORA     C
        JNZ     $-3
;
        DI
        LXI     H,PICERR
        CALL    MSG
        JMP     OLD
;
NORM:
        DI
        LXI     H,U16
        CALL    MSG
        POP     H
;
OLD:
        LXI     H,SICP0+PBASE
        MVI     M,0F6H
        INR     L
        MVI     M,2
        LDA     0304H
        CPI     20H
        JZ      OLD2
;
        MVI     M,0F7H
        JMP     OLD2+2
OLD2:
        MVI     M,0E7H
        DCR     L
        MVI     M,0AH
;
        RET
;
SPIC:   DB      'Тест прерываний:',0
PICERR: DB      0DH,0AH,'Нет прерывания #4',0DH,0AH,0
M66:DB   '$$'
        END
