Сообщение от
makbar
возьмите мои подпрограммы и не мучайтесь с какими то HOLD-ами, базовый СПЕЦИАЛИСТ и так успевает
Возможно так и сделаю. Вскоре собираюсь поэкспериментировать с подпрограммами от разных авторов. Отличие схем небольшое, а для идеологии SPDOS и вот этого контроллера готовый контроллер с чтением 38 и 39-той ног ВГ93 у меня уже есть. Отличие в адресах и битах портов несущественно.
Скорее всего использую Ваши или MX-овые подпрограммы, но Ваши - без порта чтения DRQ, а MX-овые - без режима HOLD (читая DRQ из ВГ93, как обычно). Думаю, что эти более короткие подпрограммы в сочетании с тактом 2.25 МГЦ (вместо 2.0 МГЦ) позволят использовать обычный КНГМД от ОРИОНА без всяких аппаратных выкрутасов.
Сообщение от
makbar
Две команды вместо трёх дают очень небольшой выигрыш. На самом деле Ваш вариант работает на 2 МГЦ вовсе не из-за чтения DRQ аппаратно. Возможно даже без этого можно обойтись (если как в фирменной подпрограмме сделать запись стеком). Как и писал выше, о пользе от регистра для DRQ я знал и даже печатные платы с КНГМД имеющим регистр для чтения ног 38 и 39 (и кстати, тоже на ЛП11) были выпущены для ОРИОНА в 2-х городах и CP/M использующая это была странслирована.
А менее требовательный к скорости Ваш вариант просто потому, что он упрощённый, в отличие от стандартных подпрограмм разработанных фирмой Western Digital для ВГ93 и применённых в Корвете. Точнее просто "химия". Хотя, если при этих подпрограммах не происходит зависа на дохлоте или других неприятностей, то всё нормально.
Т.е секрет был вовсе не в замене 3-х команд CPU на 2 команды, поэтому выше в этой теме я и утверждал, что аппаратное чтение DRQ даёт маленький выигрыш и его явно недостаточно, чтобы снизить требование к быстродействию CPU с 2.5 МГЦ до 2 МГЦ.
Раз уж занялся анализом подпрограмм чтения/записи сектора для разных схем контроллеров на базе ВГ93 от разных авторов, то посмотрел подпрограммы и вот этого контроллера. DOS для этой системы не была закончена. Дело внедрения дисковода, похоже, ограничилось лишь экспериментами, хотя, по информации авторов, вполне успешными. DOS, кстати, для этой системы собирались делать совместимой с MSDOS по формату дискеты. Во вложении их подпрограммы, в которых я разбирался.
Наиболее критичной по требованиям к быстродействию является подпрограмма записи.
Подпрограмма работающая стеком из CP/M Корвета (и ОРИОНА):
Код:
.
LD HL,RGDATA ; запись физ.сектора
LD DE,RGCOM
LD SP,BUFFER ; буфер откуда писать
WR_LOO: POP BC ; берём 2 байта из стека
WAIT_1: LD A,(DE) ; LD A,(RGCOM)
XOR 00000001B ; инвертировать бит D0
JP Z,WAI_01 ; если D0=1 ТО ВГ93 занят и ошибок нет
LD (HL),C ; LD (RGDATA),C пишем младший байт
RRA ; бит D0=0 ?
JP C,WRDONE ; да, значит ВГ93 занят
RRA ; бит D1=1
JP NC,WAIT_1 ; если нет, то нет запроса данных
WAIT_2: LD A,(DE) ; LD A,(RGCOM)
XOR 00000001B ; инвертировать бит D0
JP Z,WAIT_2 ; ждём готовности ВГ93
LD (HL),B ; LD (RGDATA),B пишем старший байт
JP WR_LOO
WRDONE:
Подпрограмма чтения сектора для контроллера отсюда:
Код:
.
RDSEC: LD A,84H ; непосредственное чтение сектора
LD (RGCOM),A
LD BC,RGDATA
LD DE,LP11 ; через 155 ЛП11 читаем готовности ВГ93
RD_LOO: LD A,(DE)
ADD A,A
RET M
JP NC,RD_LOO
LD A,(BC)
LD (HL),A
INC HL
JP RD_LOO
Подпрограмма М.Короткина из SP-DOS версии 4.3 для ОРИОНА:
Код:
.
WRSEC: LD DE,BUFFER
LD BC,RGDATA
LD HL,RG_DRQ
LD A,0F4H
LD (RGCOM),A
WR_LOO: XOR A
WAIT_1: OR (HL)
JP Z,WAIT_1
LD A,(DE)
LD (BC),A
INC DE
JP P,WR_LOO
WRDONE:
Подпрограмма для контроллера Л.Афанасьева от СПЕЦИАЛИСТ-MX:
Код:
.
WRSEC: LD BC,RGDATA
LD DE,400H
LD A,0A4H
LD (RGCOM),A
WAIT_1: LD A,(RGCOM)
RRCA
JP NC,WAIT_1
WR_LOO: LD (RGHOLD),A ; уходим в HOLD, и ждём в нём DRQ
LD A,(HL)
LD (BC),A ; по DRQ выходим и пишем байт
INC HL
DEC DE
LD A,D
OR E
JP NZ,WR_LOO
WRDONE:
Хотел бы посчитать машинные такты, но увы, давно не программировал и куда-то засунул свою табличку с числом тактов команд Z80. А приближающийся склероз ухудшил память (ранее я знал числа тактов всех команд по памяти) теперь без таблички ничего невозможно посчитать. Если у кого-то под рукой есть ссылка на подобную табличку с временами команд КР580 или Z80, то поделитесь.
Но и без арифметики видно, что "химические" самодельные подпрограммы намного короче.