|
Buzz
#17
10 апреля 1999 |
|
DOS PRO - Самые быстрые процедуры работы с диском: чтение/запись секторов без контроля и с контролем ошибок, чтение секторов с контролем на исправность чтения, чтение/запись секторов с контролем в прерываниях, зажигание/гашение лампочки дисковода, раскручивание и торможение диска, сброс ВГ13, позиционирование на 0 трек, защита от Magic Button, гашение лампочки дисковода, проверка какой текущий, контроль наличия диска в дисководе.

■--------------------------------------------------------------■
(C) 1998 FASTeR/TNL (FAST M UP!!!)
(P) 1998 TNL insys!
(C T) ULYANOVSK!
(!) ПРИ ИСПОЛЬЗОВАНИИ В СВОИХ ПРОГРАММАХ ССЫЛКА НА АВТОРА ОБЯЗА-
ТЕЛЬНА!!! И ВАМ НА ДУШЕ СПОКОЙНО И МНЕ ПРИЯТНО ;) !!! (!)
(8422) 37-68-85 (АЛЕКСАНДР) ЗВОНИТЬ ЖЕЛАТЕЛЬНО ДО 23.00 МСК!
<<<<< E-MAIL: FASTER_TNL@DARKSTAR.ILXQ.ML.OVG >>>>>
■--------------------------------------------------------------■
ПРИВЕТИК!!!
FAST M UP!!!
Я, FASTER/TNL представляю Вашему вниманию самые быстрые
процедуры работы с диском на сегодняшний день!!! Очень даже
возможно, что и это еще не предел! Поэтому, если кто-нибудь
напишет более быструю какую-либо из процедур, пусть обязательно
свяжется со мной! Процедуры я особо комментировать не стал (и
так все понятно :), только там, где счел нужным. Надеюсь, они
Вам пригодятся (и не один раз!) в ваших программах, тем более,
что они быстры и работают также в TURBO режиме (коим свойством
обладают далеко не все процедуры!!). Если у Вас возникнут
вопросы, то звоните! Я человек общительный и с удовольствием с
Вами пообщаюсь на любую тему!!! ;)
Итак, великолепная 15-шка... ;)
■--------------------------------------------------------------■
==═════════════════════════════════════════════════════════════=
═ - ·∙° FASTeR'S COLLECTION! °∙· - ═
==═════════════════════════════════════════════════════════════=
■--------------------------------------------------------------■
(!) При написании процедур наивысшим приоритетом была скорость,
а не объем!!!
При работе процедур используются регистры только одного на-
бора (в данном случае, основного!): A,HL,IX,IY,BC,DE.
Стек "напрягается" только по нужде!
Перед вызовом процедур (кроме той, которая работает в
IM 2), следует запрещать прерывания (что, в принципе, не
является правилом)!
(!!) Перед тем, как будут представлены процедуры, я хочу сказать
вот о чем:
1. При обращении к ПЗУ TR-DOS используется точка входа:
#3D30! Это не есть правило... (Говорят есть компы, которые
не переваривают сей прием! Правда мне такие никогда не
встречались!!!)
2. При чтении #1F применяется алгоритм (CooL!), предложен-
ный ANDREW MOA! Мне приходилось встречаться также, с вари-
ацией этого алгоритма (by Иван Рощин!). Ну что я могу ска-
зать??? За всю мою практику, при использовании алгоритма by
MOA, мне не доводилось сталкиваться с ситуацией, когда АЛ-
ГОРИТМ РАБОТАЕТ НЕПРАВИЛЬНО! Так-то!!!
(!) PROцедуры работают на любых версиях TR-DOS (5.03 и выше,
при условии, что в них не внесены какие-нибудь "хищные"
изменения)!!!
■--------------------------------------------------------------■
==═════════════════════════════════════════════════════════════=
╟ ■■■ PROCEDURE_1:TURBO_READ_WITHOUT_ERRORS_CONTROLING! ■■■ ╟
==═════════════════════════════════════════════════════════════=
;ЧТЕНИЕ (ЗАПИСЬ) СЕКТОРА(ОВ) БЕЗ КОНТРОЛЯ ОШИБОК, (САМАЯ БЫСТРАЯ
;ПРОЦЕДУРА)!!!
;(!) 100% ГАРАНТИЯ ПРАВИЛЬНОСТИ СЧИТЫВАНИЯ, ТОЛЬКО В TURBO MODE!
;(!) 50%-В NORMAL MODE! ПОЭТОМУ НЕ СТОИТ ОСОБО УВЛЕКАТЬСЯ P_1, А
;ТОЧНЕЕ ВОВСЕ НЕ УВЛЕКАТЬСЯ. И ВООБЩЕ ЭТОТ LOADER БЫЛ НАПИСАН
;ИСКЛЮЧИТЕЛЬНО ПОД ВЛИЯНИЕМ И ВПЕЧАТЛЕНИЕМ ОТ ТУРБЫ!!!
;STACK USE: BY 8 BYTES.
DI ;ОЧЕНЬ ПОЛЕЗНАЯ КОМАНДА :)
LD IX,АДРЕС_ЗАГРУЗКИ
LD DE,ТРЕК/СЕКТОР ;(#5CF4)
LD B,КОЛИЧЕСТВО_ЗАГРУЖАЕМЫХ_СЕКТОРОВ
;ДАННАЯ ПРОЦЕДУРКА НАСТРАИВАЕТ LOAD(SAVE)ER НА ТЕКУЩИЙ ДИСКОВОД!
;(ВЫЗЫВАЕТСЯ ТОЛЬКО ОДИН РАЗ, В САМОМ НАЧАЛЕ!)
LD A,(#5CF6) ;В А-НОМЕР ДИСКОВОДА. 0-A, 1-B...
OR #2C
LD (DRV+1),A
SET 4,A
LD (DRV+5),A
LD (TR_SEC),DE
CALL LOAD_ ;NO COMMENTS ;)
RET ;TOO ;)
■--------------------------------------------------------------■
LOAD_ LD DE,(TR_SEC)
LOAD LD A,D ;TRACK/2
SRL A
LD C,#7F
CALL DOS
DRV LD A,#2C
JR C,SIDE
LD A,#3C
SIDE LD HL,#1FF3 ;НОМЕР СТОРОНЫ.
CALL DOS1 ;OUT (#FF),A
LD A,#18 ;ПОЗИЦИОНИРОВАНИЕ.
CALL DOS2
LD HL,#3EF5 ;ОЖИДАНИЕ ВЫПОЛНЕНИЯ ПОЗИЦИОНИ-
CALL DOS1 ;РОВАНИЯ.
N_SEC XOR A ;ВСЕ СЕКТОРА СЧИТАНЫ???
OR B
LD (TR_SEC),DE
RET Z ;ВЫХОД ЕСЛИ ОПЕРАЦИЯ ЗАКОНЧЕНА!
LD A,E
INC A ;НОМЕР СЕКТОРА.
LD C,#5F
CALL DOS
LD A,#80 ;КОМАНДА ЧТЕНИЯ СЕКТОРА!
CALL DOS2 ;#A0-КОМАНДА ЗАПИСИ СЕКТОРА!
LD C,#7F
LD IY,#3FE5 ;#3FCA-ПРИ ЗАПИСИ!
PUSH IX
POP HL
* PUSH BC
CALL DOS3 ;ВЫПОЛНЕНИЕ КОМАНДЫ...
* POP BC
INC HX ;УВЕЛИЧИВАЕМ АДРЕС ЗАГРУЗКИ!
DEC B ;МИНУС ОДИН СЕКТОР!
INC E ;СЛЕДУЮЩИЙ СЕКТОР!
BIT 4,E ;ВСЕ СЕКТОРА???
JP Z,N_SEC ;СЛЕДУЮЩИЙ СЕКТОР...
LD E,0 ;ОБНУЛЯЕМ СЕКТОР!
INC D ;СЛЕДУЮЩИЙ ТРЕК...
JP LOAD ;ВСЕ ЗАНОВО...
DOS LD HL,#2A53 ;OUT (C),A
DOS1 PUSH HL
JP #3D30 ;(#3D2F)-SHIT 4EVER!!!
DOS2 LD IY,#2FC3 ;OUT (#1F),A
DOS3 PUSH IY
JP #3D30 ;(#3D2F)-SHIT 4EVER!!!
TR_SEC DEFW 0 ;СОХРАНЯЕМ ТРЕК И СЕКТОР!
■--------------------------------------------------------------■
;ВТОРОЙ ВАРИАНТ ПРОЦЕДУРЫ. БОЛЕЕ БЫСТРЫЙ, НО ИСПОЛЬЗУЮЩИЙ ДОПОЛ-
;НИТЕЛЬНО: HL',BC',DE',IY-не используется!
;STACK USE: BY 8 BYTES.
LOAD_ LD DE,(TR_SEC)
LOAD LD A,D
SRL A
LD C,#7F
CALL DOS
DRV LD A,#2C
JR C,SIDE
LD A,#3C
SIDE LD HL,#1FF3
CALL DOS1
LD A,#18
LD HL,#2FC3
CALL DOS1
LD HL,#3EF5
CALL DOS1
N_SEC XOR A
OR B
LD (TR_SEC),DE
RET Z
LD A,E
INC A
LD C,#5F
CALL DOS
PUSH IX
EXX
LD A,#80
LD HL,#2FC3
CALL DOS1
LD C,#7F
LD DE,#3FE5
POP HL
CALL DOS2
EXX
INC HX
DEC B
INC E
BIT 4,E
JP Z,N_SEC
LD E,0
INC D
JP LOAD
DOS LD HL,#2A53 ;OUT (C),A
DOS1 PUSH HL
JP #3D30 ;RULEZ 4EVER!!!
DOS2 PUSH DE
JP #3D30
TR_SEC DEFW 0
■--------------------------------------------------------------■
* - Команды помеченные звездочкой служат для того, чтобы LOADER
нормально работал в NORMAL MODE. Если их убрать, то LOADER
будет работать только в TURBO MODE!!!
(!) Этот LOADER не зависнет и не сбросится в случае возникнове-
ния ошибки, а будет читать до тех пор пока не опупеет!!! ;)
Правда после этого, никто не даст гарантию работоспособности
загруженной программы! ;)
■--------------------------------------------------------------■
==═════════════════════════════════════════════════════════════=
╟ ■■■ PROCEDURE_2:TURBO_READ_WITH_ERRORS_CONTROLING! ■■■ ╟
==═════════════════════════════════════════════════════════════=
;ЧТЕНИЕ (ЗАПИСЬ) СЕКТОРА(ОВ) С КОНТРОЛЕМ ОШИБОК!
;ИДЕАЛЬНЫЙ LOADER (SAVER) ДЛЯ ИГРУШЕК/СИСТЕМОК!
;STACK USE: BY 10 BYTES.
LOAD1_ LD DE,(TR_SEC)
LOAD LD A,D
SRL A
LD (TRACK+1),A
LD C,#7F
CALL DOS
DRV LD A,#2C
JR C,SIDE
LD A,#3C
SIDE LD HL,#1FF3
CALL DOS1
LD A,#18
CALL DOS2
N_SEC XOR A
OR B
LD (TR_SEC),DE
RET Z
ERROR LD A,E
INC A
LD C,#5F
CALL DOS
LD A,#80
CALL DOS2
LD C,#7F
LD IY,#3FE5
PUSH IX
POP HL
PUSH BC
CALL DOS3
;АЛГОРИТМ ЧТЕНИЯ #1F BY ANDREW MOA!
XOR A
LD HL,#1E3A ;OUT (#3F),A
CALL DOS1
LD A,#0A
LD C,#5F
CALL DOS
PUSH DE
LD D,#01
LD HL,#3F33
CALL DOS1
LD A,B ;РЕЗУЛЬТАТ ЧТЕНИЯ В РЕГИСТРЕ 'B'
AND #7F ;ЗДЕСЬ МОЖЕТЕ ДЕЙСТВОВАТЬ НА ВА-
POP DE ;ШЕ УСМОТРЕНИЕ!
POP BC
TRACK LD A,0
LD HL,#1E3A
CALL DOS1
JR NZ,ERROR ;ЕСЛИ ОШИБКА ЧТЕНИЯ, ТО ПОВТОР...
INC HX
DEC B
INC E
BIT 4,E
JP Z,N_SEC
LD E,0
INC D
JP LOAD
DOS LD HL,#2A53 ;OUT (C),A
DOS1 PUSH HL
JP #3D30
DOS2 LD IY,#2FC3 ;OUT (#1F),A
DOS3 PUSH IY
JP #3D30
TR_SEC DEFW 0
■--------------------------------------------------------------■
;ВТОРОЙ ВАРИАНТ ПРОЦЕДУРЫ. БОЛЕЕ БЫСТРЫЙ, НО ИСПОЛЬЗУЮЩИЙ ДОПОЛ-
;НИТЕЛЬНО: HL',BC',DE',IY-не используется!
;STACK USE: BY 8 BYTES.
LOAD1_ LD DE,(TR_SEC)
LOAD LD A,D
SRL A
LD (TRACK+1),A
LD C,#7F
CALL DOS
DRV LD A,#2C
JR C,SIDE
LD A,#3C
SIDE LD HL,#1FF3
CALL DOS1
LD A,#18
LD HL,#2FC3
CALL DOS1
N_SEC XOR A
OR B
LD (TR_SEC),DE
RET Z
ERROR LD A,E
INC A
LD C,#5F
CALL DOS
PUSH IX
EXX
LD A,#80
LD DE,#2FC3
CALL DOS3
LD C,#7F
LD DE,#3FE5
POP HL
CALL DOS3
;АЛГОРИТМ ЧТЕНИЯ #1F BY ANDREW MOA!
XOR A
CALL DOS2
LD A,#0A
LD C,#5F
CALL DOS
LD D,#01
LD HL,#3F33
CALL DOS1
LD A,B
AND #7F
TRACK LD A,0
CALL DOS2
EXX
JR NZ,ERROR
INC HX
DEC B
INC E
BIT 4,E
JP Z,N_SEC
LD E,0
INC D
JP LOAD
DOS LD HL,#2A53 ;OUT (C),A
DOS1 PUSH HL
JP #3D30
DOS2 LD DE,#1E3A ;OUT (#3F),A
DOS3 PUSH DE
JP #3D30
TR_SEC DEFW 0
■--------------------------------------------------------------■
==═════════════════════════════════════════════════════════════=
╟ ■■■ PROCEDURE_3:TURBO_READ_WITH_ERROR_CONTROLING! ■■■ ╟
==═════════════════════════════════════════════════════════════=
;ЧТЕНИЕ СЕКТОРА(ОВ) С КОНТРОЛЕМ НА ПРАВИЛЬНОСТЬ ЧТЕНИЯ!
;ДЛЯ ВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ЭТОЙ ПРОЦЕДУРЫ ДЛЯ ЗАПИСИ, МОЖНО
;ЛЕГКО АНАЛОГИЧНО ПЕРЕПИСАТЬ ПРОЦЕДУРУ!
;ИДЕАЛЬНЫЙ LOADER ДЛЯ ЗАГРУЗЧИКА К ИГРУШКАМ/СИСТЕМКАМ!
;STACK USE: BY 14 BYTES.
LOAD_ LD DE,(TR_SEC)
LOAD LD A,D
SRL A
LD C,#7F
CALL DOS
DRV LD A,#2C
JR C,SIDE
LD A,#3C
SIDE LD HL,#1FF3
CALL DOS1
LD A,#18
LD HL,#2FC3
CALL DOS1
N_SEC XOR A
OR B
LD (TR_SEC),DE
RET Z
ERROR LD A,E
INC A
LD C,#5F
CALL DOS
PUSH BC
PUSH DE
LD DE,#20AA
LD B,1
PUSH IX
POP HL
LD C,#7F
CALL DOS2
POP DE
XOR A
OR B
POP BC
JP Z,ERROR
INC HX
DEC B
INC E
BIT 4,E
JP Z,N_SEC
LD E,0
INC D
JP LOAD
DOS LD HL,#2A53 ;OUT (C),A
DOS1 PUSH HL
JP #3D30
DOS2 PUSH DE
LD IY,#2090
PUSH IY
JP #3D30
TR_SEC DEFW 0
■--------------------------------------------------------------■
;ВТОРОЙ ВАРИАНТ ПРОЦЕДУРЫ. БОЛЕЕ БЫСТРЫЙ, НО ИСПОЛЬЗУЮЩИЙ ДОПОЛ-
;НИТЕЛЬНО: HL',BC',DE',IY',IY-не используется!
;STACK USE: BY 10 BYTES.
LOAD_ LD DE,(TR_SEC)
LOAD LD A,D
SRL A
LD C,#7F
CALL DOS
DRV LD A,#2C
JR C,SIDE
LD A,#3C
SIDE LD HL,#1FF3
CALL DOS1
LD A,#18
LD HL,#2FC3
CALL DOS1
N_SEC XOR A
OR B
LD (TR_SEC),DE
RET Z
ERROR LD A,E
INC A
LD C,#5F
CALL DOS
PUSH IX
EXX
LD DE,#20AA
LD B,1
LD C,#7F
POP HL
CALL DOS2
XOR A
OR B
EXX
JP Z,ERROR
INC HX
DEC B
INC E
BIT 4,E
JP Z,N_SEC
LD E,0
INC D
JP LOAD
DOS LD HL,#2A53 ;OUT (C),A
DOS1 PUSH HL
JP #3D30
DOS2 PUSH DE
LD IY,#2090
PUSH IY
JP #3D30
TR_SEC DEFW 0
■--------------------------------------------------------------■
==═════════════════════════════════════════════════════════════=
╟ ■■■ PROCEDURE_4:TURBO_READ_WITH_INTERRUPT_MODE! ■■■ ╟
==═════════════════════════════════════════════════════════════=
;ЧТЕНИЕ (ЗАПИСЬ) СЕКТОРА(ОВ) В ПРЕРЫВАНИЯХ! РАЗУМЕЕТСЯ С КОНТРО-
;ЛЕМ ОШИБОК!
;STACK USE: BY 24 BYTES.
DI
LD HL,INT
LD (#FEFF),HL
LD A,#FE
LD I,A
IM 2
EI
LD IX,ADDRESS
LD DE,(#5CF4)
LD (TR_SEC),DE
LD B,KOL_SEC
CALL LOAD1_
LD IY,#5C3A ;ЧИСТО ДЛЯ ВЫХОДА В BASIC ;8)
LD A,#3F ;ПОЭТОМУ МОЖНО УБРАТЬ ВСЮ ЭТУ
LD I,A ;ЧУШЬ ОТСЕДОВА!!!
IM 1
EI
RET
INT DI ;EI
PUSH HL ;СОХРАНЯЕМ ТОЛЬКО ТЕ РЕГИСТРЫ,
PUSH DE ;КОТОРЫЕ ПОРТЯТСЯ!
PUSH BC
PUSH IX
.......... ;А ЗДЕСЬ ВАШ РАЗУМНЫЙ БЕСПРЕДЕЛ!
XOR A ;ЭТА КОМАНДА ОБЯЗАТЕЛЬНА!!!
POP IX
POP BC
POP DE
POP HL
EI
JP #3D30
■--------------------------------------------------------------■
==═════════════════════════════════════════════════════════════=
(!) ПЕРЕД ВЫЗОВОМ НИЖЕ ПЕРЕЧИСЛЕННЫХ ПРОЦЕДУР (КРОМЕ 7-Й И 9-Й!)
НЕОБХОДИМО НАСТРОИТЬСЯ НА ТЕКУЩИЙ ДИСКОВОД:
LD A,(#5CF6) ;В А-НОМЕР ДИСКОВОДА. 0-А, 1-B...
OR #2C
LD HL,#1FF3 ;OUT (#FF),A
CALL DOS
RET
==═════════════════════════════════════════════════════════════=
╟ ■■■ PROCEDURE_5:LIGHT_ON ■■■ ╟
==═════════════════════════════════════════════════════════════=
;ЗАЖИГАНИЕ ЛАМПОЧКИ ДИСКОВОДА/РАСКРУЧИВАНИЕ ДИСКА!
;STACK USE: BY 4 BYTES.
LD C,#7F ;ЗНАЧЕНИЕ 'А'-БЕРЕТСЯ ОТ БАЛДЫ!
LD HL,#2A53 ;OUT (C),A
CALL DOS
LD HL,#1E3A ;OUT (#3F),A
CALL DOS
LD A,#18
LD HL,#2FC3 ;OUT (#1F),A
DOS PUSH HL
JP #3D30
■--------------------------------------------------------------■
==═════════════════════════════════════════════════════════════=
╟ ■■■ PROCEDURE_6:LIGHT_ON_FOREVER ■■■ ╟
==═════════════════════════════════════════════════════════════=
;РАСКРУЧИВАНИЕ ДИСКОВОДА (ЗАЖИГАНИЕ ЛАМПОЧКИ), КОТОРЫЙ БУДЕТ
;КРУТИТЬСЯ, КРУТИТЬСЯ, КРУТИТЬСЯ... ;)
;STACK USE: BY 4 BYTES.
LD A,#24 ;ДЛЯ ДИСКОВОДА 'А'
LD HL,#1FF3 ;OUT (#FF),A
CALL DOS
LD C,#7F ;ПОХОЖЕ НА ПРЕДЫДУЩЕЕ!
LD HL,#2A53 ;OUT (C),A
CALL DOS
LD HL,#1E3A ;OUT (#3F),A
CALL DOS
LD A,#18
LD HL,#2FC3 ;OUT (#1F),A
DOS PUSH HL
JP #3D30
■--------------------------------------------------------------■
==═════════════════════════════════════════════════════════════=
╟ ■■■ PROCEDURE_7:LIGHT_OFF ■■■ ╟
==═════════════════════════════════════════════════════════════=
;ГАШЕНИЕ ЛАМПОЧКИ ДИСКОВОДА/ТОРМОЖЕНИЕ ДИСКОВОДА!
;STACK USE: BY 2 BYTES.
XOR A
LD HL,#2FC3 ;OUT (#1F),A
PUSH HL
JP #3D30
■--------------------------------------------------------------■
==═════════════════════════════════════════════════════════════=
╟ ■■■ PROCEDURE_8:RESET_WG ■■■ ╟
==═════════════════════════════════════════════════════════════=
;СБРОС WG93/ПОЗИЦИОНИРОВАНИЕ НА 0 ТРЕК!
;STACK USE: BY 2 BYTES.
LD A,#08
LD HL,#2FC3 ;OUT (#1F),A
PUSH HL
JP #3D30
■--------------------------------------------------------------■
==═════════════════════════════════════════════════════════════=
╟ ■■■ PROCEDURE_9:FUCK_WG ■■■ ╟
==═════════════════════════════════════════════════════════════=
;НЕКОЕ ПОДОБИЕ ЗАЩИТЫ ОТ MAGIC BUTTON/ГАШЕНИЕ ЛАМПОЧКИ ДИСКОВОДА
;STACK USE: BY 2 BYTES.
XOR A
LD HL,#1FF3 ;OUT (#FF),A
PUSH HL
JP #3D30
■--------------------------------------------------------------■
==═════════════════════════════════════════════════════════════=
╟ ■■■ PROCEDURE_10:CHECK_3.5"_OR_5.25"_??? ■■■ ╟
==═════════════════════════════════════════════════════════════=
;ПРОЦЕДУРА ПРОВЕРЯЕТ, КАКОЙ ДИСКОВОД ТЕКУЩИЙ: 3.5" ИЛИ 5.25"???
;ДИСК ОБЯЗАТЕЛЬНО ДОЛЖЕН ПРИСУТСТВОВАТЬ В ДИСКОВОДЕ И НЕ ДОЛЖЕН
;ВРАЩАТЬСЯ!
;STACK USE: BY 28 BYTES.
LD A,#08
LD HL,#2FC3 ;OUT (#1F),A
CALL DOS
LD HL,#3EF5
CALL DOS
LD IY,2200 ;ЗАДЕРЖКА... (4 TURBO 2)!
CALL IN_1F
AND #02
LD HX,A
AGAIN CALL IN_1F
AND #02
OR HX
RET NZ ;USE 3.5" DRIVE!
DEC IY
LD A,LY
OR HY
JP NZ,AGAIN
RET ;USE 5.25" DRIVE!
;АЛГОРИТМ ЧТЕНИЯ #1F BY ANDREW MOA!
IN_1F XOR A
LD HL,#1E3A
CALL DOS
LD A,#0A
LD C,#5F
LD HL,#2A53
CALL DOS
LD D,#01
LD HL,#3F33
CALL DOS
LD A,B
RET
DOS PUSH HL
JP #3D30
■--------------------------------------------------------------■
==═════════════════════════════════════════════════════════════=
╟ ■■■ PROCEDURE_11:DISK_CONTROLER_4_SYSTEMZ_OR_GAMEZ ■■■ ╟
==═════════════════════════════════════════════════════════════=
;ДАННАЯ ПРОЦЕДУРА КОНТРОЛИРУЕТ НАЛИЧИЕ ДИСКА В ДИСКОВОДЕ!
;ЭТА ПРОЦЕДУРА ПРЕДНАЗНАЧЕНА СПЕЦИАЛЬНО ДЛЯ СИСТЕМНЫХ ИЛИ ИГРО-
;ВЫХ ПРОГРАММ!
;(!) НЕ КАТИТ ДЛЯ BOOT'ОВ И Т.П. ПРОГРАММ!
;STACK USE: BY 6 BYTES.
LD A,#08
LD HL,#2FC3 ;OUT (#1F),A
CALL DOS
LD HL,#3EF5
CALL DOS
LD IY,5500 ;ЗАДЕРЖКА... (4 TURBO 2)!
CALL IN_1F
BIT 1,B
LD HX,B
AGAIN CALL IN_1F
BIT 1,B
LD A,B
OR HX
RET NZ ;DISK PRESENT!
DEC IY
LD A,LY
OR HY
JP NZ,AGAIN
RET ;DISK NOT PRESENT!
;АЛГОРИТМ ЧТЕНИЯ #1F BY ANDREW MOA!
IN_1F XOR A
LD HL,#1E3A
CALL DOS
LD A,#0A
LD C,#5F
LD HL,#2A53
CALL DOS
LD D,#01
LD HL,#3F33
CALL DOS
RET
DOS PUSH HL
JP #3D30
■--------------------------------------------------------------■
==═════════════════════════════════════════════════════════════=
╟ ■■■ PROCEDURE_12:DISK_CONTROLER_4_BOOTZ_OR_COMMANDERZ ■■■ ╟
==═════════════════════════════════════════════════════════════=
;ДАННАЯ ПРОЦЕДУРА КОНТРОЛИРУЕТ НАЛИЧИЕ ДИСКА В ДИСКОВОДЕ!
;ЭТА ПРОЦЕДУРА ПРЕДНАЗНАЧЕНА СПЕЦИАЛЬНО 4 BOOT'ОВ, COMMANDER'ОВ
;И Т.П. ПРОГРАММ!
;(!) НЕ КАТИТ ДЛЯ ДИСКЕТ ЗАЩИЩЕННЫХ ОТ ЗАПИСИ! ПОЭТОМУ Я РЕКОМЕ-
;НДУЮ ИСПОЛЬЗОВАТЬ ЕЕ СОВМЕСТНО С PROCEDURE_11, КАК УКАЗАНО В
;ЛИСТИНГЕ ПРОЦЕДУРЫ!!! (СМЫСЛ В СЛЕДУЮЩЕМ: ЕСЛИ ВСТАВИТЬ ДИСК
;ЗАЩИЩЕННЫЙ ОТ ЗАПИСИ, ТО ПРОГРАММА ЗАСЧИТАЕТ ЕГО КАК ОТСУТСТВУ-
;ЮЩИЙ, ПОЭТОМУ ОТПРАВИВ ЕЕ НА PROCEDURE_11, СИТУАЦИЯ БУДЕТ ПРИ-
;ВЕДЕНА В ПОРЯДОК!!!
;STACK USE: BY 20 BYTES.
BEGIN CALL CHECK
BIT 6,B
JR NZ,NO_DISK
LD A,1 ;DISK PRESENT!
OUT (#FE),A
AGAIN XOR A
IN A,(#FE)
CPL
AND #1F
RET NZ ;ОПРОС КЛАВИАТУРЫ...
CALL CHECK
BIT 6,B
JR Z,AGAIN
NO_DISK XOR A ;DISK NOT PRESENT!
OUT (#FE),A
; CALL PROCEDURE_11 ;СМ. ВЫШЕ!!!
JR BEGIN
CHECK LD A,#08
CALL DOS
LD HL,#3EF5
CALL DOS1
;АЛГОРИТМ ЧТЕНИЯ #1F BY ANDREW MOA!
XOR A
LD HL,#1E3A
CALL DOS1
LD A,#0A
LD C,#5F
LD HL,#2A53
CALL DOS1
LD D,#01
LD HL,#3F33
CALL DOS1
XOR A
CALL DOS
LD A,#D0
CALL DOS
EI
HALT ;ФРЕЙМ ОТДЫХАЕМ...
RET
DOS LD HL,#2FC3 ;OUT (#1F),A
DOS1 PUSH HL
JP #3D30
■--------------------------------------------------------------■
==═════════════════════════════════════════════════════════════=
P.S. Ну вот, в принципе, и все! Мне остается сказать, что тест
всех процедур я проводил в следующей конфигурации:
SCORPION ZS 256 TURBO++
NORMAL MODE/TURBO MODE/TURBO WG93/3.5"/5.25"/TR-DOS 5.03sc.
Все процедуры были написаны мной в течение 1998 года в луч-
шем, на мой взгляд, (за исключением отсутствия двоичной
системы и невозможности выгрузки обьектного кода), ассемб-
лере - ALASM 4.1 BY ALEM (VERY THANX!)
HAIL 2 ALL OUR (TNL insys) FRIENDZ!!! BYE! C YE L8ER...
...& SPECIAL HELLO (FROM ME!) 2 MAX PETROV!!!
==═════════════════════════════════════════════════════════════=
■--------------------------------------------------------------■
==═════════════════════════════════════════════════════════════=
═ - LAST EDITION ON 01.11.98 ULYANOVSK RUSSIA TNL INSYS! - ═
==═════════════════════════════════════════════════════════════=
Другие статьи номера:
Похожие статьи:
В этот день... 16 ноября