Какие подпрограммы в окне #3Dxx использует софт? Кроме:
#3D00,#3D03,#3D13,#3D21,#3D2F
Вид для печати
Какие подпрограммы в окне #3Dxx использует софт? Кроме:
#3D00,#3D03,#3D13,#3D21,#3D2F
Да, собственно, любые может использовать, которые расположены в диапазоне #3d00 - #3dff. Если адрес подпрограммы лежит непосредственно в пределах этого окна, можно просто передать на нее управление, например, обычным CALL NN. А если речь о точках входа, то их полно: #3d2c, #3d4b, #3d7f, #3d93, #3d96, #3d97, #3dac.
Есть же диззассемблерный текст TRDOS:
Код:;Адрес #3D00. Вход в TR-DOS. Переключает ПЗУ.
x3D00 NOP
JR x3D31
;Адрес #3D03. Выполнение команд TR-DOS из бейсика. Установите CH_ADD на префикс :REM: перед командой. Возвращает в BC код ошибки. Переключает ПЗУ.
x3D03 NOP
JR x3D1A
;Адрес #3D06. Подпрограмма ввода из файла данных. Переключает ПЗУ. При вызове из редактора вводит всю строку и производит выход из редактора, иначе возвращает в A символ из файла.
x3D06 NOP
JP x25EF
;Адрес #3D0A. То же, что и #3D0D, но не переключает ПЗУ.
x3D0A JP x244A
;Адрес #3D0D. Подпрограмма вывода в файл данных. Символ поместите в аккумулятор. Используется также с адреса #3D0E. Обе точки входа переключают ПЗУ.
x3D0D NOP
x3D0E JR x3D0A
;Адрес #3D10. То же, что и #20F1. Переключает ПЗУ.
x3D10 NOP
JR x3CFA
;Адрес #3D13. Переход на подпрограмму вызова подпрограмм TR-DOS из машинного кода. Адрес является переключателем.
x3D13 NOP
JR x3CFD
;Адрес #3D16. Переход на подпрограмму обработки ошибок. Адрес является переключателем.
x3D16 NOP
JP OBROSH ;#3449
;Адрес #3D1A. То же, что и #3D03, но не переключает ПЗУ.
x3D1A CALL x3D21 ;создание системных переменных TR-DOS
PUSH HL ;помещение на стек адреса переключателя ПЗУ на бейсик
JP x016C ;выполнение команды
;Адрес #3D21. Создание области системных переменных TR-DOS, если ее нет. В HL помещается #5CC2.
x3D21 CALL x31F3 ;проверка наличия области системных переменных
NOP
NOP
CALL C,x3D4C ;если ее нет, то создание ее
LD HL,#5CC2 ;загрузка в HL адреса переключателя ПЗУ на бейсик
RET ;возврат
NOP
NOP
;Адрес #3D2F. Переключение пзу на TR-DOS и переход на любой адрес. Адрес поместите на стек.
x3D2F NOP
x3D30 RET
;Адрес #3D31. Вход в TR-DOS.
x3D31 CALL x3D21 ;создание области системных переменных
PUSH HL ;помещение на стек адреса переключателя ПЗУ на бейсик
JP WHOD ;#3BF0 ;вход в TR-DOS
;Адрес #3D38. Проверка наличия интерфейса-1. В случае его обнаружения происходит создание его системных переменных и в #5CF1 помещается 1. Для работы подпрограмма должна быть перемещена в любое место ОЗУ.
x3D38 XOR A ;интерфейс-1 есть?
OUT (#F7),A
IN A,(#F7)
CP #1E
JR Z,x3D44 ;если да, то создание его системных переменных
CP #1F
RET NZ ;если нет, то возврат
x3D44 RST 8 ;создание системных переменных интерфейса-1
DB #31
LD A,1 ;по команде SAVE записывать 1 копию
LD (#5CEF),A
RET ;возврат
;Адрес #3D4C. Создание системных переменных TR-DOS. При наличии интерфейса-1 перед созданием переменных TR-DOS создаются его переменные и в #5CEF помещается 1. В переменные TR-DOS помещаются: в #5CFA - #5CFC, #5CC8 - #5CCA, #5C3A, #5D16 и #5D0C - #FF; в #5D17, #5D19, #5D18, #5D0F и #5D1F - 0; в #5CC2 - #C9. Также в системный регистр помещается #FF, а на ВГ93 выдается команда прерывания. Подпрограмма портит ячейки памяти калькулятора.
x3D4C XOR A ;выбор дисковода A: и сброс ВГ93
OUT (#FF),A
IN A,(#F6) ;это ничего не дает
LD HL,x3D38 ;адрес подпрограммы проверки наличия интерфейса-1
LD DE,#5C92 ;любой свободный адрес, ОЗУ
LD BC,#14 ;длина подпрограммы
LDIR ;перенос подпрограммы в ОЗУ
LD HL,x3D67 ;адрес возврата из подпрограммы
PUSH HL ;помещение его на стек
LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS
PUSH HL ;помещение его на стек
JP #5C92 ;запуск подпрограммы
;Адрес #3D67. Создание системных переменных TR-DOS. В переменные помещаются: в #5CFA - #5CFD, #5CC8 - #5CCB, #5C3A, #5D16 и #5D0C - #FF; в #5D17, #5D19, #5D18, #5D0F и #5D1F - 0; в #5CC2 - #C9. Также в системный регистр помещается #FF, а на ВГ93 выдается команда прерывания.
x3D67 LD HL,x2F90 ;адрес возврата из пзу бейсика
PUSH HL ;помещение его на стек
LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS
PUSH HL ;помещение его на стек
LD HL,#1655 ;адрес подпрограммы MAKE_ROOM из ПЗУ бейсика
PUSH HL ;помещение его на стек
LD HL,#5BFF ;адрес переключателя ПЗУ на бейсик
PUSH HL ;помещение его на стек
LD (HL),#C9 ;помещение в озу команды RET
LD HL,#5CB5 ;начальный адрес области системных переменных
LD BC,#70 ;длина ее
RET ;запуск подпрограммы MAKE_ROOM
;Адрес #3D80. Перевод строки. Используется также с адреса #3D82 (печать символа из аккумулятора). Также эта подпрограмма ошибочно используется с адреса #3D8B подпрограммой #4F6.
x3D80 LD A,#D ;символ ENTER
x3D82 JP DOSSYM ;#805
DS 9,#FF
DB #FF,0,0,#FF,#FF,#FF
;Адрес #3D94. Печать символа без изменения памяти. Символ поместите в аккумулятор.
x3D94 RST #20
DW #0010
RET
;Адрес #3D98. Восстановление с ожиданием INTRQ. Используется также с адреса #3D9A (отдача команды из рег.A с ожиданием INTRQ).
x3D98 LD A,8 ;восстановление
x3D9A OUT (#1F),A
x3D9C PUSH HL ;сохранение HL
RST #20 ;проверка нажатия BREAK
DW #1F54
JR C,x3DA5 ;если нажато, то сообщение *BREAK*
RST #20
DW #1B7B
x3DA5 POP HL ;восстановление HL
IN A,(#FF) ;INTRQ поступил?
AND #80
JR Z,x3D9C ;если нет, то повтор
RET ;возврат
;Адрес #3DAD. Проверка наличия диска в дисководе. Никаких установок не требуется.
x3DAD LD A,8 ;команда восстановления
CALL x3D9A ;выдача команды и ожидание INTRQ
LD DE,0 ;за #10000 проходов индексный сигнал должен измениться
IN A,(#1F) ;берем индексный сигнал для образца
AND 2
LD B,A ;запоминаем его
x3DBA IN A,(#1F) ;берем его снова
AND 2
CP B ;он изменился?
RET NZ ;если да, то возврат
INC DE ;следующая попытка
LD A,E ;попытки кончились
OR D
JR NZ,x3DBA ;если нет, то повтор
JP x3EE7 ;обработка ошибки NO DISC
;Адрес #3DC8. Выбор дисковода, определенного по умолчанию. Вход: можно установить время перемещения головки и режим дисковода согласно описанию команды #01. Выход: эти переменные могут быть изменены согласно этому описанию. Используется также с адресов:
;#3DCB - выбор дисковода. Номер задайте в рег.A, остальное как и для предыдущей подпрограммы.
;#3DFD - задержка в 725779 тактов.
;#3DFF - задержка любой нужной длительности. В рег.A установите число, определяющее длительность задержки.
x3DC8 LD A,(#5D19) ;берем номер дисковода по умолчанию
x3DCB JP TCH2 ;перехват выбора дисковода
TCH2Q LD HL,#5D16 ;выбор дисковода
LD C,A
LD A,#3C
OR C
OUT (#FF),A
LD (HL),A
CALL x3E08 ;берем время перемещения головки дисковода
AND #80 ;бит 7 выключен?
JR Z,x3DFA ;если да, то инициализацию не проводим
CALL x3DAD ;проверка наличия диска в дисководе
CALL x3E16 ;определение времени перемещения головки дисковода
CALL x3E11 ;берем тип дисковода
CP #FF ;в этой переменной #FF?
JR NZ,x3DFA ;если да, то не определяем его
PUSH HL ;сохраняем адрес переменной с типом дисковода
CALL x1FCA ;определение количества дорожек дисковода
POP HL ;восстановление адреса переменной типа
CP #50 ;установка этой переменной
LD A,0
JR NZ,x3DF9
LD A,#80
x3DF9 LD (HL),A
;Внимание, ошибка!!! Не проверяется количество сторон дисковода и предполагается, что он односторонний.
x3DFA CALL x1E36 ;проверка индексной области диска
x3DFD LD A,#50 ;задержка в 327842 тактов
x3DFF LD C,#FF
x3E01 DEC C
JR NZ,x3E01
DEC A
JR NZ,x3DFF
RET ;возврат
Да, есть, но меня интересует какие точки использует софт, кроме тех что в первом посте.
---------- Post added at 09:19 ---------- Previous post was at 09:18 ----------
Это еще и кусок исходника под sjasmplus который я делал, а сразу и не заметил :)
вот здесь главное (на данном этапе осознания действительности) не перебарщивать. да, можно хоть 100500 хитрых мест заюзать там, где этого и не надо, чисто для прикола, только потом это может вылиться в беду - хрен ваши старые проги заработают на новом железе, и будет вам облом в них ковыряться, чтобы запустить и поностальгировать.