我正在Ada中做Z80仿真器。 我實現JR(相對跳轉)的家庭,但我不滿意我的代碼:Ada中的Z80仿真器中的類型轉換過多
with Ada.Text_IO;
procedure main is
type UInt16 is mod 2 ** 16;
type UInt8 is mod 2 ** 8;
type Int8 is range -128 .. 127;
package UInt16_IO is new Ada.Text_IO.Modular_IO (UInt16);
function Two_Complement(N : UInt8) return Int8 is
begin
if N <= 127 then
return Int8 (N);
end if;
return Int8 (Integer (N) - 256);
end Two_Complement;
-- Relative jump
function Jr (Address : UInt16; D: UInt8) return UInt16 is
begin
return UInt16 (Integer (Address) + Integer (Two_Complement (D) + 2));
end Jr;
Address : UInt16;
begin
Address := 16#683#;
UInt16_IO.Put (Item => Jr (Address, 16#F1#), Base => 16); -- Get 16#676# which is good !
end main;
看來工作,但是我發現有太多類型的轉換。 你有什麼建議嗎?
謝謝,
奧利維爾。
有了:返回地址+ UINT16(Two_Complement(d)+ 2);我有一個CONSTRAINT_ERROR,這是正常的,因爲Two_Complement可以返回負數。 「太多了」:因爲我有一個C/C++背景,我試圖寫出好的Ada! – ols
我沒有注意到它返回int8。 –
注意:如果您使用Ada標準庫中的Integer類型,而不是您自己的類型(最好使用range和指定的Size),那麼前一種類型可能是16位類型。由於Janus/Ada,它是,所以嘗試從'UInt16'轉換可能會引起範圍約束錯誤。 – B98