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! - ═ ==═════════════════════════════════════════════════════════════=
Другие статьи номера:
Похожие статьи:
В этот день... 10 декабря