Faultless
#05
02 февраля 1997 |
|
CPU для вас - процедура быстрого вывода точки. Недокоментированные команды процессора Z80.
┌──────────────────────────────────────┐ │Раздел: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 тактов (линия в десять знакомест)! * * *
Другие статьи номера:
Похожие статьи:
В этот день... 3 декабря