Знатоки, подскажите. На Delphi имеется такое описание: Код (Text): type TLevel = array[0..19, 0..15] of Byte; TLevels = array of TLevel; TMyRec = packed record ... UpLevel, DnLevel : TLevel; end; var Levels : TLevels; TmpLevels : TLevel; MyRec : TMyRec; каким образом наиболее близко это перевести в MASM?
Судя по данным, подразумевается набор уровней к матричной игре (т.е. в основе лежит двумерный массив, 0=пусто, 1=что-то... FF=сплошная стенка). Например, типа SOKOBAN или LodeRunner. Каждый уровень 20*16, байт. Ну и? Логика Дельфи мало чем поможет. TmpLevel db 320 dup 0 LABEL MyRec XPos db 0 YPos db 0 RecLevel db 320 dup 0 Levels db (320*n) dup ? Обратится к элементу TmpLevel [5,12]: по адресу TmpLevel+12*16+5 (вообще, правильней может быть и +5*20+12, но умножить на 16 проще - степень двойки, а как именно в сплошном байтовом массиве мы определяем столбцы, строки и их порядок - это наше личное дело). Наверно (лень разбираться) можно задать все это в виде структур, и использовать в виде структур. Но... Когда мы дойдем до описания 3-мерного массива Levels, структуры нам мало помогут - все равно работать с ним придется на "низком уровне" - для выбора уровня сдвигаться на нужное количество раз по 320 байт, это никак не записать одной строчкой. А следовательно, нечего и заморачиваться. Вдобавок, если реальных значений в массиве 16 и меньше, в байт мож4но убирать по 2 элемента (а если 4 как в упомянутом сокобане - пусто, ящик, место для ящика, стенка - то и вообще по 4 элемента в байт) - оптимизация по размеру данных. Я к тому, что какой смысл писать на ассемблере в точности так же, как на Дельфи?
Я и не говорил, что так же как на Дельфи. Вопрос в том, что в Дельфи можно определить: Код (Text): TLevel = array[0..19, 0..15] of Byte; как тип, в MASM-е же нужно как: Код (Text): TLevel BYTE 320 dup(?) соответственно в структуре я уже не могу на это сослаться. Вот и затормозил. А игра, действительно, Sokoban, когда то написал на Дельфи, теперь решил попробовать, хватит ли сил переписать на ассемблере. Далее: Код (Text): TLevels = array of TLevel; динамический массив, заранее размер неизвестен, но уже имеется ссылка на него, в асм-е такое не реализуешь. Думаю использовать create_array.