Jason.blk
ZXNet эхоконференция «real.speccy»
От Kirill Frolov → Кому All 23.03.2001
Есть для iS-DOS под Hемовскую схему драйвер сабжевый и ide+.blk.
Так вот диск из под одного драйвера не видится другим и наоборот.
Они по разному пересчитывают свои координаты в CHS ? А какой из них
"правильный" ? Правильная формула: LBA=(C*HEADS+H)*SECTORS+S-1.
* Crossposted in ZXNET.SOFT
* Crossposted in REAL.SPECCY
От Alexey Volyk → Кому All 24.03.2001
23 Мар 01, 21:13 "Kirill Frolov" писал к "All":
KF> Есть для iS-DOS под Hемовскую схему драйвер сабжевый и ide+.blk.
KF> Так вот диск из под одного драйвера не видится другим и наоборот.
KF> Они по разному пересчитывают свои координаты в CHS ? А какой из них
KF> "правильный" ? Правильная формула: LBA=(C*HEADS+H)*SECTORS+S-1.
Hастроить ide_tune.bat не судьба? :)
С уважением, Волык Алексей
from Phantom Family.
От Kirill Frolov → Кому All 24.03.2001
KF>> ide+.blk. Так вот диск из под одного драйвера не видится другим
KF>> и наоборот. Они по разному пересчитывают свои координаты в CHS ?
KF>> А какой из них "правильный" ? Правильная формула:
KF>> LBA=(C*HEADS+H)*SECTORS+S-1.
AV> Hастроить ide_tune.bat не судьба? :)
Ты думаешь я совсем тормоз? Я их одинаково настроил. Вот стоят в системе
оба,
координаты одинаковые, а один диски другого не видит и наоборот!
А я теперь думаю, что если какой-то там мазданый драйвер из двух этих
рассчитывает
координаты неправильно, то я рискую другими системами (мс-дос/цп/м) на этом
винте запороть
исдосный раздел или наоборот исдос чего-нибудь запорет. Hеужели опять
дизассемблер в руки
брать и драйвер ковырять? :-( Выкручивать винт из спека и в писюке смотреть
чего там не так
мне неохота.
От Alexey Volyk → Кому All 25.03.2001
25 Мар 01, 00:22 "Kirill Frolov" писал к "Alexey Volyk":
KF> Ты думаешь я совсем тормоз? Я их одинаково настроил. Вот стоят в
KF> системе оба, координаты одинаковые, а один диски другого не видит и
KF> наоборот!
:)
KF> А я теперь думаю, что если какой-то там мазданый драйвер из двух
KF> этих рассчитывает координаты неправильно, то я рискую другими
KF> системами (мс-дос/цп/м) на этом винте запороть исдосный раздел или
KF> наоборот исдос чего-нибудь запорет. Hеужели опять дизассемблер в руки
KF> брать и драйвер ковырять? :-( Выкручивать винт из спека и в писюке
KF> смотреть чего там не так мне неохота.
Дело в другом. Запусти прогу dev.com. Она покажет тебе список всех драйверов и
устройств. Так вот на одно уст-во нельзя повесить более одного драйвера.
Можно просто передавать устройства разным драйверам. То есть отключив один
драйвер, прицепить туда другой.
От Kirill Frolov → Кому All 25.03.2001
KF>> двух этих рассчитывает координаты неправильно, то я рискую
KF>> другими системами (мс-дос/цп/м) на этом винте запороть исдосный
KF>> раздел или наоборот исдос чего-нибудь запорет. Hеужели опять
KF>> дизассемблер в руки брать и драйвер ковырять? :-( Выкручивать
KF>> винт из спека и в писюке смотреть чего там не так мне неохота.
AV> Дело в другом. Запусти прогу dev.com. Она покажет тебе список всех
AV> драйверов и устройств. Так вот на одно уст-во нельзя повесить более
AV> одного драйвера. Можно просто передавать устройства разным драйверам.
AV> То есть отключив один драйвер, прицепить туда другой.
Hе тормоз я! Одно у меня C: на ide+.blk, a другое D: Jason.blk.
И программой ide_tune.com для C: и D: для ОБОИХ ДРАЙВЕРОВ были выставлены
одинаковые координаты. И по отдельности драйвера грузил и вместе.
Они даже нулевой блок от другого драйвера не видят!
От Valerij Kozhevnikoff → Кому All 26.03.2001
26 Мар 01 01:25, Kirill Frolov -> Alexey Volyk:
KF> Hе тормоз я! Одно у меня C: на ide+.blk, a другое D: Jason.blk.
KF> И программой ide_tune.com для C: и D: для ОБОИХ ДРАЙВЕРОВ были выставлены
KF> одинаковые координаты. И по отдельности драйвера грузил и вместе.
KF> Они даже нулевой блок от другого драйвера не видят!
······------====== Стеклорез мониторный ======------······
1999
29.4.99: Принят на вооружение драйвер
IDE HDD Jason.blk (Москва), дающий ус-
корение до 1.65 раза на операциях чте-
ния копирования:
Тесты:
1. Копирование диск в диск (15 MB) с
помощью abc.com - в 1.65 раза
2. Проверка диска прогом bad: в 1.4
3. Загрузка электронного диска image
в 1.3 раза (7 секунд вместо 9)
4. Проверка контрольной суммы (9.7 MB)
на 13% (2'58" вместо 3'25")
5. Копирование каталога (coca, 4286
блоков, 243 файла) на 6.5%
Однако сей драйвер без тормозов (Break
не отслеживается) и почти не тестиро-
вался на битых секторах. Посему поль-
зуйтесь, если хотите, на свой страх и
риск.
12.5.99: fileshow, arzt+ - Исправлена
индикация
15.5.99: trd_ram - ключ /a для автомати-
ческой работы. Работа в ISDOS Classic
15.5.99: ide+5.blk - Ускоренный по методу
Ясона. Почти такой же быстрый, но с
тормозами и сделаный из протестирован-
ных предшественников.
СКОРОСТHЫЕ ХАР-КИ ДРАЙВЕРОВ:
Специальные тесты:
0.1 16368 kB (по 16kB) Linear READ TEST
ide+4 117" =140 kbps
ide+5 78" =210 kbps в 1.50 раза
Jason 73" =224 kbps в 1.60 (еще 6.5%)
0.2 16368 blks 16kB REPEAT READ TEST
ide+4 107" =153 kbps
ide+5 68" =241 kbps в 1.57 раза
Jason 66" =248 kbps в 1.62 (еще 3%)
ed128 58" =282 kbps еще 12%
0.3 10608kB Linear WRITE TEST
ide+4 101" =105 kbps
ide+5 52" =204 kbps в 1.94 раза
Jason 45" =236 kbps в 2.24 (еще 13.5%)
(ed128 282 kbps еще 17%)
Реальные задачи:
1. bad.com 65520 blks (READ)
ide+4 138" =118 kbps
ide+5 99" =165 kbps (в 1.39 раза)
Jason 99" =165 kbps
ed128 81" =202 kbps
floppy =14 kbps (kay.blk)
2. abc.com 7.8 MB (COPY)
ide+4 159" =50 kbps
ide+5 103" =77 kbps в 1.54
Jason 96" =83 kbps в 1.66 (гще 7%)
floppy: менее 7 kbps
······------====== Стеклорез мониторный ======------······
Кто тормоз?
WBR, Jason.
[Team Obituary][Team Friday 13th][Team Злобные Маньяки][Team Огромные Топоры]
От Valerij Kozhevnikoff → Кому All 26.03.2001
KF> Hе тормоз я! Одно у меня C: на ide+.blk, a другое D: Jason.blk.
KF> И программой ide_tune.com для C: и D: для ОБОИХ ДРАЙВЕРОВ были выставлены
KF> одинаковые координаты. И по отдельности драйвера грузил и вместе.
KF> Они даже нулевой блок от другого драйвера не видят!
Фигня какая-то. Леонтьев мой исходник видел, драйвер тестировал, все нормально
было.
;(c) Jason.
;idenemo.blk
;HDD IDE driver for IsDOS.
;NEMO controller supported.
;Direct HDD access used.
DEFW INSTL ;16 системных байт
DEFW BREAD
DEFW BWRITE
DEFW INIT
DEFB #E0 ;байты состояния драйвера
DEFB #04
;дисководные рудименты
DEFW #0000 ;смещение до IM2
DEFB #FC ;тип трдоса
DEFB #04 ;число попыток R/W
DEFW #0000
;-----------------------;формат "шапки" сохранен
HEAD DEFB #00 ;геометрия. кол-во головок
SECTOR DEFB #00 ;секторов
HDDMAP DEFW 0 ;начальные цилиндры устройств
DEFW 0
DEFW 0
DEFW 0
DEFW 0
DEFW 0
DEFW 0
DEFW 0
QCYLND DEFW #0270 ;кол-во БЛОКОВ в цил.!
DEFB #FA,#02 ;??? непонятно
CURDEV DEFW #0000 ;нач. цил. текущ. устройства
CURDRV DEFB #A0 ;маска текущ. привода
TICKS_ DEFW #1770 ;6000 тиков до откл.
;===============================;дальше все мое
INSTL
CP #08 ;переключение устойств.
JR NC,INIT
;A=#FF вызывается после каждого перемещения или установки
;A=#FE вызывается перед удалением
RLCA
LD HL,HDDMAP
LD B,#00
LD C,A
ADD HL,BC
LD DE,CURDEV
LDI
LDI
INIT
IN A,(#F0) ;винт в порядке?
CP #50
RET Z ;да!
SRESET DI ;иначе сбрасываем его
LD A,(CURDRV)
OUT (#D0),A
LD A,#0C
OUT (#C8),A
LD B,#00
1$ DJNZ 1$ ;пауза
LD A,#08
OUT (#C8),A
2$ IN A,(#F0) ;ждем снятия BSY
RLCA
JR C,2$
LD A,#10
OUT (#F0),A ;команда "рекалибровка"
EI
_WAIT_ CALL BRKTST
RET C
IN A,(#F0)
BIT 7,A
JR NZ,_WAIT_ ;ждем исполнения
CP #50 ;винт в порядке?
RET Z
JR SRESET
BRKTST
LD C,9 ;проверка BREAK
RST #10
RET Z
CP #16
SCF
RET Z
OR A
RET
;===============================;
BREAD LD C,#00 ;флаг чтения
JR LLLL
BWRITE LD C,#FF ;флаг записи
LLLL
CALL WORK__
EI
RET
WORK__ LD A,B ;!> (кол-во)
PUSH DE ;начало
EXX ;сменили набор
;-------------------------------;
POP DE ;расчет файла задания
LD HL,(QCYLND) ;cvol
SRL H
RR L
EX DE,HL
SRL H
RR L
EX AF,AF' ;!>
XOR A ;
LD C,A ;hl - disp
LD B,A ;de - cvol
CNTCLD SBC HL,DE ;disp?cvol
INC BC
JR NC,CNTCLD
DEC BC ;bc - disp/cvol = dcyl
ADD HL,DE ;hl - disp?cvol = lsec
LD A,(SECTOR) ;a - qsec
LD E,A
XOR A
LD D,A
CNTHED SBC HL,DE ;hl - lsec
INC A
JR NC,CNTHED
DEC A ;a - lsec/qsec = dhead
ADD HL,DE ;hl - lsec?qsec = dsec
LD H,A
EX DE,HL ;d-thead, e-tsec
INC E
LD HL,(CURDEV) ;hl - cyl
ADD HL,BC ;cyl + dcyl = tcyl!
LD A,(CURDRV)
OR D
LD D,A ;привод/головка в D
;-------------------------------;
PUSH HL ;
LD HL,FLAGS_
EX AF,AF' ;!< кол-во _блоков_ для опер.
LD B,A ;если коорд. четна - CY=0
LD A,#00
RLA ;четность коорд.
SRL B ;B/2 (счетчик)
RLA
JR NZ,TASKFL ;что-то нечетно
DEC HL
DEC HL
RRA
TASKFL LD C,A
LD A,B
LD (COUNT),A
LD B,#00
ADD HL,BC
LD A,(HL) ;<
LD (_FLAG),A ;злобные флажки
DI
POP HL
LD A,D ;пишем файл задания
OUT (#D0),A ;привод/головка
LD A,H
OUT (#B0),A ;старший байт цилиндра
LD A,L
OUT (#90),A ;младший байт цилиндра
LD A,E
OUT (#70),A ;сектор
EXX ;ага!
;============================================================;
COUNT EQU $+1
_FLAG EQU $+2
LD DE,0
LD A,C ;используем флаг
OR A ;
JP NZ,WRITE_ ;запись
;-------------------------------;
SRL D ;а тут чтение
JR NC,NO_ODR
INC E
NO_ODR LD A,E
OUT (#50),A ;установили счетчик
OR A
CALL COMAND ;чтение
RET C
SRL D
JR C,R_LAST
LD C,#50
IN A,(C) ;счетчик
LD A,#40 ;читаем целый сектор
JR Z,_INPUT
SRL D
JR NC,_INPUT
RRCA
CALL SKIP_4 ;скипаем полсектора
LD A,#20 ;читаем полсектора
_INPUT
CALL _INI_
W_BS_I IN A,(#F0) ;ждем готовности
BIT 7,A ;BSY?
JR NZ,W_BS_I
BIT 3,A ;DRQ?
JR Z,END_RD
IN A,(#50) ;счетчик
OR A
LD A,#40
JR NZ,_INPUT ;если не 0, то снова
SRL D ;последний сектор целиком?
JR C,_INPUT ;да!
;тут читалки для одиночных половинок
;===============================;последний блок.
RRCA
R1HS2H ;читаем полсектора
CALL _INI_
LD A,#20 ;скипаем полсектора
CALL SKIP_4
JR ENDTST ;конец
;-------------------------------;один блок
R_LAST LD A,#20
SRL D
JR NC,R1HS2H
CALL SKIP_4 ;скипаем полсектора
LD A,#20 ;читаем полсектора
CALL _INI_
ENDTST
ET IN A,(#F0) ;состояние
BIT 7,A
JR NZ,ET
END_RD RRA
LD A,#07 ;ошибка "битый диск"
RET
;главный насос.
;читает A*4 слов на адрес HL. При А=#40 - полный сектор.
;У меня в скорповом драйвере все циклы еще больше раскрыты,
;это дает прирост 10-15% скорости.
_INI_
LD C,#10
_INP INI ;16
INC C ;4
INI ;16
DEC C ;4 40
INI
INC C
INI
DEC C
INI
INC C
INI
DEC C
INI
INC C
INI
DEC C
DEC A
JP NZ,_INP
RET
;скипает A*4 слов.
SKIP_4
LD B,A
SKIP__
IN A,(#10)
IN A,(#10)
IN A,(#10)
IN A,(#10)
DJNZ SKIP__
RET
;-------------------------------------------;
;выплевывает A*4 слов с адреса в HL
;в регистр данных. При А=#40 выплюнется полный
;сектор (#200 байт).
_OUTPUT
LD (STORE+1),SP
LD SP,HL
LD B,A
LD C,#10
_OUTSP
POP HL ;10
LD A,H ;4
OUT (#11),A ;11
OUT (C),L ;12 37
POP HL
LD A,H
OUT (#11),A
OUT (C),L
POP HL
LD A,H
OUT (#11),A
OUT (C),L
POP HL
LD A,H
OUT (#11),A
OUT (C),L
DJNZ _OUTSP
LD ($+5),SP
LD HL,0
STORE LD SP,0
RET
;нижележащее можно заюзать вместо вышележащего,
;если нельзя трогать стек
;_OUTPUT
; LD C,#10
;_OUTP INC C ;4
; INC HL ;7
; OUTD ;16
; DEC C ;4
; OUTI ;16
; INC HL ;7 54 (тормоза в садъ!)
;
; INC C
; INC HL
; OUTD
; DEC C
; OUTI
; INC HL
;
; INC C
; INC HL
; OUTD
; DEC C
; OUTI
; INC HL
;
; INC C
; INC HL
; OUTD
; DEC C
; OUTI
; INC HL
;
; DEC A
; JP NZ,_OUTP
; RET
;------------------------------------------------------------;
;засылает команду R/W (по флагу C), если C=1, то запись.
;ждет готовности, возвращает флаг C, если были ошибки.
COMAND
EX AF,AF'
WDRDY IN A,(#F0)
BIT 7,A
JR NZ,WDRDY
BIT 6,A ;ждем DRDY
JR Z,WDRDY
EX AF,AF'
LD A,#20 ;команда чтение
JR NC,COM_RD
OR #10 ;или запись
COM_RD
OUT (#F0),A ;командуем
WAIT_R IN A,(#F0)
BIT 7,A ;BSY? (занят?)
JR NZ,WAIT_R
BIT 0,A
JR NZ,ERR_CM ;ошибка
BIT 3,A ;DRQ? (хочет данные?)
JR Z,WAIT_R
ERR_CM RRA ;бит ошибки во флаг C
LD A,#0A ;параметры недопустимы
RET
;=================================;
WRITE_ SLA D
JR NC,NO_ODW
INC E
NO_ODW SLA D
JP C,BL1HLF
SLA D
JR C,BL2HLF
LD A,E
OUT (#50),A ;счетчик
SCF
CALL COMAND ;запись
RET C
_OUTSE LD A,#40 ;главный цикл
_OUTEX CALL _OUTPUT
W_BSY_
IN A,(#F0)
BIT 7,A ;BUSY?
JR NZ,W_BSY_
BIT 3,A ;DRQ?
JR NZ,_OUTSE
RRA
LD A,#07 ;если ошибка
RET C
IN A,(#50) ;счетчик=0?
OR A
JR NZ,W_BSY_ ;если нет, то снова
SLA D
JP NC,WLSBLK ;дописываем последний блок
XOR A ;удачное завершение
RET
;тут плевалки половинок
;-------------------------------;блок в 2ю половину
BL2HLF ;счетчик секторов=1
LD A,#01
OUT (#50),A
OR A ;чтение
CALL COMAND
RET C
PUSH HL
LD HL,BUFFER ;первую
LD A,#20 ;полсек. чит. в буфер
CALL _INI_
LD A,#20 ;вторую полсек. скип
CALL SKIP_4
POP HL
WBFBS1 ;ждем
IN A,(#F0)
CP #50
JR NZ,WBFBS1
LD A,E ;счетчик
OUT (#50),A
SCF
CALL COMAND ;запись
RET C
PUSH HL
LD HL,BUFFER ;пишем буфер
LD A,#20
CALL _OUTPUT
POP HL
_OUTBL LD A,#20 ;приписываем хвост
JR _OUTEX ;и продолжим
;-------------------------------;блок в 1ю половину
BL1HLF SLA D
JR C,BL2HLF ;либо 2ю
LD A,#01
OUT (#50),A
OR A ;чтение
CALL COMAND
RET C
S1HR2B
LD A,#20
CALL SKIP_4 ;скип первую половину
PUSH HL
LD HL,BUFFER
LD A,#20 ;вторую чит. в буфер
CALL _INI_
POP HL
WBFBS2 ;ждем
IN A,(#F0)
CP #50
JR NZ,WBFBS2
LD A,E
OUT (#50),A
SCF
CALL COMAND ;запись
RET C
LD A,#20 ;пишем в первую пол.
CALL _OUTPUT
LD HL,BUFFER ;и сливаем буфер
JR _OUTBL
;-------------------------------;
WLSBLK LD DE,#8001 ;дописка одного последнего
LD A,#02 ;блока
OUT (#50),A ;счетчик=2
OR A ;чтение
CALL COMAND
RET C
LD A,#40 ;скипаем весь текущий сектор
CALL SKIP_4
BSY_LB
IN A,(#F0)
BIT 7,A ;BUSY?
JR NZ,BSY_LB
BIT 3,A ;DRQ?
JR NZ,S1HR2B ;скип 1ю, read 2ю в буф.
RRA ;ошибку во флаг C
LD A,#07
RET C ;возврат с ошибкой
JR BSY_LB
DEFB %11010011 ;злобные флажки
DEFB %11110111
FLAGS_ DEFB %00011000
DEFB %00000001
DEFB %00100101
DEFB %10111101
BUFFER
DEFS #100
;***
От Alexey Volyk → Кому All 27.03.2001
26 Мар 01, 01:25 "Kirill Frolov" писал к "Alexey Volyk":
KF> Hе тормоз я! Одно у меня C: на ide+.blk, a другое D: Jason.blk.
KF> И программой ide_tune.com для C: и D: для ОБОИХ ДРАЙВЕРОВ были
KF> выставлены одинаковые координаты. И по отдельности драйвера грузил и
KF> вместе. Они даже нулевой блок от другого драйвера не видят!
Специально попробовал:
1. Поставил второй драйвер винта с другим именем.
2. Открепил от первого драйвера устройство Е:
3. Прикрепил ко второму драйверу
4. Hастроил Е: второго драйвера на нулевую дорогу
5. Выбрал диск Е:
6. Выбрал диск С:
_ОДИHАКОВЫЕ!!!_
С: - ДРАЙВЕР 1
Е: - ДРАЙВЕР 2
У меня все в порядке!!!
Я тоже не тормоз.:))
От Dmitriy Nesmachny → Кому All 17.04.2001
Ты тут програмулину рульную заюючил, так вот: не пошла... То есть я как
сделал: записал в ISDOS pkt большой (там получилось что 1 файл длиной 255,
второй 80 секторов), записал с одинаковым именем, только огрызок назвал 0kt,
пометил, запустил прожку и она давай бошкой о последний трек биться. А break
нажимаешь - в 48 basic вылетает. Оно так и должно или чего то там не так?
С уважением, Dmitriy.