Июнь 2019
ПнВтСрЧтПтСбВс
     12
3456789
10111213141516
17181920212223
24252627282930

Календарь Календарь

Последние темы
» Ферритовые антенны.
автор Viktor2312 Сегодня в 16:27

» ПЭВМ "Ириша". Программное обеспечение (ПО), общая тема.
автор barsik Вчера в 17:03

» ПЭВМ "Электроника МС1502"
автор alemorf Вчера в 12:12

» "Орион Супер-4" (Ташкентский).
автор barsik Вчера в 09:57

» ПЭВМ Специалист, основной вариант
автор barsik Вс Июн 16 2019, 17:00

» Орион-128. Документация, схемы, платы...
автор Viktor2312 Вс Июн 16 2019, 11:21

» Жалобы/пожелания по работе форума
автор barsik Сб Июн 15 2019, 20:56

» Специалист как болванка для творчества аппаратчиков
автор barsik Сб Июн 15 2019, 11:55

» SINOVATE (SIN). Криптовалюта Синовэйт.
автор Viktor2312 Чт Июн 13 2019, 22:10

» Партнер 01.01: О компьютере
автор alemorf Чт Июн 13 2019, 14:29

» ПЭВМ "Эрик"
автор barsik Чт Июн 13 2019, 13:45

» Микросхемы ПЛИС CPLD CoolRunner-II.
автор Viktor2312 Чт Июн 13 2019, 09:46

» Litecoin (LTC). Криптовалюта Лайткоин.
автор Viktor2312 Вт Июн 11 2019, 19:58

» Новинки. Книги. Часть 3.
автор Viktor2312 Вт Июн 11 2019, 07:40

» Обмен между дискетами CP/M <-> IBM (720Kb)
автор barsik Сб Июн 08 2019, 18:30

» Орион-ПРО. Эмулятор iMSX
автор barsik Сб Июн 08 2019, 17:53

» Подключение 3.5" дисковода к Ориону
автор barsik Сб Июн 08 2019, 17:40

» Download для ОРИОНА
автор barsik Пт Июн 07 2019, 20:04

» Формирователь монохромного видеовыхода ОРИОНА
автор barsik Пт Июн 07 2019, 18:05

» Орион-128. Расширение памяти до 512 КБ на 565РУ7.
автор barsik Пт Июн 07 2019, 11:02

» КНГМД (Орион-Турбо)
автор barsik Пт Июн 07 2019, 10:36

» Расширение порта F600. "Орион-128".
автор barsik Пт Июн 07 2019, 10:22

» Орион-128: Полезные доработки ПЭВМ
автор barsik Пт Июн 07 2019, 09:49

» Орион-128: Демки
автор barsik Пт Июн 07 2019, 09:15

» Орион-128: BASIC
автор barsik Пт Июн 07 2019, 08:50

Самые активные пользователи за месяц
Viktor2312
Программирование для ИРИШИ Vote_lcapПрограммирование для ИРИШИ Voting_barПрограммирование для ИРИШИ Vote_rcap 
barsik
Программирование для ИРИШИ Vote_lcapПрограммирование для ИРИШИ Voting_barПрограммирование для ИРИШИ Vote_rcap 
alemorf
Программирование для ИРИШИ Vote_lcapПрограммирование для ИРИШИ Voting_barПрограммирование для ИРИШИ Vote_rcap 
parsec
Программирование для ИРИШИ Vote_lcapПрограммирование для ИРИШИ Voting_barПрограммирование для ИРИШИ Vote_rcap 

Поиск
 
 

Результаты :
 


Rechercher Расширенный поиск


Программирование для ИРИШИ

Перейти вниз

Программирование для ИРИШИ Empty Программирование для ИРИШИ

Сообщение  barsik в Ср Апр 03 2019, 14:52

1
Хотя раздел о программах для ИРИШИ, но перед тем как программы появляются, чтобы их можно было уже обсуждать на форуме, требуется чтобы эти программы кто-то написал. Потому логично в этом разделе обсуждать и то как писать программы для ИРИШИ.

Точнее, как писать программы в общем смысле и так многие знают, - это делается путём нажатия клавиш клавиатуры в определённом порядке, чтобы в итоге набрался исходный текст программы на каком нибудь языке программирования. После чего полученный исходник транслируется соответствующим компилятором и получается новая программа для ИРИШИ.

Но ИРИША имеет специфические архитектурные особенности (в частности, в отличие от всех других отечественных ЭВМ, ROM-BIOS ИРИШИ отстутствует в адресном пространстве программ, отчего для вызова стандартных входов ПЗУ приходится аппаратно переключать архитектуру). Программирование на разных ЯВУ имеет тоже свои особенности (применительно к ОС и архитектуре ИРИШИ).

Вот такие и подобные нюансы можно обсудить в этой теме, что может помочь программистам начать заниматься творчеством для ИРИШИ. Для начала рассмотрим как в программах использовать подпрограммы ПЗУ ИРИШИ.

Те программы ИРИШИ, которым не надо много ОЗУ обычно работают с адреса $4000. Такие программы при старте однократно и навсегда включают карту памяти 0, отчего в области 0...3FFF оказывается ПЗУ, и в дальнейшем уже не требуется коммутация карт памяти (т.к ОЗУ ниже $4000 не используется и ПЗУ включённое здесь не мешает).

ROM-BIOS ИРИШИ для отладки таких программ специально сделан так, чтобы отладчик мог работать и при включённом ПЗУ. После включения карты 0, архитектура напоминает ZX-Spectrum (там тоже ПЗУ до 4000), только экран в ИРИШЕ в старших адресах, а не над ПЗУ.

Т.о программы, которым весь объём сплошной памяти не нужен, удобно размещать с 4000. Тогда при старте программы включаем карту 0, отчего на адресах 0...3FFF появляется ROM-BIOS и становится доступным без коммутации архитектуры.

Вообще для работы программ требуется только ПЗУ CONOUT стоящее на 2000...3FFF. Т.к клавиатура аппаратная, то процедура её обслуживания предельно проста и ПЗУ BOOTM на адресах 0...1FFF совсем не нужно. Это позволяет в локальную магистраль включить крошечную платку расширения ОЗУ со статикой, которое коммутируется в окне 0...1FFF, но включено только в карте 0 вместо ненужного для программ ПЗУ BOOTM.

Ещё от МИКРО-80 повелось так, что программы для отечественных ЭВМ на КР580 используют стандартные входы в ROM-BIOS на адресах F803...F838 с шагом 3. Это позволяло обеспечить совместимость корректных программ для разных ЭВМ. К сожалению, авторы игр для ЮТ88, РК86 и МИКРО-80, сдуру для упрощения программирования, делали игры некорректными, работая с экраном и клавиатурой по железу. Потому впоследствии перенести на другие машины удалось лишь чисто системные железо-независимые программы типа редактор, ассемблер, отладчик, DOS и частично бейсик.

Тем не менее, все программисты для любительских 8-ми разрядок уже привыкли к такому набору подпрограмм в ROM-BIOS и этот же набор подпрограмм необходим для адаптации чисто системных программ от РК86 на ИРИШУ. Особой пользы от адаптации системных программ РК нет, но полезно для массовости, например, наличие на ИРИШЕ бейсика РК86, позволяет увидеть все 30 убогих бейсиковых РК-программ на ИРИШЕ.

Несколько бОльший интерес представляют игры от РК86 и других текстовых машин. К сожалению, буквально единицы игр РК являются корректными, т.е 95-ти процентам игр РК наличие совместимых входов не поможет.

Итак, для того, чтобы на ИРИШЕ смогла заработать какая-нибудь корректная программа от РК86 надо поиметь в ОЗУ набор подпрограмм (не обязательно по адресам на F800) аналогичный тем, что имеется в ПЗУ РК86.

Для некоторых программ и этого недостаточно, а надо имитировать ещё рабочие ячейки ПЗУ РК86. А именно, для некоторых наглых программ п/п-мма COUTC должна после каждого вывода менять экранные координаты в ячейках 7600/7602 (т.к программы их читают), а при выводе делать вывод по экранным координатам из этих ячеек (т.к есть наглые программы, что вместо стандартного метода смены координат курсора искейп-кодом 1B,59 нагло сами подставляют в эти ячейки экранные координаты курсора).

Этот набор подпрограмм невелик по объёму и подключение его к каждой адаптируемой программе не создаст больших потерь памяти и дискетного пространства. Однако всё-же выгоднее и этот набор РК-подобных подпрограмм переместить в ПЗУ. В ПЗУ ИРИШИ есть почти 2 кб пустоты, а точнее $7C0 байтов (а после выкидыша из ПЗУ разного ненужного хлама типа загрузки из сети, с двух дисководов, из ROM-дисков, поддержки запасных клавиатур и т.п, освобождается ещё полкило).

Тогда имея исходник любой корректной РК-программы, лишь только поменяв адреса стандартных подпрограмм в строках EQU можно без труда получить версию РК-программы пригодную для ИРИШИ. Понятно, что это работает только для корректных чисто текстовых программ. Игры практически все так не адаптировать, их надо существенно модернизировать или эмулировать.

По вышеуказанным причинам связанным с архитектурой ИРИШИ удобно программы РК перетранслировать на адрес 4000. Это имеет преимуществом то, что, как указано выше, тогда подпрограммы эмулирующие стандартные РК-входы можно прошить в ПЗУ ИРИШИ и не трахаться с подключением к каждой игре своего набора РК-подпрограмм.

Для программиста пишущего программу, стандартные входы - по функциям те же самые, что и на РК86, только они стоят не на F800, а в ПЗУ ИРИШИ (т.е ниже 4000). И тогда программисту даже знать об извращённой архитектуре ИРИШИ ничего не требуется. Т.е пишешь и отлаживаешь программу на РК86, а закончив меняешь ключ условной трансляции и второй раз транслируешь уже версию для ИРИШИ.

Кое-кто наглый, но очень сообразительный, возразит, что для РК-программ, что используют команды RST перетрансляция на адрес 4000 отличный от 0 невозможна. Это так, но авторы ПЗУ ИРИШИ были достаточно умны, чтобы оставить ячейки 0008...003A в ПЗУ пустыми. Хотя ума у них всё-же не хватило, чтобы заполнить эти ячейки кодом FF, а не нулями (из-за этого нельзя ПЗУ допрошить). Так вот прошив в ПЗУ на адреса 8, 10, 18... 38 джампы на адреса 4008, 4010, 4018... 4038, наличие в программе команд RST не помешает переносу на 4000.

Понятно, что есть программы, которые чтобы иметь максимальное свободное ОЗУ выгодно загружать с 0 (для чего ПЗУ ИРИШИ д.быть отключено из адресного пространства). Тогда для связи с иришиным ROM-BIOS надо размещать модуль связи выше RAMTOP.

Иметь все 18 подпрограмм из ПЗУ РК не требуется. Основной набор п/п-мм, что надо иметь для разработки в стиле РК и адаптации включает лишь следующие подпрограммы:

CONIN   F803
COUT_C  F809
STATUS  F812
HEX_A   F815
MSSG    F818
XF81B   F81B
ASKCUR  F81E
RD_SCR  F821
CHKSUM  F82A

Причём п/п-ммы запроса координат и чтения с экрана (ASKCUR и RD_SCR) почти никогда не используются (не видел таких игр), т.к проще посмотреть координаты прямо в раб.ячейках 7602 и считать байт из адреса, что хранится в ячейке 7600. Также удобно добавить сюда подпрограммы для управления режимами ИРИШИ и цветами, а также (полезные для отладки) подпрограммы вывода дампа и содержимого регистров.

Таким образом при наличии модуля РК-интерфейса (в ПЗУ или в ОЗУ без разницы) программирование текстовых программ для ИРИШИ не отличается от программирования корректных программ для РК86 (т.е таких программ, что не лезут нагло в экран и в матрицу клавиш).

Т.к мне тоже непривычен ROM-BIOS ИРИШИ, - ниже реальный модуль, что я использую при написании программ для ИРИШИ с адреса 4000, а также для перетрансляции на ИРИШУ корректных программ от других любительских компьютеров. Этот простейший модуль размером в 300 байт включается в программу с помощью INCLUDE или отдельно транслируется и добавляется при линковке.

Сюда добавлены некоторые нужные в работе подпрограммы. Например, подпрограмма вывода дампа. Со входа DUMPX она настраивается на ширину экрана текущего режима ИРИШИ (т.е в 40-ка символьном режиме выводит дамп по 8 байтов в ряду, а в 80-ти символьном по 16), а со входа DUMPIN можно задать размер дампируемой области (чтобы не заполнять весь экран, если надо посмотреть лишь несколько байт).

Подпрограммы для включения режимов MODEx можно усовершенствовать за счёт экзотических возможностей макро генерации, что есть в М80 (и нет в написанных любителями ассемблерах для Windows). Т.е можно создать макро команду с передаваемыми параметрами - N видео режима, число строк экрана (20 или 25), страница экрана и общеэкранный цвет. Тогда макрокоманда будет из параметров формировать нужные байты и подставлять в нужных местах управляющих строк.

Кстати, подобные развитые макро команды особенно удобны при цветном оконном драйвере. Тогда например для вывода окна с титрами, рамками и сообщением в нём (все разными цветами), в исходнике пишешь всего одну макрокоманду, указывая в ней более десятка оконных параметров, а она заменяется при генерации полсотней строк кода, что здорово экономит время программиста.

блок эмуляции стандартных РК-входов:

       .Z80
        cseg

LENGTH  EQU     0FF44H          ; ширина окна в байтах/символах
MODE    EQU     0FF45H          ; байт управления CONOUT

CONOUT  EQU     2000H

KBD     EQU     4

PA      EQU     10H
PB      EQU     11H
PC      EQU     12H
PU      EQU     13H

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

LOOP    MACRO   ADDR
        DEC     BC
        LD      A,B
        OR      C
        JP      NZ,ADDR
        ENDM

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

EMIT    MACRO   BYTE
        LD      A,BYTE
        CALL    SCOUTA
        ENDM

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

LOCATE  MACRO   VKOO,HKOO
        LD      HL,VKOO + (HKOO shl 8 )
        CALL    POS_HL
        ENDM

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

ESCOUT  MACRO   BYTE
        EMIT    27
        EMIT    BYTE
        ENDM

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

.msg    MACRO   ADDR
        LD      HL,ADDR
        CALL    MSSG
        ENDM

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

.jmsg   MACRO   ADDR
        LD      HL,ADDR
        JP      MSSG
        ENDM

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

.djnz   MACRO   ADDR
        DEC     B
        JP      NZ,ADDR
        ENDM

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

MODE1:  .jmsg   TMOD1

MODE2:  .jmsg   TMOD2

MODE3:  .jmsg   TMOD3

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

CLS:    EMIT    0CH
HOME:   LD      C,0BH
COUTC:  PUSH    HL              ; код д.быть выше 4000 !!!
        PUSH    DE
        PUSH    BC
        PUSH    AF              ; F809 сохраняет флаги AF
       
;       IN      A,(PC)          ; откомментировать,если карта не 0
;       PUSH    AF
;       AND     11110011B
;       OUT     (PC),A

        CALL    CONOUT

;       POP     AF
;       OUT     (PC),A

        POP     AF
POPREG: POP     BC
        POP     DE
        POP     HL
        RET

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

CR_HEX: CALL    CR
HEX_HL: LD      A,H
        CALL    HEX_A
        LD      A,L
HEX_A:  PUSH    AF
        RRCA
        RRCA
        RRCA
        RRCA
        CALL    NIBBLE
        POP     AF
NIBBLE: AND     0FH
        CP      10
        CCF
        ADC     A,30H
        DAA
SCOUTA:
        PUSH    BC
        LD      C,A
        CALL    COUTC
        POP     BC
        RET

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

POS_HL: PUSH    DE
        LD      DE,2020H
        ADD     HL,DE
        POP     DE
        LD      (TPOS+2),HL
        .jmsg   TPOS

TPOS:   defb    1BH,59H,20H,20H,0

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

STATUS: LD      A,00001110B     ; PC7=0 (выбор функции порта B)
        OUT     (PU),A
        IN      A,(PB)          ; PB7 готовность клавиатуры
        RLA
        LD      A,0
        JP      NC,STAT1
        DEC     A
STAT1:  OR      A
        RET

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

CONIN:  CALL    STATUS
        JP      Z,CONIN
        IN      A,(KBD)
        AND     7FH
        RET

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

MSSG:   LD      A,(HL)
        OR      A
        RET     Z
        CALL    SCOUTA
        INC     HL
        JP      MSSG

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

CR:     EMIT    13
        LD      A,10
        JP      SCOUTA

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

CHSUM:  LD      BC,0000         ; B - ARIF.SUM,C - PARITY
CHSM1:  LD      A,C
        ADD     A,(HL)
        LD      C,A
        PUSH    AF
        CALL    CMPDH
        JP      Z,POPAF
        POP     AF
        LD      A,B
        ADC     A,(HL)
        LD      B,A
        INC     HL
        JP      CHSM1

POPAF:  POP     AF
        RET

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

CMPDH:  LD      A,H
        CP      D
        RET     NZ
        LD      A,L
        CP      E
        RET

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

XDUMP:  LD      A,(LENGTH)
        CP      40
        LD      A,7
        LD      B,0C0H
        JP      Z,JJJ_01
        LD      A,15
        LD      B,0
JJJ_01: LD      (KOR1+1),A
        LD      (KOR2+1),A
        LD      (KOR3+1),A
        LD      (KOR4+1),A
        LD      A,B

DUMPIN: LD      (RDUMP),A
DUMP:   PUSH    HL
        PUSH    DE
        PUSH    BC
        CALL    CR_HEX
        CALL    SPACE2
        LD      A,L
KOR1:   AND     7
        JP      Z,DUMP1
        LD      B,A
        ADD     A,A
        ADD     A,B
        LD      B,A
        CALL    SPACEB
DUMP1:  defb    06H             ; LD B,NN
RDUMP:  defb    0C0H            ; длина дампа
DUMP0:
        PUSH    BC
        PUSH    HL
DMPLO1:
        LD      A,(HL)
        CALL    HEX_A
        CALL    SPACE
        INC     HL
        LD      A,L
KOR2:   AND     7
        JP      NZ,DMPLO1
        CALL    SPACE
        POP     HL

        LD      A,L
KOR3:   AND     7
        CALL    NZ,ASCII1

        POP     BC
DMPLO2:
        PUSH    BC
        LD      A,(HL)
        CP      20H
        JP      NC,DUMP5
        LD      A,'.'
DUMP5:
        CALL    SCOUTA
;       CALL    SPACE
        INC     HL
        POP     BC
        .djnz   DUMP3

        LD      (DMPADR),HL
        JP      POPREG

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

ASCII1: ADD     A,A
        LD      B,A
SPACEB: EMIT    20H
        .djnz   SPACEB
        RET

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

DUMP3:  LD      A,L
KOR4:   AND     7
        JP      NZ,DMPLO2
        CALL    NEWLIN          ; это: CR,HEX_HL,SPACE2
        JP      DUMP0

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

NEWLIN: CALL    CR_HEX
SPACE2: CALL    SPACE
SPACE:  LD      A,20H
        JP      SCOUTA

DMPADR: DW      0000

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

TMOD1:  defb    1BH,51H,01101000B  ; режим работы CONOUT
        defb    1BH,4CH         ; окно во весь экран
        defb    0CH,0

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

TMOD2:  defb    1BH,51H,01101001B  ; режим работы CONOUT
        defb    1BH,4CH         ; окно во весь экран
        defb    1BH,50H         ; set COLOR

;       defb    00000000B       ; магента на синем   ???
;       defb    00000001B       ; синий на чёрном
;       defb    00000010B       ; зелёный на чёрном
;       defb    00000011B       ; голубой на чёрном
;       defb    00000100B       ; красный на чёрном
;       defb    00000101B       ; магента на чёрном
;       defb    00000110B       ; жёлтый на чёрном
        defb    00000111B       ; белый на чёрном

;       defb    00001000B       ; синий на белом
;       defb    00001001B       ; синий на синем
;       defb    00001010B       ; зелёный на синем
;       defb    00001011B       ; голубой на синем
;       defb    00001100B       ; красный на синем
;       defb    00001101B       ; магента на синем
;       defb    00001110B       ; жёлтый на синем
        defb    00001111B       ; белый на синем

;       defb    00100000B       ; зелёный на белом  
;       defb    00100001B       ; синий на зелёном
;       defb    00100010B       ; зелёный на зелёном
;       defb    00100011B       ; голубой на зелёном
;       defb    00100100B       ; красный на зелёном
;       defb    00100101B       ; магента на зелёном
;       defb    00100110B       ; жёлтый на зелёном
;       defb    00100111B       ; белый на зелёном

;       defb    00101000B       ; магента на белом
;       defb    00101001B       ; синий на магента
;       defb    00101010B       ; зелёный на магента
;       defb    00101011B       ; голубой на магента
;       defb    00101100B       ; красный на магента
;       defb    00101101B       ; магента на магента
;       defb    00101110B       ; жёлтый на магента
;       defb    00101111B       ; белый на магента

        defb    0CH,0

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

TMOD3:  defb    1BH,51H,01101010B  ; режим работы CONOUT
        defb    1BH,4CH         ; окно во весь экран
        defb    1BH,50H         ; set COLOR

;       defb    00000000B       ; белый на магента
        defb    00000001B       ; белый на синем
;       defb    00000010B       ; белый на зелёном
;       defb    00000011B       ; белый на голубом
;       defb    00000100B       ; белый на красном
;       defb    00000101B       ; белый на магента
;       defb    00000110B       ; белый на тёмно-жёлтом
;       defb    00000111B       ; белый на сером

;       defb    00001000B       ; белый на светло-магента      
;       defb    00001001B       ; белый на светло-синем              
;       defb    00001010B       ; белый на светло-зелёном      
;       defb    00001011B       ; белый на светло-голубой      
;       defb    00001100B       ; белый на светло-красном      
;       defb    00001101B       ; белый на светло-магента      
;       defb    00001110B       ; белый на светло-жёлтом      
;       defb    00001111B       ; белый на светло-серый      

        defb    0CH,0

        END


Вот выведенное приведённой подпрограммой дампа содержимое файла управления в режиме 3:


Программирование для ИРИШИ Dampfajlaupravleniya.1554293395


Последний раз редактировалось: barsik (Пн Май 20 2019, 22:26), всего редактировалось 1 раз(а)

_________________
***
barsik
barsik
Мастер+

Сообщения : 490
Дата регистрации : 2016-11-10
Откуда : С-Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Программирование для ИРИШИ Empty .

Сообщение  barsik в Вс Апр 14 2019, 20:04

2
Хотелось бы нацарапать на Паскале конвертор цветной графики от ОРИОНА (16-ти цв.режим, т.к 4-х цветной графики на ОРИОНЕ нет) в 4-х цветную графику в формате CGA (2 бита на пиксель).

Конечно, быстрее это можно сделать на бейсике. На PC конечно! Используя Quick-, Power- или Turbo-basic. Power-basic даёт эффективнее код, а Quick-basic удобнее и лучше документирован. А если потом вдруг понадобится версия для КР580, то можно скомпилировать тот же текст бейсик-программы в CP/M Microsoft компиляторе бейсика BASCOM. В этом и плюс Microsoft бейсика относительно диджитал-рисёрчного CBASIC, у которого другие нюансы операторов бейсика (и встречал мнение, что Microsoft бейсик лучше, чем Digital Research бейсик).

С Паскалем такие трюки (совместимости по исходному коду с PC) проходят тоже, но только с Турбо-Паскалем, а не с Паскалем МТ+, который несовместим с Паскалем на PC. Но тут облом, потому что Турбо-Паскаль требует Z80, а все отечественные 8-ми разрядки сдуру использовали КР580, а не Z80.

На ЯВУ подобные мелкие инструментальные программы делаются быстрее, чем на ассемблере. Особенно, если использовать бейсик, - отладку делаем в интерпретаторе, а готовую версию компилируем, чтобы было удобнее использовать и работала быстрее. Кстати, в Википедии сдуру написано, что бейсик компилятор BASCOM ускоряет скорость прогона в 10 раз, что неверно. У меня от компиляции получалось ускорение всего в 2.5...3 раза. Может Турбо-бейсик на PC настолько ускоряет, но не компилятор бейсика BASCOM в CP/M.

Недостающие 12 цветов можно изображать мозаикой цветных точек, как делают в CGA-играх. В принципе разумно такой конвертор графики объединить с хотя бы простейшим редактором, позволяющим выбирать цвета. Кстати редактор всё-равно необходим, хотя-бы, чтобы чистить спрайты от фона и записывать их в файл вместе с маской.

А графику от ОРИОНА хочу конвертировать, т.к просто потому, что у меня есть цветные игры ОРИОНА (есть также игры Специалиста, но они монохромные) и взять оттуда графику легко. Конечно, можно взять графику из игр ZX-Spectrum в чужих эмуляторах, но она пишется на диск в другом, стандартном для PC, формате и надо ещё тратить время, разбираться, как устроены эти граф.форматы.

А быстренько поиметь, хоть какую-то, цветную графику я решил, чтобы попробовать освоить работу с цветом на экране ИРИШИ. С монохромом уже разобрался. А вот с цветом вообще незнаком. PC с CGA-адаптером не застал, потому писал только для режимов VGA и SVGA. И пока плохо представляю как монохромную картинку в ходе вывода на цветной экран быстро конвертировать в CGA-формат. В частности, фонт хранится как монохромный, а при выводе в цвете его надо как-то преобразовать в формат CGA, причём без потерь скорости.

Хорошо бы ещё кто-нибудь подсказал как удобнее всего брать графику из XT PC-игр. Желательно так: запускаем "Принц Персии" в CGA-варианте, а затем нажимаем на кнопку и в файлы на винчестер с интервалом в 0.2...0.3 секунды игрового времени сливаются копии экрана. Так за несколько секунд получаем все фазы движения спрайта. Далее в PAINT-е вырезаем фигурки, пейзаж, т.е тайлы и спрайты в разных фазах, записываем в BMP-формате и далее их уже можно использовать, т.е начинать писать движок двигающий по экрану спрайты на фоне пейзажа.

Но сначала, конечно надо нацарапать CP/M или другую DOS, в смысле странслировать для ИРИШИ. Т.к любой программе, будь то текстов редактор, граф.редактор, конвертор или редактор спрайтов надо куда-то писать выходные данные. Потому и нужна DOS.

Странслирую для ИРИШИ несколько разных DOS, чьи исходники есть. К сожалению, архитектура ИРИШИ даёт лишь 64 кб доп.ОЗУ, и если на реал еще можно как-то извратившись ОЗУ прибавить, то в чужой эмулятор уже ничего не прибавишь. Но задача эмулятора только проверка и отладка, а тут надеюсь, даже такого крошечного привода хватит.

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

Несмотря на кажущуюся прогрессивность диспетчера памяти ИРИШИ, на практике этот диспетчер неудобен для реальных задач. Возможно, если бы можно было произвольно менять карту, то что-то можно было улучшить. Но если изменить прошивку 155РЕ3 карты памяти, то что-то можно улучшить, но утратится совместимость. Потому исходить надо только из той прошивки, что изначально стандартная.

Диспетчер памяти ИРИШИ рассчитан всего на 128 кб ОЗУ. Этого вполне достаточно для программ, но этого мало для электронного диска. Рассмотрим как разумно использовать базовый диспетчер ОЗУ.

В базовой ИРИШЕ есть 4 дырки в адресном пространстве. Каждая дырка занимает 16 кб в картах 1 и 3 в адресах с $4000 и с $C000. Что желательно поиметь?

Во-первых, желательно поиметь сплошное ОЗУ в 64 кб, т.е нужна одна карта памяти в которой нет ни ПЗУ, ни экранной области. Пусть это будет карта 1. Сплошные 64 кб нужны чтобы поиметь CP/M с высоким TPA. Высокий TPA позволяет запускать все программы для CP/M, в том числе и те компиляторы, что хотят иметь не менее 52 кб. Хотя читал, что есть компиляторы, которые хотят иметь TPA аж в 62 кб. Это, конечно, возможно лишь когда весь прогоняемый код CP/M перенесён в другую банку (или включается в окне), а в банке для программ оставлены только входы в BDOS и BIOS.

С другой стороны, сейчас уже не средневековье, потому на самой 8-ми разрядке программы разрабатывают только очень фанатичные, да и то, если им хватает быстродействия, удобная клавиатура и качественный дисплей (VGA). Потому все остальные предпочитают набирать тексты и их транслировать на IBM PC, т.к, как бы ни были хороши аппаратные возможности 8-ми разрядки, у IBM PC они на порядки лучше.

А главное отлаживать на порядок удобнее в эмуляторе. Тут 8-ми разрядка, даже если в ней реальный такт 10 МГЦ и экран VGA не может предложить ничего похожего. При этом правда есть один минус - для проверки в реале надо программы пересылать на реал, что довольно хлопотно. И ещё возникает проблема, что когда эмулятор чужой, то он не отражает конкретный реал.

Потому требование иметь высокий TPA сейчас не очень весомо. Т.к компилировать на ИРИШЕ вряд-ли кто будет. Сами подумайте, программа на ассемблере с исходником всего в 100 кб транслируется и линкуется на медленном дисководе 3-5 минут (причём при сильном износе дискет). С эл.диском - чуть веселее, в несколько раз быстрее. А компиляторы ЯВУ при большом исходнике компилируют ещё раза в 2-3 дольше. Тогда как на PC это происходит мгновенно.

CP/M с низким TPA получаем в базовой основной карте памяти 2, где область C000...FFFF уже занимает экран. Т.е уже изначально получается CP/M на 48 кб. Если подкачку делать из ПЗУ (например из иришкиного ROM-диска), то можно поиметь CP/M с уровнем TPA в 40...42 кб. Не особо много программ с размером более 40 кб, хотя для серъёзной программы всего 40 кб памяти это стеснительно.

Итак банку 1 отдали для программ желающих иметь 64 кб. Остаётся банка 3, тоже с двумя дырками. Разумно дырку с C000 отдать под различное дополнительное железо (например, здесь можно включать экранный буфер платы текстового адаптера или буфер быстрого КНГМД с ПДП). А  дырку 4000...7FFF разумно использовать как окно, через которое будет прокачиваться большое ОЗУ, например 1 мб. На котором и будет организован эл.диск на реале. Именно таким методом (в сегменте K3:4000...7FFF) собираюсь поставить в ИРИШУ SIMM-30 на 1 мб. Быстродействие этой памяти не особо важно, т.е оно может быть тормозным непрозрачным без особо неприятных последствий (что возможно и придётся сделать, т.к асинхронный узел регенерации универсален к разным CPU и проще).

Пока в эмуляторе мне доступно всего 128 кб. Это позволило получить CP/M с эл.диском из ОЗУ с размером ровно 64 кб. Но контрольные суммы секторов и код подкачки пришлось хранить в банке CP/M, отчего уровень TPA получился всего $9600 (38.5 кб). Этого пока достаточно, т.к пока нет программ большего размера.

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

Кстати, по тому, что в качестве управляющих битов диспетчера ОЗУ выбрали биты D3,D2, а не D1,D0 сразу ясно, что разработку железа ИРИШИ вели не программисты. Это заставляет тратить время, сдвигать биты, сохранять регистры... А в итоге, т.к переключение карты делается побайтово, т.е для каждого байта читаемого из эл.диска делается переключение карты памяти, то возникает торможение. Пока я просто использовал старые исходники от ОРИОНА, где обмен с банками побайтовый.

А в ИРИШЕ п/п-мма чтения записи байта из эл.диска получается раза в 3 дольше, сама ИРИША в 3.5 раза тормознее, чем мой ОРИОН на Z80. В итоге скорость обмена с эл.диском получается в 10 раз медленнее, чем на ОРИОНЕ. Впоследствии я смогу это ускорить раза в 2-3, заменив побайтовый обмен на посекторный. Тогда сектор 128 байт будет читаться в буфер, на что понадобится всего 2 коммутации карты. Но потеря всё-равно возникнет из-за необходимости пересылки сектора из буфера на DMA.

Потому по сравнению даже с тормозным ОРИОНОМ на 2.5 МГЦ эл.диск нетурбированной ИРИШИ будет тормознее примерно в 3.5 раза. Но это всё-равно в несколько раз быстрее, чем скорость работы реального дисковода.

Пока сделал только стартовый вариант CP/M с TPA $9600. Да и это лишь для эмулятора получилось столько сравнительно много TPA. Потому что для эмулятора не надо поддерживать ни винчестер, ни РК-КНГМД, потому для эл.диска CPM-BIOS имеет крошечный размер всего в $400. А когда в него (строкой INCLUDE) добавить подпрограммы для винчестера, дисковода, дисковый буфер равный размеру физ.сектора (что 512 байт для винта и РК-КНГМД и 1 кб для КНГМД на ВГ93), то TPA ещё усохнет где-то до всего лишь ~34 кб.

Это из-за подкачки CCP+BDOS из ОЗУ этой же карты я теряю впустую $1600. Потому чуть позже, убрав буфер подкачки и буфер КС, смогу поднять TPA в карте 2 ещё на ~6 кб. Но пока просто нет смысла. Т.к из-за идиотического монитора ИРИШИ, не могу загрузить с МГ-ленты файл размером более $5000 (т.е сейчас CP/M-программу или исходник размером более 20 кб просто не загрузить в эмулятор, а даже крошечный MBASIC имеет бОльший размер). Приходится программы размером более 20 кб разбивать на половинки, грузить по частям в эмулятор, а там склеивать их на адресе $100.

Это потому что идиотский иришин монитор ниже $4000 не грузит, а выше $9000 тоже загрузить нельзя, т.к на $9000 располагается сам этот монитор (полученный из DDT). По этим же соображениям, а также из-за мизерности ОЗУ, не нужна CP/M с высоким TPA, - т.к тогда при общем ОЗУ всего в 128 кб эл.диск станет совсем крошечным.

Вообще, теоретически максимальный TPA в карте 2 для только эл.диска возможно рассчитать так. CP/M-BIOS займет порядка $600, а CP/M-BDOS имеет размер в $E00. Итого, отнимаем эти цифры от RAMTOP= $C000 и получаем $AC00, т.е ровно 43 кб. С учётом того, что TPA начинается с $0100 и запаса на расширение искейп-кодов получаем TPA в 42 кб.

Это теоретически максимальный TPA, что можно поиметь в карте 2. Но в реале подпрограммы винта или флопа, а также буфер чтения физического сектора отнимут ещё как минимум 2 кб. Так и получается, что CP/M ИРИШИ в карте 2 для реала будет иметь TPA в 40 кб. Для Паскаля это кажется не хватит, для BDS C точно не хватит. Хватит только для PL/M и ассемблера.

Ещё есть какой-то форт (техно-форт для CP/M одного ленинградского кооператива из 1991), но хрен поймёшь, как им пользоваться (он очень сложный, потому нет смысла с ним связываться, хотя некоторые программы ИРИШИ были написаны на форте, в частности обслуга прошивателя РПЗУ). Но всё что я знаю про форт, это то, что по команде WORDS выдаётся список слов-определений, а выход из форта командой BYE.

В качестве исходного листинга для CP/M взял самый древний исходник, что нашёл. Т.к в более свежих пришлось бы долго трахаться с отковыриванием Z80 команд. А Z80-команды удобно отковыривать только в EMU80, а в EMU неудобно (да и с EMU80 я трахался 3 дня пока отчистил от Z80-кодов CP/M для Специалиста).

В EMU даже по команде HALT нет вылета в отладчик эмулятора, как сделано в EMU80, что удручает. Также содержимое памяти в других сегментах не посмотришь. В общем с отладчиком EMU отлаживать программы ИРИШИ работающие на несколько банок неудобно. А приличные программные отладчики только для Z80.

Для ИРИШИ полезно написать свой программный отладчик изначально ориентированный на отладку программ на ИРИШЕ в карте 2. Его основной код будет в карте 1, а в карте 2, где отлаживаемая программа, останется только ловушка по RST и модуль связи. Это позволит отлаживать программы рассчитанные на полное использование TPA.

Неудобство заключается в том, что все эмуляторы (кроме моих) не рассчитаны на удобство работы с эмулированным дисководом. Потому в них существует неудобство попадания программ в эмулятор, чтобы заполнить ими эл.диск или эмулируемую дискету. Одно дело загрузить и тут же запустить игрушку, чтобы посмотреть, а другое дело всякий раз вручную командами грузить и вручную командами сохранять на диске целый пакет. Пока делал это через магнитофон и ROM-диск. Проблема, что в чужой эмулятор никак не добавить доп.ОЗУ более 64 кб, а для RAM-диска этого очень мало. Может для ОКЕАНА в 1985 году и для ОРИОНА в 1990 этого хватало, но для хоть какой-то практической работы этого явно мало.

Потому для CP/M предназначенной для отладки программ в эмуляторе возможно будет такая концепция. По сбросу будет стартовать программа загрузчик CP/M из ROM-BIOS-а (размером до 2 кб, т.к там свободно именно столько). Этот загрузчик будет грузить CP/M из ROM-диска. В этой CP/M будет два привода. Привод A: - это 64К RAM-диск, и ещё ~50 кб будет R/O-привод B: (на базе ROM-диска), в котором будут храниться резидентные CP/M-программы (например, компилятор PLMX, т.к он работает только в реальной CP/M, не работает в CP/M-эмуляторе на MSDOS). А также резидентно надо хранить какое-то программное средство, чтобы грузить файлы ( откуда-то) и нортон.

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

Ещё хотелось бы знать как эмулятор поддерживает ROM-диск, а точнее можно ли ему подсунуть файл с размером больше, чем 64 кб. Т.е, что он выдаст после 65535 считываний из порта $14. Если указатель (что заменяет счётчики 155ИЕ7 на плате реала) обнуляется после $FFFF, то объём более 64К ROM-диска эмулятор не поддерживает. Если не обнуляется, то можно R/O привод B: сделать большИм, 128 кб или даже аж 256 кб.

А вообще и в реале ROM-диск, если есть достаточно ПЗУ (у меня ПЗУ хватает) разумно расширить до 128 кб. В реале это просто получить, если напаять на ROM-диске где-то вторым этажом триггер, чтобы на нём вырабатывался адрес ПЗУ A16. В 128 кб уже можно что-то полезное уместить. Даже компилятор какой-нибудь убогинький.

Например, пакет BASCOM без документации умещается всего в 150 кб. Но бейсик даже компилятор - это нехорошо для ИРИШИ, т.к BASCOM даёт в 1.5 раза более массивный код и во столько же тормознее, чем Паскаль или Си. А лучше всего для ИРИШИ, конечно, PLMX, т.к код из под него в несколько раз быстрее кода от всех остальных ЯВУ.

PLMX как раз можно использовать при приводе всего в 64 кб (т.к он сам крошечный, лишь ~30 кб), а если его хранить в приводе B:, то место для хранения исходника и результирующего кода останется полные 64К. Надо бы заняться PL/M, но, увы, входное сопротивление мозга сильно увеличилось, даже еле-еле Паскаль сумел вспомнить, а уж на освоение чего-то нового серых клеточек уже не хватит (но главное препятсятвие, - отсутствие хоть каких-то учебников, есть только описания языка и примеры программ).

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

Приличного нортона для CP/M тоже пока нет. На немецких сайтах видел один корректный нортон, но он для высокого TPA. А нортон DS.COM из 1991 это почти убожество, но на безрыбье я в 1992 году был и ему рад. В общем скоро нацарапаю, может быть даже корректный, нортон, что будет пригоден для любой CP/M с TPA ~38...40 кб. Но скорей всего придётся чертить рамы по железу, иначе на скоростях ИРИШИ будет совсем тормозяка. В эмуляторе ИРИШИ я задаю скорость 3.5 МГЦ, но всё-равно работает не быстро.

Нацарапка CP/M-нортона с нуля и без опыта - это 3-4 недели. А если есть где взять процедуры для всех операций, то делать заново надо только глюкало, а это работа на ~10 часов. Да и то лишь потому, что я очень давно не занимался подобными делами и некоторые процедуры сложно отдирать от глюкала другой графической машины, к тому же с грамотным драйвером. Впрочем и в ИРИШЕ неплохой драйвер, почти всё нужное даёт, даже нет смысла писать свой драйвер.

https://yadi.sk/d/nHNYFCMLQf6p_Q Вот скриншоты из эмулятора, чтобы было ясно как утомительны эмуляторы не поддерживающие автозагрузку файлов в приводы разных DOS. Понятно, что эмулятор не может знать устройство привода конкретной DOS или даже хотя-бы формат диска. Поэтому грамотный эмулятор предоставляет самой DOS 8-ми разрядки загрузить свой привод файлами при старте DOS. Для этого эмулятор имеет функции, - входы доступные для вызова из программы 8-ми разрядки.

В частности в моих эмуляторах ОРИОНА программа передаёт эмулятору порядковый номер файла, номер банки, адрес куда грузить и вершину до которой можно грузить файл. И чтобы в привод загрузились нужные программы, пользователю достаточно просто поместить их в отдельный каталог, т.е папку на винчестере PC и после запуска DOS в эмуляторе все файлы оттуда автоматически окажутся внутри эмулятора в эмулируемом диске DOS. После старта они окажутся загруженными. http://ipic.su/img/img7/fs/CPMORIONA.1556178170.png

А эмуляторы EMU и EMU80 ничего подобного не делают, а поддерживают только магнитофон и образ CP/M-диска. С магнитофоном можно повеситься пока загрузишь по одному файлу, а образ диска замучишься вручную компоновавши всякий раз, когда надо с диска взять или поместить туда другой файл. И к тому же DOS не одна, а много. Да и зачем хранить миллионы образов дисков (причём взглядом даже не видно их содержимое), если в архиве достаточно хранить всего одну копию файла. Потому моя концепция позволяет реально пользоваться любыми DOS в эмуляторе, а концепции чужих DOS пригодны только для запуска в эмуляторе игрушек отдельными файлами.

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

Т.к загрузка файлов через магнитофон затрахала и при отладке это сжирает много времени (т.к при разработке я делаю перетрансляции как можно чаще), самое время заняться ROM-диском. Сейчас решаю в каком формате ему лучше быть.

Идеально было бы прямо в формате CP/M, но тогда надо иметь компоновщик, что из отдельных файлов компонует то, что прошивается в ROM-диск. А главное, CP/M читает не массивом, а посекторно, а с учётом долгой процедуры позиционирования на нужное место в ROM-диске это тормознёт. Кстати, ROM-диск в другом формате (т.е не в формате меню ИРИШИ) не вызывает конфликта с встроенной в ИРИШУ его поддержкой, достаточно первый байт ROM-диска оставить $FF и ИРИША решает, что ROM-диска в системе нет.

Можно использовать формат ORDOS. Это позволит удобно компоновать файлы для прошивки и грузиться это бутет не посекторно, а целым файлом (что важно, если ROM-диск существенно будет расширен до 128 кб). Тогда CP/M-нортон должен выполнять функции LORD, т.е иметь возможность копировать файлы из ROM-диска на диск CP/M (или другой DOS) и в DOS запускать программы прямо из ROM-диска.

Такой вариант мне пока нравится больше, т.к проще, быстрее работает и более универсален, чем непосредственно формат CP/M в ROM-диске. А для начала можно нацарапать что-то типа 'ROM-Service' для Специалиста. Это то же стартовое меню, по типу иришиного, т.е просто запускалка файлов, только с рамкой и указателем на программу балкой подсветки. Это имеет смысл, т.к тогда можно запускать файлы из ROM-диска не имея CP/M, что и имеет место, когда в ИРИШЕ всего 64 кб и нет даже дисковода и ценно, что такую простую запускалку можно уместить в 2 кб, что свободны в первом ПЗУ ИРИШИ.

Конечно, удобнее всего было бы иметь в эмуляторе, как и в реале, страничное расширение резидентного на плате ЦП ПЗУ, управляемое портом $18, куда можно уместить любые загрузчики и DOS-ы, но увы, в чужом эмуляторе ничего не изменишь.

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

Пока нет удобной оперативной компоновки ROM-диска (типа того, что в BAT-файле которым делается компиляция разрабатываемой программы последней строкой вызывается компоновщик ROM-диска, который автоматически вставляет только что странслированную отлаживаемую программу в ROM-диск), т.е пока нет никакого сервиса для программиста, приходится вводить файлы в эмулятор через магнитофон. Это паршиво, потому, что в мониторе ИРИШИ формат ввода идиотский (не передать имя файла и надо помнить адреса ввода и длину блока).

Потому, пока в качестве вспомогательной меры себе, переделал отладчик ИРИШИ, чтобы стал удобнее, а также добавил в него несколько новых директив. Теперь отладчик работает только в режиме 80 символов в строке и выводит флаги и регистры в одну строку, что удобнее при трассировке и нагляднее при отладке.

Кроме того, я переместил отладчик под вершину RAMTOP карты 2, т.е на адрес $B000. А в оригинале было $9000, что ни то ни сё, практически посередине памяти и впустую терялись верхние 8 кб (A000...BFFF), а главное это ограничивало максимальный размер вводимого МГ-файла в 20 кб, что глупо, имея, как минимум, 48 кб доступные для программ. Теперь ограничение на размер файла поднялось до $4000...$B000 (это 28 кб, хотя на самом деле чуть меньше, т.к служ.ячейки и стек я поместил сразу под $B000, выше-то места нет).

Также ввёл директиву 'K', аналогичную директиве Специалиста. Она считает контрольную сумму по стандарту РК86. Что мне было надо при отладке эл.диска, чтобы убедиться, что файл записываемый на эл.диск и считанный с него идентичны. А теперь для облегчения себе ввода CP/M-файлов с магнитофона ввёл директиву 'Y'. Эта директива позволяет вводить файлы в ОЗУ ниже $4000. Конечно не напрямую, т.к это в ИРИШЕ невозможно.

Потому-что в ИРИШЕ ввод с ленты может делать только программа в ПЗУ, т.к программа в ОЗУ тормозится непредсказуемым образом, в то время как программа в ПЗУ прогоняется на полной скорости в 1.77 МГЦ. Отчего МГ-ввод происходит в карте 0 программой в ПЗУ, которое стоит в адресах 0...3FFF. Потому-то ввод напрямую в ОЗУ ниже $4000 невозможен.

Из-за этого пришлось извращаться. Директива Y имеет один параметр - размер файла. Это то же самое число, что вводится вторым параметром в директиве R. Первый параметр директивы R, т.е адрес загрузки для директивы Y не нужен. Она всегда вводит блок на адрес $4000. По окончании ввода, директива просто перекидывает файл с адреса $4000 на адрес $100, чтобы затем загрузив CP/M можно было сделать 'SAVE nnn FILNAM.TYP' на диск. С оригинальным отладчиком мне приходилось пересылку на $100 делать вручную директивой пересылки блоков по ОЗУ.

Попозже я ещё подумаю и возможно автоматизирую и набор команды SAVE (используя AUTOEXEC.SUB, что естественно есть во всех моих версиях CP/M с 1992). Тогда сразу по вводу CP/M введённая с ленты программа автоматически сама запишется на диск.

Директива Y это конечно полумера, но на безрыбье... даже такая фигня облегчает мне немного жизнь, экономит время. Вскоре сделаю программу TAPE для CP/M, которая будет читать с МГ-ленты файл и по окончании ввода записывать его на CP/M диск. Причём, если это файл в специальном формате (что определяется по сигнатуре в начале), то запись на диск будет автоматической, причём в цикле (т.е файл за файлом без участия оператора). Если введён просто блок, то имя файла запрашивается, а если по сигнатуре выяснено, что это специальный формат для CP/M, то имя файла для записи на диск берётся из самого блока и оператору не надо его вводить.

Понятно, что в эмуляторе (по крайней мере в эмуляторе EMU) полная автоматизация не получится, т.к и поддержка ленты в виде одного многофайлового массива в этом эмуляторе отсутствует. Потому всякий раз будет открываться окно и запрашиваться имя очередного файла для ввода с винчестера IBM PC.

К сожалению, подобные магнитофонные эмуляторы, не рассчитанные на поддержку DOS, не могут передать 8-ми разрядной программе имя считанного файла или получить от неё имя файла подлежащего загрузке, отчего эмулятор не может полноценно эмулировать дисковую систему, а вынужден эмулировать образ диска, что не только дико неудобно, но даже возможно сложнее в реализации (особенно, если извращаться до полного предела и эмулировать времянки дискового устройства).

В саму CP/M (точнее в CCP CP/M) возможно введу ещё одну команду LDX, она будет читать с МГ-ленты на адрес $100 файл жёстко фиксированного размера (16 кб) и сразу по окончании ввода стартовать его. Это позволит запускать компилятор не из эл.диска, а как бы из другого диска, что оставляет весь объём эл.диска для исходника.

Я пользуюсь эмулятором ИРИШИ с заданным в нём процессором Z80 на такте 4 МГЦ, потому уже исковеркал ROM-BIOS ИРИШИ под свои нужны (виртуальное ПЗУ менять не проблема). И всё конечно было переписано на Z80. И отладчик естественно был на Z80. По счастью я не использую индексные и альтернативные регистры Z80 (чтобы когда понадобится легко было переделать под КР580). Потому, по крайней мере от отладчика, сумел отскоблить Z80-команды (и то пришлось трахаться 2 часа, EMU сдуру не позволяет определять недопустимые коды и просто виснет, приходится долго трассировать, чтобы вычислить пропущенную Z80-команду).

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

Хотя в отладчике JR-команды я ставил лишь там, где сразу было очевидно, что переход недалеко и не оптимизировал, но и то замена лишь JR на JP увеличила объём кода на 170 байт. Из-за чего объём кода версии для КР580 превысил $FF0, что есть в ИРИШЕ для отладчика. Потому пришлось убрать директиву R с автозапуском (сейчас уже уплющил отладчик и влезло, теперь по R без параметров грузится и стартует лишь одна конкретная CP/M - на $7000 с размером $1D80, или любая другая программа того же размера на тех же адресах)

В итоге странслировал версию ПЗУ для КР580. Она полностью идентична журнальной прошивке из МПСС (я пользуюсь только родной прошивкой, не краснокнижной, она не нужна), но отладчик в ней, что прошит в ПЗУ-0 на адресах $800...$1800 - другой, тот, что выше описан. Работает на КР580. Отличие лишь в том, что отладчик чуть изменён - всё переделано под режим 80 символов (флаги сделаны более наглядно), все имеющиеся директивы те же самые. Добавлены ещё две вышеупомянутые директивы K, Y и директива R без параметров грузит CP/M для карты 2 (где возможна лишь CP/M с низким TPA).

Вот такое ПЗУ https://yadi.sk/d/1jhv5JLkgfju7g. Его просто кладёте в каталог IRISHA вместо имеющегося файла с ROM-BIOS или прошиваете в реальное ПЗУ.

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

Для пользования CP/M программами я в качестве расширения к файлам (в каталоге откуда эмулятор грузит CP/M-программы) приписал их длину в байтах, чтобы сразу видеть их длину. Для загрузки в эл.диск, например повера для КР580 PW.COM (есть и повер, что только для Z80) пишем Y3A00<ВК> (т.к длина файла PW.COM равна $3A00) и в открывшемся окне эмулятора для загрузки файла выбираем PW.COM. Затем для запуска CP/M вводим R<ВК> и для загрузки выбираем файл CPM.DAT (это CP/M стартующая на $7000, после старта она перекидывает себя под вершину ОЗУ, сразу туда загрузить нельзя, т.к там расположен монитор, который и делает загрузку с ленты). После чего оказываемся в CP/M. Если эл.диск ещё не форматирован, то он форматируется. После выхода на промпт, для записи PW.COM на диск пришем SAVE 58 PW.COM. После чего повер уже можно запускать на исполнение.

Чтобы воспользоваться CP/M на реальной ИРИШЕ или в эмуляторе EMU сначала ознакомьтесь с литературой по предмету вот здесь https://yadi.sk/d/_0QoRc_wkH_BUA.

Затем скачиваете всё вот отсюда https://yadi.sk/d/JmiL1xBjGyzjGg. Файлы из подкаталов копируете в те каталоги, что указано в каталог эмулятора EMU (файлы из config в config и т.д). Файлы из каталога PROG копируете туда, откуда вы привыкли обычно грузить в эмуляторе, но удобнее всего скопировать целиком каталог PROG в папку 'irisha'. Оттуда и будете грузить CP/M-файлы директивой Ynnnn монитора (nnnn это размер файла, его всегда надо указывать, так уж сделан эмулятор, он перехватывает только подпрограмму МГ-ввода на $0040). В папке PROG лишь некоторые обычные CP/M-файлы, что я проверил на то, что им хватает низкого TPA.

В этой CP/M, как обычно, поддерживается AUTOEXEC.SUB и есть RST-входы, как и во всех моих версиях CP/M для ОРИОНА. RST-входы упрощают программирование.

Например, RST 18H выводит текст, что стоИт сразу после команды RST. Стоп байт - 0 или символ с выставленным старшим битом (потому RST 18 не позволит Вам выводить КОИ-8, но если надо, то не проблема, забиваете один бит в одном месте и можете выводить КОИ-8 ). Т.е это аналог MSSGH в фирменных программах CP/M (грамотные вражеские ассемблеры позволяют задавать ASCII-строки с выставленным старшим битом в последнем символе строки). Кому надо, тот сам зыркнет отладчиком входы 0008/0010/0018.../0038 или можно почитать описание ACP/M V1.60 из 1994.

Недавно сообразил, как расширить ОЗУ совместимым способом. Причем не только так, что реализуемо в реале, но, главное таким способом, что то же самое можно поиметь и в эмуляторе EMU (без его переделки, лишь изменением конфига в редакторе). Пусть вариант и не идельный, но зато уже вскоре сделаю версию CP/M с эл.диском в 256 кб, этого хватит для всех компиляторов. И при этом уже можно будет сделать версию CP/M с высоким TPA, отчего будут работать все компиляторы ЯВУ и другие программы, что нуждаются в TPA в 56 кб.

Спойлер:

Программирование для ИРИШИ IzmenennyjotladchikIRISHI.1556277545

_________________
***
barsik
barsik
Мастер+

Сообщения : 490
Дата регистрации : 2016-11-10
Откуда : С-Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Программирование для ИРИШИ Empty .

Сообщение  barsik в Пн Май 20 2019, 21:14

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

Для программиста процессор Z80 отличается несущественно. Именно потому программы для Z80, если не считать JR-команды почти на 100% состоят из команд КР580. И именно потому игры для Z80, пусть и с утомительным электротрахом, возможно переделывать в программы для КР580. Это убедительно доказал факт переделки под КР580 более 30 ZX-игр. Причём эти работы были сделаны ещё в 80-тые годы, когда конвертирующий игру программист любитель не только не имел дисковода, но даже простейшего инструментария (он был лишён даже простейшего отладчика для Z80, и вынужден был всё делать вручную в машинных кодах).

Z80 индексные регистры в большинстве случаев не нужны (аналог без них почти всегда работает быстрее, т.к все индексные команды медленные), использование альтернативных регистров может ускорить часто используемые короткие подпрограммы (например, polling-опрос флагов), регистр I в системе без MODE 2 даёт чуть более быстрый регистр хранения (также как и R - однобитовый флаг хранения), но в целом к уникальным возможностям Z80 прибегать приходится сравнительно редко. Естественно, бывают случаи когда без индексных регистров для КР580 получается в разы более громоздко. А при написании кода для ПЗУ гораздо полезнее оказываются недокументированные команды с половинками индексных регистров, это экономит байты. Потому система команд КР580 и считается полностью самодостаточной и её нельзя существенно улучшить.

В целом, при равном клоке, Z80 лишь ускоряет работу программ в лучшем случае на 5% и на столько же сокращает объём кода. Ради этого не стоит откидывать с платформы тех пользователей, что имеют процессор КР580.

Значительно более важное и ценное преимущество Z80 заключается в том, что сам процессор Z80 более скоростной (есть даже его варианты Z280 на 33 МГЦ, причём с редуцированным числом тактов на команды). Даже повсеместно распространённый Z80B (у меня, например, их 15 штук, но нет ни одного Z80A, я их просто не покупал, не было смысла, т.к цена была одинакова) тянет клок 10 МГЦ, а если достать Z80H или КМОП Z84C00020, то можно поиметь систему с тактом в 12 МГЦ (выше не имеет смысла, сложность отладки с ростом частот быстро нарастает, да и скоростей 1533 выше уже не хватает).

Конечно, имея Z80, обидно писать программы для КР580. Но можно использовать все основные преимущества Z80, причём не откидывая владельцев РК86 ещё не имеющих процессора Z80. Я и при написании программ специально для Z80, если не было острой необходимости в индексных регистрах Z80, из Z80-команд всегда использовал только лишь JR-команды, LDIR-ы, SBC-ы и загрузки в/из ОЗУ парных регистров. Исходники таких программ легко переделать под процессор КР580.

Потому нет особых препятствий, чтобы сразу писать программу под Z80, причём так, чтобы тот же исходник без переделки транслировался и для КР580. Для этого я использую макрокоманды CP/M макроассемблера M80 от Microsoft. Тогда, когда надо странслировать вариант для КР580, достаточно поставить соответствующий ключ трансляции (т.е в заголовке д.быть строка 'Z80 EQU 0'). Тогда имеем две версии программы, причём версия для Z80 на ~3 % более компактная и чуть быстрее работает.

Под спойлером приведены строки, что я вставляю в текст файла MACRO.INC, которые позволяют мне делать один исходник для КР580 и Z80. Можно писать исходник для Z80, не применяя EXAF и команд для индексных регистров. А когда надо поиметь версию для КР580, то запускается макро-команда программистского редактора (если у Вас не UltraEdit, а более примитивный редактор, Вам это недоступно), которая находит строки с Z80-командами и заменяет их на макрокоманды. Если у Вас убогий тестов редактор или Вы не умеете использовать макро-команды редактора, то можно сразу писать макрокомандами.

Спойлер:

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

if      Z80

.sbc_d  MACRO
        SBC     HL,DE
        ENDM

.sbc_b  MACRO
        SBC     HL,BC
        ENDM

.ldir   MACRO
        LDIR
        ENDM

.lddr   MACRO
        LDDR
        ENDM

.djnz   MACRO   ADDR
        DJNZ    ADDR
        ENDM

.jr     MACRO   ADDR
        JR      ADDR
        ENDM

.jrnz   MACRO   ADDR
        JR      NZ,ADDR
        ENDM

.jrz    MACRO   ADDR
        JR      Z,ADDR
        ENDM

.jrc    MACRO   ADDR
        JR      C,ADDR
        ENDM

.jrnc   MACRO   ADDR
        JR      NC,ADDR
        ENDM
  else

.sbc_d  MACRO
        CALL    @SBC_D
        ENDM

.sbc_b  MACRO
        CALL    @SBC_B
        ENDM

.ldir   MACRO
        CALL    @LDIR
        ENDM

.lddr   MACRO
        CALL    @LDDR
        ENDM

.djnz   MACRO   ADDR
        DEC     B
        JP      NZ,ADDR
        ENDM

.jr     MACRO   ADDR
        JP      ADDR
        ENDM

.jrnz   MACRO   ADDR
        JP      NZ,ADDR
        ENDM

.jrz    MACRO   ADDR
        JP      Z,ADDR
        ENDM

.jrc    MACRO   ADDR
        JP      C,ADDR
        ENDM

.jrnc   MACRO   ADDR
        JP      NC,ADDR
        ENDM
endif

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

LOOP    MACRO   ADDR
        DEC     BC
        LD      A,B
        OR      C
        .jrnz   ADDR
        ENDM

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

.ldm_sp MACRO   LOC
  if   Z80
        LD      (LOC),SP
     else
        LD      HL,000          ; HL портит
        ADD     HL,SP
        LD      (LOC),HL
  endif
        ENDM

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

.ldsp_m MACRO   LOC
   if  Z80
        LD      SP,(LOC)
     else
        LD      HL,(LOC)        ; HL портит
        LD      SP,HL
   endif
        ENDM

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

.ldde_m MACRO   LOC
   if  Z80
        LD      DE,(LOC)
     else
        EX      DE,HL
        LD      HL,(LOC)
        EX      DE,HL
   endif
        ENDM

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

.ldm_de MACRO   LOC
   if  Z80
        LD      (LOC),DE
     else
        EX      DE,HL
        LD      (LOC),HL
        EX      DE,HL
   endif
        ENDM

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

.ldbc_m MACRO   LOC
   if  Z80
        LD      BC,(LOC)
     else
        PUSH    HL
        LD      HL,(LOC)
        LD      B,H
        LD      C,L
        POP     HL
   endif
        ENDM

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

.ldm_bc MACRO   LOC
   if  Z80
        LD      (LOC),BC
     else
        PUSH    HL
        LD      H,B
        LD      L,C
        LD      (LOC),HL
        POP     HL
   endif
        ENDM

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

Ниже содержимое файла KP580.INC (что вставляется оператором
INCLUDE в конец программы при ключе трансляции Z80 не =0)

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

@LDIR:  LD      A,(HL)
        LD      (DE),A
        INC     HL
        INC     DE
        LOOP    @LDIR
        RET

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

@LDDR:  LD      A,(HL)
        LD      (DE),A
        DEC     HL
        DEC     DE
        LOOP    @LDDR
        RET

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

@SBC_D: LD      A,L
        SBC     A,E
        LD      L,A
        LD      A,H
        SBC     A,D
        LD      H,A
        RET

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

@SBC_B: LD      A,L
        SBC     A,C
        LD      L,A
        LD      A,H
        SBC     A,B
        LD      H,A
        RET


В начале любой программы я ставлю вот такой код проверки процессора Z80 (это код из CP/M-овской CP/M-библиотеки, Z80 определяется по работе флага парити, можно определять Z80 и по коду EXAF, что в КР580 прогоняется как NOP). Подпрограмма MSSG здесь для ИРИШИ и для программы работающей в базовой карте 2 (для карты 1, т.е в доп.ОЗУ, управление портом PC иное и стек CSTACK иной). Все программы базовой ИРИШИ с базовым ПЗУ запускаются в карте 2. Естественно, для РК86 отдельная п/п-мма MSSG не нужна, для РК достаточно поставить CALL на адрес $F818.

Спойлер:

if      Z80
        LD      A,2             ; test for Z80
        INC     A
        JP      PE,NO_Z80
endif
        . . . . . .
       
;--------------------------------------------
if      Z80

NO_Z80: LD      HL,TNOZ80
        CALL    MSSG
        XOR     A
        OUT     (PC),A
        CALL    RCONIN
        JP      800H

TNOZ80: defb    13,10,'Only for Z80 CPU !'
        defb    13,10,'Press any key... ',7,7,0

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

CSTACK  EQU     0C000H       ; для карты 2 4000...FFFF
RCONIN  EQU     005BH

MSSG:   LD      A,(HL)
        OR      A
        RET     Z

        PUSH    HL
        LD      C,A
        IN      A,(PC)
        AND     11110000B
        OUT     (PC),A

        LD      HL,0000
        ADD     HL,SP
        LD      (TMP_SP),HL

        LD      SP,CSTACK
        CALL    CONOUT             ; код и стек д.быть выше 4000
        defb    31H                ; код команды LD SP,nnnn
TMP_SP: DS      2

        LD      A,00001000B        ; возврат в карту 2
        OUT     (PC),A
        POP     HL

        INC     HL
        JP      MSSG

endif   ; Z80




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

Программы для базовой ИРИШИ работают в карте 2. При этом, естественно, для вызова стандартных подпрограмм эпизодически включается и карта 0. Карта 0 отличается от карты 2 всего лишь тем, что в ней в участке памяти 0...3FFF включено не ОЗУ, а ПЗУ содержащее ROM-BIOS. Как указано выше, иногда, если память ниже 4000 не нужна, то программа может включить карту 0 на-постоянно и работать в ней, - это проще, отпадает коммутация карт памяти при вызове стандартных подпрограмм ПЗУ.

В карте 2 для программ есть 48 кб (0...BFFF), а область выше C000 занята экраном. Если кто-то знаком с радиолюбительским компьютером ОРИОН-128 (он был опубликован в ж.РАДИО и имел большую популярность у сельских жителей СССР), тот может заметить, что его архитектура в банке 0, для пользовательской программы идентична. Там тоже для программ остаётся только 48 кб памяти ниже C000.

99.9 % программ для ОРИОНА как-раз работают в банке 0 (в банке 1 работает только монохромная CP/M, которой надо 60 кб). Без CP/M остальные банки ОРИОНА используются в виде так называемых квази-дисков по 60 кб ОС ORDOS, которая изначально имеет предельно порочную концепцию (набор функций), ограничивающую размер диска в 64 кб (что мешает иметь один сплошной квазидиск на 180 кб или более).

И почти всё системное ПО ОРИОНА использует квазидиски по 60 кб из доп.банок ОЗУ. Увы, ни у кого не хватило ума придумать способ, как обойти ограничения ORDOS и сделать совместимую с ней ОС, но имеющую бОльшие диски (а это реально можно было сделать). Кстати, были, как минимум четыре ОС, которые были сделаны в то время для ОРИОНА и давали квазидиск в 180 кб, но эти DOS были никак не совместимы с ORDOS.

Таким образом на базовую ИРИШУ, у которой кроме базовых 48 кб нет другого ОЗУ, не имеет никакого смысла адаптировать системное ПО от ОРИОНА, т.к не из чего организовать квазидиск (если не добавлять какой-нибудь внешний эл.диск). Хотя системное ПО для ORDOS не представляет большого практического интереса в плане адаптации на ИРИШУ, но на безрыбье и рак рыба. К сожалению, корректными являются очень небольшое число программ ОРИОНА.

Из-за отсутствия в ROM-BIOS ОРИОНА нормального драйвера для графической машины, большинство даже системных программ ОРИОНА нагло лезет в экран ОРИОНА. А т.к поддержки цвета в ROM-BIOS там вообще нет (что явная глупость для цветного компьютера), то и для вывода в цвете, в программах ОРИОНА используется прямая работа по "железу". Потому ни одну программу ОРИОНА, выводящую рамки или использующую цвет нельзя без кардинальной переделки её 70 процентов кода адаптировать для другого компьютера. Т.е ОРИОН в качестве донора программ плохо подходит.

По сути корректными по работе с экраном являются только сама ОС ORDOS, ассемблер для ORDOS, дизассемблер ORDOS и, если не использовать графические операторы, бейсик ОРИОНА. А даже текстовые редакторы ОРИОНА нагло лезут в экран, графический редактор, естественно, тоже. Хотя текстов редактор SCREEN несложно адаптировать, т.к в нём по железу работает только ролик экрана (его пришлось ввести, т.к он делается стеком, потому намного быстрее, чем п/п-мма в ПЗУ).

Адаптация корректных программ легка, достаточно отредактировать вызовы ПЗУ (добавив в конце программ код эмулирующий входы ПЗУ ОРИОНА). Но даже перечисленные программы имеет смысл адаптировать только, если в ИРИШУ добавлено доп.ОЗУ, как минимум ещё 64 кб. Тогда из этого доп.ОЗУ организуется квазидиск на 64 кб, из которого программы для ORDOS могут читать/писать файлы.

_________________
***
barsik
barsik
Мастер+

Сообщения : 490
Дата регистрации : 2016-11-10
Откуда : С-Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Программирование для ИРИШИ Empty Re: Программирование для ИРИШИ

Сообщение  Спонсируемый контент

4

Спонсируемый контент


Вернуться к началу Перейти вниз

Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения