Это же бубль-гум! В MSX (если не ошибаюсь, я еще не дошел) мапперы и строили на таких.
- - - Добавлено - - -
По поводу как конфигурировать на лету, это задача для энтузиастов. И потребует думаю какой-то доли рассыппухи.
Вид для печати
Это же бубль-гум! В MSX (если не ошибаюсь, я еще не дошел) мапперы и строили на таких.
- - - Добавлено - - -
По поводу как конфигурировать на лету, это задача для энтузиастов. И потребует думаю какой-то доли рассыппухи.
Именно! Причем исключительной элегантности красота при своей простоте.
Ну тут нужно как то компромисс найти. Иначе может получится, что регистров маппера будет больше чем ячеек ОЗУ :D
А маппер тоже как-то адресовать нужно. ИР26 - это регистровый файл 4х4, другими словами две ИР26 - это четыре 8-ми битных регистра.
В MSX эта вся ерунда наращивается каскадно: слоты-субслоты-маппер(ы). И "в теле такая приятная гибкость образовалась" :)
Сподобился я тоже, и запилил тестовый стенд из платы принтера СМ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 ; ПЕРЕДАТЧИК ДАННЫХ ГОТОВ
[свернуть]
Всё не читал, но видел что была дискуссия по поводу вывода на ВГ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... не совсем, как по мне.))
С побился поюзать в ВГ75 в 80Г.. Видимо мой детский мозг отверг этот чудный девайс:)
Есть исходник, по нему можно понять что-куда. Схема не сохранилась, но могу объяснить на пальцах.) Нужно?
Хотя смотрю, сейчас люди делают терминал на одной меге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). Простенько, никаких движущихся частей.))