Casio FX-603P



English version
Остальные калькуляторы



Я не гарантирую, что приведенная здесь информация верна, и никоим образом не отвечаю за последствия ее использования.

Общие сведения

Не буду повторять то, что уже написал в другом месте, а сразу перейду к деталям. Из физически имеющихся восьми килобайт памяти 880 байт отведено под регистры и 6144 байта под программы. Память не перераспределяется между регистрами и программами, но это и не особенно надо (если вам не в лом таскать с собой еще и диктофон, то одной стандартной 90-минутной кассеты хватит на 600-700 килобайт), но если уж приспичило, то можно самому написать две процедуры, одна из которых сохраняет содержимое регистров в конец памяти программ, а другая переписывает обратно. Команды "PEEK NNNN" и "POKE NNNN" позволяют соответственно извлекать и засовывать 1 байт по адресу NNNN (в таком виде команда занимает 6 байт, а в виде "PEEK MR00" только три).

Распределение памяти по адресам

Адреса с 0000 по 0879 заняты под регистры — по 8 байт в следующем порядке: 00-09,F,10-19,1F,... Адреса с 880 по 2046 — системные. Прежде чем менять содержимое по адресу больше 879, подумайте, сколько времени у вас займет восстановление того, что вы потеряете, нажав на RESET. Начиная с адреса 2047 (до 8191) идет память программ. Естественно, она не фрагментируется. Программы в памяти следуют не по номерам, а по времени создания. Адреса (псевдоадреса) с 9980 по 9999 — всякие системные проверки.

Регистры

Числа в регистрах записаны в виде BCD — binary-coded decimal, то есть каждый десятичный разряд закодирован одним шестнадцатеричным разрядом. В первом байте каждого регистра лежит порядок числа (без знака). Если в старшем разряде этого байта стоит A, то в регистре лежит число в виде дроби. Младший разряд второго байта — знаки (знак порядка / знак числа: "+/+"-1, "−/+"-0, "+/−"-6, "−/−"-5), в старшем — 12-я значащая цифра. Обратите внимание: если в первом байте стоит 97h, а младший разряд второго равен 0 или 5, то порядок равен "−3", а не "−97". Значащие цифры идут в следующем порядке: младший разряд восьмого байта, старший разряд седьмого байта, etc. Если в каком-то разряде стоит B — это разделитель дроби. В качестве примера программы, работающей с регистрами через PEEK и POKE, можно привести программу для перевода в простые дроби (так как кнопка "a b/c" работает только при вводе числа, делить два числа с ее помощью не получится; проверить, представимо ли их частное в виде дроби — тоже). Вот она (тело занимает 78 байт, максимальное время работы — 4.8 секунды; более "продвинутая" версия, находящаяся в архиве программ, занимает 105 байт и чуть медленнее работает на небольших значениях числителя и знаменателя, но ее максимальное время работы — 2.4 секунды: почувствуйте разницу с fx-6300G, на котором аналогичная программа работает 2.6 секунды при примерно втрое большей скорости процессора): Min03 = 0 Min06 1 Min05 MR03 Min04 FIX0 M−03 LBL9 Min00 8 Min02 MR06 + MR05 Min06 × MR03 FRAC x=0 GOTO2 1/x Min03 INT = Min05 ABS Min01 × MR04 FIX0 = MinF PEEK MR02 Min07 + 2 = 10^X M+01 162 M+07 MR07 POKE MR02 6 M+02 PEEK MR02 + 176 = POKE MR02 MRF × MR01 = MinF FIX0 x=F GOTO9 LBL0 MR00

Системная область

Вот несколько адресов из системной области, показавшихся мне полезными: 1) по адресам 1241 и 1242 лежит адрес последнего используемого под программы байта, увеличенный на два (в виде HEX, то есть десятичное значение получается при помощи "PEEK 1241 + PEEK 1242 × 256 ="); 2) 1244 — номер исполняемой в данный момент программы (в виде BCD, то есть 16 — это программа номер 10), адреса 1245 и 1246 — адрес первого байта тела этой программы (в виде HEX), 1251 — количество уровней стека подпрограмм на данный момент (BCD); 3) начиная с адреса 1252 — данные стека подпрограмм: под один элемент отводится семь байт, максимум 19 элементов стека, первый байт элемента — номер (BCD), второй-третий — адрес входа (первого байта команды GSB, которая осуществила переход в подпрограмму следующего уровня), пятый-шестой — адрес первого байта тела данной подпрограммы; 4) адреса с 1392 по 1407 — верхняя строчка экрана, при записи в эти адреса меняется ее содержимое; индикатор включения отображения символов верхней строчки находится по адресу 1543 (управлять включением через этот адрес у меня не получилось, но включать можно и не извращаясь: ";"). Ниже приведена таблица символов, используемая в FX-603P (это отображаемые на экране символы, их коды не всегда совпадают с кодами символов, вводимых в программу в ALPHA MODE, и уж совсем никакого отношения не имеют к операторам программы).

Таблица символов FX-603P

Примеры использования системной области:
   1) Пример самомодифицирующейся программы ("+" меняется на "−" и обратно непосредственно внутри программы): AC 15 MinF 1244 Min00 PEEK MR00 ISZ x≥F x=F GOTO16 = LBL1 "My n-r" HLT PEEK MR00 + ISZ PEEK MR00 × 256 + 67 = Min01 77 Min02 76 LBL0 X↔M02 POKE MR01 PEEK MR01 "Change +" PAUSE GOTO0
   2) Программа, выводящая на экран все символы с номером больше заданного: HLT Min01 " " 1407 MinF LBL1 1933 Min00 LBL2 PEEK MR00 DSZ POKE MR00 2 M+00 MR00 x≥F x=F GOTO2 1 M+01 MR01 POKE MRF PAUSE GOTO1
   3) Демонстрация перехода без использования GOTO (подпрограмма /P1/ обеспечивает переход внутри программы старшего уровня, сдвигая адрес входа): /P0/ 3 GSBP1 1 HLT GOTO0 2 HLT LBL0 /P1/ Min01 1251 Min00 + 7 × PEEK MR005 = Min00 255 MinF PEEK MR00 + MR01 = x≥0 x≥F x=F GOTO1 Min01 ÷ 256.5 = FIX0 ISZ + PEEK MR00 = POKE MR00 DSZ MR01 HEX AND MRF = COMP LBL1 POKE MR00 AC
   4) Демонстрация возможности игнорирования меток, находящихся левее оператора GOTO (программа изменяет адрес своего начала на число, большее максимального существующего адреса, в результате чего интерпретатор сразу прекращает поиск метки позади GOTO из-за того, что текуший адрес оказывается меньше адреса начала программы): GOTO0 LBL1 "Label 1" HLT LBL0 33 POKE 1246 GOTO1 LBL1 "Label 2" HLT

Область программ

В начале каждой программы стоит либо символ с кодом от 0 до 9 (это ее номер), либо символ с кодом 234 (он означает, что номер программы больше десяти; тогда следом за ним стоит последний разряд номера). Затем может стоять символ с кодом 236, означающий, что программа защищена паролем (следующие 4 символа). Дальше идет тело программы (при наличии пароля по адресам 1245 и 1246 лежит адрес символа с кодом 236, так что пример самомодифицирующейся программы в запароленном виде будет работать не совсем правильно — в нем поправка на длину пароля не учтена). После последнего байта последней программы идет символ с кодом 255. Информация про пароли взята с http://www.rainbow.ne.jp/~hosomici/FX-603P.htm. Ниже приведена таблица с кодами символов пароля (они совпадают с кодами символов, вводимых в программу в ALPHA MODE). Пожалуйста, не используйте приведенную выше информацию для взлома программ, защищенных авторским правом — это незаконно.

Коды символов пароля FX-603P

Связь с компьютером

Организовать связь с компьютером можно аж тремя способами. Первый, самый простой в реализации и одновременно самый неудобный, использует функцию чтения-записи на магнитофон. В этом случае магнитофон просто заменяется на линейные вход и выход компьютера. Неудобства состоят в невозможности редактирования программ внутри компьютера, необходимости использования звукозаписывающих программ и большом (относительно, конечно) размере получаемых файлов. В этом случае при записи файлов на компьютер вам нужен будет, например, кабель jack-jack 3.5mm и две портняжные булавки (они довольно точно подходят под размер дырок коннектора и не имеют тенденции гнуться при слабых нажатиях). Втыкаете обе булавки в дырки в коннекторе (при записи на компьютер — в 5 и 30; при чтении с него — в 22 и 30; нумерация слева направо и сверху вниз, то есть первая дырка слева вверху, справа от нее вторая, а под второй — семнадцатая), вставляете один jack во вход или выход звуковой карточки, а второй — между булавками так, чтобы база соответствовала 30-му контакту коннектора. Записывать можно, например, в 22050 Hz, Mono, 8 bit (11025 не пробовал). После записи увеличьте громкость на 20-30%, обрежьте начальное "пиииииии" до 1.5-2 секунд, и архивируйте (у меня лучшие результаты показал архиватор Slim — размер архива был в 20 раз больше размера программы в памяти калькулятора). Второй и третий основаны на функциях RSSAVE и RSLOAD, отличаются друг от друга видом кабеля и используемыми программами. Второй: можно спять (или попросить кого-нибудь спаять) кабель для COM-порта и затем работать со стандартной виндовской программой Hyper Terminal. Описания этого кабеля встречаются во многих местах (схемы немного отличаются друг от друга), одно из них — здесь. У меня на старой материнке этот кабель нормально передавал только первые 50-100 байт, потом начинал глючить (видимо, из-за того, что COM-порт не мог выдать 9 вольт постоянного напряжения с требуемым током; впаивать разъем для батарейки 9В в кабель мне было в лом, да он и без того напоминает ежа, т.к. спаял я его "летучкой", а не на плате). На новой материнке кабель работает нормально, но только в одну сторону — с калькулятора на компьютер (почему именно так — ХЗ: то ли где-то спаял плохо, то ли настройки порта не те — разбираться пока было лень). Третий способ показался мне наиболее удобным. Кабель для него не содержит никаких компонентов, кроме проводов, и делается из обычного принтерного кабеля (соединение идет через LPT). Все делают по-разному, я просто приклеил к принтерному окончанию кабеля пластиковую карточку, наклеил в на нее в нужных местах булавки и припаял их к контактам. Получилось немного тяжеловато, но зато конструкция обладает жесткостью. Единственным неудобством этого способа является необходимость работать в чистом DOSе при передаче данных, так как программа (передача возможна только с ее помощью) написана в 1996 году (и только на испанском, но все меню стандартные, так что разобраться несложно). Архив с программой (casio.exe) и краткими инструкциями на русском языке (manual_r.txt) — здесь.

Программы

Программы с этой станицы, а также несколько других, в готовом для передачи на калькулятор виде находятся здесь.



На главную
Вопросы и предложения — сюда


Hosted by uCoz