Немига 406 ROM disasm: различия между версиями
Nzeemin (обсуждение | вклад) (обновил) |
Nzeemin (обсуждение | вклад) Нет описания правки |
||
(не показаны 2 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
{{Emuverse}} | {{Emuverse}} | ||
Источник: https://github.com/nzeemin/nemigabtl/blob/master/nemiga-406.lst | Источник: https://github.com/nzeemin/nemigabtl/blob/master/docs/nemiga-406.lst | ||
<pre> | <pre> | ||
; Дизассемблированное ПЗУ компьютера НЕМИГА ПК 588 версия 4.06 | ; Дизассемблированное ПЗУ компьютера НЕМИГА ПК 588 версия 4.06 | ||
; | ; | ||
000204: DW | 000004: DW ; Адрес прерывания | ||
000206: DW | 000006: DW ; PSW прерывания | ||
000210: DW | 000010: DW ; Адрес прерывания | ||
000212: DW | 000012: DW ; PSW прерывания | ||
000214: DW | 000014: DW ; Адрес прерывания - прерывание по T-разряду или команда BPT | ||
000216: DW | 000016: DW ; PSW прерывания | ||
000220: DW | 000020: DW ; Адрес прерывания - команда IOT | ||
000022: DW ; PSW прерывания | |||
000024: DW ; Адрес прерывания - питание | |||
000026: DW ; PSW прерывания | |||
000030: DW ; Адрес прерывания - команда EMT | |||
000032: DW ; PSW прерывания | |||
000034: DW ; Адрес прерывания - команда TRAP | |||
000036: DW ; PSW прерывания | |||
000060: DW ; Прерывание клавиатура | |||
000062: DW ; PSW прерывания | |||
000064: DW ; Прерывание дисплей | |||
000066: DW ; PSW прерывания | |||
000100: DW ; Адрес прерывания - таймер | |||
000104: DW ; Адрес подпрограммы обработки сигнала Н4 - от сетевой карты | |||
000110; DW ; Прерывание "мелодия закончилась кодом 040" | |||
000112: DW ; PSW прерывания | |||
000204: DW ; WORK - рабочий регистр | |||
000206: DW ; VFORM - регистр вертикального формата | |||
000210: DW ; BRIGHT - регистр яркости (0..3) | |||
000212: DW ; XNEW - регистр новой X-координаты | |||
000214: DW ; YNEW - регистр новой Y-координаты | |||
000216: DW ; XOLD - регистр старой X-координаты | |||
000220: DW ; YOLD - регистр старой Y-координаты | |||
; ==== Начало ПЗУ - см. PULT.MAC ===================================================== | |||
160000: DW 177570 ; ?? | 160000: DW 177570 ; ?? | ||
160002: DW 160210, 000341 ; Вектор прерывания сигнала/команды HALT | 160002: DW 160210, 000341 ; Вектор прерывания сигнала/команды HALT | ||
160006: DW 161726, 000340 ; Вектор прерывания | 160006: DW 161726, 000340 ; Вектор прерывания - дв.ошибка канала, запуск | ||
160012: DW 161142, 000340 ; Вектор прерывания | 160012: DW 161142, 000340 ; Вектор прерывания - ошибка ввода адреса вектора | ||
160016: JMP @#163466 ; MODE3 - | 160016: JMP @#163466 ; MODE3 - Вызов с запретом системных прерываний | ||
160022: JMP @#163504 ; SYSLIN | 160022: JMP @#163504 ; SYSLIN - Вывод в служебную строку | ||
160026: JMP @#163722 ; TT.OUT | 160026: JMP @#163722 ; TT.OUT - Системный вывод через MODE | ||
160032: JMP @#163726 ; SYSOUT | 160032: JMP @#163726 ; SYSOUT - Системный вывод | ||
160036: JMP @#162274 ; PRINT | 160036: JMP @#162274 ; PRINT - Вывод текста | ||
160042: JMP @#165346 ; DRAW | 160042: JMP @#165346 ; DRAW - Нарисовать линию, сохранив XOLD,YOLD | ||
160046: JMP @#165340 ; QDRAW то же для QUASIC | 160046: JMP @#165340 ; QDRAW то же для QUASIC | ||
160052: JMP @#165342 ; FDRAW то же для FORTRAN | 160052: JMP @#165342 ; FDRAW то же для FORTRAN | ||
160056: JMP @#165376 ; LINE | 160056: JMP @#165376 ; LINE - Нарисовать линию | ||
160062: JMP @#165370 ; QLINE то же для QUASIC | 160062: JMP @#165370 ; QLINE то же для QUASIC | ||
160066: JMP @#165372 ; FLINE то же для FORTRAN | 160066: JMP @#165372 ; FLINE то же для FORTRAN | ||
160072: JMP @#165606 ; POINT | 160072: JMP @#165606 ; POINT - Нарисовать точку | ||
160076: JMP @#165600 ; QPOINT то же для QUASIC | 160076: JMP @#165600 ; QPOINT то же для QUASIC | ||
160102: JMP @#165602 ; FPOINT то же для FORTRAN | 160102: JMP @#165602 ; FPOINT то же для FORTRAN | ||
160106: JMP @#165672 ; RPOINT | 160106: JMP @#165672 ; RPOINT - Читать яркость точки | ||
160112: JMP @#162236 ; QRPOIN то же для QUASIC | 160112: JMP @#162236 ; QRPOIN то же для QUASIC | ||
160116: JMP @#165664 ; FRPOIN то же для FORTRAN | 160116: JMP @#165664 ; FRPOIN то же для FORTRAN | ||
160122: JMP @#162236 ; DUMP | 160122: JMP @#162236 ; DUMP - напечатать восьмеричное число R3 | ||
160126: JMP | 160126: JMP @177754 ; SOUND | ||
; ==== | ; ==== HALT MONITOR | ||
.RESET - Обработка канального сигнала СБРОС | |||
160142: MOV #000357, @#000206 ; 239. -> VFORM | 160142: MOV #000357, @#000206 ; 239. -> VFORM | ||
160150: CLR @#177560 ; Сброс состояния клавиатуры | 160150: CLR @#177560 ; Сброс состояния клавиатуры | ||
160154: MOV #000200, @#177564 ; | 160154: MOV #000200, @#177564 ; Уст. состояние терминала - не готов, запрет прерывания | ||
160162: CLR @#177770 | 160162: CLR @#177770 | ||
160166: BIC #177541, @#177766 ; | 160166: BIC #177541, @#177766 ; Режим дисплея - оставляем только флаги #136 | ||
HOUT: | |||
160174: MOV (SP)+, R0 | 160174: MOV (SP)+, R0 | ||
160176: JMP @#161074 ; Завершаем обработку прерывания HALT | 160176: JMP @#161074 ; .PULT - Завершаем обработку прерывания HALT | ||
; | ; | ||
; Обработка нажатия СТОП | ; Обработка нажатия СТОП и кнопки ОСТ | ||
PULT: ; УПР/СТОП или команда HALT | |||
160202: MOV (SP)+, R0 ; Восстанавливаем R0 | 160202: MOV (SP)+, R0 ; Восстанавливаем R0 | ||
160204: JMP @#161142 ; Переходим к сохранению регистров и пульту | 160204: JMP @#161142 ; Переходим к сохранению регистров и пульту | ||
; | ; | ||
; Обработчик прерывания по сигналу/команде HALT | ; Обработчик прерывания по сигналу/команде HALT | ||
HMON:: ; диспетчер HALT прерываний. | |||
160210: CMP #056364, @#177776 ; Проверка, настроена ли память режима HALT | 160210: CMP #056364, @#177776 ; Проверка, настроена ли память режима HALT | ||
160216: BEQ 160224 ; | 160216: BEQ 160224 ; да, настроена | ||
160220: JMP @#161720 ; | 160220: JMP @#161720 ; нет => DOUBL - перезапуск | ||
O.K.: | |||
160224: MOV R0, -(SP) ; Сохраняем R0 чтобы не испортить | 160224: MOV R0, -(SP) ; Сохраняем R0 чтобы не испортить | ||
160226: BIS #000200, @#177564 ; | 160226: BIS #000200, @#177564 ; ТТ: всегда готов ! | ||
160234: BIT #176000, @#170006 ; Проверка регистра фиксации HALT | 160234: BIT #176000, @#170006 ; Проверка старших 6 бит регистра фиксации HALT | ||
160242: BMI 160142 ; | 160242: BMI 160142 ; была команда RESET | ||
160244: BEQ 160202 ; | 160244: BEQ 160202 ; была команда HALT | ||
160246: BIT #004000, @#170006 ; Сигнал Н4? | 160246: BIT #004000, @#170006 ; Сигнал Н4? - адаптер локальной сети | ||
160254: BEQ 160262 ; | 160254: BEQ 160262 ; нет | ||
160256: CALL | 160256: CALL @000104 ; SH4 - локальная сеть. | ||
160262: BIT #040000, @#170006 ; | .DISP: | ||
160270: BEQ 160302 ; | 160262: BIT #040000, @#170006 ; SH1 - по записи в TTD | ||
160272: MOV | 160270: BEQ 160302 ; нет => переходим | ||
160272: MOV @#177566, R0 ; Регистр данных терминала - символ для вывода на экран | |||
160276: CALL @#163726 ; SYSOUT Вывод символа R0 на экран | 160276: CALL @#163726 ; SYSOUT Вывод символа R0 на экран | ||
160302: BIT #020000, @#170006 ; | .RDKEY: | ||
160310: BEQ 160334 ; | 160302: BIT #020000, @#170006 ; SH2 - по чтению из KBD | ||
160312: MOVB | 160310: BEQ 160334 ; нет => переходим | ||
160316: BEQ | 160312: MOVB @#177767, R0 ; Провека буферной ячейки клавиатуры | ||
160320: CLRB | 160316: BEQ 160326 ; буфер пуст => переходим | ||
160324: BR | 160320: CLRB @#177767 ; Очищаем буфер | ||
160326: BIC | 160324: BR 160526 ; вывод второй части. | ||
160334: MOV @#170006, R0 | EMPTY: | ||
160326: BIC #177677, @#177560 ; сброс бита прерывания клавиатуры. | |||
.KEY:: | |||
160334: MOV @#170006, R0 ; KEY - по нажатию клавиши. | |||
160340: BIT #002000, R0 ; Пришёл байт с клавиатуры? | 160340: BIT #002000, R0 ; Пришёл байт с клавиатуры? | ||
160344: BEQ 160606 ; | 160344: BEQ 160606 ; нет => | ||
160346: BIC #177400, R0 ; | 160346: BIC #177400, R0 ; код КОИ-8 | ||
160352: BEQ 160202 ; | 160352: BEQ 160202 ; код 0 -- УПР/СТОП. | ||
160354: TSTB @#177560 | 160354: TSTB @#177560 ; Состояние клавиатуры - готов к приёму? | ||
160360: BMI 160606 | 160360: BMI 160606 ; нет => | ||
; | ; Нажата клавиша - выдаём звук нажатия клавиши | ||
160362: MOV R1, -(SP) | 160362: MOV R1, -(SP) | ||
160364: MOV R2, -(SP) | 160364: MOV R2, -(SP) | ||
160366: TSTB @#177761 ; Флаг блокировки вызова SOUND | 160366: TSTB @#177761 ; Флаг блокировки вызова SOUND | ||
160372: BNE 160410 ; | 160372: BNE 160410 ; играет мелодия. | ||
160374: CALL @#160126 ; SOUND | 160374: CALL @#160126 ; SOUND | ||
160400: BR 160410 ; | 160400: BR 160410 ; | ||
160402: DW 160404 ; Адрес мелодии | 160402: DW 160404 ; Адрес мелодии нажатия клавиши | ||
160404: DB 011, 214, 001, 000 ; Мелодия | 160404: DB 011, 214, 001, 000 ; Мелодия - звук длиной 1/50 сек | ||
160410: MOV #177766, R1 | ; Обработка нажатой клавиши | ||
160410: MOV #177766, R1 ; Адрес Режим дисплея | |||
160414: MOV #000100, R2 | 160414: MOV #000100, R2 | ||
160420: TSTB (R1) | 160420: TSTB (R1) ; проверяем бит 7 в Режим дисплея | ||
160422: BPL 160522 | 160422: BPL 160522 l бит 7 = 0 ? => переход | ||
160424: BITB #000300, R0 | 160424: BITB #000300, R0 | ||
160430: BEQ 160500 | 160430: BEQ 160500 | ||
Строка 108: | Строка 144: | ||
160456: BISB R2, -(R1) | 160456: BISB R2, -(R1) | ||
160460: BR 160522 | 160460: BR 160522 | ||
160462: BITB R2, (R1)+ | LAT: | ||
160462: BITB R2, (R1)+ ; лат. регистр установлен ? | |||
160464: BEQ 160522 | 160464: BEQ 160522 | ||
160466: MOVB R0, (R1) | 160466: MOVB R0, (R1) ; нет - двойной код: ЛАТ-символ. | ||
160470: MOV #000017, R0 | 160470: MOV #000017, R0 | ||
160474: BICB R2, -(R1) | 160474: BICB R2, -(R1) | ||
160476: BR 160522 | 160476: BR 160522 | ||
160500: CMPB R0, #000040 | 160500: CMPB R0, #000040 ; >= ' ' ? | ||
160504: BHIS 160522 | 160504: BHIS 160522 ; да => | ||
160506: MOVB 161102(R0), @#177767 | 160506: MOVB 161102(R0), @#177767 ; управляющие последовательности. | ||
160514: BEQ 160522 | 160514: BEQ 160522 ; типа: АР2-код. | ||
160516: MOV #000033, R0 | 160516: MOV #000033, R0 ; код ESC | ||
REG2: | |||
160522: MOV (SP)+, R2 | 160522: MOV (SP)+, R2 | ||
160524: MOV (SP)+, R1 | 160524: MOV (SP)+, R1 | ||
160526: MOV R0, @#177562 ; | 160526: MOV R0, @#177562 ; стандартная клавиатура. | ||
160532: MOV (SP)+, R0 | 160532: MOV (SP)+, R0 | ||
160534: BIS #000200, @#177560 ; | 160534: BIS #000200, @#177560 ; Состояние клавиатуры - сброс бита готовности | ||
160542: BIT #000100, @#177560 ; Состояние клавиатуры | 160542: BIT #000100, @#177560 ; Состояние клавиатуры - разрешено прерывание? | ||
160550: BEQ 161074 ; | 160550: BEQ 161074 ; нет => Завершаем обработку прерывания HALT | ||
160552: BISB #000001, @#177766 | 160552: BISB #000001, @#177766 ; Запрещаем прерывание по вектору 000064 | ||
160560: TSTB 000002(SP) | 160560: TSTB 000002(SP) | ||
160564: BMI 161074 | 160564: BMI 161074 ; => Завершаем обработку прерывания HALT | ||
160566: BICB #000001, @#177766 | INT.K: ; эмуляция прерывания от клавиатуры. | ||
160574: MOV @#000062, -(SP) | 160566: BICB #000001, @#177766 ; Разрешаем прерывание по вектору 000064 | ||
160600: MOV @#000060, -(SP) | 160574: MOV @#000062, -(SP) ; Кладём в стек PSW | ||
160604: BR 161074 | 160600: MOV @#000060, -(SP) ; адрес прерывания по вектору 60 | ||
; | 160604: BR 161074 ; HOUT1 - Завершаем обработку прерывания HALT | ||
.CLOCK:: ; SH3 - по системным часам. | |||
160606: MOV (SP)+, R0 ; Восстанавливаем R0 | 160606: MOV (SP)+, R0 ; Восстанавливаем R0 | ||
160610: BIT #010000, @#170006 ; Сигнал Н3? | 160610: BIT #010000, @#170006 ; Сигнал Н3? | ||
160616: BEQ 161074 ; | 160616: BEQ 161074 ; нет => Завершаем обработку прерывания HALT | ||
; Обработка сигнала Н3 | ; Обработка сигнала Н3 | ||
160620: MOV R4, -(SP) ; Сохраняем R4 | 160620: MOV R4, -(SP) ; Сохраняем R4 | ||
Строка 159: | Строка 197: | ||
160706: BR 160750 | 160706: BR 160750 | ||
160710: DW 000000 | 160710: DW 000000 | ||
; Окончание мелодии | ; Окончание мелодии байтом 040 либо 140 | ||
160712: BITB #000100, (R4)+ | 160712: BITB #000100, (R4)+ ; байт 140? | ||
160716: BNE 160734 | 160716: BNE 160734 ; да => переход | ||
160720: MOV (SP)+, R4 | 160720: MOV (SP)+, R4 | ||
160722: MOV @#000112, -(SP) ; Сохраняем в стеке переход | |||
160722: MOV @#000112, -(SP) | 160726: MOV @#000110, -(SP) ; на прерывание по вектору 110 | ||
160726: MOV @#000110, -(SP) | |||
160732: BR 161074 ; к разрешению прерываний и RTI | 160732: BR 161074 ; к разрешению прерываний и RTI | ||
; | ; Окончание мелодии байтом 140 | ||
160734: CLRB (R4) | 160734: CLRB (R4) ; Очистка байта после конца мелодии | ||
160736: BR 160750 | 160736: BR 160750 ; переходим к работе с курсором | ||
; | ; | ||
160740: MOVB (R4)+, @#170030 ; Октава и громкость | 160740: MOVB (R4)+, @#170030 ; Октава и громкость | ||
160744: CALL @#162520 ; Обработка продолжения мелодии | 160744: CALL @#162520 ; Обработка продолжения мелодии | ||
; Мигание курсора | ; Мигание курсора | ||
160750: DECB @#177756 ; Уменьшаем счётчик | 160750: DECB @#177756 ; Уменьшаем счётчик мигания | ||
160754: BPL 161034 ; значение >= 0 ? => переходим | 160754: BPL 161034 ; значение >= 0 ? => переходим | ||
160756: MOVB #000007, @#177756 ; Новое значение счётчика | 160756: MOVB #000007, @#177756 ; Новое значение счётчика | ||
160764: COMB @#177757 | 160764: COMB @#177757 ; Инвертировать состояние курсора при мигании | ||
160770: MOV @#177772, R4 ; Смещение курсора | 160770: MOV @#177772, R4 ; Смещение курсора | ||
160774: BMI 161034 | 160774: BMI 161034 | ||
160776: TSTB @#177771 ; Состояние курсора?? | 160776: TSTB @#177771 ; Состояние курсора?? | ||
161002: BMI 161034 | 161002: BMI 161034 | ||
161004: ADD @#177746, R4 | 161004: ADD @#177746, R4 ; + адрес 25-й строки экрана | ||
161010: BMI 161034 | 161010: BMI 161034 | ||
161012: ROL R4 | 161012: ROL R4 | ||
161014: BMI 161034 | 161014: BMI 161034 | ||
161016: BIS #000001, @#177574 ; Включаем экран в основную память | 161016: BIS #000001, @#177574 ; Включаем экран в основную память | ||
161024: COM (R4) ; Инвертирование восьми пикселей | 161024: COM (R4) ; Инвертирование восьми пикселей - курсор | ||
161026: BIC #000001, @#177574 ; Отключаем экран из основной памяти | 161026: BIC #000001, @#177574 ; Отключаем экран из основной памяти | ||
161034: MOV (SP)+, R4 ; Восстанавливаем R4 | 161034: MOV (SP)+, R4 ; Восстанавливаем R4 | ||
161036: TSTB 000002(SP) | 161036: TSTB 000002(SP) ; приоритет ССП < 4 ? | ||
161042: BMI 161074 ; ?? => Завершаем обработку прерывания HALT | 161042: BMI 161074 ; ?? => Завершаем обработку прерывания HALT | ||
161044: BITB #000001, @#177766 | 161044: BITB #000001, @#177766 ; был запрос от клавиатуры ? | ||
161052: BNE 160566 | 161052: BNE 160566 | ||
161054: BIT #000100, @#177564 ; | 161054: BIT #000100, @#177564 ; прерывание от дисплея нужно ? | ||
161062: BEQ 161074 ; нет => | 161062: BEQ 161074 ; нет => Завершаем обработку прерывания HALT | ||
161064: MOV @#000066, -(SP) | ; Эмуляция прерывания от дисплея | ||
161070: MOV @#000064, -(SP) | 161064: MOV @#000066, -(SP) ; сохраняем PSW | ||
; Завершение обработки прерывания HALT | 161070: MOV @#000064, -(SP) ; и адрес для перехода по вектору 000064 | ||
161074: CLRB @#170006 ; | ; HOUT1: Завершение обработки прерывания HALT | ||
161074: CLRB @#170006 ; Разрешаем системные прерывания | |||
161100: RTI | 161100: RTI | ||
; Таблица байт | ; Таблица байт - маппинг кодов клавиш 000..037 в ESC-коды | ||
161102: DB | ; TCK: таблица перекодировки управяющиx клавиш в режимe VT-52 | ||
161102: DB ... | |||
; Обработка прерывания | |||
161142: MOV (SP)+, @#177736 ; | ; Обработка прерывания по вектору 160012 - Сохранение регистров и переход к пульту | ||
161146: MOV (SP)+, @#177740 ; | .PULT:: | ||
161152: MOV SP, @#177734 ; | 161142: MOV (SP)+, @#177736 ; убрать вектор состояния. | ||
161156: MOV #177734, SP ; | 161146: MOV (SP)+, @#177740 ; из стека. | ||
161152: MOV SP, @#177734 ; установить системный стек. | |||
161156: MOV #177734, SP ; | |||
161162: MOV R5, -(SP) ; -> 177732 | 161162: MOV R5, -(SP) ; -> 177732 | ||
161164: MOV R4, -(SP) ; -> 177730 | 161164: MOV R4, -(SP) ; -> 177730 | ||
Строка 214: | Строка 254: | ||
161170: MOV R2, -(SP) ; -> 177724 | 161170: MOV R2, -(SP) ; -> 177724 | ||
161172: MOV R1, -(SP) ; -> 177722 | 161172: MOV R1, -(SP) ; -> 177722 | ||
161174: MOV R0, -(SP) ; -> 177720 | 161174: MOV R0, -(SP) ; -> 177720 - начало блока регистров | ||
161176: MOV @#000004, -(SP) | 161176: MOV @#000004, -(SP) ; Адрес прерывания | ||
161202: MOV @#000006, -(SP) | 161202: MOV @#000006, -(SP) ; PSW прерывания | ||
161206: MOV @#177766, -(SP) | 161206: MOV @#177766, -(SP) ; Сохраняем Режим дисплея | ||
161212: CLR @#177766 | 161212: CLR @#177766 ; Очищаем Режим дисплея - режим немига. | ||
161216: MOV #000340, @#000006 ; | 161216: MOV #000340, @#000006 ; есть ли локальная сеть ? | ||
161224: MOV #161444, @#000004 ; | 161224: MOV #161444, @#000004 ; | ||
161232: MOV #000060, @#170010 | 161232: MOV #000060, @#170010 ; в сети - режим останов. | ||
161240: BR 161444 ; Переход к пультовому терминалу | 161240: BR 161444 ; ..CSI - Переход к пультовому терминалу | ||
; | ; | ||
; ==== Программа пультового терминала | ; ==== Программа пультового терминала | ||
; | ; | ||
; Просмотр ячеек памяти | ; NEXT: Просмотр ячеек памяти - переход к следующему слову | ||
161242: INC R2 | 161242: INC R2 ; открыть следующую. | ||
161244: INC R2 | 161244: INC R2 | ||
; Команда '/' - просмотр ячеек памяти | ; Команда '/' - просмотр ячеек памяти | ||
161246: CMP R2, @#177744 | ; OPEN: ; открыть ячейку. | ||
161252: BLO 161270 | 161246: CMP R2, @#177744 ; Сравниваем с нижней границей | ||
161252: BLO 161270 ; меньше => переходим | |||
161254: CMP R2, #177600 | 161254: CMP R2, #177600 | ||
161260: BHIS 161546 ; => выводим признак ошибки и в пульт | 161260: BHIS 161546 ; => выводим признак ошибки и в пульт | ||
Строка 251: | Строка 292: | ||
161340: BEQ 161444 ; Да, возвращамся в пульт | 161340: BEQ 161444 ; Да, возвращамся в пульт | ||
161342: CMPB #000136, R0 ; Нажали '^' ? | 161342: CMPB #000136, R0 ; Нажали '^' ? | ||
161346: BNE 161546 ; Нет | 161346: BNE 161546 ; Нет - выводим признак ошибки и в пульт | ||
161350: DEC R2 ; Переходим к предыдущему слову памяти | 161350: DEC R2 ; Переходим к предыдущему слову памяти | ||
161352: DEC R2 | 161352: DEC R2 | ||
Строка 257: | Строка 298: | ||
; | ; | ||
; Команда 'G' - продолжение выполнения программы | ; Команда 'G' - продолжение выполнения программы | ||
161356: MOV (SP)+, @#177766 | GO: ; старт/продолжение программы. | ||
161362: TST R1 | 161356: MOV (SP)+, @#177766 ; Восстанавливаем Режим дисплея | ||
161364: BEQ 161400 | 161362: TST R1 ; Параметр задан? | ||
161364: BEQ 161400 ; нет => восстановление регистров и возврат | |||
161366: CLR @#177740 | 161366: CLR @#177740 | ||
161372: MOV R5, @#177736 | 161372: MOV R5, @#177736 ; Адрес запуска | ||
161376: RESET | 161376: RESET | ||
; Восстановление всех регистров, возврат из прерывания | ; Восстановление всех регистров, возврат из прерывания | ||
EXIT: | |||
161400: MOV (SP)+, @#000006 | 161400: MOV (SP)+, @#000006 | ||
161404: MOV (SP)+, @#000004 | 161404: MOV (SP)+, @#000004 | ||
Строка 278: | Строка 321: | ||
; | ; | ||
; Вывод символа и переход к пульту | ; Вывод символа и переход к пульту | ||
CLEAR: ; очистить экран. | |||
161440: CALL @#163722 ; TT.OUT Вывод символа | 161440: CALL @#163722 ; TT.OUT Вывод символа | ||
; Вывод приглашения пульта и ожидание команды | ; Вывод приглашения пульта и ожидание команды | ||
; ..CSI: ; прием и интерпретация команд. | |||
161444: MOV #162704, R5 ; Строка "Пульт>" | 161444: MOV #162704, R5 ; Строка "Пульт>" | ||
PRIERR: | |||
161450: MOV #177712, SP | 161450: MOV #177712, SP | ||
161454: MOV #000340, @#000006 ; PSW для прерывания | 161454: MOV #000340, @#000006 ; PSW для прерывания | ||
161462: MOV #161546, @#000004 ; Адрес прерывания | 161462: MOV #161546, @#000004 ; Адрес прерывания по вектору 4 | ||
161470: CALL @#162274 | 161470: CALL @#162274 ; PRINT Вывод строки, адрес в R5 | ||
161474: CALL @#162310 | 161474: CALL @#162310 ; Получаем команду с клавиатуры | ||
161500: MOV R5, R2 | 161500: MOV R5, R2 | ||
161502: CMPB #000057, R0 ; Символ '/' - просмотр ячеек памяти | 161502: CMPB #000057, R0 ; Символ '/' - просмотр ячеек памяти | ||
Строка 296: | Строка 342: | ||
161530: BEQ 161676 | 161530: BEQ 161676 | ||
161532: CMPB #000116, R0 ; Символ 'N' - загрузка с сети | 161532: CMPB #000116, R0 ; Символ 'N' - загрузка с сети | ||
161536: BEQ 161726 | 161536: BEQ 161726 ; => начальный пуск | ||
161540: CMPB #000014, R0 ; Нажат УПР + L - очистка экрана | 161540: CMPB #000014, R0 ; Нажат УПР + L - очистка экрана | ||
161544: BEQ 161440 | 161544: BEQ 161440 | ||
; Вывод знака вопроса (ошибка выполнения команды) и возврат в пультовый режим | ; Вывод знака вопроса (ошибка выполнения команды) и возврат в пультовый режим | ||
161546: MOV #162703, R5 | ERROR: ; ошибочная команда. | ||
; также используется как адрес прерывания по вектору 4 | |||
161546: MOV #162703, R5 ; Строка " ?" | |||
161552: BR 161450 | 161552: BR 161450 | ||
; | ; | ||
; Команда 'S' | ; Команда 'S' - вывод на экран регистров процессора | ||
; LOOK: ; просмотр регистров. | |||
161554: MOV #000011, R2 | 161554: MOV #000011, R2 ; 9 регистров | ||
161560: MOV #161606, R5 | 161560: MOV #161606, R5 ; Строка с названиями регистров | ||
161564: CALL @#162274 | 161564: CALL @#162274 ; Вывод строки | ||
161570: MOV #177720, R4 | 161570: MOV #177720, R4 | ||
161574: MOV (R4)+, R3 | 161574: MOV (R4)+, R3 | ||
161576: CALL @#162236 | 161576: CALL @#162236 ; Вывод R3 как 8-ричного числа | ||
161602: SOB R2, 161574 | 161602: SOB R2, 161574 | ||
161604: BR 161444 | 161604: BR 161444 ; Возврат в пульт | ||
161606: DB ... | 161606: DB ... ; Строка с названиями регистров ЦП | ||
;NOTE: Команда 'X' | ;NOTE: Команда 'X' - загрузка с устройства DX - удалена | ||
; | ; | ||
; Команда 'D' | ; Команда 'D' - загрузка с диска MD | ||
161676: CMP R5, # | BOOT: ; загрузка с дисков MD | ||
161702: BHI 161546 ; | 161676: CMP R5, #7 ; Номер устройства больше 7? | ||
161704: CALL @#162726 ; Загрузка данных с дисковода | 161702: BHI 161546 ; да => ERROR | ||
161710: MOV #000200, @#177766 | 161704: CALL @#162726 ; MDBOOT - Загрузка данных с дисковода | ||
161716: CLR PC | 161710: MOV #000200, @#177766 ; Режим дисплея = VT52 | ||
161716: CLR PC ; Запуск полученного блока | |||
; | ; | ||
; ==== Программа холодного старта | 161720: MOV #160000, @#177744 ; Нижняя граница памяти доступной для команд пульта | ||
; | |||
; ==== Программа холодного старта - COLD START & BOOTSTRAP FROM LOCNET | |||
; | ; | ||
; Холодный старт при включении питания | ; Холодный старт при включении питания | ||
DOUBLE:: | |||
LOCNET: | |||
161726: MOV #001000, SP ; Устанавливаем стек | 161726: MOV #001000, SP ; Устанавливаем стек | ||
161732: CLR R0 | 161732: CLR R0 | ||
161734: MOV #056364, -(R0) ; -> (177776) | 161734: MOV #056364, -(R0) ; -> (177776) | ||
161740: MOV #164042, -(R0) ; Адрес стандартной п/п вывода символа -> (177774) | 161740: MOV #164042, -(R0) ; Адрес стандартной п/п вывода символа -> (177774) | ||
161744: CLR @#177574 | 161744: CLR @#177574 ; Отключаем экран из основной памяти | ||
161750: MOV #000007, R1 | 161750: MOV #000007, R1 | ||
161754: CLR -(R0) ; <| | 161754: CLR -(R0) ; <| | ||
161756: SOB R1, 161754 ; / Очищаем 7 слов 177756-177773 | 161756: SOB R1, 161754 ; / Очищаем 7 слов 177756-177773 | ||
161760: MOV #162516, -(R0) ; -> (177754) | 161760: MOV #162516, -(R0) ; -> (177754) | ||
161764: MOV #162002, @#000004 ; Адрес прерывания | 161764: MOV #162002, @#000004 ; Адрес прерывания 4 | ||
161772: CLR @#170024 ; Сброс | 161772: CLR @#170024 ; Сброс длительности | ||
161776: MOV #162426, (R0) ; Адрес SOUND -> (177754) | 161776: MOV #162426, (R0) ; Адрес SOUND -> (177754) | ||
162002: MOV #165036, -(R0) ; Адрес мелодии BELL -> (177752) | 162002: MOV #165036, -(R0) ; Адрес мелодии BELL -> (177752) | ||
162006: MOV (R0), -(R0) ; тот же адрес -> (177750) | 162006: MOV (R0), -(R0) ; тот же адрес -> (177750) | ||
162010: MOV #003100, -(R0) ; #003100 -> (177746) | 162010: MOV #003100, -(R0) ; #003100 -> (177746) | ||
162014: RESET | 162014: RESET ; сброс всех устройств | ||
162016: MOV #000021, R0 ; символ "очистка экрана" | 162016: MOV #000021, R0 ; символ "очистка экрана" | ||
162022: CALL @#163722 ; TT.OUT Вывод символа | 162022: CALL @#163722 ; TT.OUT Вывод символа | ||
162026: MOV #161142, @#000004 ; Адрес прерывания | 162026: MOV #161142, @#000004 ; Адрес прерывания 4 - сохранить регистры и выход в пульт | ||
162034: MOV #000340, @#000006 ; PSW для прерывания | 162034: MOV #000340, @#000006 ; PSW для прерывания | ||
; Попытка загрузки из сети | ; Попытка загрузки из сети | ||
162042: MOV #170010, R4 ; Адрес регистра состояния локальной сети | 162042: MOV #170010, R4 ; Адрес регистра состояния локальной сети | ||
162046: CALL @#163504 ; SYSLIN | 162046: CALL @#163504 ; SYSLIN - Вывод в служебную строку | ||
162052: BR 162056 | 162052: BR 162056 | ||
162056: MOV #000014, (R4) ; Настройка состояния сетевого адаптера | 162056: MOV #000014, (R4) ; Настройка состояния сетевого адаптера | ||
Строка 374: | Строка 426: | ||
162170: CLR -(SP) | 162170: CLR -(SP) | ||
162172: CLR -(SP) | 162172: CLR -(SP) | ||
162174: BIS #000200, @#177766 | 162174: BIS #000200, @#177766 ; Режим дисплея | ||
162202: JMP @#161074 | 162202: JMP @#161074 | ||
; Подпрограмма | ; Подпрограмма - ожидание слова из сети | ||
162206: CLR R1 ; счётчик ожидания | 162206: CLR R1 ; счётчик ожидания | ||
162210: BIT #100040, (R4) | 162210: BIT #100040, (R4) | ||
Строка 384: | Строка 436: | ||
162222: RETURN | 162222: RETURN | ||
162224: SOB R1, 162210 ; продолжаем цикл ожидания | 162224: SOB R1, 162210 ; продолжаем цикл ожидания | ||
162226: MOV #002060, (R4) | ERRLN: | ||
162226: MOV #002060, (R4) ; ошибка в сети, ОСТАНОВ. | |||
162232: JMP @#161546 | 162232: JMP @#161546 | ||
; | ; | ||
; ==== Программы вывода на экран чисел и строк | ; ==== Программы вывода на экран чисел и строк | ||
; | ; | ||
; Подпрограмма DUMP Вывод слова как 8-ричного числа; R3 = число | ; Подпрограмма DUMP Вывод слова как 8-ричного числа; R3 = число | ||
DUMP:: | |||
162236: MOV #000006, R1 ; Шесть разрядов | 162236: MOV #000006, R1 ; Шесть разрядов | ||
DUMP1:: | |||
162242: CLR R0 | 162242: CLR R0 | ||
162244: ROL R3 | 162244: ROL R3 | ||
Строка 402: | Строка 457: | ||
162270: ROL R0 | 162270: ROL R0 | ||
162272: SOB R1, 162244 | 162272: SOB R1, 162244 | ||
; Подпрограмма PRINT | ; Подпрограмма PRINT - Вывод строки на экран; R5 = адрес строки | ||
PRINT:: | |||
162274: MOVB (R5)+, R0 ; Очередной символ | 162274: MOVB (R5)+, R0 ; Очередной символ | ||
162276: BNE 162302 ; Не ноль? | 162276: BNE 162302 ; Не ноль? => продолжаем | ||
162300: RETURN ; Конец строки, выходим | 162300: RETURN ; Конец строки, выходим | ||
162302: CALL @#163722 ; TT.OUT Вывод символа | 162302: CALL @#163722 ; TT.OUT Вывод символа | ||
Строка 410: | Строка 466: | ||
; | ; | ||
; Ввод команды; команда это символ либо 8-ричное число (параметр) и символ | ; Ввод команды; команда это символ либо 8-ричное число (параметр) и символ | ||
162310: CLR R1 | GET: ; ввод строки. | ||
162312: CLR R5 | 162310: CLR R1 ; R0 - последний введенный код. | ||
162314: TSTB @#177560 | 162312: CLR R5 ; R1 - число введенных цифр. | ||
162314: TSTB @#177560 ; R5 - введенное значение, OCT | |||
162320: BPL 162314 | 162320: BPL 162314 | ||
162322: MOVB @#177562, R3 ; Считываем символ | 162322: MOVB @#177562, R3 ; Считываем символ | ||
162326: CMPB R3, #000177 | 162326: CMPB R3, #000177 ; забой ? | ||
162332: BNE 162362 | 162332: BNE 162362 | ||
162334: DEC R1 | 162334: DEC R1 | ||
Строка 429: | Строка 486: | ||
162372: CALL @#163722 ; TT.OUT Вывод символа | 162372: CALL @#163722 ; TT.OUT Вывод символа | ||
162376: BIC #177407, R3 | 162376: BIC #177407, R3 | ||
162402: CMP #000060, R3 | 162402: CMP #000060, R3 ; символ '0' ? | ||
162406: BNE 162300 | 162406: BNE 162300 | ||
162410: BIC #177770, R0 | 162410: BIC #177770, R0 | ||
Строка 438: | Строка 495: | ||
; | ; | ||
; Подпрограмма SOUND | ; Подпрограмма SOUND | ||
SOUND:: ; музыка. | |||
162426: MOV R4, -(SP) ; Сохраняем R4 | 162426: MOV R4, -(SP) ; Сохраняем R4 | ||
162430: BICB #000200, @#177761 | 162430: BICB #000200, @#177761 | ||
162436: CLR @#170024 ; Сброс | 162436: CLR @#170024 ; Сброс длительности | ||
162442: MOV 000002(SP), R4 ; Откуда вызвали SOUND | 162442: MOV 000002(SP), R4 ; Откуда вызвали SOUND | ||
162446: MOV 000002(R4), R4 ; Получаем адрес мелодии | 162446: MOV 000002(R4), R4 ; Получаем адрес мелодии | ||
Строка 457: | Строка 515: | ||
162520: MOV R3, -(SP) ; Сохраняем R3 | 162520: MOV R3, -(SP) ; Сохраняем R3 | ||
162522: MOVB (R4)+, R3 | 162522: MOVB (R4)+, R3 | ||
162524: BIC #177760, R3 ; Оставляем нижние 4 бита | 162524: BIC #177760, R3 ; Оставляем нижние 4 бита - 00..17 | ||
162530: ASL R3 ; и умножаем на 2 | 162530: ASL R3 ; и умножаем на 2 | ||
162532: MOV 162564(R3), @#170022 ; Выбираем по R3 слово и пишем в | 162532: MOV 162564(R3), @#170022 ; Выбираем по R3 слово и пишем в регистр частоты | ||
162540: MOVB (R4)+, @#170024 ; Задаём длительность | 162540: MOVB (R4)+, @#170024 ; Задаём длительность звука | ||
162544: CLRB @#177760 ; Очищаем счётчик длительности ноты | 162544: CLRB @#177760 ; Очищаем счётчик длительности ноты | ||
162550: MOV R4, @#177752 ; Запоминаем адрес продолжения мелодии | 162550: MOV R4, @#177752 ; Запоминаем адрес продолжения мелодии | ||
162554: TST @#170026 ; | 162554: TST @#170026 ; Включение звука | ||
162560: MOV (SP)+, R3 ; Восстанавливаем R3 | 162560: MOV (SP)+, R3 ; Восстанавливаем R3 | ||
162562: RETURN | 162562: RETURN | ||
; Значения задержки первого таймера для нот | ; Значения задержки первого таймера для нот | ||
NOTY: | |||
162564: DW 000000, 002253, 002150, 002050, 001755, 001664, 001577, 001515 | 162564: DW 000000, 002253, 002150, 002050, 001755, 001664, 001577, 001515 | ||
162604: DW 001435, 001361, 001306, 001237, 001171, 000000, 000000, 000000 | 162604: DW 001435, 001361, 001306, 001237, 001171, 000000, 000000, 000000 | ||
; Строковые буферы | |||
HELLO:: .BYTE 4,6,5 | |||
AUTOR: .RUS <mrti> | |||
.BYTE 11,11,11 | |||
NAME: .RUS <kw> | |||
.BYTE 5 | |||
.RUS < nemiga> | |||
VERS: .BYTE 5 | |||
.ASCII / 4.07/ | |||
.BYTE 6,11 | |||
H.END:: .BYTE 40,0 | |||
RMP:: .RUS <rmp > | |||
.BYTE 0 | |||
RMU:: .RUS <rmu > | |||
.BYTE 0 | |||
LOCBO: .BYTE 14 | |||
.RUS <VDITE...> | |||
.BYTE 0 | |||
ERR: .ASCII /?/ | |||
PROMPT: .BYTE 6,15,12 | |||
.RUS <pULXT> | |||
.ASCIZ />/ | |||
MODI: .BYTE 12,15,,':,40,,40,0 | |||
; | ; | ||
; ==== Подпрограммы работы с дисководом MD | ; ==== Подпрограммы работы с дисководом MD - см. BOOT.MAC ============================ | ||
; | ; | ||
; Чтение с дисковода для загрузки; R5 = номер устройства | ; Чтение с дисковода для загрузки; R5 = номер устройства | ||
MDBOOT:: | |||
162726: CALL @#163466 ; MODE3 | 162726: CALL @#163466 ; MODE3 | ||
162732: MOV #000001, R4 | 162732: MOV #000001, R4 | ||
162736: MOV R5, -(SP) | 162736: MOV R5, -(SP) ; логический No устройства. | ||
162740: ASR R5 | 162740: ASR R5 | ||
162742: BHIS 162750 | 162742: BHIS 162750 | ||
162750: MOV R5, @#004002 | 162750: MOV R5, @#004002 ; -> B$PDN Физический номер устройства. | ||
162754: MOV #000400, -(SP) | 162754: MOV #000400, -(SP) ; один блок по адресу 0 с 1-го сектора | ||
162760: CLR -(SP) | 162760: CLR -(SP) | ||
162762: MOV R4, -(SP) | 162762: MOV R4, -(SP) | ||
Строка 500: | Строка 586: | ||
163044: HALT | 163044: HALT | ||
; Мы на 0-й дорожке, читаем первый сектор | ; Мы на 0-й дорожке, читаем первый сектор | ||
163046: MOVB R4, R0 | ERR1:: | ||
163050: MOV #004004, R3 | 163046: MOVB R4, R0 ; чтение описателя | ||
163050: MOV #004004, R3 ; B$Area | |||
163054: CALL @#163316 | 163054: CALL @#163316 | ||
163060: CLR @#004000 | 163060: CLR @#004000 ; B$Trck | ||
163064: MOV @#004000, R0 | 163064: MOV @#004000, R0 ; B$Trck | ||
163070: MOVB 004016(R0), R0 | 163070: MOVB 004016(R0), R0 ; дорожка в буфер. | ||
163074: MOV #004140, R3 | 163074: MOV #004140, R3 | ||
163100: CALL @#163316 | 163100: CALL @#163316 | ||
Строка 518: | Строка 605: | ||
163130: SOB R4, 163116 | 163130: SOB R4, 163116 | ||
163132: HALT | 163132: HALT | ||
ERR2:: | |||
163134: MOV (SP), R3 | 163134: MOV (SP), R3 ; абсолютный No сектора. | ||
163136: SUB R0, R3 | 163136: SUB R0, R3 ; относительный No сектора на дорожке. | ||
163140: SUB #000120, R4 | 163140: SUB #000120, R4 ; (-No) нужной дорожки. | ||
163144: ADD @#004000, R4 | 163144: ADD @#004000, R4 | ||
163150: BEQ 163204 | 163150: BEQ 163204 | ||
Строка 554: | Строка 641: | ||
; | ; | ||
; Подготовка и запуск операции; R0 = операция | ; Подготовка и запуск операции; R0 = операция | ||
.SCOM: | |||
163256: MOV #177106, R5 | 163256: MOV #177106, R5 | ||
163262: MOV #000006, R2 | 163262: MOV #000006, R2 | ||
Строка 566: | Строка 654: | ||
163314: RETURN | 163314: RETURN | ||
; | ; | ||
; Чтение секторов; R0 = кол-во секторов, R3 = адрес куда читать | ; Чтение секторов; R0 = кол-во секторов, R3 = адрес буфера куда читать | ||
.RDTR: | |||
163316: MOV R3, R1 | 163316: MOV R3, R1 | ||
163320: MOV R0, -(SP) | 163320: MOV R0, -(SP) | ||
Строка 609: | Строка 698: | ||
163462: TST (SP)+ | 163462: TST (SP)+ | ||
163464: RETURN | 163464: RETURN | ||
; | |||
; | ; ==== Эмуляция дисплея - см. TTIO.MAC =============================================== | ||
; MODE3 - Переключение моды HALT-монитора. | |||
163466: MOVB #000003, @#170006 ; Запрещение прерываний | 163466: MOVB #000003, @#170006 ; Запрещение прерываний | ||
163474: CALL @(SP)+ | 163474: CALL @(SP)+ | ||
Строка 616: | Строка 707: | ||
163502: RETURN | 163502: RETURN | ||
; | ; | ||
; | ; SYSLIN - Вывод служебной строки. | ||
163504: CALL @#163466 ; MODE3 | 163504: CALL @#163466 ; MODE3 | ||
163510: MOV R0, -(SP) | 163510: MOV R0, -(SP) | ||
163512: MOV R1, -(SP) | 163512: MOV R1, -(SP) | ||
163514: MOV #177772, R0 | 163514: MOV #177772, R0 ; POSITN | ||
163520: MOV (R0), -(SP) | 163520: MOV (R0), -(SP) ; сохранить позицию, | ||
163522: MOV -(R0), -(SP) | 163522: MOV -(R0), -(SP) ; AR2,RGMOUT | ||
163524: MOV 000012(SP), R1 | 163524: MOV 000012(SP), R1 ; параметр. | ||
163530: CMP (R0)+, (R1)+ | 163530: CMP (R0)+, (R1)+ ; R0=@POSITN | ||
163532: MOV (R1), R1 | 163532: MOV (R1), R1 ; R1=@STRING | ||
163534: MOVB (R1)+, (R0)+ | 163534: MOVB (R1)+, (R0)+ ; POSITN+1 | ||
163536: CLRB (R0)+ | 163536: CLRB (R0)+ ; POS+2 | ||
163540: ADD #176000, -(R0) | 163540: ADD #176000, -(R0) ; POS | ||
163544: CLR -(R0) | 163544: CLR -(R0) ; AR2,RGMOUT=0 | ||
163546: BIS #000010, -(R0) | 163546: BIS #000010, -(R0) ; RGMIOT - вывод сл.строки. | ||
163552: CMP @#177772, #176060 | 163552: CMP @#177772, #176060 ; CMP POSITN,#BEG.SL+LENGHT | ||
163560: BGE 163574 | 163560: BGE 163574 ; выход за пределы. | ||
163562: MOVB (R1)+, R0 ; Получаем следующий символ | 163562: MOVB (R1)+, R0 ; Получаем следующий символ | ||
163564: BEQ 163700 | 163564: BEQ 163700 ; конец строки. | ||
163566: CALL @#163726 ; SYSOUT Вывод символа на экран | 163566: CALL @#163726 ; SYSOUT Вывод символа на экран | ||
163572: BR 163552 | 163572: BR 163552 | ||
Строка 656: | Строка 747: | ||
163660: TST R3 | 163660: TST R3 | ||
163662: BEQ 163700 | 163662: BEQ 163700 | ||
163700: MOV #177766, R0 | 163700: MOV #177766, R0 ; Адрес Режим дисплея | ||
163704: BIC #000010, (R0)+ | 163704: BIC #000010, (R0)+ | ||
163710: MOV (SP)+, (R0)+ | 163710: MOV (SP)+, (R0)+ | ||
Строка 664: | Строка 755: | ||
163720: RETURN | 163720: RETURN | ||
; | ; | ||
; | ; Программа вывода символов на экран | ||
; TT.OUT Вывод символа на экран с переключением моды; мл.байт R0 = символ | |||
; TT.OUT Вывод символа на экран; мл.байт R0 = символ | |||
163722: CALL @#163466 ; MODE3 | 163722: CALL @#163466 ; MODE3 | ||
; SYSOUT | ; SYSOUT - Системный вывод - вывод символа R0 на экран | ||
163726: MOV SP, @#177642 | 163726: MOV SP, @#177642 | ||
163732: MOV #177642, SP | 163732: MOV #177642, SP | ||
163736: BIS #000001, @#177574 ; Включаем экран в основную память | 163736: BIS #000001, @#177574 ; Включаем экран в основную память | ||
163744: CALL @177774 | 163744: CALL @177774 ; Вызов процедуры вывода символа | ||
163750: BIC #000001, @#177574 ; Отключаем экран от основной памяти | 163750: BIC #000001, @#177574 ; Отключаем экран от основной памяти | ||
163756: MOV (SP), SP | 163756: MOV (SP), SP | ||
163760: RETURN | 163760: RETURN | ||
; | ; SETCRS - Прямая адресация курсора. | ||
163762: MOV #177772, R4 | 163762: MOV #177772, R4 | ||
163766: SUB #000040, R5 | 163766: SUB #000040, R5 | ||
Строка 683: | Строка 773: | ||
163776: DECB @#177770 | 163776: DECB @#177770 | ||
164002: BEQ 164026 | 164002: BEQ 164026 | ||
164004: CMP R5, #000027 | 164004: CMP R5, #000027 ; 23. = макс. номер строки. | ||
164010: BHI 164360 | 164010: BHI 164360 | ||
164012: MUL R5, #001200 | 164012: MUL R5, #001200 ; вычислить отн.адрес. | ||
164016: BIC #177700, (R4) | 164016: BIC #177700, (R4) | ||
164022: BIS R5, (R4) | 164022: BIS R5, (R4) | ||
164024: BR 164360 | 164024: BR 164360 | ||
164026: CMP R5, #000077 | 164026: CMP R5, #000077 ; макс. номер позиции. | ||
164032: BHI 164360 | 164032: BHI 164360 | ||
164034: BIC #000077, (R4) | 164034: BIC #000077, (R4) | ||
164040: BR 164022 | 164040: BR 164022 | ||
; | ; Стандартная п/п вывода символа, ставится по умолчанию в 177774 SYMGEN | ||
; MODOUT - Вывод символов режиме переключения памяти. | |||
164042: MOV R0, -(SP) | 164042: MOV R0, -(SP) | ||
164044: MOV R1, -(SP) | 164044: MOV R1, -(SP) | ||
Строка 700: | Строка 791: | ||
164052: MOV R4, -(SP) | 164052: MOV R4, -(SP) | ||
164054: MOV R5, -(SP) | 164054: MOV R5, -(SP) | ||
164056: CALL @#165206 ; Убрать курсор если он виден | 164056: CALL @#165206 ; CURSOR: Убрать курсор если он виден | ||
164062: MOV 000012(SP), R5 | 164062: MOV 000012(SP), R5 | ||
164066: BIC #177400, R5 | 164066: BIC #177400, R5 | ||
164072: MOV #000100, R1 | 164072: MOV #000100, R1 | ||
164076: MOV #177770, R2 ; Адрес SIZE | 164076: MOV #177770, R2 ; Адрес SIZE | ||
164102: TSTB (R2) | 164102: TSTB (R2) ; авторегистр ? | ||
164104: BPL 164136 | 164104: BPL 164136 | ||
164106: CLRB (R2) | 164106: CLRB (R2) | ||
164110: CMP R5, #000131 | 164110: CMP R5, #000131 ; коды командных последова- | ||
164114: BEQ 164354 | 164114: BEQ 164354 ; тельностей VT-52 | ||
164116: CMP R5, #000113 | 164116: CMP R5, #000113 | ||
164122: BHI 164360 | 164122: BHI 164360 | ||
Строка 716: | Строка 807: | ||
164130: MOVB 165310(R5), R4 | 164130: MOVB 165310(R5), R4 | ||
164134: BR 164340 | 164134: BR 164340 | ||
164136: BNE 163762 | 164136: BNE 163762 ; АР2>0 --> прям.адр.курсора. | ||
164140: MOVB @#177766, R4 | 164140: MOVB @#177766, R4 ; Режим дисплея VT52 или Немига ? | ||
164144: BPL 164176 | 164144: BPL 164176 ; Немига. | ||
164146: CLR @#177762 | 164146: CLR @#177762 | ||
164152: CLR @#177764 | 164152: CLR @#177764 | ||
164156: ROLB R5 | 164156: ROLB R5 | ||
164160: CLC | 164160: CLC | ||
164162: BPL 164174 | 164162: BPL 164174 ; не буква. | ||
164164: BITB #000040, R4 | 164164: BITB #000040, R4 | ||
164170: BEQ 164174 | 164170: BEQ 164174 ; латинский регистр. | ||
164172: SEC | 164172: SEC ; русская. | ||
164174: RORB R5 | 164174: RORB R5 | ||
164176: CMP R5, #000040 | 164176: CMP R5, #000040 | ||
164202: BLO 164302 | 164202: BLO 164302 ; не отображаемый символ. | ||
VISI: | |||
164204: ROLB R5 | 164204: ROLB R5 | ||
164206: BPL 164212 | 164206: BPL 164212 | ||
Строка 736: | Строка 828: | ||
164214: BIS R1, R5 | 164214: BIS R1, R5 | ||
164216: ASR R5 | 164216: ASR R5 | ||
164220: ADD #002000, R3 ; | 164220: ADD #002000, R3 ; абсол. адрес позиции. | ||
164224: ASL R3 | 164224: ASL R3 | ||
164226: SUB #000040, R5 | 164226: SUB #000040, R5 | ||
164232: MUL R5, #000012 | 164232: MUL R5, #000012 | ||
164236: ADD #166064, R5 ; | 164236: ADD #166064, R5 ; адрес матрицы в знакогенераторе. | ||
164242: MOV #000012, R4 | 164242: MOV #000012, R4 ; 10. кол-во линий. | ||
164246: ASL R1 | 164246: ASL R1 | ||
164250: MOVB (R5), R2 | LOOP: | ||
164250: MOVB (R5), R2 ; линия матрицы символа. | |||
164252: SWAB R2 | 164252: SWAB R2 | ||
164254: CLRB R2 | 164254: CLRB R2 | ||
164256: BISB (R5)+, R2 | 164256: BISB (R5)+, R2 ; в обоих байтах: 3/3 яркости. | ||
164260: BIC @#177764, R2 | 164260: BIC @#177764, R2 ; код яркости. | ||
164264: MOV @#177762, R0 | 164264: MOV @#177762, R0 ; инверсия. | ||
164270: XOR R0, R2 | 164270: XOR R0, R2 | ||
164272: MOV R2, (R3) | 164272: MOV R2, (R3) | ||
164274: ADD R1, R3 | 164274: ADD R1, R3 | ||
164276: SOB R4, 164250 | 164276: SOB R4, 164250 | ||
164300: BR 164470 | 164300: BR 164470 ; STEP смещение курсора. | ||
; | ; Отработка управляющих кодов - символов с кодом меньше #040 | ||
164302: MOV #165324, R2 | 164302: MOV #165324, R2 ; T.SYLN - таблица разрешенных кодов. | ||
164306: BITB #000010, R4 | 164306: BITB #000010, R4 ; R4 = RGMIOT | ||
164312: BNE 164324 | 164312: BNE 164324 ; " SYSLIN " | ||
164314: CMP (R2)+, (R2)+ | 164314: CMP (R2)+, (R2)+ ; "VT-52" | ||
164316: TSTB R4 | 164316: TSTB R4 | ||
164320: BMI 164324 | 164320: BMI 164324 | ||
164322: CMP (R2)+, (R2)+ | 164322: CMP (R2)+, (R2)+ ; "NEMIGA" | ||
164324: MOV (R2)+, R0 | 164324: MOV (R2)+, R0 ; ст.слово. | ||
164326: MOV (R2), R1 | 164326: MOV (R2), R1 ; мл.слово. | ||
164330: ASHC R0, R5 | 164330: ASHC R0, R5 ; сдвинуть до нужного бита. | ||
164332: BPL 164600 | 164332: BPL 164600 ; .OUTT функция разрешена. | ||
164334: MOVB 165250(R5), R4 | 164334: MOVB 165250(R5), R4 | ||
164340: BIC #177400, R4 ; | 164340: BIC #177400, R4 ; переход на отработку функции. | ||
164344: ASL R4 | 164344: ASL R4 | ||
164346: MOV #177770, R2 | 164346: MOV #177770, R2 | ||
164352: ADD R4, PC | 164352: ADD R4, PC | ||
; | ; ..PC.. ;** ключ прямой адрес.курсора. | ||
164354: MOVB # | 164354: MOVB #2, (R2) | ||
164360: BR 164600 | 164360: BR 164600 ; .OUTT | ||
; CL.SL: ;** очистка служ. строки. | |||
164362: CLR R5 | 164362: CLR R5 | ||
164364: MOV #002000, R3 | 164364: MOV #002000, R3 | ||
Строка 779: | Строка 873: | ||
164372: SOB R3, 164370 | 164372: SOB R3, 164370 | ||
164374: BR 164600 | 164374: BR 164600 | ||
; VT52: ;** переход в режим VT-52 | |||
164376: BIC #000400, (R2) | 164376: BIC #000400, (R2) | ||
164402: BIS #000200, -(R2) | 164402: BIS #000200, -(R2) | ||
164406: BR 164600 | 164406: BR 164600 | ||
; | ; ..AR2:: ;** авторегистр. | ||
164410: BIT #000200, 177776(R2) | 164410: BIT #000200, 177776(R2) | ||
164416: BNE 164432 | 164416: BNE 164432 | ||
; CLRRS: ; ВКЛ/ВЫКЛ звука. | |||
164420: MOV #040000, R5 | 164420: MOV #040000, R5 | ||
164424: XOR R5, @#177760 | 164424: XOR R5, @#177760 | ||
164430: BR 164600 | 164430: BR 164600 | ||
; NOCLR: DECB @R2 ; -1 - ключ авторегистра. | |||
164432: DECB (R2) | 164432: DECB (R2) | ||
164434: BR 164600 | 164434: BR 164600 | ||
; | ; RRGM: ;** сброс режимов вывода. | ||
164436: CLR (R2) | 164436: CLR (R2) | ||
164440: TST -(R2) | 164440: TST -(R2) | ||
164442: CLR -(R2) | 164442: CLR -(R2) ; M.BIC = 0 | ||
164444: CLR -(R2) | 164444: CLR -(R2) ; M.XOR = 0 | ||
164446: BR 164600 | 164446: BR 164600 | ||
; | ; SRGM: ;** установка режима вывода. | ||
164450: COMB 177760(R5) | 164450: COMB 177760(R5) | ||
164454: BR 164600 | 164454: BR 164600 | ||
; | ; IC: ;** ВКЛ/ВЫКЛ курсора. | ||
164456: MOV #000200, R5 | 164456: MOV #000200, R5 | ||
; ROLLON: ;** ВКЛ/ВЫКЛ ролика. | |||
164462: SWAB R5 | 164462: SWAB R5 | ||
164464: XOR R5, (R2) | 164464: XOR R5, (R2) | ||
164466: BR 164600 | 164466: BR 164600 | ||
; | ; STEP: ;** шаг вправо. | ||
164470: MOV #177772, R2 ; Текущая позиция курсора | 164470: MOV #177772, R2 ; Текущая позиция курсора | ||
164474: INC (R2) ; Следующая позиция | 164474: INC (R2) ; Следующая позиция | ||
164476: MOV (R2), R3 | 164476: MOV (R2), R3 ; R3=POSITN | ||
164500: MOV R3, R4 | 164500: MOV R3, R4 | ||
164502: BIC #177700, R4 ; Позиция в пределах строки | 164502: BIC #177700, R4 ; Позиция в пределах строки | ||
164506: BNE 164600 | 164506: BNE 164600 | ||
; | ; LF: ;** LINE FEED - перевод строки. | ||
164516: ADD #001200, R3 | 164516: ADD #001200, R3 | ||
164522: CMP R3, #034700 | 164522: CMP R3, #034700 ; конец строки ? | ||
164526: BLO 164606 | 164526: BLO 164606 | ||
164600: BR 165116 | 164600: BR 165116 | ||
164602: BIC #000077, R3 | ; ??? | ||
164602: BIC #000077, R3 ; на первую позицию. | |||
164606: MOV R3, @#177772 | 164606: MOV R3, @#177772 | ||
164612: BR 165116 | 164612: BR 165116 | ||
; HT: ;** горизонтальная табуляция. | |||
164614: MOV R3, R4 | 164614: MOV R3, R4 | ||
164616: BIC #177700, R4 | 164616: BIC #177700, R4 | ||
164622: CMP R4, #000077 | 164622: CMP R4, #000077 ; табуляция невозможна. | ||
164626: BHIS 165116 | 164626: BHIS 165116 | ||
164630: ADD #000010, R3 | 164630: ADD #000010, R3 | ||
164634: BIC #000007, R3 | 164634: BIC #000007, R3 | ||
164640: BR 164606 | 164640: BR 164606 | ||
; R.RUS ; ** русский регистр. | |||
164642: BIS #000040, -(R2) | 164642: BIS #000040, -(R2) | ||
164646: BR 165116 | 164646: BR 165116 | ||
; R.LAT ; ** латинский регистр. | |||
164650: BIC #000040, -(R2) | 164650: BIC #000040, -(R2) | ||
164654: BR 165116 | 164654: BR 165116 | ||
; NEMIGA ; ** переход в режим "Немига". | |||
164656: BIC #177600, -(R2) | 164656: BIC #177600, -(R2) | ||
164662: BR 165116 | 164662: BR 165116 | ||
Строка 855: | Строка 958: | ||
164756: SUB #001200, R3 | 164756: SUB #001200, R3 | ||
164762: BPL 164714 | 164762: BPL 164714 | ||
164764: MOV #100000, R5 | ; Скроллинг экрана | ||
164770: MOV #075400, R3 | 164764: MOV #100000, R5 ; Адрес куда копировать | ||
164774: MOV #034600, R2 | 164770: MOV #075400, R3 ; Адрес откуда копировать | ||
165000: MOV -(R3), -(R5) | 164774: MOV #034600, R2 ; Сколько слов копировать | ||
165002: SOB R2, 165000 | 165000: MOV -(R3), -(R5) ; копируем слово | ||
165004: MOV #001200, R2 | 165002: SOB R2, 165000 ; повторяем | ||
165010: CLR (R3)+ | ; Очистка строки | ||
165012: SOB R2, 165010 | 165004: MOV #001200, R2 ; Сколько слов очищать | ||
165014: BR 165116 | 165010: CLR (R3)+ ; стираем слово | ||
; | 165012: SOB R2, 165010 ; повторяем | ||
165014: BR 165116 ; => к завершению обработки символа | |||
; COD7:: ;** звук. | |||
165016: BITB #000100, @#177761 ; Проверяем байт блокировки SOUND | 165016: BITB #000100, @#177761 ; Проверяем байт блокировки SOUND | ||
165024: BNE 165116 | 165024: BNE 165116 ; => к завершению обработки символа | ||
165026: CALL @#160126 ; SOUND | 165026: CALL @#160126 ; SOUND | ||
165032: BR 165116 ; к завершению обработки символа | 165032: BR 165116 ; => к завершению обработки символа | ||
165034: DW 165036 ; адрес мелодии | 165034: DW 165036 ; адрес мелодии | ||
165036: DB 001, 205, 017, 000 ; мелодия | 165036: DB 001, 205, 017, 000 ; .COD7 - мелодия | ||
; | ; DELL: ;** стирание строки от позиции курсора. | ||
165042: CALL @#165140 | 165042: CALL @#165140 ; Очистка строки от текущей позиции до конца строки | ||
165046: BR 165116 | 165046: BR 165116 ; => к завершению обработки символа | ||
; | ; DELS: ;** стирание кадра от позиции курсора. | ||
165050: CALL @#165140 | 165050: CALL @#165140 ; Очистка строки от текущей позиции до конца строки | ||
165054: BIC #000077, R3 | 165054: BIC #000077, R3 | ||
165060: MOV R3, R5 | 165060: MOV R3, R5 | ||
165062: ADD #002000, R5 | 165062: ADD #002000, R5 | ||
165066: BMI 165116 | 165066: BMI 165116 ; => к завершению обработки символа | ||
165070: BR 165106 | 165070: BR 165106 | ||
; | ; ES: ;** очистка экрана. | ||
165072: CLR R5 | 165072: CLR R5 | ||
165074: BR 165102 | 165074: BR 165102 ; => EES | ||
; | ; FF: ;** FORM FEED - очистка кадра. | ||
165076: MOV #002000, R5 | 165076: MOV #002000, R5 | ||
165102: CLR @#177772 | 165102: CLR @#177772 | ||
Строка 892: | Строка 997: | ||
165114: BPL 165110 | 165114: BPL 165110 | ||
; +??? | ; +??? | ||
; Завершение обработки символа | ; OUTT - Завершение обработки символа | ||
165116: CALL @#165206 ; Восстановление курсора | 165116: CALL @#165206 ; Восстановление курсора | ||
165122: MOV (SP)+, R5 | 165122: MOV (SP)+, R5 | ||
Строка 902: | Строка 1007: | ||
165136: RETURN | 165136: RETURN | ||
; Очистка строки от текущей позиции до конца строки | ; Очистка строки от текущей позиции до конца строки | ||
165140: MOV #000012, R2 | ; DL: ; удаление части строки. | ||
165140: MOV #000012, R2 ; 10. итераций | |||
165144: MOV R3, R5 | 165144: MOV R3, R5 | ||
165146: MOV #000100, R4 | 165146: MOV #000100, R4 ; 64. позиции в строке | ||
165152: BIC #177700, R5 | 165152: BIC #177700, R5 | ||
165156: SUB R5, R4 | 165156: SUB R5, R4 | ||
165160: BLE 165176 | 165160: BLE 165176 | ||
165162: MOV R3, R5 | 165162: MOV R3, R5 | ||
165164: ADD #002000, R5 | 165164: ADD #002000, R5 ; Начало основной части экрана | ||
165170: ASL R5 | 165170: ASL R5 | ||
165172: CLR (R5)+ | 165172: CLR (R5)+ ; стираем слово | ||
165174: SOB R4, 165172 | 165174: SOB R4, 165172 ; повторяем | ||
165176: ADD #000100, R3 | 165176: ADD #000100, R3 ; к следующей пиксельной строке | ||
165202: SOB R2, 165144 | 165202: SOB R2, 165144 ; продолжаем цикл | ||
165204: RETURN | 165204: RETURN | ||
; | ; | ||
; | ; CURSOR - гашение/засветка курсора. | ||
165206: MOV @#177772, R3 ; Место курсора от начала ГЗУ | 165206: MOV @#177772, R3 ; Место курсора от начала ГЗУ | ||
165212: BMI 165246 | 165212: BMI 165246 | ||
165214: TSTB @#177771 ; Состояние курсора?? | 165214: TSTB @#177771 ; Состояние курсора?? | ||
165220: BMI 165246 | 165220: BMI 165246 | ||
165222: TST @#177756 | 165222: TST @#177756 ; Счётчик мигания курсора | ||
165226: BPL 165246 | 165226: BPL 165246 ; не виден => не нужно убирать | ||
165230: MOV R3, R4 | 165230: MOV R3, R4 | ||
165232: ADD @#177746, R4 ; + адрес 25-й строки экрана | 165232: ADD @#177746, R4 ; + адрес 25-й строки экрана | ||
Строка 929: | Строка 1035: | ||
165240: ROL R4 | 165240: ROL R4 | ||
165242: BMI 165246 | 165242: BMI 165246 | ||
165244: COM (R4) ; Инвертируем восемь пикселей | 165244: COM (R4) ; Инвертируем восемь пикселей - курсор | ||
165246: RETURN | 165246: RETURN | ||
; Таблица смещений переходов для обработки спецсимволов | ; Таблицы смещений программ обработки управл. кодов. | ||
; TABL - Таблица смещений переходов для обработки спецсимволов | |||
165250: DB 261, 043, 036, 036, 036, 036, 031, 221 ; 00..07 | 165250: DB 261, 043, 036, 036, 036, 036, 031, 221 ; 00..07 | ||
165260: DB 105, 120, 061, 233, 251, 113, 133, 136 ; 10..17 | 165260: DB 105, 120, 061, 233, 251, 113, 133, 136 ; 10..17 | ||
165270: DB 000, 247, 155, 144, 146, 177, 163, 011 ; 20..27 | 165270: DB 000, 247, 155, 144, 146, 177, 163, 011 ; 20..27 | ||
165300: DB 041, 171, 105, 016, 201, 061, 003, 236 ; 30..37 | 165300: DB 041, 171, 105, 016, 201, 061, 003, 236 ; 30..37 | ||
; Таблица смещений переходов для обработки символов ESC + 100..113 | ; TAR2 - Таблица смещений переходов для обработки символов ESC + 100..113 | ||
165310: DB 141, 155, 163, 171, 105, 261, 022, 261 ; 100..107 | 165310: DB 141, 155, 163, 171, 105, 261, 022, 261 ; 100..107 | ||
165320: DB 177, 201, 236, 233 | 165320: DB 177, 201, 236, 233 | ||
; Точка входа QDRAW | ; Таблицы разрешенных кодов. | ||
T.SYLN: .WORD ^B0011111011000011,^B0000000000000010 | |||
T.VT52: .WORD ^B0000001111101111,^B0000000010010010 ; 0-17,20-37 | |||
T.NEMG: .WORD ^B1111111111111100,^B1111111111111111 | |||
; ==== Графические примитивы - см. GRAF.MAC ========================================== | |||
; | |||
; Рисование линии из точки с координатами (XOLD,YOLD) | |||
; в точку с координатами (X2,Y2). После выполнения операции: | |||
; XOLD=X2,YOLD=Y2. | |||
; DRAW BRIGHT,X2,Y2 [,XOLD,YOLD] | |||
; Точка входа QDRAW - DRAW для QUASIC | |||
165340: MOV (SP), R5 | 165340: MOV (SP), R5 | ||
; Точка входа FDRAW | ; Точка входа FDRAW - DRAW для FORTRAN | ||
165342: CALL @#166040 | 165342: CALL @#166040 | ||
; Точка входа DRAW | ; Точка входа DRAW - нарисовать линию из (XOLD,YOLD) в (XNEW,YNEW) | ||
; После выполнения операции XNEW=XOLD, YNEW=YOLD. | ; После выполнения операции XNEW=XOLD, YNEW=YOLD. | ||
165346: CALL @#165376 | 165346: CALL @#165376 | ||
165352: MOV @#000212, @#000216 | 165352: MOV @#000212, @#000216 ; XNEW -> XOLD | ||
165360: MOV @#000214, @#000220 | 165360: MOV @#000214, @#000220 ; YNEW -> YOLD | ||
165366: RETURN | 165366: RETURN | ||
; Точка входа QLINE | ; | ||
; Рисование линии из точки (X2,Y2) в точку (X1,Y1) | |||
; LINE BRIGHT [,X1 [,Y1 [,X2 [,Y2]]]] | |||
; Точка входа QLINE - LINE для QAUSIC | |||
165370: MOV (SP), R5 | 165370: MOV (SP), R5 | ||
; Точка входа FLINE | ; Точка входа FLINE - LINE для FORTRAN | ||
165372: CALL @#166040 | 165372: CALL @#166040 | ||
; Точка входа LINE | ; Точка входа LINE - нарисовать линию из (XOLD,YOLD) в (XNEW,YNEW) | ||
165376: MOV #000212, R5 | 165376: MOV #000212, R5 ; Адрес XNEW | ||
165402: MOV (R5)+, R0 | 165402: MOV (R5)+, R0 ; X NEW | ||
165404: MOV (R5)+, R1 | 165404: MOV (R5)+, R1 ; Y NEW | ||
165406: MOV (R5)+, R2 | 165406: MOV (R5)+, R2 ; X OLD | ||
165410: MOV (R5)+, R3 | 165410: MOV (R5)+, R3 ; Y OLD | ||
165412: CLR @#000204 | 165412: CLR @#000204 ; реверс: меньше или больше П/4. | ||
165416: MOV # | 165416: MOV #1, R4 | ||
165422: MOV R4, R5 | 165422: MOV R4, R5 | ||
165424: SUB R2, R0 | 165424: SUB R2, R0 ; DELTA X= XN-XO | ||
165426: BPL 165434 | 165426: BPL 165434 | ||
165430: NEG R0 | 165430: NEG R0 ; модуль приращения DX | ||
165432: NEG R5 | 165432: NEG R5 ; знак DX +/-1 | ||
165434: SUB R3, R1 | 165434: SUB R3, R1 ; DELTA Y=YN-YO | ||
165436: BPL 165444 | 165436: BPL 165444 | ||
165440: NEG R1 | 165440: NEG R1 ; модуль DY | ||
165442: NEG R4 | 165442: NEG R4 ; SIGN DY +/-1 | ||
165444: CMP R0, R1 | 165444: CMP R0, R1 ; IF DX<DY THEN | ||
165446: BGE 165476 | 165446: BGE 165476 ; реверс : | ||
165450: MOV R0, -(SP) | 165450: MOV R0, -(SP) | ||
165452: MOV R1, R0 | 165452: MOV R1, R0 | ||
165454: MOV (SP), R1 | 165454: MOV (SP), R1 ; DX <-> DY | ||
165456: MOV R4, (SP) | 165456: MOV R4, (SP) | ||
165460: MOV R5, R4 | 165460: MOV R5, R4 | ||
165462: MOV (SP), R5 | 165462: MOV (SP), R5 ; SX <-> SY | ||
165464: MOV R2, (SP) | 165464: MOV R2, (SP) | ||
165466: MOV R3, R2 | 165466: MOV R3, R2 | ||
165470: MOV (SP)+, R3 | 165470: MOV (SP)+, R3 ; XO <-> YO | ||
165472: INC @#000204 | 165472: INC @#000204 ; флаг реверса. | ||
165476: TST R0 | 165476: TST R0 ; IF DX=0 | ||
165500: BEQ 165544 | 165500: BEQ 165544 ; THEN DY=0 - единственная точка. | ||
165502: ASL R1 | 165502: ASL R1 ; 2DY | ||
165504: MOV R0, -(SP) | 165504: MOV R0, -(SP) | ||
165506: ASL (SP) | 165506: ASL (SP) ; 2DX | ||
165510: MOV R1, -(SP) | 165510: MOV R1, -(SP) | ||
165512: SUB R0, (SP) | 165512: SUB R0, (SP) ; 2DY-2DX=D - флаг наклона. | ||
165514: CALL @#165544 | 165514: CALL @#165544 ; вывод точки. | ||
165520: TST (SP) | 165520: TST (SP) | ||
165522: BMI 165532 | 165522: BMI 165532 | ||
165524: SUB 000002(SP), (SP) | 165524: SUB 000002(SP), (SP) ; D=D-2DX | ||
165530: ADD R4, R3 | 165530: ADD R4, R3 ; YO=YO+SY | ||
165532: ADD R1, (SP) | 165532: ADD R1, (SP) ; D=D+2DY | ||
165534: ADD R5, R2 | 165534: ADD R5, R2 ; XO=XO+SX | ||
165536: SOB R0, 165514 | 165536: SOB R0, 165514 ; счетчик=DX | ||
165540: CMP (SP)+, (SP)+ | 165540: CMP (SP)+, (SP)+ ; восстановить стек. | ||
165542: RETURN | 165542: RETURN | ||
; OUT - вывод точки | |||
165544: MOV R1, -(SP) | 165544: MOV R1, -(SP) | ||
165546: MOV R2, -(SP) | 165546: MOV R2, -(SP) | ||
165550: MOV R3, -(SP) | 165550: MOV R3, -(SP) | ||
165552: TST @#000204 | 165552: TST @#000204 ; реверс ? | ||
165556: BEQ 165564 | 165556: BEQ 165564 | ||
165560: MOV R2, R3 | 165560: MOV R2, R3 ; восстановить X,Y | ||
165562: MOV (SP), R2 | 165562: MOV (SP), R2 | ||
165564: CALL @#165616 | 165564: CALL @#165616 ; записать точку. | ||
165570: MOV (SP)+, R3 | 165570: MOV (SP)+, R3 | ||
165572: MOV (SP)+, R2 | 165572: MOV (SP)+, R2 | ||
Строка 1013: | Строка 1135: | ||
165576: RETURN | 165576: RETURN | ||
; | ; | ||
; Точка входа QPOINT | ; Нарисовать точку. | ||
; POINT BRIGHT [,X [,Y]] | |||
; Точка входа QPOINT - POINT для QUASIC | |||
165600: MOV (SP), R5 | 165600: MOV (SP), R5 | ||
; Точка входа FPOINT | ; Точка входа FPOINT - POINT для FORTRAN | ||
165602: CALL @#166040 | 165602: CALL @#166040 | ||
; Точка входа POINT | ; Точка входа POINT - нарисовать точку | ||
165606: MOV @#000212, R2 | 165606: MOV @#000212, R2 | ||
165612: MOV @#000214, R3 | 165612: MOV @#000214, R3 | ||
165616: CALL @#163466 ; MODE3 | 165616: CALL @#163466 ; MODE3 | ||
165622: CALL @#165750 | 165622: CALL @#165750 ; Находим точку на экране | ||
165626: BLO 165660 | 165626: BLO 165660 | ||
165630: TST (R1)+ | 165630: TST (R1)+ | ||
Строка 1034: | Строка 1158: | ||
165660: RETURN | 165660: RETURN | ||
; | ; | ||
; Точка входа QRPOIN | ; Чтение яркости точки с координатами (X,Y) | ||
; RPOINT BRIGHT,X,Y | |||
; Точка входа QRPOIN - RPOINT для QUASIC | |||
165662: MOV (SP), R5 | 165662: MOV (SP), R5 | ||
; Точка входа FRPOIN | ; Точка входа FRPOIN - RPOINT для FORTRAN | ||
165664: CALL @#166040 | 165664: CALL @#166040 | ||
165670: BR 165676 | 165670: BR 165676 | ||
; Точка входа RPOINT | ; Точка входа RPOINT - прочитать яркость точки | ||
165672: MOV #000210, R4 ; | 165672: MOV #000210, R4 ; адрес кода яркости. | ||
165676: MOV @#000212, R2 ; XNEW | 165676: MOV @#000212, R2 ; XNEW | ||
165702: MOV @#000214, R3 ; YNEW | 165702: MOV @#000214, R3 ; YNEW | ||
Строка 1048: | Строка 1174: | ||
165720: BLO 165744 | 165720: BLO 165744 | ||
165722: MOV #000002, R1 | 165722: MOV #000002, R1 | ||
165726: SWAB R3 | 165726: SWAB R3 ; чтение яркости. | ||
165730: BIT R3, @#177570 | 165730: BIT R3, @#177570 | ||
165734: BEQ 165740 | 165734: BEQ 165740 | ||
Строка 1054: | Строка 1180: | ||
165740: SOB R1, 165726 | 165740: SOB R1, 165726 | ||
165742: RETURN | 165742: RETURN | ||
165744: DEC (R4) | 165744: DEC (R4) ; яркость -1 -- за экраном. | ||
165746: RETURN | 165746: RETURN | ||
; Нахождение точки на экране; устанавливает адрес, возвращает маску в R3 | ; COORD - Нахождение точки на экране; устанавливает адрес, возвращает маску в R3 | ||
165750: MOV R2, R1 | 165750: MOV R2, R1 | ||
165752: CMP #000777, R2 | 165752: CMP #000777, R2 | ||
Строка 1079: | Строка 1205: | ||
166034: SOB R1, 166032 | 166034: SOB R1, 166032 | ||
166036: RETURN | 166036: RETURN | ||
; Подготовка перед вызовом для FORTRAN | ; FORT - Подготовка перед вызовом для FORTRAN | ||
166040: MOV | 166040: MOV (R5)+, R0 ; число параметров. | ||
166042: MOV | 166042: MOV (R5), R4 ; адрес яркости. | ||
166044: BIC | 166044: BIC #177770, R0 | ||
166050: BEQ | 166050: BEQ 166062 | ||
166052: MOV | 166052: MOV #000210, R3 ; внутренние значения. | ||
166056: MOV | 166056: MOV @(R5)+, (R3)+ ; область заполнения. | ||
166060: SOB | 166060: SOB R0, 166056 | ||
166062: RETURN | 166062: RETURN | ||
; | ; | ||
; ==== Стандартный знакогенератор ==== | ; ==== Стандартный знакогенератор - см. SYMG.MAC ==== | ||
166064: DB | 166064: DB ; Знакогенератор, 96 символов (0x20..0x80), 10 байт/символ | ||
; ==== Регистры ==== | |||
170000: DW ; Используется м/с умножителя | |||
170002: DW ; Используется м/с умножителя | |||
170004: DW ; Используется м/с умножителя | |||
170006: DW ; Регистр данных клавиатуры / фиксации HALT запросов | |||
170010: DW ; Регистр состояния адаптера локальной сети | |||
170012: DW ; Регистр данных адаптера локальной сети | |||
170014: DW ; ?? | |||
170020: DW ; RgStSnd - регистр состояния таймера | |||
170022: DW ; RgF - регистр частоты | |||
170024: DW ; RgLength - регистр длительности | |||
170026: DW ; RgOn - включение звука (обращение) | |||
170030: DW ; RgOct - регистр октавы и громкости | |||
170032: DW ; RgOff - выключение звука (обращение) | |||
177100: DW ; RgStat - регистр состояния контроллера дисковода | |||
177102: DW ; RgData - регистр данных | |||
177104: DW ; RgCntrl - регистр управления | |||
177106: DW ; RgTime - регистр таймера контроллера дисковода | |||
177514: DW ; Регистр данных устройства сопряжения | |||
177516: DW ; Регистр состояния усройства сопряжения | |||
177560: DW ; KBS - регистр состояния клавиатуры | |||
177562: DW ; KBD - регистр данных клавиатуры | |||
177564: DW ; TTS - регистр состояния дисплея | |||
177566: DW ; TTD - регистр данных дисплея | |||
177570: DW ; VDATA - регистр данных косвенного доступа | |||
177572: DW ; VADDR - регистр адреса косвенного доступа | |||
177574: DW ; Регистр управления; бит 0 - маппинг видеопамяти на нижнюю память | |||
; ==== Блок переменных ==== | ; ==== Блок переменных ==== | ||
177720: DW | 177720: DW ; R0 при останове | ||
177722: DW | 177722: DW ; R1 при останове | ||
177724: DW | 177724: DW ; R2 при останове | ||
177726: DW | 177726: DW ; R3 при останове | ||
177730: DW | 177730: DW ; R4 при останове | ||
177732: DW | 177732: DW ; R5 при останове | ||
177734: DW | 177734: DW ; SP при останове | ||
177736: DW | 177736: DW ; PC при останове | ||
177740: DW | 177740: DW ; PSW при останове | ||
177744: DW | 177744: DW ; Нижняя граница памяти доступной для команд пульта | ||
177746: DW | 177746: DW ; Значение #003100 - адрес 25-й строки экрана | ||
177750: DW | 177750: DW ; Адрес начала мелодии | ||
177752: DW | 177752: DW ; Адрес продолжения мелодии | ||
177754: DW | 177754: DW ; Адрес подпрограммы SOUND | ||
177756: DB | 177756: DB ; Счётчик мигания курсора | ||
177760: DB | 177757: DB ; Состояние курсора: 000 - не виден, 377 - виден | ||
177761: DB | 177760: DB ; Счётчик мелодии | ||
177762: DW | 177761: DB ; Байт блокировки вызова SOUND | ||
177764: DW | ; бит7 = мелодия играет | ||
177766: | ; бит6 = звук выключен | ||
177770: DW | 177762: DW ; FRG Маска фона для вывода символа (M.XOR) | ||
177772: DW | 177764: DW ; COL Маска гашения символа перед выводом (M.BIC) | ||
177774: DW | 177766: DB ; Режим дисплея | ||
177776: DW | ; bit0 - запрос от клавиатуры, прерывание по вектору 000064 | ||
; bit3 - работа со служебной строкой | |||
; bit4 - работа с цветом в режиме VT52 | |||
; bit5 - русский регистр вывода | |||
; bit6 - русский регистр ввода | |||
; bit7 - режим эмуляции VT52 | |||
177767: DB ; Буферная ячейка клавиатуры | |||
177770: DW ; SIZE Размер экрана в байтах, начиная от начала ГЗУ | |||
177772: DW ; CUR Место курсора от начала ГЗУ | |||
177774: DW ; SYGEN Адрес подпрограммы вывода символа, по умолчанию 163674 | |||
177776: DW ; Значение #056364 | |||
</pre> | </pre> | ||
[[Категория:Немига|*]] | [[Категория:Немига|*]] |
Текущая версия от 21:18, 27 октября 2023
Этот документ создан для Emuverse и распространяется на условиях лицензии CC-BY-SA-3.0. |
Источник: https://github.com/nzeemin/nemigabtl/blob/master/docs/nemiga-406.lst
; Дизассемблированное ПЗУ компьютера НЕМИГА ПК 588 версия 4.06 ; 000004: DW ; Адрес прерывания 000006: DW ; PSW прерывания 000010: DW ; Адрес прерывания 000012: DW ; PSW прерывания 000014: DW ; Адрес прерывания - прерывание по T-разряду или команда BPT 000016: DW ; PSW прерывания 000020: DW ; Адрес прерывания - команда IOT 000022: DW ; PSW прерывания 000024: DW ; Адрес прерывания - питание 000026: DW ; PSW прерывания 000030: DW ; Адрес прерывания - команда EMT 000032: DW ; PSW прерывания 000034: DW ; Адрес прерывания - команда TRAP 000036: DW ; PSW прерывания 000060: DW ; Прерывание клавиатура 000062: DW ; PSW прерывания 000064: DW ; Прерывание дисплей 000066: DW ; PSW прерывания 000100: DW ; Адрес прерывания - таймер 000104: DW ; Адрес подпрограммы обработки сигнала Н4 - от сетевой карты 000110; DW ; Прерывание "мелодия закончилась кодом 040" 000112: DW ; PSW прерывания 000204: DW ; WORK - рабочий регистр 000206: DW ; VFORM - регистр вертикального формата 000210: DW ; BRIGHT - регистр яркости (0..3) 000212: DW ; XNEW - регистр новой X-координаты 000214: DW ; YNEW - регистр новой Y-координаты 000216: DW ; XOLD - регистр старой X-координаты 000220: DW ; YOLD - регистр старой Y-координаты ; ==== Начало ПЗУ - см. PULT.MAC ===================================================== 160000: DW 177570 ; ?? 160002: DW 160210, 000341 ; Вектор прерывания сигнала/команды HALT 160006: DW 161726, 000340 ; Вектор прерывания - дв.ошибка канала, запуск 160012: DW 161142, 000340 ; Вектор прерывания - ошибка ввода адреса вектора 160016: JMP @#163466 ; MODE3 - Вызов с запретом системных прерываний 160022: JMP @#163504 ; SYSLIN - Вывод в служебную строку 160026: JMP @#163722 ; TT.OUT - Системный вывод через MODE 160032: JMP @#163726 ; SYSOUT - Системный вывод 160036: JMP @#162274 ; PRINT - Вывод текста 160042: JMP @#165346 ; DRAW - Нарисовать линию, сохранив XOLD,YOLD 160046: JMP @#165340 ; QDRAW то же для QUASIC 160052: JMP @#165342 ; FDRAW то же для FORTRAN 160056: JMP @#165376 ; LINE - Нарисовать линию 160062: JMP @#165370 ; QLINE то же для QUASIC 160066: JMP @#165372 ; FLINE то же для FORTRAN 160072: JMP @#165606 ; POINT - Нарисовать точку 160076: JMP @#165600 ; QPOINT то же для QUASIC 160102: JMP @#165602 ; FPOINT то же для FORTRAN 160106: JMP @#165672 ; RPOINT - Читать яркость точки 160112: JMP @#162236 ; QRPOIN то же для QUASIC 160116: JMP @#165664 ; FRPOIN то же для FORTRAN 160122: JMP @#162236 ; DUMP - напечатать восьмеричное число R3 160126: JMP @177754 ; SOUND ; ==== HALT MONITOR .RESET - Обработка канального сигнала СБРОС 160142: MOV #000357, @#000206 ; 239. -> VFORM 160150: CLR @#177560 ; Сброс состояния клавиатуры 160154: MOV #000200, @#177564 ; Уст. состояние терминала - не готов, запрет прерывания 160162: CLR @#177770 160166: BIC #177541, @#177766 ; Режим дисплея - оставляем только флаги #136 HOUT: 160174: MOV (SP)+, R0 160176: JMP @#161074 ; .PULT - Завершаем обработку прерывания HALT ; ; Обработка нажатия СТОП и кнопки ОСТ PULT: ; УПР/СТОП или команда HALT 160202: MOV (SP)+, R0 ; Восстанавливаем R0 160204: JMP @#161142 ; Переходим к сохранению регистров и пульту ; ; Обработчик прерывания по сигналу/команде HALT HMON:: ; диспетчер HALT прерываний. 160210: CMP #056364, @#177776 ; Проверка, настроена ли память режима HALT 160216: BEQ 160224 ; да, настроена 160220: JMP @#161720 ; нет => DOUBL - перезапуск O.K.: 160224: MOV R0, -(SP) ; Сохраняем R0 чтобы не испортить 160226: BIS #000200, @#177564 ; ТТ: всегда готов ! 160234: BIT #176000, @#170006 ; Проверка старших 6 бит регистра фиксации HALT 160242: BMI 160142 ; была команда RESET 160244: BEQ 160202 ; была команда HALT 160246: BIT #004000, @#170006 ; Сигнал Н4? - адаптер локальной сети 160254: BEQ 160262 ; нет 160256: CALL @000104 ; SH4 - локальная сеть. .DISP: 160262: BIT #040000, @#170006 ; SH1 - по записи в TTD 160270: BEQ 160302 ; нет => переходим 160272: MOV @#177566, R0 ; Регистр данных терминала - символ для вывода на экран 160276: CALL @#163726 ; SYSOUT Вывод символа R0 на экран .RDKEY: 160302: BIT #020000, @#170006 ; SH2 - по чтению из KBD 160310: BEQ 160334 ; нет => переходим 160312: MOVB @#177767, R0 ; Провека буферной ячейки клавиатуры 160316: BEQ 160326 ; буфер пуст => переходим 160320: CLRB @#177767 ; Очищаем буфер 160324: BR 160526 ; вывод второй части. EMPTY: 160326: BIC #177677, @#177560 ; сброс бита прерывания клавиатуры. .KEY:: 160334: MOV @#170006, R0 ; KEY - по нажатию клавиши. 160340: BIT #002000, R0 ; Пришёл байт с клавиатуры? 160344: BEQ 160606 ; нет => 160346: BIC #177400, R0 ; код КОИ-8 160352: BEQ 160202 ; код 0 -- УПР/СТОП. 160354: TSTB @#177560 ; Состояние клавиатуры - готов к приёму? 160360: BMI 160606 ; нет => ; Нажата клавиша - выдаём звук нажатия клавиши 160362: MOV R1, -(SP) 160364: MOV R2, -(SP) 160366: TSTB @#177761 ; Флаг блокировки вызова SOUND 160372: BNE 160410 ; играет мелодия. 160374: CALL @#160126 ; SOUND 160400: BR 160410 ; 160402: DW 160404 ; Адрес мелодии нажатия клавиши 160404: DB 011, 214, 001, 000 ; Мелодия - звук длиной 1/50 сек ; Обработка нажатой клавиши 160410: MOV #177766, R1 ; Адрес Режим дисплея 160414: MOV #000100, R2 160420: TSTB (R1) ; проверяем бит 7 в Режим дисплея 160422: BPL 160522 l бит 7 = 0 ? => переход 160424: BITB #000300, R0 160430: BEQ 160500 160432: BPL 160462 160434: BIT R2, R0 160436: BEQ 160522 160440: BIC #177600, R0 160444: BITB R2, (R1)+ 160446: BNE 160522 160450: MOVB R0, (R1) 160452: MOV #000016, R0 160456: BISB R2, -(R1) 160460: BR 160522 LAT: 160462: BITB R2, (R1)+ ; лат. регистр установлен ? 160464: BEQ 160522 160466: MOVB R0, (R1) ; нет - двойной код: ЛАТ-символ. 160470: MOV #000017, R0 160474: BICB R2, -(R1) 160476: BR 160522 160500: CMPB R0, #000040 ; >= ' ' ? 160504: BHIS 160522 ; да => 160506: MOVB 161102(R0), @#177767 ; управляющие последовательности. 160514: BEQ 160522 ; типа: АР2-код. 160516: MOV #000033, R0 ; код ESC REG2: 160522: MOV (SP)+, R2 160524: MOV (SP)+, R1 160526: MOV R0, @#177562 ; стандартная клавиатура. 160532: MOV (SP)+, R0 160534: BIS #000200, @#177560 ; Состояние клавиатуры - сброс бита готовности 160542: BIT #000100, @#177560 ; Состояние клавиатуры - разрешено прерывание? 160550: BEQ 161074 ; нет => Завершаем обработку прерывания HALT 160552: BISB #000001, @#177766 ; Запрещаем прерывание по вектору 000064 160560: TSTB 000002(SP) 160564: BMI 161074 ; => Завершаем обработку прерывания HALT INT.K: ; эмуляция прерывания от клавиатуры. 160566: BICB #000001, @#177766 ; Разрешаем прерывание по вектору 000064 160574: MOV @#000062, -(SP) ; Кладём в стек PSW 160600: MOV @#000060, -(SP) ; адрес прерывания по вектору 60 160604: BR 161074 ; HOUT1 - Завершаем обработку прерывания HALT .CLOCK:: ; SH3 - по системным часам. 160606: MOV (SP)+, R0 ; Восстанавливаем R0 160610: BIT #010000, @#170006 ; Сигнал Н3? 160616: BEQ 161074 ; нет => Завершаем обработку прерывания HALT ; Обработка сигнала Н3 160620: MOV R4, -(SP) ; Сохраняем R4 160622: TST @#177760 ; Флаг блокировки SOUND 160626: BPL 160750 ; bit7=0 => переходим 160630: MOV @#177752, R4 ; Берём адрес продолжения мелодии 160634: INCB @#177760 ; Увеличиваем счётчик длительности ноты 160640: CMPB @#177760, 177777(R4) ; Сравниваем с длительностью ноты 160646: BLO 160750 ; пока не кончилась => переходим 160650: TSTB (R4) ; 200 ? 160652: BMI 160744 ; да => переходим 160654: BITB #000037, (R4) ; Есть ещё нота мелодии? 160660: BNE 160740 ; да => переходим 160662: BIC #100000, @#177760 ; Снимаем флаг блокировки SOUND ; Обработка флагов завершения мелодии 160670: BITB #000040, (R4) ; 040 и 140 ? 160674: BNE 160712 ; да => переходим 160676: TSTB (R4) ; 000 ? (никаких действий по окончании мелодии) 160700: BEQ 160750 ; да => переходим 160702: CALL @#160126 ; SOUND 160706: BR 160750 160710: DW 000000 ; Окончание мелодии байтом 040 либо 140 160712: BITB #000100, (R4)+ ; байт 140? 160716: BNE 160734 ; да => переход 160720: MOV (SP)+, R4 160722: MOV @#000112, -(SP) ; Сохраняем в стеке переход 160726: MOV @#000110, -(SP) ; на прерывание по вектору 110 160732: BR 161074 ; к разрешению прерываний и RTI ; Окончание мелодии байтом 140 160734: CLRB (R4) ; Очистка байта после конца мелодии 160736: BR 160750 ; переходим к работе с курсором ; 160740: MOVB (R4)+, @#170030 ; Октава и громкость 160744: CALL @#162520 ; Обработка продолжения мелодии ; Мигание курсора 160750: DECB @#177756 ; Уменьшаем счётчик мигания 160754: BPL 161034 ; значение >= 0 ? => переходим 160756: MOVB #000007, @#177756 ; Новое значение счётчика 160764: COMB @#177757 ; Инвертировать состояние курсора при мигании 160770: MOV @#177772, R4 ; Смещение курсора 160774: BMI 161034 160776: TSTB @#177771 ; Состояние курсора?? 161002: BMI 161034 161004: ADD @#177746, R4 ; + адрес 25-й строки экрана 161010: BMI 161034 161012: ROL R4 161014: BMI 161034 161016: BIS #000001, @#177574 ; Включаем экран в основную память 161024: COM (R4) ; Инвертирование восьми пикселей - курсор 161026: BIC #000001, @#177574 ; Отключаем экран из основной памяти 161034: MOV (SP)+, R4 ; Восстанавливаем R4 161036: TSTB 000002(SP) ; приоритет ССП < 4 ? 161042: BMI 161074 ; ?? => Завершаем обработку прерывания HALT 161044: BITB #000001, @#177766 ; был запрос от клавиатуры ? 161052: BNE 160566 161054: BIT #000100, @#177564 ; прерывание от дисплея нужно ? 161062: BEQ 161074 ; нет => Завершаем обработку прерывания HALT ; Эмуляция прерывания от дисплея 161064: MOV @#000066, -(SP) ; сохраняем PSW 161070: MOV @#000064, -(SP) ; и адрес для перехода по вектору 000064 ; HOUT1: Завершение обработки прерывания HALT 161074: CLRB @#170006 ; Разрешаем системные прерывания 161100: RTI ; Таблица байт - маппинг кодов клавиш 000..037 в ESC-коды ; TCK: таблица перекодировки управяющиx клавиш в режимe VT-52 161102: DB ... ; Обработка прерывания по вектору 160012 - Сохранение регистров и переход к пульту .PULT:: 161142: MOV (SP)+, @#177736 ; убрать вектор состояния. 161146: MOV (SP)+, @#177740 ; из стека. 161152: MOV SP, @#177734 ; установить системный стек. 161156: MOV #177734, SP ; 161162: MOV R5, -(SP) ; -> 177732 161164: MOV R4, -(SP) ; -> 177730 161166: MOV R3, -(SP) ; -> 177726 161170: MOV R2, -(SP) ; -> 177724 161172: MOV R1, -(SP) ; -> 177722 161174: MOV R0, -(SP) ; -> 177720 - начало блока регистров 161176: MOV @#000004, -(SP) ; Адрес прерывания 161202: MOV @#000006, -(SP) ; PSW прерывания 161206: MOV @#177766, -(SP) ; Сохраняем Режим дисплея 161212: CLR @#177766 ; Очищаем Режим дисплея - режим немига. 161216: MOV #000340, @#000006 ; есть ли локальная сеть ? 161224: MOV #161444, @#000004 ; 161232: MOV #000060, @#170010 ; в сети - режим останов. 161240: BR 161444 ; ..CSI - Переход к пультовому терминалу ; ; ==== Программа пультового терминала ; ; NEXT: Просмотр ячеек памяти - переход к следующему слову 161242: INC R2 ; открыть следующую. 161244: INC R2 ; Команда '/' - просмотр ячеек памяти ; OPEN: ; открыть ячейку. 161246: CMP R2, @#177744 ; Сравниваем с нижней границей 161252: BLO 161270 ; меньше => переходим 161254: CMP R2, #177600 161260: BHIS 161546 ; => выводим признак ошибки и в пульт 161262: CMP R2, #170000 161266: BLO 161546 ; => выводим признак ошибки и в пульт 161270: MOV #162716, R5 ; Строка 161274: CALL @# ; PRINT 161300: MOV R2, R3 ; Печатаем адрес 161302: CALL @#162236 ; DUMP Вывод R3 как 8-ричного числа 161306: MOV (R2), R3 ; Печатаем значение 161310: CALL @#162236 ; DUMP Вывод R3 как 8-ричного числа 161314: CALL @#162310 161320: TST R1 161322: BEQ 161326 161324: MOV R5, (R2) ; Заносим новое значение 161326: CMPB #000012, R0 ; Нажали ПС? 161332: BEQ 161242 ; Да, переходим к следующему слову памяти 161334: CMPB #000015, R0 ; Нажали ВВОД? 161340: BEQ 161444 ; Да, возвращамся в пульт 161342: CMPB #000136, R0 ; Нажали '^' ? 161346: BNE 161546 ; Нет - выводим признак ошибки и в пульт 161350: DEC R2 ; Переходим к предыдущему слову памяти 161352: DEC R2 161354: BR 161246 ; ; Команда 'G' - продолжение выполнения программы GO: ; старт/продолжение программы. 161356: MOV (SP)+, @#177766 ; Восстанавливаем Режим дисплея 161362: TST R1 ; Параметр задан? 161364: BEQ 161400 ; нет => восстановление регистров и возврат 161366: CLR @#177740 161372: MOV R5, @#177736 ; Адрес запуска 161376: RESET ; Восстановление всех регистров, возврат из прерывания EXIT: 161400: MOV (SP)+, @#000006 161404: MOV (SP)+, @#000004 161410: MOV (SP)+, R0 161412: MOV (SP)+, R1 161414: MOV (SP)+, R2 161416: MOV (SP)+, R3 161420: MOV (SP)+, R4 161422: MOV (SP)+, R5 161424: MOV (SP), SP 161426: MOV @#177740, -(SP) ; PSW 161432: MOV @#177736, -(SP) ; PC 161436: RTI ; ; Вывод символа и переход к пульту CLEAR: ; очистить экран. 161440: CALL @#163722 ; TT.OUT Вывод символа ; Вывод приглашения пульта и ожидание команды ; ..CSI: ; прием и интерпретация команд. 161444: MOV #162704, R5 ; Строка "Пульт>" PRIERR: 161450: MOV #177712, SP 161454: MOV #000340, @#000006 ; PSW для прерывания 161462: MOV #161546, @#000004 ; Адрес прерывания по вектору 4 161470: CALL @#162274 ; PRINT Вывод строки, адрес в R5 161474: CALL @#162310 ; Получаем команду с клавиатуры 161500: MOV R5, R2 161502: CMPB #000057, R0 ; Символ '/' - просмотр ячеек памяти 161506: BEQ 161246 161510: CMPB #000123, R0 ; Символ 'S' - вывод регистров ЦП 161514: BEQ 161554 161516: CMPB #000107, R0 ; Символ 'G' - выполнение программы 161522: BEQ 161356 161524: CMPB #000104, R0 ; Символ 'D' - загрузка с диска MD 161530: BEQ 161676 161532: CMPB #000116, R0 ; Символ 'N' - загрузка с сети 161536: BEQ 161726 ; => начальный пуск 161540: CMPB #000014, R0 ; Нажат УПР + L - очистка экрана 161544: BEQ 161440 ; Вывод знака вопроса (ошибка выполнения команды) и возврат в пультовый режим ERROR: ; ошибочная команда. ; также используется как адрес прерывания по вектору 4 161546: MOV #162703, R5 ; Строка " ?" 161552: BR 161450 ; ; Команда 'S' - вывод на экран регистров процессора ; LOOK: ; просмотр регистров. 161554: MOV #000011, R2 ; 9 регистров 161560: MOV #161606, R5 ; Строка с названиями регистров 161564: CALL @#162274 ; Вывод строки 161570: MOV #177720, R4 161574: MOV (R4)+, R3 161576: CALL @#162236 ; Вывод R3 как 8-ричного числа 161602: SOB R2, 161574 161604: BR 161444 ; Возврат в пульт 161606: DB ... ; Строка с названиями регистров ЦП ;NOTE: Команда 'X' - загрузка с устройства DX - удалена ; ; Команда 'D' - загрузка с диска MD BOOT: ; загрузка с дисков MD 161676: CMP R5, #7 ; Номер устройства больше 7? 161702: BHI 161546 ; да => ERROR 161704: CALL @#162726 ; MDBOOT - Загрузка данных с дисковода 161710: MOV #000200, @#177766 ; Режим дисплея = VT52 161716: CLR PC ; Запуск полученного блока ; 161720: MOV #160000, @#177744 ; Нижняя граница памяти доступной для команд пульта ; ; ==== Программа холодного старта - COLD START & BOOTSTRAP FROM LOCNET ; ; Холодный старт при включении питания DOUBLE:: LOCNET: 161726: MOV #001000, SP ; Устанавливаем стек 161732: CLR R0 161734: MOV #056364, -(R0) ; -> (177776) 161740: MOV #164042, -(R0) ; Адрес стандартной п/п вывода символа -> (177774) 161744: CLR @#177574 ; Отключаем экран из основной памяти 161750: MOV #000007, R1 161754: CLR -(R0) ; <| 161756: SOB R1, 161754 ; / Очищаем 7 слов 177756-177773 161760: MOV #162516, -(R0) ; -> (177754) 161764: MOV #162002, @#000004 ; Адрес прерывания 4 161772: CLR @#170024 ; Сброс длительности 161776: MOV #162426, (R0) ; Адрес SOUND -> (177754) 162002: MOV #165036, -(R0) ; Адрес мелодии BELL -> (177752) 162006: MOV (R0), -(R0) ; тот же адрес -> (177750) 162010: MOV #003100, -(R0) ; #003100 -> (177746) 162014: RESET ; сброс всех устройств 162016: MOV #000021, R0 ; символ "очистка экрана" 162022: CALL @#163722 ; TT.OUT Вывод символа 162026: MOV #161142, @#000004 ; Адрес прерывания 4 - сохранить регистры и выход в пульт 162034: MOV #000340, @#000006 ; PSW для прерывания ; Попытка загрузки из сети 162042: MOV #170010, R4 ; Адрес регистра состояния локальной сети 162046: CALL @#163504 ; SYSLIN - Вывод в служебную строку 162052: BR 162056 162056: MOV #000014, (R4) ; Настройка состояния сетевого адаптера 162062: MOV #162671, R5 162066: CALL @#162274 162072: MOV #162226, @#000004 162100: BIT #100040, (R4) 162104: BMI 162226 162106: BEQ 162100 162110: TST (R4) 162112: MOVB #000003, @#170006 ; Запрещение прерываний 162120: MOV #000016, (R4) 162124: CALL @#162206 ; Ожидаем слово из сети 162130: MOV 000002(R4), R2 162134: MOV #177712, SP 162140: MOV #177572, R0 162144: CLR (R0) 162146: CALL @#162206 ; Ожидаем слово из сети 162152: MOV 000002(R4), 177776(R0) 162160: INC (R0) 162162: SOB R2, 162146 162164: MOV #000020, (R4) 162170: CLR -(SP) 162172: CLR -(SP) 162174: BIS #000200, @#177766 ; Режим дисплея 162202: JMP @#161074 ; Подпрограмма - ожидание слова из сети 162206: CLR R1 ; счётчик ожидания 162210: BIT #100040, (R4) 162214: BMI 162226 ; ошибка сети, выходим 162216: BEQ 162224 162220: TST (R4) 162222: RETURN 162224: SOB R1, 162210 ; продолжаем цикл ожидания ERRLN: 162226: MOV #002060, (R4) ; ошибка в сети, ОСТАНОВ. 162232: JMP @#161546 ; ; ==== Программы вывода на экран чисел и строк ; ; Подпрограмма DUMP Вывод слова как 8-ричного числа; R3 = число DUMP:: 162236: MOV #000006, R1 ; Шесть разрядов DUMP1:: 162242: CLR R0 162244: ROL R3 162246: ROL R0 162250: ADD #000060, R0 ; '0' 162254: CALL @#163722 ; TT.OUT Вывод символа 162260: CLR R0 162262: ROL R3 162264: ROL R0 162266: ROL R3 162270: ROL R0 162272: SOB R1, 162244 ; Подпрограмма PRINT - Вывод строки на экран; R5 = адрес строки PRINT:: 162274: MOVB (R5)+, R0 ; Очередной символ 162276: BNE 162302 ; Не ноль? => продолжаем 162300: RETURN ; Конец строки, выходим 162302: CALL @#163722 ; TT.OUT Вывод символа 162306: BR 162274 ; Продолжаем вывод строки ; ; Ввод команды; команда это символ либо 8-ричное число (параметр) и символ GET: ; ввод строки. 162310: CLR R1 ; R0 - последний введенный код. 162312: CLR R5 ; R1 - число введенных цифр. 162314: TSTB @#177560 ; R5 - введенное значение, OCT 162320: BPL 162314 162322: MOVB @#177562, R3 ; Считываем символ 162326: CMPB R3, #000177 ; забой ? 162332: BNE 162362 162334: DEC R1 162336: BMI 162310 162340: ASH R5, #177775 162344: BIC #160000, R5 162350: MOV #000134, R0 162354: CALL @#163722 ; TT.OUT Вывод символа 162360: BR 162314 162362: MOV R3, R0 162364: CMPB R0, #000040 162370: BLO 162300 162372: CALL @#163722 ; TT.OUT Вывод символа 162376: BIC #177407, R3 162402: CMP #000060, R3 ; символ '0' ? 162406: BNE 162300 162410: BIC #177770, R0 162414: ASH R5, #000003 162420: BIS R0, R5 162422: INC R1 162424: BR 162314 ; ; Подпрограмма SOUND SOUND:: ; музыка. 162426: MOV R4, -(SP) ; Сохраняем R4 162430: BICB #000200, @#177761 162436: CLR @#170024 ; Сброс длительности 162442: MOV 000002(SP), R4 ; Откуда вызвали SOUND 162446: MOV 000002(R4), R4 ; Получаем адрес мелодии 162452: BNE 162460 162454: MOV @#177750, R4 162460: TSTB (R4) 162462: BEQ 162514 162464: MOV R4, @#177750 ; Запоминаем адрес начала мелодии 162470: MOV #001516, @#170020 ; Пишем в регистр состояния таймера 162476: MOVB (R4)+, @#170030 ; Октава и громкость 162502: CALL @#162520 ; Обработка продолжения мелодии 162506: BISB #000200, @#177761 ; Возвращаем флаг блокировки SOUND: bit7=1 162514: MOV (SP)+, R4 ; Восстанавливаем R4 162516: RETURN ; Обработка продолжения мелодии 162520: MOV R3, -(SP) ; Сохраняем R3 162522: MOVB (R4)+, R3 162524: BIC #177760, R3 ; Оставляем нижние 4 бита - 00..17 162530: ASL R3 ; и умножаем на 2 162532: MOV 162564(R3), @#170022 ; Выбираем по R3 слово и пишем в регистр частоты 162540: MOVB (R4)+, @#170024 ; Задаём длительность звука 162544: CLRB @#177760 ; Очищаем счётчик длительности ноты 162550: MOV R4, @#177752 ; Запоминаем адрес продолжения мелодии 162554: TST @#170026 ; Включение звука 162560: MOV (SP)+, R3 ; Восстанавливаем R3 162562: RETURN ; Значения задержки первого таймера для нот NOTY: 162564: DW 000000, 002253, 002150, 002050, 001755, 001664, 001577, 001515 162604: DW 001435, 001361, 001306, 001237, 001171, 000000, 000000, 000000 ; Строковые буферы HELLO:: .BYTE 4,6,5 AUTOR: .RUS <mrti> .BYTE 11,11,11 NAME: .RUS <kw> .BYTE 5 .RUS < nemiga> VERS: .BYTE 5 .ASCII / 4.07/ .BYTE 6,11 H.END:: .BYTE 40,0 RMP:: .RUS <rmp > .BYTE 0 RMU:: .RUS <rmu > .BYTE 0 LOCBO: .BYTE 14 .RUS <VDITE...> .BYTE 0 ERR: .ASCII /?/ PROMPT: .BYTE 6,15,12 .RUS <pULXT> .ASCIZ />/ MODI: .BYTE 12,15,,':,40,,40,0 ; ; ==== Подпрограммы работы с дисководом MD - см. BOOT.MAC ============================ ; ; Чтение с дисковода для загрузки; R5 = номер устройства MDBOOT:: 162726: CALL @#163466 ; MODE3 162732: MOV #000001, R4 162736: MOV R5, -(SP) ; логический No устройства. 162740: ASR R5 162742: BHIS 162750 162750: MOV R5, @#004002 ; -> B$PDN Физический номер устройства. 162754: MOV #000400, -(SP) ; один блок по адресу 0 с 1-го сектора 162760: CLR -(SP) 162762: MOV R4, -(SP) 162764: MOV #000006, R1 162770: MOV #000070, R0 162774: CALL @#163256 163000: SOB R1, 162770 163002: MOV #000030, R0 163006: CALL @#163256 163012: CLR @#177106 163016: BIT R4, @#177106 163022: BNE 163016 163024: BIT #000010, (R5) 163030: BNE 163002 163032: CLR @#177106 163036: BIT R4, (R5) 163040: BEQ 163046 163042: SOB R2, 163032 163044: HALT ; Мы на 0-й дорожке, читаем первый сектор ERR1:: 163046: MOVB R4, R0 ; чтение описателя 163050: MOV #004004, R3 ; B$Area 163054: CALL @#163316 163060: CLR @#004000 ; B$Trck 163064: MOV @#004000, R0 ; B$Trck 163070: MOVB 004016(R0), R0 ; дорожка в буфер. 163074: MOV #004140, R3 163100: CALL @#163316 163104: CLR R1 163106: MOV #004016, R5 163112: MOV #000120, R4 163116: MOVB (R5)+, R2 163120: MOV R1, R0 163122: ADD R2, R1 163124: CMP R1, (SP) 163126: BHI 163134 163130: SOB R4, 163116 163132: HALT ERR2:: 163134: MOV (SP), R3 ; абсолютный No сектора. 163136: SUB R0, R3 ; относительный No сектора на дорожке. 163140: SUB #000120, R4 ; (-No) нужной дорожки. 163144: ADD @#004000, R4 163150: BEQ 163204 163152: MOV #000030, R0 163156: SUB R4, @#004000 163162: TST R4 163164: BPL 163174 163166: MOV #000070, R0 163172: NEG R4 163174: CALL @#163256 163200: SOB R4, 163174 163202: BR 163064 ; 163204: INC R3 163206: MOV #003750, R5 163212: ADD #000202, R5 163216: SOB R3, 163212 163220: MOV #000100, R4 163224: MOV (SP)+, R3 163226: MOV (SP)+, R2 163230: MOV (R5)+, (R2)+ 163232: DEC (SP) 163234: BEQ 163250 163236: SOB R4, 163230 163240: INC R3 163242: MOV R2, -(SP) 163244: MOV R3, -(SP) 163246: BR 163104 163250: TST (SP)+ 163252: MOV (SP)+, R0 163254: RETURN ; ; Подготовка и запуск операции; R0 = операция .SCOM: 163256: MOV #177106, R5 163262: MOV #000006, R2 163266: CLR (R5) 163270: BIT #000001, (R5) 163274: BNE 163270 163276: SOB R2, 163266 163300: BIS @#004002, R0 163304: MOV R0, -(R5) 163306: TST -(R5) 163310: MOV #000001, -(R5) 163314: RETURN ; ; Чтение секторов; R0 = кол-во секторов, R3 = адрес буфера куда читать .RDTR: 163316: MOV R3, R1 163320: MOV R0, -(SP) 163322: MOV #000012, R4 163326: ADD #000202, R4 163332: SOB R0, 163326 163334: MOV #000010, R0 163340: CALL @#163256 163344: MOV #177102, R2 163350: TSTB (R5) 163352: BPL 163350 163354: MOVB (R2), (R1)+ 163356: SOB R4, 163350 163360: MOV (R5), R0 163362: CLR (R5) ; Окончание операции чтения 163364: BIT #000141, R0 ; RELOAD или OP-FAILED или LOST-DATA ? 163370: BEQ 163374 ; Нет => переходим 163374: ADD #000012, R3 163400: MOV #000100, R0 163404: CLR R2 ; Начинаем считать контрольную сумму 163406: MOVB @#004007, R4 ; Берём байт для ксорирования 163412: MOV @#004012, R5 ; Берём слово для ксорирования 163416: COM R5 ; инвертируем слово для ксорирования 163420: CLC 163422: XOR R4, (R3) 163424: XOR R5, (R3) 163426: ROL R4 163430: ROR R5 163432: ROL R0 163434: MOVB (R3)+, R1 163436: ADD R1, R2 ; Добавляем к сумме 163440: MOVB (R3)+, R1 163442: ADD R1, R2 ; Добавляем к сумме 163444: ASR R0 163446: SOB R0, 163422 163450: CMP R2, (R3)+ 163452: BEQ 163456 163454: HALT ; Выход в Пульт 163456: DEC (SP) 163460: BNE 163400 163462: TST (SP)+ 163464: RETURN ; ==== Эмуляция дисплея - см. TTIO.MAC =============================================== ; MODE3 - Переключение моды HALT-монитора. 163466: MOVB #000003, @#170006 ; Запрещение прерываний 163474: CALL @(SP)+ 163476: CLRB @#170006 ; Разрешение прерываний 163502: RETURN ; ; SYSLIN - Вывод служебной строки. 163504: CALL @#163466 ; MODE3 163510: MOV R0, -(SP) 163512: MOV R1, -(SP) 163514: MOV #177772, R0 ; POSITN 163520: MOV (R0), -(SP) ; сохранить позицию, 163522: MOV -(R0), -(SP) ; AR2,RGMOUT 163524: MOV 000012(SP), R1 ; параметр. 163530: CMP (R0)+, (R1)+ ; R0=@POSITN 163532: MOV (R1), R1 ; R1=@STRING 163534: MOVB (R1)+, (R0)+ ; POSITN+1 163536: CLRB (R0)+ ; POS+2 163540: ADD #176000, -(R0) ; POS 163544: CLR -(R0) ; AR2,RGMOUT=0 163546: BIS #000010, -(R0) ; RGMIOT - вывод сл.строки. 163552: CMP @#177772, #176060 ; CMP POSITN,#BEG.SL+LENGHT 163560: BGE 163574 ; выход за пределы. 163562: MOVB (R1)+, R0 ; Получаем следующий символ 163564: BEQ 163700 ; конец строки. 163566: CALL @#163726 ; SYSOUT Вывод символа на экран 163572: BR 163552 163574: MOV R1, -(SP) 163576: MOV #162702, R5 163602: MOV @#167776, R3 163606: CALL @#162236 163612: MOV (SP)+, R1 163614: MOV (R4), R3 163616: INC @#177772 163622: MOV #000004, R2 163626: BIC #102777, R3 163632: BEQ 163700 163634: ROL R3 163636: COM R3 163640: BIC #007777, R3 163644: BEQ 163650 163650: MOVB (R1)+, R0 ; Получаем следующий символ 163652: CALL @#163726 ; SYSOUT Вывод символа на экран 163656: SOB R2, 163650 163660: TST R3 163662: BEQ 163700 163700: MOV #177766, R0 ; Адрес Режим дисплея 163704: BIC #000010, (R0)+ 163710: MOV (SP)+, (R0)+ 163712: MOV (SP)+, (R0)+ 163714: MOV (SP)+, R1 163716: MOV (SP)+, R0 163720: RETURN ; ; Программа вывода символов на экран ; TT.OUT Вывод символа на экран с переключением моды; мл.байт R0 = символ 163722: CALL @#163466 ; MODE3 ; SYSOUT - Системный вывод - вывод символа R0 на экран 163726: MOV SP, @#177642 163732: MOV #177642, SP 163736: BIS #000001, @#177574 ; Включаем экран в основную память 163744: CALL @177774 ; Вызов процедуры вывода символа 163750: BIC #000001, @#177574 ; Отключаем экран от основной памяти 163756: MOV (SP), SP 163760: RETURN ; SETCRS - Прямая адресация курсора. 163762: MOV #177772, R4 163766: SUB #000040, R5 163772: BPL 163776 163774: CLR R5 163776: DECB @#177770 164002: BEQ 164026 164004: CMP R5, #000027 ; 23. = макс. номер строки. 164010: BHI 164360 164012: MUL R5, #001200 ; вычислить отн.адрес. 164016: BIC #177700, (R4) 164022: BIS R5, (R4) 164024: BR 164360 164026: CMP R5, #000077 ; макс. номер позиции. 164032: BHI 164360 164034: BIC #000077, (R4) 164040: BR 164022 ; Стандартная п/п вывода символа, ставится по умолчанию в 177774 SYMGEN ; MODOUT - Вывод символов режиме переключения памяти. 164042: MOV R0, -(SP) 164044: MOV R1, -(SP) 164046: MOV R2, -(SP) 164050: MOV R3, -(SP) 164052: MOV R4, -(SP) 164054: MOV R5, -(SP) 164056: CALL @#165206 ; CURSOR: Убрать курсор если он виден 164062: MOV 000012(SP), R5 164066: BIC #177400, R5 164072: MOV #000100, R1 164076: MOV #177770, R2 ; Адрес SIZE 164102: TSTB (R2) ; авторегистр ? 164104: BPL 164136 164106: CLRB (R2) 164110: CMP R5, #000131 ; коды командных последова- 164114: BEQ 164354 ; тельностей VT-52 164116: CMP R5, #000113 164122: BHI 164360 164124: SUB R1, R5 164126: BMI 164360 164130: MOVB 165310(R5), R4 164134: BR 164340 164136: BNE 163762 ; АР2>0 --> прям.адр.курсора. 164140: MOVB @#177766, R4 ; Режим дисплея VT52 или Немига ? 164144: BPL 164176 ; Немига. 164146: CLR @#177762 164152: CLR @#177764 164156: ROLB R5 164160: CLC 164162: BPL 164174 ; не буква. 164164: BITB #000040, R4 164170: BEQ 164174 ; латинский регистр. 164172: SEC ; русская. 164174: RORB R5 164176: CMP R5, #000040 164202: BLO 164302 ; не отображаемый символ. VISI: 164204: ROLB R5 164206: BPL 164212 164210: BIC R1, R5 164212: BHIS 164216 164214: BIS R1, R5 164216: ASR R5 164220: ADD #002000, R3 ; абсол. адрес позиции. 164224: ASL R3 164226: SUB #000040, R5 164232: MUL R5, #000012 164236: ADD #166064, R5 ; адрес матрицы в знакогенераторе. 164242: MOV #000012, R4 ; 10. кол-во линий. 164246: ASL R1 LOOP: 164250: MOVB (R5), R2 ; линия матрицы символа. 164252: SWAB R2 164254: CLRB R2 164256: BISB (R5)+, R2 ; в обоих байтах: 3/3 яркости. 164260: BIC @#177764, R2 ; код яркости. 164264: MOV @#177762, R0 ; инверсия. 164270: XOR R0, R2 164272: MOV R2, (R3) 164274: ADD R1, R3 164276: SOB R4, 164250 164300: BR 164470 ; STEP смещение курсора. ; Отработка управляющих кодов - символов с кодом меньше #040 164302: MOV #165324, R2 ; T.SYLN - таблица разрешенных кодов. 164306: BITB #000010, R4 ; R4 = RGMIOT 164312: BNE 164324 ; " SYSLIN " 164314: CMP (R2)+, (R2)+ ; "VT-52" 164316: TSTB R4 164320: BMI 164324 164322: CMP (R2)+, (R2)+ ; "NEMIGA" 164324: MOV (R2)+, R0 ; ст.слово. 164326: MOV (R2), R1 ; мл.слово. 164330: ASHC R0, R5 ; сдвинуть до нужного бита. 164332: BPL 164600 ; .OUTT функция разрешена. 164334: MOVB 165250(R5), R4 164340: BIC #177400, R4 ; переход на отработку функции. 164344: ASL R4 164346: MOV #177770, R2 164352: ADD R4, PC ; ..PC.. ;** ключ прямой адрес.курсора. 164354: MOVB #2, (R2) 164360: BR 164600 ; .OUTT ; CL.SL: ;** очистка служ. строки. 164362: CLR R5 164364: MOV #002000, R3 164370: CLR (R5)+ 164372: SOB R3, 164370 164374: BR 164600 ; VT52: ;** переход в режим VT-52 164376: BIC #000400, (R2) 164402: BIS #000200, -(R2) 164406: BR 164600 ; ..AR2:: ;** авторегистр. 164410: BIT #000200, 177776(R2) 164416: BNE 164432 ; CLRRS: ; ВКЛ/ВЫКЛ звука. 164420: MOV #040000, R5 164424: XOR R5, @#177760 164430: BR 164600 ; NOCLR: DECB @R2 ; -1 - ключ авторегистра. 164432: DECB (R2) 164434: BR 164600 ; RRGM: ;** сброс режимов вывода. 164436: CLR (R2) 164440: TST -(R2) 164442: CLR -(R2) ; M.BIC = 0 164444: CLR -(R2) ; M.XOR = 0 164446: BR 164600 ; SRGM: ;** установка режима вывода. 164450: COMB 177760(R5) 164454: BR 164600 ; IC: ;** ВКЛ/ВЫКЛ курсора. 164456: MOV #000200, R5 ; ROLLON: ;** ВКЛ/ВЫКЛ ролика. 164462: SWAB R5 164464: XOR R5, (R2) 164466: BR 164600 ; STEP: ;** шаг вправо. 164470: MOV #177772, R2 ; Текущая позиция курсора 164474: INC (R2) ; Следующая позиция 164476: MOV (R2), R3 ; R3=POSITN 164500: MOV R3, R4 164502: BIC #177700, R4 ; Позиция в пределах строки 164506: BNE 164600 ; LF: ;** LINE FEED - перевод строки. 164516: ADD #001200, R3 164522: CMP R3, #034700 ; конец строки ? 164526: BLO 164606 164600: BR 165116 ; ??? 164602: BIC #000077, R3 ; на первую позицию. 164606: MOV R3, @#177772 164612: BR 165116 ; HT: ;** горизонтальная табуляция. 164614: MOV R3, R4 164616: BIC #177700, R4 164622: CMP R4, #000077 ; табуляция невозможна. 164626: BHIS 165116 164630: ADD #000010, R3 164634: BIC #000007, R3 164640: BR 164606 ; R.RUS ; ** русский регистр. 164642: BIS #000040, -(R2) 164646: BR 165116 ; R.LAT ; ** латинский регистр. 164650: BIC #000040, -(R2) 164654: BR 165116 ; NEMIGA ; ** переход в режим "Немига". 164656: BIC #177600, -(R2) 164662: BR 165116 164664: ADD #000200, R3 164670: SUB #000100, R3 164674: BMI 164664 164676: CMP R3, #034700 164702: BHIS 164670 164704: BR 164714 164706: SUB #001200, R3 164712: BMI 165116 164714: MOV R3, @#177772 164720: BR 165116 164722: ADD #001200, R3 164726: CMP R3, #034700 164732: BHIS 165116 164734: BR 164714 164736: INC R3 164740: MOV R3, R4 164742: BIC #177700, R4 164746: BEQ 165116 164750: BR 164714 164752: CLR R3 164754: BR 164714 164756: SUB #001200, R3 164762: BPL 164714 ; Скроллинг экрана 164764: MOV #100000, R5 ; Адрес куда копировать 164770: MOV #075400, R3 ; Адрес откуда копировать 164774: MOV #034600, R2 ; Сколько слов копировать 165000: MOV -(R3), -(R5) ; копируем слово 165002: SOB R2, 165000 ; повторяем ; Очистка строки 165004: MOV #001200, R2 ; Сколько слов очищать 165010: CLR (R3)+ ; стираем слово 165012: SOB R2, 165010 ; повторяем 165014: BR 165116 ; => к завершению обработки символа ; COD7:: ;** звук. 165016: BITB #000100, @#177761 ; Проверяем байт блокировки SOUND 165024: BNE 165116 ; => к завершению обработки символа 165026: CALL @#160126 ; SOUND 165032: BR 165116 ; => к завершению обработки символа 165034: DW 165036 ; адрес мелодии 165036: DB 001, 205, 017, 000 ; .COD7 - мелодия ; DELL: ;** стирание строки от позиции курсора. 165042: CALL @#165140 ; Очистка строки от текущей позиции до конца строки 165046: BR 165116 ; => к завершению обработки символа ; DELS: ;** стирание кадра от позиции курсора. 165050: CALL @#165140 ; Очистка строки от текущей позиции до конца строки 165054: BIC #000077, R3 165060: MOV R3, R5 165062: ADD #002000, R5 165066: BMI 165116 ; => к завершению обработки символа 165070: BR 165106 ; ES: ;** очистка экрана. 165072: CLR R5 165074: BR 165102 ; => EES ; FF: ;** FORM FEED - очистка кадра. 165076: MOV #002000, R5 165102: CLR @#177772 165106: ASL R5 165110: CLR (R5)+ 165112: TST R5 165114: BPL 165110 ; +??? ; OUTT - Завершение обработки символа 165116: CALL @#165206 ; Восстановление курсора 165122: MOV (SP)+, R5 165124: MOV (SP)+, R4 165126: MOV (SP)+, R3 165130: MOV (SP)+, R2 165132: MOV (SP)+, R1 165134: MOV (SP)+, R0 165136: RETURN ; Очистка строки от текущей позиции до конца строки ; DL: ; удаление части строки. 165140: MOV #000012, R2 ; 10. итераций 165144: MOV R3, R5 165146: MOV #000100, R4 ; 64. позиции в строке 165152: BIC #177700, R5 165156: SUB R5, R4 165160: BLE 165176 165162: MOV R3, R5 165164: ADD #002000, R5 ; Начало основной части экрана 165170: ASL R5 165172: CLR (R5)+ ; стираем слово 165174: SOB R4, 165172 ; повторяем 165176: ADD #000100, R3 ; к следующей пиксельной строке 165202: SOB R2, 165144 ; продолжаем цикл 165204: RETURN ; ; CURSOR - гашение/засветка курсора. 165206: MOV @#177772, R3 ; Место курсора от начала ГЗУ 165212: BMI 165246 165214: TSTB @#177771 ; Состояние курсора?? 165220: BMI 165246 165222: TST @#177756 ; Счётчик мигания курсора 165226: BPL 165246 ; не виден => не нужно убирать 165230: MOV R3, R4 165232: ADD @#177746, R4 ; + адрес 25-й строки экрана 165236: BMI 165246 165240: ROL R4 165242: BMI 165246 165244: COM (R4) ; Инвертируем восемь пикселей - курсор 165246: RETURN ; Таблицы смещений программ обработки управл. кодов. ; TABL - Таблица смещений переходов для обработки спецсимволов 165250: DB 261, 043, 036, 036, 036, 036, 031, 221 ; 00..07 165260: DB 105, 120, 061, 233, 251, 113, 133, 136 ; 10..17 165270: DB 000, 247, 155, 144, 146, 177, 163, 011 ; 20..27 165300: DB 041, 171, 105, 016, 201, 061, 003, 236 ; 30..37 ; TAR2 - Таблица смещений переходов для обработки символов ESC + 100..113 165310: DB 141, 155, 163, 171, 105, 261, 022, 261 ; 100..107 165320: DB 177, 201, 236, 233 ; Таблицы разрешенных кодов. T.SYLN: .WORD ^B0011111011000011,^B0000000000000010 T.VT52: .WORD ^B0000001111101111,^B0000000010010010 ; 0-17,20-37 T.NEMG: .WORD ^B1111111111111100,^B1111111111111111 ; ==== Графические примитивы - см. GRAF.MAC ========================================== ; ; Рисование линии из точки с координатами (XOLD,YOLD) ; в точку с координатами (X2,Y2). После выполнения операции: ; XOLD=X2,YOLD=Y2. ; DRAW BRIGHT,X2,Y2 [,XOLD,YOLD] ; Точка входа QDRAW - DRAW для QUASIC 165340: MOV (SP), R5 ; Точка входа FDRAW - DRAW для FORTRAN 165342: CALL @#166040 ; Точка входа DRAW - нарисовать линию из (XOLD,YOLD) в (XNEW,YNEW) ; После выполнения операции XNEW=XOLD, YNEW=YOLD. 165346: CALL @#165376 165352: MOV @#000212, @#000216 ; XNEW -> XOLD 165360: MOV @#000214, @#000220 ; YNEW -> YOLD 165366: RETURN ; ; Рисование линии из точки (X2,Y2) в точку (X1,Y1) ; LINE BRIGHT [,X1 [,Y1 [,X2 [,Y2]]]] ; Точка входа QLINE - LINE для QAUSIC 165370: MOV (SP), R5 ; Точка входа FLINE - LINE для FORTRAN 165372: CALL @#166040 ; Точка входа LINE - нарисовать линию из (XOLD,YOLD) в (XNEW,YNEW) 165376: MOV #000212, R5 ; Адрес XNEW 165402: MOV (R5)+, R0 ; X NEW 165404: MOV (R5)+, R1 ; Y NEW 165406: MOV (R5)+, R2 ; X OLD 165410: MOV (R5)+, R3 ; Y OLD 165412: CLR @#000204 ; реверс: меньше или больше П/4. 165416: MOV #1, R4 165422: MOV R4, R5 165424: SUB R2, R0 ; DELTA X= XN-XO 165426: BPL 165434 165430: NEG R0 ; модуль приращения DX 165432: NEG R5 ; знак DX +/-1 165434: SUB R3, R1 ; DELTA Y=YN-YO 165436: BPL 165444 165440: NEG R1 ; модуль DY 165442: NEG R4 ; SIGN DY +/-1 165444: CMP R0, R1 ; IF DX<DY THEN 165446: BGE 165476 ; реверс : 165450: MOV R0, -(SP) 165452: MOV R1, R0 165454: MOV (SP), R1 ; DX <-> DY 165456: MOV R4, (SP) 165460: MOV R5, R4 165462: MOV (SP), R5 ; SX <-> SY 165464: MOV R2, (SP) 165466: MOV R3, R2 165470: MOV (SP)+, R3 ; XO <-> YO 165472: INC @#000204 ; флаг реверса. 165476: TST R0 ; IF DX=0 165500: BEQ 165544 ; THEN DY=0 - единственная точка. 165502: ASL R1 ; 2DY 165504: MOV R0, -(SP) 165506: ASL (SP) ; 2DX 165510: MOV R1, -(SP) 165512: SUB R0, (SP) ; 2DY-2DX=D - флаг наклона. 165514: CALL @#165544 ; вывод точки. 165520: TST (SP) 165522: BMI 165532 165524: SUB 000002(SP), (SP) ; D=D-2DX 165530: ADD R4, R3 ; YO=YO+SY 165532: ADD R1, (SP) ; D=D+2DY 165534: ADD R5, R2 ; XO=XO+SX 165536: SOB R0, 165514 ; счетчик=DX 165540: CMP (SP)+, (SP)+ ; восстановить стек. 165542: RETURN ; OUT - вывод точки 165544: MOV R1, -(SP) 165546: MOV R2, -(SP) 165550: MOV R3, -(SP) 165552: TST @#000204 ; реверс ? 165556: BEQ 165564 165560: MOV R2, R3 ; восстановить X,Y 165562: MOV (SP), R2 165564: CALL @#165616 ; записать точку. 165570: MOV (SP)+, R3 165572: MOV (SP)+, R2 165574: MOV (SP)+, R1 165576: RETURN ; ; Нарисовать точку. ; POINT BRIGHT [,X [,Y]] ; Точка входа QPOINT - POINT для QUASIC 165600: MOV (SP), R5 ; Точка входа FPOINT - POINT для FORTRAN 165602: CALL @#166040 ; Точка входа POINT - нарисовать точку 165606: MOV @#000212, R2 165612: MOV @#000214, R3 165616: CALL @#163466 ; MODE3 165622: CALL @#165750 ; Находим точку на экране 165626: BLO 165660 165630: TST (R1)+ 165632: MOV @#000210, R2 ; BRIGHT 165636: ASR R2 165640: BLO 165650 165642: BIC R3, @#177570 ; Пишем в экран 165646: BR 165654 165650: BIS R3, @#177570 ; Пишем в экран 165654: SWAB R3 165656: SOB R1, 165636 165660: RETURN ; ; Чтение яркости точки с координатами (X,Y) ; RPOINT BRIGHT,X,Y ; Точка входа QRPOIN - RPOINT для QUASIC 165662: MOV (SP), R5 ; Точка входа FRPOIN - RPOINT для FORTRAN 165664: CALL @#166040 165670: BR 165676 ; Точка входа RPOINT - прочитать яркость точки 165672: MOV #000210, R4 ; адрес кода яркости. 165676: MOV @#000212, R2 ; XNEW 165702: MOV @#000214, R3 ; YNEW 165706: CLR (R4) 165710: CALL @#163466 ; MODE3 165714: CALL @#165750 ; Находим точку на экране 165720: BLO 165744 165722: MOV #000002, R1 165726: SWAB R3 ; чтение яркости. 165730: BIT R3, @#177570 165734: BEQ 165740 165736: ADD R1, (R4) 165740: SOB R1, 165726 165742: RETURN 165744: DEC (R4) ; яркость -1 -- за экраном. 165746: RETURN ; COORD - Нахождение точки на экране; устанавливает адрес, возвращает маску в R3 165750: MOV R2, R1 165752: CMP #000777, R2 165756: BLO 166036 165760: ASH R2, #177775 165764: CMP #000377, R3 165770: BLO 166036 165772: CMP @#000206, R3 ; Сравниваем с VFORM 165776: BLO 166036 166000: COMB R3 166002: SWAB R3 166004: SEC 166006: ROR R3 166010: ASR R3 166012: BIS R3, R2 166014: MOV R2, @#177572 ; Устанавливаем косвенный адрес 166020: BIC #177770, R1 166024: INC R1 166026: CLR R3 166030: SEC 166032: ROR R3 166034: SOB R1, 166032 166036: RETURN ; FORT - Подготовка перед вызовом для FORTRAN 166040: MOV (R5)+, R0 ; число параметров. 166042: MOV (R5), R4 ; адрес яркости. 166044: BIC #177770, R0 166050: BEQ 166062 166052: MOV #000210, R3 ; внутренние значения. 166056: MOV @(R5)+, (R3)+ ; область заполнения. 166060: SOB R0, 166056 166062: RETURN ; ; ==== Стандартный знакогенератор - см. SYMG.MAC ==== 166064: DB ; Знакогенератор, 96 символов (0x20..0x80), 10 байт/символ ; ==== Регистры ==== 170000: DW ; Используется м/с умножителя 170002: DW ; Используется м/с умножителя 170004: DW ; Используется м/с умножителя 170006: DW ; Регистр данных клавиатуры / фиксации HALT запросов 170010: DW ; Регистр состояния адаптера локальной сети 170012: DW ; Регистр данных адаптера локальной сети 170014: DW ; ?? 170020: DW ; RgStSnd - регистр состояния таймера 170022: DW ; RgF - регистр частоты 170024: DW ; RgLength - регистр длительности 170026: DW ; RgOn - включение звука (обращение) 170030: DW ; RgOct - регистр октавы и громкости 170032: DW ; RgOff - выключение звука (обращение) 177100: DW ; RgStat - регистр состояния контроллера дисковода 177102: DW ; RgData - регистр данных 177104: DW ; RgCntrl - регистр управления 177106: DW ; RgTime - регистр таймера контроллера дисковода 177514: DW ; Регистр данных устройства сопряжения 177516: DW ; Регистр состояния усройства сопряжения 177560: DW ; KBS - регистр состояния клавиатуры 177562: DW ; KBD - регистр данных клавиатуры 177564: DW ; TTS - регистр состояния дисплея 177566: DW ; TTD - регистр данных дисплея 177570: DW ; VDATA - регистр данных косвенного доступа 177572: DW ; VADDR - регистр адреса косвенного доступа 177574: DW ; Регистр управления; бит 0 - маппинг видеопамяти на нижнюю память ; ==== Блок переменных ==== 177720: DW ; R0 при останове 177722: DW ; R1 при останове 177724: DW ; R2 при останове 177726: DW ; R3 при останове 177730: DW ; R4 при останове 177732: DW ; R5 при останове 177734: DW ; SP при останове 177736: DW ; PC при останове 177740: DW ; PSW при останове 177744: DW ; Нижняя граница памяти доступной для команд пульта 177746: DW ; Значение #003100 - адрес 25-й строки экрана 177750: DW ; Адрес начала мелодии 177752: DW ; Адрес продолжения мелодии 177754: DW ; Адрес подпрограммы SOUND 177756: DB ; Счётчик мигания курсора 177757: DB ; Состояние курсора: 000 - не виден, 377 - виден 177760: DB ; Счётчик мелодии 177761: DB ; Байт блокировки вызова SOUND ; бит7 = мелодия играет ; бит6 = звук выключен 177762: DW ; FRG Маска фона для вывода символа (M.XOR) 177764: DW ; COL Маска гашения символа перед выводом (M.BIC) 177766: DB ; Режим дисплея ; bit0 - запрос от клавиатуры, прерывание по вектору 000064 ; bit3 - работа со служебной строкой ; bit4 - работа с цветом в режиме VT52 ; bit5 - русский регистр вывода ; bit6 - русский регистр ввода ; bit7 - режим эмуляции VT52 177767: DB ; Буферная ячейка клавиатуры 177770: DW ; SIZE Размер экрана в байтах, начиная от начала ГЗУ 177772: DW ; CUR Место курсора от начала ГЗУ 177774: DW ; SYGEN Адрес подпрограммы вывода символа, по умолчанию 163674 177776: DW ; Значение #056364