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!  - ═
==═════════════════════════════════════════════════════════════=





Другие статьи номера:

AGA - Графический редактор 3 color'ных скринов AGA v1.0.

ASCII графика - Как просматривать ASCII? Как научиться ASCII. Существуют ли вспомогательные программы для ASCII.

BLOB the COP - Текст из внутренностей игры фирмы Players для хаккеров.

C.Expirience - Cheat к игре Space Crusade.

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

Eternal News - новости от Ковровских спектрумистов (Ash, Proxima, EI)

GOURAUD - Ликбез в области 3D-shading (алгоритм заливки грани методом GOURAUD).

Hard Life - О создании новой DOS для Speccy.

HDD Autodetect - FDD & HDD loader.

Heroes of M&M II - Презентация игры: Heroes of might & magic II.

MMA в Коврове - Великий и ужасный в городе, где никогда не делали ковры.

Modern Word - Описание текстового редактора Modern Word v1.3

Parties?! - FunTop'99 vs Chaos Construction'99: Точка зрения.

Program BOX - Новый необычный boot - Program BOX v2.0.

Rants & Raves - Как проехать на электричке по поддельным билетам.

Switch 3.5' - Как юзать 3.5 привод после его подключения.

Всяко разно - Выписки из книги рекордов Гиннеса.

Всяко разно - Ультросовременная сказочка про почти конец света.

Жизьтянка - Жизненные проблемы SPY.

Контакты - координаты для связи.

Кризис - Рассказик в стиле игрового мира из ним.

Обзор игрушек - Обзор игровых программ: Figus, Зеркало, Iron Man, Gyron Atrium, Homer Simpson in Russia, Головобол, Monster Land, Devil's course, Astro Ball, Net Walk, Nexus.

Обзор системок - Обзор системных программ: Text Maker v0.12c, Excess Sample Editor v1.4, Best View v2.6, DOS2DOS COPYv2.0, Excess Deluxe Paint v1.0 demo, Laser Compact v5.0, Consul Commander v3.33, DCM Protection KIT v4.1b, Modern Word v1.3, E-Mage Work Statio, PKZIP.

От авторов - Об изменениях в оболочке газеты.

Про Крузю - Новелла к игре "Бегство на Хархан".

Реклама - Реклама и объявления...

Точка зрения - О написании Softа для Спектрума.

Авторы газеты


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Трибуна - Pidarsoft: реакция.
Реклама - HAСKER KONDOR FROM SARANSK'99 будет благодарен за помощь в приобретении следующих программ...
Игры - TopTen. Описание Slayne king.

В этот день...   22 ноября