Black Crow
#01
01 июня 1998 |
|
Программистам - Заначка.
МЕЛКИЕ ПРЦЦЕДУРКИ В АССЕМБЛЕРЕ НА ВСЕ СЛУЧАИ ЖИЗНИ.------------------------------------------ Раздел посвящен программистским хитрос- тям и способам получения желаемого ре- зультата в обход стандартных точек входа и подпрограмм. Подобная практика уже имела применение в других электронных изданиях. Я решил поддержать это направление в своем журнале. Надеюсь, что здесь найдется много полезной и интересной информации как для начинающих кодеров, так и для бывалых и закаленных ассов программирования. Характер и метод изложения статей осно- вывается на личном опыте общения с моими друзьями, которые часто обращаются за по- мощью и консультациями. Исходя из их инте- ресов и потребностей, а также вашего ак- тивного участия, сейчас и в будущем будут рассказаны методы и способы решения прог- раммных проблем при создании разного софта Спрашивайте - ответим. Захотите поделиться своими секретами - милости просим на наши страницы. Журнал для всех! Для начала предлагаю рассмотреть способ контроля извлечения диска из дисковода. Но предупреждаю сразу, что в природе су- ществуют такие модели дисководов, которые не "реагируют" на подобные обращения с ними. Я встречался с такими, поэтому ут- верждаю с полной ответственностью. Правда, он был импортного происхождения и названия сейчас уже не помню... Итак, многие программы контролируют этот процесс. Никого сейчас этим не уди- вишь, но тем не менее очень удобно рабо- тать, когда не отвлекаешься на операции по перечитыванию каталога диска. Цсобенно круто и удобно, когда копируешь диски на одном дисководе. Ну да ладно, ксорим дальше. А дальше - ассемблерная процедур- ка. Многие лепят ее в прерывание, если такты позволяют. Можно и отдельно поста- вить, например, в опрос клавиш. Значения не имеет. Итак: ;Контроль извлекания диска из дисковода. Ц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. ------ На первый раз достаточно ассемблера. Но эта рубрика будет довольно долго существо- вать, т.к. много еще чего хочется расска- зать вам всем. Да и читатели, я надеюсь, чего-то подкинут. Так что до скорой встре- чи на страницах "Черной Вороны"!
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября