Вот, странны команды обмена с памятью
команд 6
b[15:11] = 5'b10010 // select var, выставляет для чтения адрес переменной в стеке
b[15:11] = 5'b10011 // select [base + index*mul + offs], выставляет адрес для чтения из памяти
эти 2 команды игнорируют прерывания
b[15:11] = 5'b10000 // ld чтение с шины данных
b[15:11] = 5'b10100 // st var, сохраняет регистр в переменную в стеке
b[15:11] = 5'b10101 // st [base+offs], сохраняет регистр в памяти
b[15:11] = 5'b10111 // st [base+index], сохраняет регистр в памяти
для чтения, получилось более гибкая адресация, но это не все, команды еще стараются быть полезными
форматы команд:
команда select var
b[10:9] - mode, определяет доп действия, 00-если следующая команда ALU, то данные с шины будут левым аргументом алу, 01-если следующая команда ALU, то данные с шины будут правым аргументом, 10-11 на поведение АЛУ не влияет, 10-декремент регистра dst, 11-инкремент регистра dst
b[8:6] - dst регистр, который инкрементируется/декрементируется если заданно параметром mode
b[5:0] - номер переменной в стеке
команда select [base + index*mul + offset]
b[10:9] - mul 00-x0, 01-x1, 10-x2, 11-x4, то есть mul=00 регистр index не используется (на 0 умножил)
b[8:6] - base
b[5:3] - offset
b[2:0] - index
команда ld, читает данные с шины в регистр, применима после команд select и const с чтением константы из памяти
b[10:9] - sz, размер читаемого аргумента
b[8:6] - dst, регистр для записи результата
b[5:3] - aluop - команды алу, пока придумал следующие
000-nop
001-знаковое расширение
команда st var
b[10:9] - size
b[8:6] - src, сохраняемый регистр
b[5:0] - номер переменной
команда st [base + offset]
b[10:9] - size
b[8:6] - base
b[5:3] - offset
b[2:0] - right - записываемый регистр
команда st [base + index], аналогично предыдущей, только b[5:3] номер регистра index
Ухххх, все, у проца есть весь базовый набор, добавить только разных системных управляющих и готово
---------- Post added at 01:25 ---------- Previous post was at 01:08 ----------
void memcpy(void* dst, void* src, uint16_t cnt)
{
while (cnt--) *dst++ = *src++;
}
как бы выглядела на псевдоасме псевдопроца
proc: memcpy (dword dst, dword src, word cnt)
size: 32
stack: 4 // dst+src+cnt+tmp
byte tmp;
m1: if.16 (cnt ==0) m2 // 16bit aluop "=="; jr m2
sub cnt,1
select [src]
add src,1
ld.8 tmp
st.8 [dst]
add dst,1
fres // flag=0
jrn m1
m2:
ret
много инструкций конечно, не pdp11
но тут стек до 8 переменных, особо не видно преимуществ от команд, может их вообще нет
надо с флагом придумать политику, что бы были безусловные преходы
Viktor2312 теперь дело за тобой





Ответить с цитированием