§ Получение опкода

Перед декодированием метода адресации необходимо получить опкод, после чего можно начинать что-то декодировать. Но перед этим надо знать, в какой позиции сейчас находится исполнение микрокодов.
reg [ 4:0] tstate = 0;
reg [ 7:0] opcode;
Первая позиция tstate=0, это считывание опкода, и номер опкода в opcode.
1// Основная тактовая частота
2always @(posedge clock) begin
3
4    case (tstate)
5        0: opcode <= data;
6    endcase
7
8end
Так, на позитивном фронте clock, если tstate = 0, в opcode появится значение, полученное с шины данных, по умолчанию указывающих на bus=0, то есть с текущего указателя счетчика инструкции.
После получения опкода, необходимо установить новый tstate, который уже будет зависеть от того, какой именно метод адресации будет использоваться. Взять код для verilog можно отсюда.
1// Считывание опкода
20: begin
3
4    casex (data)
5
6        8'bxxx_000_x1: tstate <= NDX;
7        8'bxxx_010_x1,
8        8'b1xx_000_x0: tstate <= IMM;
9        8'bxxx_100_x1: tstate <= NDY;
10        8'bxxx_110_x1: tstate <= ABY;
11        8'bxxx_001_xx: tstate <= ZP;
12        8'bxxx_011_xx,
13        8'b001_000_00: tstate <= ABS;
14        8'b10x_101_1x: tstate <= ZPY;
15        8'bxxx_101_xx: tstate <= ZPX;
16        8'b10x_111_1x: tstate <= ABY;
17        8'bxxx_111_xx: tstate <= ABX;
18        8'bxxx_100_00: tstate <= REL;
19        8'b0xx_010_10: tstate <= ACC;
20        default:       tstate <= IMP;
21
22    endcase
23
24    opcode <= data;
25
26end
Здесь tstate принимает такие значения как NDX, IMM, и другие. Это - номера, которые пока что не определены и будут определяться по мере написания кода. Я пока что не знаю, к какому tstate, или даже правильно так сказать, метке, будет переход.

§ Indirect X (NDX)

Пример
1LDA ($00,X)
Операнд получается с индексно-косвенной адресации. Считывается байт, следующий за опкодом, к этому полученному значению прибавляется регистр X. Однако если значение получилось более 255, то старшие разряды просто не учитываются. Допустим X=$FE, а считанное значение $03; 03h + FEh = 01h, перенос не учитывается.
После того, как указатель был получен, начинается считывание 16-битного адреса из этого указателя. Причем, опять-таки, если указатель стоит в $FF, то следующий будет не $100, а $00. Получается, что младший байт адреса будет находиться в $FF, а старший в $00.
EA = (FETCH_BYTE() + X) & FFh -- Считываем 1 байт и добавляем X, срезаем старшие биты
AD = READ(EA) + 256*READ( (EA+1)&255 ) -- Считываем 2 байта из EA