Spectrophoby #05
31 июля 1996

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


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

Similar articles:
System - TEST CHAMBER: the operating system for Spectrum PINK FLOYD v3 (2.31)
GAMES-echo - On materials ekhi SPBZXNET.GAMES - about the game ELITE.
General Sound - X-Player - first normal player mods for General Sound.

В этот день...   21 November