avva: (Default)
[personal profile] avva
(эта запись может быть интересна программистам)

1. Последняя версия GW-BASIC от Майкрософта - 1987 года - лежит на этом сайте. Там же можно скачать документацию языка и всех встроенных функций, хотя удобнее это читать здесь. Это был мой первый язык программирования, не считая калькуляторов - если точнее, я учился на варианте MSX-BASIC для Ямахи. GW-BASIC прекрасно запускается внутри DosBox. Все работает.

Напомню разницу между ним и гораздо более популярным поздним QBasic: в GW-BASICе обязательны номера строк и нет блоков кода или сабрутин: точнее, последние, конечно, реализуются с помощью команд GOSUB/RETURN, но их невозможно объявить командой SUB или вызывать по имени. QBasic это по сути дела язык структурированного программирования, просто похожий по синтаксику на Бейсик; GW-BASIC по духу есть классический Бейсик как его придумали в середине 60-х.

2. Недавно возник и ширится феномен "фантазийных консолей", среди которых самая заметная - Pico-8. Это как бы эмулятор несуществовавшей на самом деле никогда игровой консоли, с типичными для начала-середины 80-х ограничениями по памяти, резолюции "экрана" и цветам. У него нет, однако, своего вымышленного "процессора" с машинным кодом, вместо этого код пишется на Lua. Я сам еще не пробовал, но собираюсь посмотреть, выглядит симпатично.

3. Несколько лет назад мне попадался код ранней версии Паскаля 1973 г. - исходники компилятора, который в частности сам себя компилирует. Помню, что эти файлы были непричесаные - в них есть несколько мелких ошибок, и даже если поправить их, современный FreePascal их не понимает - несколько идиом в языке изменились. Сегодня мне попался отличный сайт, где во-первых эти файлы доведены до ума (The P2 Compiler), а во-вторых выложена версия еще более раннего варианта Паскаля, упрощенной версии 1972 г. - Pascal-S.

Обе эти версии компилируют Паскаль во внутренний байт-код, который потом интерпретируют. Вторая особенно миниатюрна, и код компилятора легко можно прочитать и понять. Автор страницы рассказывает на ней об очень забавной "ошибке", которую он обнаружил в компиляторе Pascal-S. Численная переменная в исходном коде во время интерпретации байт-кода хранится в виде variant record - паскалевского аналога union в C, т.е. в одном и том же месте хранится либо целое число, либо действительное, либо булевое значение итд. в зависимости от типа. Нужно проверить тип, чтобы знать, что именно хранится и как с ним обходиться. Так вот, когда компилятор видит одноместную операцию - (минус) в применении к целому или действительному типу, он генерирует байткодовую инструкцию 36, которая всегда применяет минус к целому значению переменной, не проверяя ее тип. Т.е. по идее, если определить переменную с плавающей точкой X, и написать -X, то во время интерпретации скомпилированного кода программа должна сгенерировать отрицание целого значения, которое она "прочитает" там, где записано на самом деле действительное, и выйдет бред.

Но при этом все работает!

Оказалось, что в компьютере CDC 6600, для которого это все писалось, было хитрое представление чисел с плавающей точкой. Машинное слово в нем занимало 60 бит, первые 48 была мантисса, потом 11 бит экспоненты, а последний бит - *знак* экспоненты. Кроме того, в этом компьютере отрицательные числа представлялись с помощью ones'-complement, а не two's-complement, как принято сегодня. Для изменения знака числа надо было полностью его инвертировать, и все. В результате число с плавающей точкой вело себя для некоторых операций подобно целому. Если сделать вид, что оно целое, и инвертировать, то мантисса отдельно инвертируется, экспонента отдельно тоже, но и *знак* экспоненты - отдельный бит, специально для этого добавленный - тоже, и поэтому значение экспоненты не изменится. Красиво!

В CDC-6600 было вообще немало интересных вещей. Например, работа с памятью там обычно была устроена так: были регистры X0-X7 и A0-A7. Помещение любого значения в один из регистров A1-A5 автоматически вело к считыванию из памяти по этому адресу в соответствующий регистр X1-X5 - не нужно было отдельной инструкции для работы с памятью. Помещение любого значения в регистры A6,A7 вело соответственно к записи в память по этому адресу содержимого X6 или X7. Это объясняет, почему руководство по ассемблеру CDC-6600 "посвящается A6 и A7, без которых ничего из полученного в данной книге нельзя было бы сохранить". Вся документация есть тут: http://ygdes.com/CDC/cdc6600.html

Это заставило меня задуматься о том, что неплохо бы "фантазийные консоли" подобно упомянутой выше Pico-8 писать также для вымышленных "странных" архитектур. Я никогда не работал с машиной на основе ones'-complement - было бы интересно попробовать. Скажем, с 14-битным машинным словом, что дает 16K ячеек памяти (но в каждой ячейке лежит 14 бит). Настоящим ассемблером, вдохновленным реальными старыми машинами, а не просто Lua. И так далее.

Date: 2017-04-20 10:43 am (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner
Так может сразу сделать консоль с системой команд MIX-1009?

Date: 2017-04-20 11:04 am (UTC)
From: [identity profile] avva.livejournal.com
можно. Но нужно придумать и прикрутить какой-то HW-интерфейс к экрану, клавиатуре и гейм-контроллеру. Причем экран желательно со спрайтами.

Date: 2017-04-20 11:57 am (UTC)
From: [identity profile] ledernierheros.livejournal.com
Спрайтами как в V9938? ;-)

Date: 2017-04-20 12:10 pm (UTC)
From: [identity profile] avva.livejournal.com
например, да :)

Date: 2017-04-20 11:10 am (UTC)
livelight: (lightning)
From: [personal profile] livelight
На x86 тоже вовсю развлекались целочисленной арифметикой для плавающих чисел.
Быстрый обратный квадратный корень так делает, например.
Ну и изменением знака плавающего (float или double) числа с помощью инверсии старшего бита без захода в математический сопроцессор тоже все пользовались.

Date: 2017-04-25 10:46 pm (UTC)
From: (Anonymous)
Целые форматы 2-адические, в том смысле, что если

1 = 00000001, то
-1 = 11111111, а вовсе не 10000001.

Поэтому инверсией одного бита знак не поменять.

Неужели знак у float и double устроен иначе?

Date: 2017-04-26 08:15 am (UTC)
livelight: (Default)
From: [personal profile] livelight
Форматы плавающих чисел согласно стандарта IEEE 754 таковы, что мантисса хранится отдельно от знакового бита, и для преобразования (f -> 0-f) надо поменять ровно один бит.

Date: 2017-04-20 11:33 am (UTC)
From: [identity profile] notes4myfamily.livejournal.com
Спасибо!!!!!

Date: 2017-04-20 04:49 pm (UTC)
From: [identity profile] janatem.livejournal.com
Довольно странная представление чисел: по сути, теряется целый бит из шестидесяти лишь ради того, чтобы удобно реализовывать унарный минус.

Ямаха

Date: 2017-04-20 06:19 pm (UTC)
From: (Anonymous)
" я учился на варианте MSX-BASIC для Ямахи"
ооооо... Ямаха, как много в этом звуке... не в Таллинне случайно?

Re: Ямаха

Date: 2017-04-20 06:21 pm (UTC)
From: [identity profile] avva.livejournal.com
Нет, в Житомире :) но они по всей СССР были.

Date: 2017-04-23 06:53 am (UTC)
From: (Anonymous)
Кстати, можно Вас спросить: а что Вы думаете об Обероне, или компонентном Паскале? Вот, vteninn@lj его рекламирует как наиболее профессиональную связку синтаксиса и компилятора
_http://vteninn.livejournal.com/442856.html

Date: 2017-04-24 07:39 am (UTC)
From: [identity profile] ackforstpdcmnts.livejournal.com
14-битным машинным словом, ассемблером из 30 команд и одним рабочим регистром можно насладиться на ранних сериях микроконтроллеров Microchip.

Как пример особой упоротости (в хорошем смысле слова) запомнился boulder dash на чипе чуть мощнее, с софтварным vga, звуком и 4-битным графеном.

Но это ближе к демосцене, наверно, а не к теме поста.
Edited Date: 2017-04-24 07:43 am (UTC)

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
2829 30 31   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 2nd, 2026 10:12 am
Powered by Dreamwidth Studios