Buzz #17
10 апреля 1999

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

<b>DOS PRO</b> - Самые быстрые процедуры работы с диском: чтение/запись секторов без контроля и с контролем ошибок, чтение секторов
 с контролем на исправность чтения, чтение/запись секторов
 с контролем в прерываниях, зажигание/гашение лампочки
 дисковода, раскручивание и торможение диска, сброс ВГ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а для Спектрума.

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


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

Похожие статьи:
Local Тrouble - О "дeятeльнocти" прeдcтaвитeля Nemo...
Что нового? - свежий wareZ...
Партийная зона - "PHAT0, как много в этом слове для сердца сценера слилось?!". Информация о предстоящем демопати.
Система - Oбзор системных новинок: FREE FORMAT v8.3, ALASM v2.8, OMEGA COMMANDER v1.5, PERFECT COMMANDER v1.52, F-COMMANDER v4.02, CHEMNEBASE v0.6, SPRITELAND v1.9, MAXSOFT SCREEN PACKERv1.0, ANIMICROPROTECTOR v1.0), MICRO EDITOR,DISK LEVEL, MAY BE MY BANK v5.1,AFRODITA v3.0, FLOOPY FORMAT UTILITY v1.0, DIGITAL STUDIO PLAYER v1.0, PRO TRACKER PLAYERv1.10, UNRECOGNIZED FORMATING OBJECT v1.1, ZX-WINWORD v1.0
Наш архив - имитатор подлодки "INTO THE HUNTER KILLER".

В этот день...   26 апреля