§ Получение опкода
Перед декодированием метода адресации необходимо получить опкод, после чего можно начинать что-то декодировать. Но перед этим надо знать, в какой позиции сейчас находится исполнение микрокодов.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