|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Author |
Message |
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 583 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Ещё раз ! Покажите пожалуйста команду КР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 соответственно используем для временного хранения аккумулятора. Подавляющему большинству читателей удобнее мнемоника Z80. Людей, которые понимают странную мнемонику, которой Вы пользуетесь, практически не осталось. Очень неудобно в ней изучать тексты.
Last edited by barsik on 18 Jan 2020 09:57, edited 5 times in total.
|
18 Jan 2020 08:11 |
|
|
Paguo-86PK
Maniac
Joined: 12 Apr 2011 20:43 Posts: 267 Location: Tashkent
|
Пo условию дизайна картриджа я подчеркнул, что чтение F800 отключает страничный режим вообще и родной МОНИТОР работает как ни в чём не бывало… Какой ещё ППА, когда картридж вставляется в панельку РФ2? Вот дан Вам РАДИО-86РК залитый компаундом намертво и вмазан в стену с телевизором и клавиатурой, но торчит лишь одна панелька с РФ2 - вот с этим и работаем, товарищ! Тем самым, ничего из этого - не применимо… Мною разработан был ассемблер, который поддерживал мнемонику i8080 и i8086, и z80 должен был. Не все пользователи считают мнемонику z80 удачной, кроме как портирования кода с RISC-процессоров (инженеры Zilog этого курса и придерживались). И мнемоника x86 куда приятнее z80. "Код мнемоникой i8080" "Код мнемоникой 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-мантры… (Мой эмулятор поддерживает любую мнемонику - x86, i8080 и мог бы сейчас быстро переделать под 6502 (если бы Вы реально хотели этого). Так как эмулятор реконфигурируется шаблоном - нажмите кнопку MATRIX тут и измените команду «MOV» на «RUN» в строке, затем дважды кликните на MATRIX снова - всё перестроится на лету)… P.S.; Мой вариант 6502-мнемоники в стиле «TAM» вместо «MOV M,A» могу ещё здесь представить… "Вариант 6502-стиля" ( Какой самый удобный? Правильно! x86-вариант проверен временем и он дожил до наших дней!)
Last edited by Paguo-86PK on 18 Jan 2020 09:23, edited 1 time in total.
|
18 Jan 2020 08:48 |
|
|
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 583 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Как же тогда банки переключать? На 24-х ногую панельку не выходит сигнал записи в порт переключения страниц. Должны быть и другие сигналы и значит слот картриджа должен быть другим. Например, это конструктивно можно сделать так, как на платах Специалист Экспресс обычно организуют внешний разъём на корпусе. Там на плате нет системного разъёма и некуда включать дисковод и УФ-прошиватель. Зато там на плате 4 панельки 24 и 28 ног. Из одной такой панельки (куда добавляем сигналы) берём сигналы на разъём ГРПМ загреплённый уже на самом корпусе Специалиста. От этого разъёма ГРПМ на задней стенке корпуса идёт коса, кончающаяся DIP-24/28 разъёмом, который и втыкается в панельку на плате Специалиста. Т.о даже при отсутствии сист.разъёма на плате без пайки можно заменять плату в корпусе (т.к на клавиатуру на плате Экспресс разъём есть). Или я тупой или Вы плохо излагаете. Страницы-то как переключаются? Кто и как управляет железом? И что это за железо, которое как-то (без команд OUT) меняет код, что читается в окне F800...FFFF ? В ваших выше приведённых текстах меняются только регистры (грузятся, инкрементируются, декрементируются). Как от этого изменится номер страницы включённой в окне? Да, XTHL ещё тот маразм... Конечно. За это - не я. За это - весь цивилизованный 8-ми разрядный мир. Всяко лучше та мнемоника при которой напрягать мозг не надо, т.к команда сама сообщает, что она делает. Зачем это надо? Что на эти мнемоники крутой макроассемблер есть? Серъёзно, похоже, что Вы всячески старатесь затруднить себе программирование. Работаете без программистских инструментов в голом отладчике, изобретаете более информативные полу-дампы, изобретаете совсем странные мнемоники. 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 |
|
|
Paguo-86PK
Maniac
Joined: 12 Apr 2011 20:43 Posts: 267 Location: Tashkent
|
Кaк я уже говорил: Задача в том, чтобы просто выдернуть родной РФ2 и вставить свой модуль в ту панельку. Никаких проводков от ППА кидать не надо Повторяю: Страницы ПЗУ переключаются чтением особых ячеек. Схему даже нарисовал же выше… Они уже переключились, когда процессор читал код команды из F801…F8FF. Если страничный режим активирован, чтение ячеек F801…F8FF переключает страницы. Если прочитать F800, страничный режим выключается и всё работает в нормальном режиме… Если не лень: - Скачайте файл матрицы
- Запустите эмулятор
- Нажмите кнопку «Matrix»
- Вставьте туда содержимое скачанного файла
- Дважды кликнете на кнопку «Matrix» снова
- Нажмите кнопку «≡»
- Нажмите «Reset»
- Нажмите «Start» (можно и «Trace»)
От графического представления команд логика работы не меняется. И я могу писать код под РАДИО-86РК в любом стиле - инструменты имеются… Но я - не изверг-извращенец и публикую здесь код именно мнемоникой i8080, чтобы не издеваться ни над кем…
Last edited by Paguo-86PK on 18 Jan 2020 10:31, edited 1 time in total.
|
18 Jan 2020 10:06 |
|
|
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 583 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Вот теперь понятно, - идея из ленинградского ZX-клона "Хоббит". Там тоже вместо синклеровского ПЗУ, по чтению кода команды из какого-то адреса ZX-ПЗУ автоматически включалось теневое ПЗУ (вроде бы, чтобы клавиатуру с большей матрицей обслуживать, уже не помню точно, т.к знакомился с ним в 1991). Значит, по CALL F801 попадаем в страницу 1, по CALL F802 попадаем в страницу 2, по CALL F803 попадаем в страницу 3 и так далее... Для реализации схемотехники этой идеи Вы проводками от ППА не обойдётесь. А когда страниц много тут впору ставить микроконтроллер, который содержит транзисторов раз в 100 больше, чем во всём РК86. Чем Вам простое традиционное управление командами OUT процессора не угодило? Логика не меняется, - меняется эффективность труда программиста. Уже давно доказано и в этом убедились десятки тысяч программистов, что переход на мнемонику Z80 повышает эффективность в разы. Почему-то в маш.кодах уже никто не программирует.
Last edited by barsik on 18 Jan 2020 10:42, edited 1 time in total.
|
18 Jan 2020 10:28 |
|
|
Paguo-86PK
Maniac
Joined: 12 Apr 2011 20:43 Posts: 267 Location: Tashkent
|
Нe совсем так из-за смещения… Хм… Вoт у Вас опыта больше. Так что и сами знаете все механизмы лучше меня, а я пытался изобрести велосипед, не зная про трюки Хоббита… Нельзя! Допустим, открылся интернет-кооператив и всем, у кого жив РАДИО-86РК, за цент предлагается купить «Супер-РФ2», которое перевернёт всё на 360°, так как в «Супер-РФ2» имеются все игры, Бейсики, трансляторы и т.д… P.S.: В самой простой реализации в это ПЗУ можно тупо зашить загрузчик, который будет выбирать нужную страницу и тупо считывать оттуда данные в ОЗУ, а потом их запускать там. Получится банальный ROM-DISK в панельке РФ2…
|
18 Jan 2020 10:40 |
|
|
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 583 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Для данной задачи идея хорошая, но чтобы изложить её, не требовалось всё настолько запутывать. И применять байты 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 |
|
|
Paguo-86PK
Maniac
Joined: 12 Apr 2011 20:43 Posts: 267 Location: Tashkent
|
Тo есть данный вариант наиболее подходящий? Но под API всё же следует выделить штуки 62 «FD» до F83D, чтобы функции БСВВ выбирать не через регистр процессора, а адресом. Тем более, всё API (расширенное, конечно) можно разместить в тех же 2 Кб (у меня получилось же вьюпорты втиснуть почти без вреда), если вычистить пространство от директив… А так же максимально приблизиться к API-DOS: (В скобках - функции MS-DOS здесь неприменимые и ненужные…) Здесь становится очевидным, что F810/F811 должны искать нужные файлы по всем страницам ПЗУ, а F814/F820 - считывать файлы из страниц ПЗУ в ОЗУ… К тому же, где надо, и подменять подпрограммы чтения магнитофона, чтобы и программы Бейсика грузить штатно, и композиции «Музыкальной системы»… Контуры планаЗдесь можно уже чётко обрисовать несколько страниц: - #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.: На кой я додумался до идеи Супер-ПЗУ? Легче плюнуть и забыть…
|
18 Jan 2020 14:32 |
|
|
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 583 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Наиболее простой по железу и ПО. Зачем в процедуре Page_nibble команда CMP M? Зачем надо стандартные п/программы 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-диском. это Вы погорячились. Столько версий ПЗУ для РК нет. По сути есть только одна версия. Не было нужды что-то менять в коде процедур ввода/вывода (вариант на 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 РК поддерживал любое число строк. Уже скисли ? Потому что не надо замахиваться на 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 |
|
|
Paguo-86PK
Maniac
Joined: 12 Apr 2011 20:43 Posts: 267 Location: Tashkent
|
Вoт Вы настаиваете на варианте с подключением ПЗУ к ППА. Этот способ встроен прямо в МОНИТОР самими разработчиками директивой «R» и D14. Здесь я мог бы лишь предложить взять ещё порт A D20, идущий к клавиатуре: Так как цикл чтения внешнего ROM никак не делится на опрос клавиатуры, то перед чтением данных можно доработать директиву «R» так, чтобы она сначала записывала индекс ROM-страницы прямо в порт по адресу 8000. Тем самым, можно подключить внешнее ПЗУ объёмом до 16 Мб! Например, если подработать МОНИТОР вот так: То с внешним ПЗУ можно будет работать вот так: Да, пространство внешнего ПЗУ в таком случае расходуется не оптимально. Но, код по 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 подгружать свой мизерный код для выбора нужной прошивки… Этот код последовательно переключает ПЗУ и выводит на экран титульный текст прошивки. Если выбрана нужная страница, мы это видим и нажимаем ВК. Всё просто! Просто все прошивки должны уметь выводить текст (F818) и опрашивать пару клавиш (F803) - «ВК» и «Пробел»… Почему страницы «0», «1» и «3»? Всё просто: Если при включении ИЕ5 окажется на странице «0», мы увидим наш загрузчик. А так как при случайном нажатии на Сброс включится страница «1», код должен 15 раз прочитать F800 и снова выбрать страницу «0»: Чем гарантированно вернёмся в страницу «0». P.S.: Как такое?
|
19 Jan 2020 09:37 |
|
|
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 583 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Просто традиционно и правильно, чтобы ROM-BIOS работал из ПЗУ, а прикладные программы хранились во внешних (обычно сменных) носителях. В ПЗУ стоящем в памяти должно быть то, что работает. И это разные по ценности вещи: кусок ПЗУ в адресном пространстве процессора (откуда программа работать может) и кусок ПЗУ в внешнем ROM-диске, читаемом через ППА, откуда программа работать не может, т.е это только носитель. Да и прошивать в ROM-диск на порядок проще (файлы сплошные и впритык друг к другу, а не перемежаются какими-то прогоняемыми участками кода). В РК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 в ППА управляются поразрядно). Извиняюсь, я ещё не киборг и в мозгу у меня нет встроенного компьютера. Оттого я ещё не умею читать программы в машинных кодах. Чтобы понять о чём речь, мне надо скопировать дамп, записать в файл. Затем запустить IDA и дизассемблировать его. Лишь тогда я увижу этот фрагмент программы в понятном виде. Со сбросом это не то, а вот сама идея использовать счётчик для переключения банок ПЗУ вполне здравая. Это получится страничная вариация 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 |
|
|
Paguo-86PK
Maniac
Joined: 12 Apr 2011 20:43 Posts: 267 Location: Tashkent
|
A как же тогда вызывать функции с шагом в 1 байт? А куча «FD» - и есть «CALL 0FDFDh», где уже по позиции узнаём, какую подпрограмму нужно вызвать… Если ПЗУ будет из 256 страниц - 512 Кб, то разумно встроить функции поиска данных во всей той куче. А так MS-DOS для современных пользователей всё же ближе, чем CP/M-80, то хотя бы пародию её функций сделать и можно: Путаницы меньше будет, так как возможное ПО будем писать мы и сейчас, а MS-DOS нам доступнее… Вoт таких традиционных решений уйма. Они отточены и не вписываются в контекст данной темы «а что, если…» Ваш любимый стиль тогда вот: Ваш способ гораздо сложнее и код чтения будет намного больше. А мой - просто использует канал «A» ППА сканирования клавиатуры. А там - целых 8 бит тупо пропадают зря и используются лишь в цикле опроса клавиш… Вникнете - поймёте изящность моей идеи и код оцените… Тут, по-моему, недопонимание… На ИЕ5 используется только адрес F800: По «LD A,(0F800H)» ИЕ5 перечисляет страницы. То есть, нажал «Сброс», процессор начал читать F800 и страница переключилась… А вот по FFFE/FFFF - опасно, так как по «DFF00,FFFF» выводом дампа произойдёт инкремент страницы и неизвестно где окажется указатель инструкций… Потому F800 - идеально для переключения. А если Сброс счётчика нужен, то уж по F801… Хотя, если в страницах «0» и «1» разместить МОНИТОР (дважды), то по FFFE происходит инкремент ИЕ5 на «1», а по FFFF - сброс на «0» снова… Нужно хорошенько подумать, словом… (под FFFE/FFFF подходит обычная 531ЛА19 12-И-НЕ, а под F800 требуется экзотический 12-ИЛИ-НЕ)
|
19 Jan 2020 11:26 |
|
|
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 583 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Мой способ изящный. Наоборот. Даже сдвигать номер банки на 2 разряда и ставить младшим байтом в число A0XX не надо. Мы же заранее знаем какая банка, потому знаем откуда надо читать. Не преувеличивайте. Чего тут вникать? Просто как апельсин. И чего оценивать? - Две команды ассемблера записывающие номер банки в порт 8000. Ничего оригинального. Идея обычного регистра на вывод хранящего адреса A16...A23 для ROM-диска. В качестве которого Вы лишь решили использовать порт ППА клавиатуры. Кстати, когда я в 1999 подключал IDE винт, чтобы с'экономить я использовал разряд с ППА клавиатуры, (но там всё монтировалось на самой печ.плате ОРИОНА). Кстати и проводная линия у меня подключена параллельно клавише РУС/ЛАТ ППА клавиатуры. А если уж так хочется совмещать ROM-диск с ППА клавиатуры, то повторите идею из "Эврики", там весь ROM-диск читается через ППА-клавиатуры (т.к запасного ППА на плате нет). Гораздо разумнее использовать PC7 в качестве строба для защёлки A15...A18 в регистре из выходов PB (можно формировать строб и с помощью PC1 ППА клавиатуры). Потому что выгоднее потратить копеечную микросхему на плате ROM-диска, чем волочить целых 8 проводов с другого ППА (на разъёме ROM-диска ОРИОНА всего 30 цепей и нет свободных). Для выборки FFFE: один 8-ми входовый И-НЕ, инвертор, а его выход на второй 8-ми входовый И-НЕ. Получается 15-ти входовый И-НЕ. А проще 15 диодов и резистор. Это вообще не довод. Во-первых, если это платка для домохозяек, точнее сделана для идиотов, у которых даже паяльника нет, то они точно не станут выводить на экран дампы ПЗУ, тем более в самом конце памяти. Во-вторых, даже если кто-то сдуру переключит ПЗУ и будет улёт, так что с того? В следующий раз не полезет. А в-третьих, если это так пугает, то добавьте в код директивы D три команды процессора. Тогда дамп участка FF00...FFFF по этой директиве Вы никогда не увидите. Добавляются команды на жёлтом.
Last edited by barsik on 19 Jan 2020 13:25, edited 1 time in total.
|
19 Jan 2020 13:02 |
|
|
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 583 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Когда же, блин, будет можно удалять свой последний пост. В форуме РУ-ЭВМ тот же самый движок и также включён запрет удалять посты на которые уже есть комменты. Но свой последний пост удалять можно (если его ещё не откомментировали). И в том форуме кнопка <EDIT> справа от <QUOTE>, а здесь слева от <QUOTE>. Потому по привычке машинально всё время ошибаюсь и попадаю не на доредактирование своего поста по <EDIT>, а создаю его слегка отредактированную копию по <QUOTE>.
|
19 Jan 2020 13:13 |
|
|
Paguo-86PK
Maniac
Joined: 12 Apr 2011 20:43 Posts: 267 Location: Tashkent
|
Какиe 15 входов? Какие 15 диодов? К РФ2 подходит всего 11 линий адреса. Забыли? И те самые FFFE/FFFF - это 07FE/07FF. Маска же следующая «XXXX-X111-1111-111X» и можно ИЕ17 использовать, где ЛА19 будет тактировать счётчик, а A0 - выбирать «загрузка/счёт». И мы получим логику на двух микросхемах! Но про сброс можно не беспокоиться, так как можно просто считать по кольцу… Нe будете возражать, если я начну здесь продвигать свой движок эмулятора? Просто копаться в чужом и встраивать туда мапперы банков памяти - лень… А свой движок я изначально разрабатывал как конструктор эмулятора под любой процессор… Вот ссылка на мой эмулятор. Из имени файла можете заметить, что версия - в стиле x86. Просто мнемоника x86 от Intel мне ближе, чем стиль z80 от Zilog. Экран эмулируется как попало, так как лень было возиться с ВГ57/ВГ75 и графикой знакогенератор вставлять… (Но в параллельном проекте x80 есть даже цвет… Оттуда нужно перенести функции и таблицы…) И клавиатура никак не реализована… (Просто изначально я движок писал именно под x80 (скандальная тема), а потом его ободрал для теста эмуляции РК и забросил. Так как целью было - проработать концепцию именно x80…) P.S.: От стиля i8080/z80 мнемоник у меня уже рябит в глазах… Стиль x86 хоть и громоздкий, но более информативный и приятный…
|
19 Jan 2020 14:22 |
|
|
Who is online |
Users browsing this forum: No registered users and 65 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
|
|