Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: i8080/8085/KP580
Войти
Регистрация
Восстановить пароль
 
Ethereal
3305 / 1445 / 189
Регистрация: 17.02.2013
Сообщений: 2,332
#1

Игра Конвея Жизнь на Лампанели - Assembler

04.05.2015, 19:12. Просмотров 1054. Ответов 5
Метки нет (Все метки)

Студенты тут часто постят задания связанные с какой-то Лампанелью.
Я тут решил постичь это извращение. Памяти всего 256 байт на код,
данные и стек, только 4 регистра и весьма убогая система команд,
к тому-же расходующая память по 1 или 2 слова на команду.
Оооо.... Изврат еще тот !
Надо попробовать утрамбовать в нее что-нибудь стоящее.
И я утрамбовал.

Игра Конвея Жизнь на Лампанели. Занимает все 256 байт памяти ровно.
Включая 2 слова под стек. Использует ресурсы на 100%. До донышка.
Упс ... Только это написал, как сократил код еще на пять слов.
Так-что пять слов вышли свободны. Перебор, однако... Эт я перестарался.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
MAIN:
MOV     @KOLONIJA, R3
OUT     (R3)+, P0    ;Вывод колонии на лампы Лампанели
OUT     (R3)+, P1
OUT     (R3)+, P2
OUT     (R3)+, P3
OUT     (R3)+, P4
OUT     (R3)+, P5
OUT     (R3)+, P6
OUT     (R3)+, P7
IN      P0, (R3)+
IN      P1, (R3)+
IN      P2, (R3)+
IN      P3, (R3)+
IN      P4, (R3)+
IN      P5, (R3)+
IN      P6, (R3)+
IN      P7, (R3)+
MOV     7F, R3       ;Здесь будем перебирать клетки вселенной 7F..0
SCAN:
XOR     R2, R2       ;Здесь будем считать соседей
CALL    SOSED_PRAVEE ;Есть ли сосед справа ?
SUB     10, R3
CALL    SOSED        ;Есть ли сосед справа-сверху ?
ADD     1, R3
CALL    SOSED        ;Есть ли сосед сверху ?
ADD     1, R3
CALL    SOSED        ;Есть ли сосед слева-сверху ?
ADD     10, R3
CALL    SOSED        ;Есть ли сосед слева ?
ADD     10, R3
CALL    SOSED        ;Есть ли сосед слева-снизу ?
CALL    SOSED_PRAVEE ;Есть ли сосед снизу ?
CALL    SOSED_PRAVEE ;Есть ли сосед справа-снизу ?
SUB     F, R3        ;Вернемся к своей клетке
CALL    OFFS_MASK
ADD     D2, R1       ;Лампанель ADD @KOLONIJA,R1 не понимает
CMP     2, R2        ;Если соседей < 2, то одиночество
JL      DEATH
CMP     3, R2
JG      DEATH        ;Если соседей > 3, то перенаселение
JNZ     @            ;Если соседей 3, то заселение клетки
OR      R0, (R1)     ;Рождение
JMP     @
DEATH:
NOT     R0
AND     R0, (R1)     ;Смерть
@:
SUB     1, R3        ;Следующая клетка
JGE     SCAN         ;Последняя ?
JMP     MAIN         ;Следующий шаг Жизни
 
OFFS_MASK:           ;Из номера клетки в R3 смещение в R1 и маску в R0
MOV     R3, R1
SHR     3, R1
MOV     R3, R0
AND     7, R0
ADD     CA, R0       ;Лампанель ADD @TABLE,R0 не понимает
MOVB    (R0), R0     ;Чтение маски из таблицы
AND     FF, R0
RET
 
SOSED_PRAVEE:
SUB     1, R3
SOSED:
CMPB    0, R3
JL      @@           ;Переход, если клетка за пределами вселенной
CALL    OFFS_MASK
ADD     E2, R1       ;Лампанель ADD @KOLONIJA_DO,R1 не понимает
AND     (R1), R0
JZ      @@
ADD     1, R2        ;Нашли еще одного соседа
@@:
RET
 
TABLE:               ;Таблица "номер_бита->маска" (тут адрес CA)
DATA    0201
DATA    0804
DATA    2010
DATA    8040
 
KOLONIJA:            ;Начальная и следующая колония (тут адрес D2):
DATA    0            ;Caterer
DATA    200          ;
DATA    8F0          ; (поставщик)
DATA    880          ; -
DATA    800          ; осциллятор
DATA    100          ;
DATA    600          ; периода
DATA    0            ; 3
KOLONIJA_DO:
;Тут адрес E2. Далее 8 слов под предыдущую колонию,
; пять неиспользованных слов и два слова под стек
В игру вставлен осциллятор игры Жизнь периода 3, который имеет собственное
имя "поставщик". Это самый маленький из осцилляторов периода 3. Вот он и
должен осциллировать на светодиодах Лампанели. Считаю эти светодиоды полем
для Жизни 16*8. Зажженный светодиод - существо. Погашенный - пустая клетка.
Вместо "поставщика" можно воткнуть любую другую колонию 16*8 после метки KOLONIJA

Но эмулятор Лампанель так написан, что запустить эмуляцию в каком-то
реальном времени я не понял как. Приходится 10 минут ждать пока Лампанель
обсчитает колонию существ Жизни 16*8 с подсветкой исполнения команд.
Т.е. 10 минут на один шаг игры Жизнь. Как эту подсветку отключить ?

З.Ы.
Осциллятор - это колония существ, которая после нескольких изменений
возвращается к своему первоначальному виду. В данном случае такой возврат
произойдет на 3-й шаг. Т.е период осциллятора 3. А самый длинный период
среди найденных осцилляторов это 200

Добавлено через 5 минут
@Mikl
От теперь я знаю толк в извращениях

P.S. Поправил код чтоб быстрее был.
P.P.S. И еще раз поправил.

Добавлено через 16 минут
P.P.S. Да, забыл. Здесь в алгоритме считается, что правая кромка поля лампочек 16*8 склеена с левой со сдвигом на одну клетку вверх по вертикали, а вот верхняя и нижняя границы абсолютные. Т.е. жизнь как бы идет на боковой поверхности чуть кривовато склеенного цилиндра. Сия топология суть последствия злостной нехватки ресурсов.
http://www.cyberforum.ru/cpp/thread1276465.html
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2015, 19:12
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Игра Конвея Жизнь на Лампанели (Assembler):

Реализовать в системе игру «Жизнь» Дж. Конвея и провести её исследование при различных значениях параметров
Дан код: X = sparse(50,50); X(1:50,1:50) = (rand(50,50) &gt; .5); p0 =...

Игра жизнь
Нужно написать игру &quot;Жизнь&quot; простым кодом. Только начал изучать c++

игра жизнь
содержимое life.cpp// Life.cpp: определяет точку входа для консольного...

Игра Жизнь
Ну, правила игры таковы: - если клетка пустая но имеет ровно 3 соседа (вообще...

Игра Жизнь
Помогите реализовать игру &quot;Жизнь&quot; на C# в псевдотрехмерном варианте или может у...

5
Shura_deg
82 / 18 / 5
Регистрация: 01.02.2015
Сообщений: 658
04.05.2015, 19:20 #2
Поможет ли изучение Лампанели для понтия более реальных языков типа MASM TASM??
И для чего дают некоторые преподаватели такие мудрёные методы изучения ассемблера
Ведь в некоторых универах сразу учат то что надо
0
Ethereal
3305 / 1445 / 189
Регистрация: 17.02.2013
Сообщений: 2,332
05.05.2015, 02:20  [ТС] #3
Хотя в игре Жизнь часто топологию вселенной делают вообще тором.

Впрочем, и с той реализацией, что выше, можно считать вселенную Жизни плоской, если никакое существо не попадет в крайний правый или крайний левый столбцы ламп Лампанели. В один из них двух. Тогда будет плоское поле жизни 15*8.

Добавлено через 2 минуты
Если ты уже начал TASM, то забудь про Лампанель. Она не более, чем инструмент воздействия на умы школьников, которые вообще ничего не знают. Ну и как упражнение для ума. Чем она интересна эта Лампанель, так это тем, что мозг ее автора сначала подвергся воздействию архитектуры PDP-11, а потом IBM-PC. Архитектура Лампанели - дикая мешанина того и другого.

Добавлено через 1 минуту
Цитата Сообщение от Shura_deg Посмотреть сообщение
Ведь в некоторых универах сразу учат то что надо
Лампанель - не универ. Средняя школа, урок информатики.

Добавлено через 34 минуты
А, впрочем, топология тора это более чем правильно. Мысленно склеиваем
правый столбец ламп Лампанели с левым со сдвигом на одну лампочку вверх.
После чего мысленно верх подклеиваем к низу. Получается замкнутая
вселенная в форме тора. И опять, если в один из двух столбцов лампочек
(крайний правый и крайний левый) и в одну из строчек (самую верхнюю
или самую нижнюю) не попадает ни одно существо, то вселенную можно
считать плоской.

Самое интересное - код с топологией тора вышел короче, чем был раньше.
Ну и раз пошла такая пьянка - я его еще в другом месте подсократил.
В итоге вышло десять неиспользованных слов в памяти Лампанели.
Воистину, оптимизация - занятие то еще.

Игра Конвея "Жизнь" на Лампанели во вселенной 16*8 с топологией тора :
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
MAIN:
MOV     @KOLONIJA, R2
MOV     R2, R1
OUT     (R2)+, P0    ;Вывод колонии на лампы Лампанели
OUT     (R2)+, P1
OUT     (R2)+, P2
OUT     (R2)+, P3
OUT     (R2)+, P4
OUT     (R2)+, P5
OUT     (R2)+, P6
OUT     (R2)+, P7
MOV     R2, R0
@:
MOV     (R1)+, (R2)+ ;Копирование текущей колонии в предыдущую
CMP     R0, R1
JNZ     @
MOV     7F, R3       ;Здесь будем перебирать клетки вселенной 7F..0
SCAN:
XOR     R2, R2       ;Здесь будем считать соседей
CALL    SOSED_PRAVEE ;Есть ли сосед справа ?
SUB     10, R3
CALL    SOSED        ;Есть ли сосед справа-сверху ?
ADD     1, R3
CALL    SOSED        ;Есть ли сосед сверху ?
ADD     1, R3
CALL    SOSED        ;Есть ли сосед слева-сверху ?
ADD     10, R3
CALL    SOSED        ;Есть ли сосед слева ?
ADD     10, R3
CALL    SOSED        ;Есть ли сосед слева-снизу ?
CALL    SOSED_PRAVEE ;Есть ли сосед снизу ?
CALL    SOSED_PRAVEE ;Есть ли сосед справа-снизу ?
SUB     F, R3        ;Вернемся к своей клетке
CALL    OFFS_MASK
ADD     C8, R1       ;Лампанель ADD @KOLONIJA,R1 не понимает
CMP     2, R2        ;Если соседей < 2, то одиночество
JL      DEATH
CMP     3, R2
JG      DEATH        ;Если соседей > 3, то перенаселение
JNZ     @@           ;Если соседей 3, то заселение клетки
OR      R0, (R1)     ;Рождение
JMP     @@
DEATH:
NOT     R0
AND     R0, (R1)     ;Смерть
@@:
SUB     1, R3        ;Следующая клетка
JGE     SCAN         ;Последняя ?
JMP     MAIN         ;Следующий шаг Жизни
 
OFFS_MASK:           ;Из номера клетки в R3 смещение в R1 и маску в R0
MOV     R3, R1
SHL     9, R1        ;Топология вселенной Жизни - тор
SHR     C, R1
MOV     R3, R0
AND     7, R0
ADD     C0, R0       ;Лампанель ADD @TABLE,R0 не понимает
MOVB    (R0), R0     ;Чтение маски из таблицы
AND     FF, R0       ;Убрать распространение знака, если маска 80
RET
 
SOSED_PRAVEE:
SUB     1, R3
SOSED:
CALL    OFFS_MASK
ADD     D8, R1       ;Лампанель ADD @KOLONIJA_DO,R1 не понимает
AND     (R1), R0     ;Клетка пустая или заселенная ?
JZ      @@@
ADD     1, R2        ;Нашли еще одного соседа
@@@:
RET
 
TABLE:               ;Таблица "номер_бита->маска" (тут адрес C0)
DATA    0201
DATA    0804
DATA    2010
DATA    8040
 
KOLONIJA:            ;Начальная и следующая колония (тут адрес C8):
DATA    0            ;Caterer
DATA    200          ;
DATA    8F0          ; (поставщик)
DATA    880          ; -
DATA    800          ; осциллятор
DATA    100          ;
DATA    600          ; периода
DATA    0            ; 3
KOLONIJA_DO:
;Тут адрес D8. Далее 8 слов под предыдущую колонию,
; десять неиспользованных слов и два слова под стек
P.S. Еще код сокращал. Надеюсь, сей вариант самый правильный и окончательный.
1
Ethereal
3305 / 1445 / 189
Регистрация: 17.02.2013
Сообщений: 2,332
07.05.2015, 20:46  [ТС] #4
Понятно, что эта тема никого не интересует, но я ее продолжу.

Интересен вопрос - где лежит предел оптимизации и какая она
должна быть вообще в данном случае ? Наибольшие затраты времени
при исполнении этой программы Лампанелью уходят на скроллинг
экрана. При этом этот скроллинг довольно специфичный.
Если вызывается подпрограмма, то ее первая команда помещается
в самый низ окна прокрутки и поэтому скроллинг вызывает КАЖДАЯ
команда в подпрограмме. А когда производит возврат в главный
цикл, то его следующая команда помещается в самый верх окна
прокрутки и пока курсор не добежит до низу скроллинг не произойдет.

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

Что я и проделал. Таблицу преобразования номера бита в маску
сделал словной, что максимально укоротило самую вложенную подпрограмму,
а для того, чтобы не заплатить за это общим распуханием кода, применил
пару трюков, таких как исполнение данных как кода и использование
кода как данных. Оказалось, что словная таблица преобразования с
данными 1 2 4 8 10 20 40 80 трактуется Лампанелью как нуль-операции,
поэтому ее можно поместить в самое начало программы и начать исполнение
программы именно с нее. Зато в результате смещение в таблице оказывается
адресом в ней и выпадает команда сложения адреса и смещения.
Ну и использовать технику перепрыгивания через следующую команду, трактуя
ее как операнд предыдущей. Вот в такой связке
Код
DATA    01D2         ;MOV (PC)+,R2  Перепрыгнет через команду OR R0,(R1) ,
BORN:                ;записав ее код в R2. Это на слово короче, чем JMP @@
OR      R0, (R1)     ;Рождение
@@:
вторая команда является теми данными, которые загрузит в R2 первая.
Что позволяет однословной командой перепрыгнуть через последующую
однословную без применения для этого двухсловного JMP.

Короче говоря, набитая оптимизирующими трюками реализация в которой
теперь уже оказалось 13 неиспользованных слов памяти Лампанели :
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
;Игра Конвея "Жизнь" во вселенной 16*8 с топологией тора
TABLE:               ;Таблица "номер_бита->маска"
DATA    01           ;NOP  Проедемся по данным, как по коду
DATA    02           ;NOP  Проедемся по данным, как по коду
DATA    04           ;NOP  Проедемся по данным, как по коду
DATA    08           ;NOP  Проедемся по данным, как по коду
DATA    10           ;NOP  Проедемся по данным, как по коду
DATA    20           ;NOP  Проедемся по данным, как по коду
DATA    40           ;NOP  Проедемся по данным, как по коду
DATA    80           ;NOP  Проедемся по данным, как по коду
MAIN:
MOV     @KOLONIJA, R2
MOV     R2, R1
OUT     (R2)+, P0    ;Вывод колонии на лампы Лампанели
OUT     (R2)+, P1
OUT     (R2)+, P2
OUT     (R2)+, P3
OUT     (R2)+, P4
OUT     (R2)+, P5
OUT     (R2)+, P6
OUT     (R2)+, P7
MOV     R2, R0
@:
MOV     (R1)+, (R2)+ ;Копирование текущей колонии в предыдущую
CMP     R0, R1
JNZ     @
MOV     FE, R3       ;Здесь будем перебирать клетки вселенной (7F..0)*2
SCAN:
XOR     R2, R2       ;Здесь будем считать соседей
CALL    SOSED_PRAVEE ;Есть ли сосед справа ?
SUB     20, R3
CALL    SOSED        ;Есть ли сосед справа-сверху ?
ADD     2, R3
CALL    SOSED        ;Есть ли сосед сверху ?
ADD     2, R3
CALL    SOSED        ;Есть ли сосед слева-сверху ?
ADD     20, R3
CALL    SOSED        ;Есть ли сосед слева ?
ADD     20, R3
CALL    SOSED        ;Есть ли сосед слева-снизу ?
CALL    SOSED_PRAVEE ;Есть ли сосед снизу ?
CALL    SOSED_PRAVEE ;Есть ли сосед справа-снизу ?
SUB     1E, R3       ;Вернемся к своей клетке
CALL    OFFS_MASK
ADD     C2, R1       ;Лампанель ADD @KOLONIJA,R1 не понимает
CMP     2, R2        ;Условия :
JZ      @@           ; если соседей < 2, то смерть от одиночества
CMP     3, R2        ; если соседей > 3, то смерть от перенаселения
JZ      BORN         ; если у пустой клетки соседей 3, то заселение
NOT     R0
AND     R0, (R1)     ;Смерть
DATA    01D2         ;MOV (PC)+,R2  Перепрыгнет через команду OR R0,(R1) ,
BORN:                ;записав ее код в R2. Это на слово короче, чем JMP @@
OR      R0, (R1)     ;Рождение
@@:
SUB     2, R3        ;Следующая клетка
JGE     SCAN         ;Последняя ?
JMP     MAIN         ;Следующий шаг Жизни
 
OFFS_MASK:           ;Из номера клетки в R3 смещение в R1 и маску в R0
MOV     R3, R1
SHL     8, R1        ;Топология вселенной Жизни - тор
SHR     C, R1
MOV     R3, R0
AND     E, R0
MOV     (R0), R0     ;Чтение маски из таблицы
RET
 
SOSED_PRAVEE:
SUB     2, R3
SOSED:
CALL    OFFS_MASK
ADD     D2, R1       ;Лампанель ADD @KOLONIJA_DO,R1 не понимает
AND     (R1), R0     ;Клетка пустая или заселенная ?
JZ      @@@
ADD     1, R2        ;Нашли еще одного соседа
@@@:
RET
 
KOLONIJA:            ;Начальная и следующая колония (тут адрес C2):
DATA    0            ;Caterer
DATA    200          ;
DATA    8F0          ; (поставщик)
DATA    880          ; -
DATA    800          ; осциллятор
DATA    100          ;
DATA    600          ; периода
DATA    0            ; 3
KOLONIJA_DO:
;Тут адрес D2. Далее восемь слов под предыдущую колонию,
; тринадцать неиспользованных слов и два слова под стек
0
Ethereal
3305 / 1445 / 189
Регистрация: 17.02.2013
Сообщений: 2,332
11.05.2015, 18:55  [ТС] #5
Продолжу тему, пусть она и на%рен никому не нужна.

Меня интересует вопрос асимптотического приближения к идеальному
алгоритму. Если выдается свободная минута, то бросаю взгляд на код
своей реализации игры Жизнь с задачей непременно сократить его еще.
В американской школе тяжелой атлетики были статические упражнения
по воздействию изо всей силы на неподвижный объект. В данном случае
такое упражнение делается мозгом. И сильно удивляет, что не смотря
на многолетний опыт по оптимизации так и не удается сразу видеть
абсолютный алгоритм и объект при жиме мозгом все продолжает и
продолжает прогибаться.

На сей раз меня заинтересовал вопрос - абсолютен ли алгоритм со
смертью существа через
NOT R0
AND R0, (R1) ; Смерть
и его рождением через
OR R0, (R1) ; Рождение
Нельзя ли частично перекрыть эти операции, чтобы одну выполняла
вторая половина другой ? При условиях :
Если соседей 2 - ничего не делать
Если соседей 3 - родить существо
В остальный случаях - умертвить его
И вдруг постигло озарение, что если отсечь случай "ничего не далать",
то можно вне всяких условий родить
OR R0, (R1) ; Рождение
, а если после отсечь случай "родить",
то умертить тогда уже будет можно по
XOR R0, (R1) ; Смерть
, что будет короче чем более раннее
NOT R0
AND R0, (R1) ; Смерть
Т.е
CMP 2, R2
JZ ничего_не_делать
OR R0, (R1) ;Рождение
CMP 3, R2
JZ ничего_не_делать
XOR R0, (R1) ;Смерть

Ай, как просто и лаконично. Почему-же я этого раньше не видел ?

Короче, еще более оптимизированная реализация игры Конвея "Жизнь".
Теперь уже 15 слов памяти Лампанели остаются неиспользованными.
И трюкаческий прием с перепрыгом через следующую команду из предыдущей
реализации исчезает, т.е она становится более дидактичной. И по скорости
она теперь фигарит как барбоска. Разумется, по меркам тормозов Лампанели.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
;Игра Конвея "Жизнь" во вселенной 16*8 с топологией тора
TABLE:               ;Таблица "номер_бита->маска"
DATA    01           ;NOP  Проедемся по данным, как по коду
DATA    02           ;NOP  Проедемся по данным, как по коду
DATA    04           ;NOP  Проедемся по данным, как по коду
DATA    08           ;NOP  Проедемся по данным, как по коду
DATA    10           ;NOP  Проедемся по данным, как по коду
DATA    20           ;NOP  Проедемся по данным, как по коду
DATA    40           ;NOP  Проедемся по данным, как по коду
DATA    80           ;NOP  Проедемся по данным, как по коду
MAIN:
MOV     @KOLONIJA, R2
MOV     R2, R1
OUT     (R2)+, P0    ;Вывод колонии на лампы Лампанели
OUT     (R2)+, P1
OUT     (R2)+, P2
OUT     (R2)+, P3
OUT     (R2)+, P4
OUT     (R2)+, P5
OUT     (R2)+, P6
OUT     (R2)+, P7
MOV     R2, R0
@:
MOV     (R1)+, (R2)+ ;Копирование текущей колонии в предыдущую
CMP     R0, R1
JNZ     @
MOV     FE, R3       ;Здесь будем перебирать клетки вселенной (7F..0)*2
SCAN:
XOR     R2, R2       ;Здесь будем считать соседей
CALL    SOSED_PRAVEE ;Есть ли сосед справа ?
SUB     20, R3
CALL    SOSED        ;Есть ли сосед справа-сверху ?
ADD     2, R3
CALL    SOSED        ;Есть ли сосед сверху ?
ADD     2, R3
CALL    SOSED        ;Есть ли сосед слева-сверху ?
ADD     20, R3
CALL    SOSED        ;Есть ли сосед слева ?
ADD     20, R3
CALL    SOSED        ;Есть ли сосед слева-снизу ?
CALL    SOSED_PRAVEE ;Есть ли сосед снизу ?
CALL    SOSED_PRAVEE ;Есть ли сосед справа-снизу ?
SUB     1E, R3       ;Вернемся к своей клетке
CALL    OFFS_MASK
ADD     BE, R1       ;Лампанель ADD @KOLONIJA,R1 не понимает
CMP     2, R2        ;Условия :
JZ      @@           ; если соседей < 2, то смерть от одиночества
OR      R0, (R1)     ;Рождение
CMP     3, R2        ; если соседей > 3, то смерть от перенаселения
JZ      @@           ; если у пустой клетки соседей 3, то заселение
XOR     R0, (R1)     ;Смерть
@@:
SUB     2, R3        ;Следующая клетка
JGE     SCAN         ;Последняя ?
JMP     MAIN         ;Следующий шаг Жизни
 
OFFS_MASK:           ;Из номера клетки в R3 смещение в R1 и маску в R0
MOV     R3, R1
SHL     8, R1        ;Топология вселенной Жизни - тор
SHR     C, R1
MOV     R3, R0
AND     E, R0
MOV     (R0), R0     ;Чтение маски из таблицы
RET
 
SOSED_PRAVEE:
SUB     2, R3
SOSED:
CALL    OFFS_MASK
ADD     CE, R1       ;Лампанель ADD @KOLONIJA_DO,R1 не понимает
AND     (R1), R0     ;Клетка пустая или заселенная ?
JZ      @@@
ADD     1, R2        ;Нашли еще одного соседа
@@@:
RET
 
KOLONIJA:            ;Начальная и следующая колония (тут адрес BE):
DATA    0            ;Caterer
DATA    200          ;
DATA    8F0          ; (поставщик)
DATA    880          ; -
DATA    800          ; осциллятор
DATA    100          ;
DATA    600          ; периода
DATA    0            ; 3
KOLONIJA_DO:
;Тут адрес CE. Далее восемь слов под предыдущую колонию,
; пятнадцать неиспользованных слов и два слова под стек
0
KyberMax
Terminator of naked apes
827 / 134 / 34
Регистрация: 13.02.2015
Сообщений: 328
16.05.2015, 11:38 #6
Цитата Сообщение от Ethereal Посмотреть сообщение
Продолжу тему, пусть она и на%рен никому не нужна.
Ну потцчему же ж не нужна? Она великолепна, например ;о)
0
16.05.2015, 11:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2015, 11:38
Привет! Вот еще темы с решениями:

Игра Жизнь
Написал вот такую реализацию: #include &quot;stdafx.h&quot; #include &quot;iostream&quot;...

Игра жизнь на прологе
Доброго всем времени суток) Сразу скажу, что в прологе я не силен (еще и...

Игра в жизнь Конвей
Чего то я намудрил помогите разобраться пожалуйста #include&lt;math.h&gt;...

Как слепить? Игра Жизнь
Задание вот в чём: Сделать Игру Жизнь Джона Конуэя в Windows form, при этом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru