Вход

Просмотр полной версии : Что за ботва с портом 7FFD



Tim
18.04.2012, 18:19
Решил поупражняться в работе с этим портом. написал следующую програмулину которая пишет в него нуль. по идее она должна делать абсолютно ничего потому как 0 устанавливает все страницы как они установлены по умолчанию (при включении компа). Однако комп после выполнения перезагружается


DI
PUSH AF
PUSH BC
LD BC,#7FFD
LD A,0
OUT (C),A
POP BC
POP AF
EI
RET

---------- Post added at 18:17 ---------- Previous post was at 18:17 ----------

Да, поскольку 128к спектрума у меня пока нету, тестировал на двух разных эмуляторах

---------- Post added at 18:19 ---------- Previous post was at 18:17 ----------

А вот тестовая программка на бесике, если кому влом ассемблер запускать

---------- Post added at 18:19 ---------- Previous post was at 18:19 ----------




poke 30000,243
poke 30001,245
poke 30002,197
poke 30003,1
poke 30004,253
poke 30005,127
poke 30006,62
poke 30007,0
poke 30008,237
poke 30009,121
poke 30010,193
poke 30011,241
poke 30012,251
poke 30013,201
randomize usr 30000

null_device
18.04.2012, 19:13
Как мне кажется, нужно еще продублировать значение порта в системной переменной #5B5C..

doorsfan
18.04.2012, 19:54
ога, и не забыть clear 49151

Tim
18.04.2012, 20:31
Как мне кажется, нужно еще продублировать значение порта в системной переменной #5B5C..

Ага все верно. Я посмотрел переменную #5B5C и оказалось что она при старте в режиме basic-128 равна #10. Что ОЧЕНЬ СТРАННО ибо судя по всем описаниям что я нашел для этого порта бит 4 должен быть равен 1 если выбрано ПЗУ с бейсиком-48, и 0 для basic-128

Кто нибудь может прояснить?

psb
18.04.2012, 20:42
для этой переменной делается or #10, чтобы включать пзу 48к. этой переменной можно только страницы переключать и, возможно, экран. а пзу из бейсика переключать смысла нет.

Tim
18.04.2012, 21:03
у меня такое подозрение что при старте в режиме basic128 этот бит равен нулю, а при запуске программы на бейсике он ставится в единицу (и соответственно ПЗУ переключается на basic48). После завершения программы бит ставится в ноль и ПЗУ переключается обратно на basic128

VNN_KCS
18.04.2012, 21:37
Лично я, при переключении страниц, использую значения #10 - #17.Причём #12 и #15 не юзаю. Это основная, до 49152, намять. А когда включаю 2-й экран 128-го Спека, то #18 - #1f. В переменной значение никогда не сохраняю. Хотя может и нужно при работе из бейсика. Не пробовал.

Vadim
18.04.2012, 22:25
Однако комп после выполнения перезагружается
Внимательнее почитайте описание битов порта. Если запускаете из бейсик-128, то как указывали выше, надо задать значение в переменной BANKM. Да и стек надо убрать из верхних адресов. На спектрум-128 проблем не будет, а вот на +3 даже задание переменной дело не решит.

Alex Rider
20.04.2012, 00:10
у меня такое подозрение что при старте в режиме basic128 этот бит равен нулю, а при запуске программы на бейсике он ставится в единицу (и соответственно ПЗУ переключается на basic48). После завершения программы бит ставится в ноль и ПЗУ переключается обратно на basic128

Правильное предположение. Функция USR, которая запускает программу, живет в калькуляторе BASIC48, она же оставляет на стеке адрес возврата в ПЗУ BASIC48 для сохранения результата на стек калькулятора. Так что при входе в подпрограмму пользователя установлен BASIC48, он же должен быть возвращен (если программа щелкает ПЗУ) при выходе, то есть, в BANK_M и в #7ffd должен жить #10.