Оказалось, что никакие они не честные, и не олдскульные...Lavr wrote:И ведь они оказались честные олдскульные однобайтные PEEK и POKE!Shaos wrote:а тут PEEK и POKE двухбайтовые или однобайтовые? процык вроде как 16-битный (и шина данных тоже)...
Что особенно впечатляет по нечетным адресам!

И это может очень здорово ввести в заблуждение, если точно не знаешь, как работают тут PEEK и POKE!

Но я, как русский человек, сначала наступил на грабли, а уж потом посмотрел в инструкцию по программированию БК-0010!

Анекдот не только в том, что целое, но целое со знаком!3.7.1. Оператор РОКЕ
Оператор РОКЕ А,В записывает числовое значение В в память машины по
адресу А. Если значение адреса нечетное, то оно уменьшается на 1.
3.7.3. Функция РЕЕК
Результат функции РЕЕК(А) - целое число, хранящееся по адресу А.
То есть, чтобы загнать в два байта памяти 0FFH, 0FFH нельзя написать:
РОКЕ ADDR,65535 - тут вылетит "Ошибка 6" (не знаю, наверно переполнение)
а надо написать:
РОКЕ ADDR,-1
И нарвался я на эти фокусы, начав делать привязку BK.EXE к клавиатуре пульта.
BK.EXE проецирует клавиши дополнительной клавиатуры на слово порта 177714о вот
по такому принципу:
//--------------------------------------------------------------------
//--- клавиши джойстика ---
//---
//--- <Home> <UP_ARR> <PG_UP>
//--- <L_ARR> <R_ARR>
//--- <END> <PG_DN>
Собственно довольно простая затея, и места много, чтобы вмешаться с клавиатурой Монитора.
Я написал небольшую тестовую программу типа:
Code: Select all
30 ADDR = &HFFCC
40 L = PEEK ADDR
50 H = PEEK ADDR+1
60 PRINT HEX$(H);
70 PRINT ".";
80 PRINT HEX$(L);
80 PRINT ";"
А когда начал нажимать кнопки <Home> <END> <L_ARR> <UP_ARR> <R_ARR> <PG_UP> <PG_DN>,
то увидел, что до точки и после точки выводится одно и то же число!

Так что PEEK и POKE в БК-0010 работают с целым двухбайтовым числом со знаком,
а вот со значением адреса несколько мухлюют...
