PDA

Просмотр полной версии : OUTI\OUTD правильная последовательность действий



NEO SPECTRUMAN
07.03.2017, 14:10
при описании работы команд OUTI и OUTD
везде описывается одна и та же последовательность
Reads from (HL) and writes to the (C) port. HL is then incremented, and B is decremented.

перекинули содержимое (hl) в порт (c)
а только потом инкремент hl и декремент b

как в итоге оказалось
TRUЪ ПОСЛЕДОВАТЕЛЬНОСТЬ ВОТ ТАКАЯ!!!

B←B-1
(C)←(HL)
HL←HL+1

А В EMUZWIN ОНО ИСПОЛНЯЕТСЯ НЕПРАВИЛЬНО!!!!!


но SIDBASICSP для вывода использует такую последовательность

bc = $C0FD ; $C0FD зеркало $FFFD

out (c),a
outi

то есть по логике оно должно 2 раза отправить данные в порт $C0FD
(что и происходит в emuzwin и он молчит (он прекрасно поддерживает зеркало $C0FD!!!!))

но даже на реальном железе оно работает
то есть декремент B происходит до вывода в порт
и данные успешно идут в порт $BFFD
(так же работает в куче эмуляторов (и в unreal тоже))

ВОПРОС ШОЗАНАХ????? :v2_blink:

я убил кучу времени в попытке понять чего оно не работает :v2_dizzy_wall:

- - - Добавлено - - -

щас залезу в фирменный мануал

вот оно

(C) ← (HL), B ← B – 1, HL ← HL + 1


при этом далее все описывается правильно


The contents of the HL register pair are placed on the address bus to select a location in
memory. The byte contained in this memory location is temporarily stored in the CPU.
Then, after the byte counter (B) is decremented, the contents of Register C are placed on
the bottom half (A0 through A7) of the address bus to select the I/O device at one of 256
possible ports. Register B can be used as a byte counter, and its decremented value is
placed on the top half (A8 through A15) of the address bus. The byte to be output is placed
on the data bus and written to a selected peripheral device. Finally, the register pair HL is
incremented.

SAM style
07.03.2017, 14:12
Таки да. Сначала читается с (HL), потом декремент B, потом вывод в порт BC считанного значения, потом инкремент HL и расстановка флагов

Description:The contents of the HL register pair are placed on the address bus to select a
location in memory. The byte contained in this memory location is
temporarily stored in the CPU. Then, after the byte counter (B) is
decremented, the contents of register C are placed on the bottom half (A0
through A7) of the address bus to select the I/O device at one of 256
possible ports. Register B may be used as a byte counter, and its
decremented value is placed on the top half (A8 through A15) of the
address bus. The byte to be output is placed on the data bus and written to a
selected peripheral device. Finally, the register pair HL is incremented.


PS: к слову, INI/IND работает наоборот - там B уменьшается после ввода из порта

NEO SPECTRUMAN
07.03.2017, 14:16
тоесть в эмузвин и тут косяк...

- - - Добавлено - - -

а описание такое как будто и не предусматривается адресовать 64К портов...


но зато во всех мануалах

(C)←(HL)
HL←HL+1
B←B-1
видно тоже сходу непонели
http://z80-heaven.wikidot.com/instructions-set:outi

боже сколько подводных граблей...

jerri
07.03.2017, 14:30
NEO SPECTRUMAN, ну дык мы то еще 3 года назад выяснили когда ТСконфу разбирали

NEO SPECTRUMAN
07.03.2017, 15:09
NEO SPECTRUMAN, ну дык мы то еще 3 года назад выяснили когда ТСконфу разбирали
ну дык а мну 5 лет практически не проявлял тут активности

- - - Добавлено - - -

Кстате уже есть похожая тема
пусть эта будет про баг в эмузвин :rolleyes: