![]() |
Модераторы: LSD |
![]() ![]() ![]() |
|
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy |
и так пока там решаетса вопрос о том делат тему или нет вот мои наблюдения на тему:
после комфорта вин/линух с их окошками кодит в самом емуляторе ушербно ) рекомендую кросс компилер sjasm или z80asm при необходимости к ним прикручиваетса IDE еше нам понадобитца некий софт для переноса скомпиленного бинарника на образ диска TRD я нашел пару плагинов для тотал командера, работают вполне сносно ну и естестно нада емулятор, тем у кого реал спека нет ) помучив вчера чтук 10 емулей я остановилса на EmuZWin v2.6 release 1.6 (С) by Vladimir Kladov, 2003-2005 и ZX-Emul for Windows v0.31a by Vladimir Yudin aka Lion17 Rostov-on-Don, Russia © 2002-2005 кому нада ссылки пишите или могу сюда кинут ))) в принципе в гуугле за 5 мин исчетса -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Payne |
|
|||
![]() Детектив ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 6.4.2005 Где: Петербург |
Я думаю, на первых порах можно обойтись эмулем и программой GENS v MONS. Многое еще нужно вспомнить, многому просто научиться.
На крайняк я могу достать "из под дивана" свой Спек, подключить его к ящику (а то монитор че-то кашлял, когда я его последний раз включал ![]()
А почему не поюзать ZX-32? |
|||
|
||||
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy |
а zx32 поддерживает мультиколор general sound и прочие прибамбасы?
-------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а |
Давайте вспоминать команды. Переписываю их из "Ассемблер Z-80" под редакцие Y. TAHT - это единственная кника по асму на Z80, которуя я прочитал от корки до корки(тут вместо "8-битовый регистр" говорится "рука", вместо "16-битовый" - "нога").
Отмечу жирным команды, которые я не помню в той или иной мере. (обозначения: r8 - A,B,C,D,E,H,L, r16 - BC, DE, HL, IX, IY, n8 - любое 8-битное число, cn - условие, значение одного из флагов, n16 - любое 16-битное число) ADC A, r8 - сложение с учетом переполнения ADC A, n8 - сложение с учетом переполнения ADC A, (HL)/(IX+n8)/(IY+n8) - сложение с учетом переполнения ADC HL, BC/DE/HL/SP - сложение с учетом переполнения ADD A, r8 - сложение ADD A, n8 - сложение ADD A, (HL)/(IX+n8)/(IY+n8) - сложение ADD HL, BC/DE/HL/SP - сложение ADD IX, BC/DE/IX/SP - сложение ADD IY, BC/DE/IY/SP - сложение AND r8/n8/(HL)/(IX+n8)/(IY+n8) - логическое И для аккумулятора. BIT - проверка включен ли n-ный бит CALL addr - вызов процедуры CALL cond, addr - вызов процедуры по условию CCF - инвертирование значения флага переноса CY (Payne) CP r8 - сравнить аккумулятор с регистром CP n8 - сравнить с аккумулятор с числом CPD - сравнение аккумулятора и ячейки с декрементом CPDR - сравнение аккумулятора и ячейки с декрементом BC раз CPI - сравнение аккумулятора и ячейки с инкрементом CPIR - сравнение аккумулятора и ячейки с инкрементом BC раз CPL - команда, инвертирующая все биты значения из регистра-аккумулятора (Payne) DAA - BCD коррекция после сложение(19h+01h=1ah -- daa --> 20h) DEC (HL/IX+n/IY+n) - вычесть единицу из указанной ячейки памяти DEC r8/r16/SP - вычесть единицу из указанного регистра DI - запретить прерывания DJNZ n8 - уменьшает B, сравнивает его с нулем, если не ноль - прыжок EI - разрешить прерывания EX (SP), HL/IX/IY - обменять значения верхушки стека с указаным регистром EX AF, AF' - обменять значения AF и альтернативного AF' EX DE, HL - обменять значения DE и HL EXX - обменять регистры и альтернативные 'регистры HALT - ничего не делать до прерывания IM 0/1/2 - режим прерывания. IN r8, ( C ) - принять байт из порта, записанного в C IN A, n8 - принять байт из порта под номером n8 INC (HL/IX+n8/IY+n8) - прибавить единицу к указанной ячейке памяти INC r8/r16/SP - увеличить регистр на 1 IND - ввод байта из порта в ячейку памяти с декрементом (Payne) INDR - ввод массива значений из портов в память с декрементом INI -ввод байта из порта в ячейку памяти с инкрементом (Payne) INIR - ввод массива значений из портов в память с инкрементом (Payne) JP (HL/IX/IY) - Переход на адрес, который берется из указанного регистра JP n16 - переход на указанный адрес JP cn, n16 - переход на указанный адрес в случае выполнения условия JR n8 - переход относительно текущего адреса JR cn,n8 - переход относительно текущего адреса LD (n16), A/r16/SP - загрузить в ячейку указанный регистр LD (BC), A - загрузить в ячейку BC аккумулятор LD (DE), A - загрузить в ячейку DE аккумулятор LD (HL), r8 - загрузить в ячейку HL указанный регистр LD (IX+n8/IY+n8), - загрузить в ячейку, номер которой r16 +n8, указанный регистр LD r8,r8 - загрузить в один регситр содержимое другого LD r16, r16 - загрузить в один регситр содержимое другого LD r8,n8 - загрузить в регистр число LD r16, n16 - загрузить в регистр число LD r8, (HL/IX+n8/IY+n8) - загрузить в регистр ячейку памяти LD r8, (n16) - загрузить в регистр ячейку памяти LD r16, (n16) - загрузить в регистр ячейку памяти LD A, R - загрузить в аккамулятор регситр сохранения памяти R LD A, I - загрузить в аккамулятор регситр прерывания I LD I,A - загрузить в регситр прерывания I аккамулятор (DENNN) LD SP, (n16) - установить SP из ячейки памяти LD SP, n16 - установить SP на ячейки памяти LD SP, IX/IY/HL - загрузить в SP указанный регистр LDD - byte(DE)=byte(HL), BC=BC-1, DE=DE-1, HL=HL-1 LDI - byte(DE)=byte(HL), BC=BC-1, DE=DE+1, HL=HL+1 LDDR - пока BC не ноль повторять byte(DE)=byte(HL), BC=BC-1, DE=DE-1, HL=HL-1 LDIR - пока BC не ноль повторять byte(DE)=byte(HL), BC=BC-1, DE=DE+1, HL=HL+1 NEG - изменить знак аккамулятора (A=-A) NOP - ничего не делать ... to be continued (ниже)... Это сообщение отредактировал(а) Mayk - 14.6.2005, 15:53 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy |
IM 0/1/2
прерывания , вектор как раз в регистр I пишется при IM 2 (вроде сам тоже не помню) каждые 70000 тактов проц передает управление на код который находится по адресу указаному в регистре I IM 0 не задействовано -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
DENNN |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва |
IM0 кажись использовалось в микродрайвах. Там прерывание бросается по адресу, указанному в потоке. Потоки размещаются в памяти между системными переменными и областью, отведенной под код бейсика. IM 1 - стандартный режим прерываний. IM 2 - расширенный режим. Есть два вида конструкций. В первом виде при наступлении прерывания код следующей выполняемой инструкции помещается в стек и управление передается по адресу, записанному в ячейке по адресу, в котором старший бит равен регистру I, а младший бит равен #FF. Такая схема описывается во всей литературе, которую я видел. Но есть еще другая конструкция железа (видимо пришедшая со времен первого спеки). В ней младший байт равен не #FF, а берется значение с шины данных, т.е. случайное число, но кратное двум (почему, сейчас не помню). За отрисовку экрана отвечает отдельная микросхема, называемая ULA. В момент начала формирования верхней строки генерируется прерывание. На шине данных в этот момент информация, которая формирует изображение на мониторе. Именно отсюда и берется этот второй случайный байт. В более поздних моделях это было "пофиксено" и байт стал равняться всегда #FF
Верно. Причем вроде д.б. обратная операция LD I,A
Вроде прерывание генерировать должно было. Но на спекки не использовалась (за исключением интерфейса с микродрайвом). Команды LDDR и LDIR примечательны тем, что на самом деле они работают не как цикл, а перемещают блок памяти за 5 тактов (могу сейчас ошибаться). Блоки источника и приемника могут перекрываться, отсюда и две вариации команды. Сейчас многое уже не помню, но если интересно, могу в сети инфу найти и освежить память ![]() |
||||||
|
|||||||
Mayk |
|
||||||||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а |
Вот тут нашел:
Про IM 2 там сказано следующее
Да, есть такая.
Давай. Это сообщение отредактировал(а) Mayk - 14.6.2005, 10:45 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||||||||
|
|||||||||||||
Payne |
|
||||||
![]() Детектив ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 6.4.2005 Где: Петербург |
I - это регистр вектора прерываниий Z80.
CPL - команда, инвертирующая все биты значения из регистра-аккумулятора, то есть A -> !A. После выполнения операции устанавливаются флаги переноса и отрицательного результата.
IND - ввод байта из порта в ячейку памяти с декрементом; INCR - ? INI - ввод байта из порта в ячейку памяти с инкрементом; INIR - ввод массива значений из портов в память с инкрементом. |
||||||
|
|||||||
Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а |
Опечатка в книге. Следует читать CCF. CCF - сбросить флаг переноса C
Опытным путем - сравнение аккамулятора A и (HL) с декрементом HL, BC По аналогии: CPI - Опытным путем - сравнение аккамулятора A и (HL) с декрементом BC, инкрементом HL CPIR - Выполнить команду CPI BC кол-во раз CPDR - Выполнить команду CPD BC кол-во раз INCR - Двойная опечатка в книге(ну и мрак). Похоже следует читать INDR, Opcode: ED 8A По аналогии - ввод массива значений из портов в память с декрементом. Похоже, половину команд вспомнили. Это сообщение отредактировал(а) Mayk - 14.6.2005, 11:39 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
Payne |
|
||||
![]() Детектив ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 6.4.2005 Где: Петербург |
В моей книге дано следующее описание: CCF - инвертирование значения флага переноса CY. При этом состояние флага переноса меняется на противоположное, флаг отрицательного результата N сбрасывается, состояние флага H не определено.
Может, нужно еще вспомнить регистры процессора Z80? Предлагаю сделать это. Регистры данных и аккумулятор Микропроцессор Z80 работает с двумя наборами регистров - основным и альтернативным. Оба набора состоят из семи 8-разрядных регистров данных и флагового регистра. Регистры основного набора обозначаются буквами A, B, C, D, E, H, L и F (флаговый). Регистры альтернативного набора соответственно - A', B', C', D', E', H', L' и F'. С помощью специальных команд можно переключать работу процессора с одного набора регистров на другой. Но определить, какой из наборов активен в данный момент, невозможно. Для выполнения многих команд обрабатываемые данные должны быть занесены в специальный регистр - аккумулятор A. Команды, обрабатывающие 16-разрядные числа, используют пары регистров в следующих сочетаниях: BC, DE, HL, AF и, соответственно, BC', DE', HL', AF'. При этом в регистры B, D, H, A, B', D', H', A' записывается старший байт числа, а в C, E, L, F, C', E', L', F' - младший. Спаренные регистры, например, можно использовать для хранения адресов ячеек памяти. Счетчик команд Выполняя очередную команду, процессор должен знать, откуда ему взять следующую. За этим следит 16-разрядный регистр счетчика команд PC. В PC записывается адрес команды, которая должна выполниться после текущей. Индексные регистры Существует возможность обращаться к ячейкам памяти, указывая смещение их адреса относительно содержимого 16-разрядных индексных регистров IX и IY. Смещение может быть задано числом в пределах -128...+127. Указатель стека 16-разрядный регистр указателя стека SP содержит адрес вершины стека. Здесь, думаю, все понятно, поскольку стек в Z80 работает по тому же принципу, что и в x86/Pentium. То есть так же растет в сторону уменьшения адресов и при каждой записи или чтении адрес вершины стека меняется на 2. Регистр флагов Флагом называется отдельный бит регистра флагов F. Значимыми являются 6 из 8 битов флагового регистра: - бит 0. CY (carry flag) - флаг переноса; - бит 1. N (negative) - флаг отрицательного результата; - бит 2. P/V (parity/overflow) - флаг четности/переполнения; - бит 4. H (half-carry) - флаг вспомогательного переноса; - бит 6. Z (zero) - флаг нуля; - бит 7. S (sing) - флаг вычитания. |
||||
|
|||||
DENNN |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва |
Анналогичные операции выполняются с парой регистров HL. |
|||
|
||||
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy |
ну что все вспомнили? )
ldir силная чтука на х86 ее нехватает ) но тока она не за 5 тактов перебрасывает там скокото тактов на байт факт что перерисовка экрана с ldir вроде как не получается, не укладываетса в 70000 тактов что приводит к мерцанию поэтому все вымучивауют свои варианты обновления экрана -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а |
Точно!
Нее, у нас еще половина команд осталась ;) Итак (нашел файлик со списком команд и их кратким описанием. Нет опечтакам!): OR r8/n8/(HL)/(IX+n8)/(IY+n8) - логическое или для аккумулятора и операнда OUT (n8), A - вывод аккумулятора в порт n8 OUT ( C ), r8 - вывод байта в порт OUTD - вывод байта в порт с декрементом OTDR - делать OUTD пока b не 0 OUTI - вывод байта в порт с инкрементом OTIR - делать OUTI пока b не 0 POP r16/AF - восстановить из стека 16-битный регистр PUSH r16/AF - поместить в стек 16-битный регистр RES 0-7, r - сбросить указанный бит в указанном регистре RES 0-7, (HL)/(IX+n8)/(IY+n8) - сбросить указанный бит в ячейки памяти RET - возврат RET cn - возврат при условии RETI - возврат из прерывания RETN - возврат из немаскируемого прерывания RLA - ну и куда девается крайний левый(кстати, это который 0x80?) бит? RL r8 - повороты я не помню RLCA - вот это кажется крайний бит кидает в другой крайний - ??? RLC r8 - ??? RLC (HL)/(IX+n8)/(IY+n8) - ??? RLD - ??? RRA - ??? RR r8 -??? RRCA - ??? RRC r8 - ??? RRC (HL)/(IX+n8)/(IY+n8) - ??? RRD - ??? RST 0/0x08/0x10/0x18/0x20/0x28/0x30/0x38 - аналогично CALL 0/../0x38, но в одну команду SBC r8 - вычесть из аккумулятора r8 с учетом флага переноса SBC A, n8 - вычесть из аккумулятора n8 с учетом флага переноса SBC (HL) - вычесть из аккумулятора ячейку памяти с учетом флага переноса SBC A, (IX+n8)/(IY+n8) - вычесть из аккумулятора ячейку памяти с учетом флага переноса SCF - установить флаг переноса SET 0-7, r8/(HL)/(IX+n8)/(IY+n8) - установить бит в ячейке памяти SLA r8 - сдвиг бит регстра влево (умножение на 2) SLA (HL)/(IX+n8)/(IY+n8) - сдвиг бит влево в ячейке SRA r8 - сдвиг бит регстра вправо (деление на 2) SRA (HL)/(IX+n8)/(IY+n8) - сдвиг бит вправо в ячейке SLL r8 - ??? SLL (HL)/(IX+n)/(IY+n) - ??? SRL r8 - ??? SRL (HL)/(IX+n)/(IY+n) - ??? SUB r8 - вычесть регистр из аккумулятора SUB n8 - вычесть n8 из аккумулятора SUB (HL)/(IX+n)/(IY+n) - вычесть ячейку памяти из аккумулятора XOR r8 - логическое исключающее или для аккумулятора и r8 XOR n8 - логическое исключающее или для аккумулятора и n8 XOR (HL)/(IX+n)/(IY+n) - логическое исключающее или для аккумулятора и ячейки памяти Надо еще вспомнить устройство экрана, ввод информации с клавиатуры, работу с памятью >48K, работу с TRDOS. Это сообщение отредактировал(а) Mayk - 14.6.2005, 15:43 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy |
а команды типа RLC. делают тоже самое но с установкой влага С в зависимости от состояния бита (вроде так ) -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а |
Он может попасть в C и/или в другой крайний бит или вообще исчезнуть. То есть RLCшники ставят флаг C в крайний левый бит, крутят байт, на место крайнего правого бита ставят C(он же левый бит до RLC)? -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
![]() ![]() ![]() |
Правила раздела «Флейм» | |
|
Добро пожаловать в «Флейм». В разделе не действуют многие правила:
Строго запрещено:
Напоминаем о существовании волшебной кнопочки "Репорт". Если вы увидели сообщение, несовместимое с жизнью, просьба подвести на нее курсор и клацнуть левой клавишей мышки. Тем самым вы сможете призвать злого, но жутко справедливого джина-модератора, который нашлет порчу на злостного нарушителя. Кстати - счётчик сообщений здесь не растёт. Глас Винграда:
Глас Философии:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Sneg0k |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Флейм | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |