МЕЛКИЕ ПРЦЦЕДУРКИ В АССЕМБЛЕРЕ
НА ВСЕ СЛУЧАИ ЖИЗНИ.
------------------------------------------
Раздел посвящен программистским хитрос-
тям и способам получения желаемого ре-
зультата в обход стандартных точек входа и
подпрограмм. Подобная практика уже имела
применение в других электронных изданиях.
Я решил поддержать это направление в своем
журнале. Надеюсь, что здесь найдется много
полезной и интересной информации как для
начинающих кодеров, так и для бывалых и
закаленных ассов программирования.
Характер и метод изложения статей осно-
вывается на личном опыте общения с моими
друзьями, которые часто обращаются за по-
мощью и консультациями. Исходя из их инте-
ресов и потребностей, а также вашего ак-
тивного участия, сейчас и в будущем будут
рассказаны методы и способы решения прог-
раммных проблем при создании разного софта
Спрашивайте - ответим. Захотите поделиться
своими секретами - милости просим на наши
страницы. Журнал для всех!
Для начала предлагаю рассмотреть способ
контроля извлечения диска из дисковода. Но
предупреждаю сразу, что в природе су-
ществуют такие модели дисководов, которые
не "реагируют" на подобные обращения с
ними. Я встречался с такими, поэтому ут-
верждаю с полной ответственностью. Правда,
он был импортного происхождения и названия
сейчас уже не помню...
Итак, многие программы контролируют
этот процесс. Никого сейчас этим не уди-
вишь, но тем не менее очень удобно рабо-
тать, когда не отвлекаешься на операции по
перечитыванию каталога диска. Цсобенно
круто и удобно, когда копируешь диски на
одном дисководе. Ну да ладно, ксорим
дальше. А дальше - ассемблерная процедур-
ка. Многие лепят ее в прерывание, если
такты позволяют. Можно и отдельно поста-
вить, например, в опрос клавиш. Значения
не имеет. Итак:
;Контроль извлекания диска из дисковода.
ЦRG #6000
М1 HALT ;стабилизация цикла
CALL INDIKAT
ЦR A
JR NZ,М1
RET
INDIKAT LD A,195 ;код JP
LD (#SCC2),A;перехват захода
LD HL,LL5FBA;в бейсик
LD (#5ССЗ),HL
LD IX,#2FC1
CALL DЦS
LD A,#08
LD ВС,#001F
LD IX,#2A53;out (c),а
CALL DЦS
LD (LL5FBB),SP
LD DE,#0000
LD IX,#2740
CALL DЦS
LL5FBA LD SP,#0000
LL5FBB EQU $-#02
LD IX,#1FFЗ
CALL DЦS
LD IX,#1FEB
CALL DЦS
LD IX,#2FC1
CALL DЦS
LD A,#С9 ;для норм. раб.
LD (#SCC2),A
LD A,(#5CCD)
AND #40 ;BIT 6,(#FF)
RET
DЦS PUSH IX
JP 15663
На выходе во флаге ZF будет результат
опроса дисковода на предмет извлекания
диска. Цпрашивается индикатор, отвечающий
за прорезь защиты записи. Процедурами из
TR-DЦS проверяем этот датчик. Его реагиро-
вание отображается в системном геристре
ВГ93. Если шестой бит сброшен (флаг Z пос-
ле опроса в процедуре установлен), значит
диск покидал дисковод. Или наоборот - по-
сетил. Дальнейшие действия зависят от хода
выполнения программы. В заключении скажу,
что эта процедурка извлечена из JEMMINI
СЦММANDЕR`а v4.0 призводства Jemminisoft.
-----
Рассмотрим еще одну процедуру. Это чте-
ние с диска группы секторов. Процедура
извлечена из "Черного Ворона". Вводные для
ее аналогичны функции #05 в TR-DЦS, а
именно: HL, адрес загрузки; D,трек; Е,сек-
тор; В,количество загружаемых секторов. На
выходе во флаге CF качество загрузки - ус-
тановлен, значит сектор не считан. В ре-
гистровой паре DE будет находиться следую-
щий трек и сектор на диске, на которых
прекращено чтение информации. В HL,следую-
щий адрес. Процедура не имеет подробного
анализа причины сбойного чтения, т.е. нет
обработки ошибочных состояний. Но это же
не школа, а "заначка", поэтому сам сочини
себе такую процедуру, которая разберется с
ошибками.
В примере указаны нестандартные по от-
ношению к TR-DЦS номера секторов и их раз-
меры. Параметр MIN указывает на первый фи-
зический номер сектора, находящийся на
треке. МАХ указывает процедуре, что при
достижении этого номера сектора не следует
пытаться его считать, т.к. его там и в по-
мине нет, а сделать позиционирование на
следующий трек и начальный сектор. Проце-
дура чтения сейчас представлена для кило-
байтных секторов.
ЦRG #6000
MIN EQU #С0 ;начальный сектор
МАХ EQU #С5 ;при каком позиц.
LЦAD LD DE,#01С0;Track & sect.
DALEE1 EQU $-2
LD HL,#С000
LD В,16 ;размер в сект.
CALL LЦADЕR
LD (DALEE1),DE;где закончил
EI
RET
;in:В,кол.секторов; DE,трек и сектор
;out:next track & sect. + new address
LЦADЕR DI
CALL РЦZIС
LD A,(#5CD6);здесь будет
ЕХ AF,AF` ;качество чтения
LЦAD_0 LD LX,#03 ;счетчик повтора
LЦAD_1 PUSH HL ;при ошибках
PUSH ВС
PUSH IX
LD С,#5F
LD A,Е ;sector
CALL ЦUT_С
CALL LL2090 ;чтение
DI ;#2090 разрешает
LD HL,#5CD6;прерывания
ЕХ AF,AF`
СР (HL) ;при изменении
РЦР IX ;была ошибка!
JR Z,LЦAD_2
LD (HL),A
CALL РЦZIС ;для раскрутки
DEC LX ;мотора д-да
РЦР ВС
РЦР HL
JR Z,LЦAD_4;еггог
ЕХ AF,AF`
JR LЦAD_1
LЦAD_2 РЦР ВС
РЦР HL
ЕХ AF,AF`
INC Е
LD A,Е
СР МАХ ;предел
JR С,LЦAD_3
LD Е,MIN ;начальный номер
INC D ;next track
CALL РЦZIС
LЦAD_3 INC Н ;1024 байта
INC Н ;размер сектора
INC Н
INC Н
DJNZ LЦAD_0
ХЦR A
RET
LЦAD_4 SCF ;load еггог
RET ;DI оп
LL2090 LD ВС,LL2090
PUSH ВС
LD ВС,#017F
LD IX,#2090
JR DЦS
LL5CF6 NЦР ;номер дисковода
РЦZIС DI
PUSH IX
LD A,(LL5CF6)
ADD A,#3С
BIT 0,D
JR Z,РЦZ_1
RES 4,A
РЦZ_1 LD С,#FF
CALL ЦUT_С
LD A,D
SRL A
LD С,#7F
CALL ЦUT_С
LD A,#18
LD С,#1F
CALL ЦUT_С
CALL РЦZ_2
РЦР IX
DI
RET
РЦZ_2 LD IX,#3EF5
DЦS PUSH IX
JP 15663
ЦUT_С LD IX,#2A53
JR DЦS
------
Хотя данная рубрика и не является пи-
ратским разделом, но заначка для того де-
лается, чтобы было на все случаи жизни. К
чему я клоню? Да все те же пиратские штуч-
ки. На сей раз предлагаю способ просмотра
финального мультика в игре "Черный Ворон".
Для его созерцания не обязательно прохож-
дение всей игры. Достаточно иметь под ру-
кой программу "STS" любой версии и 128Кб.
памяти в компьютере. Раз уж ты читаешь мой
текст, значит как минимум 128К имеешь. Те-
перь загрузи "STS" и сделай то, что я ска-
жу. А именно: вставь в любой из "А" и "Б"
дисководов первый диск программы "Ворон",
затем загрузи девятый физический сектор из
этого диска. Для загрузки "STS"`ом введи
команду SS+L и в полученном окне задай па-
раметры сектора: трек-0 сектор-8 длина-1
адрес-#5D25. Как только процесс загрузки
завершится, перейди полосообразным курсо-
ром на значения регистров процессора и из-
мени следующее:
РС,#5D27
SP,#8000
ВС,#0000 ;регистр В=0 - люди; 1 - кунги
AF,#0000 ;регистр А=0 - дисковод А
А=1 - дисковод Б.
Значения других регистров не имеют зна-
чения. После ввода нужных тебе парраметров
запусти командой SS+J (минус или плюс) на
выполнение и созерцай приятный final cut.
------
На первый раз достаточно ассемблера. Но
эта рубрика будет довольно долго существо-
вать, т.к. много еще чего хочется расска-
зать вам всем. Да и читатели, я надеюсь,
чего-то подкинут. Так что до скорой встре-
чи на страницах "Черной Вороны"!
Other articles: