User Tag List

Страница 8 из 13 ПерваяПервая ... 456789101112 ... ПоследняяПоследняя
Показано с 71 по 80 из 137

Тема: RK-КНГМД для "Специалиста"

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    05.04.2013
    Адрес
    Починки, Нижегородская обл.
    Сообщений
    1,371
    Спасибо Благодарностей отдано 
    403
    Спасибо Благодарностей получено 
    647
    Поблагодарили
    255 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    barsik, спасибо, полезная вещь получилась, еще бы в железе это попробовать (тем более, что доработки для подключения дисковода требуются на первый взгляд минимальные).
    Можно действительно сформировать образы дискет с программами для использования в эмуляторе, но немного смущает одна вещь: в программах могут встречаться обращения к портам клавиатуры не по адресам FFxx, а, например, F8xx. Тогда эти программы придется слегка адаптировать (в основном, наверное, игры).
    Форматёр по идее должен бы работать, но я это не проверял. (Для форматирования нужно подсунуть эмулятору пустой файл размером 500000 байт.)

    Что же касается доработок - в эмуляторе можно много что сделать, а вот нужно ли? В уже реализованной минимальной конфигурации я вижу практическую пользу - можно подключить дисковод к Специалисту и загружать оттуда файлы, даже в эмуляторе это не помешает. А вот насчет дальнейших доработок... Я могу в конфиге перенести адреса контроллера и расширить ПЗУ, добавить 16-цветный режим из MX, а, доработав эмулятор, также сделать страничное ПЗУ и верхнее ОЗУ с банками, вопрос только - что с этой никогда не существовавшей в реале конфигурацией планируется делать? Будет ли это реализовано потом в реале? Что будем делать потом с той же перенесенной на Специалист CP/M? Или это просто ради искусства - попробовать запустить CP/M на этом компьютере? В любом случае я готов попробовать сделать конфигурацию, нужно только точно определиться, по каким адресам что размещать...

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    zx_
    Гость

    По умолчанию

    в программах могут встречаться обращения к портам клавиатуры не по адресам FFxx, а, например, F8xx. Тогда эти программы придется слегка адаптировать (в основном, наверное, игры).
    «»

    а есть ли способ разделить дешифрацию РК ДоС и ППА клавиатуры Специалиста с « помощью двух диодов «. (С). ?

    чтобы не модифицировать ДОС

  4. #3

    Регистрация
    05.10.2016
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,080
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от quote
    спасибо, полезная вещь получилась
    Спасибо не мне, а Е.Седову, - я лишь три байта изменил.

    Скрытый текст


    Не напрягайтесь, а сделайте лишь то, что можно сделать быстро, просто дописав конфиг за 10 минут. Я не знаю, что конфиг может, а что нет. Потому напишу всё, что желательно.

    1. Верхнее ОЗУ. D000...F7FF или в случае если есть страничное ПЗУ, то E000...F7FF. Этот кусок всегда ОЗУ

    2. Страничное ПЗУ в окне C000...DFFF. В этом окне в 8 кб читается тот 8-ми килобайтовый кусок ПЗУ 27512, чей номер записан по адресу F800 (кроме бита D7).

    3. Если страничное ПЗУ невозможно, то - лишь базовое ПЗУ C000...CFFF, а D000...F7FF всегда открытое ОЗУ. Но в этом случае становится очень желательным ROM-диск. Точто такой же как в ОРИОНЕ, читаемый через доп.ППА. Адрес доп.ППА в СПЕЦИАЛИСТЕ FE00. Назначение портов - то же, через PA читаем, а в PB,PC записываем адрес командой LD (port_B),HL.

    4. Адрес РК-КНГМД также надо перенести на FB00, чтобы освободить F000. На F000 никто не лезет. Т.к в варианте без дешифратора на область В/У здесь ставят доп.ППА для УФ-прошивателя.

    Это минимум, что позволяет что-то уже делать. Причём это реал, - именно то что будет у всех на платах ЭКСПРЕСС. Т.е большое страничное ПЗУ и верхнее ОЗУ.

    Но ещё лучше дать мне хоть одну дополнительную банку, а лучше 8 или даже 16 банок. Коммутация банок идентична ОРИОНУ - портом F900 (или по OUT F9). Отличие в том, что в ОРИОНЕ банка 60 кб, здесь 48 кб (это без верхнего ОЗУ, но его можно не коммутировать).

    Если не вводить режим FULL RAM, то каждая банка это 48 кб сплошного ОЗУ. В реале, если открыто верхнее ОЗУ E000...F7FF, то оно тоже в каждой банке своё. Т.е переключается как окно 0...BFFF, так и участок верхнего ОЗУ E000...F7FF. Так это в реале.

    Но это не обязательно. Если сделаете, то смогу это использовать, - VDISK будет бОльшего размера, - в каждой банке будет не 48 кб, а 54 кб.

    Адреса портов я уже приводил в посте #65. Адресация В/У СПЕЦИАЛИСТА следующая (все адреса не от балды, а исторические, т.е кто-то когда-то их ввёл и реально поддержал).

    FF00 - ППА клавиатуры
    FE00 - доп.ППА для УФ-прошивателя, принтера, SD-карты и ROM-диска
    FD00 - таймер 580 ВИ53 (второй DB53 может быть на FD80)

    Эти адреса ввёл и поддерживал SP580. Позднее были добавлены следующие адреса:

    FC00 - контроллер НГМД на базе ВГ93 по схеме Корвета

    Теперь разумно добавить

    FB00 - РК-КНГМД (чтобы как в РК не тратить 2 кб F000...F7FF на его чип-селект)
    FA00 - управление режимом цвета (журнальный/расширенный)
    F900 - D0...D6 переключение банок по 48/62 кб,
    ..........FULL RAM битом D7 (факультатив).
    F800 - переключение 8-ми страниц ПЗУ 27512 в окне C000...DFFF. Бит D7 отключает ПЗУ совсем

    В порту F900 бит D7 пусть включает прерывания 50 Гц, вызывая исполнение RST 38. FULL RAM (т.е отключение блока ПЗУ C000...DFFF битом F800/D7) пока "не горит", но пусть позже было бы неплохо это иметь.

    Адреса для винчестера и AY-8912 уже не осталось. Но т.к типов КНГМД двое, то незадействованный чип-селект и пойдёт на винчестер. А AY-8912 не нужен одновременно с ВИ53, т.е или ВИ53 или AY-8912.

    Тест для отладки как эмулятора, так и проверки железа в реале написать не проблема. Сделаю это в ближайшие дни.
    [свернуть]

    Цитата Сообщение от zx_
    в программах могут встречаться обращения к портам клавиатуры не по адресам FFxx, а, например, F8xx
    Возможно могут быть такие программы. Это тех авторов, кто не дизассемблировал ROM-BIOS и не видел адресации, а ориентировался по принципиальной схеме.

    Исправить несложно. Такие игры несложно найти. Запускайте их в этой последней версии эмулятора. И те игры, что не реагируют на клавиши, а в старой версии реагируют присылайте мне.

    Цитата Сообщение от zx_
    а есть ли способ разделить дешифрацию РК ДОС и ППА клавиатуры Специалиста с помощью двух диодов? Чтобы не модифицировать ДОС
    Вопрос не понял.

    М.быть Вы имеете ввиду, разделить чтение ПЗУ C800 в области F800...F8FF от адресации ППА на F800. Т.е вопрос в том, что есть ли способы использовать вышеупомянутые игры с адресацией на F800, если такие найдутся, в СПЕЦИАЛИСТЕ с дешифратором В/У на область F800.

    Это можно, то тогда утратится совместимость с ОРИОНОМ и РК86 по вызовам F803, F806, F809... А это гораздо важнее, чем несколько игр, исправить которые не проблема. Чтобы игра адресующая ППА клавиатуры как F800 работала в машине с дешифратором ИД7, достаточно убрать диоды (или ЛИ1) дающие совместимость с РК и поставить два диода объединив чип-селект F800...F8FF (7 нога ИД7) и чип-селект FF00...FFFF. Тогда ППА будет адресоваться в обоих областях, что используются программами. Хотя мне кажется, что программ для ППА F800 мало.
    Последний раз редактировалось barsik; 20.12.2017 в 08:20.

  5. #4
    zx_
    Гость

    По умолчанию

    создал пустой файл fsutil file createnew c:\500.rkdisk
    создался , подключил в эмуляторе alt b
    FORMAT B:

    бла бла , потом
    FORMATING DISK ...
    I/O ERROR

    не форматирует почемуто

    бейсик плюс работает

    судя по конфиг файлу ЕМU в Специалисте вообще никаких изменений для работы с РК ДОС 2.9/S. от barsik,

    SE не работает
    Последний раз редактировалось zx_; 10.12.2017 в 15:36.

  6. #5

    Регистрация
    05.04.2013
    Адрес
    Починки, Нижегородская обл.
    Сообщений
    1,371
    Спасибо Благодарностей отдано 
    403
    Спасибо Благодарностей получено 
    647
    Поблагодарили
    255 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zx_ Посмотреть сообщение
    FORMAT B:

    бла бла , потом
    FORMATING DISK ...
    I/O ERROR
    Странно, у меня работает - как в эмуляторе Специалиста, так и в РК.
    Единственное - по умолчанию диск A подключается в режиме "только чтение" (эмулируется наклейка на дискете). Разрешить запись на диск A можно, закомментировав или убрав строку:
    diskA.readOnly = yes
    (можно также заменить yes на no)

    Но вы-то форматировали диск B... Не понимаю, попробуйте еще раз...

  7. #6

    Регистрация
    05.04.2013
    Адрес
    Починки, Нижегородская обл.
    Сообщений
    1,371
    Спасибо Благодарностей отдано 
    403
    Спасибо Благодарностей получено 
    647
    Поблагодарили
    255 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zx_ Посмотреть сообщение
    создал пустой файл fsutil file createnew c:\500.rkdisk
    А размер? Вот так должно быть:
    fsutil file createnew c:\500.rkdisk 500000

  8. #7

    Регистрация
    30.05.2007
    Адрес
    г. Лянтор, Сургутского р-на, ХМАО
    Сообщений
    4,436
    Спасибо Благодарностей отдано 
    163
    Спасибо Благодарностей получено 
    190
    Поблагодарили
    121 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я так таким образом задействовал три директивы в Специалисте МХ2.

  9. #8

    Регистрация
    05.04.2013
    Адрес
    Починки, Нижегородская обл.
    Сообщений
    1,371
    Спасибо Благодарностей отдано 
    403
    Спасибо Благодарностей получено 
    647
    Поблагодарили
    255 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Форматирование в эмуляторе посмотрю.
    Кстати, кто помнит, для чего изначально в Мониторе РК предназначалась директива U, передающая управление по адресу F000?

  10. #9

    Регистрация
    05.10.2016
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,080
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zx_ Посмотреть сообщение
    barsik, вот. такую штуку сделать можете?
    http://zx-pk.ru/threads/11319-radio-...l=1#post607765
    Если правильно понял, речь о том, чтобы укоротить команду старта DOS до двух нажатий.

    Нет проблем, дело пары минут. У меня так и было на РК86, чтобы грузить CP/M, директива была 'B'. Но, т.к раздражает всякий раз набирать даже букву, я хотел сделать так, чтобы кроме старта по букве, по сбросу сразу делался JMP E000, если пользователь при сбросе держит клавишу <НР>. В ближайшие дни сделаю соответствующий вариант ПЗУ для СПЕЦИАЛИСТА.

    Скрытый текст


    ПЗУ СПЕЦИАЛИСТА лучше не тратить на прошивку базовой РК-совместимой RK-DOS, т.к версий RK-DOS может быть (и будет) как грязи и иметь столько версий в ПЗУ немыслимо (у меня для каждой DOS, что я использовал, десятки версий, а для CP/M-совместимых - сотни).

    Вот вход в BDOS RK-DOS ради совместимости разумно сохранить на E001. А сам исполнительный код может располагаться где угодно, и в частности в ОЗУ. Программы совершенно не волнует, в каком месте памяти хранится исполнительный код функций DOS, т.к программы знают только один вход E001.

    Чтобы код можно было перемещать достаточно разместить в ПЗУ четыре байта с адреса E000, так что на адресе E001 будет стоять команда JMP на адрес в ОЗУ, например на 8FC0. Где тоже промежуточный JMP, уже на сам код BDOS. Второй JMP нужен потому что первый - в ПЗУ и менять адрес перехода в нём мы не можем.

    Но второй JMP уже в ОЗУ и потому изменив в нём адрес, мы можем иметь BDOS в любом месте (и даже в соседней банке). Т.о мы сможем загружать любую версию RK-DOS, причем в любое место и иметь RK-DOS любого размера, не ограничиваясь в жалкие 4 кб и совершенно не затрачивая ПЗУ (расход 4 байта не в счёт).

    В ближайшие дни странслирую вариант RK-DOS не требующий в НГМД сигнала READY. Увы, для владельцев РК86 это возможно только если в нём расширить ПЗУ для хранения RK-DOS (например добавить ПЗУ РФ2 по адресу D800...DFFF) или перейти на Z80 (тогда уплющивание кода за счёт JR команд позволит уместить нужные доработки кода в 4 кб ПЗУ).

    Такая версия имеет объём уже более 4-х кб и её уже не уместить в те жалкие 4 кб ПЗУ, что нам в своём эмуляторе выделил Pyk. А вот 4 байта почти не занимают места в 4-х килобайтном ПЗУ. А разместить код RK-DOS в совместимом варианте удобно выше служебных ячеек РК86, т.е в адресах 76D0...8F5F. Это более 6 кб, чего достаточно для RK-DOS.

    High TPA версии RK-DOS могут загружаться только в верхнее ОЗУ E000...F7FF или в ПЗУ. Такая версия более разумна для СПЕЦИАЛИСТА, чем совместимая с РК86 версия, т.к позволяет запустить программу не только размером до 28 кб, но и размером до 35.85 кб. И именно такая версия должна стать основной.

    Кроме того, если Pyk сумеет изменить входной такт в эмулируемом РК-КНГМД, то формат диска будет 560 кб (для DD) и 640 кб (для HD). А если ему удастся встроить в эмулятор контроллер IDE-винчестера, то будет и версия RK-DOS и других DOS для винчестера (это легко потому, что все подпрограммы уже есть).
    [свернуть]

    Цитата Сообщение от Pyk
    Кто помнит, для чего изначально в Мониторе РК предназначалась директива U, передающая управление по адресу F000?
    По логике, раз для входа на F000 есть команда, то в ПЗУ F000 должна была быть какая-то резидентная программа. Но сдуру, явно по ошибке, в журнальном ПЗУ также на F000 делается переход, если введена буква которой нет в списке директив.

    В обычном РК, где нет ПЗУ F000, происходит улёт, хотя в некоторых образцах в ходе улёта происходит переход на F800, так что кажется что всё нормально, что так было и задумано. Но это ошибка. А в последующей публикации, если МНИП, ввели DIR_U для чтения ROM-диска.

    оригинал ПЗУ РК86


    Ниже исходник ПЗУ для РК86. Рекомендую всем владельцам РК. В нём курсор большой, что гораздо приятнее, чем мизерная чёрточка.
    Код:
    ;  БАЗОВЫЙ МОНИТОР РК86 (РАДИО 8.86)
    ;  =================================
    
    ; Modify: для использования LA0,LA1 (полный оригинал при ORIG=1)
    ; Также исправлена ошибка ухода на XT_ROM.
    ; В строке T_REGS '-' заменены на '='.
    
    	.Z80
    	aseg
    	ORG     100H
    
    ORIG	EQU	0		; если не 0, то оригинальный курсор
    BASE    EQU	7600H		; ниже D0H байтов - служебные ячейки
    
    EK_ADR  EQU	BASE		; текущий адрес на экране
    POSX	EQU	BASE+02H
    POSY	EQU	BASE+03H
    ESC_F   EQU	BASE+04H
    KBDFLG	EQU	BASE+05H 	; если =0, то есть символ в SYMBUF
    RUSLAT  EQU	BASE+06H
    LAST_K  EQU	BASE+09H	; эти 2 байта должны следовать подряд
    COUNT	EQU	BASE+0AH	; счётчик опросов (вначале 15)
    APVFLG  EQU	BASE+0BH
    FRELOC	EQU	BASE+0CH	; эта ячейка не используется
    
    TMPSTK  EQU	BASE+0DH	; временно храним стек при МГ п/п-ммах
    POINT   EQU	BASE+14H	; адрес откуда произошёл RST_30H
    R_HL	EQU	BASE+16H
    R_SP	EQU	BASE+1CH
    R_AF	EQU	BASE+1EH   	; НИЖЕ ОТКЛАДЫВАЮТСЯ AF,HL,DE,BC
    STOP_A  EQU	BASE+23H
    TMP_COD EQU	BASE+25H
    GOTO_HL EQU	BASE+26H        ; ДЛЯ БАЙТА C3H (JMP)
    PAR_HL  EQU	BASE+27H
    PAR_DE  EQU	BASE+29H
    PAR_BC  EQU	BASE+2BH
    FLG_P2	EQU	BASE+2DH	; флаг, что есть параметры 2 или 2,3
    INV_MG	EQU	BASE+2EH
    KNS_RD	EQU	BASE+2FH
    KNS_WR	EQU	BASE+30H
    EK_ADR	EQU	BASE+31H
    COMBUF	EQU	BASE+33H        ; буфер ввода директивы
    STACK	EQU	BASE+0CFH	; стек монитора
    	   	
    SA	EQU	076D0H		; 76D0 начало экранной области
    SCBASE  EQU	077C2H		; 77C2 ЛЕВ.ВЕРХН.УГОЛ ЭКР.
    	   	
    VG_75   EQU	0C000H
    VT_57   EQU	0E000H
    
    PA	EQU     8000H
    PB	EQU	PA+1
    PC	EQU	PA+2
    PU	EQU	PA+3
    
    PDA	EQU	0A000H
    PDB	EQU	PDA+1
    PDU	EQU	PDA+3
    
    XT_ROM	EQU	0F000H		; второе ПЗУ РК-86
    	   	
    .comment \			; Внутренние нестандартные точки ПЗУ РК
    GETLIN	EQU	0F8EEH
    YF81B	EQU	0FEEAH
    YCMPDH	EQU	0F990H
    ADR_BL	EQU	0FB78H		; Выводит ВК, вправо на 4 позиции и ADR_BL
    RIGHT4	EQU	0F9B0H		; Выводит ВК и вправо на 4 позиции
    GETPRM	EQU	0F92CH
    VIDEO	EQU	0FACEH
    MIKROSH EQU	0F89DH		; старт "МИКРОШИ"
    \
    ; ----------------------------------------------
    
    .msg	MACRO	ADDR
    	LD	HL,ADDR
    	CALL	MSSG
    	ENDM
    	
    ; ----------------------------------------------
    
    	defb	'MON_RK86'
    	DW	800H,800H,000,000
    	
    	.phase  0F800H
    
    	JP	VHOD_0		; +0
    	JP	CONIN 		; +3
    	JP	LDBYTE		; +6
    	JP	COUT_C		; +9
    	JP	WRBYTE		; +C
    	JP	COUT_C		; +F   это д.быть PRINT
    	JP	STATUS		; +12
    	JP	HEX_A 		; +15
    	JP	MSSG  		; +18
    	JP	XF81B 		; +1B
    	JP	ASKCUR		; +1E
    	JP	RD_SCR		; +21
    	JP	RD_BLK		; +24
    	JP	WR_BLK		; +27
    	JP	CHSUMM		; +2A
    	JP	PUSK_VG		; +2D
    	JP	ASKTOP		; +30
    	JP	SETTOP		; +33
    
    ; ----------------------------------------------
    
    VHOD_0:	LD	A,8AH
    	LD	(PU),A
    	
    	LD	SP,STACK
    	
    	CALL    PUSK_VG
    	
    	LD	HL,BASE
    	LD	DE,COMBUF+2CH
    	LD	C,0
    	CALL    DIR_F
    	
    	LD	HL,STACK
    	LD	(R_SP),HL
    	
    	LD	HL,TITR
    	CALL    MSSG
    	
    	CALL    PUSK_VG			; это лишнее
    	
    	LD	HL,BASE-1
    	LD	(EK_ADR),HL
    	
    	LD	HL,1D2AH
    	LD	(KNS_RD),HL
    	
    	LD	A,0C3H
    	LD	(GOTO_HL),A
    
    if	$ ne RABADR + 06CH
    	if1
    	.printx * Standard subroutine WBOOT shifted ! *
    	endif
    endif
    
    WBOOT:				; Warm_BOOT
    	LD	SP,STACK
    	
    	LD	HL,PROMPT
    	CALL    MSSG
    				; следующие 3 команды лишние
    	LD	(PC),A
    	DEC	A
    	LD	(PDA+2),A
    	
    	CALL	GETLIN
    	LD	HL,WBOOT
    	PUSH	HL
    	LD	HL,COMBUF
    	LD	A,(HL)
    	CP      'X'
    	JP      Z,DIR_X
    	CP      'U'
    	JP      Z,XT_ROM
    	PUSH	AF
    	CALL	GETPRM
    	LD	HL,(PAR_BC)
    	LD	C,L
    	LD	B,H
    	LD	HL,(PAR_DE)
    	EX	DE,HL
    	LD	HL,(PAR_HL)
    	POP	AF
    	CP      'D'
    	JP      Z,DIR_D
    	CP      'C'
    	JP      Z,DIR_C
    	CP      'F'
    	JP      Z,DIR_F
    	CP      'S'
    	JP      Z,DIR_S
    	CP      'T'
    	JP      Z,DIR_T
    	CP      'M'
    	JP      Z,DIR_M
    	CP      'G'
    	JP      Z,DIR_G
    	CP      'I'
    	JP      Z,DIR_I
    	CP      'O'
    	JP      Z,DIR_O
    	CP      'L'
    	JP      Z,DIR_L
    	CP      'R'
    	JP      Z,DIR_R
    if	ORIG
    	JP      XT_ROM	  ; без доп.ИД7 и ПЗУ на F000 это д.быть JMP ERROR
       else
    	JP	ERROR
    endif
    
    ; ----------------------------------------------
    
    BAKSTP:	LD	A,low COMBUF	; 33H
    	CP	L		; достигнут конец буфера ввода ?
    	JP	Z,AF8F1
    	PUSH	HL
    	LD	HL,TZABOJ
    	CALL    MSSG
    	POP	HL
    	DEC	HL
    	JP	AF8F3
    
    ; ----------------------------------------------
    
    if	$ ne RABADR + 0EEH	;F8EC
    	if1
    	.printx * Internal subroutine GETLIN shifted ! *
    	endif
    endif
    
    GETLIN:	LD	HL,COMBUF
    AF8F1:  LD	B,0
    AF8F3:  CALL    CONIN
    	CP      8
    	JP	Z,BAKSTP
    	CP      7FH
    	JP	Z,BAKSTP
    if	ORIG
    	CALL    NZ,COUT_A	; NZ ???
       else
    	CALL    COUT_A
    endif
    	LD	(HL),A
    	CP      13
    	JP	Z,AF91A
    	CP      '.'
    	JP      Z,WBOOT
    	LD	B,0FFH
    	LD	A,low COMBUF+1FH
    	CP	L
    	JP      Z,ERROR
    	INC	HL
    	JP	AF8F3
    
    ; ----------------------------------------------
    
    AF91A:	LD	A,B
    	RLA
    	LD	DE,COMBUF
    	LD	B,0
    	RET
    
    ; ----------------------------------------------
    
    MSSG:   LD	A,(HL)           ; F922
    	AND	A
    	RET	Z
    	CALL    COUT_A
    	INC	HL
    	JP      MSSG
    
    ; ----------------------------------------------
    
    if	$ ne RABADR + 012CH
    	if1
    	.printx * Internal subroutine GETPRM shifted ! *
    	endif
    endif
    
    GETPRM:  LD	HL,BASE+27H       ; 7627H
    	LD	DE,BASE+2DH       ; 762DH
    	LD	C,0                 
    	CALL    DIR_F               
    	LD	DE,BASE+34H       ; 7634H
    	CALL	GET_HL
    	LD	(PAR_HL),HL
    	LD	(PAR_DE),HL
    	RET	C
    	LD	A,0FFH
    	LD	(FLG_P2),A
    	CALL	GET_HL
    	LD	(PAR_DE),HL
    	RET	C
    	CALL	GET_HL
    	LD	(PAR_BC),HL
    	RET	C
    	JP      ERROR
    
    ; ----------------------------------------------
    
    GET_HL:	LD	HL,0
    AF95D:	LD	A,(DE)
    	INC	DE
    	CP      13
    	JP	Z,RETCY1
    	CP      ','
    	RET	Z
    	CP	20H
    	JP	Z,AF95D
    	SUB	30H
    	JP      M,ERROR
    	CP      10
    	JP	M,AF982
    	CP      011H            ; 17
    	JP      M,ERROR
    	CP	17H
    	JP      P,ERROR
    	SUB     7
    AF982:	LD	C,A
    	ADD	HL,HL
    	ADD	HL,HL
    	ADD	HL,HL
    	ADD	HL,HL
    	JP      C,ERROR
    	ADD	HL,BC
    	JP	AF95D
    
    ; ----------------------------------------------
    
    RETCY1:	SCF
    	RET
    
    ; ----------------------------------------------
    
    if	$ ne RABADR + 0190H
    	if1
    	  .printx * Internal subroutine CMPDH shifted ! *
    	endif
    endif
    
    CMPDH:	LD	A,H
    	CP	D
    	RET	NZ
    	LD	A,L
    	CP	E
    	RET
    
    if	CMPDH	ne 0F990H
    	if1
    	  .printx * Internal subroutine F990 (CMPDH) shifted ! *
    	endif
    endif
    
    ; ----------------------------------------------
    
    AF996:  CALL    CHK_F4
    AF999:  CALL    CMPDH
    	JP	NZ,AF9A2
    AF99F:  INC     SP
    	INC	SP
    	RET
    
    ; ----------------------------------------------
    
    AF9A2:	INC	HL
    	RET
    
    ; ----------------------------------------------
    
    CHK_F4:	CALL    XF81B
    	CP      3
    	RET	NZ
    	CALL    PUSK_VG
    	JP      ERROR
    
    ; ----------------------------------------------
    
    if	$ ne RABADR + 01B0H
    	if1
    	.printx * Internal subroutine RIGHT4 shifted ! *
    	endif
    endif
    
    RIGHT4:	PUSH    HL		; Выводит ВК и вправо на 4 позиции
    	LD	HL,TRIGH4
    	CALL    MSSG
    	POP	HL
    	RET
    
    ; ----------------------------------------------
    
    AF9B9:	LD	A,(HL)
    HXA_BL: PUSH    BC             ; F9BA
    	CALL    HEX_A
    	LD	A,20H
    	CALL    COUT_A
    	POP	BC
    	RET
    
    ; ----------------------------------------------
    
    DIR_D:  CALL    ADR_BL
    AF9C8:	CALL	AF9B9
    	CALL	AF996
    	LD	A,L
    	AND	0FH
    	JP      Z,DIR_D
    	JP	AF9C8
    
    ; ----------------------------------------------
    
    DIR_C:  LD	A,(BC)
    	CP	(HL)
    	JP	Z,AF9E6
    	CALL    ADR_BL
    	CALL	AF9B9
    	LD	A,(BC)
    	CALL    HXA_BL
    AF9E6:	INC	BC
    	CALL	AF996
    	JP      DIR_C
    
    ; ----------------------------------------------
    
    DIR_F:  LD	(HL),C
    	CALL	AF999
    	JP      DIR_F
    
    ; ----------------------------------------------
    
    DIR_S:  LD	A,C
    	CP	(HL)
    	CALL    Z,ADR_BL
    	CALL	AF996
    	JP      DIR_S
    
    ; ----------------------------------------------
    
    DIR_T:  LD	A,(HL)
    	LD	(BC),A
    	INC	BC
    	CALL	AF999
    	JP      DIR_T
    
    ; ----------------------------------------------
    
    DIR_L:  CALL    ADR_BL
    AFA0B:	LD	A,(HL)
    	OR	A
    	JP	M,AFA15
    	CP	20H
    	JP	NC,AFA17
    AFA15:	LD	A,02EH
    AFA17:  CALL    COUT_A
    	CALL	AF996
    	LD	A,L
    	AND     0FH
    	JP      Z,DIR_L
    	JP	AFA0B
    
    ; ----------------------------------------------
    
    DIR_M:  CALL    ADR_BL
    	CALL	AF9B9
    	PUSH	HL
    	CALL	GETLIN
    	POP	HL
    	JP	NC,AFA3B
    	PUSH	HL
    	CALL	GET_HL
    	LD	A,L
    	POP	HL
    	LD	(HL),A
    AFA3B:	INC	HL
    	JP      DIR_M
    
    ; ----------------------------------------------
    
    DIR_G:  CALL    CMPDH
    	JP	Z,AFA5A
    	EX	DE,HL
    	LD	(STOP_A),HL
    	LD	A,(HL)
    	LD	(TMP_COD),A    ; храним байт точки останова
    	LD	(HL),0F7H      ; код команды RST_30H
    	LD	A,0C3H
    	LD	(030H),A       ; ПОДГОТОВКА RST_30H
    	LD	HL,BREAK
    	LD	(031H),HL
    AFA5A:  LD	SP,BASE+18H
    	POP	BC
    	POP	DE
    	POP	HL
    	POP	AF
    	LD	SP,HL
    	LD	HL,(R_HL)
    	JP      GOTO_HL
    
    ; ----------------------------------------------
    
    DIR_R:  LD	A,090H
    	LD	(PDU),A
    AFA6D:  LD	(PDB),HL
    	LD	A,(PDA)
    	LD	(BC),A
    	INC	BC
    	CALL	AF999
    	JP	AFA6D
    
    ; ----------------------------------------------
    
    ASKCUR:	LD	HL,(POSX)
    	RET
    
    ; ----------------------------------------------
    
    RD_SCR: PUSH    HL
    	LD	HL,(EK_ADR)
    	LD	A,(HL)
    	POP	HL
    	RET
    
    ; ----------------------------------------------
    
    DIR_I:  LD	A,(FLG_P2)
    	OR	A
    	JP	Z,AFA91
    	LD	A,E
    	LD	(KNS_RD),A
    AFA91:  CALL    RD_BLK
    	CALL    ADR_BL
    	EX	DE,HL
    	CALL    ADR_BL
    	EX	DE,HL
    	PUSH	BC
    	CALL    CHSUMM
    	LD	H,B
    	LD	L,C
    	CALL    ADR_BL
    	POP	DE
    	CALL    CMPDH
    	RET	Z
    	EX	DE,HL
    	CALL    ADR_BL
    ERROR:  LD	A,'?'
    	CALL    COUT_A
    	JP      WBOOT
    
    ; ----------------------------------------------
    
    RD_BLK:  LD	A,0FFH
    	CALL              @LD_BC
    	PUSH	HL
    	ADD	HL,BC
    	EX	DE,HL
    	CALL	LDBCBS
    	POP	HL
    	ADD	HL,BC
    	EX	DE,HL
    	PUSH	HL
    	CALL	AFB0A
    	LD	A,0FFH
    	CALL              @LD_BC
    	POP     HL              ; БЫСТРЕЕ DB 06 -> LD B,NN
    
    if	$ ne RABADR + 02CEH
    	if1
    	.printx * Internal subroutine PUSK_VG shifted ! *
    	endif
    endif
    
    PUSK_VG:
    	PUSH	HL
    	LD	HL,VG_75+1
    	LD	(HL),0   	; reset commando
    	DEC	HL       	; адрес VG_75
    	LD	(HL),04DH	; 0.1001101  77+1 знакомест
    	LD	(HL),01DH	; 00.011101  29+1 строк
                             	
    if	ORIG             	
            LD	(HL),99H	; 1001.1001  9 +1 линия подчерк. 
            			; 9+1 линий в знакоместе
            LD	(HL),93H	; 1.0.01.0011 без смещ.
            			; курсор - мигающая линия подчеркивания
            			; атрибуты отображать пробелом
    			 	; 3 такта сдвига - длина обр хода стр.р.
        else                 	
    	LD	(HL),59H	; **** лучше 58H: линия подч-я - выше
    	LD	(HL),0C3H	; 1.1.00.0011 - ЭТО МОЕ ИЗМЕНЕНИЕ
    				; курсор - мигающее знакоместо
    				; атрибуты не отображать
    endif				; ТЕПЕРЬ БОЛЬШОЙ КУРСОР
    
    	INC     HL		; адрес VG_75+1
    	LD	(HL),27H	; start display commando
    	LD	A,(HL)		; read status
    AFAE1:	LD	A,(HL)		; read status
    	AND     20H		; mask 'Interrupt request flag'
    	JP      Z,AFAE1         ; ждем конца строки
    	LD	HL,VT_57+8
    	LD	(HL),80H
    	LD	L,4             ; VT_57+04  !! НЕ_КОРРЕКТНО
    	LD	(HL),low SA 	; 0D0H
    	LD	(HL),high SA	; 076H
    	INC     L               ; адрес VT_57+5
    	LD	(HL),23H
    	LD	(HL),49H
    	LD	L,8             ; VT_57+8 !! НЕ_КОРРЕКТНО
    	LD	(HL),0A4H
    	POP	HL
    	RET
    
    ; ----------------------------------------------
    
    LDBCBS:	LD	A,8
                  @LD_BC:	CALL    LDBYTE
    	LD	B,A
    	LD	A,8
    	CALL    LDBYTE
    	LD	C,A
    	RET
    
    ; ----------------------------------------------
    
    AFB0A:  LD	A,8
    	CALL    LDBYTE
    	LD	(HL),A
    	CALL	AF999
    	JP	AFB0A
    
    ; ----------------------------------------------
    
    CHSUMM:	LD	BC,0
    AFB19:	LD	A,(HL)
    	ADD	A,C
    	LD	C,A
    	PUSH	AF
    	CALL    CMPDH
    	JP	Z,AF99F
    	POP	AF
    	LD	A,B
    	ADC	A,(HL)
    	LD	B,A
    	CALL	AF999
    	JP	AFB19
    
    ; ----------------------------------------------
    
    DIR_O:  LD	A,C
    	OR	A
    	JP	Z,AFB35
    	LD	(KNS_WR),A
    AFB35:	PUSH	HL
    	CALL    CHSUMM
    	POP	HL
    	CALL    ADR_BL
    	EX	DE,HL
    	CALL    ADR_BL
    	EX	DE,HL
    	PUSH	HL
    	LD	H,B
    	LD	L,C
    	CALL	ADR_BL  	; КС
    	POP	HL
    WR_BLK:
    	PUSH	BC		; КС
    
    	LD	BC,0		; выводим 256 байтов 00 (пилотон)
    AFB4D:  CALL	WRBYTE
    	DEC	B
    	EX	(SP),HL 	; это задержка 38 тактов
    	EX	(SP),HL
    	JP	NZ,AFB4D
    
    	LD	C,0E6H  	; выводим синхробайт E6
    	CALL	WRBYTE
    
    	CALL	WR_HL		; выводим НА
    	EX	DE,HL
    	CALL	WR_HL		; выводим КА
    
    	EX	DE,HL
    	CALL	AFB86		; выводим блок
    
    	LD	HL,0
    	CALL	WR_HL		; выводим 2 байта 00
    
    	LD	C,0E6H  	; снова выводим с/байт E6
    	CALL	WRBYTE
    
    	POP	HL
    	CALL	WR_HL		; выводим КС
    
    	JP	PUSK_VG
    
    ; ----------------------------------------------
    
    if	$ ne RABADR + 0378H
    	if1
    	.printx * Internal subroutine ADR_BL shifted ! *
    	endif
    endif
    
    ADR_BL:	PUSH	BC		; Выводит ВК, вправо на 4 позиции и ADR_BL
    	CALL    RIGHT4
    	LD	A,H
    	CALL    HEX_A
    	LD	A,L
    	CALL    HXA_BL
    	POP	BC
    	RET
    
    ; ----------------------------------------------
    
    AFB86:	LD	C,(HL)
    	CALL    WRBYTE
    	CALL	AF999
    	JP	AFB86
    
    ; ----------------------------------------------
    
    WR_HL:	LD	C,H
    	CALL    WRBYTE
    	LD	C,L
    	JP      WRBYTE
    
    ; ----------------------------------------------
    
                  @LDBYTE	EQU	LDBYTE
    
    if	$ ne RABADR + 0398H
    	if1
    	.printx * LDBYTE for emulator B2M need be at FB98 ! *
    	endif
    endif
     
    LDBYTE: PUSH    HL
    	PUSH	BC
    	PUSH	DE
    	LD	D,A
    AFB9C:  LD	A,80H
    	LD	(VT_57+8),A
    	LD	HL,0
    	ADD	HL,SP
    	LD	SP,0
    	LD	(TMPSTK),HL
    	LD	C,0
    	LD	A,(PC)
    	RRCA
    	RRCA
    	RRCA
    	RRCA
    	AND     1
    	LD	E,A
    AFBB7:	POP	AF
    	LD	A,C
    	AND	07FH
    	RLCA
    	LD	C,A
    	LD	H,0
    AFBBF:	DEC	H
    	JP	Z,AFC34
    	POP     AF              ; РЕГЕНЕРАЦИЯ ОЗУ
    	LD	A,(PC)
    	RRCA
    	RRCA
    	RRCA
    	RRCA
    	AND     1
    	CP      E
    	JP	Z,AFBBF
    	OR	C
    	LD	C,A
    	DEC	D
    	LD	A,(KNS_RD)
    	JP	NZ,AFBDC
    	SUB	012H
    AFBDC:	LD	B,A
    AFBDD:  POP     AF              ; РЕГЕНЕРАЦИЯ ОЗУ
    	DEC	B
    	JP	NZ,AFBDD
    	INC	D
    	LD	A,(PC)
    	RRCA
    	RRCA
    	RRCA
    	RRCA
    	AND	001H
    	LD	E,A
    	LD	A,D
    	OR	A
    	JP	P,AFC0B
    	LD	A,C
    	CP      0E6H            ; ПРЯМОЙ СИНХРО-БАЙТ ?
    	JP	NZ,AFBFF
    	XOR	A
    	LD	(INV_MG),A       ; ПРИЗНАК ИНВЕРСИИ МАГНИТОФОНА
    	JP	AFC09
    
    ; ----------------------------------------------
    
    AFBFF:  CP      19H		; ОБРАТНЫЙ С/БАЙТ
    	JP	NZ,AFBB7
    	LD	A,0FFH
    	LD	(INV_MG),A 	; Tape inverse flag
    AFC09:  LD	D,9
    AFC0B:	DEC	D
    	JP      NZ,0FBB7H
    	LD	HL,VT_57+4
    	LD	(HL),low SA	; 0D0H
    	LD	(HL),high SA 	; 076H
    	INC	HL
    	LD	(HL),023H
    	LD	(HL),049H
    	LD	A,27H               ; start display commando
    	LD	(VG_75+1),A
    	LD	A,0E0H              ; reset count
    	LD	(VG_75+1),A
    	LD	L,8
    	LD	(HL),0A4H
    	LD	HL,(TMPSTK)
    	LD	SP,HL
    	LD	A,(INV_MG)
    	XOR     C                  ; with Tape Inverse flag
    	JP      POPREG
    
    AFC34:  LD	HL,(TMPSTK)
    	LD	SP,HL
    	CALL    PUSK_VG
    	LD	A,D
    	OR	A
    	JP      P,ERROR
    	CALL	CHK_F4
    	JP	AFB9C
    
    ; ----------------------------------------------
    
    if	$ ne RABADR + 0446H
    	if1
    	.printx * WRBYTE for emulator B2M need be at FC46 ! *
    	endif
    endif
    
    @WRBYTE:
    WRBYTE: PUSH    HL
    	PUSH	BC
    	PUSH	DE
    	PUSH	AF
    	LD	A,80H
    	LD	(VT_57+8),A
    	LD	HL,0
    	ADD	HL,SP
    	LD	SP,0
    	LD	D,8
    AFC58:	POP	AF
    	LD	A,C
    	RLCA
    	LD	C,A
    	LD	A,1
    	XOR	C
    	LD	(PC),A
    	LD	A,(KNS_WR)
    	LD	B,A
    AFC66:	POP	AF
    	DEC	B
    	JP	NZ,AFC66
    	LD	A,0                     ; хо-хо
    	XOR	C
    	LD	(PC),A
    	DEC	D
    	LD	A,(KNS_WR)
    	JP	NZ,AFC7A
    	SUB     0EH
    AFC7A:	LD	B,A
    
    AFC7B:  POP     AF            ; подъем стека на [рег.B] ячеек
    	DEC	B
    	JP	NZ,AFC7B
    	INC	D
    	DEC	D
    	JP	NZ,AFC58
    	LD	SP,HL
    	LD	HL,VT_57+4
    	LD	(HL),low SA	; 0D0H
    	LD	(HL),high SA	; 076H
    	INC     HL		; VT_57+5
    	LD	(HL),23H
    	LD	(HL),49H
    	LD	A,27H		; start display commando
    	LD	(VG_75+1),A	; 001.sss.bb    001.001.11
    	LD	A,0E0H		; сброс счетчиков строк и знакомест ???
    	LD	(VG_75+1),A
    	LD	L,8
    	LD	(HL),0A4H        ; VT_57+8
    	POP	AF
    POPREG: POP     DE
    	POP	BC
    	POP	HL
    @BAK	EQU	$
    	RET
    
       if	@BAK ne 0FCA4H
    	if1
    	.printx	* Internal point 0FCA4H (need for emulator B2M) shifted ! *
    	endif
       endif
    
    ; ----------------------------------------------
    
    HEX_A:  PUSH    AF
    	RRCA
    	RRCA
    	RRCA
    	RRCA
    	CALL	AFCAE
    	POP	AF
    AFCAE:	AND	00FH
    	CP      00AH
    	JP	M,AFCB7
    	ADD     A,7
    AFCB7:	ADD	A,30H
    
    COUT_A: LD	C,A
    COUT_C: PUSH    AF
    	PUSH	BC
    	PUSH	DE
    	PUSH	HL
    	CALL    STATUS
    	LD	HL,TOBACK
    	PUSH	HL
    	LD	HL,(POSX)
    	EX	DE,HL
    	LD	HL,(EK_ADR)
    	LD	A,(ESC_F)
    	DEC	A
    	JP	M,NO_ESC	; если ещё не в ESC-последовательности
    	JP      Z,AFD65		; если второй байт ('Y')
    	JP	PO,AFD73	; если третий байт
    	LD	A,C     	; четвёртый байт  
    	SUB	20H
    	LD	C,A
    AFCDD:	DEC	C
    	JP      M,ESCRES	; СБРОС ESC_F И ВЫХОД
    	PUSH	BC
    	CALL	COD_18		; ВПРАВО
    	POP	BC
    	JP	AFCDD
    
    ESCRES:	XOR	A
    SETESC:	LD	(ESC_F),A
    	RET
    
    NO_ESC:	LD	A,C
    if	ORIG
    	AND     07FH
        else
    	AND     0FFH
    endif
    	LD	C,A
    	CP      1FH
    	JP      Z,CLS
    	CP      0CH
    	JP      Z,HOME
    	CP      13
    	JP	Z,COD_0D
    	CP      10
    	JP	Z,COD0A
    	CP      8
    	JP	Z,COD_08
    	CP      18H
    	JP	Z,COD_18
    	CP      19H
    	JP	Z,COD19
    	CP      1AH
    	JP	Z,COD1A
    	CP      27
    	JP      Z,COD1B
    	CP      7
    	JP	NZ,PR_SYM
    BEEP:
    	LD	BC,05F0H
    BP1:	LD	A,B
    BP2:	EI
    	DEC	A
    	JP	NZ,BP2
    	LD	A,B
    BP3:	DI
    	DEC	A
    	JP	NZ,BP3
    	DEC	C
    	JP	NZ,BP1
    	RET
    
    ; ----------------------------------------------
    
    PR_SYM:	LD	(HL),C		; Видимый на экране символ
    	CALL	COD_18		; сместить на следующее знакоместо
    	LD	A,D
    	CP      3		; мы на первой строке ?
    	RET	NZ		; если не на первой строке
    	LD	A,E
    	CP      8		; мы в первой колонке ?
    	RET	NZ		; если не на первой колонке
    	CALL	COD19
    COD0A:	LD	A,D
    	CP      3+24		; мы на последней строке ?
    	JP	NZ,COD1A	; если не на последней строке
    
    ; ДАЛЕЕ РОЛИК ЭКРАНА
    
    	PUSH    HL
    	PUSH	DE
    	LD	HL,SCBASE       ; 077C2H
    	LD	DE,SCBASE+78    ; 07810H
    	LD	BC,25*78	; 79EH
    AFD58:
    	LD	A,(DE)          ; ПЕРЕСЫЛКА БЛОКА РАЗМЕРОМ [BC]
    	LD	(HL),A		; (DE) --> (HL)
    	INC	HL
    	INC	DE
    	DEC	BC
    	LD	A,C
    	OR	B
    	JP	NZ,AFD58
    	POP	DE
    	POP	HL
    	RET
    
    ; ----------------------------------------------
    
    AFD65:	LD	A,C
    	CP      'Y'
    	JP	NZ,ESCRES
    	CALL    HOME
    	LD	A,2             ; ПРИНЯТО 2 БАЙТА ESC,'Y'
    	JP	SETESC
    
    ; ----------------------------------------------
    
    AFD73:	LD	A,C
    	SUB	20H
    	LD	C,A
    AFD77:	DEC	C
    	LD	A,4
    	JP	M,SETESC
    	PUSH	BC
    	CALL	COD1A
    	POP	BC
    	JP	AFD77
    
    ; ----------------------------------------------
    
    ; >> NO EXECUTION PATH TO HERE <<
    
    TOBACK: LD     (EK_ADR),HL      ; FD85
    	EX	DE,HL
    	LD	(POSX),HL
    	LD	A,80H
    	LD	(VG_75+1),A
    	LD	A,L
    	LD	(VG_75),A
    	LD	A,H
    	LD	(VG_75),A
    	POP	HL
    	POP	DE
    	POP	BC
    	POP	AF
    	RET
    
    ; ----------------------------------------------
    
    COD1B:	LD	A,1             ; НАЧАЛАСЬ ESC-ПОСЛЕД-СТЬ
    	JP	SETESC
    
    ; ----------------------------------------------
    
    CLS:	LD	HL,SCBASE+832H		; 07FF4H
    	LD	DE,30*78 +1		; 925H
    CLSLOO:	XOR	A
    	LD	(HL),A
    	DEC	HL
    	DEC	DE
    	LD	A,E
    	OR	D
    	JP	NZ,CLSLOO
    HOME:	LD	DE,308H
    	LD	HL,SCBASE        ; 077C2H
    	RET
    
    ; ----------------------------------------------
    
    COD_18:  LD	A,E             ; ВЫЧИСЛИТЬ КООРД.НА ЭКР.
    	INC	HL
    	INC	E
    	CP      047H            ; 71 ?
    	RET	NZ
    	LD	E,8
    	LD	BC,0-40H        ; FFC0
    	ADD     HL,BC           ; ВЫЧЕСТЬ 64
    COD1A:	LD	A,D
    	CP      27              ; СТРОКА ?
    	LD	BC,0004EH       ; 78
    	JP	NZ,AFDD3
    	LD	D,2
    	LD	BC,0F8B0H       ; ?
    AFDD3:	INC	D
    	ADD     HL,BC          ; ВЫЧЕСТЬ 750H
    	RET
    
    ; ----------------------------------------------
    
    COD_08:				; ВХОД: E=POSX, D=POSY
    				;       HL= экранный адрес
    	LD	A,E
    	DEC	HL
    	DEC	E
    	CP      8		; были в первой колонке ?
    	RET	NZ		; если были не в первой колонке
    	LD	E,7+64		; это последняя колонка ?
    	LD	BC,64
    	ADD	HL,BC		; экр.адрес в последнюю колонку
    COD19:	LD	A,D
    	CP      3		; это первая строка ?
    	LD	BC,0-78
    	JP	NZ,AFDF0
    	LD	D,3+25
    	LD	BC,24*78	; 750H
    AFDF0:	DEC	D
    	ADD     HL,BC           ; Вычесть 78 или прибавить 24*28
    	RET
    
    ; ----------------------------------------------
    
    COD_0D:	LD	A,L
    	SUB     E
    	JP	NC,AFDF9
    	DEC	H
    AFDF9:	LD	L,A
    	LD	E,8             ;хо-хо
    	LD	BC,8
    	ADD	HL,BC
    	RET
    
    ; ----------------------------------------------
    
    ; После 15 вызовов STATUS при нажатой клавише выставляется флаг KBDFLG
    
    STATUS:	LD	A,(PC)
    	AND	80H             ; RUS/LAT нажат ?
    	JP	Z,AFE0E
    	LD	A,(KBDFLG)
    	OR	A
    	RET	NZ		; если в SYMBUF уже есть символ
    AFE0E:	PUSH	HL
    	LD	HL,(LAST_K)
    	CALL    XF81B
    	CP	L
    	LD	L,A
    	JP	Z,AFE2A
    AFE1A:	LD	A,1
    	LD	(APVFLG),A
    	LD	H,15H		; число опросов, чтобы зафиксировать код
    AFE21:	XOR	A
    AFE22:	LD	(LAST_K),HL
    	POP	HL
    	LD	(KBDFLG),A
    	RET
    
    ; ----------------------------------------------
    
    AFE2A:	DEC	H			; в рег.A=код клав, в рег.H- COUNT
    	JP	NZ,AFE21
    	INC	A
    	JP	Z,AFE22			; если код FF, то сброс флагов
    	INC	A
    	JP	Z,KEY_FE		; если код FE (RUSLAT)
    
    	PUSH	BC			; КЛИК
    	LD	BC,5003H
    	CALL	BP1
    	POP	BC
    
    	LD	A,(APVFLG)
    	LD	H,0E0H
    	DEC	A
    	LD	(APVFLG),A
    	JP	Z,AFE4C
    	LD	H,40H
    AFE4C:	LD	A,0FFH
    	JP	AFE22
    
    ; ----------------------------------------------
    
    KEY_FE:	LD	A,(PC)
    	AND	80H
    	JP	Z,KEY_FE		; ждём отпускания РУС/ЛАТ
    	LD	A,(RUSLAT)
    	CPL
    	LD	(RUSLAT),A
    	JP	AFE1A
    
    ; ----------------------------------------------
    
    CONIN:  CALL    STATUS
    	OR	A
    	JP      Z,CONIN
    	XOR	A
    	LD	(KBDFLG),A
    	LD	A,(LAST_K)
    	RET
    
    ; ----------------------------------------------
    
    XF81B:	LD	A,(PC)
    	AND	80H             ; RUS/LAT нажат ?
    	JP	NZ,AFE7D
    	LD	A,0FEH
    	RET
    
    ; ----------------------------------------------
    
    AFE7D:	XOR	A
    	LD	(PA),A
    	LD	(PC),A
    	LD	A,(RUSLAT)
    	AND     1
    	OR      6
    	LD	(PU),A
    	LD	A,(PA+1)
    	INC	A
    	JP	NZ,AFE97
    	DEC	A
    	RET
    
    ; ----------------------------------------------
    
    AFE97:	PUSH	HL
    	LD	L,1          ; хо-хо
    	LD	H,7
    AFE9C:	LD	A,L
    	RRCA
    	LD	L,A
    	CPL
    	LD	(PA),A
    	LD	A,(PA+1)
    	CPL
    	OR	A
    	JP	NZ,AFEB3
    	DEC	H
    	JP	P,AFE9C
    AFEAF:	LD	A,0FFH
    	POP	HL
    	RET
    
    ; ----------------------------------------------
    
    AFEB3:	LD	L,20H
    AFEB5:  LD	A,(PA+1)
    	CPL
    	OR	A
    	JP	Z,AFEAF
    	DEC	L
    	JP      NZ,AFEB5
    	LD	L,8
    AFEC3:	DEC	L
    	RLCA
    	JP	NC,AFEC3
    	LD	A,H
    	LD	H,L
    	LD	L,A
    	CP      1
    	JP	Z,AFEFA
    	JP	C,AFEF3
    	RLCA
    	RLCA
    	RLCA
    	ADD	A,20H
    	OR	H
    	CP      5FH       ; '_'
    	JP	NZ,AFF06
    	LD	A,20H
    	POP	HL
    	RET
    
    ; ----------------------------------------------
    
    TABK2:	defb	09,0AH,0DH,7FH,08H,19H,18H,1AH
    TABK1:	defb	0CH,1FH,1BH,00H,01H,02H,03H,04H,05H     
    	
    ; ----------------------------------------------
    
    AFEF3:  LD	A,H
    	LD	HL,TABK1
    	JP	AFEFE
    
    ; ----------------------------------------------
    
    AFEFA:	LD	A,H
    	LD	HL,TABK2
    AFEFE:	ADD	A,L
    	LD	L,A
    	LD	A,(HL)
    	CP	40H
    	POP	HL
    AFF04:  RET     C           ; НЕ ДВИГАТЬ FF04 (СМ.ВЫШЕ)
    	PUSH	HL
    AFF06:	LD	L,A
    	LD	A,(PC)
    	LD	H,A
    	AND	40H
    	JP	NZ,AFF1A
    	LD	A,L
    	CP	40H
    	JP	M,AFF3F
    	AND	1FH
    	POP	HL
    	RET
    
    ; ----------------------------------------------
    
    AFF1A:  LD	A,(RUSLAT)
    	OR	A
    	JP	Z,AFF2A
    	LD	A,L
    	CP	40H
    	JP	M,AFF2A
    	OR	20H
    	LD	L,A
    AFF2A:	LD	A,H
    	AND	20H
    	JP	NZ,AFF3F
    	LD	A,L
    	CP	40H
    	JP	M,AFF3B
    	LD	A,L
    	XOR	20H
    	POP	HL
    	RET
    
    ; ----------------------------------------------
    
    AFF3B:	LD	A,L
    	AND	2FH
    	LD	L,A
    AFF3F:	LD	A,L
    	CP	40H
    	POP	HL
    	RET	P
    	PUSH	HL
    	LD	L,A
    	AND	00FH
    	CP	00CH
    	LD	A,L
    	JP	M,AFF50
    	XOR	010H
    AFF50:	POP	HL
    	RET
    
    ; ----------------------------------------------
    
    ASKTOP: LD	HL,(EK_ADR)
    	RET
    
    ; ----------------------------------------------
    
    SETTOP: LD	(EK_ADR),HL
    	RET
    
    ; ----------------------------------------------
    
    TITR:	defb    1FH,'radio-86rk',0
    PROMPT: defb    13,10,'-->',0
    TRIGH4:  defb    13,10,18H,18H,18H,18H,0
    
    ; ----------------------------------------------
    
    if	ORIG
    T_REGS:	defb	13,10
    	defb	' PC-',13,10
    	defb	' HL-',13,10
    	defb	' BC-',13,10
    	defb	' DE-',13,10
    	defb	' SP-',13,10
    	defb	' AF-'
    	defb	19H,19H,19H,19H,19H,19H,0 	; вверх на 6 строк
       else
    T_REGS: defb    13,10,' PC='
    	defb	13,10,' HL='
    	defb	13,10,' BC='
    	defb	13,10,' DE='
    	defb	13,10,' SP='
    	defb	13,10,' AF='
    	defb	19H,19H,19H,19H,19H,19H,0 	; вверх на 6 строк
    endif
    
    ; ----------------------------------------------
    
    TZABOJ:  defb    8,32,8,0
    
    ; ----------------------------------------------
    
    BREAK:  LD     (R_HL),HL
    	PUSH	AF
    	POP	HL
    	LD	(R_AF),HL    ; REG_AF
    	POP	HL
    	DEC	HL
    	LD	(POINT),HL      ; адрес останова RST_30H
    	LD	HL,0
    	ADD     HL,SP
    	LD	SP,R_AF
    	PUSH    HL              ; REG_SP
    	PUSH    DE              ; REG_DE
    	PUSH    BC              ; REG_BC
    	LD	HL,(POINT)
    	LD	SP,STACK
    	CALL    ADR_BL         ; ВЫВОД ТОЧКИ С RST_30H
    	EX	DE,HL
    	LD	HL,(STOP_A)
    	CALL    CMPDH           ; СЛУЧАЙНЫЙ ИЛИ СТОП ЮЗЕРА ?
    	JP      NZ,WBOOT     ; ЕСЛИ ЭТО USER_BREAK, ТО
    	LD	A,(TMP_COD)     ; ВОССТАНАВЛИВАЕМ СТОП-ТОЧКУ
    	LD	(HL),A
    	JP      WBOOT
    
    ; ----------------------------------------------
    
    DIR_X:  LD	HL,T_REGS
    	CALL    MSSG
    	LD	HL,POINT
    	LD	B,6
    AFFDE:	LD	E,(HL)
    	INC	HL
    	LD	D,(HL)
    	PUSH	BC
    	PUSH	HL
    	EX	DE,HL
    	CALL    ADR_BL
    	CALL	GETLIN
    	JP	NC,AFFF6
    	CALL	GET_HL
    	POP	DE
    	PUSH	DE
    	EX	DE,HL
    	LD	(HL),D
    	DEC	HL
    	LD	(HL),E
    AFFF6:	POP	HL
    	POP	BC
    	DEC	B
    	INC	HL
    	JP	NZ,AFFDE
    	RET
    
    ;	defb    255,255
    
    if	$ ne	0
         if high 	$ gt 0F8H
      	
      	rept	256
    	if	$ ne 0
    	   defb	255
    	endif
    	ENDM
         endif
       else
    	if1
    	  .printx * Code length over 2048 bytes ! *
    	endif
    endif
    	.dephase
    
    	END
    [свернуть]
    Последний раз редактировалось barsik; 19.12.2017 в 13:02.

  11. #10

    Регистрация
    05.10.2016
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,080
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    Тут придётся разобраться в логике и переделать весь алгоритм. Это мне делать не хочется, т.к не люблю разбираться в чужом коде и потому, что это трудоёмко.

    Но есть ещё два иных более интересных варианта.

    Ну, во-первых, аппаратно-программная эмуляция. Я где-то недавно об этом рассказывал. Суть примерно в том, чтобы сделать так, чтобы не менее, чем пару раз в секунду в любой программе экран РК (76D0...7FFF) сливался в экран СПЕЦИАЛИСТА (9000...BFFF). Это несложно, хотя и требует полной модификации ПЗУ СПЕЦИАЛИСТА, а качественнее всего это получается, если есть аппаратный тик 5 ГЦ на входе магнитофона.

    А во-вторых, можно конвертировать не методом переделки алгоритма, а на принципе визуализации, так же как это было сделано в более-менее грамотных конверсиях ZX-игр для машин на Z80, но с другим экраном и клавиатурой.

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

    Это как плюс не тормознёт (в отличие от аппаратно-программной визуализации, что тормозит и требует двойного запаса по быстродействию), и ценно, что таких вставок строк CALL VISUAL в наглой системной программе может потребоваться немного. Я проверил такой метод для ИРИШИ. Простые программы таким методом можно адаптировать довольно быстро. Ценность в том, что не требуется вникать в чужой алгоритм.

    Скрытый текст


    Я с начала 90-тых не программировал для СПЕЦИАЛИСТА. Да и тогда написал лишь 200 кб исходников (это очень мало). Проблема была в том, что тогда я сдуру писал в мнемонике КР580. Которая сильно напрягает программиста. Мнемоника Z80 позволяет примерно в 3-5 раз поднять производительность программиста. На это я узнал лишь в 1993.

    Поэтому сейчас разбираюсь в программировании для СПЕЦИАЛИСТА, изучаю ROM-BIOS и составляю руководство программиста (вскоре его выложу), где описываются все входные точки ПЗУ, в т.числе и нестандартные.

    Попробовал конвертировать от ОРИОНА одну программу. Когда приходится отчищать программы от Z80-кода и кардинально менять алгоритм (т.к программы ОРИОНА на 2 банки), то дикая нехватка ОЗУ и отсутствие хотя бы одной запасной банки памяти всё усложняет и сильно раздражает. Если бы была вторая банка, то менять бы пришлось мало.

    SE.COM я адаптирую, но не сейчас. Потому что быстрее получится написать аналогичный убогий Нортон (убогий, т.е без драйвера и потому без окон). Для этого достаточно надёргать процедур из RK-DOS Нортона ОРИОНА, написать несколько подпрограмм и всё скомпоновать. Это ориентировочно ~4...8 часов работы.

    Сложность - получить полноценный исходник чужой программы, а как известно Е.Седов использовал нетривиальный стиль программирования, что усложняет дело. Понятно, что получить просто листинг не проблема, IDA делает это за минуты. А получение полноценного листинга для сложной программы требует анализа алгоритма, что отнимает много времени.

    Disk-Doctor также постараюсь конвертировать. Я нашёл какой-то CHKDSK для RK-DOS, адаптировал и даже странслировал. Теперь думаю как перенести её в эмулятор для проверки. К сожалению эмулятор не понимает ORD-файлы, а у меня нет программы конвертирующей DAT-файлы в RKS-файлы.
    [свернуть]
    Последний раз редактировалось barsik; 11.12.2017 в 22:23.

Страница 8 из 13 ПерваяПервая ... 456789101112 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. PS/2 адаптер клавиатуры для Специалиста
    от fifan в разделе Специалист
    Ответов: 244
    Последнее: 02.12.2025, 11:10
  2. Ответов: 153
    Последнее: 16.12.2021, 19:07
  3. OriNET для Специалиста ?
    от SYR-ALEX в разделе Специалист
    Ответов: 22
    Последнее: 21.07.2017, 07:40
  4. Есть 3 кассеты для Специалиста...
    от Bolt в разделе Специалист
    Ответов: 60
    Последнее: 27.10.2013, 14:24
  5. Изучается спрос на плату для Специалиста
    от Павел Рябцов в разделе Барахолка (архив)
    Ответов: 109
    Последнее: 30.11.2010, 10:16

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •