Это же бубль-гум! В MSX (если не ошибаюсь, я еще не дошел) мапперы и строили на таких.
- - - Добавлено - - -
По поводу как конфигурировать на лету, это задача для энтузиастов. И потребует думаю какой-то доли рассыппухи.
Это же бубль-гум! В MSX (если не ошибаюсь, я еще не дошел) мапперы и строили на таких.
- - - Добавлено - - -
По поводу как конфигурировать на лету, это задача для энтузиастов. И потребует думаю какой-то доли рассыппухи.
Электроника КР-02, MSX YIS-503IIR, Орион-128, Ленинград-2, Pentagon-128k, MSX2 YIS-503IIIR, MSX-EXT, ...
Именно! Причем исключительной элегантности красота при своей простоте.
Ну тут нужно как то компромисс найти. Иначе может получится, что регистров маппера будет больше чем ячеек ОЗУ
А маппер тоже как-то адресовать нужно. ИР26 - это регистровый файл 4х4, другими словами две ИР26 - это четыре 8-ми битных регистра.
В MSX эта вся ерунда наращивается каскадно: слоты-субслоты-маппер(ы). И "в теле такая приятная гибкость образовалась"
Последний раз редактировалось TomaTLAB; 03.08.2017 в 01:17.
Сподобился я тоже, и запилил тестовый стенд из платы принтера СМ6337, там и ВН59 и ВИ53 наличествует.
Погонял Ваши примеры и убедился, что и без прерываний, и с прерываниями в том виде как у Вас (с поправкой на мое железо), ожидаемо давится и не может прожевать поток символов. Нужен буфер. И основная Ваша ошибка, что долго "сидите" в обработчике прерывания.
Так нельзя делать, попав в прерывание нужно максимально быстро сделать необходимый минимум и выметаться оттудова.
В проекте с ВВ51 и клавиатурой, кстати, тоже самое.
Скрытый текст
Ахтунг! Для упрощения буфер обязательно должен быть выровнен по границе 256 байт.
Ну и никаких проверок переполнения и т.п. нет.
Код:include "8085.inc" ; ПРОГРАММА НАСТРОЙКИ И ПРОВЕРКИ УСАПП ВВ51А ; ;_______ВЕКТОРА ПРЕРЫВАНИЙ____________________________ org 00h ;int0 он же reset DI jmp INIT org 04h ret nop nop nop org 08h ret nop nop nop org 0Ch ret nop nop nop org 10h ret nop nop nop org 14h ret nop nop nop org 18h ;вектор int6 UART'a jmp RXD_INT nop org 1Ch ret nop nop nop org 20h INIT: ;_______УСТАНОВКА СТЕКА____________________________ LXI SP, RAMTOP ;_______УСТАНОВКА КОНТРОЛЛЕРА ПРЕРЫВАНИЙ____________________________ MVI A, 00010110b ; (СКИ1) ICW1 = addr000xxxxx, edge, x4, single, no ICW4 ; таблица векторов пока прибита гвоздями в ПЗУ OUT PICa0 MVI A, 00000000b ; (СКИ2) ICW2 = addr00000000 OUT PICa1 MVI A, 10111111b ; (СКО1) OCW1 = mask OUT PICa1 ;_______УСТАНОВКА ТАЙМЕРА____________________________ MVI A, 00111110b ; Chanel 0, LSB then MSB, mode 3, Binary OUT TIM2CMD MVI A, 2000000 / 16 / 9600 ; Divider LSB (2Mhz / 16 / 9600) OUT TIM2C0 MVI A, 0 ; Divider MSB OUT TIM2C0 ;_______УСТАНОВКА_УСАПП_В_ИСХ._СОСТОЯНИЕ________ MVI A, 01H OUT CW51 OUT CW51 MVI A, IR OUT CW51 ;_______ЗАПИСЫВАЕМ_ИНСТРУКЦИЮ_РЕЖИМА____________ MVI A, 01001110b ;4Eh = 1stop, no parity, no control, 8 bit, 16x OUT CW51 ;_______ЗАПИСЫВАЕМ ИНСТРУКЦИЮ КОМАНДЫ___________ MVI A, TXEN+DTR+RXE+RTS OUT CW51 ;_______Обнуляем счетчик и указатель приемника___________ xra A sta RXCNT sta RXPNT ei ;*********************************************************** ; Основной цикл ;*********************************************************** LOOP: CALL RXD ;получаем в акк символ из буфера или перенос jc LOOP ;перенос? - буфер пуст CALL TXD ;возвращаем символ обратно cpi "@" ;спецсимвол? jz LOOP1 MVI A,"#" ;выводим символ квитанции CALL TXD JMP LOOP LOOP1: lxi H, MSG ;в HL адрес сообщения call TXHL ;выводим сообщ по HL call PR_MSG ;выводим сообщение следующее непосредственно за db "QWERTY",0 jmp LOOP ;*********************************************************** ; ПОДПРОГРАММА ПЕРЕДАЧИ БАЙТА ИЗ АККУМУЛЯТОРА TXD: push PSW ;_______ЖДЕМ_ГОТОВНОСТИ_________________________ TX1: IN CW51 ANI TXRDY+DSR CPI TXRDY+DSR JNZ TX1 ;_______ПЕРЕДАЕМ_БАЙТ___________________________ pop PSW OUT DAT51 RET ;*********************************************************** ; ПОДПРОГРАММА ПРИЕМА БАЙТА В АККУМУЛЯТОР ; перенос - признак пустого буфера RXD: lda RXCNT ;загружаем позицию приема push B mov B, A lda RXPNT ;загружаем позицию чтения cmp B ;сравниваем pop B stc RZ ;совпало - буфер пуст - выходим с переносом push H mov L, A ;не совпало... mvi H, RXBUF ;в HL позиция чтения буфера inr A ;увеличили sta RXPNT ;обновили mov A, M ;загружаем из буфера cmc pop H ret ;*********************************************************** ; ОБРАБОТЧИК ПРЕРЫВАНИЯ RXD RXD_INT: di push PSW push H lda RXCNT ;загружаем текущую позицию mov L, A mvi H, RXBUF ;в HL позиция буфера inr A ;увеличиваем sta RXCNT ;обновляем in DAT51 ;читаем принятый байт mov M, A ;заносим в буфер mvi A, 00100000b ; СКО2а обычный конец прерывания out PICa0 pop H pop PSW ei ret ;*********************************************************** ; п/п вывода сообщения размещенного сразу после комманды "CALL PR_MSG" ; вход: [PC]-адрес начала сообщения ; выход: [PC]-адрес начала кода продолжения программы PR_MSG: pop H call TXHL ; вызов п/п вывода строки по [HL] pchl ; equivalent folowing 2 commands: ;PUSH H ;RET ;*********************************************************** ; ПОДПРОГРАММА ПЕРЕДАЧИ Z-ended строки по [HL] TXHL: mov A, M inx H ;увеличиваем HL перед проверкой для корректного возврата из PR_MSG ora A ;проверка на конец строки rz call TXD jmp TXHL ;*********************************************************** MSG: db "ASDFH",0 ;_____________ВНЕШНИЕ МЕТКИ И КОНСТАНТЫ_______ RAMTOP = 77FFH ; Верхушка стека RXCNT = 6000H ; Счетчик принятых символов RXPNT = 6001H ; Указатель буфера RXBUF = 61H ; MSB адреса буфера приемника ; ;___АДРЕСА_РЕГИСТРОВ_УСАПП______________________ DAT51 = 48H ; РЕГИСТР ДАННЫХ CW51 = 49H ; РЕГИСТР КОМАНД ;___АДРЕСА_РЕГИСТРОВ_ТАЙМЕРОВ______________________ TIM1C0 = 50H ; Timer c0 TIM1C1 = 51H ; Timer c1 TIM1C2 = 52H ; Timer c2 TIM1CMD = 53H ; Timer cmd TIM2C0 = 58H ; Timer c0 TIM2C1 = 59H ; Timer c1 TIM2C2 = 5AH ; Timer c2 TIM2CMD = 5BH ; Timer cmd ;___АДРЕСА_РЕГИСТРОВ_КОНТРОЛЛЕРА_ПРЕРЫВАНИЙ_____ PICa0 = 78H ; PICa1 = 79H ; ; ;___КОМАНДЫ ВВ51________________________________ TXEN = 01H ; ПЕРЕДАТЧИК ВКЛЮЧЕН DTR = 02H ; УСТРОЙСТВО ГОТОВО RXE = 04H ; ПРИЕМНИК ВКЛЮЧЕН SBRK = 08H ; ПРЕРЫВАНИЕ ПЕРЕДАЧИ ER = 10H ; СБРОС ОШИБОК ПРИЕМА RTS = 20H ; ПЕРЕДАЧА РАЗРЕШЕНА IR = 40H ; ПРОГР. СБРОС УСАПП EH = 80H ; РАЗРЕШЕНИЕ ПОИСКА СИНХРОСИМВОЛА ; ;__РЕГИСТР СОСТОЯНИЯ ВВ51_______________________ TXRDY = 01H ; ПЕРЕДАТЧИК ГОТОВ RXRDY = 02H ; ПРИЕМНИК ГОТОВ TXE = 04H ; ПЕРЕДАЧА ЗАКОНЧЕНА PE = 08H ; ОШИБКА ЧЕТНОСТИ OE = 10H ; ПЕРЕПОЛНЕНИЕ ПРИЕМНИКА FE = 20H ; ОШИБКА ФОРМАТА SYNDET = 40H ; СИНХРОСИМВОЛ НАЙДЕН DSR = 80H ; ПЕРЕДАТЧИК ДАННЫХ ГОТОВ[свернуть]
Последний раз редактировалось TomaTLAB; 13.08.2017 в 02:35.
Всё не читал, но видел что была дискуссия по поводу вывода на ВГ75... В 90-х делал как то эмулятор терминала на нём. Там штук 8 мс кажись всего, 80х25, поддерживалось несколько кодировок (КОИ-8, ALT в т.ч.) - переключение на лету, с клавиатуры. Ну а скроллинг был, ПУЛЯ! Не успевал кнопки жать.)) PC отдыхало.))
Вспоминаю, этот видео-терминал был прикручен к Ленинграду-2 в виде маленкой платки, с FDD контроллером. Что позволяло иметь полноценную CP/M и полноценный Синклер с FDD. И даже что то, кажись, отлаживалось из CP/M в Синклере...
Эх, молодость!
Терминалу и видеокарте на ВГшке вот тут кости мыли http://zx-pk.ru/threads/26455-chto-m...suzhdenie.html
Считаю что для CP/M подходит как нельзя лучше. Ну может несколько громоздко (кстати, без ВТ57!), зато вписывается в ту эпоху.)) А то как то Z80 и PIC24/32... не совсем, как по мне.))
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
С побился поюзать в ВГ75 в 80Г.. Видимо мой детский мозг отверг этот чудный девайс
Электроника КР-02, MSX YIS-503IIR, Орион-128, Ленинград-2, Pentagon-128k, MSX2 YIS-503IIIR, MSX-EXT, ...
Есть исходник, по нему можно понять что-куда. Схема не сохранилась, но могу объяснить на пальцах.) Нужно?
Хотя смотрю, сейчас люди делают терминал на одной меге328. Совсем просто.)
- - - Добавлено - - -
Коль тема о компьютере для CP/M, поделюсь своей реализацией.
Одна платка (в корпусе роутера, ~10х15 см), выпилил из устройства)).
Z80H 8 MHz, 64 RAM (2x 62256), 2x 256 Flash диск (2x AT29c020), RTC (DS12887), 2x RS232 38400 (2x 8251).
Поставил QP/M (та же CP/M 2.2 + RTC). Простенько, никаких движущихся частей.))
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)