nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 18:06



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

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
B общем, этими выходными основательно занялся своей прошивкой и устранил пару багов.
Теперь «ЦИРК» и «КСОНИКС» работают корректно, а также и «ВУЛКАН» теперь играбельный.
Ещё сильнее ужал код, выбросив лишние команды и добавив заглушки.

После холодного старта МОНИТОР заглушает последовательность Esc с любым символом, отличным от «Y». :oidea:
Теперь код 1F очищает экран и делает дефолтный вьюпорт - 64×25, отчего «КСОНИКС» нормально себя ведёт. :idea:
Но также и Esc+1F поддерживается для очищения оконной области без изменения вьюпорта. Именно так и нужно очищать окошки… :exclaim:

P.S.: В общем, время свободное направил на бинарный труд и будто бы выиграл… :roll:


Attachments:
File comment: Windows'86РК - исправленный
Windows86.zip [4.26 KiB]
Downloaded 254 times
12 Jan 2020 09:18
Profile WWW
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
Ктo хоть чуточку знаком с процессором 6502, знает его краткую и причудливую мнемонику с очень краткой записью.
Так, вместо «MOV X,A» инженеры сократили обозначение до «TAX».
Давно я задавался вопросом применения подобного же подхода и к процессору i8080, так как в принципе его «STA» и «LHLD» не так уж концептуально далеки…

Сегодня я реализовал это.
Правда, вместо «TAM» за «MOV M,A» я использовал ещё более краткую форму - «MA», чтобы дампом вместо хекс-кода выводить эту «недо-мнемонику»…

Не буду тут занудствовать деталями, а просто выкладываю два скриншота.
Кому интересно - сам вникнет в логику…


Attachments:
File comment: NeDoDisAssembly
Dump_TinyCode.png
Dump_TinyCode.png [ 42.03 KiB | Viewed 5411 times ]
File comment: Классический дамп
Dump_Classic.png
Dump_Classic.png [ 41.19 KiB | Viewed 5411 times ]
15 Jan 2020 15:03
Profile WWW
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
Задумaлся над применением картриджа, как у NES, который мог бы вставляться в панельку оригинального РФ2…
Теоретически, если добавить парочку логик, то в области F800…FFFF можно разместить ПЗУ до 512 Кб из 256 страниц по 2 Кб. Линейно же, каждые 2 Кб должны повторяться JMP-командами, чтобы не разрушать API - F800…F834. А остальное содержимое может иметь произвольное конкретное назначение.
Так, директивы («M», «D», «I», «O», «G» и т.д.) не будут раскиданы по разным адресами в области 2 Кб, а будут иметь одну точку входа, но на разных страницах. А буква - лишь выбирает страницу. Причём, список директив можно расширить…
  • «A» - Ассемблер
  • «B» - BASIC
  • «E» - Emu80 (отладчик)
  • «H» - Help-страница
  • «J» - Java / C / C--
  • «K» - Калькулятор (mini-excel)
  • «N» - Net/Modem/Fido
  • «P» - Pascal
  • «Q» - Quick-DOS
  • «V» - Video-Test
  • «W» - Редактор WELL
  • «Z» - Zyxel (терминал работы с модемом)
И это - лишь 26 страниц по 2 Кб!
Тем самым, в БЕЙСИК под все токены можно выделить несколько страниц.

Конечно, сам эмулятор можно как-то отмодифицировать, чтобы область F800…FFFF стала страничной.
А также - продумать технику переключения страниц, так как на панельке сигнала ЗАПИСИ нету, а тянуть отдельный проводок было бы не очень хорошо…

Как вариант - ячейки FFF0…FFFF чтением заносят младшие 4 бита адреса в сдвиговый регистр страницы. А перенос кода страницы из сдвигового в активирующий - FF00…FFEF.

Для наглядности - просто приведу пример кода:
Code:
; Аккумулятор - код страницы
Page_Select:
   PUSH   PSW
   PUSH   H
   MVI   H,0FFh
   CALL   Page_Switch
   POP   H
   POP   PSW
   RET
Page_Switch:
   PUSH   PSW
   RRC
   RRC
   RRC
   RRC
   CALL   Page_Nibble
   POP   PSW
Page_Nibble:
   ORI   0F0h
   MOV   L,A
   CMP   M
   RET
Пример вызова подпрограммы печати байта:
Code:
   MVI   A,015h   ; Странница подпрограммы F815
   CALL   Page_Select
   MOV   A,M
   CALL   0FF00h   ; Вызов подпрограммы
Следует запоминать ещё и историю переключения страниц в стеке для обратного возврата. Но сам принцип вполне прост и понятен… :mrgreen:


Attachments:
File comment: Схема картриджа на ПЛМ
rk86-super-cartridge.png
rk86-super-cartridge.png [ 80.42 KiB | Viewed 5372 times ]
File comment: Общее представление картриджа эскизом
rk86-cartridge.png
rk86-cartridge.png [ 82.44 KiB | Viewed 5374 times ]
16 Jan 2020 11:28
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
Задумaлся над применением картриджа, как у NES, который мог бы вставляться в панельку оригинального РФ2… можно разместить ПЗУ до 512 Кб из 256 страниц по 2 Кб.
Если идея введения страничного ПЗУ F800 в окне 2 кб приемлема (не идеально для программирования, но проще в аппаратной доделке на уже готовом изделии), то идея введения картриджа в окне 2 кб - неудачна. Что мешает ввести окно в 16 кб или даже 32 кб. Коду картриджа лучше работать из ПЗУ. Не хочется называть обычную страничность F800 картриджем.

Страничность ПЗУ это лобовое расширение ПЗУ F800 в ОРИОНЕ. Я сам это делал как минимум 3 раза (я имею ввиду программы). А впервые я это сделал в ОРИОНЕ в самом начале 1991 года. Потому-что в ОРИОНЕ ПЗУ всего 2 кб, как и в РК, но в ОРИОНЕ её родная ОС (называемая ORDOS) в 2 кб должна по сбросу грузиться или с МГ-ленты или автоматически из ROM-диска. Потому, если для РК доп.ПЗУ в 2 кб не нужны, то в ОРИОНЕ это необходимость, иначе надо каждый раз грузить ORDOS с МГ-ленты, что при серъёзном использовании машины вообще не годится (т.к ORDOS при отладке программ гибнет и её надо снова грузить с МГ-ленты). А платы ROM-дисков ещё ни у кого не было, они появились в продаже лишь к лету 1991.

Помыкавшись пару месяцев без ROM-диска, я применил в ОРИОНЕ РФ2 на которую уже ранее была напаяна панелька на 24 ноги (так у меня было в Специалисте, там так в 2 этажа у меня стояло 6 ПЗУ РФ2). В нижнуюю ПЗУ прошил чуть переделанный Монитор-3 ОРИОНА, который по сбросу загружал ORDOS на B800 из второй РФ2 во второй странице (страницы комммутировал бит запасного порта). Получилось по сути расширение ПЗУ до 4 кб самыми простейшими средствами без вторжений в печ.плату и без расхода доп.микросхем.

И когда позднее в 1991 году я выпускал партию печ.плат для установки в ОРИОН процессора Z80 (называлась Z80CARD-I), то в ней как раз и использовалась эта идея двухстраничного ПЗУ F800 за счёт напайки на РФ2 панельки или даже самих двух РФ2 в два этажа (тогда нижнюю РФ2 не очистить УФ-лучами). Для такого расширенного ROM-BIOS был RAM-монитор (называемый М3-EXT, который правда из-за отсутствия у людей такой доработки получил гораздо большее распространение в виде RAM-версии, что менее удобно, т.к конфликтует по месту загрузки с ORDOS), а известные программисты Adelaide в 1992 написали резидентный отладчик для Z80. В платах Z80CARD-II двух этажей РФ2 уже не поддерживалось (к тому времени в этом уже не было нужды, печ.платы ROM-дисков расространились и были у всех, давая не 2 доп.кб, а 64). Но у меня на всех моих 5 платах ОРИОНА всегда стояло как минимум две страницы ПЗУ.

В 1994 г. я странслировал Shadowy-монитор, который прошивался уже не в РФ2, а в 27256 (окно то же) и поддерживал загрузку резидентных программ из 27256. В монитор добавлялась команда @n, где n - номер программы (обычно, отладчик, УФ-прошиватель, бейсик, редактор-ассемблер и холодный загрузчик с дисковода).

Потому на 3-х из 5 моих плат ОРИОНА на месте +12В преобразователя рядом с ПЗУ РФ2 стоит вторая панелька на 28 ног. Но последние 23 года я использовал как раз только двухэтажные РФ2 (т.к они вечные, тогда как 27256 портятся после нескольких десяткох перешивок). У меня и сейчас есть все исходники для двухэтажного ПЗУ и мой эмулятор ОРИОНА из 1998 года поддерживает именно две ПЗУ РФ2 в окне F800 (второе ПЗУ называется SHADOWY.DAT). Две ПЗУ F800 нужны для эмулятора РК86 на ОРИОНЕ (скорость эмуляции 150 КГЦ, но половина РК-игр играбельна), т.к при эмуляции в области F800 должно стоять именно ПЗУ РК (точнее РК-совместимое), а не ОРИОНА и переставлять их можно только программно.

Это я к тому, что когда в ПЗУ не мощный ROM-BIOS, а оно служит лишь для резидентного хранения, то без разницы, что окно доступа к ПЗУ маленькие. Хотя с картриджем для игровых консолей не так. Обычно программа работает в ПЗУ самого картриджа, а продвинутые картриджи Денди содержат и доп.ОЗУ в котором тоже программа работает). Но для РК другое дело, для него нет программ не умещающихся в 28 кб ОЗУ и не придвидится программ работающих из ПЗУ. Потому для РК это без разницы.

Картридж в окне C000...FFFF (или 8000...FFFF) и даже работа прямо из него возможна потому, что в ВГ75 на C000 и ВТ57 на E000 программа лезет (и то только граф.программа, меняющая число строк) только один раз, когда ставит режим ВГ75. А т.к делает установку режима и лезет в ППА клавиатуры или ПЗУ F800 ваша программа, то кто мешает ей скинуть фрагмент кода в ОЗУ и оттуда один раз записать байты режима в ВГ75 и ВТ57, а затем включить в окне выше C000 картридж и прогонять там сплошной код игры?
Paguo-86PK wrote:
каждые 2 Кб должны повторяться JMP-командами, чтобы не разрушать API - F800…F834
А вот эта мысль неудачна. Зачем дублировать стандартные входы?

Если в страничном ПЗУ просто переключаются разные версии 2-х килобайтовых мониторов, то там и эти входы есть и эти мониторы не переключают банки. А если используется свой уже изначально страничный ROM-BIOS, то короче удобнее специальный код межбанкового вызова подпрограмм. Ведь исполнительный код (например, п/п-мы вывода F809) всё равно остался в банке 0.

В ранних версиях я имел межстраничный вызов крошечным фрагментом в свободном ОЗУ F3F0...F3FF (в ОРИОНЕ это кусок ОЗУ отведённый на расширение именно ROM-BIOS, хотя нашлись уроды, которым и для программ в ОЗУ понадобилось эти ячейки использовать просто как рабочие, хотя для этого они имели ещё 60 кб других ячеек, из-за чего улучшенные версии ПЗУ висли на программах идиотов). Для РК такой угрозы нет, кто мешает занять 7FF4...7FFF?

Код межстраничного вызова в ОЗУ короче (ПЗУ экономится) и один на все страницы ПЗУ. Но из-за уродов на ОРИОНЕ, в версии ПЗУ из двух РФ2 которым я пользуюсь уже 25 лет для межбанковых переходов и вызовов используется вот такая конструкция:

 
В банке 0:
Code:
; ===============================================

R1CALL: EX      AF,AF
        LD      A,81H
        OUT     (0FCH), A       ; этот же код в банке 1
        EX      AF,AF
        LD      IY,R1_BAK       ; адрес возврата
        PUSH    IY
        JP      (IX)            ; в банке 1 здесь тоже стоит JP (IX)

; -------------------------------------------------

R1_BAK: EX      AF,AF
        LD      A,1
        OUT     (0FCH), A       ; этот же код в банке 1
        EX      AF,AF
        RET

; -------------------------------------------------

PROMPT: defb    13,10,'->',0

IX_JMP: EX      AF,AF
        JP      (IX)            ; в банке 1 здесь тоже стоит JP (IX)



В банке 1:
Code:
; ----------------------------------------------

if      $       gt R1CALL-6
        if1
          .printx *     R0CALL over ! *
        @OVER1  EQU     $-(R1CALL-6)
        endif
        @FREE1  EQU     0
   else
        @FREE1  EQU     R1CALL-6-$

        rept    @FREE1
        defb    0
        endm
endif

; ----------------------------------------------

LDHL1:  LD      A,0FFH          ; 2
LD_HL:  LD      IX,@LD_HL       ; 4

R0CALL: EX      AF,AF
        LD      A,0
        OUT     (0FCH), A       ; этот же код в банке 0
        EX      AF,AF
        LD      IY,R0_BAK       ; адрес возврата
        PUSH    IY
        JP      (IX)            ; в банке 0 здесь тоже стоит JP (IX)

; -------------------------------------------------

R0_BAK: EX      AF,AF
        LD      A,0
        OUT     (0FCH), A       ; этот же код в банке 0
        EX      AF,AF
        RET

; -------------------------------------------------

R0_JMP: EX      AF,AF
        LD      A,0
        OUT     (0FCH), A       ; этот же код в банке 0
if      $ ne    IX_JMP
        if1
          .printx *     IX_JMP shifted ! *
        endif
endif
        EX      AF,AF
        JP      (IX)            ; в банке 0 здесь тоже стоит JP (IX)

; -------------------------------------------------
YCONIN: LD      IX,AF803
        JR      R0CALL
; -------------------------------------------------
YCOUTC: LD      IX,AF809
        JR      R0CALL
; -------------------------------------------------
YHEX_A: LD      IX,AF815
        JR      R0CALL
; -------------------------------------------------
YCHSUM: LD      IX,AF82A
        JP      R0CALL
; -------------------------------------------------
YRRAM:  LD      IX,AF836
        JR      R0CALL
; -------------------------------------------------
YWRAM:  LD      IX,AF839
        JR      R0CALL
; -------------------------------------------------
YLDBYTE:       
        LD      IX,AF806
        JR      R0CALL
; -------------------------------------------------
YERROR: LD      IX,ERROR
        JR      R0CALL

Я сам уже не помню, но если подумать понять можно, как этот код работает. В обоих банках ПЗУ есть синхронные входы для вызова п/п-ммы в другой странице и синхронные выходы для возврата. В одной странице стоит OUT, что переключает страницы ПЗУ, в следующей команде оказываемся уже в другой странице, где стоит продолжение программы.
Paguo-86PK wrote:
сам эмулятор можно как-то отмодифицировать, чтобы область F800…FFFF стала страничной.
Какой у Вас эмулятор? Для РК86 предпочтительнее EMU80, т.к РК-КНГМД не поддержан в EMU. Я сам сейчас не использую, но знаю (т.к ранее уже делал) как составить страничность и в другом эмуляторе, что называется EMU.

Для страничности ПЗУ F800 при EMU80 нужен вот такой код. Здесь 8 страниц (ясно как сделать сколько надо), которые переключаются по записи в тот же адрес окна ПЗУ). Это удобнее всего, т.к после установки 555 ИД7 для РК-КНГМД по схеме из ж.Радио 01.1993, это единственный свободный чип селект на запись. Переключение страниц ПЗУ размером по 2 кб в окне F800...FFFF тут управляется записью чисел 0...7 (в адрес окна ПЗУ F800...FFFF). При нужде подставьте иной диапазон адресов области для переключателя.

 
Code:
.
@ROM_0 = "rk86/rom0.DAT"
@ROM_1 = "rk86/rom1.DAT"
@ROM_2 = "rk86/rom2.DAT"
@ROM_3 = "rk86/rom3.DAT"
@ROM_4 = "rk86/rom4.DAT"
@ROM_5 = "rk86/rom5.DAT"
@ROM_6 = "rk86/rom6.DAT"
@ROM_7 = "rk86/rom7.DAT"

Rom rom0 = @ROM_0,0x800
Rom rom1 = @ROM_1,0x800
Rom rom2 = @ROM_2,0x800
Rom rom3 = @ROM_3,0x800
Rom rom4 = @ROM_4,0x800
Rom rom5 = @ROM_5,0x800
Rom rom6 = @ROM_6,0x800
Rom rom7 = @ROM_7,0x800

AddrSpaceMapper rom = 8
rom.page = 0, &rom0
rom.page = 1, &rom1
rom.page = 2, &rom2
rom.page = 3, &rom3
rom.page = 4, &rom4
rom.page = 5, &rom5
rom.page = 6, &rom6
rom.page = 7, &rom7

PageSelector romPageSelector
romPageSelector.mapper = &rom

Translator romSelectorTranslator = &romPageSelector
romSelectorTranslator.writeAndMask = 0x7

addrSpace.writeRange = &romSelectorTranslator, 0xF800, 0xFFFF

addrSpace.writeRange = &dma, 0xE000, 0xE7FF
addrSpace.readRange = &rom, 0xF800, 0xFFFF
.


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

Ладно, зачем трахаться редактируя конфиг, если я это уже сделал. Вот просто возьмите этот эмулятор в котором конфиг, которым я пользуюсь. Этого конфига Вам хватит на все случаи совместимого развития РК86 (версию самого эмулятора можете заменить на более свежую, если у Вас не Win XP). Таймер ВИ53 на вывод звуков я убрал, а то он стоял не пойми где, мешался (добавить не проблема), а в реале ВИ53 пищит по сбросу случайными тонами, если его программно не инициализировать).

Два идентичных конфига Z80 / КР580, отличаются только строкой с CPU. Есть ПЗУ 9000...9FFF с отладчиком (его запуск командой G9000<ВК>), есть 32 страницы доп.ОЗУ по 8 кб в окне A000...BFFF (порт коммутации 8800, а запасной ППА D14 перенесён на 8400) и есть 16 страниц ПЗУ с окном 2 кб (коммутация портом F800). Прерывания, если надо могу добавить. В мониторе доп.директива <B> - загрузка с дисковода. Для реала есть версия ПЗУ, где загрузка дисковода начинается, если удерживать одну из спец.клавиш при нажатии на сброс, но для эмулятора это неудобно, т.к в нём для сброса нужны две руки, а третьей руки у многих нет.

Удобно отлаживать программы используя команду HALT. В исходнике её вставляете в том месте до которого программа прогоняется без ошибок и по запуску странслированной программы вылетаете в этом месте в отладчик (чтобы продолжить трассировку надо забить код 76 HALT-а нулём в окне 'A', или можно перешагнуть HALT просто увеличив регистр PC на 1, - к сожалению, команду U для прохода через команду HALT разработчик Pyk не добавил). Командой Z переключаете мнемоники, если кто привык к иным (жаль, что это не задаётся в конфиге, из-за чего при КР580 приходится переключать непривычную мнемонику).


Attachments:
Emu80.part03.rar [1.34 MiB]
Downloaded 242 times
Emu80.part02.rar [1.34 MiB]
Downloaded 240 times
Emu80.part01.rar [1.34 MiB]
Downloaded 246 times


Last edited by barsik on 17 Jan 2020 10:02, edited 11 times in total.

16 Jan 2020 22:58
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
Если идея введения страничного ПЗУ F800 в окне 2 кб приемлема (не идеально для программирования, но проще в аппаратной доделке на уже готовом изделии), то идея введения картриджа в окне 2 кб - неудачна. Что мешает ввести окно в 16 кб или даже 32 кб. Коду картриджа лучше работать из ПЗУ.
Кажeтся, я не достаточно прозрачно обрисовал условие задачи расширения… :roll:
Paguo-86PK wrote:
Задумaлся над применением картриджа, как у NES,
который мог бы вставляться в панельку оригинального РФ2
То есть, дано - панелька под РФ2 (D17: D0…D7, A0…A10, CS, OE). Никаких других проводков ниоткуда подтягивать строго не рекомендуется. Так как суть задумки в том, чтобы выдернуть из панельки оригинальное ПЗУ и воткнуть свой псевдо-картридж.
Иными словами: Дизайн апгрейда для домохозяек… :idea:

Тем самым, окно - 2 Кб (F800…FFFF), зеркала - 6 Кб (E000…E7FF, E800…EFFF, F000…F7FF).
Никаких кнопочек и тумблеров - на ПЗУ не бывает тумблеров! :no:

Вот с этим и нужно работать!

Эскизняк
Так как в оригинальном РАДИО-86РК процессор 580ИК80А и 573РФ2, то условия прозрачны и жёстки…

У процессора коды DD, ED, FD - зеркала CD.
Тем самым, начальную область ПЗУ можно прописать вот так:
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
F840 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
F850 FD FD .. Таблица адресов подпрограмм API ... ..
F8?0 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
F8E0 .. .. .. .. .. .. .. .. .. Конец таблицы API ..
Где обслуживающий код может быть примерно таким:
Code:
    ORG  0FDCDh
Monitor_Start:
    . . .
    ORG  0FDFDh
Monitor_API_Entry:
;;;;;;;;;;;;;;;;; FDFD
    XTHL        ; Извлекаем индекс вызываемой подпрограммы
    PUSH PSW    ; Сохраняем слово АЛУ
    MOV  A,L    ; Индекс смещён на три байта
    ADD  A      ; Умножаем его вдвое
    ADI  04Ah   ; Потому начало таблицы не F850, а F84A
    MOV  L,A    ; Подготавливаем указатель
    MOV  A,M    ; Считываем младший байт адреса
    INX  H      ; Осталось лишь прочитать
    MOV  M,H    ; Старший байт адреса
    POP  PSW    ; Восстановить слово АЛУ
    XTHL        ; Восстановить HL из стека
    RET         ; И передать управление API функции
;;;;;;;;;;;;;;;;; FE09 - 13 байтов
Фокус в том, что в отличии от PC/M-80 или DOS код подфункции не передаётся через регистр, а задаётся конкретным адресом - классика РЛК. Но, в данном случае подпрограммы вызываются не адресами кратными трём, а более компактно:
Code:
    CALL 0F801h ;
    CALL 0F802h ;
    CALL 0F803h ; Ожидание нажатия клавиши
    CALL 0F804h ; Ожидание нажатия клавиши с эхом на экран
    CALL 0F805h ; Ввод строки символов с клавиатуры в буфер
    CALL 0F806h ; Ввод байта с магнитофона
    CALL 0F807h ; Ввод байта с COM-порта
    CALL 0F808h ; Вывод символа на экран (регистр A)
    CALL 0F809h ; Вывод символа на экран (регистр C)
    CALL 0F8..h ; Всего число функций расширилось до 80
    CALL 0F84Fh ; Завершение программы с кодом выхода


Нюансы
Если картридж оснащать ПЛМ, то механизм переключения страниц можно придумать несколько сложнее…
Так, если вход осуществляется аппаратно - через F800, то этот адрес (ПЗУ:0000) сбрасывает регистр страницы и мы всегда по сбросу гарантировано попадём в оригинальный МОНИТОР.
Так как директивой «DF800,FFFF» выдаёт дамп всех ячеек последовательно, нельзя допустить, чтобы банальный вывод дампа вдруг переключил страницы :exclaim:
Но, так как процессор всегда считывает данные из памяти в порядке инкремента, в логику ПЛМ можно добавить условие переключения страницы именно в исключительном случае - считывание двух последовательных ячеек в порядке декремента (как в x86 командой LODSB после STD).
Программно трюк реализует либо через код в ОЗУ, либо чтением наперёд:
Code:
    LDA  Ein_Moment
Ein_Moment:


Last edited by Paguo-86PK on 17 Jan 2020 08:00, edited 2 times in total.



17 Jan 2020 07:35
Profile WWW
Fanat

Joined: 10 Mar 2018 12:50
Posts: 67
Reply with quote
что-то можно опробовать? Перепрошить штатную РФ2 и проверить?


17 Jan 2020 07:38
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
Shumadan wrote:
что-то можно опробовать? Перепрошить штатную РФ2 и проверить?
Eсли Вы про «Windows'86», то можно попробовать прошить её в РФ2 (запасную) и погонять там программы все…
(Учтите только, что код Windows'86 здесь мой может быть уже устаревшим, так как в свободное время я его дорабатываю…)

Ниже я представляю последнюю работающую версию…


Attachments:
File comment: Особенности:
Директива «G<start>,<break>» не портит ячейки отлаживаемой программы;
Неверная «Esc-последовательность» по-умолчанию сигнализируется «звонком»

Windows86-ROM-Dump.zip [1.36 KiB]
Downloaded 247 times


Last edited by Paguo-86PK on 17 Jan 2020 08:31, edited 2 times in total.

17 Jan 2020 07:57
Profile WWW
Fanat

Joined: 10 Mar 2018 12:50
Posts: 67
Reply with quote
Paguo-86PK wrote:
(Учтите только, что код Windows'86 здесь мой может быть уже устаревшим, так как в свободное время я его дорабатываю…)

Ниже я представляю последнюю работающую версию…

Этот файл недоступен. А ссылка выше - лишь ассемблерный текст
.....
прошу прощения,все скачал.
Блин, я думал он в бинарнике. Сейчас подумаю как TXT перевести в BIN


17 Jan 2020 08:32
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
Shumadan wrote:
Блин, я думал он в бинарнике. Сейчас подумаю как TXT перевести в BIN
Пoчти обиделся на Вас :oops:
В хорошем смысле! :lol:

То есть, это не Вы должны ломать голову с конвертированием, а обязан предоставить был бинарник… :idea:
Так как с моей стороны это сделать гораздо легче… :exclaim:

Как работать с вьюпортом
Естественно, чтобы протестировать "окошки", нужен хоть какой-то код…
БЕЙСИК - прозрачен и понятен всем!
Чтобы не зависеть от диалектов, никаких особых операторов не использовалось:
Code:
1000 REM *** УПРАВЛЕНИЕ ВЬЮПОРТОМ ***
1010 LET VL=30224:REM - VIEWPORT_LEFT
1020 LET VT=30225:REM - VIEWPORT_TOP
1030 LET VR=30226:REM - VIEWPORT_RIGHT
1040 LET VB=30227:REM - VIEWPORT_BOTTOM
1050 REM ПЕРЕД ИЗМЕНЕНИЕМ ВЬЮПОРТА
1060 REM НЕОБХОДИМО РАЗВЕРНУТЬ ЕГО НА ВЕСЬ ЭКРАН
1070 POKE VL,0:POKE VT,0:POKE VR,77:POKE VB,29
1080 REM ТЕПЕРЬ ВЬЮПОРТ 78*30
1090 STOP:REM ПОСЛЕ ОПЫТОВ НАБЕРИТЕ "CONT"
1100 REM *** ПРОДОЛЖАЕМ ОПЫТЫ ***
1110 REM ИЗМЕНИМ ВЬЮПОРТ ДО 32*24
1120 REM КАК В ZX-SPECTRUM
1130 LET ES$=CHR$(27)
1140 LET X1=23:LET Y1=3
1150 LET X2=54:LET Y2=26
1160 PRINT ES$;"Y";CHR$(32+Y1);CHR$(32+X1);
1170 POKE VL,X1:POKE VT,Y1:POKE VR,X2:POKE VB,Y2
1180 REM ТЕПЕРЬ ВЬЮПОРТ 32*24 ПО ЦЕНТРУ
1190 STOP:REM ПОСЛЕ ОПЫТОВ НАБЕРИТЕ "CONT"
1200 REM *** ПРОДОЛЖАЕМ ОПЫТЫ ***
1210 REM ПЕРЕД ИЗМЕНЕНИЕМ ВЬЮПОРТА
1220 REM НЕОБХОДИМО РАЗВЕРНУТЬ ЕГО НА ВЕСЬ ЭКРАН
1230 POKE VL,0:POKE VT,0:POKE VR,77:POKE VB,29
1240 REM КУРСОР "ДОМОЙ"
1250 PRINT CHR$(12);
1260 REM ТЕПЕРЬ ВЬЮПОРТ 78*30
1270 STOP:REM ПОСЛЕ ОПЫТОВ НАБЕРИТЕ "CONT"


Attachments:
File comment: Демонстрационный образ на Бейсике для Emu3000.
Для наглядной работы требуется ПЗУ Windows86

ViewPort.zip [8.16 KiB]
Downloaded 236 times
File comment: MONITOR "WINDOWS-86РК" - 32 Kb
Windows86_32Kb.zip [1.9 KiB]
Downloaded 245 times


Last edited by Paguo-86PK on 17 Jan 2020 12:48, edited 2 times in total.

17 Jan 2020 09:42
Profile WWW
Fanat

Joined: 10 Mar 2018 12:50
Posts: 67
Reply with quote
Paguo-86PK wrote:
То есть, это не Вы должны ломать голову с конвертированием, а обязан предоставить был бинарник… :idea:
Так как с моей стороны это сделать гораздо легче… :exclaim:

Да я не стал просить, а то скажут "какой привередливый, я тут ночей не сплю, а ему готовый код предоставь)"
Так что, спасибо, за проделанную работу.


17 Jan 2020 10:12
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
Shumadan wrote:
Так что, спасибо, за проделанную работу.
Eсли правда рискнёте прошивать, выше - бинарник и листинг на Бейсике, из которого каждому будет всё ясно… :mrgreen:


17 Jan 2020 10: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
Paguo-86PK wrote:
То есть, дано - панелька под РФ2 (D17: D0…D7, A0…A10, CS, OE). Никаких других проводков ниоткуда... Дизайн апгрейда для домохозяек.
Оказывается речь о апп.доработке без пайки. По типу, как сэр Клайв делал апгрейд бейсика в ZX80 на бейсик от ZX81. Там аудиторией апгрейда были лишённые технических знаний, умений и даже электро-паяльника владельцы ZX80. Они только и были в состоянии снять крышку, выковырять из панельки одно ПЗУ и вставить на его место другое (вдвое большее), заменить плёнку с надписями клавиатуры и завинтить крышку.

У сэра Клайва были основания так поступить, а у Вас нет. Если кто-то и возьмётся повторить, то это явно не домохозяйка, а опытный радиолюбитель. И чем Ваш способ лучше моего из 1991? У меня без доп.микросхем, лишь панелька напаивается на ПЗУ и кусок проволоки от ППА, а у Вас целая плата, зачем-то ПЛИС, какой-то навороченный интерфейс между страницами.

Наличие в каждой странице ПЗУ приведённых мной выше процедур для CALL п/п-ммы в любой другой банке решает все задачи и простым привычным способом, - пишем программы обычно, как привыкли, и любую программу или подпрограмму вообще нет труда переделать для работы в мелкостраничном ПЗУ (всё что надо сделать, например CALL CONIN заменить на CALL YCONIN).

Да и ваш способ разработки программ удивляет - разработка программ в машинных кодах под отладчиком, а просматривать программы в виде странного дампа. Когда есть нормальные текстовые редакторы, макроассемблеры и даже компиляторы ЯВУ.

Поставленные Вами условия невыполнимы. Без паяльника не обойтись. А если применять паяльник, то выгоднее сделать как лучше для программ: по вторжениям в плату разницы нет - припаять на основную плату два проводка и получить не самую удобную архитектуру или припаять туда 5 проводков и сделать несколько разрезов и получить удобство программирования в виде сплошного куска ПЗУ в 16 кб (C000...FFFF).

Когда подключается картридж, то по сбросу ничего не меняется, есть то же ПЗУ F800 и ВТ57 на C000. Но при включении картриджа битом какого либо порта, ПЗУ расширяется на окно C000...FFFF, хотя ВТ57 становится уже недоступным. Ну или в крайнем случае, картридж с окном в 8 кб (E000...FFFF) тоже лучше, чем картридж с мелким окном в 2 кб. Одно дело когда мы делаем доработку на самой основной плате, тут нужен самый минимум, потому мелкостраничность ПЗУ оправдана. А уж когда делается новая плата новодел, то разумнее поставить ещё один дешёвый TTL-корпус на неё и поиметь ПЗУ в большем окне.

Конструктивно Вы собираетесь сделать платку, на которой смонтирована панелька 28 ног и другие детали, а со стороны пайки припаяны 24 штырька отломанных от ПЗУ 27256. Потому такая платка имеет как бы разъём DIP-24 втыкаемый в панельку РФ2. Я таким способом делал переходник КР580 --> Z80 и буферизацию КР580 с помощью ВК28 (идея не моя).

PS. В России тоже выпускались 8-ми разрядки с программными картриджами. Речь о "Patisonic-48". Это клон ZX-Spectrum с игровыми картриджами (его можно менять даже не отключая питания и без вреда для текущей программы, благодаря тому, что ПЗУ с игрой включалось не в шину, а игра закачивалась программно через порт).


Last edited by barsik on 17 Jan 2020 13:42, edited 2 times in total.



17 Jan 2020 13:06
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
Мeжду тем, на соседнем форуме на вопрос о таком трюке подмены ПЗУ знатоки посоветовали посмотреть в сторону STM или PIC, так как распиновка там конфигурируется программно, а производительности вполне хватит, чтобы разбирать целые команды текстовым протоколом.
То есть…
Code:
>>> Послать команду "PAGE 45"
--- Читаем FF50
--- Читаем FF41
--- Читаем FF47
--- Читаем FF45
--- Читаем FF20
--- Читаем FF34
--- Читаем FF35
--- Читаем FF0D
Лично мне такая реализация Супер-ПЗУ нравится больше всего… :roll:

P.S.: Остаётся лишь кристалл подобрать под панельку, чтобы питание совпало и т.д… :obye:


17 Jan 2020 13:40
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Paguo-86PK wrote:
знатоки посоветовали посмотреть в сторону STM или PIC
Это неуместно для РК86. Ну ладно, нет альтернативы Atmega для адаптера PC-клавиатуры (мало кому охота трахаться с кнопками ВМ16 или даже Cherry). К тому же это просто внешний адаптер, а не сам ретро-комп. А для основной платы за окном ещё 1986 год, т.е детали должны быть из эпохи. Иначе это тот же эмулятор, только в злостно извращённой форме.

Замечу, что большое ПЗУ прокачиваемое страницами в маленьком окне, это по сути ROM-диск, тогда как ПЗУ доступное в окне 16 кб это программа работающая из этих адресов и не отнимающая ОЗУ. В этом случае большое ПЗУ и ROM-диск не равноценны.
Paguo-86PK wrote:
подпрограммы вызываются не адресами кратными трём, а более компактно:
Code:
    CALL 0F801h ;
    CALL 0F802h ;
    CALL 0F803h ; Ожидание нажатия клавиши
    CALL 0F804h ; Ожидание нажатия клавиши с эхом на экран
    CALL 0F805h ; Ввод строки символов с клавиатуры в буфер
    CALL 0F806h ; Ввод байта с магнитофона
    CALL 0F807h ; Ввод байта с COM-порта
    CALL 0F808h ; Вывод символа на экран (регистр A)
    CALL 0F809h ; Вывод символа на экран (регистр C)
    CALL 0F8..h ; Всего число функций расширилось до 80
    CALL 0F84Fh ; Завершение программы с кодом выхода

Извините, но мне почти ничего не понятно.

Сначала Вы собирались сделать, чтобы в каждой странице ПЗУ впустую тратились те же 54 байта (F800...F835) на входные JMP-ы. Теперь я вообще ничего не понимаю. Какой код стоит в области F800 в странице ПЗУ, где вызывают подпрограммы так, как приведёно в выше цитируемом фрагменте? Непонятно как без RST или загрузки в стек могут быть входы с шагом 1.

Похоже Вы начали изобретать совсем новый ROM-BIOS, зачем-то стараясь прицепить его к стандартному ПЗУ РК. Просто скажите, что ввели страничность ПЗУ, чтобы в странице ПЗУ 0 осталось стандартное ПЗУ РК, а страница ПЗУ 1 теперь стала интерфейсом к новой версии ROM-BIOS не имеющей ничего общего со старыми стандартами программного интерфейса.

Покажите какой командой и где переключаются страницы ПЗУ, какой механизм передачи управления в другую страницу и возврата? Не вижу никакой экономии и привычную адресацию стандартных подпрограмм Вы просто изуродовали без пользы. Зачем привыкать к таблице входов с шагом 1. Это же похоже у Вас внутри Вашего ПЗУ в какой-то из страниц и доступно только Вам. А Вы кодом в этом же ПЗУ обращаетесь к исполнительным частям напрямую и по именам, а не по позиционным номерам. Зачем тогда это табличка входов пусть и с шагом 1?


17 Jan 2020 13:51
Profile
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
barsik wrote:
А для основной платы за окном ещё 1986 год, т.е детали должны быть из эпохи. Иначе это тот же эмулятор, только в злостно извращённой форме.
Согласeн… Подтягивать тот же AtMega на место РФ2 - совсем уж занесло меня на поворотах! :lol:
(Но этот вариант был бы самым гибким и умным!)
barsik wrote:
Мне не всё понятно.
Вариантов МОНИТОРа (с нуля) у меня несколько. Просто, прощупываю варианты… :rotate:
barsik wrote:
Сначала Вы собирались сделать, чтобы в каждой странице ПЗУ впустую тратились те же 51 байт (F800...F832) на входные JMP-ы.
Для обратной совместимости в каждой версии МОНИТОРов…
barsik wrote:
Теперь я вообще ничего не понимаю.
Спасибо, что запутались! Значит более-менее следите за ходом и прыжками моих мыслей! :roll:
barsik wrote:
Какой код стоит в области F800 в банке, где приведён выше цитируемый фрагмент? Покажите какой командой и где переключаются страницы ПЗУ, какой механизм передачи управления в другую страницу и возврата?
Просто это вариант одной-двух страниц(ы) ПЗУ. Чтобы показать, как с шагом в 1 байт разместить переход на десятки подпрограмм…
barsik wrote:
А Вы обращаетесь к исполнительным частям напрямую и по именам, а не по позиционным номерам. Зачем тогда это табличка входов пусть и с шагом 1?
Если убрать всю таблицу и переключать страницы - этот способ с «FD» самый практичный, так как не требует индекс страницы передавать через аккумулятор…

А теперь…

Варианты
При чтении F800 индекс страницы сбрасывается - это должно быть «де-факто» и никто с этим спорить не станет…
Если индекс страницы отличен от нуля - чтение кода из F801…F8FF переключает страницы автоматически. Записав там сплошные «FD», можно передавать управление всегда на FDFD с аппаратным переключением. То есть, с FDFD начинается код конкретного API, без необходимости программного переключения страницы…
Однако
Как вернуть управление коду со страницы N на страницу X?
Это портит всю малину!
Можно, конечно, использовать LIFO-буферы, типа подобных, но это - то же извращение… :oops:
(На данном этапе, я - как любитель, готов в истерике плюнуть на всё! Так как задача - не правительственный заказ, а моя дурость, честно говоря…)
Так что, вариант - самый оптимальный, но только для моментального входа в нужную страницу.
Можно браться за реализацию через AM29M16.
Если только придумать и механизм возврата - на нём можно и остановиться :question:

Активация
Наиболее безопасная - чтение адресов FFFF и FFFE. Именно в обратной последовательности: Никакой здравый код это не делал, что гарантирует защиту от случайной активации страничного режима в оригинальном ПО!
Как это сделать простейшей логикой - вопрос!
Если на эти адреса повесить D-триггеры - вариант, который нужно набросать…

Танцы с бубном в недрах стека
Если для вызова подпрограммы в одной из 256 страниц оформляем вхождение вот так:
Code:
     .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
F800 FF FD 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
F840 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
F850 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
F860 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
F870 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
F880 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
F890 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
F8A0 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
F8B0 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
F8C0 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
F8D0 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
F8E0 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
F8F0 FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD FD
.... .. ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ..
То шапка и хвост кода могут иметь следующий вид:
Code:
     ORG  0FDFDh
     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
Очень всё запутано и проверить пока сложно.
Но, программно прыгать между страницами примерно можно уже понять как… :idea:

P.S.: Что думаете?


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

Who is online

Users browsing this forum: No registered users and 11 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.