эмуляция и разработка программ для HP48


 Еще один диковинный 4битный кирпич. Начал с установки эмулятора, сложнее оказалось с образом ROM. Нашел сайт с описанием установки. Emu 1.57 понадобится для того, чтобы взять отсутствующую в новой версии 1.64 утилиту Convert.rexe. Скачал, запустил эмуль, стал разбираться с запуском программ, скачанных с архива. Запустилось намело программ, достаточно  перетащить файл на окно и нажать клавишу EVAL. Как быть  с файлами *dir/*.lib не разобрался сразу, на форуме подсказали знающие люди.


Перетащить файл на окно, появится список программ

Нажать клавишу ['] (1)

 Нажать клавишу [α] два раза. (2)

Ввести слово DEMO (можно набирать с клавиатуры)

Нажать клавишу [STO] (3)

Нажать клавишу [VAR] (4)

В нижнем меню появится список со словом DEMO. нажать кнопку A, в появившемся списке выбрать программу.

Архив тут


С разработкой пошло не так гладко, старая версия Saturn Assembler под msdos никак не хотела компилировать исходник, жалуясь на отсутствующий файл. Взял новую версию hptools, теперь линкер стал ругаться на плохие данные объектного файла entries.o. Взял файл и скомпилировал заново. У исходника Entries.a некоторые метки отсутствуют, можно добавить нужное и скомпилировать заново. Перерыл массу архивов с примерами, но никак не получается программа, либо sasm ругается на синтаксис. День мучений, и я получил результат

NIBASC /HPHP48-A/
CON(5) =DOCODE
REL(5) Fin
GOSBVL #0679B *1
LCHEX #003E8
D0=(5) #800F5
DAT0=C A
LCHEX 00000
D0=(5) #800FA
DAT0=C A
LAB0
LCHEX #003E8
D0=(5) #800FA
A=DAT0 A
?C>A A
GOYES LAB1
GOTO LAB2
LAB1
D0=(5) #800FA
C=DAT0 A
D=C A
D0=(5) #800F5
C=DAT0 A
GOSBVL #017A6
GOSBVL #067D2
LAHEX #800F5
D0=A
LCHEX #000C8
D0=(5) #800FA
A=DAT0 A
C=C+A A
DAT0=C A
GOTO LAB0
LAB2
GOSBVL #067D2
A=DAT0 A
D0=D0+ 5
PC=(A)
Fin
END

Причина была в отсутствии заголовка для программы - первые три строки. Для удобства я переписал батник:

set nam=draw
echo TITLE pizda >%nam%.m
echo OU %nam% >>%nam%.m
echo LL %nam%.lr >>%nam%.m
echo SU XR >>%nam%.m
echo SE entries.o >>%nam%.m
echo RE %nam%.o >>%nam%.m
echo END >>%nam%.m
del %nam%
sasm -e %nam%.s
sload -H %nam%.m
pause

Удобнее вписать в первую строку имя файла, тогда компиляция даст готовый файл.  Для удобства формируется текстовый файл %nam%.m, который нужен линкеру sload.exe
После компиляции файл перетаскивается на окно эмулятора и для запуска надо нажать кнопку [EVAL].

Если язык RPL кажется более привлекательным, то понадобится rplcomp.exe

Документации по ассемблеру не так уж и много, я сложил найденное в архив в папку docs_cpu.

У 4-битного проца есть 9 64-битных регистра: A,C - регистры общего назначения. Для них можно заносить значения, выполнять операции и с другими регистрами - B и D. регистры R0-R4 предназначены для хранения каких-либо данных. 20-битные регистры D0 и D1 используются для доступа к памяти. С другими пока не разобрался. С командами нужно быть аккуратными, так как они требуют размерность данных - B-8бит, A-20 бит. Одна ошибка, и все пойдет не так, как планировалось. Для доступа к экрану есть разные способы, которые описаны в примерах и в документации. А для RPL все гораздо сложнее, нужно прочитать немало страниц, чтобы написать нужную программу.
А я пока приступаю к чтению доков, чтобы до конца разобраться в опкодах.

Дополнение. Как открыть библиотеки(*.lib) После того, как либа открыта, на экране появляется надпись на стеке Library: 1075.... Нужно ввести :0:1075, нажать [Enter], потом [STO]. Выключить калькулятор(для Emu48 сбросить и нажать кнопку [ON]). Нажать RightShift(Кнопка с зеленой стрелкой направо).
Покопался в программах, нашел один участок кода и переписал свою процедуру построения точки:

         NIBASC  /HPHP48-A/      Binary download header
CON(5) =DOCODE
REL(5) Fin

* bottom menu off
D0=(5) #00128
LCHEX 3F
DAT0=C B
* video address
GOSBVL =D0->Row1 * D0,A[A] -> top left corner of display
R0=A.F A
D0=A
* clear screen
LCHEX 87
A=0 W
CL DAT0=A W
D0=D0+ 16
C=C-1 B
GONC CL

* test plot
LAHEX 00000
B=A A
* LL GOTO LL
TP
A=0 M
A=B A
C=B A
GOSUB PLT  * C=y,A=x
B=B+1 B
LCHEX 40
?B<C B
GOYES TP
KK GOTO KK
RTN
PLT
D=C A
DSL A * D*16
D=D+C A * D*17
D=D+D A * D*34
C=R0 A
D=D+C A
* X
LCHEX 00003
C=C&A A
CBIT=1  3
P=C 0
LCHEX #12481248
P= 0
CDEX A
ASRB A
ASRB A
A=A+C A
D0=A
CDEX A
A=DAT0 S
A=A!C S
DAT0=A S
RTN

Fin
END




Комментарии