Поиграем?

Тема в разделе "WASM.PROJECTS", создана пользователем Paguo_86PK, 22 дек 2008.

  1. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    743
    Адрес:
    Ташкент
    Однакo, придумать адекватное мнемоническое идентифицирование инструкциям не менее сложнее, чем заставить всё это крутиться и работать…
    Использовать заимствованные идентификаторы сторонних архитектур и пытаться их эстетически приспособить в таблицу команд не всегда получается. Приходится подбирать из английского словаря близкие по смыслу к логике действия операции обозначения.
    Код (DOS):
    1. Байт-код|Мнемоника|Аббривиатура
    2. --------+---------+------------
    3.    B0 $$|BIO  $+$$|Branch If parity if Odd (PF=1)
    4.    B1 $$|BIP  $+$$|Branch If Parity is even(PF=0)
    5.    .. ..|...  ....|..............................
    6.    B6 FF|CIE      |Call from heap of stack (ZF=1)
    7.    B7 $$|COF  $+$$|Call Of Fictional code  (ZF=0)
    8.    B8 $$|JMP  $+$$|..............................
    9.    B9 $$|CALL $+$$|..............................
    10.    BA $$|BIA  $+$$|Branch If Among         (SF=1)
    11.    BB $$|BIB  $+$$|Branch If Bigger        (SF=0)
    12.    BC $$|BIC  $+$$|Branch If Carry         (CF=1)
    13.    BD $$|BID  $+$$|Branch If Discarded     (CF=0)
    14.    BE $$|BIE  $+$$|Branch If Equality      (ZF=1)
    15.    BE FE|DOE      |DO if Equality (Skip if ZF!=1)
    16.    BF $$|BIF  $+$$|Branch If Fictional     (ZF=0)
    17.    BF FF|RIF      |Return If Fictional     (ZF=0)
    18.    .. ..|...  ....|..............................
    19. RR EB   |EACH [RR]|Each By Register
    20. RR EC   |EACH  RR |Each by Counting Register
    21. NN ED   |EACH  NN |Each by Data number
    22.    .. ..|...  ....|..............................
    23. RR FB   |FAKE [RR]|Fake By Register
    24. RR FC   |FAIR  RR |Fetch by Counting Register
    25. NN FD   |FAKE  NN |Fake by Data number
    Если это кому-то покажется смешным - поддерживаю… Так как подбирал с некоторым трудом.
    Мнемоника и байт-код получается соответствующий.
    • EB: Each(Buffered) - раньше была традиционная Loop, но не вписывалась в аббревиатуру EB
    • FC: Fair(Counter) - думаю ею подменить традиционный Wait
    • FD: Fake(Data) - вместо традиционной Skip можно мнемонически объявлять инструкции фейковыми
    За прошлые дни сильно провозился с ассемблером и дизассемблером. Так как эмуляция хоть и работает, но байт-код крайне неверно интерпретировался в отладчике.
    Как я уже говорил, система команд - Ребусная (Rebused-ISC), что делает её местами очень запутанной не только в ассемблере, но и перевариванием собственным серым веществом
    Почему FB/FC/FD стало Fake/Fair/Fake (раньше было три Фейка)? Просто считать фейковыми и пропускать все 255 инструкций я считаю бесполезной операцией.
    Есть некоторые крайне редкостные комбинации операций, которые нужно как-то иначе воспринимать и интерпретировать в совокупности. Например:
    • Each+Each - двойной префикс цикла. Нет смысла в цикле начинать другой цикл
    • Each+Fair - бессмысленно в цикле задавать интервал ожидающего цикла
    • Each+Fake - не ясно, зачем в цикле нужно объявлять группу фейковых инструкций
    • Fair+Each - циклом ожидания пытаться начать другой цикл не имеет смысла
    • Fair+Fair - двойной префикс ожидающего цикла. Не понятно, что этим можно пытаться добиться
    • Fair+Fake - в ожидающем цикле объявлять группу инструкций фейковыми
    Либо у меня фантазия очень узкая, либо я - консервативная фантазирующая личность. Потому что:
    • MOV R - инструкция с одним операндом. В x86 имеется инструкция Enter. Не стал я привлекать новое слово мнемоники для ввода аргумента вызова
    • MOV N - инструкция с числовым операндом. Не скажу, что это нечто типа Leave в x86. Но я обошёлся одной цифрой для доступа к аргументу вызова
    • CALL - инструкция без адреса/метки. Псевдоним XCHG IP,[SP] - обмен с верхушкой стека указателем на инструкцию
    • CIA/CIB/CIC/CID/CIE/CIF - без метки. Вызов подпрограммы с верхушки стека по условию
    Если будут идеи на счёт красивых мнемоник - предлагайте. Пока что насчитывается порядка 40 мнемонических слов. Считаю, чем меньше - тем лучше.
    А теперь…

    Обработка доступа к портам ввода-вывода системой
    Несколько строчек с примером:
    Код (DOS):
    1. 1100    A4 FD|MOV  AL,0xFD;Указываем читаемый порт
    2. 1102    A5 67|MOV  CL,0x67;Выставляем интервал ожидания
    3. 1104 55 FC   |FAIR CL     ;Ожидающий цикл со счётчиком CL
    4. 1106 44 44   |IN   AL     ;Прервёт задачу с обращением к ядру
    5. ; Здесь 44 - MOV AL,AL работающий как префикс для AL
    6. ; Так как 44+44 - MOV AL,AL под префиксом AL в ожидании, работает как портовая
    7. ; Кстати, эта IN AL прерывает приложение и управление возвращается ядру с кодом:
    8. FF00    E8 ??|JMP  .overhead; Запрос к стандартному API
    9. FF02    E8 ??|JMP  .acclaim ; Обращение к программным прерываниям INT 0-79
    10. FF04    E8 ??|JMP  .buffer  ; Буферная зона - прослойка диспетчера памяти
    11. FF06    E8 ??|JMP  .context ; Диспетчер переключения контекста процессов
    12. FF08    E8 04|JMP  .device  ; Запрос ко внешнему устройству ввода/вывода
    13. FF0E ........|.device:      ; Метка обработчика запросов к устройствам
    14. FF0E    BC ??|BIC  ..write  ; Установленный флаг CF - признак записи в порт
    15. FF10 44 FA   |POP  AL       ; Доступ к стеку истории регистра AL
    16. FF12    42   |MOV  CH,AL    ; Запоминаем ячейку контекста со счётчиком
    17. FF13 44 FA   |POP  AL       ; Пропускаем байт
    18. FF15 44 FA   |POP  AL       ; Доходим до истории с индексом порта
    19. FF17    43   |MOV  DH,AL    ; Запомним адрес ячейки контекста с приёмником
    20. FF18    37   |MOV  DL,DH    ; Необходимость особенности архитектуры
    21. FF19    B8 FE|WAIT          ; Разовое ожидание
    22. FF1B 77 70   |MOV  DL,[DL]  ; Читаем индекс порта с контекста приложения
    23. FF1D    62   |MOV  CL,CH    ; Необходимость особенности архитектуры
    24. FF1E    B8 FE|WAIT          ; Разовое ожидание
    25. FF20 66 60   |MOV  CL,[CL]  ; Читаем индекс выдержки ожидания готовности порта
    26. FF22 66 FC   |FAIR CL       ; Ожидание с декрементом
    27. FF24 44 77   |IN   DL       ; Чтение данных с физического порта
    28. FF26    48   |SBB  AL,AL    ; Если порт готов и данные прочитаны, CF будет в "1"
    29. FF27    AC 02|AND  AL,0x02  ; Маскируем бит флажка CF для приложения
    30. FF29    A1 A8|MOV  BH,0xA8  ; Ячейка контекста приложения с флажками
    31. FF2B    15   |MOV  BL,BH    ; Необходимость особенности архитектуры
    32. FF2C    B8 FE|WAIT          ; Разовое ожидание
    33. FF2E 55 50   |MOV  BL,[BL]  ; Читаем биты флажков
    34. FF30    5D   |OR   AL,BL    ; Выставляем бит CF приложения по готовности
    35. FF31    B8 FE|WAIT          ; Необходимость особенности архитектуры
    36. FF33 11 40   |MOV  [BH],AL  ; Записываем в контекст приложения признак CF
    37. FF35    B8 FE|WAIT          ; Необходимость особенности архитектуры
    38. FF37 22 60   |MOV  [CH],CL  ; Значение счётчика передадим в контекст приложения
    39. FF39    B8 FE|WAIT          ; Необходимость особенности архитектуры
    40. FF3B 33 70   |MOV  [DH],DL  ; Считанный байт запишем в контекст приложения
    41. FF3D    B8 FE|WAIT          ; Необходимость особенности архитектуры
    42. FF3F    04   |MOV  AL,[0]   ; Читаем индекс контекста прерванной задачи
    43. FF40    AC 7F|AND  AL,0x7F  ; Сбрасываем бит системного контекста ядра
    44. FF42    44 00|HLT  AL       ; Указываем регистр ключевым
    45. FF44    B8 FE|WAIT          ; Необходимость особенности архитектуры
    46. FF46    00   |MOV  [0],AL   ; Так как AL был ключевым, HLT переключит контекст
    47. ; Здесь работа системного кода прерывается
    48. ; Управление получает прерванная прикладная задача
    49. 1108    BD F6|BID  0x1100   ; Если флаг переноса сброшен, порт не прочитан
    P.S.: На практике указанный код работает на 90%…
    Почему не 100%? На примере эмуляции github код работает на 95%, так как там имеется проблема с флажком CF (приложение всегда получает сигнал готовности клавиатуры, например) и когда буфер клавиатуры пуст, приложение всё равно его читает…
    А текущая разрабатываемая версия эмулятор и флаг не передаёт как надо, и сам байт с порта попадает куды не надо…
    (сложная проблема самого ядра эмулятора, где не могу справиться с синхронизацией переключения исполняемых потоков - от системного к прикладному)
     
    Последнее редактирование: 9 фев 2017
  2. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    743
    Адрес:
    Ташкент
    Нa этих выходных решил попробовать написать эмулятор с нуля, руководствуясь накопленным опытом.
    Основной задачей было поставленно написать некий универсальный движок, с помощью которого можно описать нужный процессор простым шаблоном, который развернётся в работающую модель с комплектом 3 в 1: Эмулятор, Дизассемблер, Ассемблер. При этом, не нужно было бы сурово переделывать сам js-текст.
    В итоге, уложился в трое суток бессонных ночей отладки.
    Получился компактный - 1500 строк и 60кб.

    P.S.: Если браузерная совместимость не подведёт, эмулятор запустится сразу под рандомным мусором в его ОЗУ…
    Необходимо нажать кнопку Reset, а затем - Start.
    Клавиши тоже должны работать: F1-Шаг отладки, F4-Полный ход, F9-Брейк-пойнт.
    Также, F7-Выбор настраиваемого параметра(FPS, IPC, IPS), F6/F8-Декремент/Инкремент параметра.
    Пожалуйста, отпишитесь, у кого - какой результат.
    Кстати, шаблон можно редактировать прямо в процессе (кнопка Matrix) и изменить всю систему команд на ходу (двойной клик по той же Matrix)…
    (по идее, можно описать 6502. Для Z80 пока ещё не хватает поддержки префиксов, что довольно поправимо)
     
    ol. и _edge нравится это.
  3. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    3.043
    Paguo_86PK, а можь тебе подключиться к уже имеющимся проектам ==>> будь хоть тысячу пядей во лбу, но делать с нуля упирается во многом в тупую трату чел-часов и в итоге ты не столько развиваешься, сколько зарываешь свои таланты.
     
  4. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    743
    Адрес:
    Ташкент
    Дa в том то и дело, что готовые проекты - это switch и 256 штук case. Выше говорил, что пытался переделать тот эмулятор и переписывался с автором. Но, отлаживать - чудовищно было!
    В принципе, этот мой эмулятор работает же. Осталось клавиатуру подцепить и можно в Бейсике тригонометрией баловаться :dirol:
     
  5. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    3.043
    Paguo_86PK, а как тебе dosemu, dosbox, qemu?
     
  6. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    743
    Адрес:
    Ташкент
    Смешная история, так как сидя за Pentium-I 90mHz/48mb-RAM ещё я пытался установить vmWare, но та вылетала с ошибкой отсутствия в процессоре поддержки каких-то критически важных команд для эмуляции. Пользовался, в частности, Bochs. И он мне тогда вполне подходил (ставил под ним Windows'XP 18 часов).
    А будучи уже с Pentium-IV (сидел на Pentium-I до 2009 года) я вспомнил и поставил vmWare и ей пользуюсь по сей день.
     
  7. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    3.043
    Paguo_86PK, со слабым компом у тебя имеется обходной вариант: можно подключаться к облачным проектам (инет, кстати, у тебя какой?) ==>> среда разработки/прогонки на облаках. покажешь себя там и вольёшься в Сообщество, а дальше ужо проблем с жестянками испытывать не будешь.. сейчас дикий недобор спецов чуть ли не по всем областям..
     
  8. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    743
    Адрес:
    Ташкент
    Прo что вы?
    Четыре года назад P-IV полетел (южный мост) из-за неполадок БП (на видяхе кондёр разорвало), так как БП не включался и с 15 раза бывало последний год…
    Пришлось пойти и купить GA-F2A85X-UP4 и временно попрощаться с этим

    Интернет у меня порядка 256кбод (ночью - до 2048). Хотел как-то BitCoin'ить и зарабатывать. Но, там много всяческих фокусов…
     
  9. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    3.043
    с биткоин, пожалуй, проблем токЪ больше будет :) лучше в проектах на ОК (открытых кодах) поучаствуй.
     
  10. Paguo_86PK

    Paguo_86PK Руслан

    Публикаций:
    0
    Регистрация:
    8 окт 2007
    Сообщения:
    743
    Адрес:
    Ташкент
    Мегапроцессoр недавно вот увидел - жесть!
    В подобном проекте бы поучавствовал, не живя вот в вакууме, где ни монтажных плат, ни рассыпухи, ни паяльника…
    Недавно вот случай был. Человек разрабатывает игру и ему потребовалось сгенерировать лабиринт так, чтобы маршрут по нему нёс некую осмысленную информацию. У меня как раз "завалялась" та старенькая идея с пентаминным письмом и я её предложил. Правда, там "баги" концепции, так как требуется координация лингвиста-полиглота… Но сам принцип - практический годный. (декодер читает лабиринты "жуком". с аналогом QR-читалке по изображению - пока не справляюсь)
    И вот к чему я. Если где-то кому-то потребуется (вдруг) микромощный процессор с адекватной системой команд - может мои труды и пригодятся…
    P.S.: Некоторые саунд бластеры мастерят…
     
    Последнее редактирование: 20 апр 2017
  11. _edge

    _edge Active Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    442
    Адрес:
    Russia
    Последнее редактирование: 20 апр 2017