Spectrophoby
#05
31 июля 1996 |
|
Ассемблер - как вычислить скорость комманд процессора Z80.
╔───────────────────────╗ │ ─═─ АССЕМБЛЕР ─═─ │ ╚───────────────────────╝ Давно мы уже собирались открыть такую рубрику в нашем журнале, да вот только мысли на бумагу (тоесть на экран) не могли изложить. Но вот наконец мы смогли сформу- лировать и изложить несколько советов по программированию. Идейку подкинул наш программер Горбунов Диман, который в дан- ный момент пишет, с нашей помощью, непло- хую игрушку, о которой вы можете прочитать в разделе ПРЕМЬЕРА. Кстати говоря, практически тот же совет нам недавно сообщили ребята из Самары, ко- торые тоже нашли это самостоятельно. Об этом же писали и в 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.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября