Palm (Pilot)
Клуб пользователей, Санкт-Петеpбуpг
 ENLiGHT Project. Новости об информационных технологиях, науке, авиации и космонавтике

ENLiGHT Project

оглавление | новости от ib/news | другие проекты | www.palmgear.com | письмо | win koi lat

Несколько вопросов/ответов по программированию на ассемблере
Автор: 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/

Если вы хотите дополнить FAQ - пожалуйста пишите. Ваши вопросы и ответы по e-mail могут быть помещены в форум или опубликованы в FAQ.

design/collection/some content by Frog,
PALM FAQ (C) Frog 2000-2003,
"PALM FAQ, http://www.enlight.ru/pilot/".