Чем не флопик

2026-03-09 18:23
vak: (Default)
[personal profile] vak
На самом деле это флешка. Точнее корпус для NVMe накопителя.

vak: (Бодхидхарма)
[personal profile] vak
Не перевелись ещё часы на земле калифорнийской? Ан нет, уже перевелись. 😀

circt-verilog

2026-03-07 13:55
vak: (Житель планеты Узм)
[personal profile] vak
Попробовал я собрать симулятор Верилога от ИИ - увы. На маке сборка валится в конце, на нестыковке между Си++17 и Си++20. Какие-то проблемы в скриптах cmake, подозреваю. На Линуксе получилось собрать circt-verilog. Но это только фрондэнд от LLVM. А симулятор circt-sim не компилируется: недостаёт какого-то метода.
circt/lib/Dialect/Sim/Transforms/ProceduralizeSim.cpp: In member function ‘llvm::LogicalResult {anonymous}::ProceduralizeSimPass::proceduralizePrintOps(mlir::Value, llvm::ArrayRef)’:
circt/lib/Dialect/Sim/Transforms/ProceduralizeSim.cpp:213:33: error: no matching function for call to ‘circt::sim::PrintFormattedProcOp::create(mlir::OpBuilder&, mlir::Location, mlir::Value&)’
  213 |     PrintFormattedProcOp::create(builder, printOp.getLoc(), procPrintInput);
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Искусство по прежнему в большом долгу...

Но фрондэнд давайте попробуем. Возьмём простой счётчик для примера:
module counter (
    input  logic       clk,
    input  logic       reset,
    output logic [7:0] count
);
    always_ff @(posedge clk or posedge reset) begin
        if (reset)
            count <= 8'b0;
        else
            count <= count + 9'd1;
    end
endmodule
Превратим Верилог в промежуточное представление:
$ circt-verilog counter.sv
module {
  llvm.func @__moore_signal_event_in_slot(i32, !llvm.ptr) -> i1
  llvm.func @__moore_wait_event(i32, !llvm.ptr)
  hw.module @counter(in %clk : !hw.struct<value: i1, unknown: i1>, in %reset : !hw.struct<value: i1, unknown: i1>, out count : !hw.struct<value: i8, unknown: i8>) attributes {circt.default_time_units = -9 : i32, vpi.all_vars = {clk = 1 : i32, count = 8 : i32, reset = 1 : i32}} {
    %0 = llhd.constant_time <0ns, 0d, 1e>
    %c-1_i8 = hw.constant -1 : i8
    %c0_i8 = hw.constant 0 : i8
    %c1_i8 = hw.constant 1 : i8
    %1 = hw.aggregate_constant [0 : i8, -1 : i8] : !hw.struct<value: i8, unknown: i8>
    %true = hw.constant true
    %2 = hw.aggregate_constant [0 : i8, 0 : i8] : !hw.struct<value: i8, unknown: i8>
    %value = hw.struct_extract %clk["value"] : !hw.struct<value: i1, unknown: i1>
    %unknown = hw.struct_extract %clk["unknown"] : !hw.struct<value: i1, unknown: i1>
    %3 = comb.xor %unknown, %true : i1
    %4 = comb.and bin %value, %3 : i1
    %value_0 = hw.struct_extract %reset["value"] : !hw.struct<value: i1, unknown: i1>
    %unknown_1 = hw.struct_extract %reset["unknown"] : !hw.struct<value: i1, unknown: i1>
    %5 = comb.xor %unknown_1, %true : i1
    %6 = comb.and bin %value_0, %5 : i1
    %count = llhd.sig %1 : !hw.struct<value: i8, unknown: i8>
    %7:2 = llhd.combinational -> !hw.struct<value: i8, unknown: i8>, i1 {
      %10 = llhd.prb %count : !hw.struct<value: i8, unknown: i8>
      %value_3 = hw.struct_extract %10["value"] : !hw.struct<value: i8, unknown: i8>
      %unknown_4 = hw.struct_extract %10["unknown"] : !hw.struct<value: i8, unknown: i8>
      %11 = comb.add %value_3, %c1_i8 : i8
      %12 = comb.icmp ne %unknown_4, %c0_i8 : i8
      %13 = comb.replicate %12 : (i1) -> i8
      %14 = comb.xor %13, %c-1_i8 : i8
      %15 = comb.and %11, %14 : i8
      %16 = hw.struct_create (%15, %13) : !hw.struct<value: i8, unknown: i8>
      llhd.yield %16, %true : !hw.struct<value: i8, unknown: i8>, i1
    }
    %8 = seq.to_clock %4
    %count_2 = seq.firreg %7#0 clock %8 reset async %6, %2 preset 255 {name = "count"} : !hw.struct<value: i8, unknown: i8>
    llhd.drv %count, %count_2 after %0 : !hw.struct<value: i8, unknown: i8>
    %9 = llhd.prb %count : !hw.struct<value: i8, unknown: i8>
    hw.output %9 : !hw.struct<value: i8, unknown: i8>
  }
}
Ничо так вроде, годно на первый взгляд.
vak: (Линукс)
[personal profile] vak
Я собственно почему на загрузку с DVD жаловался. И для чего купил мини компьютер. Какое-то время назад увидел в новостях, что один линуксный журнал закрылся. А было их всего два таких журнала, и вот остался один. Дай думаю подпишусь, помогу им немного. Теперь регулярно получаю Linux Magazine в шикарном бумажном виде, да ещё и с DVD впридачу. С двух сторон диска находятся установочные дистрибутивы разных интересных линуксов. Вот я их и пробую в качестве развлечения.

Журнал весьма интересный. Штудирую от корки до корки, встречаю много нового. Не то чтобы я занимался развитием самого линукса, но и вокруг него тоже много любопытного происходит.

vak: (Линукс)
[personal profile] vak
Если у вас есть установочный DVD для Linux Mint... выкиньте его сразу, не мучайтесь. 😀 Загрузка системы с DVD занимает больше 30 минут. Не стоит оно того. Лучше USB флешку запишите.

circt-sim

2026-03-04 12:41
vak: (Аристипп)
[personal profile] vak
Один крутой чувак сбацал полный симулятор SystemVerilog с помощью ИИ за 43 дня. Не игрушка, вполне реальная вещь: проходит все официальные тестбенчи UVM.

https://github.com/thomasnormal/circt
vak: (Украина)
[personal profile] vak
Российский танкер Arctic Metagaz вёз сжиженный газ из Мурманска в Китай. Около Италии его понадкусывали украинские морские дроны.

https://www.reuters.com/business/energy/russian-flagged-sanctioned-lng-tanker-fire-mediterranean-crew-fate-unknown-2026-03-03/



Бага в stosb

2026-03-04 00:35
vak: (Знайка)
[personal profile] vak
Покажу как выглядит поиск ошибки в симуляторе. Сначала запускаем работающий вариант, с записью трассировки в файл.
$ tiltti msdos3.31-1.44m.img -r -o a.log
Теперь запускаем глюкавую версию, получаем второй файл трассировки.
$ tiltti --386 msdos3.31-1.44m.img -r -o b.log
Сравниваем файлы трассировки умной тулзой. В левой части экрана работает процессор i8086. В правой части - процессор i386. Выполняют один и тот же код, а именно MS-DOS 3.31. Результаты должны совпадать, за исключением того, что слева регистры 16-битные, а справа 32-битные. И они совпадают... до момента ошибки.



Как видим, команда STOSB слева выполняет 8 итераций и завершается. Та же команда справа продолжает крутиться до бесконечности. Что за ерунда? Проверим значение счётчика итераций в регистре CX. Глядите, команда MOV на адресе 07d89 заносит значение 8 в регистр CX (слева). А справа в регистре ECX оказывается ffff0008. Тоже не придерёшься: в реальнгом режиме задействуются только младшие 16 бит регистра. В старших битах остался мусор от каких-то предыдущих команд.

Но команда STOSB тоже должна использовать только младшую половину регистра CX, и выполнить 8 итераций. Вместо этого она, очевидно, берёт полное 32-битное значение, и крутится до морковкина заговенья.

А всё почему? От нетерпения. 😀 Надо было сначала добиться работы всех 100% MOO тестов, и потом уже пробовать грузить ДОС. Но очень хотелось глянуть, как оно пойдёт.

Теперь и i386

2026-03-03 14:01
vak: (Знайка)
[personal profile] vak
Допилил я за выходные модель процессора 386, и она прошла без ошибок первые пять тысяч MOO тестов. То есть каждая команда многократно корректно выполнилась в разных условиях. Уже неплохо.

Теперь в симуляторе tiltti можно выбирать процессор флагами --8086 или --386. Пробую запустить MS-DOS на i386 - даже что-то запускается! Запрашивает дату, время, выходит на приглашение. Ввожу ver, жму Enter... и оно зависает. Где-то нелады. Но для первого запуска очень неплохо.
$ tiltti --386 msdos3.31-1.44m.img
vak: (Кризис так себе)
[personal profile] vak
(перевод)

Является ли верховный лидер Ирана аятолла Али Хаменеи выпускником Московского университета дружбы народов имени Патриса Лумумбы? Завербовал ли КГБ Хаменеи в качестве шпиона в 1960-х годах? Виновата ли советская идеологическая обработка и подготовка в ненависти Хаменеи к Соединенным Штатам?

Персидская блогосфера бурлит спекуляциями о предполагаемых связях Хаменеи с Советским Союзом.

Дело началось в среду, когда иранские блогеры обнаружили репортаж Russia Today от 5 февраля 2010 года, посвященный 50-летию Московского университета дружбы народов, в котором Хаменеи упоминается среди «самых выдающихся выпускников» университета. Аналогичное утверждение появляется и на сайте Russia Today, хотя там упоминается «верховный лидер Ирана Али Хомейни», что является очевидной ошибкой. Впоследствии иранские блогеры выявили другие российские источники, содержащие аналогичное утверждение: в номере «Коммерсанта» от 25 ноября 2003 года Хаменеи представлен как выпускник Университета дружбы народов.

В официальной биографии Хаменеи нет никаких упоминаний об Университете дружбы народов. Это может отражать правду, и Хаменеи, возможно, не получал образования в Советском Союзе. Однако, если Хаменеи действительно является выпускником Университета дружбы народов, у него есть очень веские причины держать это в секрете: признание университетского образования в «безбожном» Советском Союзе не только нанесло бы серьезный удар по шаткой религиозной репутации Хаменеи, но и подвергло бы его обвинениям в вербовке КГБ в 1960-х годах, как это было со многими выпускниками Лумумбы.

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

Согласно официальной биографии Хаменеи, он отправился в Ирак в 1957 году для обучения в Теологической семинарии в Наджафе. Поскольку Университет дружбы народов был основан в 1960 году, молодой Хаменеи не мог использовать свою поездку в Ирак в качестве прикрытия для учебы в Советском Союзе. Но согласно его официальной биографии, Хаменеи провел «подпольную жизнь» в Тегеране в 1345 году [21 марта 1966 г. – 21 марта 1967 г.], после чего был арестован полицией и заключен в тюрьму. Действительно ли 28-летний Хаменеи провел год, живя подпольно в Москве, а не в Тегеране? Был ли Хаменеи арестован потому, что иранская секретная служба САВАК, существовавшая до революции, узнала о его визите в Москву?

Документы САВАК, опубликованные Иранской освободительной армией (основанной в Париже после революции 1979 года генералом Бахрамом Арианой), могут предоставить иные интересные сведения о предполагаемых связях Хаменеи с Советским Союзом, но у автора этой статьи пока не было возможности изучить эти документы.

Хаменеи мог быть, а мог и не быть выпускником Московского университета дружбы народов; и он мог быть, а мог и быть завербован КГБ в 1960-х годах. Никто не может отрицать тот факт, что Исламская Республика, которая гордится проведением независимой внешней политики, основанной на принципе «Ни Восток, ни Запад – Исламская Республика», в действительности всегда больше склонялась к Востоку. Также нельзя отрицать, что под руководством Хаменеи дипломатически изолированный Иран становился все более зависимым от России и Китая. Историки будут судить, является ли превращение Ирана в российско-китайский протекторат результатом замысла Хаменеи… или же следствием общей некомпетентности лидеров Исламской Республики.

popad

2026-02-27 13:51
vak: (Знайка)
[personal profile] vak
Вот пример смешных вещей, которые выясняются при тестировании процессорных инструкций. Есть в i386 команда POPAD. Когда мы находимся в 32-битном режиме, она выпихивает из стека значения восьми 32-битных регистров. Но значение ESP игнорирует, чтобы не нарушать стек. Это всё подробно описано и надёжно работает.

Но у команд i386 ещё бывают префиксы. Например префикс 0x67 меняет разрядность адресов в команде. В данном случае команда продолжает выпихивать 32-битные значения, но к стеку обращается по 16-битным адресам. Старшая половина ESP[31:16] игнорируется.

Вопрос: что происходит с этой старшей половиной ESP в результате выполнения команды POPAD с префиксом 0x67?

В документации вы прочитаете, что старшая половина регистра стека не изменяется. Это неправда. Как показывают тесты, биты ESP[31:16] получают значение из стека, как и прочие регистры. Был стек ESP=0x00005E90, стал 0x5A045EB0. Неожиданность! Как говорится, это нельзя объяснить, можно только запомнить. 😀
vak: (Аристипп)
[personal profile] vak
Один чувак запустил онлайн эмулятор троичного компьютера Сетунь: zaneham.github.io/setun70-emulator/web/.

Система команд напоминает простой стековый калькулятор: setun70_spec.md.

Вот пример простой программы.
; quadratic.s70 - Calculate x^2 + 2x + 1 where x = 5

    LIT 5       ; x = 5
    DUP         ; x x
    MUL         ; x^2 = 25
    
    LIT 5       ; x
    LIT 2       ; 2
    MUL         ; 2x = 10
    
    ADD         ; 25 + 10 = 35
    LIT 1       ; 1
    ADD         ; 35 + 1 = 36
    
    OUT         ; Output: 36
    HALT
vak: (Українець)
[personal profile] vak
Кто-то поинтересовался у ИИ, как бы выглядели советские гаджеты, если бы СССР был жив.

Тестируем i386

2026-02-26 13:57
vak: (Знайка)
[personal profile] vak
На симуляторе PC i86 успешно запускаются все версии PC DOS, все DR-DOS и почти все MS-DOS. Кроме последней неофициальной версии MS-DOS 7.1: потому что она требует процессора i386. А именно она и интересна полной поддержкой FAT32 и длинных имён файлов.

Так что я решил проапгредить процессор в симуляторе. Благо, для i386 тоже есть хороший набор тестов: SingleStepTests/80386. И тут же на первом тесте обнаруживаем странность, в регистре EFLAGS.

Интеловская документация утверждает, что неиспользуемые старшие 14 бит регистра EFLAGS всегда нули. Но из реального хардвера вычитываются единицы.
Figure 2-8.  EFLAGS Register  
16-BIT FLAGS REGISTER
A
+-------------------+---------------+
31 23 15 7 0
+-------------------+---------------+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |V|R| |N| IO|O|D|I|T|S|Z| |A| |P| |C|
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | |0| | | | | | | | |0| |0| |1| |
| |M|F| |T| PL|F|F|F|F|F|F| |F| |F| |F|
+-------------------+---------------+++++-+++-+-+++++++++++++-+++-+++-+++
| | | | | | | | | | | | |
VIRTUAL 8086 MODE---X----------+ | | | | | | | | | | | |
RESUME FLAG---X------------+ | | | | | | | | | | |
NESTED TASK FLAG---X----------------+ | | | | | | | | | |
I/O PRIVILEGE LEVEL---X-------------------+ | | | | | | | | |
OVERFLOW---S----------------------+ | | | | | | | |
DIRECTION FLAG---C------------------------+ | | | | | | |
INTERRUPT ENABLE---X--------------------------+ | | | | | |
TRAP FLAG---S----------------------------+ | | | | |
SIGN FLAG---S------------------------------+ | | | |
ZERO FLAG---S--------------------------------+ | | |
AUXILIARY CARRY---S------------------------------------+ | |
PARITY FLAG---S----------------------------------------+ |
CARRY FLAG---S--------------------------------------------+

S = STATUS FLAG, C = CONTROL FLAG, X = SYSTEM FLAG

NOTE: 0 OR 1 INDICATES INTEL RESERVED. DO NOT DEFINE

Virtual Hard Disk

2026-02-25 18:40
vak: (Знайка)
[personal profile] vak
Я добавил в симулятор PC i86 поддержку образов жёсткого диска в формате VHD. Это когда пустые сектора не хранятся, а файл постепенно увеличивается по мере наполнения диска содержимым. Получилось совместимо с QEMU, что очень удобно: можно пользоваться утилитой qemu-img чтобы создавать и конвертировать образы. Формат VHD когда-то придумала фирма Connectix (позже доставшаяся Микрософту), и теперь это открытый стандарт. Кроме QEMU его поддерживают Hyper-V, VirtualBox, Virtual PC и другие.

Для примера, 100-мегабайтный диск C: с установленным MS-DOS 3.3 и Volkov Commander имеет размер всего 2 мегабайта. Никакого сжатия, чисто пропуск пустых секторов. Можно смело создавать диски большого размера, не боясь забить файловую систему ерундой.

Для проверки симулятора пробую запускать разные исторические приложения. Турбо Паскаль фунциклирует замечательно.

+2 )
В целом уже понятно, что эксперимент с симуляцией биоса удался. Теперь задача перетащить всё хозяйство на микроконтроллер, с видео выходом HDMI, клавиатурой USB и диском на SD карточке.
vak: (Аристипп)
[personal profile] vak
Это такие специальные коаны для программистов.
Кто осознает глубокий смысл каждого фрагмента, достигнет нирваны.

Починил таки

2026-02-24 12:43
vak: (Default)
[personal profile] vak
Заработал наконец Волков Командер в полную высоту. Спасибо всем за советы. Дело было в вызове Int10 AX=1130h. Вот его описание:
INT 10h Video
...
AH=11h Character generator (EGA/MCGA/VGA)
...
AL=30h Return font info (EGA/MCGA/VGA)
Entry: BH=00h return INT 1Fh pointer
01h return INT 43h pointer
02h return ROM 8x14 font pointer
03h return ROM 8x8 double-dot font pointer (0-127)
04h return ROM 8x8 double-dot font pointer (128-255)
05h return ROM 9x14 alternate text pointer (EGA/VGA)
06h return ROM 8x16 font pointer (MCGA/VGA)
07h return ROM 9x16 alternate text pointer (VGA)
Exit: ES:BP=requested pointer
CX=scan lines per character
DL=rows (EGA) or rows-1 (MCGA/VGA)
В регистре DL следует вернуть 24 - количество строк на экране минус один. А возвращалось 16, как бы высота символа в шрифте. После правки всё заработало как положено. Симулятор начинает обретать законченные очертания.

Profile

dadv: (Default)
Choose your future

July 2024

M T W T F S S
12 34567
891011121314
15161718192021
22232425262728
293031    

Tags

Style Credit

Powered by Dreamwidth Studios