Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Инициализация различных переменных
- L B#16#0
- T #CHECK_N # Счетчик успешно пройденных проверок
- T #COUNTER_N # Счетчик общего количества проверок
- L P#DBX 0.0
- T #POINTER # Указатель на текущую инструкцию
- CLR
- = #PRE_RET_VAL
- # Основной цикл работы интерпретатора байт-кода
- LOOP: L #POINTER
- LAR1
- OPN DB 100
- L DBLG
- TAR1
- <=D # Проверка выхода указателя за пределы программы
- JC FINISH
- L DW#16#0
- T #REG0
- L #TEMP6
- L W#16#0
- <>I
- JC M00d
- L P#DBX 0.0
- LAR1
- # Конструкция switch - case для обработки различных опкодов
- M00d: L B [AR1,P#0.0]
- T #OPCODE
- L W#16#1
- ==I
- JC OPCODE_1
- L #OPCODE
- L W#16#2
- ==I
- JC OPCODE_2
- L #OPCODE
- L W#16#3
- ==I
- JC OPCODE_3
- L #OPCODE
- L W#16#4
- ==I
- JC OPCODE_4
- L #OPCODE
- L W#16#5
- ==I
- JC OPCODE_5
- L #OPCODE
- L W#16#6
- ==I
- JC OPCODE_6
- JU OPCODE_OTHER
- # Обработчик опкода 01: загрузка значения из DB101[X] в регистр Y
- # OP01(X, Y): REG[Y] = DB101[X]
- OPCODE_1: +AR1 P#1.0
- L P#DBX 0.0
- LAR2
- L B [AR1,P#0.0] # Загрузка аргумента X (индекс в DB101)
- L C#8
- *I
- +AR2
- +AR1 P#1.0
- L B [AR1,P#0.0] # Загрузка аргумента Y (индекс регистра)
- JL M003 # Аналог switch - case на основе значения Y
- JU M001 # для выбора необходимого регистра для записи.
- JU M002 # Подобные конструкции используются и в других
- JU M004 # операциях ниже для аналогичных целей
- M003: JU LOOPEND
- M001: OPN DB 101
- L B [AR2,P#0.0]
- T #REG0 # Запись значения DB101[X] в REG[0]
- JU PRE_LOOPEND
- M002: OPN DB 101
- L B [AR2,P#0.0]
- T #REG1 # Запись значения DB101[X] в REG[1]
- JU PRE_LOOPEND
- M004: OPN DB 101
- L B [AR2,P#0.0]
- T #REG2 # Запись значения DB101[X] в REG[2]
- JU PRE_LOOPEND
- # Обработчик опкода 02: загрузка значения X в регистр Y
- # OP02(X, Y): REG[Y] = X
- OPCODE_2: +AR1 P#1.0
- L B [AR1,P#0.0]
- T #TEMP3
- +AR1 P#1.0
- L B [AR1,P#0.0]
- JL M009
- JU M00b
- JU M00a
- JU M00c
- M009: JU LOOPEND
- M00b: L #TEMP3
- T #REG0
- JU PRE_LOOPEND
- M00a: L #TEMP3
- T #REG1
- JU PRE_LOOPEND
- M00c: L #TEMP3
- T #REG2
- JU PRE_LOOPEND
- # Опкод 03 не используется в программе, поэтому пропустим его
- ...
- # Обработчик опкода 04: сравнение регистров X и Y
- # OP04(X, Y): REG[0] = 0; REG[X] = (REG[X] == REG[Y])
- OPCODE_4: +AR1 P#1.0
- L B [AR1,P#0.0]
- T #TEMP7 # первый аргумент - X
- L P#M 100.0
- LAR2
- L #TEMP7
- L C#8
- *I
- +AR2
- TAR2 #TEMP9 # REG[X]
- +AR1 P#1.0
- L B [AR1,P#0.0]
- T #TEMP8
- L P#M 100.0
- LAR2
- L #TEMP8
- L C#8
- *I
- +AR2
- TAR2 #TEMP10 # REG[Y]
- TAR1 #POINTER
- LAR1 #TEMP9 # REG[X]
- LAR2 #TEMP10 # REG[Y]
- L B [AR1,P#0.0]
- L B [AR2,P#0.0]
- AW
- INVI
- T #TEMP12 # ~(REG[Y] & REG[X])
- L B [AR1,P#0.0]
- L B [AR2,P#0.0]
- OW
- L #TEMP12
- AW # (~(REG[Y] & REG[X])) & (REG[Y] | REG[X]) - аналог проверки на равенство
- T B [AR1,P#0.0]
- L DW#16#0
- T #REG0
- L MB 101
- T #REG1
- L MB 102
- T #REG2
- L #POINTER
- LAR1
- JU PRE_LOOPEND
- # Обработчик опкода 05: вычитание регистра Y из X
- # OP05(X, Y): REG[0] = 0; REG[X] = REG[X] - REG[Y]
- OPCODE_5: +AR1 P#1.0
- L B [AR1,P#0.0]
- T #TEMP7
- L P#M 100.0
- LAR2
- L #TEMP7
- L C#8
- *I
- +AR2
- TAR2 #TEMP9 # REG[X]
- +AR1 P#1.0
- L B [AR1,P#0.0]
- T #TEMP8
- L P#M 100.0
- LAR2
- L #TEMP8
- L C#8
- *I
- +AR2
- TAR2 #TEMP10 # REG[Y]
- TAR1 #POINTER
- LAR1 #TEMP9
- LAR2 #TEMP10
- L B [AR1,P#0.0]
- L B [AR2,P#0.0]
- -I # ACCU1 = ACCU2 - ACCU1, REG[X] - REG[Y]
- T B [AR1,P#0.0]
- L DW#16#0
- T #REG0
- L MB 101
- T #REG1
- L MB 102
- T #REG2
- L #POINTER
- LAR1
- JU PRE_LOOPEND
- # Обработчик опкода 06: инкремент #CHECK_N при равенстве регистров X и Y
- # OP06(X, Y): #CHECK_N += (1 if REG[X] == REG[Y] else 0)
- OPCODE_6: L #COUNTER_N
- INC 1
- T #COUNTER_N
- +AR1 P#1.0
- L B [AR1,P#0.0]
- T #TEMP7 # REG[X]
- L P#M 100.0
- LAR2
- L #TEMP7
- L C#8
- *I
- +AR2
- TAR2 #TEMP9 # REG[X]
- +AR1 P#1.0
- L B [AR1,P#0.0]
- T #TEMP8
- L P#M 100.0
- LAR2
- L #TEMP8
- L C#8
- *I
- +AR2
- TAR2 #TEMP10 # REG[Y]
- TAR1 #POINTER
- LAR1 #TEMP9 # REG[Y]
- LAR2 #TEMP10 # REG[X]
- L B [AR1,P#0.0]
- L B [AR2,P#0.0]
- ==I
- JCN M013
- JU M014
- M013: L P#DBX 0.0
- LAR1
- T #POINTER
- L B#16#0
- T #TEMP6
- JU PRE_LOOPEND
- M014: L #POINTER
- LAR1
- # Инкремент значения #CHECK_N
- L #CHECK_N
- L L#1
- +I
- T #CHECK_N
- JU PRE_LOOPEND
- PRE_LOOPEND: L #REG0
- T MB 100
- L #REG1
- T MB 101
- L #REG2
- T MB 102
- +AR1 P#1.0
- L #TEMP6
- + 1
- T #TEMP6
- JU LOOPEND
- OPCODE_OTHER: L P#DBX 0.0
- LAR1
- L 0
- T #TEMP6
- TAR1 #POINTER
- LOOPEND: TAR1 #POINTER
- CLR
- = #TEMP16
- L #CHECK_N
- L L#20
- ==I
- S #TEMP16
- L #COUNTER_N
- ==I
- A #TEMP16
- # Все проверки пройдены, если #CHECK_N == #COUNTER_N == 20
- JC GOOD
- L #CHECK_N
- L L#20
- <I
- S #TEMP16
- L #COUNTER_N
- ==I
- A #TEMP16
- JC FAIL
- JU M019
- GOOD: SET
- = #PRE_RET_VAL
- JU FINISH
- FAIL: CLR
- = #PRE_RET_VAL
- JU FINISH
- M019: CLR
- O #PRE_RET_VAL
- = #RET_VAL
- JU LOOP
- FINISH: CLR
- O #PRE_RET_VAL
- = #RET_VAL
Advertisement
Add Comment
Please, Sign In to add comment