nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 29 Mar 2024 08:58



Reply to topic  [ 204 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6 ... 14  Next
Paguo-86PK - XXI BEK 
Author Message
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Ещё раз ! Покажите пожалуйста команду КР580, которая в ваших текстах переключает страницы ПЗУ. И кстати, использование недокументированных команд КР580 это дурной тон, зная, что есть 8085 и Z80.

Зачем Вы придумываете себе проблемы и извращенные методы интерфейса между страницами ПЗУ, затрачивая на это бОльший объём кода и получая надуманный и неудобный интерфейс программ, что пишутся под много банковое ПЗУ. Давно придумали удобный метод вызова подпрограмм с помощью CALL. Зачем изобретать велосипеды?

Т.к сами процедуры остались в банке 0, то всё что надо программе работающей в другой странице это как-то вызвать подпрограмму в странице 0 (там где осталось родное ПЗУ РК86). И для этого новые велосипеды не нужны. Банки переключаются записью номера страницы в какой-то регистр - разумнее всего регистр на ТМ9 адресуемый по F800 (это логично) или, если бюджет не позволяет ТМ9, то можно использовать один из 3-х портов запасного ППА (он в оригинале стоит по адресу A000, но удобнее этот ППА переставить на 8400).

Таким образом как для вызова так и для возврата достаточно обеспечить всего 2 точки перехода. В точке перехода стоит команда OUT (F8),A. После команды OUT следующая команда считывается уже из той банки, что включится. При Z80 проще, у него есть запасные регистры. А при КР580 приходится передавать адрес вызова слегка усложнённо и выглядит запутанно, но суть простая. Просто убогому КР580 не хватает количества регистров и команды LD (nnnn),RR для всех регистровых пар.

Если вызов только из одной страницы (а я сомневаюсь, что вы напишете для РК86 более 2 кб системного кода), то проще (не нужно сохранять N страницы возврата, это всегда страница 1). Но если страниц с кодом килограмм, то надо передавать и N исходной страницы.

Вот как это делали при КР580. Вызываем из страницы 1 стандартную подпрограмму F809 в странице 0 (в странице 0 читается почти стандартное ПЗУ). При сохранениях регистров используется обстоятельство, что в регистре 'B' в стандартные п/п-ммы ничего не передаётся, а в регистре E ничего не возвращается. Потому регистры B и E соответственно используем для временного хранения аккумулятора.

Image


Подавляющему большинству читателей удобнее мнемоника Z80. Людей, которые понимают странную мнемонику, которой Вы пользуетесь, практически не осталось. Очень неудобно в ней изучать тексты.


Last edited by barsik on 18 Jan 2020 09:57, edited 5 times in total.



18 Jan 2020 08:11
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Т.к сами процедуры остались в банке 0, то всё что надо программе работающей в другой странице это как-то вызвать подпрограмму в странице 0 (там где осталось родное ПЗУ РК86).
Пo условию дизайна картриджа я подчеркнул, что чтение F800 отключает страничный режим вообще и родной МОНИТОР работает как ни в чём не бывало… :idea:
barsik wrote:
И для этого новые велосипеды не нужны. Банки переключаются записью номера страницы в какой-то регистр - разумнее всего регистр на ТМ9 адресуемый по F800 (это логично) или, если бюджет не позволяет ТМ9, то можно использовать один из 3-х портов запасного ППА (он в оригинале стоит по адресу A000, но удобнее этот ППА переставить на 8400).
Какой ещё ППА, когда картридж вставляется в панельку РФ2?
Вот дан Вам РАДИО-86РК залитый компаундом намертво и вмазан в стену с телевизором и клавиатурой, но торчит лишь одна панелька с РФ2 - вот с этим и работаем, товарищ! :mrgreen:
barsik wrote:
Таким образом как для вызова так и для возврата достаточно обеспечить всего 2 точки перехода. В точке перехода стоит команда OUT (0F8H),A. После команды OUT следующая команда считывается уже из той банки, что включится.
Тем самым, ничего из этого - не применимо… :roll:

barsik wrote:
Вот как это делали при КР580.

Людей, которые понимают странную мнемонику Вы пользуетесь, практически нет. Очень неудобно изучать тексты на этом странном ассемблере.
Мною разработан был ассемблер, который поддерживал мнемонику i8080 и i8086, и z80 должен был.
Не все пользователи считают мнемонику z80 удачной, кроме как портирования кода с RISC-процессоров (инженеры Zilog этого курса и придерживались). И мнемоника x86 куда приятнее z80.

 "Код мнемоникой i8080"
Code:
     XTHL              ; В стеке уже лежит адрес активации данной страницы,
     DCX  H            ; но его нужно подправить из-за автоинкремента CALL
     XTHL              ; Возвращаем его в стек для последующих вызовов
     CALL API_Fn_Entry ; Теперь спокойно вызываем основной код этой страницы
     INX  SP           ; Так как в стеке хранится адрес активной страницы,
     INX  SP           ; более он нам не нужен
     PUSH PSW          ; Сохраняем PSW
     INX  SP           ; А затем, раскручиваем стек
     INX  SP           ; сначала до адреса вызываемой процедуры
     INX  SP           ; И продолжаем раскручивать до
     INX  SP           ; индексирующего адреса
     XTHL              ; Теперь, зная его,
     MOV  A,M          ; можно активировать нужную страницу,
     XTHL              ; аккуратно вернуть его до последующих вызовов
     DCX  SP           ; А затем долго
     DCX  SP           ; и упорно
     DCX  SP           ; закручиваем стек
     DCX  SP           ; обратно
     POP  PSW          ; Восстанавливаем PSW
     RET
 "Код мнемоникой x86"
Code:
     XCHG BX,[SP]      ; В стеке уже лежит адрес активации данной страницы,
     DEC  BX           ; но его нужно подправить из-за автоинкремента CALL
     XCHG BX,[SP]      ; Возвращаем его в стек для последующих вызовов
     CALL API_Fn_Entry ; Теперь спокойно вызываем основной код этой страницы
     INC  SP           ; Так как в стеке хранится адрес активной страницы,
     INC  SP           ; более он нам не нужен
     PUSH AX           ; Сохраняем PSW
     INC  SP           ; А затем, раскручиваем стек
     INC  SP           ; сначала до адреса вызываемой процедуры
     INC  SP           ; И продолжаем раскручивать до
     INC  SP           ; индексирующего адреса
     XCHG BX,[SP]      ; Теперь, зная его,
     MOV  AL,[BX]      ; можно активировать нужную страницу,
     XCHG BX,[SP]      ; аккуратно вернуть его до последующих вызовов
     DEC  SP           ; А затем долго
     DEC  SP           ; и упорно
     DEC  SP           ; закручиваем стек
     DEC  SP           ; обратно
     POP  AX           ; Восстанавливаем PSW
     RET
Мне удобнее писать именно x86, так как отладчик Visual Studio понимает лишь x86 и он, бесспорно, удобнее всех других. Вот я и написал для РАДИО-86РК эмулятора ассемблер с x86 в код i8080.
(Но кое-где промахнулся и авторам эмуляторов он не подошёл…)

Потому, мне больших трудов стоит писать на родной мнемонике i8080 со всякими XTHL, чем на своей версии ассемблера. И лишь ради уважения к РАДИО-86РК я не пишу на своём x86-варианте.
А Вы предлагаете смотреть вообще в сторону z80-мнемоники, где сплошные LD-LD-EX-LD-EX - RISC-мантры… :D
(Мой эмулятор поддерживает любую мнемонику - x86, i8080 и мог бы сейчас быстро переделать под 6502 (если бы Вы реально хотели этого). Так как эмулятор реконфигурируется шаблоном - нажмите кнопку MATRIX тут и измените команду «MOV» на «RUN» в строке, затем дважды кликните на MATRIX снова - всё перестроится на лету)…
P.S.; Мой вариант 6502-мнемоники в стиле «TAM» вместо «MOV M,A» могу ещё здесь представить… :lol:
 "Вариант 6502-стиля"
Code:
     XZS               ; В стеке уже лежит адрес активации данной страницы,
     DEZ               ; но его нужно подправить из-за автоинкремента CALL
     XZS               ; Возвращаем его в стек для последующих вызовов
     CALL API_Fn_Entry ; Теперь спокойно вызываем основной код этой страницы
     INS               ; Так как в стеке хранится адрес активной страницы,
     INS               ; более он нам не нужен
     PUW               ; Сохраняем PSW
     INS               ; А затем, раскручиваем стек
     INS               ; сначала до адреса вызываемой процедуры
     INS               ; И продолжаем раскручивать до
     INS               ; индексирующего адреса
     XZS               ; Теперь, зная его,
     TMA               ; можно активировать нужную страницу,
     XZS               ; аккуратно вернуть его до последующих вызовов
     DES               ; А затем долго
     DES               ; и упорно
     DES               ; закручиваем стек
     DES               ; обратно
     POW               ; Восстанавливаем PSW
     RET
(Какой самый удобный? Правильно! x86-вариант проверен временем и он дожил до наших дней!)


Last edited by Paguo-86PK on 18 Jan 2020 09:23, edited 1 time in total.



18 Jan 2020 08:48
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
Вот дан Вам Радио-86РК залитый компаундом намертво и вмазан в стену с телевизором и клавиатурой, торчит лишь одна панелька с РФ2 - вот с этим и работаем, товарищ!
Как же тогда банки переключать? На 24-х ногую панельку не выходит сигнал записи в порт переключения страниц. Должны быть и другие сигналы и значит слот картриджа должен быть другим. Например, это конструктивно можно сделать так, как на платах Специалист Экспресс обычно организуют внешний разъём на корпусе.

Там на плате нет системного разъёма и некуда включать дисковод и УФ-прошиватель. Зато там на плате 4 панельки 24 и 28 ног. Из одной такой панельки (куда добавляем сигналы) берём сигналы на разъём ГРПМ загреплённый уже на самом корпусе Специалиста. От этого разъёма ГРПМ на задней стенке корпуса идёт коса, кончающаяся DIP-24/28 разъёмом, который и втыкается в панельку на плате Специалиста. Т.о даже при отсутствии сист.разъёма на плате без пайки можно заменять плату в корпусе (т.к на клавиатуру на плате Экспресс разъём есть).
Paguo-86PK wrote:
В стеке уже лежит адрес активации данной страницы...
Или я тупой или Вы плохо излагаете. Страницы-то как переключаются? Кто и как управляет железом? И что это за железо, которое как-то (без команд OUT) меняет код, что читается в окне F800...FFFF ? В ваших выше приведённых текстах меняются только регистры (грузятся, инкрементируются, декрементируются). Как от этого изменится номер страницы включённой в окне?
Paguo-86PK wrote:
Потому, мне больших трудов стоит.. XTHL
Да, XTHL ещё тот маразм...
Paguo-86PK wrote:
А Вы предлагаете смотреть вообще в сторону Z80-мнемоники
Конечно. За это - не я. За это - весь цивилизованный 8-ми разрядный мир. Всяко лучше та мнемоника при которой напрягать мозг не надо, т.к команда сама сообщает, что она делает.
Paguo-86PK wrote:
Мой вариант... «TAM» вместо «MOV M,A» могу ещё здесь представить…
Зачем это надо? Что на эти мнемоники крутой макроассемблер есть?

Серъёзно, похоже, что Вы всячески старатесь затруднить себе программирование. Работаете без программистских инструментов в голом отладчике, изобретаете более информативные полу-дампы, изобретаете совсем странные мнемоники. TAY применяли в 1974, когда изобретали 6800/6502, чтобы упростить по максимуму ассемблер, не от хорошей жизни.

PS. Раз Вам так сложно организовать меж-страничный интерфейс, то может быть разумно отказаться от страничности в мизерном окне и увеличить окно включения картриджа до 16 кб (С000...FFFF) или хотя бы до 8 кб (E000...FFFF), - тогда и никакие меж-страничные передачи не понадобятся.

PPS. Или наоборот уменьшить окно картриджа до 1 кб - FC00...FFFF. Тогда у ПЗУ останется некоммутируемый участок (F800...FBFF) и вызов стандартных подпрограмм будет непосредственным CALL F8xx, без утомительных хлопот с сохранением данных в регистрах.


Last edited by barsik on 18 Jan 2020 10:13, edited 2 times in total.



18 Jan 2020 09:22
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Как же тогда банки переключать. На панельку не выходит сигнал записи в порт переключения страниц. Значит это конструетивно должно делаться так как на платах Специалист Экспресс организуют внешний разъём на корпусе. Там на плате нет системного разъёма и не куда включать дисковод и УФ-прошиватель. Зато там на плате 4 панельки 24 и 28 ног. Из одной такой панельки (куда добавляем доп.сигналы) берём сигналы на разъём ГРПМ загреплённый уже на самом корпусе Специалиста. И от него идёт коса, кончающаяся DIP-24/28 разъёмом, который и втыкается в панельку на плате Срециалиста. Т.о без разъёма и пайки можно заменять плату в корпусе (т.к на клавиатуру на плате Экспресс разъём есть).
Кaк я уже говорил: Задача в том, чтобы просто выдернуть родной РФ2 и вставить свой модуль в ту панельку. Никаких проводков от ППА кидать не надо :exclaim:
barsik wrote:
Или я тупой или Вы плохо излагаете. Страницы-то как переключаются? Кто и как управляет железом? И что это за железо, что как-то меняет код, что читается в окне F800...FFFF ?
Повторяю: Страницы ПЗУ переключаются чтением особых ячеек. Схему даже нарисовал же выше… :roll:
barsik wrote:
В ваших текстах меняются только регистры (грузятся, инкрементируются, декрементируются). Как от этого изменится номаер страницы включённый в окне?
Они уже переключились, когда процессор читал код команды из F801…F8FF.
Code:
XXXX CD 56 F8 ; Вызов подпрограммы 86-й страницы
F856 FD .. .. ; Процессор читает код команды и чтением выбирает страницу #56₁₆
F857 .. FD .. ; Процессор читает младший байт адреса и выбирается страница #57₁₆
F858 .. .. FD ; Процессор читает старший байт адреса и выбирается страница #58₁₆
FDFD ........ ; Здесь начинает код API страницы №88
Если страничный режим активирован, чтение ячеек F801…F8FF переключает страницы. Если прочитать F800, страничный режим выключается и всё работает в нормальном режиме… :wink:
barsik wrote:
Зачем это надо, что на это крутой макроассемблер есть?

Если не лень:
  1. Скачайте файл матрицы
  2. Запустите эмулятор
  3. Нажмите кнопку «Matrix»
  4. Вставьте туда содержимое скачанного файла
  5. Дважды кликнете на кнопку «Matrix» снова
  6. Нажмите кнопку «≡»
  7. Нажмите «Reset»
  8. Нажмите «Start» (можно и «Trace»)
От графического представления команд логика работы не меняется. И я могу писать код под РАДИО-86РК в любом стиле - инструменты имеются…
Но я - не изверг-извращенец и публикую здесь код именно мнемоникой i8080, чтобы не издеваться ни над кем… :mrgreen:


Attachments:
File comment: Матрица системы команд к эмулятору…
Matrix_i8080_as_6502.zip [2.51 KiB]
Downloaded 231 times


Last edited by Paguo-86PK on 18 Jan 2020 10:31, edited 1 time in total.

18 Jan 2020 10:06
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
Страницы ПЗУ переключаются чтением особых ячеек
Вот теперь понятно, - идея из ленинградского ZX-клона "Хоббит". Там тоже вместо синклеровского ПЗУ, по чтению кода команды из какого-то адреса ZX-ПЗУ автоматически включалось теневое ПЗУ (вроде бы, чтобы клавиатуру с большей матрицей обслуживать, уже не помню точно, т.к знакомился с ним в 1991).

Значит, по CALL F801 попадаем в страницу 1, по CALL F802 попадаем в страницу 2, по CALL F803 попадаем в страницу 3 и так далее... Для реализации схемотехники этой идеи Вы проводками от ППА не обойдётесь. А когда страниц много тут впору ставить микроконтроллер, который содержит транзисторов раз в 100 больше, чем во всём РК86. Чем Вам простое традиционное управление командами OUT процессора не угодило?
Paguo-86PK wrote:
От графического представления команд логика работы не меняется
Логика не меняется, - меняется эффективность труда программиста. Уже давно доказано и в этом убедились десятки тысяч программистов, что переход на мнемонику Z80 повышает эффективность в разы. Почему-то в маш.кодах уже никто не программирует.


Last edited by barsik on 18 Jan 2020 10:42, edited 1 time in total.



18 Jan 2020 10:28
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Значит, по CALL F801 попадаем в страницу 1, по CALL F802 попадаем в страницу 2, по CALL F803 попадаем в страницу 3 и так далее...
Нe совсем так из-за смещения…
Code:
XXXX CD 56 F8 ; Вызов подпрограммы 86-й страницы
F856 FD .. .. ; Процессор читает код команды и чтением выбирает страницу #56₁₆
F857 .. FD .. ; Процессор читает младший байт адреса и выбирается страница #57₁₆
F858 .. .. FD ; Процессор читает старший байт адреса и выбирается страница #58₁₆
FDFD ........ ; Здесь начинает код API страницы №88

barsik wrote:
Paguo-86PK wrote:
Страницы ПЗУ переключаются чтением особых ячеек
Вот теперь понятно, - идея из ленинградского ZX-клона "Хоббит". Там тоже вместо синклеровского ПЗУ, по чтению кода команды из каких-то адресов ПЗУ автоматически включалось теневое ПЗУ (вроде бы, чтобы клавиатуру с большей матрицей обслуживать, уже не помню точно, т.к знакомился с ним в 1991).
Хм… Вoт у Вас опыта больше. Так что и сами знаете все механизмы лучше меня, а я пытался изобрести велосипед, не зная про трюки Хоббита… :roll:
barsik wrote:
Для реализации схемотехники этой идеи Вы проводками от ППА не обойдётесь. А когда страниц много тут впору ставить микроконтроллер, который содержит транзисторов раз в 100 больше, чем во всём РК86. Чем Вам простое традиционное управление командами OUT процессора не угодило?
Нельзя!
Допустим, открылся интернет-кооператив и всем, у кого жив РАДИО-86РК, за цент предлагается купить «Супер-РФ2», которое перевернёт всё на 360°, так как в «Супер-РФ2» имеются все игры, Бейсики, трансляторы и т.д…
Quote:
Заскучали и Ваш паяльник уже не так горяч?
Эврика! Купите «Супер-РФ2-Двадцать-Двадцать»!
Ваша жизнь преобразится! Ваши внуки со своими тупыми смартфонами начнут Вам завидовать!
Внимание! Только сейчас Вы можете заказать «Супер-РФ2-Двадцать-Двадцать» по цене ста центов!
Спешите! Количество товара ограничено!


P.S.: В самой простой реализации в это ПЗУ можно тупо зашить загрузчик, который будет выбирать нужную страницу и тупо считывать оттуда данные в ОЗУ, а потом их запускать там. Получится банальный ROM-DISK в панельке РФ2…


18 Jan 2020 10:40
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Для данной задачи идея хорошая, но чтобы изложить её, не требовалось всё настолько запутывать. И применять байты FD, заполняющие участки в 256 ячеек не требуется. И разбивать подпрограммы по одной на целую страницу не требуется. Чтобы в итоге казалось, что всё настолько сложно, что нужен микроконтроллер. А если подумать, то управление портом за счёт чтения делается реально просто.

Чтобы страницы переключались, не требуется, чтобы это производилось именно процедурой чтения маш.команды. Для управления важно лишь, чтобы было само обращение процессора, т.е совпадение адресов в момент активности DBIN. Можно выделить 16 адресов выше FFF0. Тогда по факту обращения выше FFF0 защёлкиваем в сист.регистре адреса A0...A3 фронтом сигнала /RD. Таким образом не имея сигнала записи получается формирование адресов A11...A14 для ПЗУ 27256.

Где-то по одному, общему во всех страницах, адресу ставим команду LD A,(HL), чтобы использовать это место для перехода в другие страницы в процедуре вызова подпрограмм в других страницах. Перед прогоном этой процедуры вызова п/п-ммы в другой странице в стек заталкиваем адрес вызываемой подпрограммы в вызываемой странице, а в HL загружаем адрес по формуле FFF0 + N_страницы_ПЗУ. В каждой странице на адресе следующем после команды LD A,(HL) стоит команда RET. И эта следующая после LD A,(HL) команда RET будет читаться уже из другой страницы ПЗУ.

Например, чтобы вызвать п/п-мму F809 в банке 0, кидаем в стек число F809, а в регистр HL грузим FFF0+0. Адрес возврат также проще брать из стека, но можно и из двух рабочих ячеек в ОЗУ или даже из ненужной регистровой пары. Расход памяти ПЗУ на такое переключение невелик, нет нужды заполнять поля байтами FD.

Для начала можно отмакетировать с двумя РФ2. Получится ПЗУ с объёмом почти в 4 кб включённое вместо 2-х килобайтового. Для любителей сейчас это представляет лишь спортивный интерес. Для практики обычное управление портом проще и удобнее. А довод про отсутствие пайки проводов при апгрейде может и имел какое-то значение в 80-тые годы для покупателей бытовых ЭВМ в магазинах, но сейчас-то у каждого владельца РК есть паяльник. Вопрос скорее в том, чтобы придумать какую пользу владельцу РК даст его апгрейд по любой схеме.

В Apple-II некоторые режимы управляются командами именно чтения по конкретным адресам. Значение имеет только адрес обращения. Например, если при обращении в некую системную область адрес чётный, то сист.порт переключается в 0, нечётный - в единицу.


Last edited by barsik on 21 Jan 2020 12:43, edited 3 times in total.



18 Jan 2020 13:54
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Для данной задачи идея хорошая, но чтобы изложить ее, не требовалось всё настолько запутывать. И применять байты FD, заполняющие участки в 256 ячеек не требуется. И разбивать подпрограммы по одной на целую страницу не требуется.

Чтобы страницы переключались, не требуется, чтобы это производилось именно процедурой чтения команды. Для переключения важно лишь, чтобы было само обращение процессора, т.е совпадение адресов в момент активности DBIN. Можно выделить 16 адресов выше FFF0. Тогда по факту обращения выше FFF0 защёлкиваем адреса A0...A3 фронтом сигнала /WR. Таким образом не имея сигнала записи получается формирование адресов A11...A14 для ПЗУ 27256.
Тo есть данный вариант наиболее подходящий?

Но под API всё же следует выделить штуки 62 «FD» до F83D, чтобы функции БСВВ выбирать не через регистр процессора, а адресом.
Code:
     .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F800 C3 CD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
F810 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
F820 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
F830 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
Тем более, всё API (расширенное, конечно) можно разместить в тех же 2 Кб (у меня получилось же вьюпорты втиснуть почти без вреда), если вычистить пространство от директив…
А так же максимально приблизиться к API-DOS:
Code:
F801 Ввод с клавиатуры с эхом и фильтром
F802 Вывод символа
F804 Вывод символа
F805 Печать символа
F807 Ввод с клавиатуры без эха и фильтров
F808 Ввод с клавиатуры без эха
F80A Ввод строки в буфер
F80B Опрос клавиатуры
F80D Сброс диска
F80E (Выбор диска)
F810 Открыть/Закрыть файл
F811 Найти первый/следующий файл
F813 (Удалить файл)
F814 Читать файл
F816 (Создать файл)
F817 (Переименовать файл)
F819 Опрос диска
F81A Настройка диска
F81C Информация о диске
F81D ---
F81F ---
F820 Читать файл
F822 (Писать файл)
F823 Размер файла
F825 (Вектор прерывания) Escape-драйвер
F826 Читать блок файла
F828 (Писать блок файла)
F829 Разобрать имя файла
F82B (Дата)
F82C (Время)
F82E (Верификатор)
F82F (Текущий DTA)
F831 (Завершить резидентом)
F832 (Информация)
F834 (Статус DOS)
F835 (Вектор прерывания)
F836 Свободная память диска
F837 (Опрос слэша)
F838 (Информация страны)
F839 (Создать папку)
F83A (Удалить папку)
F83B (Выбрать папку)
F83C (Создать описатель файла)
F83D (Открыть описатель файла)
(В скобках - функции MS-DOS здесь неприменимые и ненужные…)
Здесь становится очевидным, что F810/F811 должны искать нужные файлы по всем страницам ПЗУ, а F814/F820 - считывать файлы из страниц ПЗУ в ОЗУ… К тому же, где надо, и подменять подпрограммы чтения магнитофона, чтобы и программы Бейсика грузить штатно, и композиции «Музыкальной системы»… :idea:

Контуры плана
Здесь можно уже чётко обрисовать несколько страниц:
  • #0 - классический МОНИТОР
  • #1…9 - разные версии Мониторов за все годы
  • #10…99 - разные прикладные программы
  • #100…199 - игровые программы
  • #200…249 - резерв под «ПО XXI-Век» из-под наших рук
  • #250 - наша оболочка / Монитор-XXI
  • #251(FBh) - Fast-Basic XXI
  • #252(FCh) - Fast-C XXI
  • #253 - область вычислительных API (для Бейсика-XXI)
  • #254 - область системных API
  • #255 - область классических API
Так, после Сброса процессор доходит до адреса E000 (F800), что отключает страничный режим и выбирает страницу #0.
Директивой «M0»-Монитора вводим байты «21 FF FF 7E 2B 7E C3 6C F8» и запускаем его - страничный режим включён, но всё так же активна страница #0…

Грабли
В странице #0 размещать классический МОНИТОР не совсем верно, так как существуют версии на 16 Кб и на 32 Кб.
А ещё различные модификации под разные клавиатуры: На моём КР-03 игра «Maze» неверно реагировала на клавиши, так как игра - на двоих, а опрос клавиш производился непосредственно. Пришлось часок покопаться и разобраться по маскам бит, что она ожидает от классической клавиатуры и что выдаётся у меня директивой «D8000,9FFF»…
Тем самым, в странице #0 загрузчик надписью «Нажмите пробел» должен выбрать верную прошивку МОНИТОРа, как минимум. Не говоря уже про объём ОЗУ…
Таким образом, API должно быть в двух экземплярах…

P.S.: На кой я додумался до идеи Супер-ПЗУ? :surprised:
Легче плюнуть и забыть…


18 Jan 2020 14:32
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
данный вариант наиболее подходящий?
Наиболее простой по железу и ПО. Зачем в процедуре Page_nibble команда CMP M?
Paguo-86PK wrote:
под API всё же следует выделить штуки 53 «FD» до F835, чтобы функции БСВВ выбирать не через регистр процессора, а адресом.
Зачем надо стандартные п/программы F8xx вызывать позиционно? Проще же делать уход на них по RET загрузив в стек адрес вызываемой подпрограммы. Я выше показал, что это проще и даёт всё, что надо. Зачем ещё какие-то прибамбасы и хитрости? Зачем нужны байты FD?

Зачем аж 256 страниц по 2 кб в ПЗУ ROM-BIOS ? Для расширения системных функций ПЗУ по вводу/выводу хватит одного дополнительного РФ2, т.е двух страниц ПЗУ (а, если лишь для якобы оконности, то хватит и тех 200 байт, что свободны в базовом ПЗУ). Для хранения прикладных программ больше подходят другие средства. А если стоит задача хранить неколько программ именно в страничном ПЗУ в окне ROM-BIOS, то для этого совершенно не требуется изменять концепцию ROM-BIOS, достаточно ввести директиву для запуска прошитых резидентно программ по номеру (например, можно их запускать командой @n<ВК>, а ещё удобнее клавиатурными прерываниями, т.е сочетанием УС+СС+клавиша).

Вы же хотели только оконность добавить и занялись добавкой второй РФ2 только потому, что для этого в базовом ПЗУ не хватило места. После чего у Вас вдруг "разыгрался аппетит" на объём ПЗУ и Вы теперь хотите иметь аж 256 страниц (т.е ПЗУ в 512 кб, а ведь столько и у IBM PC нет).

А оконность драйвера это вовсе не возможность задать окно, чтобы вывод происходил только в него. Я уже упоминал, что есть бытовые ЭВМ на КР580, где есть раб.ячейки задающие окно, но это вовсе не оконность (лишь упрощает очистку окна экрана). Оконность подразумевает возможность при открытии автоматически сохранять, а по закрытию восстанавливать окна, открывать окна поверх. А для этого нужно добавить в РК, как минимум, инверсию знакомест (или цвет). А если этого нет, то оконность в базовом РК это нонсенс.

Я думаю, что если уж вводить огромное ПЗУ, то лучше окном в 16 кб, или хотя бы окном в 8 кб. Это разумнее даже потому, что ОЗУ в РК86 мало, в частности, нортону намного лучше работать из памяти выше 8000, чем в ОЗУ ниже 8000 (ведь, чем меньше у него буфер копирования, тем копирование медленнее). DOS для РК вообще возможна только если она работает из памяти выше 8000. Отладчик тоже должен работать из памяти выше 8000 (чтобы можно было отлаживать в любых адресах основного ОЗУ). В качестве резидентного ПО нужен только отладчик, программа обмена по линии, желательно DOS, иначе - её холодный загрузчик.

А прикладные программы, что работают из ОЗУ удобнее иметь в ROM-диске, т.к там они без проблем заменяются, ROM-диски без сбоев переставляются даже при включённом компьютере.

Вообще ROM-диск это неверный термин. Т.к диск это лишь для DOS, а у РК нет такой DOS для которой это диск. Так что ROM-диск (подключенный через ППА) это и есть настоящий ROM-картридж. Такая дурная терминология пошла из-за публикации ORDOS, где платку ROM-картриджа в рекламных целях обозвали ROM-диском.
Paguo-86PK wrote:
#1…9 - разные версии Мониторов за все годы
это Вы погорячились. Столько версий ПЗУ для РК нет. По сути есть только одна версия. Не было нужды что-то менять в коде процедур ввода/вывода (вариант на 16 кб это не версия, а лишь редкая разновидность, код тот же, причём этого и 30 лет назад практически ни у кого не было, а уж сейчас тем-более).

А то, что появились варианты для ещё двух типов клавиатур (МС-7007 и ASCII-аппаратной типа 15ВВВ-97-006), так это не меняет ROM-BIOS. И пользователю не нужны в ПЗУ драйвера для всех клавиатур. У него только один тип клавиатуры, зачем ему остальные? А сейчас у всех - РК-клавиатура (или реальная или эмулируемая из писи-шной на Atmega). РК-клавиатура удобнее потому, что те игры, что сами лезут в матрицу кнопок, рассчитаны именно на РК-матрицу.

Мало кто мог или хотел доработать или хотя бы изменить ПЗУ РК86, т.к её "зафиксировали" вредители из 80-тых, - они сдуру сделали стандартом внутренние точки ПЗУ, сделав вызовы этих подпрограмм в своих программах. Из-за чего стало трудно хоть что-то совместимо изменить в ПЗУ. И только резко уплющив ПЗУ стало можно что-то изменить или дополнить. Но и имея возможность никто не стал бы менять стандартные п/п-ммы ввода/вывода.

Убавление/прибавление/улучшение директив RAM-монитора не относится к ROM-BIOS. Это равноценно смене версии отладчика в ОЗУ. Я тоже, когда в 2016 году решил выиграть немного байтов в ПЗУ РК86 не менял логику кода ПЗУ F800. Сначала я убрал директиву X (она 48 байт) и исправил директиву G. Что в сумме освободило 97 ячеек. А затем, ковыряя на досуге код в течение пары лет, за счёт оптимизации выиграл ещё более 110 ячеек. Сейчас в ПЗУ F800 свободно 209 ячеек. Но больше резервов почти не осталось (можно выиграть ещё лишь пару байт).

Про доп.железо. Если уж делать печ.платку дающую РК86 какой-то маленький прибамбас, то самым полезным стала бы платка переходник (втыкаемая в панельку штырьками DIP-40 вместо процессора КР580), позволяющая владельцам РК86 (да и других машинок на КР580) без большого стресса для основной платы заменить КР580 на Z80.

Про доработку ПЗУ. У каждого, у кого на этот счёт мнение есть, к ПЗУ F800 свои пожелания и представления, как разумнее его улучшить. Вот мои представления на тему улучшений ПЗУ РК86. Что не значит, что я жажду это сделать (сейчас РК86 не особо меня интересует, ему не хватает Hi-Res графики).

На мой взгляд процедуры ввода/вывода ПЗУ РК вообще менять не имеет смысла. Имеет некоторый смысл лишь улучшать/дополнять директивы и м.б. добавить несколько подпрограмм. Например, имеет смысл добавить подпрограммы чтения/записи байта из доп.ОЗУ (это, по крайней мере, ввело бы универсальность программ для разных реализаций расширенного ОЗУ). Имеет смысл ввести загрузку и автостарт по сбросу DOS из ROM-диска и клавиатурные прерывания.

Ещё есть задача сделать для РК86 второе ПЗУ F000 (расширяющее монитор), на что и рассчитывали его авторы делая JMP F000. В это второе ПЗУ чисто из спортивного интереса можно написать примитивную DOS для дисковода размером в 2 кб. Лучше RK-DOS не сделать, но чтобы хранить/запускать файлы в 2 кб уложиться можно (особенно для Z80 и заняв под это еще 400...500 байт в ПЗУ F800 выкинув оттуда некоторые ненужные директивы).

А если подумать о том, что сразу принесёт реальную пользу людям от модификации ПЗУ, то его следует доработать так, чтобы разделителем в командах мог использоваться пробел, наряду с запятой. Запятая нервирует, т.к теперь все уже привыкли к командам разных DOS в которых разделителем служит проблел.

- - - Добавлено - - -

Напомню про один недостаток ПЗУ РК86. Может наведёт на мысли по доработке ПЗУ. У РК раб.ячейки ПЗУ сделаны ниже экрана. Потому размер экрана нельзя увеличить (иначе экранный буфер затрёт раб.ячейки ПЗУ и подпрограммы ввода/вывода перестанут работать).

РК86 аппаратно может выводить текст в 25, 28 и 31 строку (в зависимости от установленной высоты знакоместа в 10, 9 и 8 линий). Но программно драйвер в ПЗУ может выводить только в режиме 25 строк. Потому что, при увеличении числа строк размер экранного буфера пропорционально увеличивается и выходит за отведённый размер, затирая раб.ячейки.

Например, для DOS удобнее было бы иметь 28 или 30 строк. Но увы, из-за ориентированности ROM-BIOS только на 25 строк с текстом все вынуждены работать только так. Если уж делается доработка ПЗУ, то желательно, чтобы альтернативный ROM-BIOS РК поддерживал любое число строк.
Paguo-86PK wrote:
На кой я додумался до идеи Супер-ПЗУ? Легче плюнуть и забыть…
Уже скисли ? Потому что не надо замахиваться на 512 кб. Сделайте для начала 4 кб (или даже те же 2 кб, выкинув неактуальные директивы), а для прикладных программ введите в ПЗУ поддержку настоящего ROM-картриджа читаемого через ППА D14. Это полностью соответствует вашему условию "невторгаемости" в готовое изделие.

По функциям (даже исключив функции в скобках) можно подумать, что Вы и крутую DOS собираетесь в ПЗУ прошить. Непонятно о какой DOS идёт речь. Это что файлы прикладных программ в ПЗУ будут оформлены не просто в виде списка, а в виде диска DOS ? Или речь о настоящей DOS работающей с внешними носителями?

Часто бывает, - люди загораются какой-нибудь идеей и нет сомнения, что всё реально и это можно быстро сделать. Проблема всегда в том, что энтузиазм быстро кончается, интерес исчезает, остаются только планы.


Last edited by barsik on 19 Jan 2020 09:41, edited 1 time in total.



18 Jan 2020 18:33
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
Вoт Вы настаиваете на варианте с подключением ПЗУ к ППА. Этот способ встроен прямо в МОНИТОР самими разработчиками директивой «R» и D14. Здесь я мог бы лишь предложить взять ещё порт A D20, идущий к клавиатуре: Так как цикл чтения внешнего ROM никак не делится на опрос клавиатуры, то перед чтением данных можно доработать директиву «R» так, чтобы она сначала записывала индекс ROM-страницы прямо в порт по адресу 8000. Тем самым, можно подключить внешнее ПЗУ объёмом до 16 Мб!
Например, если подработать МОНИТОР вот так:
Code:
FA68 .. .. .. .. .. .. .. .. 79 D3 80 3E 90 D3 A3 22
FA70 01 A0 DB A0 77 CD 99 F9 C3 6D FA .. .. .. .. ..
То с внешним ПЗУ можно будет работать вот так:
Code:
-->R0000,1FFF,BA
« Чтение в ОЗУ 0000…1FFF данных из ПЗУ BA0000…BA1FFF, где "BA" - страница "BAsic" »
-->R0000,0FFF,A5
« Чтение в ОЗУ 0000…0FFF данных из ПЗУ A50000…A50FFF, где "A5" - страница "A5sembler" »
-->R76D0,7FF3,FF
« Чтение в ОЗУ 76D0…7FF3 данных из ПЗУ A576D0…A57FF3, где "FF" - страница "Final Fantasy" »
Да, пространство внешнего ПЗУ в таком случае расходуется не оптимально. Но, код по FA68…FA7B командами «IN/OUT» стал компактнее и предложенная страничная функция уместилась малой кровью под оригинальный РК, где «IN A3» читает адрес A3A3 и «OUT 80» пишет в адрес 8080, что оригинальной схемой РК поддерживается 100%!
А чтобы все 16 Мб ПЗУ внешнего расходовать разумно, то директивой «R7000,75FF,FF» считываем нашу оболочку, которая уже может предоставлять выбор файлов в стиле «Volcov Commander»…
Или вообще, «R,F,0» и «G», где в этих 16 байтах конкретный загрузчик окажется…
Как Вам такая доработка? ;)

А теперь…
Мой вариант
Я продолжаю настаивать, чтобы работать необходимо только с РФ2-панелькой!
Потому, возвращаюсь к обсуждению этой техники…

ИЕ5 - 16 страниц - 32 Кб
Допустим, как самый простейщий вариант, на адрес F800 тупо повесить счётчик ИЕ5. Тогда получится как в NES с картриджами о двух играх, где по Сбросу выбирается каждый раз то первая игра, то вторая…
Тем самым, счётчик ИЕ5 будет по Сбросу последовательно перебирать все 16 вариантов прошивок.
Здесь страницы «0», «1» и «3» должны содержать наш загрузчик, который будет в ОЗУ 7633…7647 подгружать свой мизерный код для выбора нужной прошивки…
Code:
7633 .. .. .. 3A 00 F8 21 5A FF CD 18 F8 CD 03 F8 FE
7640 0D C2 33 76 2A 01 F8 E9 .. .. .. .. .. .. .. ..
Этот код последовательно переключает ПЗУ и выводит на экран титульный текст прошивки. Если выбрана нужная страница, мы это видим и нажимаем ВК. Всё просто!
Просто все прошивки должны уметь выводить текст (F818) и опрашивать пару клавиш (F803) - «ВК» и «Пробел»…

Почему страницы «0», «1» и «3»?
Всё просто: Если при включении ИЕ5 окажется на странице «0», мы увидим наш загрузчик. А так как при случайном нажатии на Сброс включится страница «1», код должен 15 раз прочитать F800 и снова выбрать страницу «0»:
Code:
Page #1
     .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F836 .. .. .. .. .. .. 21 33 76 36 7E 23 7D FE 30 C2
F840 36 F8 36 C3 23 36 00 23 36 F8 21 00 F8 C3 33 76
FF5A .. .. .. .. .. .. .. .. .. .. 1F 42 4F 4F 54 20
FF60 23 31 21 21 21 00
Code:
Page #3
     .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F836 .. .. .. .. .. .. 21 33 76 36 7E 23 7D FE 2E C2
F840 36 F8 36 C3 23 36 00 23 36 F8 21 00 F8 C3 33 76
FF5A .. .. .. .. .. .. .. .. .. .. 1F 42 4F 4F 54 20
FF60 23 33 21 21 21 00
Чем гарантированно вернёмся в страницу «0».

P.S.: Как такое?


19 Jan 2020 09:37
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
Вoт Вы настаиваете на варианте с подключением ПЗУ к ППА
Просто традиционно и правильно, чтобы ROM-BIOS работал из ПЗУ, а прикладные программы хранились во внешних (обычно сменных) носителях. В ПЗУ стоящем в памяти должно быть то, что работает. И это разные по ценности вещи: кусок ПЗУ в адресном пространстве процессора (откуда программа работать может) и кусок ПЗУ в внешнем ROM-диске, читаемом через ППА, откуда программа работать не может, т.е это только носитель. Да и прошивать в ROM-диск на порядок проще (файлы сплошные и впритык друг к другу, а не перемежаются какими-то прогоняемыми участками кода).
Paguo-86PK wrote:
Тем самым, можно подключить внешнее ПЗУ объёмом до 16 Мб!
В РК86 это делается проще, т.к здесь под адресацию ППА выделен килограмм адресов. Реально ППА надо всего два адреса A0 и A1. Значит адреса A2...A12, т.е целых 10 адресов пригодны для адресации банок ROM-картриджа, что без расхода деталей даёт адресацию в 128 мегабайт.

Для примера, чтобы читать банку 0, читаем из A000, чтобы читать банку 1 читаем из A000 + 4*1, банку 2 из A000 + 4*2 и т.д. Расход деталей - ноль. Сигналы A2...A12 шины адреса CPU кусками проволоки МГТФ напрямую соединяются с адресами A16...A26 блока ПЗУ (это вряд ли одна микросхема на 128 мб, скорее это 2 тысячи штук микросхем 27512).

Ещё есть возможность использовать неиспользуемые в РК выходы PC1 и PC2 ППА клавиатуры в качестве стробов записи в какие-либо дополнительные регистры (биты PC в ППА управляются поразрядно).
Paguo-86PK wrote:
Например, если подработать МОНИТОР вот так:
Code:
FA68 .. .. .. .. .. .. .. .. 79 D3 80 3E 90 D3 A3 22
FA70 01 A0 DB A0 77 CD 99 F9 C3 6D FA .. .. .. .. ..
Извиняюсь, я ещё не киборг и в мозгу у меня нет встроенного компьютера. Оттого я ещё не умею читать программы в машинных кодах. Чтобы понять о чём речь, мне надо скопировать дамп, записать в файл. Затем запустить IDA и дизассемблировать его. Лишь тогда я увижу этот фрагмент программы в понятном виде.
Paguo-86PK wrote:
Тем самым, счётчик ИЕ5 будет по Сбросу последовательно перебирать все 16 вариантов прошивок
Со сбросом это не то, а вот сама идея использовать счётчик для переключения банок ПЗУ вполне здравая.

Это получится страничная вариация ROM-диска ИРИШИ (стр.112). Там ROM-диск автоинкрементный, и он читается, через единственный 8-ми разрядный порт 14H. По записи в него группа стоящих на плате ROM-диска КМОП-счётчиков 565ИЕ10 обнуляется. А затем после каждого считывания счётчики автоматически инкрементируются. За 65536 считываний можно загрузить в ОЗУ весь ROM-диск (кстати, нет ограничения для расширения до 128 кб и более). Это немножно тормозит в плане промотки. Т.е если нужный нам файл начинается с отступа $8000, то, обнулив счётчики, сначала надо сделать 32768 холостых считываний. И лишь затем пойдут коды нужного файла. Это не проблема (лишь загрузка файлов из конца ROM-диска длится на секунду дольше).

А тут выделяем два чип-селекта - FFFE и FFFF. По чтению FFFE счётчик ИЕ5 сбрасывается, а по чтению адреса FFFF инкрементируется. Это на порядок симпатичнее, чем громоздкая схема с отловом 256-ти адресов ПЗУ F800.


19 Jan 2020 10:24
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Зачем надо стандартные п/программы F8xx вызывать позиционно? Проще же делать уход на них по RET загрузив в стек адрес вызываемой подпрограммы. Я выше показал, что это проще и даёт всё, что надо. Зачем ещё какие-то прибамбасы и хитрости? Зачем нужны байты FD?
A как же тогда вызывать функции с шагом в 1 байт?
А куча «FD» - и есть «CALL 0FDFDh», где уже по позиции узнаём, какую подпрограмму нужно вызвать…
barsik wrote:
По функциям (даже исключив функции в скобках) можно подумать, что Вы и крутую DOS собираетесь в ПЗУ прошить. Непонятно о какой DOS идёт речь. Это что файлы прикладных программ в ПЗУ будут оформлены не просто в виде списка, а в виде диска DOS ? Или речь о настоящей DOS работающей с внешними носителями?
Если ПЗУ будет из 256 страниц - 512 Кб, то разумно встроить функции поиска данных во всей той куче.
А так MS-DOS для современных пользователей всё же ближе, чем CP/M-80, то хотя бы пародию её функций сделать и можно: Путаницы меньше будет, так как возможное ПО будем писать мы и сейчас, а MS-DOS нам доступнее…
barsik wrote:
Просто традиционно и правильно, чтобы ROM-BIOS работал из ПЗУ, а прикладные программы хранились во внешних (обычно сменных) носителях.
Вoт таких традиционных решений уйма. Они отточены и не вписываются в контекст данной темы «а что, если…» :roll:
barsik wrote:
Извиняюсь, я ещё не киборг и в мозгу у меня нет встроенного компьютера. Оттого я ещё не умею читать программы в машинных кодах. Чтобы понять о чём речь, мне надо скопировать дамп, записать в файл. Затем запустить IDA и дизассемблировать его. Лишь тогда я увижу этот фрагмент программы в понятном виде.
Ваш любимый стиль тогда вот:
Code:
    ORG  0FA68H
; Директива R в оригинале
MONITOR_R:
    LD   A,090H
    LD   (0A003H),A
MONITOR_R_LOOP:
    LD   (0A001H),HL
    LD   A,(0A000H)
    LD   (BC),A
    INC  BC
    CALL CMP_HL_DE
    JP   MONITOR_R_LOOP
Code:
; Директива R от меня
    ORG  0FA68H
MONITOR_R:
    LD   A,C         ; Читаем байт третьего аргумента директивы
    OUT  (080H),A    ; Записываем его в 8080h - канал A ППА клавиатуры
    LD   A,090H
    OUT  (0A3H),A    ; Настраиваем D14 - адрес A3A3h
MONITOR_R_LOOP:
    LD   (0A001H),HL ; Выдаём адрес на каналы «B» и «C» D14
    IN   A,(0A0H)    ; Читаем ПЗУ из канала «A» D14 по A0A0h
    LD   (HL),A      ; Записываем в ОЗУ по зеркальному адресу
    CALL CMP_HL_DE
    JP   MONITOR_R_LOOP
barsik wrote:
Для примера, чтобы читать банку 0, читаем из A000, чтобы читать банку 1 читаем из A000 + 4*1, банку 2 из A000 + 4*2 и т.д. Расход деталей - ноль. Сигналы A2...A12 шины адреса CPU кусками проволоки МГТФ напрямую соединяются с адресами A16...A26 блока ПЗУ (это вряд ли одна микросхема на 128 мб, скорее это 2 тысячи штук микросхем 27512).

Ещё есть возможность использовать неиспользуемые в РК выходы PC1 и PC2 ППА клавиатуры в качестве стробов записи в какие-либо дополнительные регистры (биты PC в ППА управляются поразрядно).
Ваш способ гораздо сложнее и код чтения будет намного больше. А мой - просто использует канал «A» ППА сканирования клавиатуры. А там - целых 8 бит тупо пропадают зря и используются лишь в цикле опроса клавиш…
Вникнете - поймёте изящность моей идеи и код оцените… :roll:
barsik wrote:
Со сбросом это не то, а вот сама идея использовать счётчик для переключения банок ПЗУ вполне здравая…
А тут выделяем два чип-селекта - FFFE и FFFF. По чтению FFFE счётчик ИЕ5 сбрасывается, а по чтению адреса FFFF инкрементируется. Это на порядок симпатичнее, чем громоздкая схема с отловом 256-ти адресов ПЗУ F800.
Тут, по-моему, недопонимание…
На ИЕ5 используется только адрес F800: По «LD A,(0F800H)» ИЕ5 перечисляет страницы. То есть, нажал «Сброс», процессор начал читать F800 и страница переключилась…
А вот по FFFE/FFFF - опасно, так как по «DFF00,FFFF» выводом дампа произойдёт инкремент страницы и неизвестно где окажется указатель инструкций…
Потому F800 - идеально для переключения. А если Сброс счётчика нужен, то уж по F801… :idea:

Хотя, если в страницах «0» и «1» разместить МОНИТОР (дважды), то по FFFE происходит инкремент ИЕ5 на «1», а по FFFF - сброс на «0» снова…

Нужно хорошенько подумать, словом… :idea:
(под FFFE/FFFF подходит обычная 531ЛА19 12-И-НЕ, а под F800 требуется экзотический 12-ИЛИ-НЕ)


19 Jan 2020 11:26
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
Ваш способ гораздо сложнее
Мой способ изящный.
Paguo-86PK wrote:
и код чтения будет намного больше.
Наоборот. Даже сдвигать номер банки на 2 разряда и ставить младшим байтом в число A0XX не надо. Мы же заранее знаем какая банка, потому знаем откуда надо читать.
Paguo-86PK wrote:
Вникнете - поймёте изящность моей идеи и код оцените
Не преувеличивайте. Чего тут вникать? Просто как апельсин. И чего оценивать? - Две команды ассемблера записывающие номер банки в порт 8000.

Ничего оригинального. Идея обычного регистра на вывод хранящего адреса A16...A23 для ROM-диска. В качестве которого Вы лишь решили использовать порт ППА клавиатуры. Кстати, когда я в 1999 подключал IDE винт, чтобы с'экономить я использовал разряд с ППА клавиатуры, (но там всё монтировалось на самой печ.плате ОРИОНА). Кстати и проводная линия у меня подключена параллельно клавише РУС/ЛАТ ППА клавиатуры.

А если уж так хочется совмещать ROM-диск с ППА клавиатуры, то повторите идею из "Эврики", там весь ROM-диск читается через ППА-клавиатуры (т.к запасного ППА на плате нет).

Гораздо разумнее использовать PC7 в качестве строба для защёлки A15...A18 в регистре из выходов PB (можно формировать строб и с помощью PC1 ППА клавиатуры). Потому что выгоднее потратить копеечную микросхему на плате ROM-диска, чем волочить целых 8 проводов с другого ППА (на разъёме ROM-диска ОРИОНА всего 30 цепей и нет свободных).
Quote:
подходит обычная 531ЛА19 12-И-НЕ
Для выборки FFFE: один 8-ми входовый И-НЕ, инвертор, а его выход на второй 8-ми входовый И-НЕ. Получается 15-ти входовый И-НЕ. А проще 15 диодов и резистор.
Quote:
по FFFE/FFFF - опасно, так как по «DFF00,FFFF» выводом дампа произойдёт инкремент страницы
Это вообще не довод. Во-первых, если это платка для домохозяек, точнее сделана для идиотов, у которых даже паяльника нет, то они точно не станут выводить на экран дампы ПЗУ, тем более в самом конце памяти. Во-вторых, даже если кто-то сдуру переключит ПЗУ и будет улёт, так что с того? В следующий раз не полезет. А в-третьих, если это так пугает, то добавьте в код директивы D три команды процессора. Тогда дамп участка FF00...FFFF по этой директиве Вы никогда не увидите. Добавляются команды на жёлтом.

Image


Last edited by barsik on 19 Jan 2020 13:25, edited 1 time in total.



19 Jan 2020 13:02
Profile
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Когда же, блин, будет можно удалять свой последний пост. В форуме РУ-ЭВМ тот же самый движок и также включён запрет удалять посты на которые уже есть комменты. Но свой последний пост удалять можно (если его ещё не откомментировали). И в том форуме кнопка <EDIT> справа от <QUOTE>, а здесь слева от <QUOTE>. Потому по привычке машинально всё время ошибаюсь и попадаю не на доредактирование своего поста по <EDIT>, а создаю его слегка отредактированную копию по <QUOTE>.


19 Jan 2020 13:13
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Quote:
подходит обычная 531ЛА19 12-И-НЕ
Для выборки FFFE: один 8-ми входовый И-НЕ, инвертор, а его выход на второй 8-ми входовый И-НЕ. Получается 15-ти входовый И-НЕ. А проще 15 диодов и резистор.
Какиe 15 входов? Какие 15 диодов? К РФ2 подходит всего 11 линий адреса. Забыли? :mrgreen:
И те самые FFFE/FFFF - это 07FE/07FF.
Маска же следующая «XXXX-X111-1111-111X» и можно ИЕ17 использовать, где ЛА19 будет тактировать счётчик, а A0 - выбирать «загрузка/счёт». И мы получим логику на двух микросхемах! 8)
Но про сброс можно не беспокоиться, так как можно просто считать по кольцу…
barsik wrote:
Quote:
по FFFE/FFFF - опасно, так как по «DFF00,FFFF» выводом дампа произойдёт инкремент страницы
Это вообще не довод.

Нe будете возражать, если я начну здесь продвигать свой движок эмулятора?
Просто копаться в чужом и встраивать туда мапперы банков памяти - лень…
А свой движок я изначально разрабатывал как конструктор эмулятора под любой процессор… :roll:

Вот ссылка на мой эмулятор.
Из имени файла можете заметить, что версия - в стиле x86.
Просто мнемоника x86 от Intel мне ближе, чем стиль z80 от Zilog.

Экран эмулируется как попало, так как лень было возиться с ВГ57/ВГ75 и графикой знакогенератор вставлять…
(Но в параллельном проекте x80 есть даже цвет… Оттуда нужно перенести функции и таблицы…)
И клавиатура никак не реализована…
(Просто изначально я движок писал именно под x80 (скандальная тема), а потом его ободрал для теста эмуляции РК и забросил. Так как целью было - проработать концепцию именно x80…)

P.S.: От стиля i8080/z80 мнемоник у меня уже рябит в глазах… :o
Стиль x86 хоть и громоздкий, но более информативный и приятный… :idea:


19 Jan 2020 14:22
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 204 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6 ... 14  Next

Who is online

Users browsing this forum: No registered users and 9 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.