From 069a3ac12c9f323efedadb83846b2cc532591c50 Mon Sep 17 00:00:00 2001 From: boykovra Date: Tue, 19 Aug 2025 23:29:56 +0300 Subject: [PATCH] Source code for TEST ROM --- ...сание ЭВМ \"Океан-240\" из журнала МПСС.odt#" | 1 + ROMs/Sources/Test/.vscode/extensions.json | 9 + ROMs/Sources/Test/.vscode/launch.json | 94 ++ ROMs/Sources/Test/.vscode/tasks.json | 41 + ROMs/Sources/Test/README.md | 4 + ROMs/Sources/Test/test_O240.asm | 1249 +++++++++++++++++ 6 files changed, 1398 insertions(+) create mode 100644 "Docs/.~lock.Описание ЭВМ \"Океан-240\" из журнала МПСС.odt#" create mode 100644 ROMs/Sources/Test/.vscode/extensions.json create mode 100644 ROMs/Sources/Test/.vscode/launch.json create mode 100644 ROMs/Sources/Test/.vscode/tasks.json create mode 100644 ROMs/Sources/Test/README.md create mode 100644 ROMs/Sources/Test/test_O240.asm diff --git "a/Docs/.~lock.Описание ЭВМ \"Океан-240\" из журнала МПСС.odt#" "b/Docs/.~lock.Описание ЭВМ \"Океан-240\" из журнала МПСС.odt#" new file mode 100644 index 0000000..a007edf --- /dev/null +++ "b/Docs/.~lock.Описание ЭВМ \"Океан-240\" из журнала МПСС.odt#" @@ -0,0 +1 @@ +Romych,roma,roma-pc,19.08.2025 16:40,file:///home/roma/.config/libreoffice/4; \ No newline at end of file diff --git a/ROMs/Sources/Test/.vscode/extensions.json b/ROMs/Sources/Test/.vscode/extensions.json new file mode 100644 index 0000000..1fdc4e8 --- /dev/null +++ b/ROMs/Sources/Test/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "maziac.asm-code-lens", + "maziac.dezog", + "maziac.hex-hover-converter", + "maziac.z80-instruction-set", + "maziac.sna-fileviewer" + ] +} diff --git a/ROMs/Sources/Test/.vscode/launch.json b/ROMs/Sources/Test/.vscode/launch.json new file mode 100644 index 0000000..c6e8ff2 --- /dev/null +++ b/ROMs/Sources/Test/.vscode/launch.json @@ -0,0 +1,94 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "dezog", + "request": "launch", + "name": "Internal Simulator", + "remoteType": "zsim", + "zsim": { + "visualMemory": true, + "memoryModel": "CUSTOM", + "customMemory": { + "slots": [ + { + "name": "PAGE0", + "range": ["0x0000","0x3FFF"], + "banks": [{"index": [0, 255]}], + "initialBank": 0 + }, + { + "name": "PAGE1", + "range": ["0x4000","0x7FFF"], + "banks": [{"index": [0, 255]}], + "initialBank": 1 + }, + { + "name": "PAGE2", + "range": ["0x8000","0xBFFF"], + "banks": [{"index": [0, 255]}], + "initialBank": 2 + }, + { + "name": "PAGE3", + "range": ["0xC000","0xFFFF"], + "banks": [{"index": [0, 255]}], + "initialBank": 3 + } + ], + "ioMmu": [ + "if (portAddress == 0x82) {", + " bank = portValue;", + " PAGE0 = bank;", + "}", + "if (portAddress == 0xA2) {", + " bank = portValue;", + " PAGE1 = bank;", + "}", + "if (portAddress == 0xC2) {", + " bank = portValue;", + " PAGE2 = bank;", + "}", + "if (portAddress == 0xE2) {", + " bank = portValue;", + " PAGE3 = bank;", + "}" + ] + }, + "customCode": { + "debug": false, + "jsPath": "sim/ports.js" + //"uiPath": "simulation/ui.html" + }, + //"ulaScreen": true, + //"zxBorderWidth": 20, + //"vsyncInterrupt": true, + //"zxKeyboard": true, + //"zxBeeper": true + }, + "sjasmplus": [ + { + "path": "test_O240.sld" + } + ], + "history": { + "reverseDebugInstructionCount": 1000000, + "spotCount": 10, + "codeCoverageEnabled": true + }, + "startAutomatically": false, + "commandsAfterLaunch": [], + "rootFolder": "${workspaceFolder}", + "topOfStack": "STACK_TOP", + "loadObjs": [ + { + "path": "test_O240.obj", + "start": "0x0000" + } + ], + "execAddress": "0x8100", + "smallValuesMaximum": 513, + "tmpDir": ".tmp" + } + ] +} \ No newline at end of file diff --git a/ROMs/Sources/Test/.vscode/tasks.json b/ROMs/Sources/Test/.vscode/tasks.json new file mode 100644 index 0000000..7741c0c --- /dev/null +++ b/ROMs/Sources/Test/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "make (sjasmplus)", + "type": "shell", + "command": "sjasmplus", + "args": [ + "--sld=test_O240.sld", + "--sym=test_O240.labels", + "--raw=test_O240.obj", + "--fullpath", + "test_O240.asm" + ], + "problemMatcher": { + "owner": "sjasmplus", + "fileLocation": "autoDetect", + "pattern": { + "regexp": "^(.*)\\((\\d+)\\):\\s+(warning|error):\\s+(.*)$", + "file": 1, + "line": 2, + "severity": 3, + "message": 4 + } + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "label": "start mame", + "type": "shell", + "command": "while true; do ./mame spectrum -window -debugger gdbstub -debug -debugger_port 12000 -verbose -resolution 512x384 ; sleep 2 ; done", + "options": { + "cwd": "${config:mame_dir}" + }, + "problemMatcher": [] + } + ] +} \ No newline at end of file diff --git a/ROMs/Sources/Test/README.md b/ROMs/Sources/Test/README.md new file mode 100644 index 0000000..04accc3 --- /dev/null +++ b/ROMs/Sources/Test/README.md @@ -0,0 +1,4 @@ +# Компьютер "Океан-240.2" + +Исходный текст тестового ПЗУ ПК "Океан 240.2" в мнемонике ассемблера Z80 в фомате sjasmplus. + diff --git a/ROMs/Sources/Test/test_O240.asm b/ROMs/Sources/Test/test_O240.asm new file mode 100644 index 0000000..111ac6b --- /dev/null +++ b/ROMs/Sources/Test/test_O240.asm @@ -0,0 +1,1249 @@ +; ======================================================= +; Исходный текст тестового ПЗУ ПК "Океан 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 \ No newline at end of file