История изменений
Исправление X512, (текущая версия) :
Недавно писал дизассемблер RISC-V, там было такое:
PROCEDURE (dec: Decoder) Decode* (h: WorkDecoders.Handler);
VAR
newLine, keepPcRelReg: BOOLEAN;
i, opLen: INTEGER;
pc0: INTEGER;
op: ARRAY 12 OF SHORTINT;
op2: INTEGER;
PROCEDURE Op1;
(* ... *)
PROCEDURE Op2;
(* ... *)
BEGIN
newLine := FALSE;
keepPcRelReg := FALSE;
pc0 := h.adr;
ReadSInt(op[0]);
IF BITS(op[0] MOD 10000H) * {0..6} = {0..6} THEN
opLen := 5 + op[0] DIV ASH(1, 12) MOD ASH(1, 3);
ELSIF BITS(op[0] MOD 10000H) * {0..6} = {0..5} THEN
opLen := 4;
ELSIF BITS(op[0] MOD 10000H) * {0..5} = {0..4} THEN
opLen := 3;
ELSIF BITS(op[0] MOD 10000H) * {0..1} = {0..1} THEN
opLen := 2;
ELSE
opLen := 1;
END;
i := 1; WHILE i < opLen DO ReadSInt(op[i]); INC(i) END;
i := 0; WHILE i < MIN(opLen, 2) DO
WriteHex(op[i] MOD 10000H, 4); h.Put(" ");
INC(i) END;
h.Put(09X);
CASE opLen OF
| 1: Op1;
| 2: Op2;
ELSE WriteUndef END;
IF opLen > 2 THEN
h.Put(0DX); h.Put(09X);
i := 2; WHILE i < opLen DO
IF (i # 2) & (i MOD 2 = 0) THEN h.Put(09X); h.Put(0DX); h.Put(09X) END;
WriteHex(op[i] MOD 10000H, 4); h.Put(" ");
INC(i) END;
h.Put(09X);
END;
IF newLine THEN h.Put(0DX) END;
IF ~keepPcRelReg THEN pcRelReg := -1 END;
END Decode;
Исправление X512, :
Недавно писал дизассемблер RISC-V, там было такое:
PROCEDURE (dec: Decoder) Decode* (h: WorkDecoders.Handler);
PROCEDURE Op1;
(* ... *)
PROCEDURE Op2;
(* ... *)
VAR
newLine, keepPcRelReg: BOOLEAN;
i, opLen: INTEGER;
pc0: INTEGER;
op: ARRAY 12 OF SHORTINT;
op2: INTEGER;
BEGIN
newLine := FALSE;
keepPcRelReg := FALSE;
pc0 := h.adr;
ReadSInt(op[0]);
IF BITS(op[0] MOD 10000H) * {0..6} = {0..6} THEN
opLen := 5 + op[0] DIV ASH(1, 12) MOD ASH(1, 3);
ELSIF BITS(op[0] MOD 10000H) * {0..6} = {0..5} THEN
opLen := 4;
ELSIF BITS(op[0] MOD 10000H) * {0..5} = {0..4} THEN
opLen := 3;
ELSIF BITS(op[0] MOD 10000H) * {0..1} = {0..1} THEN
opLen := 2;
ELSE
opLen := 1;
END;
i := 1; WHILE i < opLen DO ReadSInt(op[i]); INC(i) END;
i := 0; WHILE i < MIN(opLen, 2) DO
WriteHex(op[i] MOD 10000H, 4); h.Put(" ");
INC(i) END;
h.Put(09X);
CASE opLen OF
| 1: Op1;
| 2: Op2;
ELSE WriteUndef END;
IF opLen > 2 THEN
h.Put(0DX); h.Put(09X);
i := 2; WHILE i < opLen DO
IF (i # 2) & (i MOD 2 = 0) THEN h.Put(09X); h.Put(0DX); h.Put(09X) END;
WriteHex(op[i] MOD 10000H, 4); h.Put(" ");
INC(i) END;
h.Put(09X);
END;
IF newLine THEN h.Put(0DX) END;
IF ~keepPcRelReg THEN pcRelReg := -1 END;
END Decode;
Исходная версия X512, :
Недавно писал дизассемблер RISC-V, там было такое:
PROCEDURE (dec: Decoder) Decode* (h: WorkDecoders.Handler);
PROCEDURE Op1;
(* ... *)
PROCEDURE Op2;
(* ... *)
VAR
newLine, keepPcRelReg: BOOLEAN;
i, opLen: INTEGER;
pc0: INTEGER;
op: ARRAY 12 OF SHORTINT;
op2: INTEGER;
BEGIN
newLine := FALSE;
keepPcRelReg := FALSE;
pc0 := h.adr;
ReadSInt(op[0]);
IF BITS(op[0] MOD 10000H) * {0..6} = {0..6} THEN
opLen := 5 + op[0] DIV ASH(1, 12) MOD ASH(1, 3);
ELSIF BITS(op[0] MOD 10000H) * {0..6} = {0..5} THEN
opLen := 4;
ELSIF BITS(op[0] MOD 10000H) * {0..5} = {0..4} THEN
opLen := 3;
ELSIF BITS(op[0] MOD 10000H) * {0..1} = {0..1} THEN
opLen := 2;
ELSE
opLen := 1;
END;
i := 1; WHILE i < opLen DO ReadSInt(op[i]); INC(i) END;
i := 0; WHILE i < MIN(opLen, 2) DO
WriteHex(op[i] MOD 10000H, 4); h.Put(" ");
INC(i) END;
h.Put(09X);
CASE opLen OF
| 1: Op1;
| 2: Op2;
ELSE WriteUndef END;
IF opLen > 2 THEN
h.Put(0DX); h.Put(09X);
i := 2; WHILE i < opLen DO
IF (i # 2) & (i MOD 2 = 0) THEN h.Put(09X); h.Put(0DX); h.Put(09X) END;
WriteHex(op[i] MOD 10000H, 4); h.Put(" ");
INC(i) END;
h.Put(09X);
END;
IF newLine THEN h.Put(0DX) END;
IF ~keepPcRelReg THEN pcRelReg := -1 END;
END Decode;