Важная информация

User Tag List

Страница 9 из 14 ПерваяПервая ... 5678910111213 ... ПоследняяПоследняя
Показано с 81 по 90 из 135

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

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

    По умолчанию

    Цитата Сообщение от zx_
    судя по конфиг файлу ЕМU80 - вообще никаких изменений для работы с РК ДОС 2.9/S. от barsik
    Конечно в конфиг файл для СПЕЦИАЛИСТА с дисководом я никаких изменений не вносил. Да и не мог, откуда мне знать как его менять? Чтобы получить другую архитектуру.

    Всё, что я сделал, - это изменил в 3-й строке имя файла с кодом DOS, что эмулятор грузит на E000 в ПЗУ E000...EFFF, с DOS29.BIN на RKDOS.DAT.

    Можно поступить наоборот, ничего не менять в конфиге, а просто удалить файл DOS29.BIN, а файл RKDOS.DAT переименовать в DOS29.BIN. Результать будет тот же, - эти коды будут читаться в адресах E000...EFFF. Эмулятор тем и приятен, что не надо трахаться с УФ-очисткой и прошивкой ПЗУ на УФ-прошивателе, - изменил несколько букв и буквально за пол секкунды получаешь тот же результат.

    Цитата Сообщение от zx_
    SE не работает
    Естественно. Но на самом деле SE.COM работает, просто на экране Вы ничего не видите.

    Я же уже неоднократно писал об этом. На ОРИОНЕ и на других ЭВМ, в которых нет экранного ОЗУ как в РК86 в области 76D0...7FFF, не будут работать наглые программы с прямой записью в экранное ОЗУ. Это ведь то же самое, как в случае наглых игр от РК86, которые совместимы по клавиатуре (т.к читают её стандартно, по F81B или F803), но с экраном работают нагло напрямую записывая байты в экранное ОЗУ. Такие игры можно адаптировать только полностью поменяв алгоритм.

    В случае RK-DOS, где Е.Седов активно увлекался наглотой, из важных программ не могут работать нортон SE.COM, диск-доктор DOCTOR.COM и посекторный редактор TS-EDIT.COM

    Когда я стал пользоваться RK-DOS меня тоже это безобразие возмутило, и чтобы что-то увидеть на экране, я поначалу загружал драйвер визуализации, который работал так.

    На ОРИОНЕ ROM-BIOS по идеологии грамотный, в частности, имеет вектора для основных стандартных подпрограмм. Потому там можно на вектора ПЗУ загрузить, например, свой драйвер клавиатуры или дополнить имеющийся иными функциями. Что я и делал.

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


    Простейший драйвер, основанный на возможностях монитора-3, отлавливает нажатие УС+СС+V и по такому нажатию запускает процедуру визуализации, просто сливая экран РК86 в экран ОРИОНА, отчего на экране возникает картинка из экрана РК86.

    Понятно, что визуализировать вручную мне скоро надоело, поэтому используя, опять-таки свойство М3, в котором, в отличие от М2, векторизована и подпрограмма F81B, я сделал полноценный драйвер визуализации, основанный на следующей идее.

    Т.к все программы всех ЭВМ, где клавиатура не на прерываниях, беспрерывно опрашивают клавиатуру (иначе нажатия бы пропали), то вызов п/п-мм клавиатуры происходит тысячи раз в секунду. И соответственно, все программы РК86 тысячи раз в секунду вызывают всего две п/п-ммы F812 и F81B или просто висят в подпрограмме F803. За секунду происходит в зависимости от скорости ЭВМ до 5000 вызовов F81B.

    А в ПЗУ ОРИОНА ф-я STATUS не выкидывает 0 в порт A, читая по B (чтобы проконтроллировать одним считыванием все линии сканирования), а вместо этого вызывает F81B, т.к 3 байта короче, чем 30 байтов. Потому, если в исполнительную часть п/п-ммы F81B добавить счётчик вызовов и по каждому, например, 300-тому вызову F81B вызывать процедуру визуализации (и перед F803), то это будет работать точно также, как визуализация на прерываниях.

    Вот так устроен полноценный программный эмулятор РК86, а не та туфта, что была опубликована в ж.РАДИО в 1991 под именем эмулятор РК86.

    Кстати на этом же принципе основаны программые часы в моих драйверах, пока программа читает клавиатуру, программные часы идут (хотя если нет опоры на апп.таймер, то часы идут неточно).

    Короче, благодаря таким свойствам М3, простейшим способом получается визуализация наглых программ РК86. К сожалению, не всех.

    Потому что извращенцы идут дальше, они не только нагло лезут в экран, но еще и используют служебные ячейки ПЗУ наоборот. Например, чтобы изменить позицию в экране куда по F809 будет выкинут очередной символ (вместо того, чтобы использовать код ESC,Y), они нагло меняют ячейки 7600/7601, где ПЗУ хранит экранный адрес для очередного вывода на экран. Оттого вывод получается куда они хотят, и даже вне основной экранной матрицы, что позволяет выводить выше экрана 64*25, ниже его, правее и левее. Но на ОРИОНЕ ячейка 7600 ни на что не влияет и вывод по F809 происходит по текущим координатам из ячеек POSX, POSY (F3D6/F3D7).

    Чтобы даже такая сверхнаглота визуализировалась, надо переписать ROM-BIOS ОРИОНА так, чтобы служебные ячейки ПЗУ РК86 полностью обслуживались и точно также как в РК86 влияли на работу. По сути именно это должны были сделать разработчики ОРИОНА, раз уж взялись за задачу совместимости с РК86.
    [свернуть]
    Последний раз редактировалось barsik; 11.12.2017 в 03:23.

  2. #82
    zx_
    Гость

    По умолчанию

    barsik, вот. такую штуку сделать можете?
    http://zx-pk.ru/threads/11319-radio-...l=1#post607765

  3. #83
    Moderator Аватар для fifan
    Регистрация
    30.05.2007
    Адрес
    г. Лянтор, Сургутского р-на, ХМАО
    Сообщений
    4,165
    Спасибо Благодарностей отдано 
    106
    Спасибо Благодарностей получено 
    125
    Поблагодарили
    71 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  4. #84
    Veteran Аватар для Pyk
    Регистрация
    05.04.2013
    Адрес
    с. Починки, Нижегородская обл.
    Сообщений
    1,181
    Спасибо Благодарностей отдано 
    263
    Спасибо Благодарностей получено 
    457
    Поблагодарили
    182 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  5. #85
    Banned
    Регистрация
    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.

  6. #86
    zx_
    Гость

    По умолчанию

    Цитата Сообщение от barsik Посмотреть сообщение
    DOCTOR.COM и посекторный редактор TS-EDIT.COM
    а пересобрать эти утилиты для Специалиста можете?

    а нортон от barsik тоже хотелось бы, мааааленький ! вместо SE
    или SE пересобрать для спеца

    причем нортон не просто панели , а с полезными утилитами встроенными , ну к примеру загрузка с магнитофона на диск , редактор можно внешний, вьювер всяких текстов и картинок

  7. #87
    Banned
    Регистрация
    05.07.2010
    Адрес
    Москва
    Сообщений
    1,058
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от fifan Посмотреть сообщение
    Может всё таки кто-нибудь даст расшифровку аббревиатуры КНМГД?
    Встречал два варианта - старый и ОЧЕНЬ старый:

    1) Контроллер накопителя на магнитных гибких дисках
    2) Контроллер накопителя на миниатюрных гибких дисках (133мм)

  8. #88
    Banned
    Регистрация
    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.

  9. #89
    zx_
    Гость

    По умолчанию

    интересный пост в оригинальной теме
    http://zx-pk.ru/threads/11319-radio-...l=1#post671547

    как так?

  10. #90
    Veteran Аватар для Pyk
    Регистрация
    05.04.2013
    Адрес
    с. Починки, Нижегородская обл.
    Сообщений
    1,181
    Спасибо Благодарностей отдано 
    263
    Спасибо Благодарностей получено 
    457
    Поблагодарили
    182 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

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

Страница 9 из 14 ПерваяПервая ... 5678910111213 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. PS/2 адаптер клавиатуры для Специалиста
    от fifan в разделе Специалист
    Ответов: 230
    Последнее: 27.07.2023, 10:03
  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

Ваши права

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