nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

QuatCore: выводим показания дальности

Вот теперь у нас есть все "ингредиенты", чтобы показать дальность в "терминале" (а позже - и на ЖК-экранчике) в понятном для человека виде:



На удивление радостно видеть эту строчку - все разрозненные части работы потихоньку стягиваются воедино.


Вот код программы. (Процедуры print и SignedFixed / UnsignedFixed (надо будет придумать имена получше) не приводим, они были описаны здесь)

;учимся отображать значение дальности, а в дальнейшем - и углов
%include "Win1251.inc"
.rodata
	DistStr	dw	'Д','а','л','ь','н','о','с','т','ь',':',' ',-32768
	BCDtable	dw	1,10,100,1000,10000
	EXPtable	dw	5000,10000,20000,4000,8000,16000,32000,6400,12800,25600
	OurExp	dw	9
	OurTx	dw	38377
	OurTy	Int16	-26
	OurTz	Int16	2
.data
	Stack	dw	?,?,?,?
.code
	main proc
		SP		Stack
		X		DistStr
		CALL		print		;написали "Дальность: "
		k		0		;теперь готовим число к отображению
		X		OurExp
		i		[X+k]		;i=[OurExp]
		Y		EXPtable
		C		[Y+i]		;положили в C правильный множитель
		Acc		18
		SUB		i
		DIV2		Acc
		DIV2		Acc		;в аккумуляторе лежит правильная позиция дес. точки
		i		Acc
		X		OurTx
		MULU		[X+k]		;умножаем беззнак. [OurTx] на беззнаковый же множитель. Результат в акк.
		CALL		UnsignedFixed	;вроде всё
		UART0		13
		UART0		10	;перевод строки. Хотя для ЖК придётся по-другому работать.
		@@endless: 	JMP 	@@endless
	main endp


Когда нужно работать с конкретными областями в памяти, причём всего с одним конкретным числом, а не с матрицей/вектором/кватернионом, код для QuatCore выглядит как выбросившийся на берег кит. Нельзя просто взять и загрузить конкретную ячейку из памяти - нужно её адрес положить в один из базовых регистров (X/Y/Z), занулить один из индексных регистров - и только после этого загружать.

Ну да ладно, в целом работает. Инициализируем стек, печатаем строку "Дальность: ". Мучительно, в 3 строки, загружаем экспоненту в регистр i. Ещё в 2 строки - правильный множитель из таблицы EXPtable (это уже не так плохо). Затем вычисляем выражение



указывающее позицию десятичной запятой. Могли бы того же самого добиться ещё одной таблицей на 10 ячеек, но решили, что так чуточку компактнее.

Наконец, загружаем "мантиссу", умножаем её на выбранный множитель - и запускаем вывод числа на экран.


На самом деле, мы пока немножко не то вывели. Правильнее из значений OurExp, OurTx, OurTy, OurTz получить длину вектора и два угла - и отображать именно их! Мы пока что сжульничали и показали OurTx - "продольную компоненту". Так что ещё предстоит чуть-чуть покопаться.
Tags: ПЛИС, математика, программки, работа, странные девайсы
Subscribe

  • Нахождение двух самых отдалённых точек

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

  • Слишком общительный счётчик

    Вчера я чуть поторопился отсинтезировать проект,параметры не поменял: RomWidth = 8 вместо 7, RamWidth = 9 вместо 8, и ещё EnableByteAccess=1, чтобы…

  • Балансируем конвейер QuatCore

    В пятницу у нас всё замечательно сработало на симуляции, первые 16 миллисекунд полёт нормальный. А вот прошить весь проект на ПЛИС и попробовать "в…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 4 comments