Сомневаюсь, что это представляет для кого-то интерес.
Но... Прикрутил я к эмулятору язычёк под названием Lua (ниже ссылка на архив с плагином). Очень уж захотелось сделать виртуальный контроллер ЛВС.
Сначала я не хотел выкидывать ВВ55, чтобы не париться с её реализацией в Lua, но как выяснилось, при настройке порта на ввод, эмуль ничего не пишет в связанное с этим портом устройством (на ввод же программируем). Т.е. привязка к еденице в реальном устройстве не будет эмулироваться как хотелось бы. В связи с этим пришлось полностью заменить ВВ55 виртуальным устройством на Lua.
Для начала меняем конфиг:
Тут мы задаём имя файла со скриптом и имена функций для устройства ext.data (вместо data могло быть что-то иное, но я решил оставить имя, которое было у ВВ55).Код:ext : lua-script { script="Vector06c\lua\locnet.lua" data.onread="read" data.onwrite="write" }
Привязка к портам процессора осталась как и была у ВВ55:
Минимальный .lua в данном случае мог выглядеть так:Код:CPU : K580wm80a { ... port~[04-07]=ext.data ...
То есть при чтении всегда выдаётся 0, а при записи ничего не делаем.Код:function read(addr) return 0 end function write(addr, val) end
Первым делом я сделал протоколирование обращения к устройству:
Далее, в зависимости от режима ВВ55 (поддерживаются только некоторые из всех возможных) я сделал возможность выполнять разные действия, и одним из первых стал режим детектирования контроллера ЛВС:Код:local f = io.open("test.txt", "w+") function read(addr) local val = 0 f:write("rd ", addr, " ", val, "\n") return val end function write(addr, val) f:write("wr ", addr, " ", val, "\n") end
Скрытый текст
Код:local function zero() return 0 end local function nop(val) end local detval = 0 local function rdet() return detval end local function wdet(val) detval = (val&0x80)>>4 end local default = { name = "default", read = {zero,zero,zero,zero}, write = {nop,nop,nop}, enter = nop } local recv = { name = "recv", read = {zero,zero,zero,zero}, write = {nop,nop,nop}, enter = nop } local send = { name = "send", read = {zero,zero,zero,zero}, write = {nop,nop,nop}, enter = nop } local detect = { name = "detect", read = {zero,zero,rdet,zero}, write = {wdet,nop,nop}, enter = nop } local modesel = { [0x9B] = default, [0x9A] = recv, [0x98] = send, [0x8B] = detect } local mode = default local f = io.open("test.txt", "w+") function read(addr) local val = mode.read[addr+1]() f:write("rd ", addr, " ", val, "\n") return val end function write(addr, val) if addr==3 then mode = modesel[val] or default mode.enter() f:write("mode ", mode.name, "\n") else mode.write[addr+1](val) f:write("wr ", addr, " ", val, "\n") end end[свернуть]
Имейте ввиду, что если массивы задаются списком, то первый элемент имеет индекс 1.
Ну а далее шаг за шагом реализовывался весь (известный) протокол ЛВС. Конечный вариант есть в архиве. Имя загружаемого файла задаётся в самом скрипте.
Архив с плагином: luaplug.zip




Ответить с цитированием