Электроника МК-85

Digital Equipment Corporation PDP-8 & PDP-11 (а также совместимые с последним советские ЭВМ на 1801ВМ1/2/3)

Moderator: Shaos

User avatar
Клапауций
Banned
Posts: 412
Joined: 29 Jun 2018 08:48

Re: Электроника МК-85

Post by Клапауций »

результат тестов:

Code: Select all

DEG SIN 1e-2047 :ERR3 P9-30
RAD SIN 1e-2049 :ERR3 P9-30
GRA SIN 1e-2047 :ERR3 P9-30

DEG COS 1e-2047 :ERR3 P9-30
RAD COS 1e-2049 :ERR3 P9-30
GRA COS 1e-2047 :ERR3 P9-30

DEG TAN 1e-4094 : OK!
RAD TAN 1e-4094 : OK!
GRA TAN 1e-4094 : OK!
сообщение об ошибке ссылается на эту программу теста:

Code: Select all

10 DEFM 0:SET 10:A=1e-1
20 MODE 5 // MODE 4, MODE 6
30 B=TAN A // B=SIN A, B=COS A
40 CSR 0,:PRINT A;
50 IF A=1e-4094; PRINT " OK!"
60 A=A*1e-1
70 GOTO 30
вначале огорчился, что функции SIN, COS таки не исправились, но всё не так как на самом деле...
если посмотреть в комментах https://gitlab.com/nedopc/mk85/blob/mas ... e/mk85.src формулы вычисления SIN, COS через TAN

Code: Select all

SIN(x) =  TAN(x) / SQR(1+TAN(x)^2)
COS(x) = 1 / SQR(1+TAN(x)^2)
и попробовать вычислить в режиме калькулятора , например DEG TAN(1e-2047)^2, то - таки, ERR3.
т.е. это не разрушающий баг, а фича формулы вычисления SIN, COS и сабж адекватно на неё реагирует, воспроизводя сообщение об ошибке, что результат вычислений превысил допустимые границы представления чисел.

~~~~~~~~~~~~~~~~~~~~~~~
итого в сухом остатке:
32-х летний баг ликвидирован.
всем спасибо.
я счастлив. :mrgreen:
~~~~~~~~~~~~~~~~~~~~~~~
User avatar
Клапауций
Banned
Posts: 412
Joined: 29 Jun 2018 08:48

Re: Электроника МК-85

Post by Клапауций »

да, и забыл пока тестил главное - запуск TEST вызывает сообщение "Дефект ПЗУ".
особо не принципиально, но...

Code: Select all

;calculated checksum
;ckecksum OK
не окей.
User avatar
piotr433
Novelist
Posts: 49
Joined: 14 Aug 2018 14:30
Location: Szczecin, Польша

Re: Электроника МК-85

Post by piotr433 »

Я забыл обновить контрольную сумму. Исправил, файл rom_image.zip обновлён.
Спасибо за проверку!
User avatar
Клапауций
Banned
Posts: 412
Joined: 29 Jun 2018 08:48

Re: Электроника МК-85

Post by Клапауций »

piotr433 wrote:Я забыл обновить контрольную сумму. Исправил, файл rom_image.zip обновлён.
Спасибо за проверку!
спасибо - теперь всё ОК.
User avatar
Клапауций
Banned
Posts: 412
Joined: 29 Jun 2018 08:48

Re: Электроника МК-85

Post by Клапауций »

пока народ не разбежался - есть ещё вопрос:

претензии чисто косметического характера.

делаем 0.001 EXE - результат: 0.001
делаем 0.0001 EXE - результат: 1e-4

вопрос:
почему результат выполнения 0.1 EXE не 1e-1 ?
или
почему результат выполнения 0.000000001 EXE не 0.000000001 ?

в чём сакральная суть перехода на формат 1e-x представления числа начиная с x>3, а не сразу или когда число перестаёт помещаться в экран?
User avatar
Клапауций
Banned
Posts: 412
Joined: 29 Jun 2018 08:48

Re: Электроника МК-85

Post by Клапауций »

piotr433, Shaos, нужно где-то опубликовать исправленную версию ROM.
с подробным описанием исправленного.
т.к. баг довольно критический и подозреваю, что многие на него наступали, но не понимали, что вообще происходит.
User avatar
piotr433
Novelist
Posts: 49
Joined: 14 Aug 2018 14:30
Location: Szczecin, Польша

Re: Электроника МК-85

Post by piotr433 »

К сожалению, моя модификация портит функцию EXP :(
Я ещё подумаю.
User avatar
Клапауций
Banned
Posts: 412
Joined: 29 Jun 2018 08:48

Re: Электроника МК-85

Post by Клапауций »

ок. не буду мешать.
User avatar
piotr433
Novelist
Posts: 49
Joined: 14 Aug 2018 14:30
Location: Szczecin, Польша

Re: Электроника МК-85

Post by piotr433 »

Кстати, с оригинальным ПЗУ, функция ATN тоже выдаёт неправильные результаты для аргументов < ±1E-127
User avatar
Клапауций
Banned
Posts: 412
Joined: 29 Jun 2018 08:48

Re: Электроника МК-85

Post by Клапауций »

piotr433 wrote:Кстати, с оригинальным ПЗУ, функция ATN тоже выдаёт неправильные результаты для аргументов < ±1E-127
дело в том, что мой тест проверяет не правильность вычислений, а катастрофическое поведение сабжа визуально - зависание, перезагрузка, ошибки.

Code: Select all

10 DEFM 0:SET 10:A=1e-1
20 MODE 5
30 B=ATN A
40 CSR 0,:PRINT A;
50 IF A=1e-4096; PRINT " OK!"
60 A=A*1e-1
70 GOTO 30
этот тест функция ATN проходит.

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

или иначе, что бы вызов из консоли

Code: Select all

mk85m RAD ATN(1e-127)
возвращал результат ATN(1e-127) вычисленный эмулятором.
тогда будет проще работать с эталонным вычислителем.
User avatar
piotr433
Novelist
Posts: 49
Joined: 14 Aug 2018 14:30
Location: Szczecin, Польша

Re: Электроника МК-85

Post by piotr433 »

Может так будет лучше:

Code: Select all

3A9E: jmp @#3FEA

3FEA: mov 10(sp),r0
3FEE: cmp r0,#FFC0
3FF2: bpl 3FF8
3FF4: mov #FFC0,r0
3FF8: sub r0,r1
3FFA: jmp @#3A48
для проверки правильности вычислений нужно дописать в эмулятор подключение к эталонному программному вычислителю и сравнивать, переменную B из теста с external_B вычислителя.
Попытаюсь дописать.
You do not have the required permissions to view the files attached to this post.
User avatar
Клапауций
Banned
Posts: 412
Joined: 29 Jun 2018 08:48

Re: Электроника МК-85

Post by Клапауций »

piotr433 wrote:Попытаюсь дописать.
что бы особо не заморачиваться - пусть PRINT просто печатает в текстовый файл print.txt, лежащий в папке с исполняемым файлом эмулятора, где CSR будет указывать - с какого места новой строки печатать, если CSR не выполняется, то - печатать всё подряд.
User avatar
Клапауций
Banned
Posts: 412
Joined: 29 Jun 2018 08:48

Re: Электроника МК-85

Post by Клапауций »

piotr433 wrote:Может так будет лучше:
ок. спасибо.

на первый взгляд - всё хорошо.

*тут ещё проблема найти эталонный вычислитель, т.к. виндовый дефолтный калькулятор делает градус sin(1e-200) = 0
поэтому, прошу пока подаяний на паперти http://www.wolframalpha.com
User avatar
piotr433
Novelist
Posts: 49
Joined: 14 Aug 2018 14:30
Location: Szczecin, Польша

Re: Электроника МК-85

Post by piotr433 »

на первый взгляд - всё хорошо
Я всё-таки решил сделать это ещё раз по-другому. Недостатки оригинального кода в диапазоне адресов 0x3A30-0x3AA2 возникают из-за хранения двух информации в одном регистре R1:
1. бит 15 - флаг требования дополнительного сдвига на одну цифру
2. младший байт - количество сдвигов на две цифры (здесь наступает переполнение)
Я переписал всю проблематическую подпрограмму. Приведённая модификация хранит количество сдвигов в полном 16-битном регистре R1, а флаг хранится на стеке.

Code: Select all

; function used by the EXP and LN procedures, M=B*10^(-J+offset)
	sub	#7,r5		;r5 points to the multiplicand B
	mov	r5,r2
	sub	#8,r2		;r2 points to the modifier M
	movb	(sp),r1		;iteration counter J
	sub	10(sp),r1	;offset to the table of constants
	asr	r1
	ror	-(sp)		;mark odd (-J+offset)
; M = B/10^(2*r1)
L3A48:	mov	#8,r0
L3A4C:	tst	r1
	ble	L3A54
	clrb	(r2)
	br	L3A62
L3A54:	movb	(r5),(r2)
	dec	r5
	bit	#1,r5
	beq	L3A62
	add	#4,r5
L3A62:	dec	r2
	bit	#1,r2
	beq	L3A6E
	add	#4,r2
L3A6E:	dec	r1
	sob	r0,L3A4C
;
	tst	(sp)+
	bpl	L3A8A		;skip if (-J+offset) is even
; M = M/10
	dec	r2
	mov	#4,r0
L3A7C:	sub	#8,r2
	ror	(r2)+
	ror	(r2)+
	ror	(r2)+
	ror	(r2)+
	sob	r0,L3A7C
;
L3A8A:	mov	r3,r5
	sub	#A,r5
	jmp	@(r4)+

; function used by the TAN and ATN procedures, M=A*10^(-2*J+offset)
	add	#3,r5
	mov	r5,r2
	sub	#12,r2
	movb	(sp),r1		;iteration counter J
	sub	10(sp),r1	;offset to the table of constants
	clr	-(sp)
	br	L3A48
что бы особо не заморачиваться - пусть PRINT просто печатает в текстовый файл print.txt, лежащий в папке с исполняемым файлом эмулятора, где CSR будет указывать - с какого места новой строки печатать, если CSR не выполняется, то - печатать всё подряд.
Но это не будет просто. Эмулятор ничего не знает про команды Бейсика PRINT или CSR, может лишь нажимать кнопки, записывать и читать память (например буфер строковой переменной $), перехватить данные для контроллера ЖКИ.
виндовый дефолтный калькулятор делает градус sin(1e-200) = 0
Для малых величин X, sin(X) = X и tan(X) = X (в радианах).
прошу пока подаяний на паперти
Ой, прошу пояснения.
You do not have the required permissions to view the files attached to this post.
Last edited by piotr433 on 17 Aug 2018 11:30, edited 2 times in total.
User avatar
Клапауций
Banned
Posts: 412
Joined: 29 Jun 2018 08:48

Re: Электроника МК-85

Post by Клапауций »

piotr433 wrote:Недостатки оригинального кода в диапазоне адресов 0x3A30-0x3AA2 возникают из-за хранения двух информации в одном регистре R1:
понятно. спасибо за развёрнутый ответ о причине бага и способе его решения.
piotr433 wrote:Но это не будет просто. Эмулятор ничего не знает про команды Бейсика PRINT или CSR...
ок. ну, тогда ничего сделать и не получится - если эмулятор управляет чёрным ящиком.
piotr433 wrote:Для малых величин X, sin(X) = X и tan(X) = X (в радианах).
и, в радианах майкрософт считает 1e-200 достаточно малой величиной, что бы приравнивать её к 0.
piotr433 wrote:Ой, прошу пояснения.
там у них считается всё коммерческим и если проявлять чрезмерную активность запросов, то они ничего не говорят, а начинают сокращать варианты выдаваемых ответов.
поэтому я стараюсь не наглеть.