Faultless #05
02 февраля 1997

  ┌──────────────────────────────────────┐
  │Раздел:CPU для вас;                   │
  │Статья:Вывод точки и new instructions;│
  │Текст :Б.Станислав.                   │
  └──────────────────────────────────────┘

   В ЭТОМ РАЗДЕЛЕ МЫ ПОГОВОРИМ О ТАКОМ НЕ-
  МАЛОВАЖНОМ ДЛЯ МНОГИХ ЭФФЕКТЕ , КАК БЫС-
  ТРЫЙ ВЫВОД ТОЧКИ.ЭТОТ ЕФФЕКТ БЫЛ НАПИСАН
  МНОЮ , Т.Е. ACTIVATOR'ОМ  И ПРЕДОСТАВЛЕН
  КАК СТАТЬЯ К ЖУРНАЛУ * THE FAULTLESS * .

   ТЕКСТ  САМОГО   ЕФФЕКТА , КАК  ТАКОГОГО
  БЫЛ НАПИСАН В АССЕМБЛЕРЕ TASM 4.0 (XLD).

     ВНИМАНИЕ! ВСТАВЛЯТЬ ЭТОТ ЕФФЕКТ  РАЗ-
               РЕШАЕТСЯ ТОЛЬКО С  СОГЛАШЕ-
               НИЯ АВТОРА (ACTIVATOR'А).
  Итак,приступим к самой программе:

          ORG 25000
          LD (STACK+1),SP
  BEGIN   LD SP,TABL
          POP HL
          POP DE
          LD A,E
          CP #FF
          JR NZ,NEXT
          LD HL,TABL
          LD (BEGIN+1),HL
          JR BEGIN
   NEXT   LD (HL),A
          LD (CLS+1),HL
          LD (BEGIN+1),SP
   STACK  LD SP,0
          RET
   CLS    LD HL,0
          XOR A
          LD (HL),A
          RET
   TABL   DEFW #8000
    Теперь пояснения:

   В первой строчке мы запомнили  значение
  стека,дальше  мы  в регистр SP загрузили
  адрес  таблички  (как построить ее,будет
  рассказано дальше) , командой  POP HL мы
  получили в HL адрес экрана, командой POP
  DE - смещение в DE,теперь взяли значение
  этого смещения в A,проверили  на  конец,
  если не конец,то выводим точку  командой
  LD (HL),A ;записываем в метку CLS значе-
  ние адреса экрана для CLS'а точки, запи-
  сываем следующий адрес таблички в BEGIN,
  восстанавливаем значение STACK'а и  RET.
   А если конец , то  записываем начальный
  адрес таблички в  метку  BEGIN  и делаем
  переход на нее,а дальше такой  же  самый
  цикл.
   Теперь поговорим как строится табличка.
  Сначала идет адрес экрана,а затем смеще-
  ние,например:
                DEFW #4000
                DEFW #8080
                DEFW #4000
                DEFW #1010
                ....

   Сейчас я приведу пример программы,кото-
  рая строит табличку из таблички,написан-
  ной на BASIC'е вот такой программой:

   10 LET ADR=30000
   20 FOR N=0 TO 2*PI STEP PI/50
   30 POKE ADR,88+80*SIN N:POKE (ADR+1),76
      +70*COS N
   40 LET ADR=ADR+2:NEXT N
   Если вы хотите посмотреть, какая она из
  себя,то строкой 35 вы напишите:

   35 PLOT PEEK ADR,PEEK (ADR+1)

  После записи таблички в память,ее размер
  будет 50*2,т.е. 100 байт.

   Теперь перевод таблички  BASIC'а в таб-
  личку,необходимую нам:

        ORG 26000
        LD IX,#8000
        LD HL,30000
        LD BC,100     ;STEP *2
   LOOP PUSH HL
        PUSH BC
        LD C,(HL)
        INC HL
        LD A,(HL)
        INC HL
        CALL 8880
        LD (IX),L
        LD (IX+1),H
        INC IX
        LD DE,TAB
        ADD A,E
        LD E,A
        LD A,(DE)
        LD (IX),A
        LD (IX+1),A
        INC IX
        POP BC
        POP HL
        INC HL
        INC HL
        DEC BC
        LD A,B
        OR C
        JR NZ,LOOP
        RET
   После перевода таблица будет разположе-
  на с  адреса #8000  и  иметь  размер 200
  байт.(примечание:в самом  конце  таблицы
  необходимо поставить 4 байта  кода #FF.)
  теперь табличка готова к работе.

   Теперь самое важное,сколько  же времени
  занимает эта точка с CLS'ом ?

   Давайте подсчитаем:

  команда   LD (STACK+1),SP  занимает   20
  тактов,но так как она используется толь-
  ко один раз,ее  можно отбросить , дальше
  команды POP HL и POP DE  занимают  по 10
  тактов соответственно , команда  LD A,E-
  4 такта,команда CP #FF - 4 такта,JR NZ -
  от 7 до 12 тактов,LD (HL),A - 7 тактов ,
  LD (CLS+1),HL - 16 тактов,LD (ADR+1),SP-
  16 тактов,команды LD SP, и RET при раз -
  множении точек можно поставить в конце ,
  тогда их можно также отбросить,-->
  итого 10+10+4+4+7+7+16+16 = 74 такта,без
  CLS'A , а с ним 74+11+4+7 = 96  тактов ,
  что не так уж плохо в программах где не-
  обходим какой-то эффект из точек и оста-
  ется не так уж много времени.

   На самом то деле эта точка по моим экс-
  периментам хавает не больше 68 тактов, и
  максимальное число  точек , выводимых за
  одно прерывание,может быть около 1054!!!

   По всем,возникшим у вас вопросам ,обра-
  щайтесь по телефону +8 (0572) 37-33-66 ,
  Стас (ACTIVATOR) или пишите по адресу:

     г.Харьков 310204
     пр. Л.Свободы д.46б,кв.149
     Баженову С.О.

                   -===-
   А теперь нам хотелось бы вам написать
  недокументированные команды,которые на-
  верняка заинтерисуют любого программис-
  та,который пишет свои программы:

  Avocet  Z80/180 Assembler v2.24, #00562
     Chip=HD64180        1/31/97 16:38:47

           new 64180 instructions

  0001 ED 3C    001   TST     A
  0002 ED 04    002   TST     B
  0003 ED 0C    003   TST     C
  0004 ED 14    004   TST     D
  0005 ED 1C    005   TST     E
  0006 ED 24    006   TST     H
  0007 ED 2C    007   TST     L
  0008 ED 34    008   TST     (HL)
  0009 ED 64 AA 009   TST     $AA

  000A ED 4C    010   MLT     BC
  000B ED 6C    011   MLT     HL
  000C ED 5C    012   MLT     DE
  000D ED 7C    013   MLT     SP

  000E ED 76    014   SLP

  000F ED 38 BB 015   IN0   A,    ($BB)
  0010 ED 00 BB 016   IN0   B,    ($BB)
  0011 ED 08 BB 017   IN0   C,    ($BB)
  0012 ED 10 BB 018   IN0   D,    ($BB)
  0013 ED 18 BB 019   IN0   E,    ($BB)
  0024 ED 20 BB 020   IN0   H,    ($BB)
  0025 ED 28 BB 021   IN0   L,    ($BB)

  Avocet  Z80/180 Assembler v2.24, #00562
     Chip=HD64180        1/31/97 16:38:47

  Test 180
  Test file for the 64180

  0016 ED 39 BB 022   OUT0  ($BB),  a
  0017 ED 01 BB 023   OUT0  ($BB),  b
  0018 ED 09 BB 024   OUT0  ($BB),  c
  0019 ED 11 BB 025   OUT0  ($BB),  d
  001A ED 19 BB 026   OUT0  ($BB),  e
  001B ED 21 BB 027   OUT0  ($BB),  h
  001C ED 29 BB 028   OUT0  ($BB),  l

  001D ED 83    029   OTIM
  001E ED 93    030   OTIMR
  001F ED 8B    031   OTDM
  0020 ED 9B    032   OTDMR

  0021 ED 74 FF 033   TSTIO   $ff

   И напоследок нам хотелось бы предоста-
  вить вам INTRO нашего журнала в форма-
  те TASM'а V3.0.Дерзайте,разбирайтесь в
  моем мусоре убогих кодов!
   И еще,все те,кто хотел бы опубликовать
  свои достижения в машинных кодах,пишите
  к нам в редакцию,мы с удовольствием
  опубликуем их.Адрес вы найдете в INTRO!
   В следующем номере ждите исходник выво-
  да линии,который приблизительно занимает
  600 тактов (линия в десять знакомест)!

                *  *  *



Other articles:


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

Similar articles:
Mail - on the Spectrum and Spektrumistah in Moldova.
Mirror - an interview with the organizer of the Novgorod Digital Reality - Arty.
Beech - short story subintrusive upoki.

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