1 Отредактировано garnizon (17-11-2021 02:44)

Тема: Кубик-Рубика

Интересно кто-то играл в эту реализацию на Агате?

Примечательно что её написал Филиппов Андрей, создатель КНГМД 840Кб.

Она из двух файлов:  бейсиковый  и бинарник (там почти все картинка).

Но я вот, убей, не понимаю как в это играть и что изображено на экране. 
Из всех клавиш понял только РЕД, возврат к исходному состоянию.
Стрелка работает только левая, используются функциональные клавиши и цифровые.

Подскажите, с какой стороны к нему подойти?

В аттаче диск 140кб с игрой, запуск: RUN RUBIC

Post's attachments

Attachment icon RUBIC.dsk 140 kb, 177 downloads since 2021-11-16 

RUBIC.png, 16.4 kb, 512 x 512
RUBIC.png 16.4 kb, 164 downloads since 2021-11-16 

2 Отредактировано AlexBel (17-11-2021 08:32)

Re: Кубик-Рубика

РЕД - сброс
1-8 - перемешивание разной степени
R(ight) - крутить правую часть (с РЕГ - в обратную сторону)
L(eft) - крутить левую часть (с РЕГ - в обратную сторону)
U(p) - крутить верхнюю часть (с РЕГ - в обратную сторону)
D(own) - крутить нижнюю часть (с РЕГ - в обратную сторону)
F(ront) - крутить переднюю часть (с РЕГ - в обратную сторону)
B(ottom) - крутить заднюю часть (с РЕГ - в обратную сторону)
Стрелка Вправо - повернуть центральный горизонтальный ряд вправо

Цифровое поле (кнопки эмулятора, не помню их соответствие кнопкам реального Агата):
8 - повернуть кубик вперёд вертикально
2 - повернуть кубик назад вертикально
4 - повернуть кубик влево горизонтально
6 - повернуть кубик вправо горизонтально
9 - повернуть центральный вертикальный ряд вперёд
5 - повернуть кубик по часовой стрелке вправо

3 Отредактировано Prol (17-11-2021 16:45)

Re: Кубик-Рубика

Налицо перекосы плановой экономики — компов много, а кубики в дефиците:) А ведь высококвалифицированный инженер мог что-нибудь более полезное написать, а на заработанные деньги купить кубик.

4 Отредактировано garnizon (19-11-2021 13:11)

Re: Кубик-Рубика

Судя по бейсиковому блоку, можно переназначить клавиши:

[0002]      1  PRINT  CHR$ (4)"BLOAD RUBIC.BN"
[001C]      5  DIM C$(8)
[0027]     10  MGR= 3
[002E]     15  CALL $4A34
[0039]     20  GET A$:
              C =  PEEK ($4B00 +  ASC (A$))
[0052]     25  IF A$ > "0" AND A$ <  = "9" THEN  GOSUB 200:
                   GOTO 20
[006F]     26  IF A$ > " " AND A$ <  = ")" THEN  GOSUB 300:
                   GOTO 20
[008C]     28  IF A$ = "=" THEN  GOSUB 400:
                   GOTO 20
[00A1]     30  POKE $4940,C:
               CALL $4941:
               GOTO 20
[00B9]    200 N =  ASC (A$) - 49:
              A = $4B80 + 64 * N
[00D5]    205  IF  PEEK (A) = 255 THEN  PRINT  CHR$ (7);:
                   RETURN 
[00EC]    210 C =  PEEK (A):
               IF C < 255 THEN  POKE $4940,C:
                   CALL $4941:
                  A = A + 1:
                   GOTO 210
[0119]    220  RETURN 
[011F]    300 XX =  FRE (0):
              A = $4B80 + 64 * ( ASC (A$) - 33):
               FOR I = (A) TO (A + 63):
                   POKE A,255:
               NEXT 
[0158]    310 I = 0
[0160]    320  GET A$:
               IF A$ =  CHR$ (13) THEN  RETURN 
[0174]    330 C =  PEEK ($4B00 +  ASC (A$)):
               IF C < 3 OR C = 255 THEN  PRINT  CHR$ (7);:
                   GOTO 320
[01A0]    340  POKE A + I,C:
              I = I + 1:
               IF I < 63 THEN 320
[01BB]    350  FOR I = 1 TO 10:
                   PRINT  CHR$ (7);:
               NEXT :
               GET A$:
               IF A$ >  <  CHR$ (13) THEN  GOTO 350
[01E4]    360  RETURN 
[01EA]    400  FOR I = 1 TO 100:
                  C = 3 +  INT (24 *  RND (1)):
                   POKE $4940,C:
                   CALL $4941:
               NEXT :
               RETURN 
[021A]   1000 C = 0:
               FOR I = $4B00 TO $4B7F:
                   POKE I,255:
               NEXT 
[023A]   1010  PRINT "ENTER KEYS FOR FUNCTIONS ":
               PRINT "INITIAL POSITION ";:
               GOSUB 2000
[0277]   1020  PRINT "SAVE POSITION ";:
               GOSUB 2000
[0294]   1030  PRINT "RESTORE POSITION ";:
               GOSUB 2000
[02B4]   1040  PRINT "ROTATE FIRST LAYER CLOCKWISE":
               GOSUB 3000
[02DE]   1050  PRINT "ROTATE COUNTERCLOCKWISE":
               GOSUB 3000
[0303]   1060  PRINT "ROTATE SECOND LAYER":
               GOSUB 3000
[0324]   1070  PRINT "ROTATE WHOLE CUBE":
               GOSUB 3000
[0343]   1080  STOP 
[0349]   2000  GET A$:
              D =  ASC (A$):
               IF D > 48 AND D < 58 OR D > 32 AND D < 42 OR  PEEK ($4B00 + D) < 255 THEN  PRINT  CHR$ (7):
                   GOTO 2000
[0389]   2010  POKE ($4B00 + D),C:
               PRINT :
              C = C + 1:
               RETURN 
[03A4]   3000  PRINT "FRONT ";:
               GOSUB 2000:
               PRINT "BACK ";:
               GOSUB 2000:
               PRINT "UP ";:
               GOSUB 2000:
               PRINT "DOWN ";:
               GOSUB 2000:
               PRINT "RIGHT ";:
               GOSUB 2000:
               PRINT "LEFT ";:
               GOSUB 2000:
               RETURN 

P.S.

В проге нет ссылок на строку 1010. Скорее всего она правит код в ОЗУ, который из B- файла грузиться.
Соответственно, запускать его надо, может быть, чем -то вроде "RUN 1000"
А потом уже она в строке 1080 остановиться и тогда уже надо писать RUN
Но до этого B- должен быть загружен в память

5

Re: Кубик-Рубика

garnizon пишет:

Соответственно, запускать его надо, может быть, чем -то вроде "RUN 1000"
А потом уже она в строке 1080 остановиться и тогда уже надо писать RUN

Если просто RUN написать, то в первой строке загрузится RUBIC.BN и все настройки затрет. Тогда уж RUN 5
Но как-то это все сложно. Я думаю, код со строки 1000 это какой-то служебный кусок, который использовался для первоначальной настройки клавиш при разработке программы.

6 Отредактировано garnizon (23-11-2021 23:18)

Re: Кубик-Рубика

Получается что клавиш управления несколько больше.

Существуют 4 группы:


- ROTATE FIRST LAYER CLOCKWISE

- ROTATE COUNTERCLOCKWISE

- ROTATE SECOND LAYER

- ROTATE WHOLE CUBE

Для каждой из них задается 6 клавиш:

-FRONT
-BACK
-UP
-DOWN
-RIGHT
-LEFT

т.е. получается 24 клавиши: F B U D R L, потом они же в сочетании с РЕГ,  потом они же в сочетании с УПР.
и функциональные в правой части клавы.

Но я совсем запутался, что и какая делает клавиша.


Кроме того, функции:

INITIAL POSITION - клавиша РЕД

SAVE POSITION - ?

RESTORE POSITION - ?

последние две даже не понял какими клавишами.

7 Отредактировано garnizon (24-11-2021 23:41)

Re: Кубик-Рубика

Нашлась еще другая версия Кубиков. В ней и бейсик блок больше и бинарник. 
Но не понятно, это улучшения или наоборот ранняя версия.
Здесь можно переназначать клавиши (ВВОД) и менять последовательность перемешивания (Макросы).

[0002]      2 A0 = $4B80:
              L0 = 64
[0015]      5  DIM C$(8)
[0020]     10  MGR= 3
[0027]     11  PRINT :
               PRINT  CHR$ (4)"BLOAD RUBIC.BN"
[0043]     12  DIM CY(1,10),RT$(25):
               FOR I = 0 TO 25:
                   READ RT$(I):
               NEXT 
[006B]     13  DATA ,(,),F,B,U,D,R,L,F',B',U',D',R',L',MF,MB,MU,MD,MR,ML,AF,AB,AU,AD,AR,AL
[00B7]     15  REM CALL $4A34
[00C7]     18  POKE $C731,0
[00D4]     20 XX =  FRE (0):
               WAIT $C000,$80:
              A$ =  CHR$ ( PEEK ($C000)):
               POKE $C010,0:
              C =  PEEK ($4A80 +  ASC (A$))
[0114]     21  IF A$ = " " THEN  TEXT= 34:
                   HOME :
                   GOSUB 500:
                   GET A$:
                   GOTO 18
[0133]     22  IF A$ = "0" THEN  PRINT :
                   PRINT  CHR$ (4)"RUN GM1"
[0150]     23  IF A$ =  CHR$ (141) THEN  GOSUB 1000:
                   GOTO 18
[0169]     25  IF A$ > "0" AND A$ <  = "9" THEN  GOSUB 700:
                   GOTO 20
[0186]     26  IF A$ > " " AND A$ <  = ")" THEN  TEXT= 34:
                   HOME :
                   GOSUB 600:
                   GOTO 18
[01A9]     28  IF A$ = "=" THEN  GOSUB 400:
                   GOTO 20
[01BE]     30  POKE $4940,C:
               CALL $4941:
               GOTO 20
[01D6]    400  FOR I = 1 TO 100:
                  C = 3 +  INT (24 *  RND (1)):
                   POKE $4940,C:
                   CALL $4941:
               NEXT :
               RETURN 
[0206]    500  REM 
[020C]    510  FOR N = 1 TO 9:
                   PRINT N":";:
                  A = A0 + (N - 1) * L0
[022C]    520     C =  PEEK (A):
                   IF C > 25 THEN  PRINT :
                   NEXT :
                   RETURN 
[0243]    530  PRINT " ";RT$(C);:
               IF C = 2 THEN A = A + 1:
                   PRINT "^" PEEK (A);
[0269]    540 A = A + 1:
               GOTO 520
[0278]    600 N =  ASC (A$) -  ASC (" ")
[028B]    610 N0 = N:
               GOSUB 500:
              N = N0
[029E]    620 XX =  FRE (0):
               PRINT "ENTER MACRO "N:
               INPUT "";MC$:
              MC$ = MC$ + " ":
              M1$ = MC$:
              A = A0 + (N - 1) * L0:
              NP = 0:
              DA = 0:
               POKE A,255
[02F6]    630  IF MC$ = " " THEN 690
[0307]    632  IF  LEFT$ (MC$,1) = " " THEN MC$ =  RIGHT$ (MC$, LEN (MC$) - 1):
                   GOTO 630
[0332]    634 L = 1:
               FOR I = 25 TO 1 STEP  - 1:
                   IF  LEFT$ (MC$, LEN (RT$(I))) >  < RT$(I) THEN  NEXT 
[0361]    635      IF I < 1 THEN  PRINT "SYNTAX ERROR":
                       GOTO 680
[037F]    636     MC$ =  RIGHT$ (MC$, LEN (MC$) -  LEN (RT$(I)))
[039F]    637      IF I = 1 THEN NP = NP + 1:
                       GOTO 660
[03B5]    638      IF I = 2 THEN NP = NP - 1:
                      L = 2:
                       IF NP < 0 THEN  PRINT "TOO MANY " CHR$ (162)")" CHR$ (162):
                           GOTO 680
[03F1]    639      IF I >  < 2 THEN 660
[03FF]    640     D0 = 0:
                   IF  LEFT$ (MC$,1) = " " OR  LEFT$ (MC$,1) = "^" THEN MC$ =  RIGHT$ (MC$, LEN (MC$) - 1):
                       GOTO 640
[043C]    642     DD =  ASC ( LEFT$ (MC$,1)) -  ASC ("0"):
                   IF DD < 0 OR DD > 9 THEN 650
[0465]    644     D0 = 10 * D0 + DD:
                  MC$ =  RIGHT$ (MC$, LEN (MC$) - 1):
                   IF D0 < 256 THEN 642
[0495]    650      IF D0 > 255 THEN  PRINT "NUMBER OF REPETITIONS MUST BE LESS THAN 256":
                       GOTO 680
[04D5]    660      IF DA + L > L0 - 1 THEN  PRINT "MACRO TOO LONG":
                       GOTO 680
[04FB]    662      POKE A + DA,I:
                  DA = DA + 1:
                   IF L = 2 THEN  POKE A + DA,D0:
                      DA = DA + 1
[0525]    664      POKE A + DA,255:
                   GOTO 630
[0538]    680      PRINT  CHR$ (7);:
                   PRINT  LEFT$ (M1$, LEN (M1$) -  LEN (MC$));"(^)";MC$; CHR$ (7):
                   GOTO 620
[056D]    690      IF NP > 0 THEN  PRINT "MORE " CHR$ (162)"(" CHR$ (162)" THAN " CHR$ (162)")" CHR$ (162):
                       GOTO 680
[05AB]    695      RETURN 
[05B1]    700     N =  ASC (A$) -  ASC ("0")
[05C4]    705     A = A0 + (N - 1) * L0:
                  LV = 0
[05DB]    710     C =  PEEK (A):
                  A = A + 1:
                   IF C > 2 AND C < 26 THEN  GOSUB 790:
                       GOTO 710
[0600]    720      IF C > 25 THEN  RETURN 
[060C]    730      IF C = 1 THEN CY(0,LV) = A:
                      CY(1,LV) =  - 1:
                      LV = LV + 1:
                       GOTO 710
[0639]    740      IF C >  < 2 THEN  STOP 
[0645]    750      IF CY(1,LV - 1) < 0 THEN CY(1,LV - 1) =  PEEK (A)
[0667]    760      IF CY(1,LV - 1) < 2 THEN A = A + 1:
                      LV = LV - 1:
                       GOTO 710
[068C]    770     A = CY(0,LV - 1):
                  CY(1,LV - 1) = CY(1,LV - 1) - 1:
                   GOTO 710
[06BA]    790      POKE $4940,C:
                   CALL $4941:
                   RETURN 
[06D0]   1000      TEXT= 34:
                   PRINT "Change control keys (Y/N) ? ";:
                   GET A$:
                   IF A$ = "Y" THEN  GOSUB 1009
[070B]   1002      RETURN 
[0711]   1009     C = 0:
                   FOR I = $4B00 TO $4B7F:
                       POKE I,255:
                   NEXT 
[0731]   1010      PRINT "ENTER KEYS FOR FUNCTIONS ":
                   PRINT "INITIAL POSITION ";:
                   GOSUB 2000
[076E]   1020      PRINT "SAVE POSITION ";:
                   GOSUB 2000
[078B]   1030      PRINT "RESTORE POSITION ";:
                   GOSUB 2000
[07AB]   1040      PRINT "ROTATE FIRST LAYER CLOCKWISE":
                   GOSUB 3000
[07D5]   1050      PRINT "ROTATE COUNTERCLOCKWISE":
                   GOSUB 3000
[07FA]   1060      PRINT "ROTATE SECOND LAYER":
                   GOSUB 3000
[081B]   1070      PRINT "ROTATE WHOLE CUBE":
                   GOSUB 3000
[083A]   1080      RETURN 
[0840]   2000      WAIT $C000,$80:
                  A$ =  CHR$ ( PEEK ($C000) - 128):
                   POKE $C010,0:
                  D =  ASC (A$):
                   IF D > 48 AND D < 58 OR D > 32 AND D < 42 OR  PEEK ($4B00 + D) < 255 THEN  PRINT  CHR$ (7):
                       GOTO 2000
[08A3]   2010      POKE ($4B00 + D),C:
                   PRINT :
                  C = C + 1:
                   RETURN 
[08BE]   3000      PRINT "FRONT ";:
                   GOSUB 2000:
                   PRINT "BACK ";:
                   GOSUB 2000:
                   PRINT "UP ";:
                   GOSUB 2000:
                   PRINT "DOWN ";:
                   GOSUB 2000:
                   PRINT "RIGHT ";:
                   GOSUB 2000:
                   PRINT "LEFT ";:
                   GOSUB 2000:
                   RETURN 
Первый свободный байт по смещению $0926
Неизвестная область с размером $0003
Таблица длинных переменных (начало: $0929, длина: $0045):
 14 A0
 10 BLOAD не используется
  4 BN не используется
 26 CDEL300 не используется
  3 CUBE не используется
 16 CY
 23 D0
 22 DA
 24 DD
  1 DH не используется
  2 DL не используется
  6 ETA не используется
 15 L0
 12 LI не используется
  8 LIS не используется
 25 LV
 20 M1
 19 MC
 18 N0
 21 NP
  9 OA не используется
 17 RT
 11 RUBIC не используется
 13 ST не используется
  5 TEST не используется
  7 XX
Post's attachments

Attachment icon rubic1.dsk 840 kb, 162 downloads since 2021-11-24 

8 Отредактировано garnizon (05-12-2021 18:35)

Re: Кубик-Рубика

Все эти непонятки с клавишами произошли потому, что я забыл уже как выглядит агатовская клавиатура :)
Например:
Что у агата на кнопке  6, кроме цифры? там знак '&'. Нажатие РЕГ + 6 даёт '&' на агате. А чтобы получить это же на PC мы нажимаем Shift-7.

Собственно, по умолчанию, файл раскладки клавиатуры ориентирован на набор текста. Т.е. чтобы изображение на клавише ПЦ совпадало с тем что будет напечатано на экране эмулятора. 

Игра кубик-рубика хорошо демонстрирует, что такая раскладка не универсальна. Например:

клавиши 1-9  - исполнение соотв. макроса. в сочетании с РЕГ - редактирование соотв. макроса.. т.е. нажимая на ПЦ Shift с соотв цифровой клавишей, мы часто будем попадать не туда, куда хотели....


Конечно, в таких случаях здорово бы помогла виртуальная клавиатура. Но такой нет в эмуляторе Агата.

http://forum.agatcomp.ru//misc.php?action=pun_attachment&amp;item=1070&amp;download=0

Post's attachments

Attachment icon VIRTKEY.png 77.6 kb, 93 downloads since 2021-12-05