; ======================================================= ; Исходный текст тестового ПЗУ ПК "Океан 240.2" ; Дизасемблировал Romych, 2025-08-20 ; в мнемонике ассемблера Z80 в фомате sjasmplus ; ======================================================= DEVICE NOSLOT64K ; КР580ВВ55 System DD17RA EQU 0xC0 ; VShift[8..1] DD17RB EQU 0xC1 ; [A14,A13,REST,ENROM,A18,A17,A16,32K] DD17RC EQU 0xC2 ; HShift[HS5..1,SB3..1] DD17RR EQU 0xC3 ; VV55 Sys CTR ; КР580ВВ55 LPT/Video/Tape DD67RA EQU 0xE0 ; [LP7..0] DD67RB EQU 0xE1 ; [VSU,C/M,FL3..1,COL3..1] DD67RC EQU 0xE2 ; [USER3..1,STB-LP,BELL,TAPE3..1] DD67RR EQU 0xE3 ; VV55 Video CTR ; КР580ВИ53 DD70C1 EQU 0x60 ; VI53 TIM/CTR1 DD70C2 EQU 0x61 ; VI53 TIM/CTR2 DD70C3 EQU 0x62 ; VI53 TIM/CTR3 DD70RR EQU 0x63 ; VI53 TIM CTR ; КР580ВВ51 DD72RD EQU 0xA0 ; VV51 DD72RR EQU 0xA1 ; VV51 [RST,RQ_RX,RST_ERR,PAUSE,RX_EN,RX_RDY,TX_RDY] ; КР580ВН59 DD75RS EQU 0x80 ; VN59 DD75RM EQU 0x81 ; VN59 ; КР580ВВ55 Порты A и С, B5-7 - Клавиатура DD78RA EQU 0x40 ; VV55 [Keyboard] DD78RB EQU 0x41 ; [JST3..1,ACK,TAPE5,TAPE4,GK,GC] DD78RC EQU 0x42 ; VV55 [PC7..0] DD78RR EQU 0x43 ; VV55 KBD CTL ; КР580ВВ55 Для внешних устройств пользователя DD79RA EQU 0x00 ; VV55 User PA DD79RB EQU 0x01 ; VV55 User PB DD79RC EQU 0x02 ; VV55 User PC DD79RR EQU 0x03 ; VV55 User CTR ; КР580ВВ55 Для устройств пользователя или FDC DD80RA EQU 0x20 ; VV55 FDC PA DD80RB EQU 0x21 ; VV55 FDC PB DD80RC EQU 0x22 ; VV55 FDC PC DD80RR EQU 0x23 ; VV55 FDC CTR ; Паттерны тестирования памяти PATTERN1 EQU 0x55FF PATTERN2 EQU 0x00FF PATTERN3 EQU 0xFF00 ; Размер блока B32K EQU 0x8000 B48K EQU 0xC000 ; Задержки DELAY1 EQU 0xFFFF ; задержка W_BUSY EQU 0x9C40 ; таймаут ожидания готовности принтера W_BUTN EQU 0xC350 ; таймаут отпускания клавиши S1 ; Переменные для прерывания T_STACK EQU 0x100 ; временный стек для прерывания INT_CALL EQU 0x20 ; код инструкции перехода INT_ADDR EQU 0x21 ; адрес обработчика прерывания ; Флаги статуса ВВ51 TX_RDY EQU 0x01 ; передатчик готов RX_RDY EQU 0x02 ; приемник готов ; TX_EMPTY EQU 0x04 ; буфер передатчика пуст ; TX_PE EQU 0x08 ; Parity error ; TX_OE EQU 0x01 ; Overrun error ; TX_FE EQU 0x02 ; Framing error ; TX_DSR EQU 0x08 ; Биты порта чтения с магнитофона TAPE_4 EQU 0x04 TAPE_5 EQU 0x08 ; Флаги прерывания ВН59 RST_1 EQU 0x02 RST_2 EQU 0x04 RST_3 EQU 0x08 ; Бит порта строба клавиатуры KBD_ACK EQU 0x80 ; Флаг гашения кадра BIT_GK EQU 0x02 ; бит гашения кадра ; ======================================================= ; Код теста в памяти располагается с адреса 0xE000 ; ======================================================= ORG 0xE000 JP TEST1 ; ------------------------------------------------------- ; TEST 1 Программирование портов ВВ55, Таймера ВИ53, ; Последовательного порта ВВ51 ; ------------------------------------------------------- TEST1 DI ; Программирование ВВ55 LD A, 0x80 ; 1000 0000 -> PA mode 0 out, PC out, PB mode 0 out OUT (DD17RR), A ; mem OUT (DD67RR), A ; video OUT (DD80RR), A ; user LD A, 0x93 ; 1001 0011 -> PA mode 0 inp, PB mode 0 inp, PC hi out, PC lo inp OUT (DD78RR), A LD A, 0x47 ; 0100 0111 -> VSU=0, C/M=1, FL=000, COL=111 OUT (DD67RB), A LD A, 0x07 ; 0000 0111 -> H Shift HS=00000, SB=111 OUT (DD17RC), A LD A, 0x04 ; 0000 0100 -> TAPE3 = 1 OUT (DD67RC), A ; Программирование порта ВВ51 LD A, 0xCE ; 1100 1110 -> Mode: 11 - 2S, 00-N, 11-8b, 76.8КГц/16=4800 бод OUT (DD72RR), A LD A, 0x25 ; 0010 0101 -> 0-Norm, 0-No Rst, 1-RTS-=0, 0-No Err, 0-No brk, 1-RxEn, 0-DTR-=1, 1-TxEn OUT (DD72RR), A ; Программирование таймера ВИ53 LD A, 0x76 ; 0111 0110 -> 01-CTR2, 11-LSB+MSB, 011-square wave gen, 0-binary OUT (DD70RR), A LD A, 20 ; 1.536MHz/20=76.8КГц -> /16=4800 бод OUT (DD70C2), A LD A, 0x00 OUT (DD70C2), A ; Программирование rонтроллера прерываний ВН59 LD A, 0x12 ; ICW1 (D4=1) 0001 0010 -> D1=1 - Single mode OUT (DD75RS), A LD A, 0x00 ; ICW2 Interrup vector address = 0000 OUT (DD75RM), A LD A, 0xFF ; OCW1 1111 1111 -> Маскируем все прерывания OUT (DD75RM), A LD A, 0x20 ; OCW2 0010 0000 -> 001 - Non-specific EOI command, 000 - Active IR Level 0 OUT (DD75RS), A LD A, 0x0A ; OCW3 0000 1010 -> D3=1 Pool command, 01-No OP, RIS=0 OUT (DD75RS), A LD SP, TEST1_1 ; возврат на TEST2 LD D, 0x00 ; 0 - passed ok LD E, 0x01 ; номер теста JP MSG TEST1_1 ; инкремент данных на пользовательском порту LD A, D OUT (DD80RA), A OUT (DD80RB), A OUT (DD80RC), A INC D ; проверка нажатия SA1 IN A, (DD72RR) AND RX_RDY JP Z, TEST1_1 XOR A OUT (DD80RA), A OUT (DD80RB), A OUT (DD80RC), A LD SP, TEST2 JP WAIT_BTN ; ------------------------------------------------------- ; Тест 2 Проверка работы устройства отображения ; ------------------------------------------------------- TEST2 ; вкл доступа к видео-ЗУ LD A, 0x01 OUT (DD17RB), A ; вывод шахматки LD C, 0x00 T4C LD A, C AND 0x07 LD B, A LD A, C RRA RRA RRA AND 0x01 ADD A, B LD DE, 0x00 RRA JP NC, T46 LD DE, PATTERN1 OR A JP Z, T46 LD DE, PATTERN2 CP 0x01 JP Z, T46 LD DE, PATTERN3 CP 0x02 JP Z, T46 LD E, 0xff T46 LD A,C AND 0x7 ADD A,A ADD A,A ADD A,A ADD A,A ADD A,A LD L,A LD B,0x20 T4B LD A,C AND 0xf8 ADD A,0x40 LD H,A LD A,0x4 T4A LD (HL),E INC H LD (HL),D INC H DEC A JP NZ,T4A INC L DEC B JP NZ,T4B INC C LD A,C CP 0x40 JP NZ, T4C ; нормальный маппинг ОЗУ/ПЗУ LD A, 0x0 OUT (DD17RB), A LD A, 0x40 ; 0100 000 - Color mode ON OUT (DD67RB),A LD E, 0x0 LD D, 0x0 T57 LD BC, B48K T4E DEC BC LD A,B OR C JP NZ,T4E LD C, 0x80 ; ждем GK - гашение кадра T2_WAIT_GK IN A, (DD78RB) AND BIT_GK JP NZ, T2_WAIT_GK T2_WAIT_N_GK IN A, (DD78RB) AND BIT_GK JP Z, T2_WAIT_N_GK LD A, E RRA JP C, T51 INC D JP T52 T51 DEC D T52 RRA JP C, T53 LD A,D ; горизонтальный битовый сдвиг ADD A, 0x7 OUT (DD17RC), A JP T54 T53 LD A,D ; вертикальный сдвиг OUT (DD17RA), A T54 DEC C JP NZ, T2_WAIT_GK LD BC, B48K T55 DEC BC LD A,B OR C JP NZ, T55 INC E LD A, E CP 0x4 JP P, T56 OR 0x40 ; 0100 000 OUT (DD67RB), A JP T57 T56 ; Доступ к старшим 32К доп. ОЗУ LD A, 0x3 OUT (DD17RB), A LD C, 0x00 ; шахматка в mono режиме T5B LD A, C AND 0x07 LD B, A LD A, C RRA RRA RRA AND 0x01 ADD A, B LD D, 0x00 RRA JP NC, T58 LD D, 0xff T58 LD A, C AND 0x07 ADD A, A ADD A, A ADD A, A ADD A, A ADD A, A LD L, A LD B, 0x20 T5A LD A, C AND 0xF8 ADD A, 0x40 LD H, A LD A, 0x04 T59 LD (HL), D INC H LD (HL), D INC H DEC A JP NZ, T59 INC L DEC B JP NZ, T5A INC C LD A,C CP 0x40 JP NZ, T5B ; Нормальный режим работы памяти LD A, 0x00 OUT (DD17RB),A LD A, 0x80 ; 1000 0000 - VSU=1 Mono OUT (DD67RB), A LD E, 0x00 T5E LD BC, DELAY1 T2_DLY2 DEC BC LD A, B OR C JP NZ, T2_DLY2 LD A, E ADD A, A ADD A, A ADD A, A OR 0x80 OUT (DD67RB), A ; VSU=1 INC E LD A, E CP 0x07 JP C, T5E LD SP, T2_W_S2 LD D, 0x00 ; ok LD E, 0x02 ; test #2 JP MSG T2_W_S2 IN A, (DD72RR) AND RX_RDY JP Z, T2_W_S2 LD SP, TEST3 JP WAIT_BTN ;------------------------------------------------------- ; Тест3 Проверка ШД ОЗУ ; проверка шины данных ОЗУ) выполняет последовательную ; проверку ячеек ОЗУ на соответствие записываемых и ; считываемых 8-разрядных слов (для значений 00H и FFH) ;------------------------------------------------------- TEST3 LD A, 0xC0 ; 1100 0000 VSU=1 Color mode OUT (DD67RB),A LD E, 0x00 T3_TEST_PAGE LD A, E ; выбор режима доступа к озу AND 0x03 OUT (DD17RB), A LD HL, 0x0000 LD BC, B32K ; проверка записи и чтения ячейки ОЗУ T3_TEST_CELL LD (HL), 0x00 LD A, (HL) CP 0x00 JP NZ, T3_TEST_ERR LD (HL), 0xFF LD A, (HL) CP 0xFF JP NZ, T3_TEST_ERR INC HL ; addr++ DEC BC ; counter-- LD A, B OR C JP NZ, T3_TEST_CELL ; переход к следующему банку ОЗУ INC E LD A, E ; если E=4, закончим CP 0x04 JP M, T3_TEST_PAGE ; тест успешен, вывод сообщения LD D, 0x00 LD E, 0x03 LD SP, TEST4 JP MSG ; тест ОЗУ завершен ошибкой T3_TEST_ERR LD A, E AND 0x01 RRA RRA ADD A, H LD H, A LD A, E LD SP, T3_ERR_CONT ; 0-осн. 1-доп ОЗУ AND 0x02 LD D, 0x01 JP Z, T3_EPN3 LD D, 0x05 T3_EPN3 LD E, 0x03 JP MSG T3_ERR_CONT EX DE, HL LD A, H AND 0x7F LD H, A ; запись/чтение в ошибочную ячеку памяти и ожидание кнопки S1 T4_WR_WS1 LD (HL), 0x00 LD A, (HL) LD (HL), 0xFF LD A, (HL) IN A, (DD72RR) AND RX_RDY JP Z, T4_WR_WS1 ; обычный режим памяти LD A, 0x00 OUT (DD17RB), A JP T4_L1 ;------------------------------------------------------- ; Тест 4 Проверка адресов и регенерации ОЗУ ;------------------------------------------------------- TEST4 ; обычный режим памяти LD A, 0x00 OUT (DD17RB), A T4_WS1 IN A, (DD72RR) AND RX_RDY JP Z, T4_WS1 T4_L1 LD SP, T4_L2 JP WAIT_BTN T4_L2 LD E, 0x0 T4_W_PG LD A, E ; выбор страницы ОЗУ AND 0x03 OUT (DD17RB), A LD HL, 0x0000 LD BC, B32K T4_W_FN ; value = (Addr AND 0FFH) + (Addr/8) LD A, E AND 0x01 RRA RRA ADD A, H ADD A, L LD (HL), A INC HL ; addr++ DEC BC ; ctr++ LD A,B OR C JP NZ,T4_W_FN INC E LD A,E CP 0x4 JP M, T4_W_PG ; ожидание 0,5 сек LD BC,DELAY1 T4_WS2 DEC BC LD A, B OR C JP NZ, T4_WS2 ; чтение записанного, после паузы, проверка refresh LD E, 0x00 T4_R_PG LD A, E AND 0x03 ; выбор страниц ОЗУ OUT (DD17RB), A LD HL, 0x0000 LD BC, B32K T4_R_FN LD A, E AND 0x01 RRA RRA ADD A,H ADD A,L ; прочитали то, что писали? CP (HL) JP NZ, T4_R_ERR INC HL ; addr++ DEC BC ; ctr-- LD A,B OR C JP NZ, T4_R_FN INC E LD A,E CP 0x04 JP M,T4_R_PG ; тест завершен, нормальноая адресация ОЗУ LD A, 0x00 OUT (DD17RB),A ; вывод результата теста 4 ok LD D, 0x00 LD E, 0x04 LD SP, TEST5 JP MSG ; вывод ошибки теста 4 T4_R_ERR ; установка флага осн/доп ОЗУ LD A, E AND 0x01 RRA RRA ADD A, H LD H, A LD A, E LD SP, TEST5 AND 0x02 LD D, 0x01 JP Z, T4_EPN3 LD D, 0x05 T4_EPN3 LD E, 0x04 JP MSG ;------------------------------------------------------- ; Тест 5 Запись на кассетный магнитофон тестового ; сигнала ;------------------------------------------------------- TEST5 ; обычный режим памяти LD A, 0x0 OUT (DD17RB), A T5_W_S1 IN A, (DD72RR) AND RX_RDY JP Z, T5_W_S1 LD SP, T5_L1 JP WAIT_BTN T5_L1 LD B, 0x04 T5_L2 LD C, 0x06 LD DE, T5_L5 T5_L3 LD A, (DE) T5_L4 ADD HL, HL ADD HL, HL DEC H NOP NOP DEC A JP NZ, T5_L4 LD A, B XOR 0x02 LD B, A ; вывод данных на ленту OUT (DD67RC), A INC DE DEC C JP NZ, T5_L3 IN A, (DD72RR) AND 0x2 JP Z, T5_L2 LD D, 0x0 LD E, 0x5 LD SP, TEST6 JP MSG T5_L5 DB 0x0F, 0x07, 0x0F, 0x0B, 0x07, 0x44 ;------------------------------------------------------- ; Тест 6 проверка правильности настройки усилителя- ; формирователя (УФ) считывания ;------------------------------------------------------- TEST6 LD SP, T6_L1 JP WAIT_BTN ; ожидание паузы при чтении с ленты T6_L1 IN A, (DD78RB) AND TAPE_4 LD B, A T6_L2 IN A, (DD72RR) AND RX_RDY JP NZ, T6_END IN A, (DD78RB) AND TAPE_4 CP B JP Z, T6_L2 LD B, A T6_INT_NXT LD C, 0x00 T6_L4 INC C IN A, (DD72RR) AND RX_RDY JP NZ, T6_END JP NZ, T6_END ; лишнее IN A, (DD78RB) AND TAPE_4 CP B JP Z, T6_L4 LD B, A LD A, C CP 0x19 JP C, T6_INT_NXT LD C, 0x00 T6_L5 INC C IN A, (DD72RR) AND RX_RDY JP NZ, T6_END JP NZ, T6_END IN A, (DD78RB) AND TAPE_4 CP B JP Z, T6_L5 LD B,A LD A,C CP 0x09 JP C, T6_INT_ERR CP 0x09 JP C, T6_INT_ERR LD C, 0x00 T6_L6 INC C IN A, (DD72RR) AND RX_RDY JP NZ, T6_END JP NZ, T6_END IN A, (DD78RB) AND TAPE_4 CP B JP Z, T6_L6 LD B, A LD A, C CP 0x07 JP NC, T6_INT_ERR CP 0x07 JP NC, T6_INT_ERR LD C, 0x00 T6_L7 INC C IN A, (DD72RR) AND RX_RDY JP NZ, T6_END JP NZ, T6_END IN A, (DD78RB) AND TAPE_4 CP B JP Z, T6_L7 LD B, A LD A, C CP 0x09 JP C, T6_INT_ERR CP 0x09 JP C, T6_INT_ERR LD C, 0x00 T6_L9 INC C IN A, (DD72RR) AND RX_RDY JP NZ, T6_END JP NZ, T6_END IN A, (DD78RB) AND TAPE_4 CP B JP Z, T6_L9 LD B, A LD A, C CP 0x09 JP NC, T6_INT_ERR CP 0x07 JP C, T6_INT_ERR LD C, 0x00 T6_L10 INC C IN A, (DD72RR) AND RX_RDY JP NZ, T6_END JP NZ, T6_END IN A, (DD78RB) AND TAPE_4 CP B JP Z, T6_L10 LD B, A LD A, C CP 0x07 JP NC, T6_INT_ERR LD E, '+' JP T6_W_TX ; вывод '-' при несоответствии интервала T6_INT_ERR LD E, '-' ; ждем готовности передатчика и выводим T6_W_TX IN A, (DD72RR) AND TX_RDY JP Z, T6_W_TX LD A, E OUT (DD72RD), A CP 0x2B JP Z, T6_L12 ; импульс 5мс на РА0 DD80 LD A, 0x01 OUT (DD80RA), A XOR A OUT (DD80RA), A T6_L12 IN A, (DD72RR) AND RX_RDY JP Z, T6_INT_NXT T6_END ; тест 6 ок LD D, 0x00 LD E, 0x06 LD SP, TEST7 JP MSG ;------------------------------------------------------- ; Тест 7 ввод с клавиатуры 7-разрядных кодов символов ; и передача их на терминал ;------------------------------------------------------- TEST7 LD SP, T7_W_STB JP WAIT_BTN ; ждем сигнала запроса прерывания от клавиатуры (STB-) T7_W_STB IN A, (DD75RS) AND RST_1 JP NZ, T7_KBD_RQ IN A, (DD72RR) AND RX_RDY JP Z, T7_W_STB ; Выход из теста по кнопке S1 с сообшением об успехе LD D, 0x0 LD E, 0x7 LD SP, TEST8 JP MSG ; обработка клавиши T7_KBD_RQ ; чтение кода клавиши IN A, (DD78RA) ; код клавиши в порт PA DD80 OUT (DD80RA), A LD B, A LD A, KBD_ACK ; подтверждение чтения клавиатуры сигналом ACK OUT (DD78RC), A ; ожидаем реакции клавиатуры T7_W_STB1 IN A, (DD75RS) AND RST_1 JP NZ, T7_W_STB1 ; убираем сигнал ACK XOR A OUT (DD78RC), A ; ждем готовности передатчика T7_W_TXR IN A, (DD72RR) AND TX_RDY JP Z, T7_W_TXR ; вывод кода клавиши в последовательный порт LD A, B OUT (DD72RD), A JP T7_W_STB ;------------------------------------------------------- ; Тест 8 Проверки контроллера прерываний ; и системного таймера ;------------------------------------------------------- TEST8 LD E, 4 ; ждем 2с T8_W2 LD BC, DELAY1 T8_W05 DEC BC LD A, B OR C JP NZ, T8_W05 DEC E JP NZ, T8_W2 ; программируем таймер LD A, 0x36 ; 0011 0110 -> 00 - канал , 11 - запись слова, 011 - режим 3, 0 - двоичный счет OUT (DD70RR), A ; сброс счетчика XOR A OUT (DD70C1), A OUT (DD70C1), A LD SP, T_STACK LD A, 0xC3 ; CALL xxxx LD (INT_CALL), A LD HL, T9_INT_HNDL LD (INT_ADDR), HL ; программируем контроллер на прерывание от таймера LD A, 0xEF ; 1110 1111 -> вкл RST4 OUT (DD75RM), A LD A,0x20 OUT (DD75RS), A ; пауза на ловлю прерывания LD DE, DELAY1 EI T9_W_IRQ DEC DE LD A, D OR E JP NZ, T9_W_IRQ ; не поймали, ошибка и переход на тест 9 DI LD E, 0x08 LD D, 0x02 LD SP, TEST9 JP MSG T9_INT_HNDL DI ; поймали прерывание без ошибок LD E, 0x08 LD D, 0x00 LD SP,TEST9 JP MSG ;------------------------------------------------------- ; Тест 9 Проверка печати на принтер ;------------------------------------------------------- TEST9 ; ждем кнопку S1 LD SP, T9_W_S1 JP WAIT_BTN T9_W_S1 IN A,(DD72RR) AND RX_RDY JP Z,T9_W_S1 LD SP, T9_L1 JP WAIT_BTN T9_L1 LD C, 0x20 ; ' ' T9_LE_127 LD DE, W_BUSY ; 9C40 ; статус сигнала BUSY от принтера T9_W_BUSY IN A, (DD75RS) AND RST_3 JP NZ, T9_STROBE_ON DEC DE LD A,D OR E JP NZ, T9_W_BUSY ; принтер не освободился JP T9_T_OUT ; выдаем строб T9_STROBE_ON LD A, C OUT (DD67RA), A ; вывод символа LD A, 0x14 ; 0001 0100 STROBE + TAPE3 OUT (DD67RC), A ; ждем реакции принтера LD DE, W_BUSY T9_W_BUSY1 IN A,(DD75RS) AND RST_3 JP Z, T9_STROBE_OFF DEC DE LD A,D OR E JP NZ,T9_W_BUSY1 JP T9_T_OUT ; убираем строб T9_STROBE_OFF LD A, 0x04 ; 0000 0100 OUT (DD67RC), A T9_T_OUT IN A, (DD72RR) AND RX_RDY JP NZ, T9_S1 INC C ; следующий код символа LD A, C CP 127 ; печатные символы с кодом <127 JP C, T9_LE_127 LD C, ' ' JP T9_LE_127 ; выход из теста по клавише S1 T9_S1 LD E, 0x09 LD D, 0x00 LD SP, TEST_END JP MSG ;------------------------------------------------------- ; Окончание тестов ;------------------------------------------------------- TEST_END ; вывод сообщения об окончании в последовательный порт LD HL, MS4 TE_OUT_CHAR ; проверка конца строки LD A, (HL) OR A JP Z, TE_STOP LD B, A ; ждем готовности передатчика TE_W_S1 IN A, (DD72RR) AND TX_RDY JP Z, TE_W_S1 ; передаем байт в последовательный порт LD A, B OUT (DD72RD),A INC HL ; addr++ JP TE_OUT_CHAR TE_STOP JP TE_STOP ;------------------------------------------------------- ; Ожидание отпускания кнопки S1 ;------------------------------------------------------- WAIT_BTN ; очистить буфер приема IN A, (DD72RD) IN A, (DD72RD) ; прочитать статус IN A, (DD72RR) ; пока нажата S1 ждем AND RX_RDY JP NZ, WAIT_BTN LD BC, W_BUTN WB_DELAY DEC BC LD A,B OR C JP NZ,WB_DELAY ; очистить буфер приема IN A, (DD72RD) IN A, (DD72RD) LD HL, 0x0000 ; возврат к точке перехода ADD HL, SP JP (HL) ;------------------------------------------------------- ; Вывод сообщения ; Inp: D - результат теста (0-PASSED, 1-ERROR AT, 2-ERROR) ; E - номер теста ; HL - адрес ;------------------------------------------------------- MSG LD C, E ; число гудков ; ------ beep MSG_RPT0 LD B, 125 MSG_RPT1 LD A, D OR A LD A, 0x3C JP Z, MSG_DLY1 LD A, 120 MSG_DLY1 DEC A JP NZ, MSG_DLY1 LD A, 0x0C ; 0000 1100 [STB,BELL]=00 [TAPE3..2]=11 OUT (DD67RC), A LD A, D OR A LD A, 0x3C ; 0011 1100 [STB,BELL]=11 [TAPE3..2]=11 JP Z, MSG_DLY2 LD A, 120 MSG_DLY2 DEC A JP NZ, MSG_DLY2 LD A, 0x04 ; 0000 0100 [TAPE3]=1 OUT (DD67RC), A DEC B JP NZ, MSG_RPT1 ; пауза после гудка 50*200 раз LD B, 50 MSG_DLY3 LD A, 200 MSG_DLY4 DEC A JP NZ, MSG_DLY4 DEC B JP NZ, MSG_DLY3 DEC C JP NZ, MSG_RPT0 ; вывод строки в последовательный порт LD BC, MSG_TEST MSG_SEND_CHAR LD A, (BC) OR A JP Z, MSG_TEST_END ; ждем готовности ВВ51 MSG_W_TX_EN1 IN A,(DD72RR) AND TX_RDY JP Z,MSG_W_TX_EN1 ; передача символа LD A,(BC) OUT (DD72RD),A INC BC JP MSG_SEND_CHAR ; Ожидание конца передачи MSG_TEST_END IN A, (DD72RR) AND TX_RDY JP Z, MSG_TEST_END ; номер теста в строку и передача LD A, E AND 0x0F ADD A, 0x30 OUT (DD72RD), A ; вывод результата теста LD BC, MSG_PASS LD A, D OR A JP Z, MSG_OUT_RES LD BC, MSG_ERR_AT RRA JP C, MSG_OUT_RES LD BC, MSG_ERR MSG_OUT_RES LD A, (BC) OR A JP Z, MSG_ERR_END ; посимвольная отпр сообщения об ошибке MSG_NXT_ERR IN A,(DD72RR) AND TX_RDY JP Z, MSG_NXT_ERR LD A, (BC) OUT (DD72RD), A INC BC JP MSG_OUT_RES MSG_ERR_END ; отправка нулей в порты пользователя/FDC XOR A OUT (DD80RA),A OUT (DD80RB),A OUT (DD80RC),A LD A, D ; надо выводить адрес? AND 0x01 JP Z, MSG_EXIT LD A, D RRA RRA AND 0x01 ; PC0 <- 0/1 - осн/доп ОЗУ OUT (DD80RC),A ADD A, 0x30 LD B, A MSG_W_TX_EN2 IN A,(DD72RR) AND TX_RDY JP Z,MSG_W_TX_EN2 LD A, B OUT (DD72RD), A LD B, 4 ; addr len 4 bytes ; вывод адреса ошибки на порт пользователя A и B LD A, L OUT (DD80RA),A LD A, H OUT (DD80RB),A LD D, H LD E, L ; вывод адреса в HEX MSG_TO_HEX LD A, H RRA RRA RRA RRA AND 0x0F ADD A, 0x90 DAA ADC A, 0x40 DAA LD C,A ; вывод HEX символа адреса MSG_W_TX_EN3 IN A,(DD72RR) AND 0x1 JP Z, MSG_W_TX_EN3 LD A, C OUT (DD72RD),A LD C, 0x4 MSG_A_SR4 LD A, L RLA LD L, A LD A, H RLA LD H, A DEC C JP NZ, MSG_A_SR4 ; вывод следующего символа адреса, если не закончили DEC B JP NZ, MSG_TO_HEX ; возврат назад к точке указанной в SP MSG_EXIT LD HL, 0x0000 ADD HL, SP JP (HL) ; ------------------------------------------------------- ; Сообщения ; ------------------------------------------------------- MSG_TEST DB "\r\nTEST ", 0 MSG_PASS DB " PASSED", 0 MSG_ERR DB " ERROR!", 0 MSG_ERR_AT DB " ERROR AT ADDR ", 0 MS4 DB "\r\nEND", 0 DB 0x22 ; ------------------------------------------------------- ; Заполнение остатака ПЗУ байтами FF до 2КБ ; ------------------------------------------------------- LAST EQU $ CODE_SIZE EQU LAST-0xE000 FILL_SIZE EQU 2048-CODE_SIZE DISPLAY "Code size is: ",/A,CODE_SIZE FILLER DS 2048-CODE_SIZE, 0xFF DISPLAY "Filler size is: ",/A,FILL_SIZE END