Все кому интересно, что такое CompModel, сюда.

Может кто помнит, на днях у одного из обратившихся за помощью людей, была тема

"програмирование на CompModel(TheFaster)".

Я попытался помочь, решить поставленную задачу. А на пометку "CompModel" не обратил

внимания, подумал, если форум ASM, то и писать на ASM.

После того как прога была готова, я её выложил в теме, ОКАЗАЛОСЬ совсем не то, что нужно

(ВОТ ЛАЖА).

Ну короче решил посмотреть что за "CompModel" такой. Что самое интересное в NETe,

практически ничего не нашёл, за исключением:

.самой программы, которая находилась на этом форуме.

.ссылок

.один исходник (недоделка, но хоть что-то).

НУ ПО КРАЙНЕЙ МЕРЕ, МОЖЕТЕ САМИ ПОИСКАТЬ.

Т.к. информации об используемых командах и операциях не было найдено, решил

попробовать, разобраться сам и начать данный материал. Возможно кто-то из вас его

продолжит.

Попросил TheFaster поискать какие-нибудь лабы(для разбора), и он нашёл парочку,

в том числе и свою.

Ладно хватит пустого 'пальцеотбивания', перейду к делу:

CompModel - это типа эмулятор работы процессора, монитора и клавиатуры(как я понял).

Если сравнить с ASM - это намного более урезанный и облегчённый язык,возможно автор

хотел создать что-то типа "Начальная ступень перед изучением ASSEMBLERa".

По ходу разбора лаб, было составлено описание команд, если где то партаки и корявости

(не в смысле орфографии), просьба поправить или дополнить(может кому-то пригодится).

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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144

Примечание: 
 Здесь и далее, под АЛУ подразумеваю поле Асс, в которое выводится его состояние.
 Это регистр - ч/з который происходят все операции.
 
;РАБОТА С АЛУ/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    RD  #101      ;загрузить число (до 999) в АЛУ
    RDI #10450    ; загрузить число (до 999999) в АЛУ
    
    WR  R1        ;из АЛУ в регистр (R1),  число (до 999)
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;ПОДПРОГРАММЫ//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CALL -  ;вызов подпрограммы.
RET  -  ;возврат из подпрограммы (в точку вызова).
IRET -  ???
;ПРИМЕР:
        ...
        call PROG
        ...
    
    PORG:
        ...
        ret
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;РАБОТА СО СТЭКОМ/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PUSH -  ;поместить в стек            операнд: регистр (R1)
POP  -  ;вытолкнуть из стека        операнд: регистр (R1)
;Операндом назначается только регистр
   WRRB - ;изменение указателя на дно стэка                           ;операнд: число (#10), ячейка памяти (10)
   WRSP - ;изменение указателя на верхушку стэка                ;операнд: число (#10), ячейка памяти (10) 
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;ВОЗМОЖНЫЕ ОПЕРАНДЫ///////////////////////////////////////////////////////////////////////////////////////////////////////////
;регистры: R0,R1,R2,R3,R4,R5,R6,R7,R8,R9.
     RD R1    ;чтение из регистра R1, значения в АЛУ 
     WR R1    ;запись в регистр R1, значения из АЛУ
;--------------------------------------------------------------------------------------------------------------------------------------------------------------------
;поместить значение в АЛУ
     RD #176  ;записать в АЛУ число 176
     WR #4    ;результат операции не был замечен, хотя 
              ;за ошибку данная запись не принята.
;--------------------------------------------------------------------------------------------------------------------------------------------------------------------
;обращение к памяти 
     RD 10    ;чтение из 10 ячейки памяти, в АЛУ
     WR 10    ;запись в 10 ячейку памяти, из АЛУ
;--------------------------------------------------------------------------------------------------------------------------------------------------------------------
;обращение к памяти  (не знаю как обозначить,  - "двойной адрес".)
;по указанному адресу, будет получено значение, 
;(000 - помеченное звёздочкой)
;которое будет воспринято как адрес из которого и будет получено конечное значение.
     RD @10  ;чтение
     WR @10  ;запить
;Думаю на примере самомодификации, будет проще
;объяснить, её суть.
;в программе устанавливаем остановку по 5 адресу
;на самом деле она произойдёт на 10 (для демонстрации выбран простейший пример)
адр  операция  код опер  ;описание
  RD #900   211900    ;код выхода 090000
  MULI #10  251010    ;здесь одновременно умножаем 90010 и указываем адрес по которому произойдёт выход - 10
  MUL #10   251010    ;ещё раз 10
  WR @1     222001    ;запишем из АЛУ (090000), по адресу находящемуся в 1 ячейке - 10
  JMP 10    100010    ;переход на 10 адрес
  HLT       090000    ;выход, который не сработает
  NOP       000000
  NOP       000000
  NOP       000000
  NOP       000000
 JMP 5     100005    ;здесь будет замена JMP на HLT
 NOP       000000
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ//////////////////////////////////////////////////////////////////////////////////////////////////////
ADD  -  ;сложение     (работает с числом 999)                операнды:  значение(#145),  ячейка(10), регистр (R3), двойной адрес (@4)
ADI  -  ;сложение     (работает с числом до 999999)    операнды:  значение(#145),  ячейка(10).
SUB  -  ;вычитание   (работает с числом 999)                операнды:  значение(#145),  ячейка(10), регистр (R3), двойной адрес (@4)
ASI  -  ;вычитание   (работает с числом до 999999)    операнды:  значение(#145),  ячейка(10).
MUL  -  ;умножение   (работает с числом 999)                операнды:  значение(#145),  ячейка(10), регистр (R3), двойной адрес (@4)
MULI -  ;умножение   (работает с числом до 999999)    операнды:  значение(#145),  ячейка(10). 
DIV  -  ;деление        (работает с числом 999)                операнды:  значение(#145),  ячейка(10), регистр (R3), двойной адрес (@4)
DIVI -  ;деление        (работает с числом до 999999)    операнды:  значение(#145),  ячейка(10).
;эти операции работают по единому принципу
   RD #65        ;поместим в АЛУ число 
   ADI #878932   ;добавить к загруженному ранее числу
                 ;результат в АЛУ
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;УСЛОВНЫЕ И БЕЗУСЛОВНЫЕ ПЕРЕОДЫ , ЦИКЛЫ/////////////////////////////////////////////////////////////////////////////////////
;Операции сравнения(типа CMP), пока не обнаружено.
;Для возведения флагов используются арифметические операции
;Возможные переходы описаны ниже
JZ       -    ; z = 1   (X == Y)
JNZ      -    ; z = 0   (X != Y)
JS       -    ; s = 1   (X <  Y)
JNS      -    ; s = 0   (X >= Y)
JO       -    ; o = 1   (X >  Y)
JNO      -    ; o = 0   (X <= Y)
JMP      -    ; безусловный
;ПРИМЕР:
;операндом перехода может быть:
;метка
   JMP LABEL
   ....
LABEL:   
;или адрес (возможно есть и др. варианты)
   JMP 10   
;----------JRNZ переход, (аналог LOOP, только по работе)------------------------------------------------------------------------------------------------------
   RD #5      ;будет 5 проходов по циклу
   WR R1      ;загрузим в регистр R1
M1:
   ...
   ...
   JRNZ R1,M1 ;сразу после запятой должна быть указана метка(SPACE после [,] использовать нельзя, ОШИБКА)
;Значение указанного регистра будет понижаться автоматически на 1, пока не достигнет 0
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;РАБОТА С ПОРТАМИ/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
IN   -  ;из порта в АЛУ.
OUT  -  ;из АЛУ в порт.
     
;Известные на данный момент команды
;Команда очистки буфера
     RDI #101   
     OUT 1      ;для клавиатуры
     OUT 11     ;и дисплея
     
;Команда сброса ошибки
     RDI #102
     OUT 1      ;для клавиатуры
     OUT 11     ;и для дисплея
     
;Команда разрешения МВУ
     RDI #10    
     OUT 1      ;для клавиатуры без прерываний (по опросу)
     OUT 11     ;для монитора без авто увеличения адреса
     
;Вывод данных в определённую ячейку экрана
    RD #65      ;указатель на ячейку, экрана
    OUT 13      ;передаём в порт адрес ячейки
    RD R5       ;из регистра R5 в АЛУ
    OUT 10      ;вывести на экран символ находящийся в АЛУ
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;ДРУГИЕ КОМАНДЫ И ОПЕРАЦИИ////////////////////////////////////////////////////////////////////////////////////////////////////
;БЕЗ ОПЕРАНДОВ
   NOP  -  ;пустышка
   HLT  -  ;остановить программу (выход)
; С ОПЕРАНДАМИ
   MOV R1,R2 ;загрузить значение из регистра R2 в R1          ;операнд: регистр
   INT - вызов прерывания??? ;операнд: число(1)   
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

P.S.: Мне в принципе программа понравилась, можно потыкать.

(если б к программе приложение было, в виде HELPa, то затраты по времени, на её освоение были бы минимальны).