PDA

Просмотр полной версии : IN A,(nn) и OUT (nn),A



TomCaT
23.09.2006, 10:27
Насущный вопрос!
Что произойдет, к примеру, если


...
LD A,7F
OUT (FE),A
...


Этот вывод уйдет в 7FFE? Повлияет на страницы памяти? Если да, как избежать при выводе неизвестного заранее содержимого аккумулятора? Использовать вывод в порт по адресу BC, или можно как-то обойтись и этой командой?

Вообще, в разных источниках указывается, что старший байт порта к этим командам берется то из A, то из D? Кому верить?

jtn
23.09.2006, 11:55
out (#nn),A полностью аналогичен, например, out (c),e (запись в порт bc - e)
где b=a, c=#nn, e=a
других вариантов интерпретации out (#nn),a нет.
т.е. на старшую часть адреса всегда выдается значение A

TomCaT
23.09.2006, 13:31
Хорошо, запомнил... :( хоть это и странно, аргумент является одновременно старшим адресом... Никогда не представлял себе это так. Значит, вышеприведенный кусок повесит 128-е и выше? Или нет?

jtn
23.09.2006, 13:34
LD A,7F
OUT (FE),A
запись в #FD повесит, а в #FE отчего ж

Robus
23.09.2006, 14:31
Хорошо, запомнил... хоть это и странно, аргумент является одновременно старшим адресом... Никогда не представлял себе это так. Значит, вышеприведенный кусок повесит 128-е и выше? Или нет?

"OUT (253),A" это супер !!! Всего 11-ть тактов, и регистры свободные !!! Ежели комп 128к, то всё будет работать идеально !!! Есть такой редактор DMM, написанный LAVE'ом, где сделана самая всокая частота вывода цфровки при использовании громкости на каждый канал. Правда они так же как и FLASH'ы намутили с прерываниями в момент работы Player'а, но всё равно произведение искусства, как и у FLASH'ей.

cyrax inc
24.09.2006, 13:39
" Ежели комп 128к, то всё будет работать идеально !!!
все зависит от того, что за комп, а точнее как построена дешифрация его верхней памяти. в пентагонах (и в первых 128к) за дешифрацию отвечали а1 и а15, в профях, скорпах и атм-ах были добавлены дополнительные линии. поэтому варьируя число в аккумуляторе, можно добиться нужного эффекта на любой машине.

Если да, как избежать при выводе неизвестного заранее содержимого аккумулятора?
избежать очень просто - принудительно выставлять биты аккумулятора в соответствии с моделью компа. тогда ничего виснуть не будет.

Robus
24.09.2006, 15:35
все зависит от того, что за комп, а точнее как построена дешифрация его верхней памяти. в пентагонах (и в первых 128к) за дешифрацию отвечали а1 и а15, в профях, скорпах и атм-ах были добавлены дополнительные линии. поэтому варьируя число в аккумуляторе, можно добиться нужного эффекта на любой машине.

Я имел в вину настоящий Original Speccy 128k. Множество раз тестировал на разных видах Original Speccy, работает как по часам. А вот у клонов и вправду частенько бывают не соответствия.


избежать очень просто - принудительно выставлять биты аккумулятора в соответствии с моделью компа. тогда ничего виснуть не будет.

Да, но если сделать OUT (253),11000000B, то это будет уже не переключение страниц, а выбор регистра в AY'ке.
Или нужно иметь комп в котором последние старшие биты не используются (128к), или честно делать OUT (C),A.

TomCaT
26.09.2006, 08:48
Короче, тупанул я. FD-не FE, ессно. Но зато тему интересную поднял... Значит, в FE можно писать и в порт Ann (A старший, nn младший), а вот в семейство ..FD -- честно мучить BC. Теперь разобрался.

jtn
26.09.2006, 10:05
Я имел в вину настоящий Original Speccy 128k. Множество раз тестировал на разных видах Original Speccy, работает как по часам. А вот у клонов и вправду частенько бывают не соответствия.блин ну как так. плохо значит тестировал. попробуй еще раз сделать ld a,#1F:out (#FD),a на +3

TomCaT
26.09.2006, 12:01
Ну, как всгда, автозамена на смайлы в самом интересном месте ;) Хотя и так поятно...

Robus
26.09.2006, 22:55
блин ну как так. плохо значит тестировал. попробуй еще раз сделать ld a,#1Fut (#FD),a на +3

Может я что-то напутал или чего-то не понимаю ... Написал програмку:

di
ld hl,49152
ld a,16
out (253),a
ld (hl),a
ld a,31
out (253),a
ld (hl),a
ld a,16+7
out (253),a
ld c,(hl)
ld b,0
ei
ret

Сделал PRINT USR 16384, на экране 31, то есть содержимое страницы 7-мь. Хотя, наверное, речь идёт о версиях Speccy с плюсиком, не знаю как в английских сбрках, но в польской стоит отключение режима "плюс" и всё работает как надо. То же проверил на пентагоне, результат такойже ... Вообщем, ссори, если не врубился о чём речь !

jtn
27.09.2006, 07:28
ключевые знаки в моём посте - +3
в фирменном +3 есть порт #1FFD и думаю ему очень не понравится, если записать туда #1F

TomCaT
27.09.2006, 11:11
Даааа...
Короче, команда OUT (253),A практически дает непредсказуемые результаты на машинах старше 48к

Приятно, что и говорить... (c) Иа

Не понимаю, хоть убейте, зачем вообще понадобилось для OUT делать учет старшего байта... Нет, ну три байта аргументов команды хранятся в двух однобайтных регистрах... :v2_conf2: Как такое можно было допустить? Я потому и надеялся, что старший в D, как фирма VAPRINT в своем "Программировании в машинных кодах" указывает... Ан нет. Да и ни к чему эти разговоры уж, все равно не поменять теперь...

Кстати, все вышеозначенное -- на реалах проверялось? Может, там как-то не такее, чем в эмулях?.. :v2_jawdr:

jtn
27.09.2006, 17:16
забей. это уже 30 лет так есть и ничего не изменишь.
вывод порт #FE с короткой адресацией никому не мешает - практически вся музыка на бипере играется таким образом

cyrax inc
27.09.2006, 19:38
Даааа...
Короче, команда OUT (253),A практически дает непредсказуемые результаты на машинах старше 48к

на конкретной машине OUT (253),A дает конкретные результаты. кстати, если стэк держать ниже 0х0с000, то зависов никаких не будет.


Не понимаю, хоть убейте, зачем вообще понадобилось для OUT делать учет старшего байта...
здрасьте-досвиданья. вообще-то у Z80 шестнадцатиразрядная шина адреса, и выставлять на нее _обязательно_ что-то (причем конкретное) нужно. вакатта?

TomCaT
27.09.2006, 19:51
ну, выставлять 0. Или, если 0 на 8 линиях так трудно реализуем аппаратно (я примерно представляю это все, и, думаю, так и есть, ради одной команды нефиг парится), то сделали бы старший байт брать из D... или еще откуда-то. Неужели вам не кажется странным, что A -- и аргумент-данные и старший байт адреса, т.е. нельзя послать в конкретный порт конкретное число этой командой, можно только надеятся, что независимо от A данные уйдут куда надо, не добравшись при этом до нежелательных портов, буде такие встретятся в компе...

jtn
27.09.2006, 20:40
на конкретной машине OUT (253),A дает конкретные результаты. кстати, если стэк держать ниже 0х0с000, то зависов никаких не будет.ну чичас! на #xxFD много чего бывает и отключалки пзу и управление турборежимом и строб принтеру и естесно музыкальный чип. так что репу почесать стоит не менее 58 раз прежде чем использовать out (#fd),a. вообще РТФхистори. во второй половине 90х была очень популярна холивар - короткая адресация #FD vs полной
Неужели вам не кажется странным, что A -- и аргумент-данные и старший байт адреса, т.е. нельзя послать в конкретный порт конкретное число этой командой, можно только надеятся, что независимо от A данные уйдут куда надо, не добравшись при этом до нежелательных портов, буде такие встретятся в компе...хорош параноить! за два с лишним десятка лет были написаны десятки-сотни тысяч, если не больше, программ на z80. поднимать сейчас этот вопрос по меньшей мере смешно =)

cyrax inc
27.09.2006, 20:45
ну, выставлять 0. Или, если 0 на 8 линиях так трудно реализуем аппаратно (я примерно представляю это все, и, думаю, так и есть, ради одной команды нефиг парится), то сделали бы старший байт брать из D... или еще откуда-то.
извините, вы говорите глупость. для указания полных 16 разрядов служит пара BC. а вообще, если конечно интересно, рекомендую ознакомится с дискретной логикой, а потом со схемотехникой спека (это по поводу "трудности" выставления 0 на 8 линиях ^__^)

Неужели вам не кажется странным, что A -- и аргумент-данные и старший байт адреса, т.е. нельзя послать в конкретный порт конкретное число этой командой, можно только надеятся, что независимо от A данные уйдут куда надо, не добравшись при этом до нежелательных портов, буде такие встретятся в компе...
не кажется. это пошло еще с 8080 (как вы должны знать, Z80 "почти" совместим с 8080. что там творится со старшим байтом не помню, но отличие точно есть) и используется в архитектурах с укороченной периферийной шиной (8 разрядов). в спеке >48к шина имеет 16 разрядов, поэтому придется мириться с этим "казусом" процессора Z80.

jtn
27.09.2006, 20:50
в спеке >48к шина имеет 16 разрядов,"ни асилил" =)

cyrax inc
27.09.2006, 20:52
ну чичас! на #xxFD много чего бывает и отключалки пзу и управление турборежимом и строб принтеру и естесно музыкальный чип. так что репу почесать стоит не менее 58 раз прежде чем использовать out (#fd),a. вообще РТФхистори. во второй половине 90х была очень популярна холивар - короткая адресация #FD vs полной
кроме разве что отключалки пзу больше ничто не приведет к зависанию (хотя конечно все от кода зависит). и РТФить надо не хистори, а тех дату на модели. а так называемая "полная" адресация - имхо фейка, ибо я чтото неприпомню моделей с действительно полной адресацией.

cyrax inc
27.09.2006, 20:55
"ни асилил" =)
млин, неправильно выразился.
Repeat: для дешифрации устройств в спеке >48k используются все 16 разрядов шины адреса. устроит?

jtn
27.09.2006, 21:05
а так называемая "полная" адресация - имхо фейка, ибо я чтото неприпомню моделей с действительно полной адресацией.
в скорпионе (в кае практически аналогично):
дешифрация #FFFD, #BFFD, #1FFD, #7FFD по адресным линиям A15, A14, A13, A5, A2, A1, A0. в наиболее "опасном" порту #1FFD - переключение верхней памяти, отключение пзу, манипуляции со страницами пзу.
в профи: #FFFD, #BFFD - по A15, A14, A2
#7FFD - A15, A2
#DFFD - A13, A2 - тут и переключение видеорежимов, и отключение пзу и смена окна проецирования (не стандартное #C000-#FFFF, а #4000-#7FFF) и переключение верхней памяти.
в фирменном +3, а также турбо 2+ и прочих не менее сложные заморочки.
далее пентагон512 - глюки с верхней памятью.
и т.д. и т.п.

jtn
27.09.2006, 21:10
для дешифрации устройств в спеке >48k используются все 16 разрядов шины адреса. устроит?имеются ввиду порты устройств? не соглашусь. для 48к существует куча устройств и наверняка на многих используется более чем 8 разрядная адресация. тем более, что 48к+AY не редкость, да что там далеко ходить, даже для порта #FE на чтение используются все 8 старших бит ША.

cyrax inc
27.09.2006, 21:19
в скорпионе (в кае практически аналогично):
дешифрация #FFFD, #BFFD, #1FFD, #7FFD по адресным линиям A15, A14, A13, A5, A2, A1, A0. в наиболее "опасном" порту #1FFD - переключение верхней памяти, отключение пзу, манипуляции со страницами пзу.
в профи: #FFFD, #BFFD - по A15, A14, A2
#7FFD - A15, A2
#DFFD - A13, A2 - тут и переключение видеорежимов, и отключение пзу и смена окна проецирования (не стандартное #C000-#FFFF, а #4000-#7FFF) и переключение верхней памяти.
в фирменном +3, а также турбо 2+ и прочих не менее сложные заморочки.
далее пентагон512 - глюки с верхней памятью.
и т.д. и т.п.
цитата то тут при чем? полная адресация, это когда _все_ шестнадцать разрядов используются для дешифрации. а все приведенные - по прежнему неполные. кстати, в профи 7FFDh, #DFFD разве А2, а не А1?

cyrax inc
27.09.2006, 21:22
имеются ввиду порты устройств? не соглашусь. для 48к существует куча устройств и наверняка на многих используется более чем 8 разрядная адресация. тем более, что 48к+AY не редкость, да что там далеко ходить, даже для порта #FE на чтение используются все 8 старших бит ША.
хорошо, хорошо, уговорил.

TomCaT
28.09.2006, 08:55
2 cyrax inc & The Exploited

Это все прекрасно и после вот именно этого сообщения параноить больше не буду.) Видимо, так и должно быть, чтоб A уходило в порт, адресуемый (An). :( Все абсолютно правильно и верно, особенно радует, что хоть порта #FE это не касается. А про полную адресацию могли бы и не напоминать, эта тема не для нее, и если считаете, что я про нее не в курсе -- зря. Там-то как раз все нормально, но она занимает регистры и код, что никак не гут.

И совместимость тут в общем-то ни при чем -- ну так же, или не так же в 8080 (знаю я и этот процессор примерно), какая разница? ZX на Z80 построен, и у него вот ТАК. Вы пытаетесь доказать что ТАК правильно? Попутно говоря, что не так уж сложно всунуть в микросхему доп. выдачу 8bit "0" на старшие адресные линии при надобности... Или вы все-таки не согласны с архитектурой, но "все равно ведь уже ничего не изменить?.."