╔───────────────────────╗
│ ─═─ АССЕМБЛЕР ─═─ │
╚───────────────────────╝
Давно мы уже собирались открыть такую
рубрику в нашем журнале, да вот только
мысли на бумагу (тоесть на экран) не могли
изложить. Но вот наконец мы смогли сформу-
лировать и изложить несколько советов по
программированию. Идейку подкинул наш
программер Горбунов Диман, который в дан-
ный момент пишет, с нашей помощью, непло-
хую игрушку, о которой вы можете прочитать
в разделе ПРЕМЬЕРА.
Кстати говоря, практически тот же совет
нам недавно сообщили ребята из Самары, ко-
торые тоже нашли это самостоятельно. Об
этом же писали и в ZX-РЕВЮ'3-96, но там
они такого понаписали... Читать страшно.
Вообщем чего я вам мозги компосирую, чи-
тайте саму статью.
Шарманов Алексей (ALEX NORMAN)
──────────────────────────────
Волжский, 1996
Немного извинянюсь за то, что
поднимаю тему, про которую уже
наверное почти все забыли. Речь
пойдет о статье в одном из
Спектрофонов, в котором "бeзврe-
менно ушедший" Сим Олег "наез-
жал" на FANAtIC StAS'a, который
при этом яростно отбивался и
постоянно спрашивал про какую-то
демошку под названием тОР
SECREt, якобы написанную у нас в
области.
Кстати интересный момент - у
нас в области никто из моих зна-
комыx хакеров даже и не слыхал
об этой программе. Прям парадокс
какой-то.
так вот, FANAtIC StAS скорее
всего ввиду своей hekomne-
tehthoctu, или просто нeосвeдом-
ленности (извиняюсь если обидел)
сообщил всему миру со страниц
СПЕКтРОФОНа о том, что невозмож-
но догадаться о длительности ко-
манд ED70 и ED71 в тактах про-
цессора. Со всей возлaгaющeйся
на меня ответственностью зaявля-
ю: "Стас, ты не прав!!!"
Ну допустим, догадаться нель-
зя, a вот вычислить вполне ре-
ально, a вот о том, как это сде-
лать - читайте ниже.
Так вот целью моей статьи является сооб-
щение о так называемом первоисточнике, а
если быть точнее о его отсутствии...
Я имею ввиду то что длина в тактах ком-
манды ED 70 и других вполне можно опреде-
лить программным путем, другой вопрос
сколько понадобится времени на его опреде-
ление и зачем это вообще нужно (но это уже
другой вопрос). Ниже я приведу программку
с помощью которой можно определить время
выполнения практически любой комманды, хо-
тя для некоторых комманд тебуется особый
подход (в основном это комманды перехода
типа JP,JR,CALL). Но учитывая то, что
"время" этих комманд известны и сейчас они
есть и в книжке по программированию фирмы
"ИНФОРКОМ", за которую ей, кстати, большое
спасибо, и в других книгах. Мы же остано-
вимся только на недокументированых комман-
дах типа ED 70 (ну нравится мне эта ком-
манда)...
10 DI
20 LOOP LD А,7
30 OUT (254),А
40 INF ;мнемоника ED 70 при прос-
50 ;мотре из STS.
60 XOR А
70 OUT (254),А
80 LD А,#7F
90 IN А,(254)
100 RRA
110 JR C,LOOP
120 LD HL,0 ;не пугайтесь это
130 LD DE,0 ;всего лишь задерж-
140 LD ВС,30000;ка.
150 LDIR
160 ; вторая часть подпрограммы
170 ;
180 LOOP1 LD А,7
190 OUT (254),А
200 ;
210 LD А,А ;комманды сумма "времен"
220 LD А,А ;которых как вы думаете
230 LD А,А ;равна "времени" прове-
240 ;ряемой комманды
250 XOR А
260 OUT (254),А
270 LD А,#7F
280 IN А,(254) ;выход - по
290 RRA ;пробелу
300 JR C,LOOP1
310 EI
320 RET
Работает все это следующим образом: как
вы уже догадались первая часть программы
зациклится создавая на бордюре какой ни-
будь определенный эффект до тех пор пока
вы не нажмете клавишу "space".
Далее, вторая часть программы работает
аналогично и если время выполнения прове-
ряемой нами комманды равно сумме "времен"
комманд которые мы установили во второй
части программы (выделено пустыми строчка-
ми), то эффекты соответственно будут оди-
наковы и только в этом случае, а никак
иначе. Если еффекты при выполнении обеих
частей п/п различны, в этом случае требу-
ется подобрать методом "научного тыка" ко-
манды, сумма тактов которых будет равна
проверяемой команде (в первой п/п).
Вот и все, теперь с помощью этой прог-
раммки можно определить сколько времени в
тактовых импульсах выполняется та или иная
комманда какая бы недокументированая она
ни была. Правда тут появляется одна проб-
лема, для того чтобы определить "время"
одной комманды нужно знать "время" других
комманд, но имея вышеназваный справочник
это не проблема.
Таким, или почти таким же способом, оп-
ределяется время выполнения целых подпрог-
рам, это необходимо для того, чтобы знать
"умещается"ли п/п в одно прерывание или
нет, ну а о важности этого я думаю и гово-
рить не стоит.
10 LOOP EI
20 HALT
30 LD А,7
40 OUT (254),А
50 CALL PROG
60 XOR А
70 OUT (254),А
80 IN А,(254)
90 RRA
100 JR C,LOOP
110 RET
В строке 50 вы задаете адрес вашей п/п,
время которой нужно узнать. Так-же можно
узнать время сразу нескольких п/п, устано-
вив все CALL'ы между 40 и 60 строками.
Если вы владелец компьютера PROFI v3.02
со старой версией ПЗУ синхрогенератора, то
у вас (как и у KVANT SOFT'а - нашего глав-
ного редактора) размер бордюра всего 2
знакоместа от основного экрана, и тогда,
если время измеряемой п/п маленькое, вы
ничего на BORDER'е не увидите. Для этого
нужно внести небольшую задержку, скажем
такой последовательностью:
22 LD HL,0
24 LD DE,0
26 LD ВС,500
28 LDIR
что составит 500*21=10500 тактов процес-
сора, и этому времени луч подойдет даже к
основному экрану.
Да кстати я не сказал об авторе сего так
сказать изобретения, его зовут Горбунов
Дмитрий и он один из самых крутых програ-
меров у нас в области, а именно в
Волжском, а я (с его разрешения конечно)
решил поведать остальным. Ну думаю все.
Если еще чего умного в головы вдарит обя-
зательно напишем. До свидания.
Шарманов Алексей
03.04.96
Р.S. Поздравьте меня, я защитил диплом в
Волжском Политехническом Техникуме.
И напоследок, небольшая таблица дли-
тельности некоторых команд, которые можно
применять при контрольных замерах. Вообще,
в принципе, достаточно только несколько
первых команд, остальные можно сделать
сложением.
Условные обозначения: N - однобайтное чис-
ло, NN - двухбайтное число, s - смещение
для индексных регистров.
╜───────────────┬─────┐
│ команда │время│
├───────────────┼─────┤
│ NOP │ 4 │
│ INC HL │ 6 │
│ LD A,N │ 7 │
│ RES 0,A │ 8 │
│ LD A,I │ 9 │
│ LD HL,NN │ 10 │
│ ADD HL,HL │ 11 │
│ BIt 0,(HL) │ 12 │
│ LD A,(NN) │ 13 │
│ LD IX,NN │ 14 │
│ ADD IX,IX │ 15 │
│ LD HL,(NN) │ 16 │
│ CALL NN │ 17 │
│ RRD │ 18 │
│ LD A,(IX+s) │ 19 │
│ LD DE,(NN) │ 20 │
│ RES 0,(IX+S) │ 23 │
└───────────────┴─────┘
И еще небольшой совет: если у вас никак
не получается подобрать сумму к проверяе-
мой команде, то вполне возможно что к той
команде нельзя подобрать такие. Но выход
все-же есть, просто добавьте к проверяемой
команде какую либо другую команду, а к
сумме других добавьте еще одну, на 1 такт
меньше той, что прибавили к предыдущей.
Короче если к первой части к команде доба-
вили ADD HL,HL (11 т), то ко второй до-
бавьте LD HL,NN (10 т).
Ну ладно, хватит, а то тут уже и свих-
нуться можно. Пока.
Р.S. Эту дописочку писал Репников Юрий,
04.06.96.
Р.S. Исходники всех программ опубликован-
ных здесь, записаны на диске в формате ас-
семблера TASM 3.
Other articles: