Несколько
вопросов/ответов по программированию
на ассемблере
Автор: Anatoly Belankov,
2:5054/2.31@fidonet
Дополнения: Tim N. Tashpulatov и
другие
Q: Как вызывать системные
функции PalmOS?
A: Пpимеpно так: systrap FrmGetObjectPtr(a3.l,d0.w)
Q: Полезные ссылки?
A:
http://homepages.enterprise.net/jmarshall/palmos/
http://www.massena.com/darrin/pilot/tanda.htm
http://www.hig.se/~ardiri/development/palmIII/pilrc/index.html
http://www.wademan.com/Pilot/Program/FAQ.htm
http://www.palm.com/devzone/
Q. Что представляет из себя Pilot в
общих словах ?
A. Piot содержит процессор фирмы motorola MC68328
"DragonBall" с системой команд MC68000 (в знаменитых
Макинтошах использовался процессор серии MC68000).
Устройство вывода - LCD экран размером 160x160 с
возможностью передачи четырех оттенков серого.
Устройство ввода - сенсорная панель (digitizer). Условно
ее можно разделить на две части: одна встроена
прямо в LCD экран, другая расположена ниже и
используется для рукописного ввода текста. Есть
шесть кнопок. Подробнее - см. FAQ.
Q. Где взять документацию по MC68000 ?
A. Искать файл "68000pr.zip". Файлы типа "*um.zip"
cодержат не описание команд, а описание
аппаратуры. Нужно именно "programming reference". Если
вас устроит в формате .pdf - попробуйте посмотреть здесь. Если Вы уже
программировали на ассемблере, изучение нового
процессора будет значительно легче. Если
вас интересует документация для чтения
на Palm, то скачайте 68000 assembler reference в формате JFile database
(m68000.zip)
Еще - зайдите на http://examples.oreilly.com/palmprog/CDROM/
- там находится приложение к книге по
программированию в PalmOS - все собранные в одно место программы
: codewarrior lite, gcc, sdk3.0 и т.д. в подкаталогах и для Windows и для Linux.
Q. А на чем программировать ?
A. Можно рекомендовать программу "Pila" (Pilot
Assembler), которая является бесплатной. Входит в
состав пакета ASDK. Можно достать на http://fluff.home.ml.org
Q. А можно пускать написанные мной
программы не на натуральном пилоте, а на
эмуляторе ?
A. Можно, фирма 3COM официально поддерживает
эмулятор "Pose" (в прошлом "copilot").
Достается в интернете с сайта www.palmos.com/dev
,
бесплатный, доступны исходные тексты. Заодно
нужно найти "debuffer" - отладчик.
Q. А ассемблер для UNIX ?
A. Ну если под UNIX, то доставайте GNU C для Pilot, пишите
на C и не мучайтесь с ассемблером. ;) Есть Pila и под
Linux.
Q. Ничего не понимаю! Изучаю MC68000,
команда "move d0,d1" не работает: регистр d0 не
меняется!
A. В отличие от intel 80x86, z80, etc, в системе команд MC68000
результат помещается в последний операнд, а не в
первый. "move d0,d1" перебрасывает значение
регистрв d0 в регистр d1.
Q. А что за модификаторы после
названия команды .b, .l, .w ?
A. Это типы орерандов: .b - byte (8-bit), .w - word (16-bit), .l - long
(32-bit). Смотри документацию к Pila !
Q. Не работает: "move.w #1,d0; move.w d0,myvar;
move.b myvar,d0". В d0 вместо единицы - ноль !
A. В системе MC68000, в отличие от платформы intel другой
порядок следования старшего и младшего байтов в
памяти. Сначала идет старший, потом младший.
Q. Не знаю, как написать простую
программу.
A. Нужно изучить пример "sample.asm" из комплекта
ASDK или все-таки прочитать руководство
пользователя к Pila.
Q. Где взять описание PalmOS ?
A. В WinSDK - http://www.palmos.com/dev/.
Кроме того, полезны первая и вторая части документации по PalmOS 3.0,
переведенные из .PDF в формат Doc
Алексеем Пиялкиным (использовался Конвертер GNU info ->
Doc (info2doc.c).
Q. Нашел все ref*.zip, ничего не понятно.
Нет примеров, ничего не работает.
A. Насчет скудности информации согласен. Если
сравнить ref*.pdf с win32sdk.hlp - небо и земля. Видимо,
создатели документации хотели уложиться в
некоторый объем. Главное - узнать
идеологию и способы решения различных задач в
PalmOS.
Q. Пишу программу на ассемблере, уже
что-то получается, но глючит. Портятся регисты
при вызове системных функций (systrap). Что делать ?
A. В документации к Pila говорится, что системные
функции сохраняют значения всех регистров, кроме
A0,A1,D0 и D1. Но из жизненного опыта следует, что это
не всегда так. Например, "FrmInitForm" портит
содержимое региста D2. Это может зависеть от
версии OS. Рекомендуется хранить "долгоживущие"
переменные с индексом, большим 1 (незабывая про
специальное назначение A5,A6,A7), или сохранять их в
стеке, или использовать переменные в памяти.
Q. Почему не работает: "systrap
abc(d0.w,(a7)+.w,d1.w)" ?
A. Посмотрим, во что преобразуется эта строчка: (вообще,
полезно делать листинг транслируемой программы)
move.w d1,-(a7)
move.w (a7)+,-(a7)
move.w d0,-(a7)<br>
trap ...
Значение регистра a7 после выполнения первой
строчки уже изменилось!
Q. Почему программа с формой не
работает ?
A. а) забыли вставить ресурсы в *.asm
б) забыли перекомпилировать ресурсы
в) проверьте идентификаторы ресурсов
г) ...
Q. Как передать в параметре вызова
адрес процедуры (например MyFormHandler) ?
A. systrap TrapName(.. , &MyFormHandler(pc) , ..)
Q. А как загрузить в регистр a0 адрес
процедуры ?
A. lea.l MyFormHandler(pc),a0
Q. Пишу Handler для формы, к принципе
работает, но местами с глюками. Подозреваю, что
нужно сохранять значения используемых регистров,
но информации по этому - ноль.
A. В таких случаях полезно потрассировать
программу вглубь OS. Поставьте в конец Handler`а
команду "trap #8" и запустите дебаггер.
Командой step Вы перейдите в код системы, который
вызвал ваш Handler. Видно, что далее система вызывает
FrmHandleEvent(a2.l,a3.l), при этом регисты a2 и a3 "по пути"
нигде не устанавливаются. Т.е. портить эти
регисты уже нельзя. Поэтому, на всякий случай,
всегда сохраняйте, а затем восстанавливайте
используемые регистры. Это делается просто: (пример)
Сохранение: move.l d1-d7/a1-a4,-(a7) Восстановление: move.l
(a7)+,d1-d7/a1-a4
Q. Трудно ли программировать на
ассемблере для PalmOS ?
A. Значительно легче, чем под MSDOS в том смысле, что
PalmOS содержит не только системные функции, но и
прикладные. Например, работа со строками,
вещественными числами, отладка и т.п.
Q. Хочу использовать "строковый"
вызов StrNCopy, а он не описан в "pilot.inc". Что
делать ?
A. В программу EZAsm входит файл "funcs" с
описанием функций вплоть до PalmOS 3, в каждой строке
находится имя функции и несколько чисел. Первое -
непонятно, зачем. :) Второе - номер функции (чтобы
описать функцию, нужно в "pilot.inc" добавить
строчку: "SysTrap<имя_функции> equ (40960+это_второе_число)".
Далее идут размеры аргументов в байтах. Это очень
полезная штука, рекомендую туда поглядывать.
Q. О! А EZAsm - это почти язык C ?
A. EZAsm мне напомнил C-- для IBM PC. Если Вы только
начинаете программировать под MC68000, то лучше
пишите на обычном ассемблере, а то нахлебаетесь
багов по самое нехочу.
Q. Программа "вылетает" по
ошибке на строчке "move.w myvar(a5),d0". Все
правильно, не могу понять, почему.
A. Небайтовые данные должны быть выровнены (начинаться
с адресов, кратных двум или четырем). Иначе
возникает исключение процессора. Используйте
слово "align" для выравнивания данных.
Q: Как m68k-palmos-gdb заставить работать вместе с pose?
A: Так ить в доках написано...
$ m68k-palmos-gdb MyProg
...
(gdb) b MyProg.c:123
...
(gdb) target pilot localhost:2000
....
Hаличие образа ROM со словом "debug" в названии совершенно необязательно,
я-бы даже сказал вредно - тормозит лучше. :)
Q: Где-то в сети валяются исходники хака на
С?
A: Поищи поисковиками файл samplehack.zip
Q: Как получить информацию о памяти и
доступности серийного номера?
A: Серийный номер доступен через PalmOS
API начиная с PalmOS 3.0. RTFM:
Err MemCardInfo(UInt cardNo, Char* cardNameP, Char* manufNameP, UInt16*
versionP, UInt32* crDateP, UInt32* romSizeP, UInt32* ramSizeP, UInt32*
freeBytesP);
посмотри, что у тебя возвращается. Если возвращается все правильно (8Mb), то
тогда.... в принципе, для получения серийного номера
есть sysGetROMToken, для m100 серийный номер отсутствует и в буфер записывается 0xff. Если твой гадский
программ после этого считает, что это m100 и ramSize = 2Mb, можешь подставить
какой-либо серийный номер через соответствующий системный трап. С
точки зрения программирования - это задача гораздо более простая, чем написать CyrHack на
асме :)))))))
Q: Чем редактировать шрифты в
PalmOS?
A:
http://www.palmos.com/devzone
http://www.massena.com
http://www.sergem.net - виндовый редактор шрифтов
http://www.symbioforge.com/fe - пальмовый редактор; там же статья об устройстве
шрифтовых ресурсов
http://www.pilrc.com - сырцы работы со структурой шрифта.
Q: А на чем народ формы визуально делает под FreeBSD?
A: ну нашел тут... эээ... зато мультиплатформенное... эээ...ну... эээ... хоть работает... эээ... только вот... эээ...в
общем www.wn.com.au/rnielsen/pilrcedit/
|