Напрягли старичка i4040 для расчёта числа Pi - https://habr.com/ru/articles/773780/
0iStalker
Хехе. Я даже не знал, что FDS был по физике процесса даже не дисковод, а стример и чтобы читать/писать нужно было сперва спозиционироваться на начало диска и потом от начала размотать спираль по которой идёт головка чтения/записи чтобы выполнить процесс в нужном месте. Мде...
Внезапно сегодня наткнулся на одну странную странность из самых оснований истории домашних ПК.
Microsoft Basic как известно стал первое время как бы операционной системой для огромной части домашних ПК и был в очень разных машинах.
Начался он на Altair 8800 и я нагуглил дизассемблирование этого чуда (по преданию его отлаживали на созданном эмуляторе под PDP-11): https://github.com/option8/Altair-BASIC/blob/master/BASIC%20disas… ly-source.txt
Интересует следующий фрагмент кода:
FAddMantissas MOV A,M ADD E MOV E,A INX H MOV A,M ADC D MOV D,A INX H MOV A,M ADC C MOV C,A RET
Речь пойдёт про формат вещественных чисел в Microsoft Basic для 8-битных компов.
Про это дело есть статья на вики (англ.): https://en.wikipedia.org/wiki/Microsoft_Binary_Format
Откуда можно почерпнуть, что в начале времён MS Basic исповедовал 32-битный формат: 1 байт под экспоненту и 3 байта под мантиссу. Его еще там называют "BASIC 6 цифр", видимо по среднему числу значащих разрядов.
Код выше как раз складывает мантиссы и мы действительно видим три сложения ADD/ADC который держит в регистровой триаде CDE что-то что складывает с содержимым памяти куда смотрит регистр HL (M в операндах это как бы [HL], а INX H это инкремент HL).
Логично, запруфено.
Здесь еще сразу замечу, что архитектура процедур типа FAdd (частью которой является FAddMantissas) складывает числа откуда то из памяти с переменной FACCUM (4 байта), что есть "аккумулятор для флоатов".
Далее с годами последуют порты MS Basic на MOS 6502 где хорошо повлияют на индустрию порты на PET/Commodore и Apple II и вот опять таки археораскопки модуля работы с вещественными оттуда - аналогичный кусок кода: https://github.com/mist64/msbasic/blob/master/float.s
FADD4: adc ARGEXTENSION sta FACEXTENSION .ifndef CONFIG_SMALL lda FAC+4 adc ARG+4 sta FAC+4 .endif lda FAC+3 adc ARG+3 sta FAC+3 lda FAC+2 adc ARG+2 sta FAC+2 lda FAC+1 adc ARG+1 sta FAC+1 jmp NORMALIZE_FAC5
Тут видно, что имя переменной FACCUM превратилось в FAC, но по сути происходит то же самое, за одним исключением - в некоторых портах MS увеличивает мантиссу до четырёх байт и получает так называемый "BASIC 9 цифр" (5 байт на флоат). В данной реконструкции которая пытается все версии собрать воедино этот фактик контролируется #ifdef-ом.
Важно заметить, что нигде в этом исходном коде не встречается инструкция SED, что будет важно несколько ниже.
Но тут еще можно вспомнить, что пытаясь простимулировать общедоступный открытый компьютер Microsoft плотно участвовала в создании ПК MSX - в том числе и своим бейсиком тоже.
Вернее его вариантом дизассемблинг которого можно найти тут: https://github.com/apoloval/msx-system/blob/master/base200/basic1.asm
Интересует следующий фрагмент еще не проанализированного толком кода:
C2759: LD HL,ARG+7 LD DE,DAC+7 LD B,7 ; Subroutine __________________________ ; Inputs ________________________ ; Outputs ________________________ C2761: XOR A J2762: LD A,(DE) ADC A,(HL) DAA LD (DE),A DEC DE DEC HL DJNZ J2762 RET
Тут своеобразная распрыжка где по умолчанию в цикловой регистр B зашивается 7 и потом идёт сложение по нисходящей семи байт по адресам DAC и ARG с откладыванием суммы в DAC.
Но результат пропускается через DAA - десятичная коррекция результатов.
А начальные процедуры прямо помечены, что DAC это Decimal Accumulator.
Decimal, мать твою, что сорцом подтвержается и подтвержается еще здесь: https://www.msx.org/wiki/BASIC_Routines_In_Main-ROM
Single and double precision digits are stored in BCD format
Внезапно, на MSX мантисса вещественных хранится в BCD и имеется два формата: одинарной и двойной точности. Один байт и там и там под экспоненту и три байта ровно преровно под 6 десятичных цифр в 32-битном формате и ровно 14 цифр в 64-битном формате.
И вот это престранно - никакой десятичной арифметики на i8080 и на MOS 6502 не было! Хотя они на это способны. Но ни десятичной инструкции DAA в сорцах под Altair не встречается как и не встречается инструкции переключения в десятичный режим SED в сорцах под 6502.
Очень странно - в MSX Microsoft почему то переключились на десятичный формат вещественных чисел. Однако! При этом в статье на вики никаких упоминаний про это нет. Вдвойне странно.
=A=L=X=
> И вот это престранно - никакой десятичной арифметики на i8080 и на MOS 6502 не
> было! Хотя они на это способны
Я твою мысль не понял. В Basic для i8080 мантиссы хранятся как обычные двоичные 24-бит, на MSX Basic - как BCD. В чем именно недоразумение?
Dmitry_Milk
> В чем именно недоразумение?
Так а зачем? Какой смысл вообще прибегать к BCD в вещественных? Видно даже, что им пришлось увеличить разрядность до 7 байт на мантиссу чтобы повысить упавшую точность.
Есть только один смысл ныне - для бухгалтерской арифметики - как тип Decimal в современном C#.
Но разве MSX преследовал своей целью быть бухгалтерской машиной?
Насчет зачем перешли на BCD - резон есть, если чаще происходит перевод из строки в плавучку (а в бейсике для i8080, насколько я помню, все чиcла были только плавучкой), чем просто вычисления над плавучкой. Потому что если обычное двоичное представление мантиссы, то перевод из/в строку потребует совершать кучу умножений/делений на 10, а это очень дорого для восьмибиток, не имевших даже умножения байт на байт, а тут еще 24-битное целое. Тогда как для BCD нужно будет только поставить точку в правильном месте и скорректировать порядок.
Dmitry_Milk
> резон есть, если чаще происходит перевод из строки в плавучку
Мне не кажется, что в алгоритмах перевод из числа в строку или обратно это прям какое то слабое место, имхо сами вычисления должны быть наскипидарены, а перевод это уже когда ввод/вывод и не должно быть местом преткновения.
Кстати про перевод я там еще вчера заметил интересную табличку:
J3030: DEFW -10000 DEFW -1000 DEFW -100 DEFW -10 DEFW -1
Она используется в процедуре с заголовком
; Subroutine convert to single precision real ; Inputs HL = integer value
и собственно располагается сразу после тела этой процедуры.
Это явно классический алгоритм двоично-десятичной конверсии когда мы вычитаем порядки десятков наращивая цифру пока не пробиваем ниже нуля чтобы вычислить эту цифру порядка и перейти к следующему разряду.
А всё дело в том, что в MSX числа могут быть аж в трёх форматах - integer, single и double и integer это честное двухбайтовое двоичное число.
The values type must be specified to 0F663h (VALTYP). Value type practically describes how many bytes are used from memory.
VALTYP Description
2 Integer
3 String
4 Single precision number
8 Double precision number
Теперь я понял, что алгоритмы сложения допустим мантисс просто извлекают в регистр счётчика B из VALTYP и так определяют сколько цифр надо в мантиссе той же складывать если это вещественные числа. Но числодробилка их могла обрабатывать намного быстрее целые числа, зато вот при конверсиях возникала теперь задача целые превращать в вещественные медленным алгоритмом.
В общем забавно, забавно.
Для меня это выглядит крайне странно, что в какой то момент MS прямо вот полностью изменила стратегию работы с вещественными на BCD и на 8-битной машине ввела 64-битные double у которых ровно 14 десятичных цифр мантиссы. Это очень по бухгалтерски, как будто машина задумывалась как инструмент работы с финансами, а не просто какой то домашний комп.
В принципе даже в i8087 был некий BCD-формат, но никогда с ним не работал, х/з что там.
Оффтоп конечно, но все равно к ретро относится (эмуляторы).
Прикупил себе консольку миниатюрную, слайдер а-ля PSP Go. Функционал конечно интересный: помимо эмуляции игр с NES, консоль умеет:
1. Видосы, музыку, картинки. 2Гб памяти + слот SD.
2. Работать как вебка (есть камера)
3. Работать как диктофон
4. Работать как портативный дисплей с возможностью подключить тюльпанами двд, видик или тв бокс
5. Выводить картинку на телик
6. Читать электронные книги
За 100 баксов в 2007-2009 годах эт отличный функционал. Мне же девайс достался за 250 рублей.
Vodo4ka
А внутри что за процессор и сколько памяти?
Эмулятор андроид?
revollwars
Не, консоль не на дроиде.
Процессор SPMP4k - предшественник SPMP8k. Судя по всему, MIPS.
Проект под названием Hasm - Human Assembler
В примерах Rom ZX-Spectrum переписана на нём и монитор от Apple I (WozMon)
P.S. Но, с именем Hasm есть и другие языки как к примеру представленный на площадке Tio
https://tio.run/#hasm
Vodo4ka
> Прикупил себе консольку миниатюрную
А что там с консолью своими руками?
master-sheff
> А что там с консолью своими руками?
Проект всё ещё существует, есть несколько предзаказов. Потихоньку в работе, хотелось бы софтварное тридэ туда добавить, дабы была фишка по сравнению с другими похожими DIY-консолями.
Статья на Хабре, от Shiru, о подходе к графике на ретро-платформах
https://habr.com/ru/companies/ruvds/articles/775200/
https://habr.com/ru/companies/ruvds/articles/775202/